diff --git a/app/Filament/Imports/ImportTransitImporter.php b/app/Filament/Imports/ImportTransitImporter.php new file mode 100644 index 0000000..05a27c6 --- /dev/null +++ b/app/Filament/Imports/ImportTransitImporter.php @@ -0,0 +1,264 @@ +requiredMapping() + ->exampleHeader('CRI RFQ Number') + ->example('RFQ-IMP-C.R.I-2025-A') + ->label('CRI RFQ Number') + ->rules(['required']), + ImportColumn::make('mail_received_date') + ->requiredMapping() + ->exampleHeader('Mail Received Date') + ->example('2024-01-01') + ->label('Mail Received Date'), + ImportColumn::make('pricol_ref_number') + ->exampleHeader('Pricol Ref Number') + ->example('ENQ-1649') + ->label('Pricol Ref Number'), + ImportColumn::make('requester') + ->exampleHeader('Requester') + ->example('Mr.Sathish.K') + ->label('Requester'), + ImportColumn::make('shipper') + ->exampleHeader('Shipper') + ->example('Zhejiang shenneng technology co.,ltd') + ->label('Shipper'), + ImportColumn::make('shipper_location') + ->exampleHeader('Shipper Location') + ->example('China') + ->label('Shipper Location'), + ImportColumn::make('shipper_invoice') + ->exampleHeader('Shipper Invoice') + ->example('SNINDIA250618') + ->label('Shipper Invoice'), + ImportColumn::make('shipper_invoice_date') + ->exampleHeader('Shipper Invoice Date') + ->example('2024-01-02') + ->label('Shipper Invoice Date'), + ImportColumn::make('inv_value') + ->exampleHeader('Inv Value') + ->example('10000') + ->label('Inv Value'), + ImportColumn::make('freight_charge') + ->exampleHeader('Freight Charge') + ->example('500') + ->label('Freight Charge'), + ImportColumn::make('customs_agent_name') + ->exampleHeader('Customs Agent Name') + ->example('Pricol Logistics') + ->label('Customs Agent Name'), + ImportColumn::make('eta_date') + ->exampleHeader('ETA Date') + ->example('2024-01-10') + ->label('ETA Date'), + ImportColumn::make('status') + ->exampleHeader('Status') + ->example('Receipted') + ->label('Status'), + ImportColumn::make('insurance_status') + ->exampleHeader('Insurance Status') + ->example('Receipted') + ->label('Insurance Status'), + ImportColumn::make('delivery_location') + ->exampleHeader('Delivery Location') + ->example('Arasur Hub') + ->label('Delivery Location'), + ImportColumn::make('etd_date') + ->exampleHeader('ETD Date') + ->example('2024-01-05') + ->label('ETD Date'), + ImportColumn::make('mode') + ->exampleHeader('Mode') + ->example('LCL') + ->label('Mode'), + ImportColumn::make('inco_terms') + ->exampleHeader('Inco Terms') + ->example('FOB') + ->label('Inco Terms'), + ImportColumn::make('port_of_loading') + ->exampleHeader('Port of Loading') + ->example('NINGBO') + ->label('Port of Loading'), + ImportColumn::make('port_of_discharge') + ->exampleHeader('Port of Discharge') + ->example('CHENNAI') + ->label('Port of Discharge'), + ImportColumn::make('delivery_city') + ->exampleHeader('Delivery City') + ->example('COIMBATORE') + ->label('Delivery City'), + ImportColumn::make('packages') + ->exampleHeader('Packages') + ->example('450') + ->label('Packages'), + ImportColumn::make('type_of_package') + ->exampleHeader('Type of Package') + ->example('PKG') + ->label('Type of Package'), + ImportColumn::make('gross_weight') + ->exampleHeader('Gross Weight') + ->example('5000') + ->label('Gross Weight'), + ImportColumn::make('volume') + ->exampleHeader('Volume') + ->example('50') + ->label('Volume'), + ImportColumn::make('bill_number') + ->exampleHeader('Bill Number') + ->example('BL12345') + ->label('Bill Number'), + ImportColumn::make('bill_received_date') + ->exampleHeader('Bill Received Date') + ->example('2024-01-15') + ->label('Bill Received Date'), + ImportColumn::make('vessel_number') + ->exampleHeader('Vessel Number') + ->example('XIN WEN ZHOU') + ->label('Vessel Number'), + ]; + } + + public function resolveRecord(): ?ImportTransit + { + $warnMsg = []; + $criRfqNumber = trim($this->data['cri_rfq_number']) ?? ''; + $mailRecDate = trim($this->data['mail_received_date']) ?? ''; + $pricolRefNumber = trim($this->data['pricol_ref_number']) ?? ''; + $requester = trim($this->data['requester']) ?? ''; + $shipper = trim($this->data['shipper']) ?? ''; + $shipperLocation = trim($this->data['shipper_location']) ?? ''; + $shipperInvoice = trim($this->data['shipper_invoice']) ?? ''; + $shipperInvoiceDt = trim($this->data['shipper_invoice_date']) ?? ''; + $invValue = trim($this->data['inv_value']) ?? ''; + $freightCharge = trim($this->data['freight_charge']) ?? ''; + $customsAgentname = trim($this->data['customs_agent_name']) ?? ''; + $etaDate = trim($this->data['eta_date']) ?? ''; + $status = trim($this->data['status']) ?? ''; + $deliveryLocation = trim($this->data['delivery_location']) ?? ''; + $etdDate = trim($this->data['etd_date']) ?? ''; + $mode = trim($this->data['mode']) ?? ''; + $incoTerms = trim($this->data['inco_terms']) ?? ''; + $portOfLoading = trim($this->data['port_of_loading']) ?? ''; + $portOfDischarge = trim($this->data['port_of_discharge']) ?? ''; + $deliveryCity = trim($this->data['delivery_city']) ?? ''; + $packages = trim($this->data['packages']) ?? ''; + $typeOfPackage = trim($this->data['type_of_package']) ?? ''; + $grossWeight = trim($this->data['gross_weight']) ?? ''; + $volume = trim($this->data['volume']) ?? ''; + $billNo = trim($this->data['bill_number']) ?? ''; + $billReceivedDate = trim($this->data['bill_received_date']) ?? ''; + $vesselNumber = trim($this->data['vessel_number']) ?? ''; + + $createdBy = Filament::auth()->user()?->name ?? ''; + $updatedBy = $createdBy; + + if (! empty($warnMsg)) { + throw new RowImportFailedException(implode(', ', $warnMsg)); + } + + return ImportTransit::updateOrCreate([ + 'cri_rfq_number' => $criRfqNumber, + ], + [ + 'mail_received_date' => $this->formatDate($mailRecDate), + 'shipper_invoice_date' => $this->formatDate($shipperInvoiceDt), + 'eta_date' => $this->formatDate($etaDate), + 'etd_date' => $this->formatDate($etdDate), + 'bill_received_date' => $this->formatDate($billReceivedDate), + 'pricol_ref_number' => $pricolRefNumber, + 'requester' => $requester, + 'shipper' => $shipper, + 'shipper_location' => $shipperLocation, + 'shipper_invoice' => $shipperInvoice, + 'inv_value' => $invValue, + 'freight_charge' => $freightCharge, + 'custom_agent_name' => $customsAgentname, + 'status' => $status, + 'delivery_location' => $deliveryLocation, + 'mode' => $mode, + 'inco_terms' => $incoTerms, + 'port_of_loading' => $portOfLoading, + 'port_of_discharge' => $portOfDischarge, + 'delivery_city' => $deliveryCity, + 'packages' => $packages, + 'type_of_package' => $typeOfPackage, + 'gross_weight' => $grossWeight, + 'volume' => $volume, + 'bill_number' => $billNo, + 'vessel_number' => $vesselNumber, + // 'created_at' => $createdAt ?? null, + // 'updated_at' => $updatedAt ?? null, + 'created_by' => $createdBy ?? null, + 'updated_by' => $updatedBy ?? null, + ] + ); + // return new ImportTransit(); + } + + private function formatDate($date): ?string + { + if (blank($date)) { + return null; + } + + if (!preg_match('/\d/', $date)) { + return null; + } + + try { + $date = trim($date); + + // Excel numeric date (e.g. 46000) + if (is_numeric($date)) { + return Carbon::instance( + \PhpOffice\PhpSpreadsheet\Shared\Date::excelToDateTimeObject((float)$date) + )->format('Y-m-d'); + } + + // Try common formats explicitly + $formats = ['d-m-Y', 'd/m/Y', 'Y-m-d', 'm/d/Y', 'd.m.Y']; + + foreach ($formats as $format) { + try { + return Carbon::createFromFormat($format, $date)->format('Y-m-d'); + } catch (\Exception $e) { + continue; + } + } + + return null; + + } catch (\Exception $e) { + return null; + } + } + + public static function getCompletedNotificationBody(Import $import): string + { + $body = 'Your import transit import has completed and ' . number_format($import->successful_rows) . ' ' . str('row')->plural($import->successful_rows) . ' imported.'; + + if ($failedRowsCount = $import->getFailedRowsCount()) { + $body .= ' ' . number_format($failedRowsCount) . ' ' . str('row')->plural($failedRowsCount) . ' failed to import.'; + } + + return $body; + } +}