Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/coderflexx/laravel-ticket
Laravel Ticket System, to help you manage your tickets easily.
https://github.com/coderflexx/laravel-ticket
eloquent laravel ticketing-system
Last synced: 6 days ago
JSON representation
Laravel Ticket System, to help you manage your tickets easily.
- Host: GitHub
- URL: https://github.com/coderflexx/laravel-ticket
- Owner: coderflexx
- License: mit
- Created: 2022-09-23T21:15:20.000Z (over 2 years ago)
- Default Branch: main
- Last Pushed: 2024-04-08T15:32:01.000Z (9 months ago)
- Last Synced: 2024-04-08T18:50:37.537Z (9 months ago)
- Topics: eloquent, laravel, ticketing-system
- Language: PHP
- Homepage: https://coderflex.com/open-source/docs/laravel-ticket/introduction
- Size: 173 KB
- Stars: 301
- Watchers: 5
- Forks: 52
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE.md
- Security: SECURITY.md
Awesome Lists containing this project
README
[![Latest Version on Packagist](https://img.shields.io/packagist/v/coderflex/laravel-ticket.svg?style=flat-square)](https://packagist.org/packages/coderflex/laravel-ticket)
[![GitHub Tests Action Status](https://img.shields.io/github/actions/workflow/status/coderflexx/laravel-ticket/run-tests.yml?branch=main&label=test)](https://github.com/coderflexx/laravel-ticket/actions?query=workflow%3Arun-tests+branch%3Amain)
[![GitHub Code Style Action Status](https://img.shields.io/github/actions/workflow/status/coderflexx/laravel-ticket/phpstan.yml?branch=main&label=code%20style)](https://github.com/coderflexx/laravel-ticket/actions?query=workflow%3A"Fix+PHP+code+style+issues"+branch%3Amain)
[![Total Downloads](https://img.shields.io/packagist/dt/coderflex/laravel-ticket.svg?style=flat-square)](https://packagist.org/packages/coderflex/laravel-ticket)- [Introduction](#introduction)
- [Installation](#installation)
- [Configuration](#configuration)
- [Preparing your model](#preparing-your-model)
- [Usage](#usage)
- [Ticket Table Structure](#ticket-table-structure)
- [Message Table Structure](#message-table-structure)
- [Label Table Structure](#label-table-structure)
- [Category Table Structure](#category-table-structure)
- [API Methods](#api-methods)
- [Ticket API Methods](#ticket-api-methods)
- [Ticket Relationship API Methods](#ticket-relationship-api-methods)
- [Ticket Scopes](#ticket-scopes)
- [Category \& Label Scopes](#category--label-scopes)
- [Handling File Upload](#handling-file-upload)
- [Testing](#testing)
- [Changelog](#changelog)
- [Contributing](#contributing)
- [Security Vulnerabilities](#security-vulnerabilities)
- [Credits](#credits)
- [License](#license)## Introduction
__Laravel Ticket__ package, is a Backend API to handle your ticket system, with an easy way.## Installation
You can install the package via composer:
```bash
composer require coderflex/laravel-ticket
```## Configuration
You can publish the config file with:
```bash
php artisan vendor:publish --tag="ticket-config"
```You can publish and run the migrations with:
```bash
php artisan vendor:publish --tag="ticket-migrations"
```
Before Running the migration, you may publish the config file, and make sure the current tables does not make a conflict with your existing application, and once you are happy with the migration table, you can run```bash
php artisan migrate
```## Preparing your model
Add `HasTickets` trait into your `User` model, along with `CanUseTickets` interface
```php
...
use Coderflex\LaravelTicket\Concerns\HasTickets;
use Coderflex\LaravelTicket\Contracts\CanUseTickets;
...
class User extends Model implements CanUseTickets
{
...
use HasTickets;
...
}
```## Usage
The Basic Usage of this package, is to create a `ticket`, then associate the `labels` and the `categories` to it.
You can associate as many as `categories`/`labels` into a single ticket.
Here is an example
```php
use Coderflex\LaravelTicket\Models\Ticket;
use Coderflex\LaravelTicket\Models\Category;
use Coderflex\LaravelTicket\Models\Label;...
public function store(Request $request)
{
/** @var User */
$user = Auth::user();$ticket = $user->tickets()
->create($request->validated());$category = Category::first();
$label = Label::first();$ticket->attachCategories($category);
$ticket->attachLabels($label);
// or you can create the categories & the tickets directly by:
// $ticket->categories()->create(...);
// $ticket->labels()->create(...);return redirect(route('tickets.show', $ticket->uuid))
->with('success', __('Your Ticket Was created successfully.'));
}public function createLabel()
{
// If you create a label seperated from the ticket and wants to
// associate it to a ticket, you may do the following.
$label = Label::create(...);$label->tickets()->attach($ticket);
// or maybe
$label->tickets()->detach($ticket);
}public function createCategory()
{
// If you create a category/categories seperated from the ticket and wants to
// associate it to a ticket, you may do the following.
$category = Category::create(...);$category->tickets()->attach($ticket);
// or maybe
$category->tickets()->detach($ticket);
}
...
```### Ticket Table Structure
| Column Name | Type | Default |
|---|---|---|
| ID |`integer` | `NOT NULL` |
| UUID |`string` | `NULL` |
| user_id |`integer` | `NOT NULL` |
| title |`string` | `NOT NULL` |
| message |`string` | `NULL` |
| priority |`string` | `low` |
| status |`string` | `open` |
| is_resolved |`boolean` | `false` |
| is_locked |`boolean` | `false` |
| assigned_to | `integer` | `NULL` |
| created_at |`timestamp` | `NULL` |
| updated_at |`timestamp` | `NULL` |### Message Table Structure
| Column Name | Type | Default |
|---|---|---|
| ID |`integer` | `NOT NULL` |
| user_id |`integer` | `NOT NULL` |
| ticket_id |`integer` | `NOT NULL` |
| message |`string` | `NULL` |
| created_at |`timestamp` | `NULL` |
| updated_at |`timestamp` | `NULL` |### Label Table Structure
| Column Name | Type | Default |
|---|---|---|
| ID |`integer` | `NOT NULL` |
| name |`string` | `NULL` |
| slug |`string` | `NULL` |
| is_visible |`boolean` | `false` |
| created_at |`timestamp` | `NULL` |
| updated_at |`timestamp` | `NULL` |### Category Table Structure
| Column Name | Type | Default |
|---|---|---|
| ID |`integer` | `NOT NULL` |
| name |`string` | `NULL` |
| slug |`string` | `NULL` |
| is_visible |`boolean` | `false` |
| created_at |`timestamp` | `NULL` |
| updated_at |`timestamp` | `NULL` |## API Methods
### Ticket API Methods
The `ticket` model came with handy methods to use, to make your building process easy and fast, and here is the list of the available __API__:| Method | Arguments | Description | Example | Chainable |
|----------------------|---|-----------------------------------------------|-----------------------------------------------------|---|
| `archive` |`void` | archive the ticket | `$ticket->archive()` | ✓
| `close` |`void` | close the ticket | `$ticket->close()` | ✓
| `reopen` |`void` | reopen a closed ticket | `$ticket->reopen()` | ✓
| `markAsResolved` |`void` | mark the ticket as resolved | `$ticket->markAsResolved()` | ✓
| `markAsLocked` |`void` | mark the ticket as locked | `$ticket->markAsLocked()` | ✓
| `markAsUnlocked` |`void` | mark the ticket as unlocked | `$ticket->markAsUnlocked()` | ✓
| `markAsArchived` |`void` | mark the ticket as archived | `$ticket->markAsArchived()` | ✓
| `closeAsResolved` |`void` | close the ticket and marked it as resolved | `$ticket->closeAsResolved()` | ✓
| `closeAsUnresolved` |`void` | close the ticket and marked it as unresolved | `$ticket->closeAsUnresolved()` | ✓
| `reopenAsUnresolved` |`void` | reopen the ticket and marked it as unresolved | `$ticket->reopenAsUnresolved()` | ✓
| `isArchived` |`void` | check if the ticket archived | `$ticket->isArchived()` | ✗
| `isOpen` |`void` | check if the ticket open | `$ticket->isOpen()` | ✗
| `isClosed` |`void` | check if the ticket closed | `$ticket->isClosed()` | ✗
| `isResolved` |`void` | check if the ticket has a resolved status | `$ticket->isResolved()` | ✗
| `isUnresolved` |`void` | check if the ticket has an unresolved status | `$ticket->isUnresolved()` | ✗
| `isLocked` |`void` | check if the ticket is locked | `$ticket->isLocked()` | ✗
| `isUnlocked` |`void` | check if the ticket is unlocked | `$ticket->isUnlocked()` | ✗
| `assignTo` |`void` | assign ticket to a user | `$ticket->assignTo($user)` or `$ticket->assignTo(2)` | ✓
| `makePriorityAsLow` |`void` | make ticket priority as low | `$ticket->makePriorityAsLow()` | ✓
| `makePriorityAsNormal`|`void`| make ticket priority as normal | `$ticket->makePriorityAsNormal()` | ✓
| `makePriorityAsHigh` |`void` | make ticket priority as high | `$ticket->makePriorityAsHigh()` | ✓The __Chainable__ column, is showing the state for the method, that if it can be chained or not, something like
```php
$ticket->archive()
->close()
->markAsResolved();
```
### Ticket Relationship API Methods
The `ticket` model has also a list of methods for interacting with another related models| Method | Arguments | Description | Example |
|---|---|---|---|
| `attachLabels` |`mixed` ID, `array` attributes, `bool` touch | associate labels into an existing ticket | `$ticket->attachLabels([1,2,3,4])` |
| `syncLabels` |`Model/array` IDs, `bool` detouching | associate labels into an existing ticket | `$ticket->syncLabels([1,2,3,4])` |
| `attachCategories` |`mixed` ID, `array` attributes, `bool` touch | associate categories into an existing ticket | `$ticket->attachCategories([1,2,3,4])` |
| `syncCategories` |`Model/array` IDs, `bool` detouching | associate categories into an existing ticket | `$ticket->syncCategories([1,2,3,4])` |
| `message` |`string` message | add new message on an existing ticket | `$ticket->message('A message in a ticket')` |
| `messageAsUser` |`Model/null` user, `string` message | add new message on an existing ticket as a different user | `$ticket->messageAsUser($user, 'A message in a ticket')` |> The `attachCategories` and `syncCategories` methods, is an alternative for `attach` and `sync` laravel methods, and if you want to learn more, please take a look at this [link](https://laravel.com/docs/9.x/eloquent-relationships#attaching-detaching)
The `commentAsUser` accepts a user as a first argument, if it's null, the __authenticated__ user will be user as default.
### Ticket Scopes
The `ticket` model has also a list of scopes to begin filter with.| Method | Arguments | Description | Example |
|---|---|---|---|
| `closed` |`void` | get the closed tickets | `Ticket::closed()->get()` |
| `opened` |`void` | get the opened tickets | `Ticket::opened()->get()` |
| `archived` |`void` | get the archived tickets | `Ticket::archived()->get()` |
| `unArchived` |`void` | get the unArchived tickets | `Ticket::unArchived()->get()` |
| `resolved` |`void` | get the resolved tickets | `Ticket::resolved()->get()` |
| `locked` |`void` | get the locked tickets | `Ticket::locked()->get()` |
| `unlocked` |`void` | get the unlocked tickets | `Ticket::unlocked()->get()` |
| `withLowPriority` |`void` | get the low priority tickets | `Ticket::withLowPriority()->get()` |
| `withNormalPriority` |`void` | get the normal priority tickets | `Ticket::withNormalPriority()->get()` |
| `withHighPriority` |`void` | get the high priority tickets | `Ticket::withHighPriority()->get()` |
| `withPriority` |`string` $priority | get the withPriority tickets | `Ticket::withPriority('critical')->get()` |### Category & Label Scopes
| Method | Arguments | Description | Example |
|---|---|---|---|
| `visible` |`void` | get the visible model records | `Label::visible()->get()` |
| `hidden` |`void` | get the hidden model records | `Category::visible()->get()` |## Handling File Upload
This package doesn't come with file upload feature (yet) Instead you can use [laravel-medialibrary](https://github.com/spatie/laravel-medialibrary) by __Spatie__,
to handle file functionality.The steps are pretty straight forward, all what you need to do is the following.
Extends the `Ticket` model, by creating a new model file in your application by
```
php artisan make:model Ticket
```Then extend the base `Ticket Model`, then use `InteractWithMedia` trait by spatie package, and the interface `HasMedia`:
```php
namespace App\Models\Ticket;
use Spatie\MediaLibrary\HasMedia;
use Spatie\MediaLibrary\InteractsWithMedia;class Ticket extends \Coderflex\LaravelTicket\Models\Ticket implements HasMedia
{
use InteractsWithMedia;
}
```The rest of the implementation, head to [the docs](https://spatie.be/docs/laravel-medialibrary/v10/introduction) of spatie package to know more.
## Testing
```bash
composer test
```## Changelog
Please see [CHANGELOG](CHANGELOG.md) for more information on what has changed recently.
## Contributing
Please see [CONTRIBUTING](CONTRIBUTING.md) for details.
## Security Vulnerabilities
Please review [our security policy](../../security/policy) on how to report security vulnerabilities.
## Credits
- [ousid](https://github.com/ousid)
- [All Contributors](../../contributors)## License
The MIT License (MIT). Please see [License File](LICENSE.md) for more information.