diff --git a/app/Classes/General/Traits/LogData.php b/app/Classes/General/Traits/LogData.php new file mode 100644 index 00000000..e7c6c08b --- /dev/null +++ b/app/Classes/General/Traits/LogData.php @@ -0,0 +1,55 @@ +table).'_logs'; + $relationshipColumn = Str::singular($model->table).'_id'; + + $originalData = $model->getRawOriginal(); + + $originalData[$relationshipColumn] = $originalData['id']; + unset($originalData['id']); + + // remove pivot columns + foreach($originalData as $key => $row){ + if(str::startsWith($key, 'pivot_')){ + unset($originalData[$key]); + } + } + + if (!Schema::hasTable($tableName)) { + DB::statement('CREATE TABLE '.$tableName.' LIKE '.$model->table); + + $indexs = DB::select('SHOW INDEX FROM '.$tableName.';'); + + $removedIndexes = []; + foreach ($indexs as $index){ + if($index->Column_name === 'id' || in_array($index->Key_name, $removedIndexes)) continue; + DB::statement('ALTER TABLE '.$tableName.' drop index '.$index->Key_name); + $removedIndexes[] = $index->Key_name; + } + + DB::statement('ALTER TABLE '.$tableName.' ADD COLUMN `'.$relationshipColumn.'` BIGINT NOT NULL AFTER `id`'); + } + + DB::table($tableName)->insert($originalData); + + }); + } +} diff --git a/app/Classes/Modules/Accounts/ControllersLogic/FetchUserByEmailLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/FetchUserByEmailLogic.php new file mode 100644 index 00000000..5db3fab4 --- /dev/null +++ b/app/Classes/Modules/Accounts/ControllersLogic/FetchUserByEmailLogic.php @@ -0,0 +1,61 @@ + 'Retrieved User', + 'message' => 'You have successfully retrieved a User by email' + ]; + } + + /** @var CanFetchUser */ + private $canFetchUser; + + /** @var FetchesUser */ + private $fetchesUser; + + /** + * FetchUserByEmailLogic constructor. + * @param CanFetchUser $canFetchUser + * @param FetchesUser $fetchesUser + */ + public function __construct(CanFetchUser $canFetchUser, FetchesUser $fetchesCompany) + { + $this->canFetchUser = $canFetchUser; + $this->fetchesUser = $fetchesCompany; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request) : JsonResponse + { + $this->canFetchUser->passes(); + + $query = $this->fetchesUser->execute(['email' => $request->route('email')]); + + return $this->resourceResponse(new UserCompanyResource($query)); + + } + +} diff --git a/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingOwnerLogic.php b/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingOwnerLogic.php new file mode 100644 index 00000000..90b3fb98 --- /dev/null +++ b/app/Classes/Modules/Bookings/ControllersLogic/UpdateBookingOwnerLogic.php @@ -0,0 +1,87 @@ + 'Update Booking Owner', + 'message' => "You have successfully updated booking's owner" + ]; + } + + /** @var CanUpdateBooking */ + private $canUpdateBooking; + + /** @var UpdatesBookingOwner */ + private $updatesBookingOwner; + + /** @var FetchesBooking */ + private $fetchesBooking; + + /** @var CanFetchBooking */ + private $canFetchBooking; + + /** @var FetchesCompany */ + private $fetchesCompany; + + /** + * UpdateBookingLogic constructor. + * @param CanUpdateBooking $canUpdateBooking + * @param UpdatesBookingOwner $updatesBookingOwner + * @param CanFetchBooking $canFetchBooking + * @param FetchesBooking $fetchesBooking + * @param FetchesCompany $fetchesCompany + */ + public function __construct( + CanUpdateBooking $canUpdateBooking, + UpdatesBookingOwner $updatesBookingOwner, + CanFetchBooking $canFetchBooking, + FetchesBooking $fetchesBooking, + FetchesCompany $fetchesCompany + ) { + $this->canUpdateBooking = $canUpdateBooking; + $this->updatesBookingOwner = $updatesBookingOwner; + $this->canFetchBooking = $canFetchBooking; + $this->fetchesBooking = $fetchesBooking; + $this->fetchesCompany = $fetchesCompany; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request): JsonResponse + { + $this->canFetchBooking->passes(); + + $booking = $this->fetchesBooking->execute([ + 'id' => $request->route('id'), + ]); + + $newCompanyId = Company::where('reference', $request->input('newMarking'))->first()->id; + + $this->updatesBookingOwner->execute($booking, $newCompanyId); + + return $this->resourceResponse(new BookingResource($booking)); + } +} diff --git a/app/Classes/Modules/Bookings/Services/UpdatesBookingOwner.php b/app/Classes/Modules/Bookings/Services/UpdatesBookingOwner.php new file mode 100644 index 00000000..1fd094e4 --- /dev/null +++ b/app/Classes/Modules/Bookings/Services/UpdatesBookingOwner.php @@ -0,0 +1,22 @@ +company_id = $id; + return $this->handler($model); + } +} \ No newline at end of file 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/ControllersLogic/CreateSupplierTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php index b495cc35..2dcbd0f7 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateSupplierTransactionLogic.php @@ -10,13 +10,12 @@ use App\Models\Group; use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; -use Meneses\LaravelMpdf\Facades\LaravelMpdf; +use Mccarlosen\LaravelMpdf\Facades\LaravelMpdf; use App\Classes\ValueObjects\Constants\DocumentType; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\Modules\Documents\Services\CreatesFiles; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Companies\Services\FetchesCompany; -use Meneses\LaravelLaravelMpdf\Facades\LaravelLaravelMpdf; use App\Classes\Modules\Documents\Services\CreatesDocument; use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; diff --git a/app/Classes/Modules/Transactions/ControllersLogic/DownloadMockUpWhiteFormPdfLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/DownloadMockUpWhiteFormPdfLogic.php index e1875f0a..09dfddb8 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/DownloadMockUpWhiteFormPdfLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/DownloadMockUpWhiteFormPdfLogic.php @@ -6,9 +6,8 @@ namespace App\Classes\Modules\Transactions\ControllersLogic; use App\Classes\Modules\Transactions\Processors\CreateSupplierTransactionProcessor; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; -use Meneses\LaravelMpdf\Facades\LaravelMpdf; +use Mccarlosen\LaravelMpdf\Facades\LaravelMpdf; use App\Classes\Modules\Companies\Services\FetchesCompany; -use Meneses\LaravelLaravelMpdf\Facades\LaravelLaravelMpdf; class DownloadMockUpWhiteFormPdfLogic { diff --git a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php index 34efe196..aa432aea 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/UpdateGroupLogic.php @@ -24,7 +24,7 @@ use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use ErrorException; use Illuminate\Support\Facades\DB; -use Meneses\LaravelMpdf\Facades\LaravelMpdf; +use Mccarlosen\LaravelMpdf\Facades\LaravelMpdf; class UpdateGroupLogic extends AbstractControllerLogic { @@ -106,20 +106,20 @@ class UpdateGroupLogic extends AbstractControllerLogic $serviceCharge = $this->calculatesTransactionServiceCharge->execute($transaction->original_amount, $rate, $constant); $object = new TransactionObject( - $transaction->bill_no, - TransactionType::BILL, - $supplier->id, + $transaction->bill_no, + TransactionType::BILL, + $supplier->id, 1, - $supplier->banks()->where('default', true)->first()->id, + $supplier->banks()->where('default', true)->first()->id, PaymentMethodType::CASH, - $transaction->original_amount * (1 / $rate), - $transaction->original_amount, - 1, + $transaction->original_amount * (1 / $rate), + $transaction->original_amount, + 1, $transaction->original_currency_id, - $rate, - 0, - $serviceCharge, - null, + $rate, + 0, + $serviceCharge, + null, ApprovalStatus::PENDING_VERIFICATION ); @@ -130,20 +130,20 @@ class UpdateGroupLogic extends AbstractControllerLogic $transferFee = $this->calculatesTransactionTransferFee->execute($billTransaction->original_amount, $constant); $object = new TransactionObject( - $transferTransaction->bill_no, + $transferTransaction->bill_no, TransactionType::TRANSFER_FEE, $supplier->id, 1, - $supplier->banks()->where('default', true)->first()->id, + $supplier->banks()->where('default', true)->first()->id, PaymentMethodType::CASH, - $transaction->original_amount, - $transaction->original_amount, - $transaction->original_currency_id, + $transaction->original_amount, + $transaction->original_amount, $transaction->original_currency_id, - 1, - 0, - $transferFee, - null, + $transaction->original_currency_id, + 1, + 0, + $transferFee, + null, ApprovalStatus::PENDING_VERIFICATION ); @@ -182,4 +182,4 @@ class UpdateGroupLogic extends AbstractControllerLogic return $this->resourceResponse(new GroupResource($group)); } -} \ No newline at end of file +} diff --git a/app/Classes/Modules/Transactions/Processors/CreateInvoiceDocumentProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateInvoiceDocumentProcessor.php index ae57a626..b0af2cbf 100644 --- a/app/Classes/Modules/Transactions/Processors/CreateInvoiceDocumentProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CreateInvoiceDocumentProcessor.php @@ -8,7 +8,7 @@ use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\DocumentType; use App\Models\Document; -use Meneses\LaravelMpdf\Facades\LaravelMpdf; +use Mccarlosen\LaravelMpdf\Facades\LaravelMpdf; use Webklex\PDFMerger\Facades\PDFMergerFacade as PDFMerger; class CreateInvoiceDocumentProcessor diff --git a/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateInvoiceTransactionProcessor.php index 0129ab32..0c89b13f 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; @@ -23,8 +24,6 @@ use App\Models\SegmentConstant; class CreateInvoiceTransactionProcessor { - /** @var ListsTransactions */ - private $listsTransactions; /** @var CreatesTransaction */ private $createsTransaction; @@ -41,9 +40,6 @@ class CreateInvoiceTransactionProcessor /** @var CalculatesBookingTransferredAmount */ private $calculatesBookingTransferredAmount; - /** @var FetchesServiceConfigurations */ - private $fetchesServiceConfigurations; - /** @var CalculatesBookingCurrencyAverageRate */ private $calculatesBookingCurrencyAverageRate; @@ -76,13 +72,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, CreatePerfexCRMInvoiceProcessor $createPerfexCRMInvoiceProcessor) { - $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; @@ -95,7 +89,7 @@ class CreateInvoiceTransactionProcessor /** * @param Booking $booking * @return void - * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws MalformedRequestException */ public function execute(Booking $booking) { diff --git a/app/Classes/Modules/Transactions/Processors/CreateProformaInvoiceTransactionProcessor.php b/app/Classes/Modules/Transactions/Processors/CreateProformaInvoiceTransactionProcessor.php index 0a42bcfc..8dab2d24 100644 --- a/app/Classes/Modules/Transactions/Processors/CreateProformaInvoiceTransactionProcessor.php +++ b/app/Classes/Modules/Transactions/Processors/CreateProformaInvoiceTransactionProcessor.php @@ -24,7 +24,7 @@ use App\Classes\ValueObjects\Constants\DocumentType; use App\Models\Booking; use App\Models\Document; use Carbon\Carbon; -use Meneses\LaravelMpdf\Facades\LaravelMpdf; +use Mccarlosen\LaravelMpdf\Facades\LaravelMpdf; class CreateProformaInvoiceTransactionProcessor { diff --git a/app/Classes/Modules/Transactions/Processors/GeneratesGroupTransactionsPurchaseOrder.php b/app/Classes/Modules/Transactions/Processors/GeneratesGroupTransactionsPurchaseOrder.php index 80f218a6..91267ff2 100644 --- a/app/Classes/Modules/Transactions/Processors/GeneratesGroupTransactionsPurchaseOrder.php +++ b/app/Classes/Modules/Transactions/Processors/GeneratesGroupTransactionsPurchaseOrder.php @@ -13,7 +13,7 @@ use App\Classes\ValueObjects\Constants\TransactionType; use App\Models\Document; use App\Models\Group; use App\Models\Transaction; -use Meneses\LaravelMpdf\Facades\LaravelMpdf; +use Mccarlosen\LaravelMpdf\Facades\LaravelMpdf; class GeneratesGroupTransactionsPurchaseOrder { diff --git a/app/Classes/Modules/Transactions/Processors/GeneratesGroupTransactionsWhiteForm.php b/app/Classes/Modules/Transactions/Processors/GeneratesGroupTransactionsWhiteForm.php index 53d5c176..2b66b478 100644 --- a/app/Classes/Modules/Transactions/Processors/GeneratesGroupTransactionsWhiteForm.php +++ b/app/Classes/Modules/Transactions/Processors/GeneratesGroupTransactionsWhiteForm.php @@ -13,7 +13,7 @@ use App\Classes\ValueObjects\Constants\TransactionType; use App\Models\Document; use App\Models\Group; use App\Models\Transaction; -use Meneses\LaravelMpdf\Facades\LaravelMpdf; +use Mccarlosen\LaravelMpdf\Facades\LaravelMpdf; class GeneratesGroupTransactionsWhiteForm { diff --git a/app/Classes/Modules/Transactions/Services/UpdatesTransaction.php b/app/Classes/Modules/Transactions/Services/UpdatesTransaction.php index aba7b07a..d1c5065f 100644 --- a/app/Classes/Modules/Transactions/Services/UpdatesTransaction.php +++ b/app/Classes/Modules/Transactions/Services/UpdatesTransaction.php @@ -2,19 +2,21 @@ namespace App\Classes\Modules\Transactions\Services; +use App\Classes\Exceptions\MalformedRequestException; use App\Classes\General\Eloquent\AbstractUpdateRecord; use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord; use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; use App\Models\Booking; use App\Models\Transaction; +use Illuminate\Database\Eloquent\Model; class UpdatesTransaction extends AbstractUpdateRecord { /** * @param Transaction $transaction * @param TransactionObject $object - * @return \Illuminate\Database\Eloquent\Model - * @throws \App\Classes\Exceptions\MalformedRequestException + * @return Model + * @throws MalformedRequestException */ public function execute(Transaction $transaction, TransactionObject $object) { $transaction->recipient_bank_account_id = $object->getRecipientBankAccountId(); @@ -30,4 +32,4 @@ class UpdatesTransaction extends AbstractUpdateRecord return $this->handler($transaction); } -} \ No newline at end of file +} diff --git a/app/Http/Controllers/Accounts/FetchUserByEmailController.php b/app/Http/Controllers/Accounts/FetchUserByEmailController.php new file mode 100644 index 00000000..0a60d4c7 --- /dev/null +++ b/app/Http/Controllers/Accounts/FetchUserByEmailController.php @@ -0,0 +1,19 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Bookings/UpdateBookingOwnerController.php b/app/Http/Controllers/Bookings/UpdateBookingOwnerController.php new file mode 100644 index 00000000..1ced189c --- /dev/null +++ b/app/Http/Controllers/Bookings/UpdateBookingOwnerController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/app/Http/Resources/GroupResource.php b/app/Http/Resources/GroupResource.php index faae5b43..abd017ec 100644 --- a/app/Http/Resources/GroupResource.php +++ b/app/Http/Resources/GroupResource.php @@ -22,6 +22,9 @@ class GroupResource extends JsonResource public function toArray($request) { + if(!$this->issuerCompany){ + dd($this->id); + } return [ 'id' => $this->id, 'original_amount' => (float) $this->original_amount, diff --git a/app/Http/Resources/UserCompanyResource.php b/app/Http/Resources/UserCompanyResource.php new file mode 100644 index 00000000..09e9f2b7 --- /dev/null +++ b/app/Http/Resources/UserCompanyResource.php @@ -0,0 +1,25 @@ + $this->id, + 'name' => $this->name, + 'reference' => $this->company()->first()->reference, + 'type' => (int) $this->type, + 'status' => (int) $this->status + ]; + } +} diff --git a/app/Models/Booking.php b/app/Models/Booking.php index 2dfd945a..ca80d0c3 100644 --- a/app/Models/Booking.php +++ b/app/Models/Booking.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Classes\General\Interfaces\Documentable; use App\Classes\General\Interfaces\Transactionable; +use App\Classes\General\Traits\LogData; use App\Classes\ValueObjects\Constants\RoleTypes; use App\Scopes\CustomerBookingsScope; use Illuminate\Database\Eloquent\Relations\BelongsTo; @@ -28,6 +29,7 @@ class Booking extends AbstractModel implements Documentable, Transactionable { use HasRelationships; use SoftDeletes; + use LogData; protected $table = 'bookings'; diff --git a/app/Models/Group.php b/app/Models/Group.php index 1fc6ca48..01dd257e 100644 --- a/app/Models/Group.php +++ b/app/Models/Group.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\Classes\General\Traits\LogData; use Illuminate\Database\Eloquent\Model; use App\Classes\General\Interfaces\Documentable; use Illuminate\Database\Eloquent\Relations\BelongsTo; diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 429449a6..0df23186 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -4,6 +4,7 @@ namespace App\Models; use App\Classes\General\Interfaces\Documentable; use App\Classes\General\Interfaces\Transactionable; +use App\Classes\General\Traits\LogData; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\TransactionType; use Carbon\Carbon; @@ -22,6 +23,7 @@ class Transaction extends AbstractModel implements Documentable, Transactionable { use HasTableAlias; use SoftDeletes; + use LogData; protected $table = 'transactions'; @@ -102,6 +104,14 @@ class Transaction extends AbstractModel implements Documentable, Transactionable return $this->HasMany(TransactionDetail::class, 'transaction_id', 'id'); } + /** + * @return HasOne + */ + public function groupTransaction(): HasOne + { + return $this->HasOne(GroupTransaction::class, 'transaction_id'); + } + public function convert_original_amount() { if($this->booking()->first()->fix_currency_id !== 1) { diff --git a/app/Models/Wallet.php b/app/Models/Wallet.php index 8c3114fd..00677513 100644 --- a/app/Models/Wallet.php +++ b/app/Models/Wallet.php @@ -3,6 +3,7 @@ namespace App\Models; use App\Classes\General\Interfaces\Transactionable; +use App\Classes\General\Traits\LogData; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Database\Eloquent\SoftDeletes; @@ -12,6 +13,7 @@ use Illuminate\Database\Eloquent\Relations\MorphMany; class Wallet extends AbstractModel implements Transactionable { use SoftDeletes; + use LogData; protected $table = 'wallets'; /** diff --git a/composer.json b/composer.json index 421d9248..349234b1 100644 --- a/composer.json +++ b/composer.json @@ -22,6 +22,7 @@ "laravel/framework": "^8.0", "laravel/tinker": "^2.0", "maatwebsite/excel": "^3.1", + "mpdf/mpdf": "^8.1", "rinvex/countries": "^6.1", "smalot/pdfparser": "^2.2", "spatie/laravel-activitylog": "^3.14", diff --git a/config/app.php b/config/app.php index d48e24c6..fd0bbe8f 100644 --- a/config/app.php +++ b/config/app.php @@ -178,7 +178,7 @@ return [ // Third Parties Spatie\Permission\PermissionServiceProvider::class, Barryvdh\DomPDF\ServiceProvider::class, - Meneses\LaravelMpdf\LaravelMpdfServiceProvider::class, + Mccarlosen\LaravelMpdf\LaravelMpdfServiceProvider::class, TimeHunter\LaravelGoogleReCaptchaV3\Providers\GoogleReCaptchaV3ServiceProvider::class, Webklex\PDFMerger\Providers\PDFMergerServiceProvider::class @@ -234,7 +234,7 @@ return [ 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, 'PDF' => Barryvdh\DomPDF\Facade::class, - 'MPDF' => Meneses\LaravelMpdf\Facades\LaravelMpdf::class, + 'MPDF' => Mccarlosen\LaravelMpdf\Facades\LaravelMpdf::class, 'GoogleReCaptchaV3'=> TimeHunter\LaravelGoogleReCaptchaV3\Facades\GoogleReCaptchaV3::class, 'PDFMerger' => Webklex\PDFMerger\Facades\PDFMergerFacade::class 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 47196db2..76378265 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 Mccarlosen\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), true); + // 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); - } } @@ -253,6 +274,7 @@ class DummyDataSeeder extends Seeder // 3. Attach Employee // 4. create contact + // // 5. create Address // 6. identification verification @@ -278,7 +300,7 @@ class DummyDataSeeder extends Seeder // 16. generate invoice // generate random number of users - for($userLoop=1; $userLoop <= rand(20, 50); $userLoop++) { + for($userLoop=1; $userLoop <= 20; $userLoop++) { // === // // 1 // ========== // @@ -315,6 +337,8 @@ class DummyDataSeeder extends Seeder /** @var Company $company */ $company = $this->createsCompany->execute($company_object); + $this->assignSegmentProcessor->execute($company); + // === // // 3 // ===========// @@ -329,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); // === // @@ -342,7 +366,7 @@ class DummyDataSeeder extends Seeder // AddressType::BILLING : for the invoice billing address // create delivery address - $addressObject = new AddressObject($this->faker->streetAddress, '', 1, $this->faker->numberBetween(1, 15), $this->faker->numberBetween(1, 442), $this->faker->postcode); + $addressObject = new AddressObject($this->faker->streetAddress, '', 1, $this->faker->numberBetween(1, 15), $this->faker->numberBetween(1, 100), $this->faker->postcode); /** @var Address $address */ $address = $this->createsAddress->execute($company, $addressObject); @@ -373,7 +397,7 @@ class DummyDataSeeder extends Seeder // TransactionType::TOP_UP : represent a top-up amount to a wallet; // TransactionType::PAYMENT : represent payment out of the wallet; // TransactionType::CREDIT_NOTE : represent a manual top-up to a wallet, and can only be performed by super admin; - // TransactionType::CREDIT_NOTE : represent a deduction from a wallet, and can only be performed by super admin; + // TransactionType::DEBDIT_NOTE : represent a deduction from a wallet, and can only be performed by super admin; // TransactionType::WITHDRAW : represent a customer withdrawing credit out of a wallet to a bank account (refund); @@ -419,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); @@ -427,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(1, 5); $orderLoop++) { + echo 'booking created'; // === // // 9 // ========= // // Create Booking // @@ -452,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); @@ -474,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,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'], + '', 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); + + } + } + + + } } } diff --git a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue index 7d686b70..b87ac20e 100644 --- a/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue +++ b/resources/assets/vue/components/bookings/elements/PaymentHistoryComponent.vue @@ -219,6 +219,29 @@ +
+
+
+
+
+
+
+
+ +
+
+
+ + + +
+
+
+
+
diff --git a/resources/assets/vue/components/bookings/forms/ChangeBookingOwnerFormComponent.vue b/resources/assets/vue/components/bookings/forms/ChangeBookingOwnerFormComponent.vue new file mode 100644 index 00000000..8034fcdc --- /dev/null +++ b/resources/assets/vue/components/bookings/forms/ChangeBookingOwnerFormComponent.vue @@ -0,0 +1,62 @@ + + diff --git a/resources/assets/vue/components/bookings/sections/BookingDetailsSectionComponent.vue b/resources/assets/vue/components/bookings/sections/BookingDetailsSectionComponent.vue index 7128d7ba..fe2826e4 100644 --- a/resources/assets/vue/components/bookings/sections/BookingDetailsSectionComponent.vue +++ b/resources/assets/vue/components/bookings/sections/BookingDetailsSectionComponent.vue @@ -270,7 +270,7 @@
- +
@@ -426,6 +426,14 @@
+
+
+
Change Booking Owner
+ + + +
+
@@ -467,6 +475,9 @@ }); return complete; + }, + companySegmentIds() { + return this.booking.company.segments.map(obj => parseInt(obj.id)); } }, watch: { diff --git a/resources/assets/vue/components/companies/elements/CustomerProfileComponent.vue b/resources/assets/vue/components/companies/elements/CustomerProfileComponent.vue index 6225a43e..fd36e8a2 100644 --- a/resources/assets/vue/components/companies/elements/CustomerProfileComponent.vue +++ b/resources/assets/vue/components/companies/elements/CustomerProfileComponent.vue @@ -47,8 +47,8 @@ style=" fill:#000000;">
-
-
+
+
{{segment.name}} diff --git a/resources/assets/vue/components/companies/elements/UserCompanyComponent.vue b/resources/assets/vue/components/companies/elements/UserCompanyComponent.vue new file mode 100644 index 00000000..4985f8ed --- /dev/null +++ b/resources/assets/vue/components/companies/elements/UserCompanyComponent.vue @@ -0,0 +1,49 @@ + + diff --git a/resources/assets/vue/components/companies/sections/CustomerSectionTwoComponent.vue b/resources/assets/vue/components/companies/sections/CustomerSectionTwoComponent.vue new file mode 100644 index 00000000..c8cc4c99 --- /dev/null +++ b/resources/assets/vue/components/companies/sections/CustomerSectionTwoComponent.vue @@ -0,0 +1,81 @@ + + + diff --git a/resources/views/pages/customer_support.blade.php b/resources/views/pages/customer_support.blade.php new file mode 100644 index 00000000..bebb4a15 --- /dev/null +++ b/resources/views/pages/customer_support.blade.php @@ -0,0 +1,179 @@ +@extends('layouts.base_portal') +@section('inner_content') +
+
+
+
+
+ @csrf +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+
+
+
+
+
+
+
+ @if($company) + @php + $employees = $company->employees; + $primaryEmployee = $employees->first(); + $identification = $company->documents->whereIn('document_type', \App\Classes\ValueObjects\Constants\DocumentType::IDENTIFICATION_DOCUMENTS)->first() + @endphp +
+

Customer Account

+

Marking: {{$company->reference}}

+

Account Type: {{$company->type === 1 ? 'Business' : 'Personal'}}

+ @if($company->type === 1)

Company's Name: {{$company->name}}

@endif +

Customer's Name: {{$employees->pluck('name')->implode(', ')}}

+

Email: {{$employees->pluck('email')->implode(', ')}}

+

Phone: {{$company->contacts->pluck('phone')->implode(', ')}}

+

Registration Date: {{$company->created_at->format('d-m-Y')}}

+
+
+

Customer Verification

+

Email Verification Status: {{ $primaryEmployee->status === 2 ? 'Verified' : 'Pending Verification'}}

+

Identification Verification Status: {{$identification ? ($identification->status === 2 ? 'Verified' : 'Pending Verification') : 'Not Submitted'}}

+
+ @if(!$booking) +
+

Customer Bookings

+ @php + $bookings = $company->bookings()->whereIn('status', [2, 3])->get(); + @endphp +
+ @foreach($bookings as $booking) + @php + $payments = $booking->transactions()->where('type', \App\Classes\ValueObjects\Constants\TransactionType::PAYMENT)->get(); + $purchaseOrder = $booking->transactions()->where('type', \App\Classes\ValueObjects\Constants\TransactionType::PURCHASE_ORDER)->first(); + @endphp +
+
Booking Reference: {{$booking->marking}}
+

Amount: {{$booking->fix_amount.' '.$booking->fixedCurrency->short_code}}

+

Status: {{$booking->status === 3 ? 'Complete' : 'In Progress'}}

+

Purchase Order Status: {{$purchaseOrder ? ($purchaseOrder->status === 3 ? 'Approved' : ($purchaseOrder->status === 1 ? 'Pending Approval' : 'Incomplete Submission')) : 'Pending Submission'}}

+ @if($payments)

Payment History:

@endif + @php $i = 1; @endphp + @foreach($payments as $payment) + @php + $bill = $payment->transactions()->where('type', \App\Classes\ValueObjects\Constants\TransactionType::BILL)->first(); + $transferProof = null; + $status = 'Pending Submission'; + + if($payment->status === 1) { + $status = 'Pending Approval'; + } + + if($payment->status === 2) { + $status = 'Pending Confirmation'; + } + + if(in_array($payment->status, [4, 5])) { + $status = 'Rejected/Failed Payment'; + } + + if($bill) { + if($bill->status === 1) { + $status = 'Pending Transfer Proof'; + } + + if(in_array($bill->status, [2, 3])) { + $status = 'Transfer Complete'; + $transferProof = $bill->documents()->first(); + } + } + + @endphp +
+

{{$i++}}.

+

Amount: {{$payment->original_amount.' '.$payment->original_currency->short_code}}

+

Status: {{$status}}

+

Payment Date: {{$payment->created_at->format('d-m-Y')}}

+ @if($bill) +

Supplier: {{$bill->issuerCompany->name}}

+

Supplier Order Date: {{$bill->created_at->format('d-m-Y')}}

+ @if($transferProof)

Transfer Proof Upload Date: {{$transferProof->created_at->format('d-m-Y')}}

@endif + @endif +
+ @endforeach +
+ @endforeach +
+
+ @endif + @endif + @if($booking) + @php + $payments = $booking->transactions()->where('type', \App\Classes\ValueObjects\Constants\TransactionType::PAYMENT)->get(); + $purchaseOrder = $booking->transactions()->where('type', \App\Classes\ValueObjects\Constants\TransactionType::PURCHASE_ORDER)->first(); + @endphp +
+
Booking Reference: {{$booking->marking}}
+

Amount: {{$booking->fix_amount.' '.$booking->fixedCurrency->short_code}}

+

Status: {{$booking->status === 3 ? 'Complete' : 'In Progress'}}

+

Purchase Order Status: {{$purchaseOrder ? ($purchaseOrder->status === 3 ? 'Approved' : ($purchaseOrder->status === 1 ? 'Pending Approval' : 'Incomplete Submission')) : 'Pending Submission'}}

+ @if($payments)

Payment History:

@endif + @php $i = 1; @endphp + @foreach($payments as $payment) + @php + $bill = $payment->transactions()->where('type', \App\Classes\ValueObjects\Constants\TransactionType::BILL)->first(); + $transferProof = null; + + $status = 'Pending Submission'; + + if($payment->status === 1) { + $status = 'Pending Approval'; + } + + if($payment->status === 2) { + $status = 'Pending Confirmation'; + } + + if(in_array($payment->status, [4, 5])) { + $status = 'Rejected/Failed Payment'; + } + + if($bill) { + if($bill->status === 1) { + $status = 'Pending Transfer Proof'; + } + + if(in_array($bill->status, [2, 3])) { + $status = 'Transfer Complete'; + $transferProof = $bill->documents()->first(); + } + } + + @endphp +
+

{{$i++}}.

+

Amount: {{$payment->original_amount.' '.$payment->original_currency->short_code}}

+

Status: {{$status}}

+

Payment Date: {{$payment->created_at->format('d-m-Y')}}

+ @if($bill) +

Supplier: {{$bill->issuerCompany->name}}

+

Supplier Order Date: {{$bill->created_at->format('d-m-Y')}}

+ @if($transferProof)

Transfer Proof Upload Date: {{$transferProof->created_at->format('d-m-Y')}}

@endif + @endif +
+ @endforeach +
+ @endif +
+
+
+@endsection diff --git a/resources/views/pages/customers/index.blade.php b/resources/views/pages/customers/index.blade.php index dc22b5b8..e5d694d8 100644 --- a/resources/views/pages/customers/index.blade.php +++ b/resources/views/pages/customers/index.blade.php @@ -5,6 +5,7 @@
+
@@ -77,10 +78,10 @@
-