user('web'); abort_unless($actor instanceof User, 403); return $actor; } /** @return Builder */ private function visibleOrders(Request $request): Builder { Gate::authorize('viewAny', GoodsReceipt::class); $orders = PurchaseOrder::query(); if ($this->actor($request)->departmentScoped()) { $orders->whereIn('requisition_id', Requisition::query()->visibleTo($this->actor($request))->select('id')); } return $orders; } public function index(Request $request, ReceiptWorkflow $workflow): Response { $orders = $this->visibleOrders($request); return Inertia::render('receipts/index', [ 'orders' => (clone $orders)->latest('id')->paginate(15)->through(fn (PurchaseOrder $order) => [ 'id' => $order->id, 'number' => $order->number, 'supplier_name' => $order->snapshot['supplier']['name'], 'progress' => $workflow->progress($order), ]), 'receipts' => GoodsReceipt::query()->whereIn('purchase_order_id', (clone $orders)->select('id'))->latest('id')->paginate(15, ['*'], 'receipts_page'), ]); } public function order(Request $request, PurchaseOrder $order, ReceiptWorkflow $workflow): Response { Gate::authorize('viewOrder', [GoodsReceipt::class, $order]); return Inertia::render('receipts/order', [ 'order' => $order->only(['id', 'number', 'issued_by']), 'supplier_name' => $order->snapshot['supplier']['name'], 'progress' => $workflow->progress($order), 'receipts' => GoodsReceipt::query()->where('purchase_order_id', $order->id)->latest('id')->get(), 'warehouses' => Warehouse::query()->orderBy('code')->get(['id', 'code', 'name']), 'stockItems' => StockItem::query()->orderBy('code')->get(['id', 'code', 'name', 'unit']), 'canConfirm' => $request->user()->can('create', [GoodsReceipt::class, $order]), 'lotScopes' => Schema::hasTable('inventory_lot_allocations') ? app(InventoryLots::class)->activeSetups()->get()->map(fn ($r) => ['stock_item_id' => $r->stock_item_id, 'warehouse_id' => $r->warehouse_id, 'quarantine_on_receipt' => $r->data['quarantine_on_receipt'] ?? true])->values()->all() : [], ]); } public function store(ConfirmReceiptRequest $request, PurchaseOrder $order, ReceiptWorkflow $workflow): JsonResponse|RedirectResponse { $receipt = $workflow->confirm($this->actor($request), $order, $request->validated()); if ($request->expectsJson()) { return response()->json(['id' => $receipt->id, 'number' => $receipt->number, 'created' => $receipt->wasRecentlyCreated, 'status' => $receipt->status], $receipt->wasRecentlyCreated ? 201 : 200); } return to_route('receipts.show', $receipt); } public function show(Request $request, GoodsReceipt $receipt, ReceiptDocuments $documents): Response { Gate::authorize('view', $receipt); $actor = $request->user('web'); abort_unless($actor instanceof User, 403); $ready = $documents->ready(); $order = PurchaseOrder::query()->findOrFail($receipt->purchase_order_id); $source = Requisition::query()->visibleTo($actor)->whereKey($order->requisition_id)->first(['id']); Inertia::encryptHistory(); return Inertia::render('receipts/show', [ 'documentsReady' => $ready, 'purchaseProcessHref' => $source === null ? null : '/requisicoes/'.$source->id.'/processo', 'canAddDocuments' => $ready && $documents->canAdd($actor, $receipt), 'documents' => $ready && $documents->canRead($actor, $receipt) ? ReceiptDocument::query()->where('goods_receipt_id', $receipt->id)->orderBy('id')->get(['id', 'document_type', 'original_name', 'size', 'sha256', 'uploaded_by', 'created_at']) : [], 'correctedReceiptItems' => collect(app(InventoryReversals::class)->corrections('receipt'))->only($receipt->items()->pluck('id')->all())->map(fn ($r) => $r->data['reference']), 'receipt' => $receipt->load('items'), 'movements' => StockMovement::query()->whereIn('goods_receipt_item_id', $receipt->items()->select('id'))->orderBy('id')->get(), ]); } public function print(Request $request, GoodsReceipt $receipt, ReceiptDocuments $documents): \Illuminate\Http\Response { Gate::authorize('view', $receipt); $actor = $this->actor($request); return response()->view('receipts.print', [ 'receipt' => $receipt->load('items'), 'corrections' => collect(app(InventoryReversals::class)->corrections('receipt'))->only($receipt->items()->pluck('id')->all()), 'documents' => $documents->ready() && $documents->canRead($actor, $receipt) ? ReceiptDocument::query()->where('goods_receipt_id', $receipt->id)->orderBy('id')->get(['document_type', 'original_name', 'sha256', 'created_at']) : collect(), ])->header('Cache-Control', 'no-store, private')->header('X-Content-Type-Options', 'nosniff'); } }