NovinkaZverejnili sme 50+ Laravel balíkov ako open source
Custom AI apps, agents and automation — Roundly ConsultingRoundly
Všetky balíky
Tickets for Laravel

Zakladanie a úprava tiketov

Tickets::make() vráti TicketBuilder; create() tiket založí a vráti ho. Povinný je len predmet a žiadateľ (model vašej aplikácie alebo polia hosťa):

$ticket = Tickets::make()
    ->subject('Printer on floor 3 is jammed')               // required
    ->description('Paper jam error E-102.')
    ->requester($user)                                      // a host model…
    ->guest(['name' => 'Jo', 'email' => '[email protected]'])    // …or guest fields (GuestData|array)
    ->category($hardware)                                   // model, id or null
    ->priority('high')                                      // value or enum case
    ->project($helpdesk)                                    // a TicketProject
    ->assignee($agent)
    ->due(now()->addDay())
    ->channel('web')
    ->fields(['asset_tag' => 'PRN-0042'])
    ->tags(['printer'])                                     // names or TicketTag models
    ->watchers($colleague)
    ->attach($request->file('photo'))                       // UploadedFile or a local path — never user input as a path
    ->meta(['crm_id' => 'C-1'])                             // host-owned metadata; top-level keys merge
    ->by($agent)                                            // the actor (default: the auth user, with actor.from_auth)
    ->create();

asSystem() ho založí bez aktéra; data() namiesto založenia vráti CreateTicketData. Neaktívna kategória sa pre nový tiket odmietne a kanál musí byť jeden z tickets.channels. Z PHP prílohy prijímajú uploady alebo lokálne cesty — vstup od používateľa nikdy neodovzdávajte ako cestu.

Predvolené hodnoty pri založení

  • Hodnoty, ktoré volajúci vynechá, sa doplnia raz, pri založení: z najbližšej nadradenej kategórie, ktorá ich nastavuje, potom z konfigurácie — priorita (tickets.priority.default), riešiteľ (Contracts\AssignmentStrategy), termín (Contracts\DueDateResolver) a kanál (tickets.default_channel). Doplnia sa aj predvolené hodnoty vlastných polí.
  • Každý kontrakt vidí uložený tiket: riešiteľ a termín sa vyberú hneď po vložení riadku, v tej istej transakcii — tiket už má kľúč, číslo, poradové číslo a počiatočný stav, žiadateľa, projekt, kategóriu, prioritu a kanál, ešte však nie hodnoty vlastných polí, štítky, sledujúcich ani prílohy.
  • Neskoršia zmena kategórie tiketu nič znova neuplatní.

Podoba s DTO

use RoundlyConsulting\Tickets\DataTransferObjects\CreateTicketData;

$ticket = Tickets::create(new CreateTicketData(
    subject: 'Printer on floor 3 is jammed',
    requester: $customer,
    category: $hardware,
    priority: 'high',
    channel: 'web',
    fields: ['asset_tag' => 'PRN-0042'],
));

Zo žiadateľa alebo projektu

// Concerns\RequestsTickets on your user model — the requester is set
$ticket = $user->openTicket()->subject('VPN drops every hour')->create();

// Concerns\HasTickets on your project model — numbered in the project's sequence
$ticket = $project->openTicket()->subject('…')->requester($user)->create();   // SUP-1

Vyhľadanie tiketov

Tickets::find('SUP-42');                        // ?Ticket — live tickets only
Tickets::find('SUP-42', withTrashed: true);     // a soft-deleted one too
Tickets::findOrFail('SUP-42');                  // TicketNotFoundException otherwise
Tickets::for('SUP-42');                         // a handle; an unknown or soft-deleted reference throws

Úprava tiketu

use RoundlyConsulting\Tickets\DataTransferObjects\UpdateTicketData;

// Only what is given changes; null clears a nullable value
Tickets::for($ticket)->by($agent)->update(new UpdateTicketData(subject: 'Printer on floor 3 jams on A3', description: null));

Tickets::for($ticket)->by($agent)->prioritize('urgent');         // TicketPriorityChanged
Tickets::for($ticket)->by($agent)->categorize($printers);        // TicketCategoryChanged; defaults are not re-applied
Tickets::for($ticket)->by($agent)->changeRequester($colleague);  // a model or GuestData
  • Polia UpdateTicketData sú predvolene Support\Optional (nezadané), takže sa zmení len to, čo odovzdáte, a null môže zrušiť hodnotu, ktorá je voliteľná. TicketUpdated sa spustí so zmenenými kľúčmi (subject, description, meta).
  • categorize() znova neuplatní predvolené hodnoty kategórie, novo povinné pole cieľovej kategórie však potrebuje hodnotu.
  • changeRequester() tiket predošlému žiadateľovi odoberie: jeho automatické sledovanie sa potichu odstráni (sledovanie, ktoré agent pridal zámerne, zostane), a ak bol predošlý žiadateľ hosť, všetky odkazy pre hostí k tiketu sa zneplatnia (GuestAccessRevoked).
  • Opätovné nastavenie rovnakej priority nespustí nič.

Mazanie a obnovenie

Tickets::for($ticket)->by($manager)->delete();                               // soft delete
Tickets::for(Tickets::findOrFail('SUP-42', withTrashed: true))->restore();   // bring it back

Soft-deleted tiket si ponechá číslo a každá jeho zmena vyhodí TicketTrashedException, kým ho neobnovíte. V API vyžaduje mazanie a obnovenie oprávnenie manage u agenta pre daný tiket (pozrite Policy a rozsah agentov).

Aktér

by($actor) pripíše nasledujúce volania aktérovi; by(null) použije prihláseného používateľa (tickets.actor.from_auth na tickets.actor.guard); asSystem() znamená nikoho. Aktérovi sa pripisujú záznamy aktivít, udalosti a notifikácie a podľa neho posudzujú doménové pravidlá — rolu agenta, žiadateľa či účastníka.

Prejavte lásku k open source

Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.

Ďalšie spôsoby podpory vrátane kryptomien

Odoslaním daru súhlasíte s našimi podmienkami prijímania darov.

Chcete to zabudovať do svojho produktu?

Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.