fix invoice

This commit is contained in:
edmondlang
2023-09-06 22:30:55 +08:00
parent 3e54b636e0
commit 4b5724f6e3
2 changed files with 129 additions and 64 deletions
+129
View File
@@ -0,0 +1,129 @@
<?php
namespace App\Console\Commands;
use App\Models\SeasonalSegment;
use Illuminate\Console\Command;
use Carbon\Carbon;
use App\Classes\Modules\Companies\Services\RemovesCompanyFromSegment;
use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcessorWithInvoiceNo;
use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcessor;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\DocumentType;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Models\Booking;
use App\Models\Transaction;
use Illuminate\Support\Facades\Log;
class RegenerateInvoice extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'regenerateInvoice';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Regenerate invoice';
/** @var CreateInvoiceTransactionProcessor */
private $createInvoiceTransactionProcessor;
/** @var CreateInvoiceTransactionProcessorWithInvoiceNo */
private $createInvoiceTransactionProcessorWithInvoiceNo;
/**
* Create a new command instance.
*
* @return void
*/
public function __construct(CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor, CreateInvoiceTransactionProcessorWithInvoiceNo $createInvoiceTransactionProcessorWithInvoiceNo)
{
parent::__construct();
$this->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);
}
}
-64
View File
@@ -484,70 +484,6 @@ Route::get('/payments/manual', function(){
echo '</table>';
});
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();