diff --git a/app/Console/Commands/RegenerateInvoice.php b/app/Console/Commands/RegenerateInvoice.php new file mode 100644 index 00000000..a13ba29b --- /dev/null +++ b/app/Console/Commands/RegenerateInvoice.php @@ -0,0 +1,129 @@ +createInvoiceTransactionProcessor = $createInvoiceTransactionProcessor; + $this->createInvoiceTransactionProcessorWithInvoiceNo = $createInvoiceTransactionProcessorWithInvoiceNo; + } + + /** + * Execute the console command. + * + * @return int + */ + public function handle() + { + // Allocate sufficient memory as needed + // ini_set('memory_limit', '256M'); + + $processed_invoice = 1; + + Booking::where('status', ApprovalStatus::COMPLETED) + ->whereDate('updated_at', '>=', Carbon::parse('2023-01-01')) + ->orderBy('id') + ->chunk(100, function ($bookings) use (&$processed_invoice) { + foreach ($bookings as $booking) { + $logMessage = 'Counter ' . $processed_invoice; + $this->printAndLog($logMessage); + $processed_invoice++; + + if ( + !$booking->transactions()->where('transactions.type', TransactionType::INVOICE)->exists() + || $booking->transactions()->where('transactions.type', TransactionType::INVOICE)->first()->created_at->greaterThanOrEqualTo(Carbon::parse('2023-09-06')) + ) { + continue; + } + + // Delete transactions and documents in one query + $booking->transactions()->whereIn('transactions.type', [TransactionType::INVOICE, TransactionType::SUPPLIER_DELIVER])->delete(); + $booking->documents()->whereIn('document_type', [DocumentType::INVOICE, DocumentType::PURCHASE_ORDER, DocumentType::DELIVER_ORDER, DocumentType::SUPPLIER_DELIVER_ORDER])->delete(); + + $booking->status = ApprovalStatus::APPROVED; + $booking->save(); + + $deletedInvoice = $booking->transactions() + ->whereIn('type', [TransactionType::INVOICE]) + ->onlyTrashed() + ->orderBy('created_at', 'asc') + ->first(); + + if ($deletedInvoice) { + $bill_no = $deletedInvoice->bill_no; + if (str_ends_with($bill_no, '-deleted')) { + $bill_no = str_replace('-deleted', '', $bill_no); + } + + $deletedInvoice->bill_no = $bill_no . '-deleted'; + $deletedInvoice->save(); + + $existing_invoice_bill_no = Transaction::where('bill_no', $bill_no)->first(); + + if ($existing_invoice_bill_no) { + $this->printAndLog('Delete existing bill_no'); + $this->printAndLog(json_encode($existing_invoice_bill_no)); + $existing_invoice_bill_no->forceDelete(); + } + + $invoiceProcessor = App()->make(CreateInvoiceTransactionProcessorWithInvoiceNo::class); + $invoiceProcessor->execute($booking, $bill_no); + $logMessage = 'Regenerated invoice. Booking Marking - ' . $booking->marking . '. Bill_no - ' . $bill_no . '. Old bill_no - ' . $deletedInvoice->bill_no; + $this->printAndLog($logMessage); + } else { + $invoiceProcessor = App()->make(CreateInvoiceTransactionProcessor::class); + $invoiceProcessor->execute($booking); + $logMessage = 'Regenerated new invoice. Booking Marking - ' . $booking->marking; + $this->printAndLog($logMessage); + } + } + }); + } + + public function printAndLog($string) + { + $this->info($string); + Log::channel('regenerateInvoice')->info($string); + } +} diff --git a/routes/web.php b/routes/web.php index 25917dd3..c81383a0 100644 --- a/routes/web.php +++ b/routes/web.php @@ -484,70 +484,6 @@ Route::get('/payments/manual', function(){ echo ''; }); -Route::get('/invoice/fix', function(){ - - set_time_limit(14400); - $processed_invoice = 1; - - Booking::where('status', ApprovalStatus::COMPLETED) - ->whereDate('updated_at', '>=', Carbon::parse('01-01-2023')) - ->orderBy('id') - ->chunk(100, function ($bookings) use ($processed_invoice){ - foreach ($bookings as $booking) { - - Log::channel('regenerateInvoice')->info('Counter ' . $processed_invoice); - $processed_invoice += 1; - - if ($booking->transactions()->where('transactions.type', TransactionType::INVOICE) - ->first() - ->created_at - ->greaterThanOrEqualTo(Carbon::parse('2023-09-06'))) { - continue; - } - - $booking->transactions()->whereIn('transactions.type', [TransactionType::INVOICE, TransactionType::SUPPLIER_DELIVER])->delete(); - $booking->documents()->whereIn('document_type', [DocumentType::INVOICE, DocumentType::PURCHASE_ORDER, DocumentType::DELIVER_ORDER, DocumentType::SUPPLIER_DELIVER_ORDER])->delete(); - $booking->status = ApprovalStatus::APPROVED; - $booking->save(); - - $deletedInvoice = $booking->transactions() - ->whereIn('type', [TransactionType::INVOICE]) - ->onlyTrashed() - ->orderBy('created_at', 'asc') - ->first(); - - if ($deletedInvoice) { - $bill_no = $deletedInvoice->bill_no; - - // check if bill_no ends with '-deleted' - if (str_ends_with($bill_no, '-deleted')) { - $bill_no = str_replace('-deleted', '', $bill_no); - } - - $deletedInvoice->bill_no = $bill_no . '-deleted'; - $deletedInvoice->save(); - - $existing_invoice_bill_no = Transaction::where('bill_no', $bill_no)->first(); - - if ($existing_invoice_bill_no) { - Log::channel('regenerateInvoice')->info('Delete existing bill_no'); - Log::channel('regenerateInvoice')->info(json_encode($existing_invoice_bill_no)); - $existing_invoice_bill_no->forceDelete(); - } - - (App()->make(CreateInvoiceTransactionProcessorWithInvoiceNo::class))->execute($booking, $bill_no); - dump('regenerated invoice. Booking Marking - ' . $booking->marking . '. Bill_no - ' . $bill_no . '. Old bill_no - ' . $deletedInvoice->bill_no); - Log::channel('regenerateInvoice')->info('regenerated invoice. Booking Marking - ' . $booking->marking . '. Bill_no - ' . $bill_no . '. Old bill_no - ' . $deletedInvoice->bill_no); - } else { - (App()->make(CreateInvoiceTransactionProcessor::class))->execute($booking); - dump('regenerated new invoice. Booking Marking - ' . $booking->marking); - Log::channel('regenerateInvoice')->info('regenerated new invoice. Booking Marking - ' . $booking->marking); - } - } - } - ); -})->name('invoice.fix'); - Route::get('/1688/fix/{reference}', function($reference){ $booking = Booking::where('marking', $reference)->first();