commit9
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-10-30 20:02:30 +02:00
parent 6d14b4e6f0
commit c6373365bf
225 changed files with 15365 additions and 285 deletions
+16 -1
View File
@@ -50,6 +50,7 @@ class ReceiptWorkflow
$accepted = $this->recordedQuantity($item->id, 'accepted_milli');
$lines[] = [
...$item->only(['id', 'description', 'unit', 'purchase_type']),
...(isset($order->snapshot['catalogue_sources'][$item->requisition_item_id]['stock_item_id']) ? ['stock_item_id' => $order->snapshot['catalogue_sources'][$item->requisition_item_id]['stock_item_id']] : []),
'ordered_milli' => $ordered, 'received_milli' => $received, 'accepted_milli' => $accepted,
'rejected_milli' => $received - $accepted, 'delivery_pending_milli' => $ordered - $received, 'acceptance_pending_milli' => $ordered - $accepted,
];
@@ -78,6 +79,16 @@ class ReceiptWorkflow
/** @var list<array{purchase_order_item_id: int, received_quantity: string, accepted_quantity: string, quality_status: string, stock_item_id?: int|null, notes?: string|null}> $requested */
$requested = $data['items'];
foreach ($requested as $line) {
if (! empty($order->snapshot['catalogue_sources']) && empty($line['stock_item_id'])) {
$orderLine = $order->items()->whereKey($line['purchase_order_item_id'])->first();
if ($orderLine !== null && isset($order->snapshot['catalogue_sources'][$orderLine->requisition_item_id]['stock_item_id'])) {
$linkedStock = $order->snapshot['catalogue_sources'][$orderLine->requisition_item_id]['stock_item_id'];
if (! is_int($linkedStock) || $linkedStock < 1) {
throw new \LogicException('A origem da ordem não contém um identificador de artigo válido.');
}
$line['stock_item_id'] = $linkedStock;
}
}
$inputs[] = [
'purchase_order_item_id' => $line['purchase_order_item_id'],
'received_milli' => self::milli($line['received_quantity']), 'accepted_milli' => self::milli($line['accepted_quantity']),
@@ -135,7 +146,11 @@ class ReceiptWorkflow
if ($input['quality_status'] !== 'compliant' && empty($input['notes'])) {
throw ValidationException::withMessages(['items' => 'Descreva as reservas, danos ou divergências de qualidade.']);
}
$stockItem = ! empty($input['stock_item_id']) ? StockItem::query()->lockForUpdate()->findOrFail($input['stock_item_id']) : null;
$stockItem = ! empty($input['stock_item_id']) ? StockItem::query()->where('id', $input['stock_item_id'])->lockForUpdate()->firstOrFail() : null;
$catalogueStock = $order->snapshot['catalogue_sources'][$source->requisition_item_id]['stock_item_id'] ?? null;
if ($catalogueStock !== null && $stockItem?->id !== $catalogueStock) {
throw ValidationException::withMessages(['items' => 'Conserve o artigo de stock preservado na origem desta linha da ordem.']);
}
$physical = in_array($source->purchase_type, ['consumable', 'other', 'spare_part', 'equipment']);
if ($source->purchase_type === 'spare_part') {
if (! $source->spare_part_id || ! $source->equipment_id) {