PluginProbe
Fluent Support – Helpdesk & Customer Support Ticket System / 2.1.2
Fluent Support – Helpdesk & Customer Support Ticket System v2.1.2
2.4.5 2.4.0 2.3.2 2.3.1 2.3.0 2.2.1 2.2.0 trunk 1.10.0 1.10.1 1.10.2 1.10.3 1.10.4 1.10.5 1.4.0 1.4.1 1.4.2 1.4.5 1.4.6 1.4.7 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 All 69 releases
← All changes | app/Models/Ticket.php +3 -84 2.2.1 → 2.1.2 View file →
@@ -15,10 +15,8 @@
15 15 protected $table = 'fs_tickets';
16 16
17 17 protected $dates = ['waiting_since'];
18 18
19 - protected $appends = ['display_ticket_number'];
20 -
21 19 /**
22 20 * The attributes that are mass assignable.
23 21 *
24 22 * @var array
@@ -46,11 +44,9 @@
46 44 'first_response_time',
47 45 'total_close_time',
48 46 'resolved_at',
49 47 'closed_by',
50 - 'created_by',
51 - 'serial_number',
52 - 'ticket_number'
48 + 'created_by'
53 49 ];
54 50
55 51 public static function boot()
56 52 {
@@ -70,14 +66,8 @@
70 66 $model->waiting_since = current_time('mysql');
71 67
72 68 });
73 69
74 - static::created(function ($model) {
75 - if (empty($model->serial_number) || empty($model->ticket_number)) {
76 - $model->assignTicketNumber();
77 - }
78 - });
79 -
80 70 static::deleting(function ($model) {
81 71 //Delete the ticket meta
82 72 Meta::where('object_type', 'ticket_meta')->where('object_id', $model->id)->delete();
83 73 //Delete all cc info for the ticket
@@ -83,10 +73,8 @@
83 73 //Delete all cc info for the ticket
84 74 Meta::where('object_type', 'ticket')->where('object_id', $model->id)->delete();
85 75 //Delete draft info
86 76 Meta::where('object_type', '_fs_auto_draft')->where('object_id', $model->id)->delete();
87 - //Delete internal notifications and notification recipient rows for the ticket
88 - Notification::deleteByTicketId($model->id);
89 77 //delete the responses first (their attachments are cleaned up by Conversation::deleting)
90 78 Conversation::deleteAll($model->id);
91 79 // Delete ticket-level attachments (conversation_id IS NULL) and remove the ticket upload directory
92 80 $class = __NAMESPACE__ . '\Attachment';
@@ -103,11 +91,9 @@
103 91 protected $searchable = [
104 92 'content',
105 93 'title',
106 94 'slug',
107 - 'id',
108 - 'serial_number',
109 - 'ticket_number'
95 + 'id'
110 96 ];
111 97
112 98 /**
113 99 * Local scope to filter tickets by search/query string
@@ -767,76 +753,8 @@
767 753 // Delete the ticket
768 754 $this->delete();
769 755 }
770 756
771 - public static function getNextSerialNumber()
772 - {
773 - $businessSettings = Helper::getOption('global_business_settings', []);
774 - $minNumber = (int) ($businessSettings['min_serial_number'] ?? 1);
775 - $minNumber = (int) apply_filters('fluent_support/min_serial_number', $minNumber);
776 -
777 - try {
778 - $lastTicketNumber = self::query()->max('serial_number');
779 - } catch (\Exception $e) {
780 - $lastTicketNumber = null;
781 - }
782 -
783 - $nextNumber = ((int) $lastTicketNumber) + 1;
784 -
785 - return max($nextNumber, $minNumber);
786 - }
787 -
788 - public static function isMinimumSerialNumberEnabled()
789 - {
790 - $businessSettings = Helper::getOption('global_business_settings', []);
791 - return ($businessSettings['enable_min_serial_number'] ?? 'no') === 'yes';
792 - }
793 -
794 - public static function getTicketPrefix($ticket = null)
795 - {
796 - $businessSettings = Helper::getOption('global_business_settings', []);
797 - $prefix = self::isMinimumSerialNumberEnabled() ? trim((string) ($businessSettings['ticket_prefix'] ?? '')) : '';
798 -
799 - $productId = $ticket ? $ticket->product_id : null;
800 -
801 - return apply_filters('fluent_support/ticket_prefix', $prefix, $ticket, $productId);
802 - }
803 -
804 - public function getDisplayTicketNumberAttribute()
805 - {
806 - return $this->ticket_number ?: ($this->serial_number ?: $this->id);
807 - }
808 -
809 - public function scopeWherePublicIdentifier($query, $identifier)
810 - {
811 - return $query->where('serial_number', $identifier);
812 - }
813 -
814 - protected function assignTicketNumber()
815 - {
816 - for ($attempt = 0; $attempt < 5; $attempt++) {
817 - $nextNumber = $this->serial_number ?: (self::isMinimumSerialNumberEnabled() ? self::getNextSerialNumber() : $this->id);
818 - $ticketNumber = $this->ticket_number ?: (self::getTicketPrefix($this) . $nextNumber);
819 -
820 - try {
821 - self::where('id', $this->id)->update([
822 - 'serial_number' => $nextNumber,
823 - 'ticket_number' => $ticketNumber
824 - ]);
825 - $this->serial_number = $nextNumber;
826 - $this->ticket_number = $ticketNumber;
827 -
828 - return $nextNumber;
829 - } catch (\Exception $e) {
830 - if (stripos($e->getMessage(), 'duplicate') === false) {
831 - throw $e;
832 - }
833 - }
834 - }
835 -
836 - throw new \RuntimeException('Could not allocate a unique ticket number.');
837 - }
838 -
839 757 public static function slugify($title)
840 758 {
841 759 $slug = sanitize_title($title, 'support-ticket-' . time(), 'display');
842 760 if (Ticket::where('slug', $slug)->first()) {
@@ -1183,4 +1101,5 @@
1183 1101
1184 1102 }
1185 1103
1186 1104 }
1105 +