diff --git a/app/Classes/Modules/Transactions/ControllersLogic/RegenerateShippingInvoiceTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/RegenerateShippingInvoiceTransactionLogic.php index 16ce4533..b26c32f2 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/RegenerateShippingInvoiceTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/RegenerateShippingInvoiceTransactionLogic.php @@ -36,6 +36,7 @@ class RegenerateShippingInvoiceTransactionLogic extends AbstractControllerLogic public function logic(Request $request) : JsonResponse { + return $this->response([]); //The business logic to generate normal invoice and e-invoice no longer so straight forward $orders = Order::where('company_module_id', $request->route('company_module_id'))->get(); diff --git a/app/Classes/Modules/Transactions/ControllersLogic/RegenerateSingleStorageEInvoiceLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/RegenerateSingleStorageEInvoiceLogic.php new file mode 100644 index 00000000..d909e023 --- /dev/null +++ b/app/Classes/Modules/Transactions/ControllersLogic/RegenerateSingleStorageEInvoiceLogic.php @@ -0,0 +1,53 @@ + 'Regenerate Storage E-Invoice', + 'message' => 'You have successfully regenerated storage e-invoice' + ]; + } + + + /** @var FetchesTransaction */ + private $fetchesTransaction; + + /** @var CreateStorageEInvoiceDocProcessor */ + private $createStorageEInvoiceDocProcessor; + + /** + * @param FetchesTransaction $fetchesTransaction + * @param CreateStorageEInvoiceDocProcessor $createStorageEInvoiceDocProcessor + */ + public function __construct(FetchesTransaction $fetchesTransaction, CreateStorageEInvoiceDocProcessor $createStorageEInvoiceDocProcessor) + { + $this->fetchesTransaction = $fetchesTransaction; + $this->createStorageEInvoiceDocProcessor = $createStorageEInvoiceDocProcessor; + } + + public function logic(Request $request) : JsonResponse + { + $invoice = $this->fetchesTransaction->execute(['id' => $request->route('invoice_id')]); + + $invoice->documents()->where('document_type', DocumentType::STORAGE_EINVOICE)->delete(); + + $this->createStorageEInvoiceDocProcessor->execute($invoice); + + return $this->response([]); + } + +} diff --git a/app/Classes/Modules/Transactions/ControllersLogic/RegenerateSingleStorageInvoiceTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/RegenerateSingleStorageInvoiceTransactionLogic.php index f4694265..df7e9bef 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/RegenerateSingleStorageInvoiceTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/RegenerateSingleStorageInvoiceTransactionLogic.php @@ -8,9 +8,10 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use App\Classes\Modules\Documents\Services\CreatesDocument; use App\Classes\Modules\Transactions\Services\FetchesTransaction; -use App\Classes\Modules\Transactions\Processors\CreateStorageInvoiceDocTransactionFixProcessor; +use App\Classes\Modules\Transactions\Processors\CreateStorageInvoiceTransactionDocProcessor; use App\Classes\Modules\Transactions\Standards\Rules\CanRegenerateStorageInvoice; use App\Classes\ValueObjects\Constants\TransactionType; +use App\Classes\ValueObjects\Constants\DocumentType; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Log; @@ -30,19 +31,21 @@ class RegenerateSingleStorageInvoiceTransactionLogic extends AbstractControllerL /** @var FetchesTransaction */ private $fetchesTransaction; - /** @var CreateStorageInvoiceDocTransactionFixProcessor */ - private $createStorageInvoiceDocTransactionProcessor; + /** @var CreateStorageInvoiceTransactionDocProcessor */ + private $createStorageInvoiceTransactionDocProcessor; /** @var CanRegenerateStorageInvoice */ private $canRegenerateStorageInvoice; /** - * @param CreatesDocument $createsDocument + * @param FetchesTransaction $fetchesTransaction + * @param CreateStorageInvoiceTransactionDocProcessor $createStorageInvoiceTransactionDocProcessor + * @param CanRegenerateStorageInvoice $canRegenerateStorageInvoice */ - public function __construct(FetchesTransaction $fetchesTransaction, CreateStorageInvoiceDocTransactionFixProcessor $createStorageInvoiceDocTransactionProcessor, CanRegenerateStorageInvoice $canRegenerateStorageInvoice) + public function __construct(FetchesTransaction $fetchesTransaction, CreateStorageInvoiceTransactionDocProcessor $createStorageInvoiceTransactionDocProcessor, CanRegenerateStorageInvoice $canRegenerateStorageInvoice) { $this->fetchesTransaction = $fetchesTransaction; - $this->createStorageInvoiceDocTransactionProcessor = $createStorageInvoiceDocTransactionProcessor; + $this->createStorageInvoiceTransactionDocProcessor = $createStorageInvoiceTransactionDocProcessor; $this->canRegenerateStorageInvoice = $canRegenerateStorageInvoice; } @@ -51,10 +54,13 @@ class RegenerateSingleStorageInvoiceTransactionLogic extends AbstractControllerL $this->canRegenerateStorageInvoice->passes(); $invoice = $this->fetchesTransaction->execute(['id' => $request->route('invoice_id')]); - $packingList = $invoice->owner; - $invoice->documents()->delete(); + $invoice->documents()->where('document_type', DocumentType::STORAGE_INVOICE)->delete(); + + /** @var Transaction $invoice_transaction */ + // $invoice_transaction = $packingList->transactions()->where('transactions.type', TransactionType::STORAGE_INVOICE)->whereIn('status', [ApprovalStatus::COMPLETED])->first(); + + $this->createStorageInvoiceTransactionDocProcessor->execute($invoice); - $this->createStorageInvoiceDocTransactionProcessor->execute($packingList, true); Log::info(Auth::user()->email." regenerate storage invoice for transaction with id ".$request->route('invoice_id')); return $this->response([]); diff --git a/app/Classes/Modules/Transactions/Processors/CreateStorageEInvoiceDocProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateStorageEInvoiceDocProcessor.php new file mode 100644 index 00000000..fd90b758 --- /dev/null +++ b/app/Classes/Modules/Transactions/Processors/CreateStorageEInvoiceDocProcessor.php @@ -0,0 +1,95 @@ +createsDocument = $createsDocument; + $this->createsFiles = $createsFiles; + $this->createsKeyValuePair = $createsKeyValuePair; + } + + + /** + * @throws MalformedRequestException + */ + public function execute(Transaction $invoice_transaction) + { + $view = 'pages.pdfs.shipping_einvoice'; + + $companyModule = $invoice_transaction->owner->owner->companyModule; + $user = $companyModule->employees()->first(); + $brn = $companyModule->company->documents->where('document_type', DocumentType::SSM_REGISTRATION)->first(); + $lastDayOfMonth = $invoice_transaction->created_at->copy()->endOfMonth(); + $documentDate = $lastDayOfMonth; + $documentIdentifierPrefix = 'EI#: '; + $autoCountInvoiceId = ''; + $autoCountEInvoiceValidationLink = 'CIEF'; + + $metadata = $invoice_transaction->attributesKVP()->where('key', KVPKey::AUTOCOUNT_DOCNO_INVOICE)->first(); + if($metadata){ + $autoCountInvoiceId = $metadata->value; + } + $metadata = $invoice_transaction->attributesKVP()->where('key', KVPKey::AUTOCOUNT_EINVOICE_VALIDATION_LINK)->first(); + if($metadata){ + $autoCountEInvoiceValidationLink = $metadata->value; + } + + $transaction_invoice_pdf = LaravelMpdf::loadView($view, [ + 'invoice_transaction' => $invoice_transaction, + 'brn' => $brn, + 'document_date' => $documentDate, + 'document_identifier' => $autoCountInvoiceId, + 'document_identifier_prefix' => $documentIdentifierPrefix, + 'autocountEInvoiceValidationLink' => $autoCountEInvoiceValidationLink, + ]); + + $document_object = new DocumentObject( + DocumentType::STORAGE_EINVOICE, + [chunk_split('data:application/pdf;base64,'.base64_encode($transaction_invoice_pdf->output()))], + '', + ApprovalStatus::COMPLETED, + 'shipping_einvoice' + ); + + /** @var Document $document */ + $document =$this->createsDocument->execute($invoice_transaction, $document_object); + + $this->createsFiles->execute($document, $document_object); + + $keyValuePairObject = new KeyValuePairObject(KVPKey::EINVOICE_ISSUED, 1); + $this->createsKeyValuePair->execute($invoice_transaction, $keyValuePairObject); + } +} diff --git a/app/Classes/Modules/Transactions/Processors/CreateStorageInvoiceTransactionDocProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateStorageInvoiceTransactionDocProcessor.php new file mode 100644 index 00000000..e495b606 --- /dev/null +++ b/app/Classes/Modules/Transactions/Processors/CreateStorageInvoiceTransactionDocProcessor.php @@ -0,0 +1,91 @@ +createsDocument = $createsDocument; + $this->createsFiles = $createsFiles; + } + + + /** + * @param Transaction $invoice_transaction + * @throws MalformedRequestException + */ + public function execute(Transaction $invoice_transaction) + { + if($invoice_transaction->status !== ApprovalStatus::COMPLETED){ + throw new ResourceNotFoundException(); + } + + $view = 'pages.pdfs.shipping_invoice'; + $dateToCompare = Carbon::parse(env('SST_START_DATE', '2024-04-01 00:00:00')); + Log::info('$dateToCompare 2: '.$dateToCompare); + $storageInvoiceTransactionCreatedDate = Carbon::parse($invoice_transaction->created_at); + Log::info('$storageInvoiceTransactionCreatedDate 2: '.$storageInvoiceTransactionCreatedDate); + if ($storageInvoiceTransactionCreatedDate->isAfter($dateToCompare) && $invoice_transaction->tax > 0) { + $view = 'pages.pdfs.shipping_invoice_sst'; + } + + $eInvoiceStartDate = Carbon::parse(env('E_INVOICE_START_DATE', '2025-07-01 00:00:00')); + if ($storageInvoiceTransactionCreatedDate->isAfter($eInvoiceStartDate)) { + $view = 'pages.pdfs.shipping_invoice_sst_v2'; + } + + $companyModule = $invoice_transaction->owner->owner->companyModule; + $brn = $companyModule->company->documents->where('document_type', DocumentType::SSM_REGISTRATION)->first(); + $documentDate = $invoice_transaction->created_at; + $documentIdentifierPrefix = 'Invoice No: '; + $documentIdentifier = $invoice_transaction->bill_no; + $transaction_invoice_pdf = LaravelMpdf::loadView($view, ['invoice_transaction' => $invoice_transaction, 'brn' => $brn, 'document_date' => $documentDate, 'document_identifier' => $documentIdentifier, 'document_identifier_prefix' => $documentIdentifierPrefix]); + + $document_object = new DocumentObject( + DocumentType::STORAGE_INVOICE, + [chunk_split('data:application/pdf;base64,'.base64_encode($transaction_invoice_pdf->output()))], + '', + ApprovalStatus::COMPLETED, + 'storage_invoice' + ); + + // $invouce_transaction_document = $invoice_transaction->documents()->where('document_type', DocumentType::STORAGE_INVOICE)->first(); + // if(!$invouce_transaction_document){ + /** @var Document $document */ + $document = $this->createsDocument->execute($invoice_transaction, $document_object); + + $this->createsFiles->execute($document, $document_object); + // $user = $packingList->owner->companyModule->employees()->first(); + // if(app()->environment(['production'])) { + // $user->notify(new InvoiceIssuedEmail($user, $packingList)); + // } + // } + } +} diff --git a/app/Classes/ValueObjects/Constants/DocumentType.php b/app/Classes/ValueObjects/Constants/DocumentType.php index 1463abd2..ed2cd604 100644 --- a/app/Classes/ValueObjects/Constants/DocumentType.php +++ b/app/Classes/ValueObjects/Constants/DocumentType.php @@ -27,4 +27,5 @@ final class DocumentType { public const STORAGE_INVOICE = 'STORAGE_INVOICE'; public const SALES_ORDER = 'SALES_ORDER'; public const SHIPPING_EINVOICE = 'SHIPPING_EINVOICE'; + public const STORAGE_EINVOICE = 'STORAGE_EINVOICE'; } diff --git a/app/Http/Controllers/Transactions/RegenerateSingleStorageInvoiceTransactionController.php b/app/Http/Controllers/Transactions/RegenerateSingleStorageInvoiceTransactionController.php index 0edebadd..e54c52f5 100644 --- a/app/Http/Controllers/Transactions/RegenerateSingleStorageInvoiceTransactionController.php +++ b/app/Http/Controllers/Transactions/RegenerateSingleStorageInvoiceTransactionController.php @@ -6,6 +6,7 @@ namespace App\Http\Controllers\Transactions; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use App\Classes\Modules\Transactions\ControllersLogic\RegenerateSingleStorageInvoiceTransactionLogic; +use App\Classes\Modules\Transactions\ControllersLogic\RegenerateSingleStorageEInvoiceLogic; class RegenerateSingleStorageInvoiceTransactionController @@ -18,4 +19,13 @@ class RegenerateSingleStorageInvoiceTransactionController public function regenerate(Request $request, RegenerateSingleStorageInvoiceTransactionLogic $logic) : JsonResponse { return $logic->execute($request); } + + /** + * @param Request $request + * @param RegenerateSingleStorageEInvoiceLogic $logic + * @return JsonResponse + */ + public function regenerateEInvoice(Request $request, RegenerateSingleStorageEInvoiceLogic $logic) : JsonResponse { + return $logic->execute($request); + } } diff --git a/resources/assets/vue/components/companies/sections/CustomerPaymentBillingSectionComponent.vue b/resources/assets/vue/components/companies/sections/CustomerPaymentBillingSectionComponent.vue index a349712f..7cb4b22e 100644 --- a/resources/assets/vue/components/companies/sections/CustomerPaymentBillingSectionComponent.vue +++ b/resources/assets/vue/components/companies/sections/CustomerPaymentBillingSectionComponent.vue @@ -1,7 +1,7 @@