label('Import factură (OCR)') ->icon('heroicon-m-document-arrow-up') ->color('gray') ->modalHeading('Import factură via OCR') ->modalDescription('Încarcă o poză cu factura. AI-ul extrage furnizorul, data și liniile. Verifici și salvezi.') ->schema([ Forms\Components\FileUpload::make('invoice') ->label('Foto factură') ->image() ->disk('local') ->directory('ocr-imports') ->required() ->maxSize(5120), ]) ->action(function (array $data) { $abs = Storage::disk('local')->path($data['invoice']); $result = app(OcrInvoiceService::class)->extract($abs); if (! ($result['ok'] ?? false)) { Notification::make() ->title('OCR eșuat') ->body($result['error'] ?? 'Eroare necunoscută.') ->danger()->send(); @unlink($abs); return; } $payload = $result['data']; // Match supplier by case-insensitive name. $supplierId = null; if ($payload['supplier_name']) { $supplierId = Supplier::whereRaw('LOWER(name) = ?', [mb_strtolower($payload['supplier_name'])]) ->value('id'); } $purchase = Purchase::create([ 'number' => Purchase::generateNumber( app(\App\Tenancy\TenantManager::class)->currentId() ), 'supplier_id' => $supplierId, 'order_date' => $payload['date'] ?? today()->toDateString(), 'status' => 'draft', 'notes' => 'Importat OCR' . ($payload['supplier_name'] && ! $supplierId ? " · furnizor nemap-uit: „{$payload['supplier_name']}”" : ''), ]); foreach ($payload['items'] as $item) { PurchaseItem::create([ 'purchase_id' => $purchase->id, 'name' => $item['name'], 'qty' => $item['qty'], 'unit' => 'buc', 'buy_price' => $item['unit_price'], ]); } $purchase->refresh()->recalcTotal(); @unlink($abs); Notification::make() ->title('Factură importată') ->body(sprintf('%d linii, total %.2f. Verifică și ajustează înainte de a confirma.', count($payload['items']), (float) $purchase->total)) ->success()->send(); $this->redirect(PurchaseResource::getUrl('edit', ['record' => $purchase])); }), Actions\CreateAction::make(), ]; } }