@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user