174 lines
5.1 KiB
PHP
174 lines
5.1 KiB
PHP
<?php
|
|
|
|
namespace App\Actions\Tickets;
|
|
|
|
use App\Models\Ticket;
|
|
use App\Models\TicketFieldDefinition;
|
|
use App\Models\TicketFieldValue;
|
|
use App\Models\User;
|
|
use Illuminate\Support\Collection;
|
|
|
|
class SyncProjectTicketFieldValues
|
|
{
|
|
/**
|
|
* @param Collection<int, TicketFieldDefinition> $fieldDefinitions
|
|
* @param Collection<int, TicketFieldValue> $existingFieldValues
|
|
* @param array<int, array{
|
|
* ticket_field_definition_id: int,
|
|
* value_number?: float|int|string|null,
|
|
* value_user_id?: int|string|null
|
|
* }> $fieldValueAttributes
|
|
* @return array{
|
|
* changes: array<int, array<string, mixed>>,
|
|
* summary_labels: array<int, string>
|
|
* }
|
|
*/
|
|
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<int, array<string, mixed>> $changes
|
|
* @param array{value_user_id?: int|string|null} $fieldValueAttribute
|
|
* @param array<int, string> $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<int, array<string, mixed>> $changes
|
|
* @param array{value_number?: float|int|string|null} $fieldValueAttribute
|
|
* @param array<int, string> $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'), '.');
|
|
}
|
|
}
|