| @@ -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 | + | |