$fieldDefinitions * @param Collection $existingFieldValues * @param array $fieldValueAttributes * @return array{ * changes: array>, * summary_labels: array * } */ public function handle( Ticket $ticket, Collection $fieldDefinitions, Collection $existingFieldValues, array $fieldValueAttributes, ): array { $changes = []; $summaryLabels = []; foreach ($fieldValueAttributes as $fieldValueAttribute) { $fieldDefinition = $fieldDefinitions->get((int) $fieldValueAttribute['ticket_field_definition_id']); if ($fieldDefinition === null) { continue; } $existingFieldValue = $existingFieldValues->get($fieldDefinition->id); if ($fieldDefinition->field_type === 'user') { $this->syncUserFieldValue( $changes, $existingFieldValue, $fieldDefinition, $fieldValueAttribute, $summaryLabels, $ticket, ); continue; } $this->syncNumberFieldValue( $changes, $existingFieldValue, $fieldDefinition, $fieldValueAttribute, $summaryLabels, $ticket, ); } return [ 'changes' => $changes, 'summary_labels' => $summaryLabels, ]; } /** * @param array> $changes * @param array{value_user_id?: int|string|null} $fieldValueAttribute * @param array $summaryLabels */ private function syncUserFieldValue( array &$changes, ?TicketFieldValue $existingFieldValue, TicketFieldDefinition $fieldDefinition, array $fieldValueAttribute, array &$summaryLabels, Ticket $ticket, ): void { $newUserId = $fieldValueAttribute['value_user_id'] ?? null; $newUserId = $newUserId === null || $newUserId === '' ? null : (int) $newUserId; if ($existingFieldValue?->value_user_id === $newUserId) { return; } $oldUserName = $existingFieldValue?->userValue?->name; $newUserName = $newUserId === null ? null : User::query()->find($newUserId)?->name; $changes[$fieldDefinition->id] = [ 'field' => $fieldDefinition->label, 'from' => $oldUserName, 'to' => $newUserName, ]; $summaryLabels[] = "{$fieldDefinition->label} field"; if ($newUserId === null) { $existingFieldValue?->delete(); return; } $ticket->fieldValues()->updateOrCreate( [ 'ticket_field_definition_id' => $fieldDefinition->id, ], [ 'value_number' => null, 'value_user_id' => $newUserId, ], ); } /** * @param array> $changes * @param array{value_number?: float|int|string|null} $fieldValueAttribute * @param array $summaryLabels */ private function syncNumberFieldValue( array &$changes, ?TicketFieldValue $existingFieldValue, TicketFieldDefinition $fieldDefinition, array $fieldValueAttribute, array &$summaryLabels, Ticket $ticket, ): void { $newNumber = $fieldValueAttribute['value_number'] ?? null; $newNumber = $newNumber === null || $newNumber === '' ? null : (float) $newNumber; $oldNumber = $existingFieldValue?->value_number; if ($oldNumber === $newNumber) { return; } $changes[$fieldDefinition->id] = [ 'field' => $fieldDefinition->label, 'from' => $this->formatNumber($oldNumber), 'to' => $this->formatNumber($newNumber), ]; $summaryLabels[] = "{$fieldDefinition->label} field"; if ($newNumber === null) { $existingFieldValue?->delete(); return; } $ticket->fieldValues()->updateOrCreate( [ 'ticket_field_definition_id' => $fieldDefinition->id, ], [ 'value_number' => $newNumber, 'value_user_id' => null, ], ); } private function formatNumber(?float $value): ?string { if ($value === null) { return null; } return rtrim(rtrim(number_format($value, 2, '.', ''), '0'), '.'); } }