From 8743efd33aa35264e4bf71f140aa1a907bd399ef Mon Sep 17 00:00:00 2001 From: Omair Saleh Date: Thu, 2 Feb 2023 07:51:17 +0800 Subject: [PATCH] update dummy data seed --- .../FetchesCompanyServiceSettings.php | 4 +- .../CreateInvoiceTransactionProcessor.php | 10 +- ...9_212614_create_companies_wallet_table.php | 4 +- ...12_01_102314_create_transactions_table.php | 5 +- ...212314_create_wallet_transaction_table.php | 51 --- ...020_12_02_131122_create_receipts_table.php | 50 --- ...02_131123_create_receipt_details_table.php | 38 -- ..._082211_drop_wallet_transactions_table.php | 28 -- ...1_10_02_082442_alter_wallet_company_id.php | 44 --- ...02_083144_alter_transaction_booking_id.php | 45 --- database/seeds/CompaniesTableSeeder.php | 10 + database/seeds/DatabaseSeeder.php | 8 +- database/seeds/DummyDataSeeder.php | 346 +++++++++++++----- 13 files changed, 285 insertions(+), 358 deletions(-) delete mode 100644 database/migrations/2020_12_01_212314_create_wallet_transaction_table.php delete mode 100644 database/migrations/2020_12_02_131122_create_receipts_table.php delete mode 100644 database/migrations/2020_12_02_131123_create_receipt_details_table.php delete mode 100644 database/migrations/2021_10_02_082211_drop_wallet_transactions_table.php delete mode 100644 database/migrations/2021_10_02_082442_alter_wallet_company_id.php delete mode 100644 database/migrations/2021_10_02_083144_alter_transaction_booking_id.php diff --git a/app/Classes/Modules/Companies/Services/FetchesCompanyServiceSettings.php b/app/Classes/Modules/Companies/Services/FetchesCompanyServiceSettings.php index 55a63803..5f84b81d 100644 --- a/app/Classes/Modules/Companies/Services/FetchesCompanyServiceSettings.php +++ b/app/Classes/Modules/Companies/Services/FetchesCompanyServiceSettings.php @@ -29,7 +29,7 @@ class FetchesCompanyServiceSettings $constants= $service->constants()->whereIn('segment_id', $company->segments->pluck('id'))->get(); - $standardConfigurations = $constants->firstWhere('reference', SegmentConstants::SERVICE_TYPE); + $standardConfigurations = $constants->where('reference', '=', SegmentConstants::SERVICE_TYPE)->first(); $rate = Currency::find($object->getCurrencyId())->rates->where('payment_method_type', $object->getPaymentMethod()) ->where('service_id', $object->getServiceId())->first(); @@ -105,4 +105,4 @@ class FetchesCompanyServiceSettings -} \ No newline at end of file +} diff --git a/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php index 6da2f352..9268dae0 100644 --- a/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php @@ -2,6 +2,7 @@ namespace App\Classes\Modules\Transactions\Processors; +use App\Classes\Exceptions\MalformedRequestException; use App\Classes\Modules\Bookings\Services\CalculatesBookingPayableAmount; use App\Classes\Modules\Bookings\Services\CalculatesBookingTransferredAmount; use App\Classes\Modules\ServiceTypes\Services\FetchesServiceConfigurations; @@ -22,8 +23,6 @@ use App\Models\SegmentConstant; class CreateInvoiceTransactionProcessor { - /** @var ListsTransactions */ - private $listsTransactions; /** @var CreatesTransaction */ private $createsTransaction; @@ -40,9 +39,6 @@ class CreateInvoiceTransactionProcessor /** @var CalculatesBookingTransferredAmount */ private $calculatesBookingTransferredAmount; - /** @var FetchesServiceConfigurations */ - private $fetchesServiceConfigurations; - /** @var CalculatesBookingCurrencyAverageRate */ private $calculatesBookingCurrencyAverageRate; @@ -71,13 +67,11 @@ class CreateInvoiceTransactionProcessor */ public function __construct(ListsTransactions $listsTransactions, CreatesTransaction $createsTransaction, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CalculatesBookingPaidAmount $calculatesBookingPaidAmount, CalculatesBookingPayableAmount $calculatesBookingPayableAmount, CalculatesBookingTransferredAmount $calculatesBookingTransferredAmount, FetchesServiceConfigurations $fetchesServiceConfigurations, CalculatesBookingCurrencyAverageRate $calculatesBookingCurrencyAverageRate, FetchesCompany $fetchesCompany, UpdatesBookingStatus $updatesBookingStatus, CreateInvoiceDocumentProcessor $invoiceDocumentProcessor) { - $this->listsTransactions = $listsTransactions; $this->createsTransaction = $createsTransaction; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->calculatesBookingPaidAmount = $calculatesBookingPaidAmount; $this->calculatesBookingPayableAmount = $calculatesBookingPayableAmount; $this->calculatesBookingTransferredAmount = $calculatesBookingTransferredAmount; - $this->fetchesServiceConfigurations = $fetchesServiceConfigurations; $this->calculatesBookingCurrencyAverageRate = $calculatesBookingCurrencyAverageRate; $this->fetchesCompany = $fetchesCompany; $this->updatesBookingStatus = $updatesBookingStatus; @@ -89,7 +83,7 @@ class CreateInvoiceTransactionProcessor /** * @param Booking $booking * @return void - * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws MalformedRequestException */ public function execute(Booking $booking) { diff --git a/database/migrations/2020_11_29_212614_create_companies_wallet_table.php b/database/migrations/2020_11_29_212614_create_companies_wallet_table.php index 7a7ade13..3837a0e1 100644 --- a/database/migrations/2020_11_29_212614_create_companies_wallet_table.php +++ b/database/migrations/2020_11_29_212614_create_companies_wallet_table.php @@ -15,15 +15,13 @@ class CreateCompaniesWalletTable extends Migration { Schema::create('wallets', function (Blueprint $table) { $table->id(); - - $table->foreignId('company_id')->unsigned(); + $table->morphs('owner'); $table->string('code'); $table->foreignId('currency_id')->unsigned(); $table->decimal('amount', 20, 5)->default(0.00); $table->softDeletes(); $table->timestamps(); - $table->foreign('company_id')->references('id')->on('companies'); $table->foreign('currency_id')->references('id')->on('currencies'); }); } diff --git a/database/migrations/2020_12_01_102314_create_transactions_table.php b/database/migrations/2020_12_01_102314_create_transactions_table.php index a07bf413..366b9a27 100644 --- a/database/migrations/2020_12_01_102314_create_transactions_table.php +++ b/database/migrations/2020_12_01_102314_create_transactions_table.php @@ -17,7 +17,7 @@ class CreateTransactionsTable extends Migration { Schema::create('transactions', function (Blueprint $table) { $table->id(); - $table->foreignId('booking_id')->unsigned(); + $table->morphs('owner'); $table->string('type')->default(TransactionType::PAYMENT); $table->foreignId('issuer')->unsigned(); $table->foreignId('receiver')->unsigned(); @@ -37,13 +37,12 @@ class CreateTransactionsTable extends Migration $table->softDeletes(); $table->timestamps(); - $table->foreign('booking_id')->references('id')->on('bookings'); $table->foreign('currency_id')->references('id')->on('currencies'); $table->foreign('issuer')->references('id')->on('companies'); $table->foreign('receiver')->references('id')->on('companies'); $table->foreign('recipient_bank_account_id')->references('id')->on('banks'); $table->foreign('original_currency_id')->references('id')->on('currencies'); - + }); } diff --git a/database/migrations/2020_12_01_212314_create_wallet_transaction_table.php b/database/migrations/2020_12_01_212314_create_wallet_transaction_table.php deleted file mode 100644 index f87780c7..00000000 --- a/database/migrations/2020_12_01_212314_create_wallet_transaction_table.php +++ /dev/null @@ -1,51 +0,0 @@ -id(); - - $table->foreignId('wallet_id')->unsigned(); - $table->foreignId('transaction_id')->unsigned()->nullable(); - $table->foreignId('bill_no')->unsigned(); - $table->integer('type')->default(TransactionType::PAYMENT); - $table->decimal('amount', 14, 5)->default(0.00); - $table->foreignId('currency_id')->unsigned(); - $table->decimal('original_amount', 14, 5)->default(0.00); - $table->foreignId('original_currency_id')->unsigned(); - $table->decimal('currency_rate', 14, 5)->default(0.00); - $table->integer('status')->default(ApprovalStatus::PENDING_SUBMISSION); - $table->softDeletes(); - $table->timestamps(); - - $table->foreign('transaction_id')->references('id')->on('transactions'); - $table->foreign('wallet_id')->references('id')->on('wallets'); - $table->foreign('currency_id')->references('id')->on('currencies'); - $table->foreign('original_currency_id')->references('id')->on('currencies'); - - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('wallet_transaction'); - } -} diff --git a/database/migrations/2020_12_02_131122_create_receipts_table.php b/database/migrations/2020_12_02_131122_create_receipts_table.php deleted file mode 100644 index 16ec2684..00000000 --- a/database/migrations/2020_12_02_131122_create_receipts_table.php +++ /dev/null @@ -1,50 +0,0 @@ -id(); - $table->foreignId('transaction_id')->unsigned(); - $table->string('bill_no')->unique(); - $table->decimal('amount', 14, 5)->default(0.00); - $table->decimal('original_amount', 14, 5)->default(0.00); - $table->foreignId('currency_id')->unsigned(); - $table->foreignId('original_currency_id')->unsigned(); - $table->decimal('currency_rate', 14, 5)->default(0.00); - $table->decimal('tax', 14, 5)->default(0.00); - $table->decimal('service_charge', 14, 5)->default(0.00); - $table->timestamp('transaction_date')->useCurrent(); - $table->integer('status')->default(ApprovalStatus::COMPLETED); - $table->softDeletes(); - $table->timestamps(); - - $table->foreign('transaction_id')->references('id')->on('transactions'); - $table->foreign('currency_id')->references('id')->on('currencies'); - $table->foreign('original_currency_id')->references('id')->on('currencies'); - - }); - - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('receipt'); - } -} diff --git a/database/migrations/2020_12_02_131123_create_receipt_details_table.php b/database/migrations/2020_12_02_131123_create_receipt_details_table.php deleted file mode 100644 index 0a008293..00000000 --- a/database/migrations/2020_12_02_131123_create_receipt_details_table.php +++ /dev/null @@ -1,38 +0,0 @@ -id(); - $table->foreignId('receipt_id')->unsigned(); - $table->decimal('price', 14, 5)->default(0.00); - $table->decimal('amount', 14, 5)->default(0.00); - $table->timestamps(); - - $table->foreign('receipt_id')->references('id')->on('receipts'); - - }); - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - Schema::dropIfExists('receipt_detail'); - } -} diff --git a/database/migrations/2021_10_02_082211_drop_wallet_transactions_table.php b/database/migrations/2021_10_02_082211_drop_wallet_transactions_table.php deleted file mode 100644 index f16eeba3..00000000 --- a/database/migrations/2021_10_02_082211_drop_wallet_transactions_table.php +++ /dev/null @@ -1,28 +0,0 @@ -dropForeign('wallets_company_id_foreign'); - $table->dropColumn('company_id'); - }); - } - - if (!Schema::hasColumn('wallets', 'owner_id')) { - Schema::table('wallets', function (Blueprint $table) { - $table->morphs('owner'); - }); - - //In-case the model name lengthy - Schema::table('wallets', function (Blueprint $table) { - $table->string('owner_type', 250)->change(); - }); - } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - } -} diff --git a/database/migrations/2021_10_02_083144_alter_transaction_booking_id.php b/database/migrations/2021_10_02_083144_alter_transaction_booking_id.php deleted file mode 100644 index a37da4e4..00000000 --- a/database/migrations/2021_10_02_083144_alter_transaction_booking_id.php +++ /dev/null @@ -1,45 +0,0 @@ -morphs('owner'); - }); - - //In-case the model name lengthy - Schema::table('transactions', function (Blueprint $table) { - $table->string('owner_type', 250)->change(); - }); - - DB::statement("UPDATE transactions SET owner_type='App\\\\Models\\\\Booking', owner_id = booking_id"); - - Schema::table('transactions', function (Blueprint $table) { - $table->dropForeign('transactions_booking_id_foreign'); - $table->dropColumn('booking_id'); - }); - } - } - - /** - * Reverse the migrations. - * - * @return void - */ - public function down() - { - // - } -} diff --git a/database/seeds/CompaniesTableSeeder.php b/database/seeds/CompaniesTableSeeder.php index 5e665a9e..51122432 100644 --- a/database/seeds/CompaniesTableSeeder.php +++ b/database/seeds/CompaniesTableSeeder.php @@ -25,5 +25,15 @@ class CompaniesTableSeeder extends Seeder $company->save(); + $bank = new \App\Models\Bank(); + $bank->company_id = $company->id; + $bank->bank_name = 'Maybank'; + $bank->holder_name = 'CIEF Worldwide Snd Bhd'; + $bank->account_no = '63465345345'; + $bank->country_id = 1; + $bank->status = ApprovalStatus::APPROVED; + $bank->type = \App\Classes\ValueObjects\Constants\BankAccountType::PERSONAL; + $bank->save(); + } } diff --git a/database/seeds/DatabaseSeeder.php b/database/seeds/DatabaseSeeder.php index a1928a7a..87d72f71 100644 --- a/database/seeds/DatabaseSeeder.php +++ b/database/seeds/DatabaseSeeder.php @@ -4,6 +4,7 @@ use Database\Seeders\BanksTableDevelopmentSeeder; use Database\Seeders\CompaniesTableDevelopmentSeeder; use Database\Seeders\CurrenciesTableDevelopmentSeeder; use Database\Seeders\CurrencyRatesTableDevelopmentSeeder; +use Database\Seeders\DummyDataSeeder; use Database\Seeders\SegmentConstantsTableDevelopmentSeeder; use Database\Seeders\SegmentsTableDevelopmentSeeder; use Database\Seeders\ServiceTypesTableDevelopmentSeeder; @@ -34,16 +35,17 @@ class DatabaseSeeder extends Seeder $this->call(CompaniesTableSeeder::class); // Admin - $this->call(AdminUserTableSeeder::class); +// $this->call(AdminUserTableSeeder::class); $this->call(AdminUserPermissionsTableSeeder::class); if(App()->environment('local')){ - $this->call(CompaniesTableDevelopmentSeeder::class); - $this->call(BanksTableDevelopmentSeeder::class); +// $this->call(CompaniesTableDevelopmentSeeder::class); +// $this->call(BanksTableDevelopmentSeeder::class); $this->call(ServiceTypesTableDevelopmentSeeder::class); $this->call(SegmentsTableDevelopmentSeeder::class); $this->call(SegmentConstantsTableDevelopmentSeeder::class); $this->call(CurrencyRatesTableDevelopmentSeeder::class); + $this->call(DummyDataSeeder::class); } DB::commit(); diff --git a/database/seeds/DummyDataSeeder.php b/database/seeds/DummyDataSeeder.php index 4ac8857c..e3fc7964 100644 --- a/database/seeds/DummyDataSeeder.php +++ b/database/seeds/DummyDataSeeder.php @@ -12,72 +12,56 @@ use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject; use App\Classes\Modules\Addresses\Services\CreatesAddress; use App\Classes\Modules\Banks\DataTransferObjects\BankObject; use App\Classes\Modules\Banks\Services\CreatesBank; +use App\Classes\Modules\Banks\Services\SetsBankToDefault; use App\Classes\Modules\Bookings\DataTransferObjects\BookingObject; use App\Classes\Modules\Bookings\Services\CreatesBooking; +use App\Classes\Modules\Bookings\Services\FetchesBookingQuotation; use App\Classes\Modules\Bookings\Services\GeneratesBookingMarking; -use App\Classes\Modules\Companies\DataTransferObjects\CompanyConnectionObject; -use App\Classes\Modules\Companies\DataTransferObjects\CompanyModuleObject; use App\Classes\Modules\Companies\DataTransferObjects\CompanyObject; use App\Classes\Modules\Companies\DataTransferObjects\EmploymentObject; use App\Classes\Modules\Companies\Processors\AssignEmployeeProcessor; -use App\Classes\Modules\Companies\Services\ApprovesCompanyConnection; +use App\Classes\Modules\Companies\Processors\AssignSegmentProcessor; use App\Classes\Modules\Companies\Services\CreatesCompany; -use App\Classes\Modules\Companies\Services\CreatesCompanyConnection; -use App\Classes\Modules\Companies\Services\CreatesCompanyModule; -use App\Classes\Modules\Companies\Services\GeneratesUniqueAccountNumber; use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Contacts\Services\CreatesContact; +use App\Classes\Modules\Currencies\DataTransferObjects\CurrencyConversionObject; use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; +use App\Classes\Modules\Documents\Services\ApprovesDocument; use App\Classes\Modules\Documents\Services\CreatesDocument; use App\Classes\Modules\Documents\Services\CreatesFiles; -use App\Classes\Modules\Orders\Processors\CreateOrderProcessor; -use App\Classes\Modules\Orders\Services\GeneratesOrderNumber; -use App\Classes\Modules\PackingLists\DataTransferObjects\ContainerObject; -use App\Classes\Modules\PackingLists\DataTransferObjects\PackageObject; -use App\Classes\Modules\PackingLists\DataTransferObjects\PackingListObject; -use App\Classes\Modules\PackingLists\Processors\CreateContainerProcessor; -use App\Classes\Modules\PackingLists\Processors\CreatePackageProcessor; -use App\Classes\Modules\PackingLists\Processors\CreatePackingListProcessor; -use App\Classes\Modules\Schedules\DataTransferObjects\ScheduleObject; -use App\Classes\Modules\Schedules\Services\CreatesSchedule; +use App\Classes\Modules\Documents\Services\RejectsDocument; use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; +use App\Classes\Modules\Transactions\Processors\CreateInvoiceTransactionProcessor; +use App\Classes\Modules\Transactions\Processors\CreatePurchaseOrderTransactionProcessor; +use App\Classes\Modules\Transactions\Processors\CreateSupplierTransactionProcessor; use App\Classes\Modules\Transactions\Services\CreatesTransaction; use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; -use App\Classes\Modules\Transports\DataTransferObjects\TransportObject; -use App\Classes\Modules\Transports\Services\CreatesTransport; use App\Classes\Modules\Wallets\DataTransferObjects\WalletObject; use App\Classes\Modules\Wallets\Services\CreatesWallet; use App\Classes\Modules\Wallets\Services\GeneratesWalletCode; use App\Classes\Modules\Wallets\Services\UpdatesWalletBalance; -use App\Classes\ValueObjects\Constants\AddressType; use App\Classes\ValueObjects\Constants\ApprovalStatus; -use App\Classes\ValueObjects\Constants\BankAccountType; use App\Classes\ValueObjects\Constants\BusinessType; use App\Classes\ValueObjects\Constants\CompanyType; -use App\Classes\ValueObjects\Constants\ContainerTypes; use App\Classes\ValueObjects\Constants\DocumentType; -use App\Classes\ValueObjects\Constants\PackageType; -use App\Classes\ValueObjects\Constants\PackingListType; use App\Classes\ValueObjects\Constants\PaymentMethodType; use App\Classes\ValueObjects\Constants\RoleTypes; use App\Classes\ValueObjects\Constants\TransactionType; -use App\Classes\ValueObjects\Constants\TransportType; use App\Models\Address; use App\Models\Company; -use App\Models\CompanyModule; -use App\Models\Container; use App\Models\Document; -use App\Models\PackingList; +use App\Models\Group; use App\Models\ServiceType; use App\Models\Transaction; -use App\Models\Transport; use App\Models\User; use App\Models\Wallet; use Carbon\Carbon; use Illuminate\Database\Seeder; use Faker\Generator as Faker; +use Meneses\LaravelMpdf\Facades\LaravelMpdf; +use Mpdf\MpdfException; class DummyDataSeeder extends Seeder { @@ -133,9 +117,29 @@ class DummyDataSeeder extends Seeder /** @var CreatesBooking */ public $createsBooking; + /** @var FetchesBookingQuotation */ + public $fetchBookingQuotation; + /** @var ApprovesDocument */ + public $approvesDocument; + /** @var RejectsDocument */ + public $rejectsDocument; + /** @var CreatePurchaseOrderTransactionProcessor */ + public $createPurchaseOrderTransactionProcessor; + + /** @var CreateInvoiceTransactionProcessor */ + public $createInvoiceTransactionProcessor; + + /** @var CreateSupplierTransactionProcessor */ + public $createSupplierTransactionProcessor; + + /** @var AssignSegmentProcessor */ + private $assignSegmentProcessor; + + /** @var SetsBankToDefault*/ + private $setsBankToDefault ; /** * @param Faker $faker @@ -146,8 +150,25 @@ class DummyDataSeeder extends Seeder * @param AssignEmployeeProcessor $assignEmployeeProcessor * @param CreatesDocument $createsDocument * @param CreatesFiles $createsFiles + * @param GeneratesWalletCode $generatesWalletCode + * @param CreatesWallet $createsWallet + * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber + * @param CreatesTransaction $createsTransaction + * @param UpdatesTransactionStatus $updatesTransactionStatus + * @param UpdatesWalletBalance $updatesWalletBalance + * @param CreatesBank $createsBank + * @param GeneratesBookingMarking $generatesBookingMarking + * @param CreatesBooking $createsBooking + * @param FetchesBookingQuotation $fetchBookingQuotation + * @param ApprovesDocument $approvesDocument + * @param RejectsDocument $rejectsDocument + * @param CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor + * @param CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor + * @param CreateSupplierTransactionProcessor $createSupplierTransactionProcessor + * @param AssignSegmentProcessor $assignSegmentProcessor + * @param SetsBankToDefault $setsBankToDefault */ - public function __construct(Faker $faker, CreatesUser $createsUser, CreatesCompany $createsCompany, CreatesContact $createsContact, CreatesAddress $createsAddress, AssignEmployeeProcessor $assignEmployeeProcessor, CreatesDocument $createsDocument, CreatesFiles $createsFiles) + public function __construct(Faker $faker, CreatesUser $createsUser, CreatesCompany $createsCompany, CreatesContact $createsContact, CreatesAddress $createsAddress, AssignEmployeeProcessor $assignEmployeeProcessor, CreatesDocument $createsDocument, CreatesFiles $createsFiles, GeneratesWalletCode $generatesWalletCode, CreatesWallet $createsWallet, GeneratesTransactionBillNumber $generatesTransactionBillNumber, CreatesTransaction $createsTransaction, UpdatesTransactionStatus $updatesTransactionStatus, UpdatesWalletBalance $updatesWalletBalance, CreatesBank $createsBank, GeneratesBookingMarking $generatesBookingMarking, CreatesBooking $createsBooking, FetchesBookingQuotation $fetchBookingQuotation, ApprovesDocument $approvesDocument, RejectsDocument $rejectsDocument, CreatePurchaseOrderTransactionProcessor $createPurchaseOrderTransactionProcessor, CreateInvoiceTransactionProcessor $createInvoiceTransactionProcessor, CreateSupplierTransactionProcessor $createSupplierTransactionProcessor, AssignSegmentProcessor $assignSegmentProcessor, SetsBankToDefault $setsBankToDefault) { $this->faker = $faker; $this->createsUser = $createsUser; @@ -157,6 +178,23 @@ class DummyDataSeeder extends Seeder $this->assignEmployeeProcessor = $assignEmployeeProcessor; $this->createsDocument = $createsDocument; $this->createsFiles = $createsFiles; + $this->generatesWalletCode = $generatesWalletCode; + $this->createsWallet = $createsWallet; + $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; + $this->createsTransaction = $createsTransaction; + $this->updatesTransactionStatus = $updatesTransactionStatus; + $this->updatesWalletBalance = $updatesWalletBalance; + $this->createsBank = $createsBank; + $this->generatesBookingMarking = $generatesBookingMarking; + $this->createsBooking = $createsBooking; + $this->fetchBookingQuotation = $fetchBookingQuotation; + $this->approvesDocument = $approvesDocument; + $this->rejectsDocument = $rejectsDocument; + $this->createPurchaseOrderTransactionProcessor = $createPurchaseOrderTransactionProcessor; + $this->createInvoiceTransactionProcessor = $createInvoiceTransactionProcessor; + $this->createSupplierTransactionProcessor = $createSupplierTransactionProcessor; + $this->assignSegmentProcessor = $assignSegmentProcessor; + $this->setsBankToDefault = $setsBankToDefault; } @@ -164,9 +202,10 @@ class DummyDataSeeder extends Seeder * Run the database seeds. * * @return void - * @throws MalformedRequestException * @throws AccessForbiddenException + * @throws MalformedRequestException * @throws RequestValidationException + * @throws MpdfException */ public function run() { @@ -189,11 +228,13 @@ class DummyDataSeeder extends Seeder // =============================================== // // create super admin - $userObject = new RegistrationObject($this->faker->name, 'super_admin@izyim.com', $password, $password,RoleTypes::SUPER_ADMIN, ApprovalStatus::APPROVED); + $userObject = new RegistrationObject($this->faker->name, 'super_admin@exchange.com', $password, $password,RoleTypes::SUPER_ADMIN, ApprovalStatus::APPROVED); $this->createsUser->execute($userObject); + Auth()->login(User::find(1)); + // create admin - $userObject = new RegistrationObject($this->faker->name, 'admin@izyim.com', $password, $password,RoleTypes::ADMIN, ApprovalStatus::APPROVED); + $userObject = new RegistrationObject($this->faker->name, 'admin@exchange.com', $password, $password,RoleTypes::ADMIN, ApprovalStatus::APPROVED); $this->createsUser->execute($userObject); // create CIEF @@ -211,37 +252,17 @@ class DummyDataSeeder extends Seeder $supplierName = $this->faker->company; $supplierReference = $this->faker->bothify('??-????'); - $company_object = new CompanyObject($supplierName, $supplierReference,CompanyType::COMPANY_BUSINESS,ApprovalStatus::APPROVED); + $company_object = new CompanyObject($supplierName, $supplierReference,BusinessType::CURRENCY_VENDOR, CompanyType::COMPANY_BUSINESS, ApprovalStatus::APPROVED); /** @var Company $company */ $company = $this->createsCompany->execute($company_object); + $bank_object = new BankObject($company->id, $this->faker->numberBetween(2, 3), + $this->faker->company, $this->faker->name, $this->faker->bankAccountNumber, + $this->faker->city, null, null, + 2, $this->faker->company); - $companyModuleObject = new CompanyModuleObject($supplierName, $supplierReference, '', '', BusinessType::FREIGHT_FORWARDER, ApprovalStatus::APPROVED); - $this->createsCompanyModule->execute($company, $companyModuleObject); + $bank = $this->createsBank->execute($bank_object); + $this->setsBankToDefault->execute($bank); - // create supplier warehouses - foreach(['Guangzhou', 'Yiwu', 'Klang', 'Sabah', 'Sarawak'] as $name){ - - $warehouseReference = ''; - $isChina = false; - - switch($name) { - case 'Guangzhou': $warehouseReference = 'GZ-V0'.$i; $isChina = true; break; - case 'Yiwu': $warehouseReference = 'YY-V0'.$i; $isChina = true; break; - case 'Klang': $warehouseReference = 'KL-V0'.$i; break; - case 'Sabah': $warehouseReference = 'SB-V0'.$i; break; - case 'Sarawak':$warehouseReference = 'SRW-V0'.$i; break; - } - - $companyModuleObject = new CompanyModuleObject($name, $warehouseReference, '', '', BusinessType::WAREHOUSE, ApprovalStatus::APPROVED); - /** @var CompanyModule $companyModule */ - $companyModule = $this->createsCompanyModule->execute($company, $companyModuleObject); - - $address = new AddressObject( $this->faker->streetAddress, $this->faker->streetAddress, $isChina ? 2 : 1, $isChina ? 35 : 15, $isChina ? 633 : 412, $isChina ? 510450 : 41400, AddressType::DELIVERY, ApprovalStatus::APPROVED); - $this->createsAddress->execute($companyModule, $address); - - $contact = new ContactObject($this->faker->name, $this->faker->phoneNumber, '', ''); - $this->createsContact->execute($companyModule, $contact); - } } @@ -316,6 +337,8 @@ class DummyDataSeeder extends Seeder /** @var Company $company */ $company = $this->createsCompany->execute($company_object); + $this->assignSegmentProcessor->execute($company); + // === // // 3 // ===========// @@ -330,7 +353,7 @@ class DummyDataSeeder extends Seeder // Create Contact // // ================= // // Contacts uses eloquent polymorphic relationship to declare its owner. and for this use case it will be attached to the company not the company module. - $contactObject = new ContactObject($company->id, $customerName, $this->faker->phoneNumber, $customerEmail, null, $this->faker->bothify('??#####')); + $contactObject = new ContactObject($company->id, $customerName, (int) $this->faker->randomNumber(7), $customerEmail, null, 1); $this->createsContact->execute($contactObject); // === // @@ -420,7 +443,7 @@ class DummyDataSeeder extends Seeder // 2. AliPay Transfer (EXTERNAL) (the account the customer is requesting to transfer funds to when bank type is ALIPAY) // 3. Refund bank (PERSONAL) (the account the customer is requesting his order refunds to be transferred to) $bank_object = new BankObject($company->id, $this->faker->numberBetween(2, 3), - $this->faker->bank, $this->faker->name, $this->faker->bankAccountNumber, + $this->faker->company, $this->faker->name, $this->faker->bankAccountNumber, $this->faker->city, null, null, 2, $this->faker->company); @@ -428,8 +451,8 @@ class DummyDataSeeder extends Seeder $bank = $this->createsBank->execute($bank_object); // generate random number of bookings - for($orderLoop=1; $orderLoop <= rand(1, 30); $orderLoop++) { - + for($orderLoop=1; $orderLoop <= rand(3, 30); $orderLoop++) { + echo 'booking created'; // === // // 9 // ========= // // Create Booking // @@ -453,15 +476,15 @@ class DummyDataSeeder extends Seeder // and can be used to place different type of transfer orders (e.g. 1 day transfer, 3 days transfer, 1688 Payment) // randomly selects a service type - $service = ServiceType::where('reference', $this->faker->numberBetween(1, 3))->first(); + $service = ServiceType::inRandomOrder()->first(); // Booking human readable id $reference = $this->generatesBookingMarking->execute(); // random currency booking (CNY, USD) - $bookedCurrency = $this->faker->numberBetween(2, 3); + $bookedCurrency = 2; + $bank = $company->banks()->inRandomOrder()->first(); $object = new BookingObject($service->id, $bank->id, $reference, $this->faker->numberBetween(10, 300000), $bookedCurrency, $bookedCurrency, 1); - $booking = $this->createsBooking->execute($company, $object); @@ -475,33 +498,190 @@ class DummyDataSeeder extends Seeder // TransactionType::TRANSFER_FEE : is to represent the transfer fee charged by CIEF currency supplier is attached to a transaction type TransactionType::BILL; // TransactionType::REFUND : is to represent a request for refund on a payment, and is attached to a transaction type TransactionType::PAYMENT; - // todo make payment - // todo approve payment + $numberOfPayments = $this->faker->numberBetween(0, 3); - // todo create supplier order - // when processing a customer order, we will place an order with one of our currency supplier which will generate a transaction type TransactionType::BILL - // and attach it to the customer payment TransactionType::PAYMENT, and it will update the TransactionType::PAYMENT status to ApprovalStatus::COMPLETED + for ($paymentLoop=0; $paymentLoop <= $numberOfPayments; $paymentLoop++) { + echo 'payment created'; + $shouldSubmit = $this->faker->numberBetween(0, 1); + $shouldApprove = $this->faker->numberBetween(0, 1); + if ($numberOfPayments > 1){ - // todo upload china payment proof - // when our currency supplier completes the transfer they will send us the bank slip as proof of payment, then the admin user - // will upload the bank slip document and attaching it to transaction type TransactionType::BILL + $amount = $booking->fix_amount / $numberOfPayments; + + $conversionObject = new CurrencyConversionObject(floatval(str_replace(',', '', $amount)), $booking->convertible_currency_id, $booking->service_id, $booking->fix_currency_id === 1 ? 0:1, PaymentMethodType::PAYMENT_METHODS['cash']); + + $configurations = $this->fetchBookingQuotation->execute($booking->company, $conversionObject); + + $billNumber = $this->generatesTransactionBillNumber->execute('PYMT-'); + + $object = new TransactionObject($billNumber, TransactionType::PAYMENT, 1, $booking->company->id, + $configurations->getConfigurations()->getBankId(), $configurations->getConversionObject()->getPaymentMethod(), + $configurations->getTotal(), $configurations->getForeignTotal(), 1, + $configurations->getConversionObject()->getCurrencyId(), $configurations->getConfigurations()->getRate(), + $configurations->getTax(), $configurations->getServiceCharge(), Carbon::now()->addMinutes(10), ApprovalStatus::PENDING_SUBMISSION, [], null); + + /** @var Transaction $transaction */ + $transaction = $this->createsTransaction->execute($booking, $object); + + if($shouldSubmit || $shouldApprove) { + $object = new DocumentObject( DocumentType::CUSTOMER_PAYMENT_PROOF, ['data:image/png;base64,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'], + '', ApprovalStatus::PENDING_VERIFICATION, 'payments'); + /** @var Document $document */ + $document = $this->createsDocument->execute($transaction, $object); + $this->createsFiles->execute($document, $object); + $this->updatesTransactionStatus->execute($transaction, ApprovalStatus::PENDING_SUBMISSION); + } + + if($shouldApprove) { + $this->approvesDocument->execute($document); + $this->updatesTransactionStatus->execute($transaction, ApprovalStatus::APPROVED); + + $shouldReject = $this->faker->numberBetween(0, 1); + if($shouldReject){ + $this->rejectsDocument->execute($document); + $this->updatesTransactionStatus->execute($transaction, ApprovalStatus::REJECTED); + } + } + } + + } - // todo create purchase order // creating the purchase order can happen before or after the payment is made, the customer needs to fill up the list of product // they are buying and attaching it to the booking, a purchase order is a transaction of type TransactionType::PURCHASE_ORDER - // todo approve purchase order + $billNumber = $this->generatesTransactionBillNumber->execute('PO-'); + + + $shouldSubmit = $this->faker->numberBetween(0, 1); + $shouldApprove = $this->faker->numberBetween(0, 1); + + if($shouldSubmit){ + $completeSubmission = $this->faker->numberBetween(0, 1); + + $quantity = $this->faker->numberBetween(5, 200); + $unitPrice = $booking->fix_amount / $quantity; + + $products = collect([[ + 'stockCode' => $this->faker->numerify('#####'), + 'description' => $this->faker->text, + 'quantity' => $completeSubmission ? $quantity : $quantity - $this->faker->numberBetween(1, 4), + 'unit_price' => (string) round($unitPrice, 5) + ]]); + + $total = $products->first()['quantity'] * (float) $products->first()['unit_price']; + + $object = new TransactionObject($billNumber, TransactionType::PURCHASE_ORDER, $booking->company->id, 1, + 1, PaymentMethodType::CASH, + $total, $total, $booking->fix_currency_id, $booking->fix_currency_id, + 1, 0, 0, null, ApprovalStatus::PENDING_SUBMISSION, $products->toArray()); + + $transaction = $this->createPurchaseOrderTransactionProcessor->execute($booking, $object); + } + + if($transaction->status === ApprovalStatus::PENDING_VERIFICATION) { + $this->updatesTransactionStatus->execute($transaction, ApprovalStatus::APPROVED); + } - // todo generate invoice - // the invoicing documents will be generated once they 2 conditions are met: - // 1. Full payment completed (completed is flagged when the china payment proof is uploaded) - // 2. The purchase order is filled and approved (when the purchase order is not filled for more than 2 months the system will automatically generate a random products for Purchase order to close the order) - // once the invoice is generated the transaction table will include 2 new transaction type TransactionType::INVOICE, TransactionType::SUPPLIER_DELIVERY - // and for documents will be generated and attached to the booking. - // once this process is complete the booking status will update to ApprovalStatus::COMPLETED } + // when processing a customer order, we will place an order with one of our currency supplier which will generate a transaction type TransactionType::BILL + // and attach it to the customer payment TransactionType::PAYMENT, and it will update the TransactionType::PAYMENT status to ApprovalStatus::COMPLETED + $totalApprovedPayments = Transaction::where('type', TransactionType::PAYMENT)->where('status', 2)->count(); + $totalWhiteForms = round($totalApprovedPayments / $this->faker->numberBetween(2, 5)); + $perWhiteForm = $totalApprovedPayments / (round($totalWhiteForms / 2) ?: 1); + + for($orderLoop=1; $orderLoop <= ($totalWhiteForms / 2); $orderLoop++) { + $supplier = Company::where('business_type', BusinessType::CURRENCY_VENDOR)->inRandomOrder()->first(); + $rate = $this->faker->randomFloat(5, 1.3, 1.6); + $payments = Transaction::where('type', TransactionType::PAYMENT)->where('status', ApprovalStatus::APPROVED)->inRandomOrder()->limit($perWhiteForm)->get(); + + $this->createSupplierTransactionProcessor->execute($supplier, $rate, $payments->toArray()); + + $group = new Group(); + $group->save(); + + $issuer = ''; + $receiver = ''; + $amount = 0; + $original_amount = 0; + $currency_id = 0; + $original_currency_id = ''; + $currency_rate = ''; + $tax = 0; + $service_charge = 0; + + foreach ($this->createSupplierTransactionProcessor->getBills() as $key => $row) { + $group->transactions()->sync($row->id, false); + $issuer = $row->issuer; + $receiver = $row->receiver; + $amount += $row->amount; + $original_amount += $row->original_amount; + $currency_id = $row->currency_id; + $original_currency_id = $row->original_currency_id; + $currency_rate = $row->currency_rate; + $tax += $row->tax; + $service_charge += $row->service_charge; + } + + $group->issuer = $issuer; + $group->receiver = $receiver; + $group->reference = $this->generatesTransactionBillNumber->execute('SPO-'); + $group->amount = $amount; + $group->original_amount = $original_amount; + $group->currency_id = $currency_id; + $group->original_currency_id = $original_currency_id; + $group->currency_rate = $currency_rate; + $group->tax = $tax; + $group->service_charge = $service_charge; + + $group->update(); + + $pdf = LaravelMpdf::loadView('pages.pdfs.currency_vendor_order', ['transactions' => $this->createSupplierTransactionProcessor->getBills(), 'transferFeeTransactions' => $this->createSupplierTransactionProcessor->getTransferTransactions(), 'supplier' => $supplier]); + + $object = new DocumentObject( + DocumentType::CURRENCY_VENDOR_ORDER, + [chunk_split('data:application/pdf;base64,'.base64_encode($pdf->output()))], + '', + ApprovalStatus::COMPLETED, + 'currency_vendor_order' + ); + + /** @var Document $document */ + $document = $this->createsDocument->execute($group, $object); + $this->createsFiles->execute($document, $object); + + + foreach ($payments as $payment) { + $chinaBankSlipUploaded = $this->faker->numberBetween(0, 1); + + if($chinaBankSlipUploaded){ + $bill = $payment->transactions()->where('type', TransactionType::BILL)->first(); + + // when our currency supplier completes the transfer they will send us the bank slip as proof of payment, then the admin user + // will upload the bank slip document and attaching it to transaction type TransactionType::BILL + $object = new DocumentObject( DocumentType::CUSTOMER_PAYMENT_PROOF, ['data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAIAAAB7GkOtAAANGklEQVR4nOzXDa/fdX3G8R44Ww54BIFV2wFyoxUoKmsFhA0zEGQj1jOMo5o5IQPmYE5wrSvjdhbHAGWt0BWEwmChuHEjSF2LrY6tlmFjJbblprQstD21UFzbrBhX1tKyR3ElJtfr9QCu78k/v5N3PoOzbv/SmKR/mv94dP+FN9dH95+7+J7o/sjse6P7y3d/Orq/6qKTovtLN94f3Z9w39nR/XeFv/+nrlse3V/xhbXR/Xuv/kx0f3TDjuj+oltviO7PHJf9/veJrgPwK0sAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQafOeyu6MPPP9by6L7f7n/yuj+rWN/Et3/xiu/Gd3/xQduju7ve+KE6P7wc6dG9yde/lx0f86J2e/nO38yLrq/ftXT0f0/m7wzuj9jw4vR/V2n74jub7v8zOi+CwCglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKDWw40dD0Qc2PP+O6P6cJauj+zP+dVl0//izT47uv+eazdH9bf+3I7r/xhFXR/dnzjwmun/lJ56N7n/vA/Oi+5NmnxDdf3jqtuj+8j0PRPfnzPtUdP/Jt++K7rsAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSgwsfXhl94KuHrIjuHzvmxuj+g6+9EN1//Pz/jO5P/2x2f/dTL0X3f+e9S6L7f3zJHdH9jafOjO6/7/LDo/s3bL4+un/rnNOi+yMXDUX3Bw6YFt2/+IyTovsuAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACg1OCEe34UfWDn+SPR/bcWrY3u//DMbdH94w4diu4/sPTo6P7tNx0Z3V92wrzo/k8/uzu6f8DwndH9v5i1ILq/+UO3Rfd3Lz4nuv+VRx6K7s9Y+nJ0f+HKsdF9FwBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUGrw9+84JfrAof89P7r/wf8aG90/d8//RvdvXf/30f3JI8ui+8ceeUd0/+DPr4nuf3jX56L7p168Krr/rcfOiu6PHvhqdH/xLauj+8+Mbozur/vpj6P7E8edH913AQCUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQYXb9kafeDSf/lWdP/fdx4c3X9k60vR/b13Xxjdnzb1Z9H90ctWRfffmvRGdP+8e96M7m+avT26/45vnh3d/9rNY6P7Tz/5w+j+e6bMj+4f8rHro/vHH579/l0AAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAECpwb037R994NK5a6P7/7zgvuj+JTNPiO7/7fKjo/t7H7wmuj/8+pnR/f2nbojuH33tndH9333536L7E25+Kro//NuTo/vLT1oe3f+jNZdG9y+ffHB0f972e6L7LgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoNTgYcd8LvrA9IGd0f3jh6+K7l8/d010f5/hrdH98euGovuf+OvbovsHnPpSdP/p6X8e3d8ztD26v+bJydH9GQfcG91/+MWPRve/vPSX0f2P/OmC6P7AdYdF910AAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAECpgXMG3x59YPXKWdH9xc9+P7q/3/SjovvLjjs3uv83E4+N7p904Lej+9MXfCq6//ULvxvdf2D2KdH9afOuiu5PnPm26P7QM1Oy+yPZ7/PItdui+1v+Y1103wUAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQaeOKXH48+sGnNtOj+mGkrovNvm3tddH/MoWOj8y/cckx0/6D5743u/+ydI9H9O/d+JLr/yuwLovtbHhqI7r//wuz3+Z2PfTC6/5VXVkX3/+G+c6L7Xz9vRnTfBQBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBp4/ZC7og/84cLx0f1fX7gyuj/xy6PR/eueuDG6P/6rS6L7t//g8ej+Xa9Niu6/9sSM6P4bmx6L7t+14+Do/se/NBzd3/7Rq6L7a976dHR/xruy/1+jO/aN7rsAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSg48/PyX6wBenDkX3Z607Lbo/d9f7o/tblmd//5u+Oyu6f/rP50X3B1/dEN2/5O6V0f0rLr0tur/omp9E918deT26/+Dpe6P7N179d9H9TdeORvd33XdOdN8FAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUGpgzcW/0gQ9PPyK6P/jtB6P7nzxrU3T/i/dvjO6vPuWQ6P6Z7/616P76T94Q3X/37qHo/rzfmx/dv2V8dv/+/S6L7j/6B0uj+wftuyS6v+KK7O+/++Xs3+8CACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKDTx24TeiDzz68MnR/UU7D4/uH/ah7P6PH5oT3T/viCuj+18b2RTd//7J+0f3L7nipuj+lAueie6PmXpUdH7mpDOi+y/ueiS6f9kP/iq6/+yEn0f3p1x0UXTfBQBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBo86urN0Qemjk6N7n9v+Nzo/uHXfj66P3fF1uj+Pvv9T3T/wBOj82MeOuvR6P64cVdE9/9x4KDo/m+cdmV0f8HSPdH9910wKbo//gv3Rve/+YszovufufO46L4LAKCUAACUEgCAUgIAUEoAAEoJAEApAQAoJQAApQQAoJQAAJQSAIBSAgBQSgAASgkAQCkBACglAAClBACglAAAlBIAgFICAFBKAABKCQBAKQEAKCUAAKUEAKCUAACUEgCAUgIAUEoAAEoJAEApAQAo9f8BAAD//3aYjHM9JD/iAAAAAElFTkSuQmCC'], + '', ApprovalStatus::APPROVED, 'china_bank_slip'); + /** @var Document $document */ + $document = $this->createsDocument->execute($bill, $object); + $this->createsFiles->execute($document, $object); + + $this->updatesTransactionStatus->execute($bill, ApprovalStatus::APPROVED); + + // the invoicing documents will be generated once they 2 conditions are met: + // 1. Full payment completed (completed is flagged when the china payment proof is uploaded) + // 2. The purchase order is filled and approved (when the purchase order is not filled for more than 2 months the system will automatically generate a random products for Purchase order to close the order) + + // once the invoice is generated the transaction table will include 2 new transaction type TransactionType::INVOICE, TransactionType::SUPPLIER_DELIVERY + // and for documents will be generated and attached to the booking. + // once this process is complete the booking status will update to ApprovalStatus::COMPLETED + $this->createInvoiceTransactionProcessor->execute($booking); + + } + } + + + } } }