From ffb513af310ccb0de3362f6d40f35d5b7d83ea17 Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Sun, 20 Jul 2025 05:36:20 +0800 Subject: [PATCH] E-Invoice - Automapping Issues, Sales Invoice Report --- .../Services/ExportsSalesInvoiceReport.php | 145 +++++++++++++++++ .../Controllers/Exports/ExportController.php | 27 ++++ .../bookings/elements/DownloadComponent.vue | 146 ++++++++++++++++++ .../bookings/elements/PaymentComponent.vue | 6 + routes/api.php | 2 + routes/export.php | 10 ++ 6 files changed, 336 insertions(+) create mode 100644 app/Classes/Modules/Exports/Services/ExportsSalesInvoiceReport.php create mode 100644 app/Http/Controllers/Exports/ExportController.php create mode 100644 resources/assets/vue/components/bookings/elements/DownloadComponent.vue create mode 100644 routes/export.php diff --git a/app/Classes/Modules/Exports/Services/ExportsSalesInvoiceReport.php b/app/Classes/Modules/Exports/Services/ExportsSalesInvoiceReport.php new file mode 100644 index 00000000..46698f59 --- /dev/null +++ b/app/Classes/Modules/Exports/Services/ExportsSalesInvoiceReport.php @@ -0,0 +1,145 @@ +request = $request; + } + + public function headings(): array + { + return [ + 'DocNo', + 'DocDate', + 'DebtorCode', + 'Ref', + 'ShipInfo', + 'AccNo', + 'DetailDescription', + 'FurtherDescription', + 'Classification', + 'DeptNo', + 'Qty', + 'UnitPrice', + 'submiteinvoice', + 'ConsolidatedEinvoice', + ]; + } + + /** + * @return \Illuminate\Support\Collection|mixed + */ + public function query() + { + $start_date = $this->request->input('startDate', null); + if ($start_date) { + $start_date = Carbon::parse($this->request->input('startDate'))->format('Y-m-d'); + } + + $end_date = $this->request->input('endDate', null); + if ($end_date) { + $end_date = Carbon::parse($this->request->input('endDate'))->format('Y-m-d'); + } + + if (!$start_date) { + $start_date = Carbon::now()->subMonths(1)->startOfDay(); + } + if (!$end_date) { + $end_date = Carbon::now()->endOfDay(); + } + + $query = Transaction::query(); + + $query->where('type', TransactionType::PAYMENT)->where('payment_method', '!=', PaymentMethodType::WALLET); + // $query->where('type', TransactionType::PAYMENT); + $query->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); + $query->whereHas('booking.transactions', function ($query) { + $query->where('type', TransactionType::PURCHASE_ORDER)->complete(); + }); + + if($start_date && $end_date) { + $query->whereBetween('created_at', [ + Carbon::parse($start_date)->format('Y-m-d 0:00:00'), + Carbon::parse($end_date)->format('Y-m-d 23:59:59') + ]); + } + elseif($start_date && !$end_date) { + $query->where('created_at', '>=', Carbon::parse($start_date)->format('Y-m-d 0:00:00')); + } + elseif(!$start_date && $end_date) { + $query->where('created_at', '<=', Carbon::parse($end_date)->format('Y-m-d 23:59:59')); + } + + return $query; + } + + /** + * @param Transaction $transaction + * @return array + */ + public function map($transaction): array + { + $booking = $transaction->owner()->first(); + $purchaseOrder = $booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->first(); + //$purchaseOrder = $booking->transactions()->payments()->complete()->first(); + $company = $booking->company()->first(); + + $lastPaymentTransaction = $booking->transactions()->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::COMPLETED, ApprovalStatus::APPROVED])->latest()->first(); + $documentDate = $lastPaymentTransaction->created_at; + if(Carbon::parse($booking->updated_at)->isAfter($lastPaymentTransaction->created_at)){ + $documentDate = $booking->updated_at; + } + $formattedDocumentDate = Carbon::parse($documentDate)->format('m/d/Y'); + + $firstItem = true; + $records = []; + + $transactionDetails = $purchaseOrder->transactionDetails; + + + foreach ($transactionDetails as $detail) { + $records[] = [ + $firstItem ? '<>' : '', + $formattedDocumentDate, + $company->debtor, + $booking->marking, + $booking->marking, + '500-0000', + 'PRODUCT NAME :', + $detail->product_name, + '022', + 'C', + $detail->quantity, + number_format($detail->price, 2), + $firstItem ? 'T' : '', + $company->e_invoice ? 'F' : 'T' + ]; + + if($firstItem) { + $firstItem = false; + } + } + return $records; + } +} diff --git a/app/Http/Controllers/Exports/ExportController.php b/app/Http/Controllers/Exports/ExportController.php new file mode 100644 index 00000000..f0509093 --- /dev/null +++ b/app/Http/Controllers/Exports/ExportController.php @@ -0,0 +1,27 @@ + AWSS3Helper::S3Exportable($exportFileName, $exportsTransactions) ]); + } + else{ + $response = $exportsTransactions->download($exportFileName, Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']); + ob_end_clean(); + } + return $response; + } +} diff --git a/resources/assets/vue/components/bookings/elements/DownloadComponent.vue b/resources/assets/vue/components/bookings/elements/DownloadComponent.vue new file mode 100644 index 00000000..e5bdeb72 --- /dev/null +++ b/resources/assets/vue/components/bookings/elements/DownloadComponent.vue @@ -0,0 +1,146 @@ + + + + diff --git a/resources/assets/vue/components/bookings/elements/PaymentComponent.vue b/resources/assets/vue/components/bookings/elements/PaymentComponent.vue index 1f9a606f..c8ecca1c 100644 --- a/resources/assets/vue/components/bookings/elements/PaymentComponent.vue +++ b/resources/assets/vue/components/bookings/elements/PaymentComponent.vue @@ -1,6 +1,12 @@