From 8d11ff6b7f8e1d8007489277fdb823a560d2228d Mon Sep 17 00:00:00 2001 From: Dillon Ngo Date: Wed, 25 Mar 2026 07:51:49 +0800 Subject: [PATCH] Update: laravel 8 to 12, php 7.3 to php 8.3, Jenkinsfile, Unit/Feature testing, vapor --- .env.testing | 12 + .gitignore | 3 + Jenkinsfile | 65 ++- .../General/Eloquent/AbstractGetRecord.php | 18 +- app/Classes/General/Interfaces/Steppable.php | 2 +- .../Services/GeneratesAuthenticationToken.php | 18 +- .../Validators/UserCreateValidation.php | 3 +- .../Validators/UserRegistrationValidation.php | 3 +- .../DataTransferObjects/FileObject.php | 13 +- .../Services/ConvertsBase64ToFile.php | 19 +- .../Documents/Services/CreatesFiles.php | 12 +- .../Processors/ConfirmOrderProcessor.php | 6 + .../Validators/ConfirmOrderValidation.php | 3 +- .../Validators/OrderRoleValidation.php | 5 +- .../Packages/Items/CreatePackageItemLogic.php | 16 +- .../Packages/Items/DeletePackageItemLogic.php | 11 +- .../Packages/Items/FetchPackageItemLogic.php | 9 +- .../Packages/Items/ListPackageItemsLogic.php | 9 +- .../Packages/Items/UpdatePackageItemLogic.php | 10 +- .../FetchContainersFromYdPortalProcessor.php | 1 - ...hLoadedContainersFromVTPortalProcessor.php | 1 - .../GenerateShippingOrderStepsProcessor.php | 19 +- ...FetchPackingListsFromYdPortalProcessor.php | 1 - .../FetchByTrakingNoYdPortalV2Processor.php | 1 - ...FetchContainersFromYdPortalV2Processor.php | 1 - .../Services/Packages/Items/UpdatesItem.php | 5 +- .../Services/AddItemToConstantValueArray.php | 8 +- .../Segments/Services/CreatesConstant.php | 2 +- .../RemoveItemFromConstantValueArray.php | 8 +- .../Segments/Services/UpdatesConstant.php | 2 +- .../ControllersLogic/CompletesStepLogic.php | 1 - .../Processors/CompletesStepProcessor.php | 6 + .../Steps/Processors/CreateStepsProcessor.php | 6 + .../Processors/GenerateStepsProcessor.php | 7 +- .../Steps/Processors/UpdateStepsProcessor.php | 6 + .../Steps/Services/CreatesManySteps.php | 20 +- .../Modules/Steps/Services/UpdatesSteps.php | 13 +- .../Services/UpdatesTransportStatus.php | 5 +- .../Constants/SegmentConstants.php | 6 +- .../V2/ProcessYDPortalDataV2Command.php | 10 +- app/Console/Kernel.php | 166 ------ app/Exceptions/Handler.php | 72 --- .../Exports/ExportArrivedParcelController.php | 43 +- ...endingArrangementPackingListController.php | 23 +- .../Items/CreatePackageItemController.php | 7 +- .../Items/DeletePackageItemController.php | 7 +- .../Items/FetchPackageItemController.php | 7 +- .../Items/ListPackageItemsController.php | 9 +- .../Items/UpdatePackageItemController.php | 7 +- .../CreatePermitsReminderController.php | 3 +- .../UpdatePermitsReminderController.php | 3 +- app/Http/Kernel.php | 81 --- .../Middleware/LogRequestPathMiddleware.php | 36 ++ .../Middleware/RedirectIfAuthenticated.php | 3 +- app/Http/Middleware/TrustProxies.php | 2 +- app/Http/Middleware/ValidateToken.php | 17 +- app/Logging/CloudWatchLoggerFactory.php | 2 +- app/Models/AbstractModel.php | 11 +- app/Models/Address.php | 28 +- app/Models/Company.php | 25 +- app/Models/CompanyConnection.php | 18 +- app/Models/CompanyEmployee.php | 11 +- app/Models/CompanyModule.php | 66 ++- app/Models/ConnectionSegment.php | 13 +- app/Models/Contact.php | 24 +- app/Models/Container.php | 7 +- app/Models/Country.php | 13 +- app/Models/Currency.php | 19 +- app/Models/CurrencyRate.php | 7 +- app/Models/District.php | 18 +- app/Models/Document.php | 27 +- app/Models/Exchange/Employee.php | 12 +- app/Models/File.php | 16 +- app/Models/KeyValuePair.php | 7 +- app/Models/Order.php | 48 +- app/Models/PermitsReminder.php | 7 +- app/Models/Schedule.php | 14 +- app/Models/Segment.php | 27 +- app/Models/SegmentConstant.php | 22 +- app/Models/ServiceType.php | 16 +- app/Models/State.php | 11 +- app/Models/Step.php | 9 +- app/Models/Transaction.php | 19 +- app/Models/Transport.php | 14 +- app/Models/User.php | 13 +- app/Models/UserSocialAccount.php | 18 +- app/Providers/AppServiceProvider.php | 7 + app/Providers/RouteServiceProvider.php | 68 --- bootstrap/app.php | 232 ++++++-- composer.json | 53 +- config/app.php | 3 +- config/cors.php | 4 +- config/filesystems.php | 3 +- config/logging.php | 24 + ...d_is_waived_to_transactions_logs_table.php | 52 +- ...add_event_column_to_activity_log_table.php | 32 ++ ...atch_uuid_column_to_activity_log_table.php | 32 ++ development.Dockerfile | 2 +- docker-setup/Dockerfile | 6 +- docker-setup/docker-compose.yml | 14 +- phpunit.ci.xml | 35 ++ phpunit.xml | 54 +- phpunit.xml.bak | 31 ++ production.Dockerfile | 2 +- .../orders/sections/OrderSectionComponent.vue | 2 +- resources/views/errors/503.blade.php | 7 + .../pages/accounts/reset_password.blade.php | 2 +- routes/account.php | 56 +- routes/address.php | 50 +- routes/announcement.php | 22 +- routes/api.php | 11 +- routes/apipub.php | 24 +- routes/bank.php | 17 +- routes/company.php | 60 ++- routes/contact.php | 7 +- routes/currency.php | 14 +- routes/delivery.php | 14 +- routes/document.php | 16 +- routes/export.php | 4 +- routes/feedback.php | 8 +- routes/help_menu.php | 14 +- routes/job.php | 7 +- routes/order.php | 66 ++- routes/packing_list.php | 123 +++-- routes/permits_reminder.php | 17 +- routes/receipt.php | 6 +- routes/remark.php | 17 +- routes/report.php | 15 +- routes/schedule.php | 17 +- routes/segment.php | 43 +- routes/step.php | 6 +- routes/transaction.php | 83 ++- routes/transport.php | 17 +- routes/wallet.php | 23 +- routes/web.php | 502 +++++++++--------- staging.Dockerfile | 2 +- test.Dockerfile | 3 + .../UpdateCompanyEInvoiceInfoLogicTest.php | 318 +++++++++++ .../Processors/CreateCompanyTest.php | 54 ++ tests/Feature/ExampleTest.php | 20 - .../ListOrderTrackingLogicTest.php | 75 ++- .../Orders/Processors/CreateOrderTest.php | 161 ++++++ .../UpdateSegmentPriceTest.php | 122 +++++ .../Segments/Services/CreatesConstantTest.php | 58 ++ .../Segments/Services/UpdatesConstantTest.php | 57 ++ vapor.yml | 17 + 146 files changed, 2771 insertions(+), 1434 deletions(-) create mode 100644 .env.testing delete mode 100644 app/Console/Kernel.php delete mode 100644 app/Exceptions/Handler.php delete mode 100644 app/Http/Kernel.php create mode 100644 app/Http/Middleware/LogRequestPathMiddleware.php delete mode 100644 app/Providers/RouteServiceProvider.php create mode 100644 database/migrations/2026_02_07_181633_add_event_column_to_activity_log_table.php create mode 100644 database/migrations/2026_02_07_181704_add_batch_uuid_column_to_activity_log_table.php create mode 100644 phpunit.ci.xml create mode 100644 phpunit.xml.bak create mode 100644 test.Dockerfile create mode 100644 tests/Feature/Companies/ControllersLogic/UpdateCompanyEInvoiceInfoLogicTest.php create mode 100644 tests/Feature/Companies/Processors/CreateCompanyTest.php delete mode 100644 tests/Feature/ExampleTest.php rename tests/{Unit => Feature}/Orders/ControllersLogic/ListOrderTrackingLogicTest.php (65%) create mode 100644 tests/Feature/Orders/Processors/CreateOrderTest.php create mode 100644 tests/Feature/Segments/ControllersLogic/UpdateSegmentPriceTest.php create mode 100644 tests/Unit/Segments/Services/CreatesConstantTest.php create mode 100644 tests/Unit/Segments/Services/UpdatesConstantTest.php diff --git a/.env.testing b/.env.testing new file mode 100644 index 00000000..b02873e5 --- /dev/null +++ b/.env.testing @@ -0,0 +1,12 @@ +APP_NAME=Laravel +APP_ENV=testing + +APP_KEY=base64:I9qXyDlm7GVu/e47+YGzLB00fA/FMA2/hMPEhqu8pUQ= +JWT_SECRET=9j7f7vUWEzxUBjLYcQimZp5wmxHEglcjU3beog26qC4pQKENZSpfWQfv065tjZrZ + +DB_CONNECTION=mysql +DB_HOST=172.18.0.3 +DB_PORT=3306 +DB_DATABASE=ci_test_shipping_portal +DB_USERNAME=ci +DB_PASSWORD=bi9y@T8r diff --git a/.gitignore b/.gitignore index e938203d..ad6edcaf 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ **/.idea/ .env .env.backup +.env.testing.example .phpunit.result.cache Homestead.json Homestead.yaml @@ -29,3 +30,5 @@ storage/framework/laravel-excel/* .env.production .env.staging .env.development +docz/* +.phpunit.cache/ diff --git a/Jenkinsfile b/Jenkinsfile index 011d7b3b..7401cbf6 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -9,17 +9,17 @@ pipeline { agent { docker { - args '--group-add 992 -v /var/run/docker.sock:/var/run/docker.sock' - image '303644228504.dkr.ecr.ap-southeast-1.amazonaws.com/jenkins-pipeline-agent:latest' + args '--network ci-net --group-add 992 -v /var/run/docker.sock:/var/run/docker.sock' + image '303644228504.dkr.ecr.ap-southeast-1.amazonaws.com/jenkins-pipeline-agent-php-8.3:latest' registryCredentialsId "ecr:ap-southeast-1:aws-ec2-instance-iam-role" registryUrl "https://303644228504.dkr.ecr.ap-southeast-1.amazonaws.com" } } environment { HOME = '.' - DB_CONNECTION = 'mysql' - DB_DATABASE = 'portal_development' - APP_ENV = 'testing' + // DB_CONNECTION = 'mysql' + // DB_DATABASE = 'portal_development' + // APP_ENV = 'testing' } stages { stage('Download source code from Git') { @@ -31,6 +31,7 @@ pipeline { case "vapor/production": case "vapor/staging": case "vapor/development": + case "vapor/test": git( url: 'https://gitlab.com/CIEFWorldwideSdnBhd/shipping-portal.git', credentialsId: 'gitlab-jenkins-localhost', @@ -61,18 +62,45 @@ pipeline { stage('Tests') { steps { - //sh 'vendor/bin/phpunit tests/Unit' - withCredentials([ - usernamePassword( - credentialsId: 'shipping-portal-dev-db-credential', - usernameVariable: 'DB_USERNAME', - passwordVariable: 'DB_PASSWORD' - ), - string(credentialsId: 'shipping-portal-dev-db-host', variable: 'DB_HOST') - ]) { - // sh 'vendor/bin/phpunit --filter ListOrderTrackingLogicTest' - } - script{ + // sh 'vendor/bin/phpunit tests/Unit' + // withCredentials([ + // usernamePassword( + // credentialsId: 'shipping-portal-dev-db-credential', + // usernameVariable: 'DB_USERNAME', + // passwordVariable: 'DB_PASSWORD' + // ), + // string(credentialsId: 'shipping-portal-dev-db-host', variable: 'DB_HOST') + // ]) { + // sh 'vendor/bin/phpunit --filter ListOrderTrackingLogicTest' + // } + sh ''' + set -e + + export APP_ENV=testing + # export APP_KEY=$(php -r "echo 'base64:'.base64_encode(random_bytes(32));") + # export JWT_SECRET=$(php -r "echo bin2hex(random_bytes(32));") + + # Show which PHP binary is used + which php + php -v + + # List PHP modules to confirm pdo_mysql + php -m | grep pdo_mysql || echo "pdo_mysql not loaded" + + # Show DB environment variables + echo "DB_CONNECTION=$DB_CONNECTION" + echo "DB_HOST=$DB_HOST" + echo "DB_PORT=$DB_PORT" + echo "DB_DATABASE=$DB_DATABASE" + echo "DB_USERNAME=$DB_USERNAME" + # Do NOT echo password in logs + + php artisan migrate:fresh --force + + vendor/bin/phpunit -c phpunit.ci.xml --group ok_to_run + + ''' + script { currentBuild.description = 'Step 4 of 6 Completed' } } @@ -94,6 +122,9 @@ pipeline { case "vapor/development": sh "vendor/bin/vapor deploy development --message='${gitCommitMessage}'" break + case "vapor/test": + sh "vendor/bin/vapor deploy test --message='${gitCommitMessage}'" + break case "origin/dillon/34-jenkins-vapor": sh "vendor/bin/vapor deploy development --message='${gitCommitMessage}'" break diff --git a/app/Classes/General/Eloquent/AbstractGetRecord.php b/app/Classes/General/Eloquent/AbstractGetRecord.php index 3f687fd5..613f7357 100644 --- a/app/Classes/General/Eloquent/AbstractGetRecord.php +++ b/app/Classes/General/Eloquent/AbstractGetRecord.php @@ -19,22 +19,29 @@ abstract class AbstractGetRecord /** * @return Collection */ - private function getQueryFilters(){ + private function getQueryFilters() + { return $this->filters->except(self::DECORATION_FILTERS); } /** * @return Collection */ - public function getDecorationFilters(){ + public function getDecorationFilters() + { return $this->filters->only(self::DECORATION_FILTERS); } /** - * @param null|string $json + * @param null|string|array $json * @return array */ - public function deserializeFilters(?string $json): array { + public function deserializeFilters($json): array + { + if (is_array($json)) { + return $json; + } + return $json !== null ? collect(json_decode($json))->toArray() : []; } @@ -50,7 +57,8 @@ abstract class AbstractGetRecord * @param array $filters * @return mixed */ - public function handler(array $filters, array $params = []){ + public function handler(array $filters, array $params = []) + { $this->filters = collect($filters); return $this->getResults($this->applyFiltersToQuery(), $params); } diff --git a/app/Classes/General/Interfaces/Steppable.php b/app/Classes/General/Interfaces/Steppable.php index 38517f4f..c57d6b2d 100644 --- a/app/Classes/General/Interfaces/Steppable.php +++ b/app/Classes/General/Interfaces/Steppable.php @@ -10,4 +10,4 @@ interface Steppable public function steps(): morphMany; -} \ No newline at end of file +} diff --git a/app/Classes/Modules/Accounts/Services/GeneratesAuthenticationToken.php b/app/Classes/Modules/Accounts/Services/GeneratesAuthenticationToken.php index 67a63604..0be52780 100644 --- a/app/Classes/Modules/Accounts/Services/GeneratesAuthenticationToken.php +++ b/app/Classes/Modules/Accounts/Services/GeneratesAuthenticationToken.php @@ -11,7 +11,8 @@ use App\Models\User; use Carbon\Carbon; use Tymon\JWTAuth\JWT; -class GeneratesAuthenticationToken { +class GeneratesAuthenticationToken +{ /** @var JWT */ private $builder; @@ -21,7 +22,8 @@ class GeneratesAuthenticationToken { * GeneratesAuthenticationToken constructor. * @param JWT $builder */ - public function __construct(JWT $builder) { + public function __construct(JWT $builder) + { $this->builder = $builder; } @@ -31,15 +33,16 @@ class GeneratesAuthenticationToken { * @param bool $rememberUser * @return string */ - public function execute(User $user, bool $rememberUser = false): string { + public function execute(User $user, bool $rememberUser = false): string + { $this->builder->manager()->setBlacklistEnabled(false); // generate token for the customer - $this->builder->factory()->setTTL(Carbon::now()->addDay()->timestamp); + $this->builder->factory()->setTTL(525600); // 1 year if ($rememberUser === true) { - $this->builder->factory()->setTTL(Carbon::now()->addWeek()->timestamp); + $this->builder->factory()->setTTL(525600); // 1 year } // set the claim based on the object @@ -52,7 +55,8 @@ class GeneratesAuthenticationToken { /** * @param User $user */ - private function setTokenClaims(User $user): void { + private function setTokenClaims(User $user): void + { $claims = [ 'id' => $user->id, @@ -62,7 +66,7 @@ class GeneratesAuthenticationToken { 'status' => $user->status ]; - if($user->type === RoleTypes::USER) { + if ($user->type === RoleTypes::USER) { /** @var Company $companyModule */ $companyModule = $user->companyModule()->first(); diff --git a/app/Classes/Modules/Accounts/Standards/Validators/UserCreateValidation.php b/app/Classes/Modules/Accounts/Standards/Validators/UserCreateValidation.php index d76172a2..f0506752 100644 --- a/app/Classes/Modules/Accounts/Standards/Validators/UserCreateValidation.php +++ b/app/Classes/Modules/Accounts/Standards/Validators/UserCreateValidation.php @@ -4,6 +4,7 @@ namespace App\Classes\Modules\Accounts\Standards\Validators; use App\Classes\General\Abstracts\AbstractValidation; use App\Classes\Modules\Accounts\DataTransferObjects\UserObject; +use Illuminate\Validation\Rule; class UserCreateValidation extends AbstractValidation { @@ -29,7 +30,7 @@ class UserCreateValidation extends AbstractValidation { return [ 'name' => 'required', - 'email' => 'required|unique:users', + 'email' => ['required', Rule::unique('users')], 'password' => 'required', ]; } diff --git a/app/Classes/Modules/Accounts/Standards/Validators/UserRegistrationValidation.php b/app/Classes/Modules/Accounts/Standards/Validators/UserRegistrationValidation.php index 673b7961..611184f3 100644 --- a/app/Classes/Modules/Accounts/Standards/Validators/UserRegistrationValidation.php +++ b/app/Classes/Modules/Accounts/Standards/Validators/UserRegistrationValidation.php @@ -4,6 +4,7 @@ namespace App\Classes\Modules\Accounts\Standards\Validators; use App\Classes\General\Abstracts\AbstractValidation; use App\Classes\Modules\Accounts\DataTransferObjects\RegistrationObject; +use Illuminate\Validation\Rule; class UserRegistrationValidation extends AbstractValidation { @@ -32,7 +33,7 @@ class UserRegistrationValidation extends AbstractValidation { return [ 'name' => 'required', - 'email' => 'required|email|max:255|unique:users,email', + 'email' => ['required', 'email', 'max:255', Rule::unique('users', 'email')], 'password' => 'required|min:6|confirmed', 'type' => 'required', 'status' => 'required' diff --git a/app/Classes/Modules/Documents/DataTransferObjects/FileObject.php b/app/Classes/Modules/Documents/DataTransferObjects/FileObject.php index 148cfc07..80afd433 100644 --- a/app/Classes/Modules/Documents/DataTransferObjects/FileObject.php +++ b/app/Classes/Modules/Documents/DataTransferObjects/FileObject.php @@ -5,8 +5,10 @@ namespace App\Classes\Modules\Documents\DataTransferObjects; use App\Classes\Exceptions\MalformedRequestException; use App\Classes\General\Interfaces\DataTransferObject; use App\Classes\ValueObjects\Constants\FileType; +use Illuminate\Support\Facades\Log; use Illuminate\Support\Str; use Intervention\Image\ImageManager; +use Intervention\Image\Drivers\Gd\Driver; class FileObject implements DataTransferObject { @@ -28,7 +30,13 @@ class FileObject implements DataTransferObject */ public function getData() { - return in_array($this->getExtension(), ['pdf', 'excel']) ? $this->data : (new imageManager())->make($this->data); + // intervention/image v2: old + // return in_array($this->getExtension(), ['pdf', 'excel']) ? $this->data : (new imageManager())->make($this->data); + + // intervention/image v3: new + return in_array($this->getExtension(), ['pdf', 'excel']) + ? $this->data + : (new ImageManager(new Driver()))->read($this->data); } /** @@ -66,9 +74,10 @@ class FileObject implements DataTransferObject */ public function getDecodedData(): string { + // intervention/image v3: Use encode()->toDataUri() instead of encode('data-url')->encoded return in_array($this->getExtension(), ['pdf', 'excel']) ? base64_decode((explode('base64,', $this->getData()))[1]): - $this->getData()->encode('data-url')->encoded; + $this->getData()->encode()->toDataUri(); } /** diff --git a/app/Classes/Modules/Documents/Services/ConvertsBase64ToFile.php b/app/Classes/Modules/Documents/Services/ConvertsBase64ToFile.php index e0dc40a4..fa46cbfe 100644 --- a/app/Classes/Modules/Documents/Services/ConvertsBase64ToFile.php +++ b/app/Classes/Modules/Documents/Services/ConvertsBase64ToFile.php @@ -66,17 +66,22 @@ class ConvertsBase64ToFile $suffix = $size !== 'original' ? '_'.$size : ''; if($size !== 'original') { - $thumbnail = $file->getData()->widen($value, function ($constraint) { - $constraint->upsize(); + // intervention/image v2: old + // $thumbnail = $file->getData()->widen($value, function ($constraint) { + // $constraint->upsize(); + // })->heighten($value, function ($constraint) { + // $constraint->upsize(); + // }); + // $file->setData($thumbnail->encode('data-url')->encoded); - })->heighten($value, function ($constraint) { - $constraint->upsize(); + // intervention/image v3: Use scaleDown() instead of widen()/heighten() + // scaleDown() maintains aspect ratio and prevents upsizing by default + $thumbnail = $file->getData()->scaleDown(width: $value, height: $value); - }); - - $file->setData($thumbnail->encode('data-url')->encoded); + // intervention/image v3: Use encode()->toDataUri() instead of encode('data-url')->encoded + $file->setData($thumbnail->encode()->toDataUri()); } diff --git a/app/Classes/Modules/Documents/Services/CreatesFiles.php b/app/Classes/Modules/Documents/Services/CreatesFiles.php index 30c85a13..10e990df 100644 --- a/app/Classes/Modules/Documents/Services/CreatesFiles.php +++ b/app/Classes/Modules/Documents/Services/CreatesFiles.php @@ -19,14 +19,18 @@ class CreatesFiles extends AbstractUpdateRelationshipRecord { $models = []; + // foreach ($object->getFiles() as $file) { + // $model = new File(['file' => $file]); + // $models[] = $this->handler($document->files(), $model); + // } + foreach ($object->getFiles() as $file) { - - $model = new File(['file' => $file]); + $fileData = is_string($file) ? json_decode($file, true) : $file; + $model = new File(['file' => $fileData]); $models[] = $this->handler($document->files(), $model); - } return $models; } -} \ No newline at end of file +} diff --git a/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php b/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php index b1f3e72e..7aabc901 100644 --- a/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php +++ b/app/Classes/Modules/Orders/Processors/ConfirmOrderProcessor.php @@ -15,6 +15,10 @@ use App\Classes\Modules\OrderSteps\DataTransferObjects\StepsObject; use App\Classes\Modules\OrderSteps\Services\UpdatesOrderSteps; use Illuminate\Http\Request; +/** + * @deprecated This class uses incorrect StepsObject instantiation (9 parameters instead of 4) + * FIXME: Correct pattern: new StepsObject($appointee_id, $obligation->reference, $obligation->sequence, $obligation->hash_id) + */ class ConfirmOrderProcessor { private $canConfirmOrder; @@ -42,6 +46,8 @@ class ConfirmOrderProcessor //Only Processing Step is created at this point $orderStep = $order->orderSteps[0]; + // FIXME: Incorrect StepsObject instantiation - uses 9 parameters instead of correct 4-parameter pattern + // Correct pattern: new StepsObject($appointee_id, $obligation->reference, $obligation->sequence, $obligation->hash_id) $orderStepObject = new StepsObject( 0, $orderStep->reference, diff --git a/app/Classes/Modules/Orders/Standards/Validators/ConfirmOrderValidation.php b/app/Classes/Modules/Orders/Standards/Validators/ConfirmOrderValidation.php index 21c22e1b..6181c6d3 100644 --- a/app/Classes/Modules/Orders/Standards/Validators/ConfirmOrderValidation.php +++ b/app/Classes/Modules/Orders/Standards/Validators/ConfirmOrderValidation.php @@ -4,6 +4,7 @@ namespace App\Classes\Modules\Orders\Standards\Validators; use App\Classes\General\Abstracts\AbstractValidation; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; +use Illuminate\Validation\Rule; class ConfirmOrderValidation extends AbstractValidation { @@ -26,7 +27,7 @@ class ConfirmOrderValidation extends AbstractValidation { return [ - 'id' => 'required|exists:orders,id' + 'id' => ['required', Rule::exists('orders', 'id')] ]; } diff --git a/app/Classes/Modules/Orders/Standards/Validators/OrderRoleValidation.php b/app/Classes/Modules/Orders/Standards/Validators/OrderRoleValidation.php index b578fb9c..5f82a698 100644 --- a/app/Classes/Modules/Orders/Standards/Validators/OrderRoleValidation.php +++ b/app/Classes/Modules/Orders/Standards/Validators/OrderRoleValidation.php @@ -4,6 +4,7 @@ namespace App\Classes\Modules\Orders\Standards\Validators; use App\Classes\General\Abstracts\AbstractValidation; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; +use Illuminate\Validation\Rule; class OrderRoleValidation extends AbstractValidation { @@ -28,8 +29,8 @@ class OrderRoleValidation extends AbstractValidation protected function rules(?string $type = 'POST'): array { return [ - 'order_id' => 'required|exists:orders,id', - 'company_module_id' => 'required|exists:company_modules,id', + 'order_id' => ['required', Rule::exists('orders', 'id')], + 'company_module_id' => ['required', Rule::exists('company_modules', 'id')], ]; } diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/CreatePackageItemLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/CreatePackageItemLogic.php index 88e4356f..689af9c9 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/CreatePackageItemLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/CreatePackageItemLogic.php @@ -1,15 +1,15 @@ 'Created PackageItem', 'message' => 'You have successfully created a new PackageItem' @@ -57,7 +58,7 @@ class CreatePackageItemLogic extends AbstractControllerLogic * @throws \App\Classes\Exceptions\MalformedRequestException * @throws \App\Classes\Exceptions\RequestValidationException */ - public function logic(Request $request) : JsonResponse + public function logic(Request $request): JsonResponse { $package = $this->fetchesPackage->execute(['id' => $request->input('package_id')]); @@ -73,7 +74,8 @@ class CreatePackageItemLogic extends AbstractControllerLogic $request->input('uom'), $request->input('price'), $request->input('total'), - ApprovalStatus::PENDING_SUBMISSION); + ApprovalStatus::PENDING_SUBMISSION + ); $this->canCreatePackageItem->passes($object); diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/DeletePackageItemLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/DeletePackageItemLogic.php index 39bead68..816f4f87 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/DeletePackageItemLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/DeletePackageItemLogic.php @@ -1,6 +1,6 @@ 'Deleted PackageItem', 'message' => 'You have successfully deleted a PackageItem' @@ -31,7 +32,7 @@ class DeletePackageItemLogic extends AbstractControllerLogic private $deletesPackageItem; /** @var FetchesItem */ - private $fetchesPackageItem; + private $fetchesPackageItem; /** * DeletePackageItemControllersLogic constructor. @@ -52,7 +53,7 @@ class DeletePackageItemLogic extends AbstractControllerLogic * @return JsonResponse * @throws ErrorException */ - public function logic(Request $request) : JsonResponse + public function logic(Request $request): JsonResponse { try { @@ -64,7 +65,7 @@ class DeletePackageItemLogic extends AbstractControllerLogic return $this->response([]); - } catch (\Exception $exception){ + } catch (\Exception $exception) { throw new ErrorException($exception->getMessage(), $exception->getCode()); } diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/FetchPackageItemLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/FetchPackageItemLogic.php index c09c1cc0..b4369850 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/FetchPackageItemLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/FetchPackageItemLogic.php @@ -1,6 +1,6 @@ 'Retrieved PackageItem', 'message' => 'You have successfully retrieved a PackageItem' @@ -47,7 +48,7 @@ class FetchPackageItemLogic extends AbstractControllerLogic * @return JsonResponse * @throws ErrorException */ - public function logic(Request $request) : JsonResponse + public function logic(Request $request): JsonResponse { try { @@ -57,7 +58,7 @@ class FetchPackageItemLogic extends AbstractControllerLogic return $this->resourceResponse(new ItemResource($query)); - } catch (\Exception $exception){ + } catch (\Exception $exception) { throw new ErrorException($exception->getMessage(), $exception->getCode()); } diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/ListPackageItemsLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/ListPackageItemsLogic.php index 04bbaa27..82852ce3 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/ListPackageItemsLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/ListPackageItemsLogic.php @@ -1,6 +1,6 @@ 'Retrieved PackageItems', 'message' => 'You have successfully retrieved a list of PackageItems' @@ -47,7 +48,7 @@ class ListPackageItemsLogic extends AbstractControllerLogic * @return JsonResponse * @throws ErrorException */ - public function logic(Request $request) : JsonResponse + public function logic(Request $request): JsonResponse { try { @@ -57,7 +58,7 @@ class ListPackageItemsLogic extends AbstractControllerLogic return $this->collectionResponse(ItemResource::collection($query)); - } catch (\Exception $exception){ + } catch (\Exception $exception) { throw new ErrorException($exception->getMessage(), $exception->getCode()); } diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/UpdatePackageItemLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/UpdatePackageItemLogic.php index 7af2108e..26dce71d 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/UpdatePackageItemLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/Items/UpdatePackageItemLogic.php @@ -1,6 +1,6 @@ 'Updated PackageItem', 'message' => 'You have successfully updated the PackageItem' @@ -54,7 +55,7 @@ class UpdatePackageItemLogic extends AbstractControllerLogic * @return JsonResponse * @throws ErrorException */ - public function logic(Request $request) : JsonResponse + public function logic(Request $request): JsonResponse { $packageItem = $this->fetchesPackageItem->execute(['id' => $request->route('id')]); @@ -67,7 +68,8 @@ class UpdatePackageItemLogic extends AbstractControllerLogic $request->input('uom'), $request->input('price'), $request->input('total'), - $request->input('status')); + $request->input('status') + ); $this->canUpdatePackageItem->passes($object); diff --git a/app/Classes/Modules/PackingLists/Processors/FetchContainersFromYdPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchContainersFromYdPortalProcessor.php index fef02742..c1b42041 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchContainersFromYdPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchContainersFromYdPortalProcessor.php @@ -17,7 +17,6 @@ use App\Classes\Modules\PackingLists\Services\Containers\FetchesContainer; use App\Classes\Modules\PackingLists\Services\FetchesPackingList; use App\Classes\Modules\Schedules\DataTransferObjects\ScheduleObject; use App\Classes\Modules\Schedules\Services\CreatesSchedule; -use App\Classes\Modules\Steps\DataTransferObjects\StepsObject; use App\Classes\Modules\Steps\Services\CreatesStep; use App\Classes\Modules\Transports\DataTransferObjects\TransportObject; use App\Classes\Modules\Transports\Services\CreatesTransport; diff --git a/app/Classes/Modules/PackingLists/Processors/FetchLoadedContainersFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchLoadedContainersFromVTPortalProcessor.php index bb20e77b..3f7d9814 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchLoadedContainersFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchLoadedContainersFromVTPortalProcessor.php @@ -13,7 +13,6 @@ use App\Classes\Modules\PackingLists\Services\Containers\FetchesContainer; use App\Classes\Modules\PackingLists\Services\FetchesPackingList; use App\Classes\Modules\Schedules\DataTransferObjects\ScheduleObject; use App\Classes\Modules\Schedules\Services\CreatesSchedule; -use App\Classes\Modules\Steps\DataTransferObjects\StepsObject; use App\Classes\Modules\Steps\Services\CreatesStep; use App\Classes\Modules\Transports\DataTransferObjects\TransportObject; use App\Classes\Modules\Transports\Services\CreatesTransport; diff --git a/app/Classes/Modules/PackingLists/Processors/GenerateShippingOrderStepsProcessor.php b/app/Classes/Modules/PackingLists/Processors/GenerateShippingOrderStepsProcessor.php index 50ad28b5..158d091b 100644 --- a/app/Classes/Modules/PackingLists/Processors/GenerateShippingOrderStepsProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/GenerateShippingOrderStepsProcessor.php @@ -1,6 +1,6 @@ reference, $obligation->sequence, $obligation->hash_id) + */ class GenerateShippingOrderStepsProcessor { /** @var CreatesManySteps */ @@ -44,13 +48,16 @@ class GenerateShippingOrderStepsProcessor } - public function execute(Steppable $owner, CompanyModule $appointee, array $contract_obligation_list = []){ + public function execute(Steppable $owner, CompanyModule $appointee, array $contract_obligation_list = []) + { $obligations = $contract_obligation_list; - $this->createsManyStep->execute($owner, array_map(function($obligation) use ($appointee) { - return new StepsObject($appointee->id, $obligation->name,true, $step->sequence??0, 0,0, null,0, $step->hash_id); - }, $obligations)); + $this->createsManyStep->execute($owner, array_map(function ($obligation) use ($appointee) { + // FIXME: Incorrect StepsObject instantiation - uses 5 parameters instead of correct 4-parameter pattern + // Correct pattern: new StepsObject($appointee_id, $obligation->reference, $obligation->sequence, $obligation->hash_id) + return new StepsObject($appointee->id, $obligation->name, true, $obligation->sequence ?? 0, $obligation->hash_id ?? null); + }, $obligations)); $this->updateStepProcessors->execute(OrderSteps::PROCESSING); diff --git a/app/Classes/Modules/PackingLists/Processors/TestFetchPackingListsFromYdPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/TestFetchPackingListsFromYdPortalProcessor.php index 213b91ef..86d70d07 100644 --- a/app/Classes/Modules/PackingLists/Processors/TestFetchPackingListsFromYdPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/TestFetchPackingListsFromYdPortalProcessor.php @@ -10,7 +10,6 @@ use App\Classes\Modules\Orders\Services\FetchesOrder; use App\Classes\Modules\PackingLists\DataTransferObjects\PackageObject; use App\Classes\Modules\PackingLists\DataTransferObjects\PackingListObject; use App\Classes\Modules\PackingLists\Services\FetchesPackingList; -use App\Classes\Modules\Steps\DataTransferObjects\StepsObject; // use App\Classes\Modules\Steps\Services\CreatesStep; use App\Classes\Modules\Transports\DataTransferObjects\TransportObject; // use App\Classes\Modules\Transports\Services\CreatesTransport; diff --git a/app/Classes/Modules/PackingLists/Processors/V2/FetchByTrakingNoYdPortalV2Processor.php b/app/Classes/Modules/PackingLists/Processors/V2/FetchByTrakingNoYdPortalV2Processor.php index f70d5e88..69494dde 100644 --- a/app/Classes/Modules/PackingLists/Processors/V2/FetchByTrakingNoYdPortalV2Processor.php +++ b/app/Classes/Modules/PackingLists/Processors/V2/FetchByTrakingNoYdPortalV2Processor.php @@ -225,7 +225,6 @@ class FetchByTrakingNoYdPortalV2Processor Log::info('result (json_encoded): '.json_encode($result)); // $content = $result['choices'][0]['message']['content'] ?? null; $content = $result['content'][0]['text'] ?? '[]'; - Log::info('raw ETA/ETD content: ' . $content); // Remove markdown code fences if they exist diff --git a/app/Classes/Modules/PackingLists/Processors/V2/FetchContainersFromYdPortalV2Processor.php b/app/Classes/Modules/PackingLists/Processors/V2/FetchContainersFromYdPortalV2Processor.php index c2e76071..f71f5388 100644 --- a/app/Classes/Modules/PackingLists/Processors/V2/FetchContainersFromYdPortalV2Processor.php +++ b/app/Classes/Modules/PackingLists/Processors/V2/FetchContainersFromYdPortalV2Processor.php @@ -18,7 +18,6 @@ use App\Classes\Modules\PackingLists\Services\Containers\FetchesContainer; use App\Classes\Modules\PackingLists\Services\FetchesPackingList; use App\Classes\Modules\Schedules\DataTransferObjects\ScheduleObject; use App\Classes\Modules\Schedules\Services\CreatesSchedule; -use App\Classes\Modules\Steps\DataTransferObjects\StepsObject; use App\Classes\Modules\Steps\Services\CreatesStep; use App\Classes\Modules\Transports\DataTransferObjects\TransportObject; use App\Classes\Modules\Transports\Services\CreatesTransport; diff --git a/app/Classes/Modules/PackingLists/Services/Packages/Items/UpdatesItem.php b/app/Classes/Modules/PackingLists/Services/Packages/Items/UpdatesItem.php index e33e5a45..99be5ffb 100644 --- a/app/Classes/Modules/PackingLists/Services/Packages/Items/UpdatesItem.php +++ b/app/Classes/Modules/PackingLists/Services/Packages/Items/UpdatesItem.php @@ -1,6 +1,6 @@ name = $object->getName(); $model->reference = $object->getReference(); diff --git a/app/Classes/Modules/Segments/Services/AddItemToConstantValueArray.php b/app/Classes/Modules/Segments/Services/AddItemToConstantValueArray.php index af6d053b..6905cf37 100644 --- a/app/Classes/Modules/Segments/Services/AddItemToConstantValueArray.php +++ b/app/Classes/Modules/Segments/Services/AddItemToConstantValueArray.php @@ -6,11 +6,17 @@ class AddItemToConstantValueArray { /** - * @param array $array + * @param array|string|null $array * @param $item * @return array */ public function execute($array, $item): array { + // PHP 8.3: Ensure $array is always an array, even if JSON cast fails + // Handle cases where value might be empty string, null, or invalid JSON + if (!is_array($array)) { + $array = []; + } + $array[] = $item; sort($array); return $array; diff --git a/app/Classes/Modules/Segments/Services/CreatesConstant.php b/app/Classes/Modules/Segments/Services/CreatesConstant.php index 48c1d018..44c601ec 100644 --- a/app/Classes/Modules/Segments/Services/CreatesConstant.php +++ b/app/Classes/Modules/Segments/Services/CreatesConstant.php @@ -19,7 +19,7 @@ class CreatesConstant extends AbstractUpdateRelationshipRecord { $model = new SegmentConstant(); $model->reference = $object->getReference(); - $model->value = json_encode($object->getValue()); + $model->value = $object->getValue(); return $this->handler($segment->constants(), $model); } diff --git a/app/Classes/Modules/Segments/Services/RemoveItemFromConstantValueArray.php b/app/Classes/Modules/Segments/Services/RemoveItemFromConstantValueArray.php index 9eec46e5..a98fd366 100644 --- a/app/Classes/Modules/Segments/Services/RemoveItemFromConstantValueArray.php +++ b/app/Classes/Modules/Segments/Services/RemoveItemFromConstantValueArray.php @@ -6,11 +6,17 @@ class RemoveItemFromConstantValueArray { /** - * @param array $array + * @param array|string|null $array * @param $item * @return array */ public function execute($array, $item): array { + // PHP 8.3: Ensure $array is always an array, even if JSON cast fails + // Handle cases where value might be empty string, null, or invalid JSON + if (!is_array($array)) { + $array = []; + } + foreach($array as $key => $value){ if($array[$key] == $item){ unset($array[$key]); diff --git a/app/Classes/Modules/Segments/Services/UpdatesConstant.php b/app/Classes/Modules/Segments/Services/UpdatesConstant.php index b8e8ec18..adfa02bc 100644 --- a/app/Classes/Modules/Segments/Services/UpdatesConstant.php +++ b/app/Classes/Modules/Segments/Services/UpdatesConstant.php @@ -18,7 +18,7 @@ class UpdatesConstant extends AbstractUpdateRecord public function execute(SegmentConstant $model, ConstantObject $object) { $model->reference = $object->getReference(); - $model->value = json_encode($object->getValue()); + $model->value = $object->getValue(); return $this->handler($model); } diff --git a/app/Classes/Modules/Steps/ControllersLogic/CompletesStepLogic.php b/app/Classes/Modules/Steps/ControllersLogic/CompletesStepLogic.php index 4e161ed2..a7797ebc 100644 --- a/app/Classes/Modules/Steps/ControllersLogic/CompletesStepLogic.php +++ b/app/Classes/Modules/Steps/ControllersLogic/CompletesStepLogic.php @@ -10,7 +10,6 @@ use App\Classes\ValueObjects\Constants\OrderStatus; use App\Classes\ValueObjects\Constants\Steps; use App\Classes\ValueObjects\Constants\OrderType; use App\Http\Resources\StepResource; -use App\Classes\Modules\Steps\DataTransferObjects\StepsObject; use App\Classes\Modules\Steps\Services\FetchesSteps; use App\Classes\Modules\Steps\Processors\CompletesStepProcessor; diff --git a/app/Classes/Modules/Steps/Processors/CompletesStepProcessor.php b/app/Classes/Modules/Steps/Processors/CompletesStepProcessor.php index 3f5e5e68..b0c987bd 100644 --- a/app/Classes/Modules/Steps/Processors/CompletesStepProcessor.php +++ b/app/Classes/Modules/Steps/Processors/CompletesStepProcessor.php @@ -19,6 +19,10 @@ use App\Classes\Modules\Orders\Processors\UpdatesOrderCurrentStepProcessor; use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; +/** + * @deprecated This class uses incorrect StepsObject instantiation (9 parameters instead of 4) + * FIXME: Correct pattern: new StepsObject($appointee_id, $obligation->reference, $obligation->sequence, $obligation->hash_id) + */ class CompletesStepProcessor { @@ -52,6 +56,8 @@ class CompletesStepProcessor //Unity Contract Obligation Completed Status = 3 if(isset($completed->status) && $completed->status == OrderStatus::COMPLETE){ + // FIXME: Incorrect StepsObject instantiation - uses 9 parameters instead of correct 4-parameter pattern + // Correct pattern: new StepsObject($appointee_id, $obligation->reference, $obligation->sequence, $obligation->hash_id) $orderStepObject = new StepsObject( $contractEntity->company_module_id, $orderStep->reference, diff --git a/app/Classes/Modules/Steps/Processors/CreateStepsProcessor.php b/app/Classes/Modules/Steps/Processors/CreateStepsProcessor.php index 81067f03..77be34ed 100644 --- a/app/Classes/Modules/Steps/Processors/CreateStepsProcessor.php +++ b/app/Classes/Modules/Steps/Processors/CreateStepsProcessor.php @@ -17,6 +17,10 @@ use App\Models\Order; use App\Models\Step; use Illuminate\Database\Eloquent\Model; +/** + * @deprecated This class uses incorrect StepsObject instantiation (9 parameters instead of 4) + * FIXME: Correct pattern: new StepsObject($appointee_id, $obligation->reference, $obligation->sequence, $obligation->hash_id) + */ class CreateStepsProcessor { private $canCreateStep; @@ -46,6 +50,8 @@ class CreateStepsProcessor */ public function execute(Order $order, string $currentStep, $appointee_id){ + // FIXME: Incorrect StepsObject instantiation - uses 9 parameters instead of correct 4-parameter pattern + // Correct pattern: new StepsObject($appointee_id, $obligation->reference, $obligation->sequence, $obligation->hash_id) $stepObject = new StepsObject( $appointee_id, $currentStep, true, 0, OrderStatus::PROCESSING, 0, null, 0, null); $this->canCreateStep->passes($stepObject); diff --git a/app/Classes/Modules/Steps/Processors/GenerateStepsProcessor.php b/app/Classes/Modules/Steps/Processors/GenerateStepsProcessor.php index 9b40a3ed..22fe34ce 100644 --- a/app/Classes/Modules/Steps/Processors/GenerateStepsProcessor.php +++ b/app/Classes/Modules/Steps/Processors/GenerateStepsProcessor.php @@ -20,7 +20,10 @@ use App\Classes\Jobs\UnityLogin; use Config; use Illuminate\Support\Facades\Http; - +/** + * @deprecated This class uses incorrect StepsObject instantiation (9 parameters instead of 4) + * FIXME: Correct pattern: new StepsObject($appointee_id, $obligation->reference, $obligation->sequence, $obligation->hash_id) + */ class GenerateStepsProcessor { private $updatesOrderCurrentStep; @@ -46,6 +49,8 @@ class GenerateStepsProcessor //TODO: Collect hash_id & search company module table for appointee id foreach($obligations as $step){ + // FIXME: Incorrect StepsObject instantiation - uses 9 parameters instead of correct 4-parameter pattern + // Correct pattern: new StepsObject($appointee_id, $obligation->reference, $obligation->sequence, $obligation->hash_id) $orderSteps[] = new StepsObject( $orderRoles[0]->company_module_id, $step->name, diff --git a/app/Classes/Modules/Steps/Processors/UpdateStepsProcessor.php b/app/Classes/Modules/Steps/Processors/UpdateStepsProcessor.php index 6f26a3b2..9b078e26 100644 --- a/app/Classes/Modules/Steps/Processors/UpdateStepsProcessor.php +++ b/app/Classes/Modules/Steps/Processors/UpdateStepsProcessor.php @@ -14,6 +14,10 @@ use App\Classes\ValueObjects\Constants\Steps; use App\Models\Order; use App\Models\Step; +/** + * @deprecated This class uses incorrect StepsObject instantiation (9 parameters instead of 4) + * FIXME: Correct pattern: new StepsObject($appointee_id, $obligation->reference, $obligation->sequence, $obligation->hash_id) + */ class UpdateStepsProcessor { private $canUpdateStep; @@ -31,6 +35,8 @@ class UpdateStepsProcessor public function execute(string $currentStep){ + // FIXME: Incorrect StepsObject instantiation - uses 9 parameters instead of correct 4-parameter pattern + // Correct pattern: new StepsObject($appointee_id, $obligation->reference, $obligation->sequence, $obligation->hash_id) $orderStepsObject = new StepsObject(0,$currentStep, 0, 0, 1, 1, null, 0, null); $this->canUpdateStep->passes($orderStepsObject); diff --git a/app/Classes/Modules/Steps/Services/CreatesManySteps.php b/app/Classes/Modules/Steps/Services/CreatesManySteps.php index 9c87c0dd..4541270c 100644 --- a/app/Classes/Modules/Steps/Services/CreatesManySteps.php +++ b/app/Classes/Modules/Steps/Services/CreatesManySteps.php @@ -7,22 +7,30 @@ use App\Classes\General\Eloquent\AbstractUpdateRelationshipRecord; use App\Classes\Modules\Steps\DataTransferObjects\StepsObject; use App\Models\Step; use App\Models\Order; +use App\Classes\General\Interfaces\Steppable; +/** + * @deprecated This class calls undefined methods on StepsObject (getPrimary, getHashId) + * FIXME: StepsObject only has: getAppointeeId(), getReference(), getSequence(), getObligationId() + */ class CreatesManySteps extends AbstractUpdateRelationshipRecord { - public function execute(Steppable $owner, array $orderSteps) { + public function execute(Steppable $owner, array $orderSteps) + { - $orderStepsModel=[]; - foreach($orderSteps as $step){ - $orderStepsModel[]=[ + $orderStepsModel = []; + foreach ($orderSteps as $step) { + // FIXME: Calling undefined getter methods on StepsObject + // StepsObject only has: getAppointeeId(), getReference(), getSequence(), getObligationId() + $orderStepsModel[] = [ 'appointee_id' => $step->getAppointeeId(), 'reference' => $step->getReference(), - 'primary' => $step->getPrimary(), + 'primary' => $step->getPrimary(), // UNDEFINED METHOD 'sequence' => $step->getSequence(), 'status' => 0, 'contract_status' => 0, - 'unity_hash_id' => $step->getHashId(), + 'unity_hash_id' => $step->getHashId(), // UNDEFINED METHOD ]; } diff --git a/app/Classes/Modules/Steps/Services/UpdatesSteps.php b/app/Classes/Modules/Steps/Services/UpdatesSteps.php index ed4ec50e..860f4d8f 100644 --- a/app/Classes/Modules/Steps/Services/UpdatesSteps.php +++ b/app/Classes/Modules/Steps/Services/UpdatesSteps.php @@ -6,14 +6,21 @@ use App\Classes\General\Eloquent\AbstractUpdateRecord; use App\Classes\Modules\Steps\DataTransferObjects\StepsObject; use App\Models\Step; +/** + * @deprecated This class calls undefined methods on StepsObject (getStatus, getContractStatus, getCompletedDate) + * FIXME: StepsObject only has: getAppointeeId(), getReference(), getSequence(), getObligationId() + */ class UpdatesSteps extends AbstractUpdateRecord { public function execute(Step $model, StepsObject $object) { - $model->status = $object->getStatus(); - $model->contract_status = $object->getContractStatus(); - $model->complete_date = $object->getCompletedDate(); + // FIXME: Calling undefined getter methods on StepsObject + // StepsObject only has: getAppointeeId(), getReference(), getSequence(), getObligationId() + // The following methods DO NOT EXIST: + $model->status = $object->getStatus(); // UNDEFINED METHOD + $model->contract_status = $object->getContractStatus(); // UNDEFINED METHOD + $model->complete_date = $object->getCompletedDate(); // UNDEFINED METHOD return $this->handler($model); diff --git a/app/Classes/Modules/Transports/Services/UpdatesTransportStatus.php b/app/Classes/Modules/Transports/Services/UpdatesTransportStatus.php index 2898156a..325239bd 100644 --- a/app/Classes/Modules/Transports/Services/UpdatesTransportStatus.php +++ b/app/Classes/Modules/Transports/Services/UpdatesTransportStatus.php @@ -5,7 +5,7 @@ namespace App\Classes\Modules\Transports\Services; use App\Classes\General\Eloquent\AbstractUpdateRecord; use App\Models\Transport; -class updatesTransportStatus extends AbstractUpdateRecord +class UpdatesTransportStatus extends AbstractUpdateRecord { /** @@ -14,7 +14,8 @@ class updatesTransportStatus extends AbstractUpdateRecord * @return \Illuminate\Database\Eloquent\Model * @throws \App\Classes\Exceptions\MalformedRequestException */ - public function execute(Transport $model, int $status) { + public function execute(Transport $model, int $status) + { $model->status = $status; diff --git a/app/Classes/ValueObjects/Constants/SegmentConstants.php b/app/Classes/ValueObjects/Constants/SegmentConstants.php index 4a43c44f..929c014d 100644 --- a/app/Classes/ValueObjects/Constants/SegmentConstants.php +++ b/app/Classes/ValueObjects/Constants/SegmentConstants.php @@ -22,4 +22,8 @@ class SegmentConstants public const OUTSTATION_POSTCODE = 'OUTSTATION_POSTCODE'; public const CUSTOMER_RATE = 'CUSTOMER_RATE'; -} \ No newline at end of file + + public const SERVICE_TYPE = 'SERVICE_TYPE'; //syntax fix, likely no longer used + + public const CUSTOM_SERVICE_TYPE = 'CUSTOM_SERVICE_TYPE'; //syntax fix, likely no longer used +} diff --git a/app/Console/Commands/V2/ProcessYDPortalDataV2Command.php b/app/Console/Commands/V2/ProcessYDPortalDataV2Command.php index 051fa7ca..df516224 100644 --- a/app/Console/Commands/V2/ProcessYDPortalDataV2Command.php +++ b/app/Console/Commands/V2/ProcessYDPortalDataV2Command.php @@ -47,7 +47,7 @@ class ProcessYDPortalDataV2Command extends Command $jobs1 = $this->fetchPackingListsFromYdPortalV2CommandJobs(); $jobs2 = $this->fetchContainersYdPortalV3CommandJobs(); $jobs3 = $this->fetchContainersUpdatesYdPortalV3CommandJob(); - $jobs4 = $this->fetchDeliveryUpdatesFromYdPortalV2CommandJobs(); + // $jobs4 = $this->fetchDeliveryUpdatesFromYdPortalV2CommandJobs(); // The following job is intentionally excluded ////$jobs5 = array_merge($jobs, $this->fetchOrderListsFromYdPortalV2CommandJob()); @@ -66,10 +66,10 @@ class ProcessYDPortalDataV2Command extends Command dispatch($job); } - foreach ($jobs4 as $index => $job) { - $delayInSeconds = intdiv($index, 2); - dispatch($job)->delay(now()->addSeconds($delayInSeconds)); - } + // foreach ($jobs4 as $index => $job) { + // $delayInSeconds = intdiv($index, 2); + // dispatch($job)->delay(now()->addSeconds($delayInSeconds)); + // } } private function fetchPackingListsFromYdPortalV2CommandJobs(){ diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php deleted file mode 100644 index 26f31fff..00000000 --- a/app/Console/Kernel.php +++ /dev/null @@ -1,166 +0,0 @@ -command('dummy-command') - // ->everyFiveMinutes() - // ->withoutOverlapping(); - - $schedule->command('housekeeping-s3-files-command') - ->dailyAt('01:00') - ->withoutOverlapping(); - - $schedule->command('password-reset-token-expriration-check-command') - ->everySixHours() - ->withoutOverlapping(); - - $schedule->command('new-user-registration-expire-check-command') - ->everySixHours() - ->withoutOverlapping(); - - if(env('APP_ENV') === 'production'){ - $schedule->command('curl-vt-command') - ->cron('0 8 * * *') - ->withoutOverlapping(); - - // $schedule->command('curl-yd-order-list-command') - // ->cron('0 9-18/3 * * *') - // ->withoutOverlapping(); - - $schedule->command('process-yd-by-traking-no-data-command') - ->cron('0 8,11,14,17 * * *') - ->withoutOverlapping(); - - $schedule->command('process-yd-portal-data-command') - ->cron('0 9,12,15,18 * * *') //->cron('0 9-18/3 * * *') - ->withoutOverlapping(); - - $schedule->command('fix-packinglist-command') - ->cron('30 9-18/3 * * *') - ->withoutOverlapping(); - - $schedule->command('fix-duplicate-container-reference-command') - ->cron('0 1 * * *') - ->withoutOverlapping(); - - // $schedule->command('invoice-generate-command') - // ->hourly() - // ->withoutOverlapping(); - - $schedule->command('invoice-generate-command') - ->cron('0 0-8,10-11,13-14,16-17,19-23 * * *') - ->withoutOverlapping(); - - $schedule->command('billplz-failed-callback-fix-command') - ->hourly() - ->withoutOverlapping(); - - $schedule->command('check-storage-invoices-group-transactions-command') - ->dailyAt('0:01') - ->withoutOverlapping(); - - $schedule->command('permits-reminder-send-command') - ->dailyAt('09:30') - ->withoutOverlapping(); - - $schedule->command('process-delayed-jobs-command') - ->everyFiveMinutes() - ->withoutOverlapping(); - } - else if (env('APP_ENV') === 'development'){ - $schedule->command('process-delayed-jobs-command') - ->everyTwoHours() - ->withoutOverlapping(); - } - } - //Commands Version 1: Before AWS - else - { - $schedule->command('command:curlVTCommand') - ->cron('0 8 * * *') - ->withoutOverlapping() - ->appendOutputTo (storage_path().'/logs/curlvt.log'); - - $schedule->command('command:curlYdOrderListCommand') - ->cron('0 9-18/3 * * *') - ->withoutOverlapping() - ->appendOutputTo (storage_path().'/logs/curlyd.log'); - - $schedule->command('fix-packinglist') - ->cron('30 9-18/3 * * *') - ->withoutOverlapping() - ->appendOutputTo (storage_path().'/logs/fix_packinglist.log'); - - // $schedule->command('command:curlYdOrderListCommand') - // ->cron('0 9 * * *') - // ->withoutOverlapping() - // ->appendOutputTo (storage_path().'/logs/departure_email.log'); - - $schedule->command('fix-duplicate-container-reference') - ->cron('0 1 * * *') - ->withoutOverlapping() - ->appendOutputTo (storage_path().'/logs/fix_duplicate_container_reference.log'); - - $schedule->command('invoice:generate') - ->hourly() - ->withoutOverlapping() - ->appendOutputTo (storage_path().'/logs/auto_generate_invoice.log'); - - $schedule->command('billplz-failed-callback:fix') - ->hourly() - ->withoutOverlapping() - ->appendOutputTo (storage_path().'/logs/fix_failed_callback_from_billplz.log'); - - $schedule->command('check-storage-invoices-group-transactions') - ->dailyAt('0:01') - ->withoutOverlapping() - ->appendOutputTo(storage_path().'/logs/check_storage_invoices.log'); - - $schedule->command('permitsReminder:send') - ->dailyAt('09:30') - ->withoutOverlapping() - ->appendOutputTo(storage_path().'/logs/permits-reminder-send.log'); - } - } - - /** - * Register the commands for the application. - * - * @return void - */ - protected function commands() - { - $this->load(__DIR__.'/Commands'); - $this->load(__DIR__.'/Commands/V2'); - - require base_path('routes/console.php'); - } -} diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php deleted file mode 100644 index ec4dba30..00000000 --- a/app/Exceptions/Handler.php +++ /dev/null @@ -1,72 +0,0 @@ -getMessage(), [ - 'exception' => $exception, - 'stack_trace' => $exception->getTraceAsString(), - ]); - } - - parent::report($exception); - } - - /** - * Render an exception into an HTTP response. - * - * @param \Illuminate\Http\Request $request - * @param \Throwable $exception - * @return \Symfony\Component\HttpFoundation\Response - * - * @throws \Throwable - */ - public function render($request, Throwable $exception) - { - if ($exception instanceof MaintenanceModeException) { - return response() - ->view('pages.errors.maintenance'); - } - - if ($exception instanceof AuthenticationException) { - return (new ApiResponseObject('Authentication', 'To keep your account secure we need to re-validate your account', HttpStatus::ACCESS_UNAUTHORISED))->handler(); - } - - return parent::render($request, $exception); - } -} diff --git a/app/Http/Controllers/Exports/ExportArrivedParcelController.php b/app/Http/Controllers/Exports/ExportArrivedParcelController.php index 2adb5bde..7cc8561f 100644 --- a/app/Http/Controllers/Exports/ExportArrivedParcelController.php +++ b/app/Http/Controllers/Exports/ExportArrivedParcelController.php @@ -19,33 +19,33 @@ class ExportArrivedParcelController extends Controller { /** * ExportArrivedParcelController constructor. - * @param Request $request */ - public function __construct(Request $request) + public function __construct() { $this->middleware('auth.check'); // $token = Auth::fromUser(User::find(1)); // $request->headers->set('Authorization', 'Bearer '.$token); } - public function export(Request $request) { + public function export(Request $request) + { $startDate = $request->query('start_date'); $endDate = $request->query('end_date'); $exportsPendingArrangementDeliveryList = new ExportsArrivedParcel($startDate, $endDate); $exportFileName = 'arrived-parcel.xlsx'; $filesystemDriver = Storage::getDefaultDriver(); - if($filesystemDriver === 's3'){ - return response([ 'src' => AWSS3Helper::S3Exportable($exportFileName, $exportsPendingArrangementDeliveryList) ]); - } - else{ + if ($filesystemDriver === 's3') { + return response(['src' => AWSS3Helper::S3Exportable($exportFileName, $exportsPendingArrangementDeliveryList)]); + } else { $response = $exportsPendingArrangementDeliveryList->download($exportFileName, Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']); ob_end_clean(); return $response; } } - public function summary(Request $request) { + public function summary(Request $request) + { $validated = $request->validate([ 'startDate' => 'nullable|date_format:d-m-Y', @@ -66,38 +66,37 @@ class ExportArrivedParcelController extends Controller $exportsParcelsSummary = new ExportsParcel($startDate, $endDate); $exportFileName = 'parcel-summary.xls'; $filesystemDriver = Storage::getDefaultDriver(); - if($filesystemDriver === 's3'){ - return response([ 'src' => AWSS3Helper::S3Exportable($exportFileName, $exportsParcelsSummary) ]); - } - else{ + if ($filesystemDriver === 's3') { + return response(['src' => AWSS3Helper::S3Exportable($exportFileName, $exportsParcelsSummary)]); + } else { $response = $exportsParcelsSummary->download($exportFileName, Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']); ob_end_clean(); return $response; } } - public function guangZhou2ToJohor(Request $request) { + public function guangZhou2ToJohor(Request $request) + { $exportsWarehousePackingList = new ExportsWarehousePackingList(); $exportFileName = 'guangzhou2-to-johor-summary.xls'; $filesystemDriver = Storage::getDefaultDriver(); - if($filesystemDriver === 's3'){ - return response([ 'src' => AWSS3Helper::S3Exportable($exportFileName, $exportsWarehousePackingList) ]); - } - else{ + if ($filesystemDriver === 's3') { + return response(['src' => AWSS3Helper::S3Exportable($exportFileName, $exportsWarehousePackingList)]); + } else { $response = $exportsWarehousePackingList->download($exportFileName, Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']); ob_end_clean(); return $response; } } - public function aging(Request $request) { + public function aging(Request $request) + { $data = new ExportsAgingList(); $exportFileName = 'aging_report.xls'; $filesystemDriver = Storage::getDefaultDriver(); - if($filesystemDriver === 's3'){ - return response([ 'src' => AWSS3Helper::S3Exportable($exportFileName, $data) ]); - } - else{ + if ($filesystemDriver === 's3') { + return response(['src' => AWSS3Helper::S3Exportable($exportFileName, $data)]); + } else { $response = $data->download($exportFileName, Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']); ob_end_clean(); return $response; diff --git a/app/Http/Controllers/Exports/ExportPendingArrangementPackingListController.php b/app/Http/Controllers/Exports/ExportPendingArrangementPackingListController.php index 72e9d587..c2772172 100644 --- a/app/Http/Controllers/Exports/ExportPendingArrangementPackingListController.php +++ b/app/Http/Controllers/Exports/ExportPendingArrangementPackingListController.php @@ -15,35 +15,34 @@ class ExportPendingArrangementPackingListController extends Controller { /** * ExportPendingArrangementPackingListController constructor. - * @param Request $request */ - public function __construct(Request $request) + public function __construct() { $this->middleware('auth.check'); } - public function export(Request $request) { + public function export(Request $request) + { $exportsPendingArrangementDeliveryList = new ExportsPendingArrangementDeliveryList($request); $exportFileName = 'packing-list-delivery.xls'; $filesystemDriver = Storage::getDefaultDriver(); - if($filesystemDriver === 's3'){ - return response([ 'src' => AWSS3Helper::S3Exportable($exportFileName, $exportsPendingArrangementDeliveryList) ]); - } - else{ + if ($filesystemDriver === 's3') { + return response(['src' => AWSS3Helper::S3Exportable($exportFileName, $exportsPendingArrangementDeliveryList)]); + } else { $response = $exportsPendingArrangementDeliveryList->download($exportFileName, Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']); ob_end_clean(); return $response; } } - public function onHold(Request $request) { + public function onHold(Request $request) + { $exportsPendingArrangementDeliveryList = new ExportsOnHoldPackingList($request); $exportFileName = 'packing-list-on-hold.xls'; $filesystemDriver = Storage::getDefaultDriver(); - if($filesystemDriver === 's3'){ - return response([ 'src' => AWSS3Helper::S3Exportable($exportFileName, $exportsPendingArrangementDeliveryList) ]); - } - else{ + if ($filesystemDriver === 's3') { + return response(['src' => AWSS3Helper::S3Exportable($exportFileName, $exportsPendingArrangementDeliveryList)]); + } else { $response = $exportsPendingArrangementDeliveryList->download($exportFileName, Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']); ob_end_clean(); return $response; diff --git a/app/Http/Controllers/PackingLists/Packages/Items/CreatePackageItemController.php b/app/Http/Controllers/PackingLists/Packages/Items/CreatePackageItemController.php index a3293435..5d4629d3 100644 --- a/app/Http/Controllers/PackingLists/Packages/Items/CreatePackageItemController.php +++ b/app/Http/Controllers/PackingLists/Packages/Items/CreatePackageItemController.php @@ -1,8 +1,8 @@ execute($request); } diff --git a/app/Http/Controllers/PackingLists/Packages/Items/DeletePackageItemController.php b/app/Http/Controllers/PackingLists/Packages/Items/DeletePackageItemController.php index 153aaa8a..bc109766 100644 --- a/app/Http/Controllers/PackingLists/Packages/Items/DeletePackageItemController.php +++ b/app/Http/Controllers/PackingLists/Packages/Items/DeletePackageItemController.php @@ -1,8 +1,8 @@ execute($request); } diff --git a/app/Http/Controllers/PackingLists/Packages/Items/FetchPackageItemController.php b/app/Http/Controllers/PackingLists/Packages/Items/FetchPackageItemController.php index ca337e6d..164ac3a6 100644 --- a/app/Http/Controllers/PackingLists/Packages/Items/FetchPackageItemController.php +++ b/app/Http/Controllers/PackingLists/Packages/Items/FetchPackageItemController.php @@ -1,8 +1,8 @@ execute($request); } diff --git a/app/Http/Controllers/PackingLists/Packages/Items/ListPackageItemsController.php b/app/Http/Controllers/PackingLists/Packages/Items/ListPackageItemsController.php index 5c4c4d1a..e9bf6846 100644 --- a/app/Http/Controllers/PackingLists/Packages/Items/ListPackageItemsController.php +++ b/app/Http/Controllers/PackingLists/Packages/Items/ListPackageItemsController.php @@ -1,8 +1,8 @@ execute($request); } diff --git a/app/Http/Controllers/PackingLists/Packages/Items/UpdatePackageItemController.php b/app/Http/Controllers/PackingLists/Packages/Items/UpdatePackageItemController.php index b8478174..db6b1b23 100644 --- a/app/Http/Controllers/PackingLists/Packages/Items/UpdatePackageItemController.php +++ b/app/Http/Controllers/PackingLists/Packages/Items/UpdatePackageItemController.php @@ -1,8 +1,8 @@ execute($request); } diff --git a/app/Http/Controllers/PermitsReminder/CreatePermitsReminderController.php b/app/Http/Controllers/PermitsReminder/CreatePermitsReminderController.php index 0e093b04..bbb11439 100644 --- a/app/Http/Controllers/PermitsReminder/CreatePermitsReminderController.php +++ b/app/Http/Controllers/PermitsReminder/CreatePermitsReminderController.php @@ -8,6 +8,7 @@ use Carbon\Carbon; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\Rule; class CreatePermitsReminderController { @@ -19,7 +20,7 @@ class CreatePermitsReminderController { // Define validation rules $rules = [ - 'model' => 'required|unique:permits_reminders,model', + 'model' => ['required', Rule::unique('permits_reminders', 'model')], 'expiry_date' => 'required|date|after_or_equal:today', 'reminder_date' => 'required|date|after_or_equal:today', ]; diff --git a/app/Http/Controllers/PermitsReminder/UpdatePermitsReminderController.php b/app/Http/Controllers/PermitsReminder/UpdatePermitsReminderController.php index 14bcec7b..a7990432 100644 --- a/app/Http/Controllers/PermitsReminder/UpdatePermitsReminderController.php +++ b/app/Http/Controllers/PermitsReminder/UpdatePermitsReminderController.php @@ -7,6 +7,7 @@ use Carbon\Carbon; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Validator; +use Illuminate\Validation\Rule; class UpdatePermitsReminderController { @@ -17,7 +18,7 @@ class UpdatePermitsReminderController public function update(Request $request): JsonResponse { $rules = [ - 'model' => 'required|unique:permits_reminders,model,' . $request->route('id'), + 'model' => ['required', Rule::unique('permits_reminders', 'model')->ignore($request->route('id'))], 'expiry_date' => 'required|date|after_or_equal:today', 'reminder_date' => 'required|date|after_or_equal:today', ]; diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php deleted file mode 100644 index da671bf9..00000000 --- a/app/Http/Kernel.php +++ /dev/null @@ -1,81 +0,0 @@ - [ - \App\Http\Middleware\EncryptCookies::class, - \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, - \Illuminate\Session\Middleware\StartSession::class, - // \Illuminate\Session\Middleware\AuthenticateSession::class, - \Illuminate\View\Middleware\ShareErrorsFromSession::class, - \App\Http\Middleware\VerifyCsrfToken::class, - \Illuminate\Routing\Middleware\SubstituteBindings::class, - ], - - 'api' => [ - 'throttle:300,1', - \Illuminate\Routing\Middleware\SubstituteBindings::class, - ], - - 'apipub' => [ - // \Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class, - \Illuminate\Routing\Middleware\SubstituteBindings::class, - ], - ]; - - /** - * The application's route middleware. - * - * These middleware may be assigned to groups or used individually. - * - * @var array - */ - protected $routeMiddleware = [ - 'auth' => \App\Http\Middleware\Authenticate::class, - 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, - 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, - 'can' => \Illuminate\Auth\Middleware\Authorize::class, - 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, - 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, - 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, - 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, - 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, - 'valid.token' => ValidateToken::class, - 'token.check' => \App\Http\Middleware\TokenCheckerMiddleware::class, - 'auth.check' => \App\Http\Middleware\CheckAuthorizationMiddleware::class, - 'storage.invoice.check.byorder' => \App\Http\Middleware\CheckForStorageInvoiceByOrderId::class, - 'storage.invoice.check.bytransaction' => \App\Http\Middleware\CheckForStorageInvoiceByTransactionId::class, - 'storage.invoice.check.bytransactions' => \App\Http\Middleware\CheckForStorageInvoiceByTransactions::class, - 'storage.invoice.check.bygroup' => \App\Http\Middleware\CheckForStorageInvoiceByGroup::class, - 'storage.invoice.check.bypackinglists' => \App\Http\Middleware\CheckForStorageInvoiceByPackingLists::class, - 'admin' => \App\Http\Middleware\EnsureUserIsAdmin::class, //cief maintenance - ]; -} diff --git a/app/Http/Middleware/LogRequestPathMiddleware.php b/app/Http/Middleware/LogRequestPathMiddleware.php new file mode 100644 index 00000000..804c3440 --- /dev/null +++ b/app/Http/Middleware/LogRequestPathMiddleware.php @@ -0,0 +1,36 @@ +method(); + $fullUrl = $request->fullUrl(); + LogHelper::channel('request_path')->info('Request Method: ' . $method); + LogHelper::channel('request_path')->info('Request URL: ' . $fullUrl); + + + if ($request->isMethod('post')) { + $payload = $request->all(); + LogHelper::channel('request_path')->info('Request Payload POST: ', $payload); + } + } + + return $next($request); + } +} diff --git a/app/Http/Middleware/RedirectIfAuthenticated.php b/app/Http/Middleware/RedirectIfAuthenticated.php index 362b48b0..415ce2c0 100644 --- a/app/Http/Middleware/RedirectIfAuthenticated.php +++ b/app/Http/Middleware/RedirectIfAuthenticated.php @@ -2,7 +2,6 @@ namespace App\Http\Middleware; -use App\Providers\RouteServiceProvider; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; @@ -23,7 +22,7 @@ class RedirectIfAuthenticated foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { - return redirect(RouteServiceProvider::HOME); + return redirect('/dashboard'); } } diff --git a/app/Http/Middleware/TrustProxies.php b/app/Http/Middleware/TrustProxies.php index a3b6aef9..d11dd5f0 100644 --- a/app/Http/Middleware/TrustProxies.php +++ b/app/Http/Middleware/TrustProxies.php @@ -2,7 +2,7 @@ namespace App\Http\Middleware; -use Fideloper\Proxy\TrustProxies as Middleware; +use Illuminate\Http\Middleware\TrustProxies as Middleware; use Illuminate\Http\Request; class TrustProxies extends Middleware diff --git a/app/Http/Middleware/ValidateToken.php b/app/Http/Middleware/ValidateToken.php index 846972aa..07c9f737 100644 --- a/app/Http/Middleware/ValidateToken.php +++ b/app/Http/Middleware/ValidateToken.php @@ -11,19 +11,6 @@ use Tymon\JWTAuth\JWT; class ValidateToken { - /** @var JWT */ - private $manager; - - /** - * ValidateToken constructor. - * @param JWT $manager - */ - public function __construct(JWT $manager) - { - $this->manager = $manager; - } - - /** * Checks if jwt token is valid. * @@ -35,7 +22,9 @@ class ValidateToken { try { - if(!$this->manager->check()){ throw new AccessUnauthorisedException(); } + if (!auth('api')->check()) { + throw new AccessUnauthorisedException(); + } } catch (Exception $exception) { diff --git a/app/Logging/CloudWatchLoggerFactory.php b/app/Logging/CloudWatchLoggerFactory.php index 14c5da6e..eea59c90 100644 --- a/app/Logging/CloudWatchLoggerFactory.php +++ b/app/Logging/CloudWatchLoggerFactory.php @@ -3,7 +3,7 @@ namespace App\Logging; use Aws\CloudWatchLogs\CloudWatchLogsClient; -use Maxbanton\Cwh\Handler\CloudWatch; +use PhpNexus\Cwh\Handler\CloudWatch; use Monolog\Formatter\JsonFormatter; use Monolog\Logger; diff --git a/app/Models/AbstractModel.php b/app/Models/AbstractModel.php index f459750f..73d01129 100644 --- a/app/Models/AbstractModel.php +++ b/app/Models/AbstractModel.php @@ -6,12 +6,21 @@ namespace App\Models; use App\Classes\General\Interfaces\Notifiable; use Illuminate\Database\Eloquent\Model; use Spatie\Activitylog\Traits\LogsActivity; +use Spatie\Activitylog\LogOptions; use Illuminate\Database\Eloquent\Relations\MorphTo; class AbstractModel extends Model implements Notifiable { use LogsActivity; - protected static $logFillable = true; + + /** + * Get the options for logging activity. + */ + public function getActivitylogOptions(): LogOptions + { + return LogOptions::defaults() + ->logFillable(); + } /** * @return MorphTo diff --git a/app/Models/Address.php b/app/Models/Address.php index d8cddc64..83685c9b 100644 --- a/app/Models/Address.php +++ b/app/Models/Address.php @@ -15,22 +15,30 @@ use Illuminate\Database\Eloquent\Relations\MorphTo; * Class Address * @package App\Models * - * @property int country_id - * @property int company_id - * @property int state_id - * @property int district_id - * @property string postcode - * @property string street_one - * @property string street_two - * @property integer billing_type + * @property int $country_id + * @property int $state_id + * @property int $district_id + * @property string $postcode + * @property string $street_one + * @property string $street_two + * @property int $billing_type + * + * @property \App\Models\Country $country + * @property \App\Models\State $state + * @property \App\Models\District $district */ class Address extends AbstractModel implements Contactable, Remarkable { use SoftDeletes; protected $table = 'addresses'; - - protected $dates = ['deleted_at']; + + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } protected $fillable = ['default']; diff --git a/app/Models/Company.php b/app/Models/Company.php index 5da3a83c..68cf9bd5 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -16,13 +16,13 @@ use Staudenmeir\EloquentHasManyDeep\HasRelationships; * Class Company * @package App\Models * - * @property \App\Models\Country country_id - * @property \App\Models\State state_id - * @property \App\Models\District district_id - * @property string postcode - * @property string street_one - * @property string street_two - * @property integer billing_type + * @property int $country_id + * @property int $state_id + * @property int $district_id + * @property string $postcode + * @property string $street_one + * @property string $street_two + * @property int $billing_type */ class Company extends AbstractModel implements Documentable, Contactable { @@ -31,7 +31,12 @@ class Company extends AbstractModel implements Documentable, Contactable protected $table = 'companies'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** * @return MorphMany @@ -63,8 +68,8 @@ class Company extends AbstractModel implements Documentable, Contactable $orders = []; $this->CompanyModules->each(function ($companyModule) { - $orders[] = $companyModule->orders->sortByDesc('id'); - }); + $orders[] = $companyModule->orders->sortByDesc('id'); + }); return collect($orders); } diff --git a/app/Models/CompanyConnection.php b/app/Models/CompanyConnection.php index 894cdafc..fe4461c9 100644 --- a/app/Models/CompanyConnection.php +++ b/app/Models/CompanyConnection.php @@ -20,12 +20,15 @@ use Illuminate\Database\Eloquent\SoftDeletes; use PhpParser\Node\Expr\AssignOp\Mod; /** - * Class CompanyModule + * Class CompanyConnection * @package App\Models * - * @property \App\Models\Company company_id - * @property integer type - * @property integer status + * @property int $inviter_id + * @property int $invitee_id + * @property string $inviter_reference + * @property string $invitee_reference + * @property int $status + * @property bool $is_credit_term */ class CompanyConnection extends AbstractModel { @@ -33,7 +36,12 @@ class CompanyConnection extends AbstractModel protected $table = 'company_connections'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** * @return BelongsTo diff --git a/app/Models/CompanyEmployee.php b/app/Models/CompanyEmployee.php index fc6ebfa4..f1fb5750 100644 --- a/app/Models/CompanyEmployee.php +++ b/app/Models/CompanyEmployee.php @@ -9,10 +9,13 @@ use Illuminate\Database\Eloquent\Relations\HasOne; * Class CompanyEmployee * @package App\Models * - * @property \App\Models\companyModule company_module_id - * @property \App\Models\User user_id - * @property integer role_id - * @property integer status + * @property int $company_module_id + * @property int $user_id + * @property int $role_id + * @property int $status + * + * @property \App\Models\CompanyModule $companyModule + * @property \App\Models\User $user */ class CompanyEmployee extends AbstractModel { diff --git a/app/Models/CompanyModule.php b/app/Models/CompanyModule.php index 65e0a259..ae07cc45 100644 --- a/app/Models/CompanyModule.php +++ b/app/Models/CompanyModule.php @@ -29,9 +29,11 @@ use App\Classes\General\Interfaces\Remarkable; * Class CompanyModule * @package App\Models * - * @property \App\Models\Company company_id - * @property integer type - * @property integer status + * @property int $company_id + * @property int $type + * @property int $status + * + * @property \App\Models\Company $company */ class CompanyModule extends AbstractModel implements Addressable, Documentable, Contactable, ContainerOwner, Packable, Remarkable { @@ -40,7 +42,12 @@ class CompanyModule extends AbstractModel implements Addressable, Documentable, protected $table = 'company_modules'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** * @return BelongsTo @@ -95,7 +102,7 @@ class CompanyModule extends AbstractModel implements Addressable, Documentable, */ public function invites(): belongsToMany { - return $this->belongsToMany(CompanyModule::class, CompanyConnection::class,'inviter_id', 'invitee_id'); + return $this->belongsToMany(CompanyModule::class, CompanyConnection::class, 'inviter_id', 'invitee_id'); } /** @@ -103,11 +110,12 @@ class CompanyModule extends AbstractModel implements Addressable, Documentable, */ public function inviters(): belongsToMany { - return $this->belongsToMany(CompanyModule::class, CompanyConnection::class,'invitee_id', 'inviter_id'); + return $this->belongsToMany(CompanyModule::class, CompanyConnection::class, 'invitee_id', 'inviter_id'); } - public function connections(): hasMany { + public function connections(): hasMany + { return $this->hasMany(CompanyConnection::class, 'invitee_id'); } @@ -125,29 +133,29 @@ class CompanyModule extends AbstractModel implements Addressable, Documentable, return $this->HasMany(Order::class, 'company_module_id'); } - /** - * @return belongsToMany - */ - public function segments(): belongsToMany - { - return $this->belongsToMany(Segment::class, (new SegmentCompany())->getTable(), 'company_id', 'segment_id'); - } + /** + * @return belongsToMany + */ + public function segments(): belongsToMany + { + return $this->belongsToMany(Segment::class, (new SegmentCompany())->getTable(), 'company_id', 'segment_id'); + } - /** - * @return MorphMany - */ - public function documents(): morphMany - { - return $this->morphMany(Document::class, 'owner'); - } + /** + * @return MorphMany + */ + public function documents(): morphMany + { + return $this->morphMany(Document::class, 'owner'); + } - /** - * @return HasMany - */ - public function banks(): HasMany - { - return $this->HasMany(BankAccount::class, 'company_id'); - } + /** + * @return HasMany + */ + public function banks(): HasMany + { + return $this->HasMany(BankAccount::class, 'company_id'); + } /** * @return MorphMany @@ -197,7 +205,7 @@ class CompanyModule extends AbstractModel implements Addressable, Documentable, */ public function transactions(): hasManyDeep { - return $this->hasManyDeep(Transaction::class, [Order::class], ['company_module_id', 'owner_id'], ['id', 'id']); + return $this->hasManyDeep(Transaction::class, [Order::class], ['company_module_id', 'owner_id'], ['id', 'id']); } /** diff --git a/app/Models/ConnectionSegment.php b/app/Models/ConnectionSegment.php index 468ba877..36f603c1 100644 --- a/app/Models/ConnectionSegment.php +++ b/app/Models/ConnectionSegment.php @@ -6,11 +6,11 @@ use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\SoftDeletes; /** - * Class Segment + * Class ConnectionSegment * @package App\Models * - * @property string name - * @property string reference + * @property string $name + * @property string $reference */ class ConnectionSegment extends AbstractModel { @@ -18,7 +18,12 @@ class ConnectionSegment extends AbstractModel protected $table = 'connection_segments'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** * @return HasMany diff --git a/app/Models/Contact.php b/app/Models/Contact.php index f8ce6213..779e0569 100644 --- a/app/Models/Contact.php +++ b/app/Models/Contact.php @@ -9,13 +9,16 @@ use Illuminate\Database\Eloquent\Relations\MorphTo; * Class Contact * @package App\Models * - * @property int owner_id - * @property string owner_type - * @property string reference - * @property string phone - * @property string email - * @property string wechat_id - * @property int default + * @property int $id + * @property int $owner_id + * @property string $owner_type + * @property string $reference + * @property string $phone + * @property string $email + * @property string $wechat_id + * @property int $default + * + * @property mixed $owner */ class Contact extends AbstractModel { @@ -23,7 +26,12 @@ class Contact extends AbstractModel protected $table = 'contacts'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** * @return \Illuminate\Database\Eloquent\Relations\MorphTo diff --git a/app/Models/Container.php b/app/Models/Container.php index efe946f9..acf0b40f 100644 --- a/app/Models/Container.php +++ b/app/Models/Container.php @@ -21,7 +21,12 @@ class Container extends AbstractModel implements Transportable, Remarkable protected $fillable = ['status']; - protected $dates = ['loading_date']; + protected function casts(): array + { + return [ + 'loading_date' => 'datetime', + ]; + } public function packingLists(): belongsToMany { diff --git a/app/Models/Country.php b/app/Models/Country.php index 3232366a..1fc6c214 100644 --- a/app/Models/Country.php +++ b/app/Models/Country.php @@ -9,9 +9,9 @@ use Illuminate\Database\Eloquent\SoftDeletes; * Class Country * @package App\Models * - * @property string name - * @property string short_code - * @property string phone_code + * @property string $name + * @property string $short_code + * @property string $phone_code */ class Country extends AbstractModel { @@ -19,7 +19,12 @@ class Country extends AbstractModel protected $table = 'countries'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } protected $fillable = ['name', 'short_code', 'phone_code']; diff --git a/app/Models/Currency.php b/app/Models/Currency.php index cf3b4a6f..9d7c3eef 100644 --- a/app/Models/Currency.php +++ b/app/Models/Currency.php @@ -12,10 +12,14 @@ use Illuminate\Database\Eloquent\Relations\hasMany; * Class Currency * @package App\Models * - * @property \App\Models\Country country_id - * @property string name - * @property string short_code - * @property string symbol + * @property int $id + * @property int $country_id + * @property string $name + * @property string $short_code + * @property string $symbol + * + * @property \App\Models\Country $country + * @property \Illuminate\Database\Eloquent\Collection|\App\Models\CurrencyRate[] $rates */ class Currency extends AbstractModel @@ -24,7 +28,12 @@ class Currency extends AbstractModel protected $table = 'currencies'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** * @return BelongsTo diff --git a/app/Models/CurrencyRate.php b/app/Models/CurrencyRate.php index ca8cad92..c51078dd 100644 --- a/app/Models/CurrencyRate.php +++ b/app/Models/CurrencyRate.php @@ -12,5 +12,10 @@ class CurrencyRate extends AbstractModel protected $fillable = ['currency_id', 'selling', 'payment_method_type']; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } } diff --git a/app/Models/District.php b/app/Models/District.php index 13a90f85..e5a7f926 100644 --- a/app/Models/District.php +++ b/app/Models/District.php @@ -10,10 +10,13 @@ use Illuminate\Database\Eloquent\SoftDeletes; * Class District * @package App\Models * - * @property \App\Models\Country country_id - * @property \App\Models\State state_id - * @property string name - * @property string postcode + * @property int $country_id + * @property int $state_id + * @property string $name + * @property string $postcode + * + * @property \App\Models\Country $country + * @property \App\Models\State $state */ class District extends AbstractModel { @@ -21,7 +24,12 @@ class District extends AbstractModel protected $table = 'districts'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** * @return BelongsTo diff --git a/app/Models/Document.php b/app/Models/Document.php index eb3f8c77..ab7531c0 100644 --- a/app/Models/Document.php +++ b/app/Models/Document.php @@ -14,15 +14,15 @@ use Illuminate\Database\Eloquent\Relations\hasMany; * @package App\Models * @version August 4, 2020, 4:36 am * - * @property int owner_id - * @property int owner_type - * @property int document_type - * @property string reference - * @property int status - * @property \App\Models\User approver - * @property timestamp issued_date - * @property timestamp expired_date - * @property timestamp approved_date + * @property int $owner_id + * @property string $owner_type + * @property string $document_type + * @property string $reference + * @property int $status + * @property int $approver + * @property \Carbon\Carbon $issued_date + * @property \Carbon\Carbon $expired_date + * @property \Carbon\Carbon $approval_date */ class Document extends AbstractModel { @@ -30,7 +30,12 @@ class Document extends AbstractModel protected $table = 'documents'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** * @return \Illuminate\Database\Eloquent\Relations\MorphTo @@ -43,7 +48,7 @@ class Document extends AbstractModel /** * @return hasMany */ - public function files(): hasMany + public function files(): hasMany { return $this->hasMany(File::class, 'document_id'); } diff --git a/app/Models/Exchange/Employee.php b/app/Models/Exchange/Employee.php index b310f078..dbc12a62 100644 --- a/app/Models/Exchange/Employee.php +++ b/app/Models/Exchange/Employee.php @@ -7,11 +7,15 @@ use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasOne; /** - * Class CompanyEmployee - * @package App\Models + * Class Employee + * @package App\Models\Exchange * - * @property \App\Models\Company company_id - * @property \App\Models\User user_id + * @property int $id + * @property int $company_id + * @property int $user_id + * + * @property \Illuminate\Database\Eloquent\Collection|\App\Models\Exchange\Company[] $company + * @property \App\Models\Exchange\User $user */ class Employee extends AbstractModel { diff --git a/app/Models/File.php b/app/Models/File.php index 6707fd9f..461b937b 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -10,9 +10,9 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @package App\Models * @version August 4, 2020, 4:36 am * - * @property \App\Models\Document document_id - * @property text file - * @property int file_type_id + * @property int $document_id + * @property array $file + * @property int $file_type_id */ class File extends AbstractModel { @@ -22,10 +22,12 @@ class File extends AbstractModel protected $fillable = ['file']; - protected $dates = ['deleted_at']; - - public function getFileAttribute($value) + protected function casts(): array { - return $value ? json_decode($value) : []; + return [ + 'file' => 'array', + 'deleted_at' => 'datetime', + ]; } + } diff --git a/app/Models/KeyValuePair.php b/app/Models/KeyValuePair.php index 8f8ddec8..2cbf8a15 100644 --- a/app/Models/KeyValuePair.php +++ b/app/Models/KeyValuePair.php @@ -8,7 +8,12 @@ class KeyValuePair extends AbstractModel { use SoftDeletes; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } protected $table = 'key_value_pairs'; diff --git a/app/Models/Order.php b/app/Models/Order.php index 4dacddb7..ef994423 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -27,7 +27,12 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable, protected $table = 'orders'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** @@ -97,26 +102,27 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable, protected static function booted() { -// if (auth()->user()->type === RoleTypes::USER) { + // if (auth()->user()->type === RoleTypes::USER) { // static::addGlobalScope(new CustomerOrdersScope); // } } public function addressesPendingVerification() { - return $this->addresses()->where('status','=',ApprovalStatus::PENDING_VERIFICATION); + return $this->addresses()->where('status', '=', ApprovalStatus::PENDING_VERIFICATION); } public function addressesApproved() { - return $this->addresses()->where('status','=',ApprovalStatus::APPROVED); + return $this->addresses()->where('status', '=', ApprovalStatus::APPROVED); } public function originWarehousePackages() { return $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST) - ->whereDoesntHave('shippingSchedules', - function($schedule) { + ->whereDoesntHave( + 'shippingSchedules', + function ($schedule) { return $schedule->dispatched() ->whereIn('schedules.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); } @@ -126,28 +132,33 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable, public function inTransitPackages() { return $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST)->Shipping() - ->whereHas('shippingSchedules', - function($schedule) { + ->whereHas( + 'shippingSchedules', + function ($schedule) { return $schedule->dispatched() ->whereIn('schedules.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); } ) - ->whereDoesntHave('containers', function($container) { - return $container->where('containers.status', ApprovalStatus::COMPLETED); - } - )->whereHas('packages'); + ->whereDoesntHave( + 'containers', + function ($container) { + return $container->where('containers.status', ApprovalStatus::COMPLETED); + } + )->whereHas('packages'); } public function destinationWarehousePackages() { return $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST) - ->whereHas('containers', - function($container) { + ->whereHas( + 'containers', + function ($container) { return $container->where('containers.status', ApprovalStatus::COMPLETED); } ) - ->whereDoesntHave('deliverySchedules', - function($schedule) { + ->whereDoesntHave( + 'deliverySchedules', + function ($schedule) { return $schedule->dispatched()->whereIn('schedules.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); } )->whereHas('packages'); @@ -156,8 +167,9 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable, public function deliveredPackages() { return $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST) - ->whereHas('deliverySchedules', - function($schedule) { + ->whereHas( + 'deliverySchedules', + function ($schedule) { return $schedule->dispatched()->whereIn('schedules.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); } ); diff --git a/app/Models/PermitsReminder.php b/app/Models/PermitsReminder.php index 1f9762a9..af564157 100644 --- a/app/Models/PermitsReminder.php +++ b/app/Models/PermitsReminder.php @@ -12,7 +12,12 @@ class PermitsReminder extends Model protected $table = 'permits_reminders'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } protected $fillable = ['model', 'expiry_date', 'reminder_date']; diff --git a/app/Models/Schedule.php b/app/Models/Schedule.php index ba13e072..557b90c2 100644 --- a/app/Models/Schedule.php +++ b/app/Models/Schedule.php @@ -14,7 +14,13 @@ class Schedule extends AbstractModel protected $table = 'schedules'; - protected $dates = ['etd', 'eta']; + protected function casts(): array + { + return [ + 'etd' => 'datetime', + 'eta' => 'datetime', + ]; + } public function owner(): morphTo { @@ -30,7 +36,8 @@ class Schedule extends AbstractModel * @param $query * @return mixed */ - public function scopeDispatched($query){ + public function scopeDispatched($query) + { return $query->where('etd', '<', Carbon::now()); } @@ -38,7 +45,8 @@ class Schedule extends AbstractModel * @param $query * @return mixed */ - public function scopeDropped($query){ + public function scopeDropped($query) + { return $query->where('eta', '<', Carbon::now()); } } diff --git a/app/Models/Segment.php b/app/Models/Segment.php index 5d6d1b7a..a065c04c 100644 --- a/app/Models/Segment.php +++ b/app/Models/Segment.php @@ -9,8 +9,8 @@ use Illuminate\Database\Eloquent\SoftDeletes; * Class Segment * @package App\Models * - * @property string name - * @property string reference + * @property string $name + * @property string $reference */ class Segment extends AbstractModel { @@ -18,7 +18,12 @@ class Segment extends AbstractModel protected $table = 'segments'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** * @return HasMany @@ -27,12 +32,12 @@ class Segment extends AbstractModel { return $this->HasMany(SegmentConstant::class, 'segment_id', 'id'); } - - /** - * @return belongsToMany - */ - public function companyConnections(): belongsToMany - { - return $this->belongsToMany(CompanyConnection::class, (new ConnectionSegment())->getTable(), 'segment_id', 'company_connection_id'); - } + + // /** + // * @return belongsToMany + // */ + // public function companyConnections(): belongsToMany + // { + // return $this->belongsToMany(CompanyConnection::class, (new ConnectionSegment())->getTable(), 'segment_id', 'company_connection_id'); + // } } diff --git a/app/Models/SegmentConstant.php b/app/Models/SegmentConstant.php index 753c2f2f..93dc03d2 100644 --- a/app/Models/SegmentConstant.php +++ b/app/Models/SegmentConstant.php @@ -10,18 +10,25 @@ use Illuminate\Database\Eloquent\SoftDeletes; * Class SegmentConstant * @package App\Models * - * @property \App\Models\Segment segment_id - * @property string detail + * @property int $id + * @property int $segment_id + * @property string $reference + * @property array $detail + * @property array $value */ class SegmentConstant extends AbstractModel { use SoftDeletes; - + protected $table = 'segment_constants'; - public function getDetailAttribute($value) + protected function casts(): array { - return $value ? json_decode($value) : []; + return [ + 'detail' => 'array', + 'value' => 'array', + 'deleted_at' => 'datetime', + ]; } /** @@ -32,9 +39,4 @@ class SegmentConstant extends AbstractModel return $this->BelongsTo(Segment::class, 'segment_id', 'id'); } - public function getValueAttribute($value) - { - $value = $value ? json_decode($value) : []; - return $value; - } } diff --git a/app/Models/ServiceType.php b/app/Models/ServiceType.php index ecc4750e..7a878350 100644 --- a/app/Models/ServiceType.php +++ b/app/Models/ServiceType.php @@ -13,7 +13,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @package App\Models * @version February 16, 2021, 9:04 pm * - * @property string name + * @property string $name */ class ServiceType extends AbstractModel { @@ -25,10 +25,6 @@ class ServiceType extends AbstractModel - protected $dates = ['deleted_at']; - - - public $fillable = [ 'name' ]; @@ -38,9 +34,13 @@ class ServiceType extends AbstractModel * * @var array */ - protected $casts = [ - 'name' => 'string' - ]; + protected function casts(): array + { + return [ + 'name' => 'string', + 'deleted_at' => 'datetime', + ]; + } /** * Validation rules diff --git a/app/Models/State.php b/app/Models/State.php index 3f7036ac..813ec9a5 100644 --- a/app/Models/State.php +++ b/app/Models/State.php @@ -9,8 +9,8 @@ use Illuminate\Database\Eloquent\SoftDeletes; * Class State * @package App\Models * - * @property \App\Models\Country country_id - * @property string name + * @property int $country_id + * @property string $name */ class State extends AbstractModel { @@ -18,7 +18,12 @@ class State extends AbstractModel protected $table = 'states'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** * @return BelongsTo diff --git a/app/Models/Step.php b/app/Models/Step.php index 55603045..692d31b7 100644 --- a/app/Models/Step.php +++ b/app/Models/Step.php @@ -6,7 +6,7 @@ use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; -class Step extends AbstractModel +class Step extends AbstractModel { use SoftDeletes; @@ -14,7 +14,12 @@ class Step extends AbstractModel protected $fillable = ['status']; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } public function owner(): morphTo { diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 71c05f0d..15e888ab 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -23,9 +23,12 @@ class Transaction extends AbstractModel implements Documentable, Transactionable use SoftDeletes; use LogData; - protected $casts = [ - 'type' => 'int' - ]; + protected function casts(): array + { + return [ + 'type' => 'int', + ]; + } protected $table = 'transactions'; @@ -95,12 +98,12 @@ class Transaction extends AbstractModel implements Documentable, Transactionable */ public function groupsWithTrashed(): BelongsToMany { - return $this->BelongsToMany(Group::class, GroupTransaction::class, 'transaction_id')->withTrashed();; + return $this->BelongsToMany(Group::class, GroupTransaction::class, 'transaction_id')->withTrashed(); } public function convert_original_amount() { - if($this->booking()->first()->fix_currency_id !== 1) { + if ($this->booking()->first()->fix_currency_id !== 1) { $currency_rate = $this->currency()->first()->rates()->where('payment_method_type', $this->payment_method)->first(); return number_format($this->original_amount / $currency_rate->selling, 2); @@ -123,11 +126,11 @@ class Transaction extends AbstractModel implements Documentable, Transactionable */ public function scopeInComplete(Builder $query) { - return $query->where(function(Builder $query){ - $query->where(function(Builder $query){ + return $query->where(function (Builder $query) { + $query->where(function (Builder $query) { $query->where('status', ApprovalStatus::PENDING_SUBMISSION) ->whereDate('expires_on', '>=', Carbon::now()); - })->orWhere(function(Builder $query){ + })->orWhere(function (Builder $query) { $query->where('status', ApprovalStatus::PENDING_VERIFICATION); }); }); diff --git a/app/Models/Transport.php b/app/Models/Transport.php index f6b58571..cc15cdd2 100644 --- a/app/Models/Transport.php +++ b/app/Models/Transport.php @@ -16,7 +16,13 @@ class Transport extends AbstractModel protected $fillable = ['status', 'drop_date']; - protected $dates = ['dispatch_date', 'drop_date']; + protected function casts(): array + { + return [ + 'dispatch_date' => 'datetime', + 'drop_date' => 'datetime', + ]; + } /** * @return \Illuminate\Database\Eloquent\Relations\MorphTo @@ -38,7 +44,8 @@ class Transport extends AbstractModel * @param $query * @return mixed */ - public function scopeDispatched($query){ + public function scopeDispatched($query) + { return $query->where('dispatch_date', '<', Carbon::now())->whereIn('status', [ApprovalStatus::APPROVED]); } @@ -46,7 +53,8 @@ class Transport extends AbstractModel * @param $query * @return mixed */ - public function scopeDropped($query){ + public function scopeDropped($query) + { return $query->where('drop_date', '<', Carbon::now())->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); } } diff --git a/app/Models/User.php b/app/Models/User.php index daabe09d..f040a7d6 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -27,7 +27,12 @@ class User extends AbstractModel implements { use HasRoles, Notifiable, Authenticatable, Authorizable, CanResetPassword, MustVerifyEmail, SoftDeletes; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** * Get the identifier that will be stored in the subject claim of the JWT. @@ -49,14 +54,16 @@ class User extends AbstractModel implements return []; } - public function emailVerification(): HasMany { + public function emailVerification(): HasMany + { return $this->hasMany(UserEmailVerification::class, 'email', 'email'); } /** * @return HasMany */ - public function passwordReset(): HasMany { + public function passwordReset(): HasMany + { return $this->hasMany(PasswordReset::class, 'user_id', 'id'); } diff --git a/app/Models/UserSocialAccount.php b/app/Models/UserSocialAccount.php index 71aa73d8..ab9721ed 100644 --- a/app/Models/UserSocialAccount.php +++ b/app/Models/UserSocialAccount.php @@ -7,12 +7,15 @@ use Illuminate\Database\Eloquent\Relations\HasOne; use Illuminate\Database\Eloquent\SoftDeletes; /** - * Class District + * Class UserSocialAccount * @package App\Models * - * @property \App\Models\User user_id - * @property string app_id - * @property int platform + * @property int $id + * @property int $user_id + * @property string $app_id + * @property int $platform + * + * @property \App\Models\User $user */ class UserSocialAccount extends AbstractModel { @@ -20,7 +23,12 @@ class UserSocialAccount extends AbstractModel protected $table = 'user_social_accounts'; - protected $dates = ['deleted_at']; + protected function casts(): array + { + return [ + 'deleted_at' => 'datetime', + ]; + } /** * @return BelongsTo diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 9242dee7..b77b558f 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -4,6 +4,9 @@ namespace App\Providers; use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\Schema; +use Illuminate\Cache\RateLimiting\Limit; +use Illuminate\Http\Request; +use Illuminate\Support\Facades\RateLimiter; class AppServiceProvider extends ServiceProvider { @@ -25,5 +28,9 @@ class AppServiceProvider extends ServiceProvider public function boot() { Schema::defaultStringLength(191); + + RateLimiter::for('api', function (Request $request) { + return Limit::perMinute(300)->by($request->user()?->id ?: $request->ip()); + }); } } diff --git a/app/Providers/RouteServiceProvider.php b/app/Providers/RouteServiceProvider.php deleted file mode 100644 index 93a3056f..00000000 --- a/app/Providers/RouteServiceProvider.php +++ /dev/null @@ -1,68 +0,0 @@ -configureRateLimiting(); - - $this->routes(function () { - Route::prefix('api') - ->middleware('api') - ->namespace($this->namespace) - ->group(base_path('routes/api.php')); - - Route::prefix('public/api') - ->middleware('apipub') - ->namespace($this->namespace) - ->group(base_path('routes/apipub.php')); - - Route::middleware('web') - ->namespace($this->namespace) - ->group(base_path('routes/web.php')); - }); - } - - /** - * Configure the rate limiters for the application. - * - * @return void - */ - protected function configureRateLimiting() - { - RateLimiter::for('api', function (Request $request) { - return Limit::perMinute(60)->by(optional($request->user())->id ?: $request->ip()); - }); - } -} diff --git a/bootstrap/app.php b/bootstrap/app.php index 037e17df..9a8658d0 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -11,45 +11,205 @@ | */ -$app = new Illuminate\Foundation\Application( - $_ENV['APP_BASE_PATH'] ?? dirname(__DIR__) -); +use Illuminate\Foundation\Application; +use Illuminate\Foundation\Configuration\Exceptions; +use Illuminate\Foundation\Configuration\Middleware; +use Illuminate\Console\Scheduling\Schedule; +use Illuminate\Support\Facades\Route; +use App\Classes\ValueObjects\Response\ApiResponseObject; +use App\Classes\ValueObjects\Constants\HttpStatus; +use Illuminate\Auth\AuthenticationException; -/* -|-------------------------------------------------------------------------- -| Bind Important Interfaces -|-------------------------------------------------------------------------- -| -| Next, we need to bind some important interfaces into the container so -| we will be able to resolve them when needed. The kernels serve the -| incoming requests to this application from both the web and CLI. -| -*/ +return Application::configure(basePath: dirname(__DIR__)) + ->withRouting( + web: __DIR__ . '/../routes/web.php', + api: __DIR__ . '/../routes/api.php', + commands: __DIR__ . '/../routes/console.php', + health: '/up', + then: function () { + Route::prefix('public/api') + ->middleware('apipub') + ->group(base_path('routes/apipub.php')); + }, + ) -$app->singleton( - Illuminate\Contracts\Http\Kernel::class, - App\Http\Kernel::class -); + ->withMiddleware(function (Middleware $middleware) { + // '*' trusts all proxies, required for correct IP/HTTPS detection behind AWS ALB/Vapor + $middleware->trustProxies(at: '*'); -$app->singleton( - Illuminate\Contracts\Console\Kernel::class, - App\Console\Kernel::class -); + $middleware->web(append: [ + \App\Http\Middleware\LogRequestPathMiddleware::class, + ]); -$app->singleton( - Illuminate\Contracts\Debug\ExceptionHandler::class, - App\Exceptions\Handler::class -); + $middleware->api(append: [ + \App\Http\Middleware\LogRequestPathMiddleware::class, + ]); -/* -|-------------------------------------------------------------------------- -| Return The Application -|-------------------------------------------------------------------------- -| -| This script returns the application instance. The instance is given to -| the calling script so we can separate the building of the instances -| from the actual running of the application and sending responses. -| -*/ + $middleware->api(prepend: [ + 'throttle:300,1', + ]); -return $app; + $middleware->validateCsrfTokens(except: [ + 'move-order/api/move', + ]); + + $middleware->alias([ + 'valid.token' => \App\Http\Middleware\ValidateToken::class, + 'token.check' => \App\Http\Middleware\TokenCheckerMiddleware::class, + 'auth.check' => \App\Http\Middleware\CheckAuthorizationMiddleware::class, + 'storage.invoice.check.byorder' => \App\Http\Middleware\CheckForStorageInvoiceByOrderId::class, + 'storage.invoice.check.bytransaction' => \App\Http\Middleware\CheckForStorageInvoiceByTransactionId::class, + 'storage.invoice.check.bytransactions' => \App\Http\Middleware\CheckForStorageInvoiceByTransactions::class, + 'storage.invoice.check.bygroup' => \App\Http\Middleware\CheckForStorageInvoiceByGroup::class, + 'storage.invoice.check.bypackinglists' => \App\Http\Middleware\CheckForStorageInvoiceByPackingLists::class, + 'admin' => \App\Http\Middleware\EnsureUserIsAdmin::class, + ]); + + $middleware->appendToGroup('apipub', [ + \Illuminate\Routing\Middleware\SubstituteBindings::class, + \App\Http\Middleware\LogRequestPathMiddleware::class, + ]); + + + }) + ->withExceptions(function (Exceptions $exceptions) { + $exceptions->render(function (AuthenticationException $e, $request) { + if ($request->expectsJson()) { + return (new ApiResponseObject('Authentication', 'To keep your account secure, we need to re-validate it.', HttpStatus::ACCESS_UNAUTHORISED))->handler(); + } + }); + + // Don't flash these inputs + $exceptions->dontFlash([ + 'password', + 'password_confirmation', + ]); + + // $exceptions->render(function (MaintenanceModeException $e, $request) { + // return response()->view('pages.errors.maintenance'); + // }); + }) + ->withCommands([ + __DIR__ . '/../app/Console/Commands', + __DIR__ . '/../app/Console/Commands/V2', + ]) + ->withSchedule(function (Schedule $schedule) { + //Commands Version 2: Laravel Vapor with AWS + $isEnabled = env('COMMANDS_V2_ENABLED', false); + if ($isEnabled) { + // $schedule->command('dummy-command') + // ->everyFiveMinutes() + // ->withoutOverlapping(); + + $schedule->command('housekeeping-s3-files-command') + ->dailyAt('01:00') + ->withoutOverlapping(); + + $schedule->command('password-reset-token-expriration-check-command') + ->everySixHours() + ->withoutOverlapping(); + + $schedule->command('new-user-registration-expire-check-command') + ->everySixHours() + ->withoutOverlapping(); + + if (env('APP_ENV') === 'production') { + $schedule->command('curl-vt-command') + ->cron('0 8 * * *') + ->withoutOverlapping(); + + // $schedule->command('curl-yd-order-list-command') + // ->cron('0 9-18/3 * * *') + // ->withoutOverlapping(); + + $schedule->command('process-yd-by-traking-no-data-command') + ->cron('0 8,11,14,17 * * *') + ->withoutOverlapping(); + + $schedule->command('process-yd-portal-data-command') + ->cron('0 9,12,15,18 * * *') //->cron('0 9-18/3 * * *') + ->withoutOverlapping(); + + $schedule->command('fix-packinglist-command') + ->cron('30 9-18/3 * * *') + ->withoutOverlapping(); + + $schedule->command('fix-duplicate-container-reference-command') + ->cron('0 1 * * *') + ->withoutOverlapping(); + + $schedule->command('invoice-generate-command') + // ->hourly() + ->cron('0 0-8,10-11,13-14,16-17,19-23 * * *') + ->withoutOverlapping(); + + $schedule->command('billplz-failed-callback-fix-command') + ->hourly() + ->withoutOverlapping(); + + $schedule->command('check-storage-invoices-group-transactions-command') + ->dailyAt('0:01') + ->withoutOverlapping(); + + $schedule->command('permits-reminder-send-command') + ->dailyAt('09:30') + ->withoutOverlapping(); + + $schedule->command('process-delayed-jobs-command') + ->everyFiveMinutes() + ->withoutOverlapping(); + } elseif (env('APP_ENV') === 'development') { + $schedule->command('process-delayed-jobs-command') + ->everyTwoHours() + ->withoutOverlapping(); + } + } + //Commands Version 1: Before AWS + else { + $schedule->command('command:curlVTCommand') + ->cron('0 8 * * *') + ->withoutOverlapping() + ->appendOutputTo(storage_path() . '/logs/curlvt.log'); + + $schedule->command('command:curlYdOrderListCommand') + ->cron('0 9-18/3 * * *') + ->withoutOverlapping() + ->appendOutputTo(storage_path() . '/logs/curlyd.log'); + + $schedule->command('fix-packinglist') + ->cron('30 9-18/3 * * *') + ->withoutOverlapping() + ->appendOutputTo(storage_path() . '/logs/fix_packinglist.log'); + + // $schedule->command('command:curlYdOrderListCommand') + // ->cron('0 9 * * *') + // ->withoutOverlapping() + // ->appendOutputTo(storage_path().'/logs/departure_email.log'); + + $schedule->command('fix-duplicate-container-reference') + ->cron('0 1 * * *') + ->withoutOverlapping() + ->appendOutputTo(storage_path() . '/logs/fix_duplicate_container_reference.log'); + + $schedule->command('invoice:generate') + ->hourly() + ->withoutOverlapping() + ->appendOutputTo(storage_path() . '/logs/auto_generate_invoice.log'); + + $schedule->command('billplz-failed-callback:fix') + ->hourly() + ->withoutOverlapping() + ->appendOutputTo(storage_path() . '/logs/fix_failed_callback_from_billplz.log'); + + $schedule->command('check-storage-invoices-group-transactions') + ->dailyAt('0:01') + ->withoutOverlapping() + ->appendOutputTo(storage_path() . '/logs/check_storage_invoices.log'); + + $schedule->command('permitsReminder:send') + ->dailyAt('09:30') + ->withoutOverlapping() + ->appendOutputTo(storage_path() . '/logs/permits-reminder-send.log'); + } + }) + ->create(); diff --git a/composer.json b/composer.json index 5a8fcb67..8fe14eaf 100644 --- a/composer.json +++ b/composer.json @@ -2,38 +2,42 @@ "name": "laravel/laravel", "type": "project", "description": "The Laravel Framework.", - "keywords": ["framework", "laravel"], + "keywords": [ + "framework", + "laravel" + ], "license": "MIT", "require": { - "php": "^7.3", - "ext-fileinfo": "^7.3", + "php": "^8.3", + "ext-fileinfo": "*", "ext-json": "*", - "barryvdh/laravel-dompdf": "^0.9.0", + "barryvdh/laravel-dompdf": "^3.0", "carlos-meneses/laravel-mpdf": "^2.1", "doctrine/dbal": "^3.1", - "fideloper/proxy": "^4.4", - "fruitcake/laravel-cors": "^2.0", - "guzzlehttp/guzzle": "^7.0.1", - "intervention/image": "^2.5", - "laravel/framework": "^8.40", - "laravel/tinker": "^2.5", + "guzzlehttp/guzzle": "^7.2", + "intervention/image": "^3.0", + "laravel/framework": "^12.0", + "laravel/tinker": "^2.9", "laravel/vapor-cli": "^1.60", "laravel/vapor-core": "^2.33", + "league/flysystem-aws-s3-v3": "^3.0", "maatwebsite/excel": "^3.1", - "maxbanton/cwh": "^2.0", - "rinvex/countries": "^6.1", - "spatie/laravel-activitylog": "^3.14", - "spatie/laravel-permission": "^4.2", - "staudenmeir/eloquent-has-many-deep": "^1.7", - "tymon/jwt-auth": "^1.0" + "phpnexus/cwh": "^3.0", + "rinvex/countries": "^9.0", + "spatie/laravel-activitylog": "^4.8", + "spatie/laravel-permission": "^6.0", + "staudenmeir/eloquent-has-many-deep": "^1.19", + "symfony/http-client": "^7.4", + "symfony/mailgun-mailer": "^7.4", + "tymon/jwt-auth": "^2.1" }, "require-dev": { - "facade/ignition": "^2.5", - "fakerphp/faker": "^1.9.1", - "laravel/sail": "^1.0.1", - "mockery/mockery": "^1.4.2", - "nunomaduro/collision": "^5.0", - "phpunit/phpunit": "^9.3.3" + "spatie/laravel-ignition": "^3.0", + "fakerphp/faker": "^1.23", + "laravel/sail": "^1.26", + "mockery/mockery": "^1.6", + "nunomaduro/collision": "^8.0", + "phpunit/phpunit": "^11.0" }, "autoload": { "psr-4": { @@ -67,10 +71,7 @@ "config": { "optimize-autoloader": true, "preferred-install": "dist", - "sort-packages": true, - "audit": { - "block-insecure": false - } + "sort-packages": true }, "minimum-stability": "dev", "prefer-stable": true diff --git a/config/app.php b/config/app.php index 51e32dcb..0a172a8e 100644 --- a/config/app.php +++ b/config/app.php @@ -173,7 +173,6 @@ return [ App\Providers\AuthServiceProvider::class, // App\Providers\BroadcastServiceProvider::class, App\Providers\EventServiceProvider::class, - App\Providers\RouteServiceProvider::class, // Third Parties Spatie\Permission\PermissionServiceProvider::class, @@ -232,7 +231,7 @@ return [ 'URL' => Illuminate\Support\Facades\URL::class, 'Validator' => Illuminate\Support\Facades\Validator::class, 'View' => Illuminate\Support\Facades\View::class, - 'PDF' => Barryvdh\DomPDF\Facade::class, + 'PDF' => Barryvdh\DomPDF\Facade\Pdf::class, 'MPDF' => Mccarlosen\LaravelMpdf\Facades\LaravelMpdf::class, 'Excel' => Maatwebsite\Excel\Facades\Excel::class, ], diff --git a/config/cors.php b/config/cors.php index 8a39e6da..cf914da3 100644 --- a/config/cors.php +++ b/config/cors.php @@ -15,7 +15,7 @@ return [ | */ - 'paths' => ['api/*', 'sanctum/csrf-cookie'], + 'paths' => ['api/*', 'public/api/*', 'sanctum/csrf-cookie'], 'allowed_methods' => ['*'], @@ -29,6 +29,6 @@ return [ 'max_age' => 0, - 'supports_credentials' => false, + 'supports_credentials' => false, //cief todo: 137 ]; diff --git a/config/filesystems.php b/config/filesystems.php index e43f4a88..f25e6e3f 100644 --- a/config/filesystems.php +++ b/config/filesystems.php @@ -13,7 +13,7 @@ return [ | */ - 'default' => env('FILESYSTEM_DRIVER', 'local'), + 'default' => env('FILESYSTEM_DISK', env('FILESYSTEM_DRIVER', 'local')), /* |-------------------------------------------------------------------------- @@ -58,6 +58,7 @@ return [ 'url' => env('AWS_URL'), 'endpoint' => env('AWS_ENDPOINT'), 'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false), + 'throw' => false, ], ], diff --git a/config/logging.php b/config/logging.php index 65217053..90c48e6d 100644 --- a/config/logging.php +++ b/config/logging.php @@ -245,6 +245,30 @@ return [ 'level' => 'debug', 'groupNamePrefix' => env('CLOUDWATCH_LOGGROUP_PREFIX'), ], + + 'request_path' => [ + 'driver' => 'single', + 'path' => storage_path('logs/laravel_request_path.log'), + 'level' => 'info', + ], + + 'request_path_vapor' => [ + 'driver' => 'custom', + 'via' => \App\Logging\CloudWatchLoggerFactory::class, + 'formatter' => Monolog\Formatter\JsonFormatter::class, + 'cloudwatch_stream_name' => 'request_path_vapor', + 'sdk' => [ + 'region' => env('AWS_MY_REGION'), + 'version' => 'latest', + 'credentials' => [ + 'key' => env('AWS_CW_ACCESS'), + 'secret' => env('AWS_CW_SECRET') + ] + ], + 'retention' => env('APP_ENV') === 'production' ? 90 : 14, + 'level' => 'debug', + 'groupNamePrefix' => env('CLOUDWATCH_LOGGROUP_PREFIX'), + ], ], ]; diff --git a/database/migrations/2024_01_23_233651_add_is_waived_to_transactions_logs_table.php b/database/migrations/2024_01_23_233651_add_is_waived_to_transactions_logs_table.php index 6755dcef..f4404bfe 100644 --- a/database/migrations/2024_01_23_233651_add_is_waived_to_transactions_logs_table.php +++ b/database/migrations/2024_01_23_233651_add_is_waived_to_transactions_logs_table.php @@ -8,25 +8,57 @@ class AddIsWaivedToTransactionsLogsTable extends Migration { /** * Run the migrations. - * - * @return void */ public function up() { - Schema::table('transaction_logs', function (Blueprint $table) { - $table->boolean('is_waived')->nullable()->after('status')->default(false); - }); + if (!Schema::hasTable('transaction_logs')) { + // Create the table from scratch + Schema::create('transaction_logs', function (Blueprint $table) { + $table->bigIncrements('id'); + $table->bigInteger('transaction_id'); + $table->string('owner_type', 250); + $table->unsignedBigInteger('owner_id'); + $table->string('type')->default('1'); + $table->unsignedBigInteger('issuer'); + $table->unsignedBigInteger('receiver'); + $table->unsignedBigInteger('recipient_bank_account_id'); + $table->string('payment_method')->nullable(); + $table->string('payment_reference')->nullable(); + $table->string('bill_no'); + $table->decimal('amount', 25, 5)->default(0); + $table->decimal('original_amount', 25, 5)->default(0); + $table->unsignedBigInteger('currency_id'); + $table->unsignedBigInteger('original_currency_id'); + $table->decimal('currency_rate', 14, 5)->default(0); + $table->decimal('tax', 14, 5)->default(0); + $table->decimal('service_charge', 14, 5)->default(0); + $table->timestamp('expires_on')->nullable(); + $table->integer('status')->default(0); + $table->boolean('is_waived')->default(false); + $table->softDeletes(); + $table->timestamps(); + }); + } else { + // Add the column if the table exists + Schema::table('transaction_logs', function (Blueprint $table) { + if (!Schema::hasColumn('transaction_logs', 'is_waived')) { + $table->boolean('is_waived')->nullable()->after('status')->default(false); + } + }); + } } /** * Reverse the migrations. - * - * @return void */ public function down() { - Schema::table('transaction_logs', function (Blueprint $table) { - $table->dropColumn('is_waived'); - }); + if (Schema::hasTable('transaction_logs')) { + Schema::table('transaction_logs', function (Blueprint $table) { + if (Schema::hasColumn('transaction_logs', 'is_waived')) { + $table->dropColumn('is_waived'); + } + }); + } } } diff --git a/database/migrations/2026_02_07_181633_add_event_column_to_activity_log_table.php b/database/migrations/2026_02_07_181633_add_event_column_to_activity_log_table.php new file mode 100644 index 00000000..0b112026 --- /dev/null +++ b/database/migrations/2026_02_07_181633_add_event_column_to_activity_log_table.php @@ -0,0 +1,32 @@ +table(config('activitylog.table_name'), function (Blueprint $table) { + $table->string('event')->nullable()->after('subject_type'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) { + $table->dropColumn('event'); + }); + } +} diff --git a/database/migrations/2026_02_07_181704_add_batch_uuid_column_to_activity_log_table.php b/database/migrations/2026_02_07_181704_add_batch_uuid_column_to_activity_log_table.php new file mode 100644 index 00000000..a5a45b36 --- /dev/null +++ b/database/migrations/2026_02_07_181704_add_batch_uuid_column_to_activity_log_table.php @@ -0,0 +1,32 @@ +table(config('activitylog.table_name'), function (Blueprint $table) { + $table->uuid('batch_uuid')->nullable()->after('properties'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::connection(config('activitylog.database_connection'))->table(config('activitylog.table_name'), function (Blueprint $table) { + $table->dropColumn('batch_uuid'); + }); + } +} diff --git a/development.Dockerfile b/development.Dockerfile index 53dee762..40e0e69d 100644 --- a/development.Dockerfile +++ b/development.Dockerfile @@ -1,3 +1,3 @@ -FROM laravelphp/vapor:php74 +FROM laravelphp/vapor:php83 COPY . /var/task diff --git a/docker-setup/Dockerfile b/docker-setup/Dockerfile index 13ce0249..c530f2d0 100644 --- a/docker-setup/Dockerfile +++ b/docker-setup/Dockerfile @@ -1,4 +1,4 @@ -FROM php:7.4-fpm +FROM php:8.3-fpm WORKDIR /var/www/html @@ -18,10 +18,10 @@ RUN apt-get update && apt-get install -y \ && docker-php-ext-install zip \ && docker-php-ext-install bcmath -COPY --from=composer:1.9.3 /usr/bin/composer /usr/bin/composer +COPY --from=composer:latest /usr/bin/composer /usr/bin/composer #NODEJS & NPM -RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - +RUN curl -sL https://deb.nodesource.com/setup_16.x | bash - RUN apt-get -y install nodejs RUN chown -R www-data:www-data /var/www diff --git a/docker-setup/docker-compose.yml b/docker-setup/docker-compose.yml index f9b9b4fa..fdc72d51 100644 --- a/docker-setup/docker-compose.yml +++ b/docker-setup/docker-compose.yml @@ -1,13 +1,13 @@ version: '3' networks: - shipping-portal-staging: + shipping-portal-development: services: ################################################################# nginx: image: nginx:stable-alpine - container_name: shipping-portal-ngnix + container_name: shipping-portal-2-ngnix ports: - "8081:80" volumes: @@ -17,11 +17,11 @@ services: - php - mysql networks: - - shipping-portal-staging + - shipping-portal-development ################################################################# mysql: image: mysql:5.7.29 - container_name: shipping-portal-mysql + container_name: shipping-portal-2-mysql restart: unless-stopped tty: true ports: @@ -36,19 +36,19 @@ services: volumes: - mysql-data:/var/lib/mysql networks: - - shipping-portal-staging + - shipping-portal-development ################################################################# php: build: context: . dockerfile: Dockerfile - container_name: shipping-portal-php + container_name: shipping-portal-2-php volumes: - ../:/var/www/html ports: - "9001:9000" networks: - - shipping-portal-staging + - shipping-portal-development ################################################################# volumes: diff --git a/phpunit.ci.xml b/phpunit.ci.xml new file mode 100644 index 00000000..22a0074d --- /dev/null +++ b/phpunit.ci.xml @@ -0,0 +1,35 @@ + + + + + ./tests/Unit + + + ./tests/Feature + + + + + + + + + + + + + + + + + ./app + + + diff --git a/phpunit.xml b/phpunit.xml index 4ae4d979..82188200 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -1,31 +1,27 @@ - - - - ./tests/Unit - - - ./tests/Feature - - - - - ./app - - - - - - - - - - - - - + + + + ./tests/Unit + + + ./tests/Feature + + + + + + + + + + + + + + + + ./app + + diff --git a/phpunit.xml.bak b/phpunit.xml.bak new file mode 100644 index 00000000..4ae4d979 --- /dev/null +++ b/phpunit.xml.bak @@ -0,0 +1,31 @@ + + + + + ./tests/Unit + + + ./tests/Feature + + + + + ./app + + + + + + + + + + + + + + diff --git a/production.Dockerfile b/production.Dockerfile index 53dee762..40e0e69d 100644 --- a/production.Dockerfile +++ b/production.Dockerfile @@ -1,3 +1,3 @@ -FROM laravelphp/vapor:php74 +FROM laravelphp/vapor:php83 COPY . /var/task diff --git a/resources/assets/vue/components/orders/sections/OrderSectionComponent.vue b/resources/assets/vue/components/orders/sections/OrderSectionComponent.vue index 029b0127..660bba93 100644 --- a/resources/assets/vue/components/orders/sections/OrderSectionComponent.vue +++ b/resources/assets/vue/components/orders/sections/OrderSectionComponent.vue @@ -111,7 +111,7 @@
-
+
diff --git a/resources/views/errors/503.blade.php b/resources/views/errors/503.blade.php index 54e11d89..2faef108 100644 --- a/resources/views/errors/503.blade.php +++ b/resources/views/errors/503.blade.php @@ -19,6 +19,11 @@ box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); } +
@@ -26,6 +31,8 @@ Maintenance

{{ config('maintenance.message') }}

— CIEF IZYIM

+ + Go Back Home
diff --git a/resources/views/pages/accounts/reset_password.blade.php b/resources/views/pages/accounts/reset_password.blade.php index c624eb7d..a2ed68ee 100644 --- a/resources/views/pages/accounts/reset_password.blade.php +++ b/resources/views/pages/accounts/reset_password.blade.php @@ -53,7 +53,7 @@
-
+
diff --git a/routes/account.php b/routes/account.php index 20d9cf4f..41658625 100644 --- a/routes/account.php +++ b/routes/account.php @@ -1,48 +1,66 @@ 'account', 'namespace' => 'Accounts', 'as' => 'account.'], function () { +Route::group(['prefix' => 'account', 'as' => 'account.'], function () { - Route::post('/registration', 'CreateCustomerController@create')->name('registration.register'); - Route::post('/invite/registration', 'CreateInvitedCustomerController@create')->name('registration.invite.register'); + Route::post('/registration', [CreateCustomerController::class, 'create'])->name('registration.register'); + Route::post('/invite/registration', [CreateInvitedCustomerController::class, 'create'])->name('registration.invite.register'); Route::group(['prefix' => 'authentication', 'as' => 'authentication.'], function () { Route::group(['prefix' => 'login', 'as' => 'authenticate.'], function () { - Route::post('/attempt', 'UserAuthenticationController@authenticate')->name('attempt'); + Route::post('/attempt', [UserAuthenticationController::class, 'authenticate'])->name('attempt'); - Route::post('/cross-attempt', 'UserCrossAuthenticationController@authenticate')->name('cross.attempt'); + Route::post('/cross-attempt', [UserCrossAuthenticationController::class, 'authenticate'])->name('cross.attempt'); - Route::post('/check_email', 'CheckEmailController@check')->name('email.check'); + Route::post('/check_email', [CheckEmailController::class, 'check'])->name('email.check'); }); Route::group(['middleware' => 'valid.token'], function () { - Route::get('/logout', 'UserAuthenticationLogoutController@logout')->name('logout'); - Route::get('/refresh', 'RefreshAuthenticationTokenController@refresh')->name('refresh'); + Route::get('/logout', [UserAuthenticationLogoutController::class, 'logout'])->name('logout'); + Route::get('/refresh', [RefreshAuthenticationTokenController::class, 'refresh'])->name('refresh'); }); Route::group(['prefix' => 'password', 'as' => 'password.'], function () { - Route::post('/forget', 'GeneratePasswordResetController@generate')->name('forget'); - Route::post('/reset', 'ResetPasswordController@reset')->name('reset'); + Route::post('/forget', [GeneratePasswordResetController::class, 'generate'])->name('forget'); + Route::post('/reset', [ResetPasswordController::class, 'reset'])->name('reset'); }); }); Route::group(['prefix' => 'email', 'as' => 'email.'], function () { - Route::post('/verify', 'UserEmailVerificationController@verify')->name('verify'); - Route::post('/verification/resend', 'ResendEmailVerificationController@resend')->name('verification.resend'); + Route::post('/verify', [UserEmailVerificationController::class, 'verify'])->name('verify'); + Route::post('/verification/resend', [ResendEmailVerificationController::class, 'resend'])->name('verification.resend'); }); Route::group(['middleware' => 'valid.token', 'prefix' => 'user', 'as' => 'user.'], function () { - Route::get('/email/{email}', 'FetchUserByEmailController@fetch')->name('company'); - Route::post('/show', 'FetchUserController@fetch')->name('show'); - Route::get('/list', 'ListUsersController@list')->name('list'); - Route::put('/update/{id}', 'UpdateUserController@update')->name('update'); - Route::post('/admin/create', 'CreateAdminUserController@create')->name('admin.create'); - Route::delete('/delete/{id}', 'DeleteUserController@delete')->name('delete'); + Route::get('/email/{email}', [FetchUserByEmailController::class, 'fetch'])->name('company'); + Route::post('/show', [FetchUserController::class, 'fetch'])->name('show'); + Route::get('/list', [ListUsersController::class, 'list'])->name('list'); + Route::put('/update/{id}', [UpdateUserController::class, 'update'])->name('update'); + Route::post('/admin/create', [CreateAdminUserController::class, 'create'])->name('admin.create'); + Route::delete('/delete/{id}', [DeleteUserController::class, 'delete'])->name('delete'); - Route::put('/update/{id}/role', 'UpdateUserRoleController@update')->name('update.role'); + Route::put('/update/{id}/role', [UpdateUserRoleController::class, 'update'])->name('update.role'); }); }); diff --git a/routes/address.php b/routes/address.php index 8b166712..d4145551 100644 --- a/routes/address.php +++ b/routes/address.php @@ -1,42 +1,56 @@ 'address', 'as' => 'address.'], function () { -Route::group(['prefix' => 'address', 'as' => 'address.', 'namespace' => 'Addresses'], function () { + Route::get('/{id}/show', [FetchAddressController::class, 'fetch'])->name('show'); - Route::get('/{id}/show', 'FetchAddressController@fetch')->name('show'); + Route::get('/list', [ListAddressesController::class, 'list'])->name('list'); - Route::get('/list', 'ListAddressesController@list')->name('list'); + Route::get('district/list', [ListDistrictsController::class, 'list'])->name('district.list'); - Route::get('district/list', 'ListDistrictsController@list')->name('district.list'); + Route::get('state/list', [ListStatesController::class, 'list'])->name('state.list'); - Route::get('state/list', 'ListStatesController@list')->name('state.list'); + Route::post('/create', [CreateAddressController::class, 'create'])->name('create'); - Route::post('/create', 'CreateAddressController@create')->name('create'); - - Route::post('billingAddress/create', 'CreateBillingAddressController@create')->name('billingAddress.create'); + Route::post('billingAddress/create', [CreateBillingAddressController::class, 'create'])->name('billingAddress.create'); - Route::put('/update/{id}', 'UpdateAddressController@update')->name('update'); + Route::put('/update/{id}', [UpdateAddressController::class, 'update'])->name('update'); - Route::put('/{id}/default', 'SetAddressToDefaultController@update')->name('default'); + Route::put('/{id}/default', [SetAddressToDefaultController::class, 'update'])->name('default'); - Route::delete('/delete/{id}', 'DeleteAddressController@destroy')->name('delete'); + Route::delete('/delete/{id}', [DeleteAddressController::class, 'destroy'])->name('delete'); }); - Route::group(['prefix' => 'service_type', 'as' => 'service_type.', 'namespace' => 'ServiceTypes'], function () { +Route::group(['prefix' => 'service_type', 'as' => 'service_type.'], function () { - Route::get('/{id}/show', 'FetchServiceTypeController@fetch')->name('show'); + Route::get('/{id}/show', [FetchServiceTypeController::class, 'fetch'])->name('show'); - Route::get('/list', 'ListServiceTypesController@list')->name('list'); + Route::get('/list', [ListServiceTypesController::class, 'list'])->name('list'); - Route::post('/create', 'CreateServiceTypeController@create')->name('create'); + Route::post('/create', [CreateServiceTypeController::class, 'create'])->name('create'); - Route::put('/update/{id}', 'UpdateServiceTypeController@update')->name('update'); + Route::put('/update/{id}', [UpdateServiceTypeController::class, 'update'])->name('update'); - Route::put('/status/{id}/{status}', 'UpdateServiceTypeStatusController@activate')->where('status', 'active|inactive')->name('status'); + Route::put('/status/{id}/{status}', [UpdateServiceTypeStatusController::class, 'activate'])->where('status', 'active|inactive')->name('status'); - Route::delete('/delete/{id}', 'DeleteServiceTypeController@destroy')->name('delete'); + Route::delete('/delete/{id}', [DeleteServiceTypeController::class, 'destroy'])->name('delete'); }); diff --git a/routes/announcement.php b/routes/announcement.php index b6016706..4bd088fa 100644 --- a/routes/announcement.php +++ b/routes/announcement.php @@ -1,15 +1,21 @@ 'announcement', 'as' => 'announcement.', 'namespace' => 'Announcements'], function () { - Route::get('/list', 'ListAnnouncementsController@list')->name('list'); - Route::post('/create', 'CreateAnnouncementController@create')->name('create'); - Route::put('/update/{id}', 'UpdateAnnouncementController@update')->name('update'); - Route::delete('/delete/{id}', 'DeleteAnnouncementController@delete')->name('delete'); - +Route::group(['prefix' => 'announcement', 'as' => 'announcement.'], function () { + Route::get('/list', [ListAnnouncementsController::class, 'list'])->name('list'); + Route::post('/create', [CreateAnnouncementController::class, 'create'])->name('create'); + Route::put('/update/{id}', [UpdateAnnouncementController::class, 'update'])->name('update'); + Route::delete('/delete/{id}', [DeleteAnnouncementController::class, 'delete'])->name('delete'); + Route::group(['prefix' => '{id}/segment', 'as' => 'segment.'], function () { - Route::post('/assign', 'AssignAnnouncementToSegmentController@assign')->name('assign'); - Route::delete('/detach/{segment_id}', 'RemoveSegmentFromAnnouncementController@detach')->name('detach'); + Route::post('/assign', [AssignAnnouncementToSegmentController::class, 'assign'])->name('assign'); + Route::delete('/detach/{segment_id}', [RemoveSegmentFromAnnouncementController::class, 'detach'])->name('detach'); }); }); \ No newline at end of file diff --git a/routes/api.php b/routes/api.php index b5ff08b5..d812f918 100644 --- a/routes/api.php +++ b/routes/api.php @@ -1,5 +1,8 @@ user(); //}); -Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function () { +Route::group(['prefix' => 'v1', 'as' => 'api.'], function () { require __DIR__ . '/account.php'; @@ -29,11 +32,11 @@ Route::group(['middleware' => 'api', 'prefix' => 'v1', 'as' => 'api.'], function Route::group(['middleware' => 'valid.token'], function () { Route::group(['middleware' => 'admin'], function () { //cief maintenance - Route::get('/storage/{fileName}/fetch', 'Documents\RenderDocumentController@fileStorageServe')->where(['fileName' => '.*'])->name('storage.document.file'); + Route::get('/storage/{fileName}/fetch', [RenderDocumentController::class, 'fileStorageServe'])->where(['fileName' => '.*'])->name('storage.document.file'); - Route::post('online_payment/callback', 'Billplz\CallbackBillplzController@callback')->name('online_payment.callback'); + Route::post('online_payment/callback', [CallbackBillplzController::class, 'callback'])->name('online_payment.callback'); - Route::post('/import/update-debtor/f614e339d7058904a831aad742e24d55', 'Imports\ImportUpdateDebtorController@import')->name('debtor.import'); + Route::post('/import/update-debtor/f614e339d7058904a831aad742e24d55', [ImportUpdateDebtorController::class, 'import'])->name('debtor.import'); require __DIR__ . '/company.php'; diff --git a/routes/apipub.php b/routes/apipub.php index 9cdf7a01..1ef6ad7b 100644 --- a/routes/apipub.php +++ b/routes/apipub.php @@ -1,20 +1,26 @@ 'apipub', 'prefix' => 'v1', 'as' => 'apipub.'], function () { +Route::group(['prefix' => 'v1', 'as' => 'apipub.'], function () { Route::group(['middleware' => 'token.check'], function () { - Route::get('transactions/query', 'Transactions\ListTransactionsController@list')->name('transaction.list'); - Route::get('transactions/mappable/query/with-details', 'Transactions\ListMappableTransactionWithDetailsController@list')->name('transaction.mappable.list.with_details'); - Route::get('transactions/mappable/query', 'Transactions\ListMappableTransactionsController@list')->name('transaction.mappable.list'); - Route::get('groups/query', 'Transactions\ListGroupsController@list')->name('group.list'); + Route::get('transactions/query', [ListTransactionsController::class, 'list'])->name('transaction.list'); + Route::get('transactions/mappable/query/with-details', [ListMappableTransactionWithDetailsController::class, 'list'])->name('transaction.mappable.list.with_details'); + Route::get('transactions/mappable/query', [ListMappableTransactionsController::class, 'list'])->name('transaction.mappable.list'); + Route::get('groups/query', [ListGroupsController::class, 'list'])->name('group.list'); - Route::group(['prefix' => 'feedback', 'as' => 'feedback.', 'namespace' => 'HelpMenu'], function () { - Route::post('/generate', 'GenerateFeedbackUrlController@generate')->name('feedback.url.generate'); + Route::group(['prefix' => 'feedback', 'as' => 'feedback.'], function () { + Route::post('/generate', [GenerateFeedbackUrlController::class, 'generate'])->name('feedback.url.generate'); }); - Route::group(['prefix' => 'wac', 'as' => 'wac.', 'namespace' => 'Wac'], function () { - Route::post('/register-email', 'RegisterExchangeEmailController@register')->name('register_email'); + Route::group(['prefix' => 'wac', 'as' => 'wac.'], function () { + Route::post('/register-email', [RegisterExchangeEmailController::class, 'register'])->name('register_email'); }); }); }); diff --git a/routes/bank.php b/routes/bank.php index a17ceb63..4c1fa70d 100644 --- a/routes/bank.php +++ b/routes/bank.php @@ -1,11 +1,16 @@ 'bank', 'as' => 'bank.', 'namespace' => 'Banks'], function () { - Route::get('/list', 'ListBanksController@list')->name('list'); - Route::post('/create', 'CreateBankController@create')->name('create'); - Route::put('/update/{id}', 'UpdateBankController@update')->name('update'); - Route::put('/{id}/default', 'SetBankToDefaultController@update')->name('default'); - Route::delete('/delete/{id}', 'DeleteBankController@delete')->name('delete'); +Route::group(['prefix' => 'bank', 'as' => 'bank.'], function () { + Route::get('/list', [ListBanksController::class, 'list'])->name('list'); + Route::post('/create', [CreateBankController::class, 'create'])->name('create'); + Route::put('/update/{id}', [UpdateBankController::class, 'update'])->name('update'); + Route::put('/{id}/default', [SetBankToDefaultController::class, 'update'])->name('default'); + Route::delete('/delete/{id}', [DeleteBankController::class, 'delete'])->name('delete'); }); \ No newline at end of file diff --git a/routes/company.php b/routes/company.php index 737a23bf..225c09af 100644 --- a/routes/company.php +++ b/routes/company.php @@ -1,47 +1,65 @@ 'company', 'as' => 'company.', 'namespace' => 'Companies'], function () { - Route::get('/{id}/show', 'FetchCompanyController@fetch')->name('show'); - Route::get('/list', 'ListCompaniesController@list')->name('list'); - Route::post('/create', 'CreateCompanyController@create')->name('create'); - Route::put('/update/{id}', 'UpdateCompanyController@update')->name('update'); - Route::delete('/delete/{id}', 'DeleteCompanyController@destroy')->name('delete'); - Route::put('/name-and-debtor/update/{id}', 'UpdateCompanyNameAndDebtorController@update')->name('update.nameAndDebtor'); - Route::post('/update-credit-term/{id}', 'UpdateCompanyCreditTermStatusController@update')->name('update.creditterm.status'); - Route::put('/contact-number/update/{id}', 'UpdateCompanyContactNumberController@update')->name('update.contactNumber'); - Route::post('/contact-number/create', 'CreateCompanyContactNumberController@create')->name('create.contactNumber'); - Route::put('/type/update/{id}', 'UpdateCompanyTypeController@create')->name('update.type'); +Route::group(['prefix' => 'company', 'as' => 'company.'], function () { + Route::get('/{id}/show', [FetchCompanyController::class, 'fetch'])->name('show'); + Route::get('/list', [ListCompaniesController::class, 'list'])->name('list'); + Route::post('/create', [CreateCompanyController::class, 'create'])->name('create'); + Route::put('/update/{id}', [UpdateCompanyController::class, 'update'])->name('update'); + Route::delete('/delete/{id}', [UpdateCompanyController::class, 'destroy'])->name('delete'); + Route::put('/name-and-debtor/update/{id}', [UpdateCompanyNameAndDebtorController::class, 'update'])->name('update.nameAndDebtor'); + Route::post('/update-credit-term/{id}', [UpdateCompanyCreditTermStatusController::class, 'update'])->name('update.creditterm.status'); + Route::put('/contact-number/update/{id}', [UpdateCompanyContactNumberController::class, 'update'])->name('update.contactNumber'); + Route::post('/contact-number/create', [CreateCompanyContactNumberController::class, 'create'])->name('create.contactNumber'); + Route::put('/type/update/{id}', [UpdateCompanyTypeController::class, 'create'])->name('update.type'); - Route::post('/team/create', 'AddNewMemberController@create')->name('team.create'); - Route::post('/team/admin-create', 'AdminAddNewMemberController@create')->name('team.adminCreate'); + Route::post('/team/create', [AddNewMemberController::class, 'create'])->name('team.create'); + Route::post('/team/admin-create', [AdminAddNewMemberController::class, 'create'])->name('team.adminCreate'); -// Route::group(['prefix' => '{id}/segment', 'as' => 'segment.'], function () { + // Route::group(['prefix' => '{id}/segment', 'as' => 'segment.'], function () { // Route::post('/assign', 'AssignCompanyToSegmentController@assign')->name('assign'); // Route::delete('/detach/{segment_id}', 'RemoveCompanyFromSegmentController@detach')->name('detach'); // }); Route::group(['prefix' => '{id}/connection/{company_connection_id}', 'as' => 'connection.'], function () { - Route::post('/assign', 'AssignCompanyConnectionToConnectionSegmentController@assign')->name('assign'); - Route::delete('/detach/{segment_id}', 'RemoveCompanyConnectionFromConnectionSegmentController@detach')->name('detach'); + Route::post('/assign', [AssignCompanyConnectionToConnectionSegmentController::class, 'assign'])->name('assign'); + Route::delete('/detach/{segment_id}', [RemoveCompanyConnectionFromConnectionSegmentController::class, 'detach'])->name('detach'); }); Route::group(['prefix' => '{id}/currency', 'as' => 'currency.'], function () { - Route::post('/convert', 'FetchCompanyBookingQuotationController@fetch')->name('convert'); + Route::post('/convert', [FetchCompanyBookingQuotationController::class, 'fetch'])->name('convert'); }); - Route::put('supplier/{id}/currencies/update', 'UpdateSupplierCurrenciesController@update')->name('supplier.currencies.update'); + Route::put('supplier/{id}/currencies/update', [UpdateSupplierCurrenciesController::class, 'update'])->name('supplier.currencies.update'); Route::group(['prefix' => '{id}/identification', 'as' => 'identification.'], function () { - Route::post('/create', 'CreateIdentificationDocumentController@create')->name('create'); - Route::put('/{document_id}/approval/{status}', 'ApproveIdentificationDocumentController@approve')->where('status', 'approve|reject|pending')->name('approval'); + Route::post('/create', [CreateIdentificationDocumentController::class, 'create'])->name('create'); + Route::put('/{document_id}/approval/{status}', [ApproveIdentificationDocumentController::class, 'approve'])->where('status', 'approve|reject|pending')->name('approval'); }); - Route::get('/module/list', 'ListCompanyModulesController@list')->name('module.list'); + Route::get('/module/list', [ListCompanyModulesController::class, 'list'])->name('module.list'); Route::put('/details/update/{id}', [UpdateCompanyDetailsController::class, 'update'])->name('update.details'); Route::get('/e-invoice/info/{id}', [FetchCompanyEInvoiceInfoController::class, 'fetch'])->name('einvoice.info'); diff --git a/routes/contact.php b/routes/contact.php index 03549a16..4b3b3ab5 100644 --- a/routes/contact.php +++ b/routes/contact.php @@ -1,11 +1,10 @@ 'contact', 'as' => 'contact.'], function () { -Route::group(['prefix' => 'contact', 'as' => 'contact.', 'namespace' => 'Contacts'], function () { - - Route::put('/{id}/update', 'UpdateContactController@update')->name('update'); + Route::put('/{id}/update', [UpdateContactController::class, 'update'])->name('update'); }); - diff --git a/routes/currency.php b/routes/currency.php index 6388f0f2..9e78e391 100644 --- a/routes/currency.php +++ b/routes/currency.php @@ -1,10 +1,14 @@ 'Currencies', 'as' => 'currency.', 'prefix' => 'currency'], function () { - Route::get('/primary/show', 'FetchSystemPrimaryCurrencyController@fetch')->name('primary.show'); - Route::get('/list', 'ListCurrencyController@list')->name('list'); - Route::post('/create', 'CreateCurrencyController@create')->name('create'); - Route::delete('/delete/{id}', 'DeleteCurrencyController@delete')->name('delete'); +Route::group(['as' => 'currency.', 'prefix' => 'currency'], function () { + Route::get('/primary/show', [FetchSystemPrimaryCurrencyController::class, 'fetch'])->name('primary.show'); + Route::get('/list', [ListCurrencyController::class, 'list'])->name('list'); + Route::post('/create', [CreateCurrencyController::class, 'create'])->name('create'); + Route::delete('/delete/{id}', [DeleteCurrencyController::class, 'delete'])->name('delete'); }); diff --git a/routes/delivery.php b/routes/delivery.php index 3fc8b6b5..3688372a 100644 --- a/routes/delivery.php +++ b/routes/delivery.php @@ -1,14 +1,18 @@ 'delivery', 'namespace' => 'Delivery', 'as' => 'delivery.'], function () { - Route::post('/signup', 'CreateDeliveryCustomerController@create')->name('account.registration.register'); +Route::group(['prefix' => 'delivery', 'as' => 'delivery.'], function () { + Route::post('/signup', [CreateDeliveryCustomerController::class, 'create'])->name('account.registration.register'); Route::group(['prefix' => 'order', 'as' => 'order.'], function () { - Route::post('/create', 'CreateDeliveryOrderController@create')->name('create'); - Route::get('/list', 'ListOrdersController@list')->name('list'); - Route::put('/cancel/{id}', 'CancelDeliveryOrderController@cancel')->name('cancel'); + Route::post('/create', [CreateDeliveryOrderController::class, 'create'])->name('create'); + Route::get('/list', [ListOrdersController::class, 'list'])->name('list'); + Route::put('/cancel/{id}', [CancelDeliveryOrderController::class, 'cancel'])->name('cancel'); }); }); diff --git a/routes/document.php b/routes/document.php index 06f6badc..f6faa8d5 100644 --- a/routes/document.php +++ b/routes/document.php @@ -1,11 +1,15 @@ 'document', 'as' => 'document.', 'namespace' => 'Documents'], function () { - Route::get('/list', 'ListDocumentsController@list')->name('list'); - Route::put('/{id}/approve', 'ApproveDocumentController@approve')->name('status.approve'); - Route::put('/{id}/reject', 'RejectDocumentController@reject')->name('status.reject'); +Route::group(['prefix' => 'document', 'as' => 'document.'], function () { + Route::get('/list', [ListDocumentsController::class, 'list'])->name('list'); + Route::put('/{id}/approve', [ApproveDocumentController::class, 'approve'])->name('status.approve'); + Route::put('/{id}/reject', [RejectDocumentController::class, 'reject'])->name('status.reject'); - Route::put('/{id}/reference/update', 'UpdateDocumentReferenceController@update')->name('reference.update'); -}); \ No newline at end of file + Route::put('/{id}/reference/update', [UpdateDocumentReferenceController::class, 'update'])->name('reference.update'); +}); diff --git a/routes/export.php b/routes/export.php index e2d3b6c8..0c74bef4 100644 --- a/routes/export.php +++ b/routes/export.php @@ -5,7 +5,7 @@ use App\Http\Controllers\Imports\ImportController; use Illuminate\Support\Facades\Route; -Route::group(['prefix' => 'export', 'as' => 'export.', 'namespace' => 'Exports'], function () { +Route::group(['prefix' => 'export', 'as' => 'export.'], function () { Route::group(['prefix' => 'companies', 'as' => 'companies.'], function () { Route::get('/customers-data', [ExportController::class, 'companies'])->name('customers-data'); }); @@ -19,7 +19,7 @@ Route::group(['prefix' => 'export', 'as' => 'export.', 'namespace' => 'Exports'] }); }); -Route::group(['prefix' => 'import', 'as' => 'import.', 'namespace' => 'Imports'], function () { +Route::group(['prefix' => 'import', 'as' => 'import.'], function () { Route::post('/sales-invoice', [ImportController::class, 'salesInvoices'])->name('sales_invoices'); Route::post('/offical-receipt', [ImportController::class, 'officialReceipt'])->name('official_receipt'); }); diff --git a/routes/feedback.php b/routes/feedback.php index 9a9b17b5..43c15210 100644 --- a/routes/feedback.php +++ b/routes/feedback.php @@ -1,8 +1,10 @@ 'feedback', 'as' => 'feedback.', 'namespace' => 'HelpMenu'], function () { - Route::post('/list', 'ListQuestionsQAController@list')->name('list.question'); //meant to be publicly assessible WITHOUT login - Route::post('/submit', 'SubmitQAQuestionsController@submit')->name('submit.questions'); //meant to be publicly assessible WITHOUT login +Route::group(['prefix' => 'feedback', 'as' => 'feedback.'], function () { + Route::post('/list', [ListQuestionsQAController::class, 'list'])->name('list.question'); //meant to be publicly assessible WITHOUT login + Route::post('/submit', [SubmitQAQuestionsController::class, 'submit'])->name('submit.questions'); //meant to be publicly assessible WITHOUT login }); diff --git a/routes/help_menu.php b/routes/help_menu.php index c0556b17..e387d970 100644 --- a/routes/help_menu.php +++ b/routes/help_menu.php @@ -1,10 +1,14 @@ 'helpmenu', 'as' => 'helpmenu.', 'namespace' => 'HelpMenu'], function () { - Route::get('/question/{set_id}', 'FetchQuestionQAController@fetch')->name('first.question'); - Route::post('/question', 'UpdateNextQuestionQAController@fetch')->name('next.question'); - Route::post('/generate', 'GenerateFeedbackUrlController@generate')->name('feedback.url.generate'); - Route::get('/list', 'ListQuestionsAnswersQAController@list')->name('list.questions.answers'); +Route::group(['prefix' => 'helpmenu', 'as' => 'helpmenu.'], function () { + Route::get('/question/{set_id}', [FetchQuestionQAController::class, 'fetch'])->name('first.question'); + Route::post('/question', [UpdateNextQuestionQAController::class, 'fetch'])->name('next.question'); + Route::post('/generate', [GenerateFeedbackUrlController::class, 'generate'])->name('feedback.url.generate'); + Route::get('/list', [ListQuestionsAnswersQAController::class, 'list'])->name('list.questions.answers'); }); diff --git a/routes/job.php b/routes/job.php index 028e9468..39409b91 100644 --- a/routes/job.php +++ b/routes/job.php @@ -1,8 +1,9 @@ 'job', 'as' => 'job.', 'namespace' => 'Jobs'], function () { - Route::get('/fetch/{job_id}', 'FetchJobResultController@fetch')->name('fetch'); - Route::get('/fetch/{job_id}/{is_last}', 'FetchJobResultController@fetch')->name('fetch.last.attempt'); +Route::group(['prefix' => 'job', 'as' => 'job.'], function () { + Route::get('/fetch/{job_id}', [FetchJobResultController::class, 'fetch'])->name('fetch'); + Route::get('/fetch/{job_id}/{is_last}', [FetchJobResultController::class, 'fetch'])->name('fetch.last.attempt'); }); diff --git a/routes/order.php b/routes/order.php index 4747f7c3..8b28f635 100644 --- a/routes/order.php +++ b/routes/order.php @@ -2,34 +2,54 @@ use Illuminate\Support\Facades\Route; use App\Http\Controllers\Orders\CreateBatchProcessingAutoCountImportController; +use App\Http\Controllers\Orders\FetchOrderController; +use App\Http\Controllers\Orders\FetchOrderV2Controller; +use App\Http\Controllers\Orders\ListOrdersController; +use App\Http\Controllers\Orders\ListOrdersV2Controller; +use App\Http\Controllers\Orders\CreateOrderController; +use App\Http\Controllers\Orders\ConfirmOrderController; +use App\Http\Controllers\Orders\CancelOrderController; +use App\Http\Controllers\Orders\RestoreOrderController; +use App\Http\Controllers\Orders\RequestChangeOrderAddressController; +use App\Http\Controllers\Orders\UpdateOrderController; +use App\Http\Controllers\Orders\ApproveChangeOrderAddressController; +use App\Http\Controllers\Orders\CreateWarehousePackingListController; +use App\Http\Controllers\Orders\CreateShippingPackingListController; +use App\Http\Controllers\Orders\AssignOrderRemarkController; +use App\Http\Controllers\Orders\ShippingCostController; +use App\Http\Controllers\Orders\FetchOrderPackagesController; +use App\Http\Controllers\Orders\FetchOrderPackagesV2Controller; +use App\Http\Controllers\Orders\CreateSupplierTaxRebateController; +use App\Http\Controllers\Orders\DeleteSupplierTaxRebateController; +use App\Http\Controllers\Orders\ListOrderTrackingController; -Route::group(['prefix' => 'order', 'as' => 'order.', 'namespace' => 'Orders'], function () { - Route::get('/show/{id}', 'FetchOrderController@fetch')->name('show'); - Route::get('/v2/show/{id}', 'FetchOrderV2Controller@fetch')->name('v2.show'); - // Route::get('/v2/show/{id}', 'FetchOrderV2Controller@fetch')->middleware('storage.invoice.check.byorder')->name('v2.show'); - Route::get('/list', 'ListOrdersController@list')->name('list'); - Route::get('/v2/list', 'ListOrdersV2Controller@list')->name('v2.list'); - Route::post('/create', 'CreateOrderController@create')->name('create'); - Route::put('/confirm/{id}', 'ConfirmOrderController@confirm')->name('confirm'); - Route::put('/cancel/{id}', 'CancelOrderController@cancel')->name('cancel'); - Route::put('/restore/{id}', 'RestoreOrderController@restore')->name('restore'); - Route::post('/address/change/request', 'RequestChangeOrderAddressController@request')->name('address.change.request'); - Route::post('/update/{id}','UpdateOrderController@update')->name('reference.update'); - Route::put('/address/{id}/status/{status}', 'ApproveChangeOrderAddressController@approve')->name('address.status.update'); +Route::group(['prefix' => 'order', 'as' => 'order.'], function () { + Route::get('/show/{id}', [FetchOrderController::class, 'fetch'])->name('show'); + Route::get('/v2/show/{id}', [FetchOrderV2Controller::class, 'fetch'])->name('v2.show'); + // Route::get('/v2/show/{id}', [FetchOrderV2Controller::class, 'fetch'])->middleware('storage.invoice.check.byorder')->name('v2.show'); + Route::get('/list', [ListOrdersController::class, 'list'])->name('list'); + Route::get('/v2/list', [ListOrdersV2Controller::class, 'list'])->name('v2.list'); + Route::post('/create', [CreateOrderController::class, 'create'])->name('create'); + Route::put('/confirm/{id}', [ConfirmOrderController::class, 'confirm'])->name('confirm'); + Route::put('/cancel/{id}', [CancelOrderController::class, 'cancel'])->name('cancel'); + Route::put('/restore/{id}', [RestoreOrderController::class, 'restore'])->name('restore'); + Route::post('/address/change/request', [RequestChangeOrderAddressController::class, 'request'])->name('address.change.request'); + Route::post('/update/{id}', [UpdateOrderController::class, 'update'])->name('reference.update'); + Route::put('/address/{id}/status/{status}', [ApproveChangeOrderAddressController::class, 'approve'])->name('address.status.update'); - Route::post('/create-warehouse-packing-list', 'CreateWarehousePackingListController@create')->name('create.warehouse.packing_list'); - Route::post('/create-shipping-packing-list', 'CreateShippingPackingListController@create')->name('create.shipping.packing_list'); + Route::post('/create-warehouse-packing-list', [CreateWarehousePackingListController::class, 'create'])->name('create.warehouse.packing_list'); + Route::post('/create-shipping-packing-list', [CreateShippingPackingListController::class, 'create'])->name('create.shipping.packing_list'); - Route::put('/assign-remark/{id}', 'AssignOrderRemarkController@create')->name('assign.remark'); - Route::get('/{id}/shipping-cost', 'ShippingCostController@calculate')->name('shipping.cost'); - Route::get('/packages/{id}', 'FetchOrderPackagesController@fetch')->name('packages'); - Route::get('/v2/packages/received/{id}', 'FetchOrderPackagesV2Controller@fetchReceived')->name('packages.received.v2'); - Route::get('/v2/packages/{id}', 'FetchOrderPackagesV2Controller@fetch')->name('packages.v2'); + Route::put('/assign-remark/{id}', [AssignOrderRemarkController::class, 'create'])->name('assign.remark'); + Route::get('/{id}/shipping-cost', [ShippingCostController::class, 'calculate'])->name('shipping.cost'); + Route::get('/packages/{id}', [FetchOrderPackagesController::class, 'fetch'])->name('packages'); + Route::get('/v2/packages/received/{id}', [FetchOrderPackagesV2Controller::class, 'fetchReceived'])->name('packages.received.v2'); + Route::get('/v2/packages/{id}', [FetchOrderPackagesV2Controller::class, 'fetch'])->name('packages.v2'); - Route::post('/{id}/supplier-tax-rebate/create', 'CreateSupplierTaxRebateController@create')->name('tax_rebate.create'); - Route::post('/supplier-tax-rebate/{id}/delete', 'DeleteSupplierTaxRebateController@delete')->name('tax_rebate.delete'); + Route::post('/{id}/supplier-tax-rebate/create', [CreateSupplierTaxRebateController::class, 'create'])->name('tax_rebate.create'); + Route::post('/supplier-tax-rebate/{id}/delete', [DeleteSupplierTaxRebateController::class, 'delete'])->name('tax_rebate.delete'); - Route::get('/tracking/list', 'ListOrderTrackingController@list')->name('tracking.list'); + Route::get('/tracking/list', [ListOrderTrackingController::class, 'list'])->name('tracking.list'); Route::group(['prefix' => 'batch/einvoice', 'as' => 'batch.'], function () { Route::get('/process', [CreateBatchProcessingAutoCountImportController::class, 'batchProcess'])->name('process'); diff --git a/routes/packing_list.php b/routes/packing_list.php index 51df0c86..563451ae 100644 --- a/routes/packing_list.php +++ b/routes/packing_list.php @@ -2,28 +2,61 @@ use App\Http\Controllers\PackingLists\ListPackingListsController; use Illuminate\Support\Facades\Route; +use App\Http\Controllers\PackingLists\FetchPackingListController; +use App\Http\Controllers\PackingLists\ListPackingListsJobController; +use App\Http\Controllers\PackingLists\CreatePackingListController; +use App\Http\Controllers\PackingLists\CreateDeliverPackingListController; +use App\Http\Controllers\PackingLists\UpdatePackingListController; +use App\Http\Controllers\PackingLists\UpdatePackingListStatusController; +use App\Http\Controllers\PackingLists\DeletePackingListController; +use App\Http\Controllers\PackingLists\DeletePackingListByPackageIdController; +use App\Http\Controllers\PackingLists\ReschedulePackingListController; +use App\Http\Controllers\PackingLists\UpdateDispatchDatePackingListController; +use App\Http\Controllers\PackingLists\UpdateDropDatePackingListController; +use App\Http\Controllers\PackingLists\CompletePackingListController; +use App\Http\Controllers\PackingLists\AssignPackingListRemarkController; +use App\Http\Controllers\PackingLists\AssignPackingListOrderController; +use App\Http\Controllers\PackingLists\CreateWarehouseTransportController; +use App\Http\Controllers\PackingLists\Containers\FetchContainerController; +use App\Http\Controllers\PackingLists\Containers\ListContainersController; +use App\Http\Controllers\PackingLists\Containers\CreateContainerController; +use App\Http\Controllers\PackingLists\Containers\CreateLoadContainerController; +use App\Http\Controllers\PackingLists\Containers\UpdateContainerController; +use App\Http\Controllers\PackingLists\Containers\DeleteContainerController; +use App\Http\Controllers\PackingLists\Containers\AssignPackingListContainerController; +use App\Http\Controllers\PackingLists\Containers\RescheduleContainerController; +use App\Http\Controllers\PackingLists\Containers\UpdateDispatchDateContainerController; +use App\Http\Controllers\PackingLists\Containers\UpdateDropDateContainerController; +use App\Http\Controllers\PackingLists\Containers\CompleteContainerController; +use App\Http\Controllers\PackingLists\Containers\CreateContainerRemarkController; +use App\Http\Controllers\PackingLists\Packages\FetchPackageController; +use App\Http\Controllers\PackingLists\Packages\ListPackagesController; +use App\Http\Controllers\PackingLists\Packages\CreatePackageController; +use App\Http\Controllers\PackingLists\Packages\UpdatePackageController; +use App\Http\Controllers\PackingLists\Packages\DeletePackageController; +use App\Http\Controllers\PackingLists\Packages\SwitchPackagePackingListController; -Route::group(['namespace' => 'PackingLists', 'as' => 'packing_list.', 'prefix' => 'packing_list'], function () { - Route::get('/{id}/show', 'FetchPackingListController@fetch')->name('show'); - Route::get('/list', 'ListPackingListsController@list')->middleware('storage.invoice.check.bypackinglists')->name('list'); - // Route::get('/list', 'ListPackingListsController@list')->name('list'); - Route::get('/list/job', 'ListPackingListsJobController@list')->name('list.job'); - Route::post('/create', 'CreatePackingListController@create')->name('create'); - Route::post('/create/deliver', 'CreateDeliverPackingListController@create')->name('create.deliver'); +Route::group(['as' => 'packing_list.', 'prefix' => 'packing_list'], function () { + Route::get('/{id}/show', [FetchPackingListController::class, 'fetch'])->name('show'); + Route::get('/list', [ListPackingListsController::class, 'list'])->middleware('storage.invoice.check.bypackinglists')->name('list'); + // Route::get('/list', [ListPackingListsController::class, 'list'])->name('list'); + Route::get('/list/job', [ListPackingListsJobController::class, 'list'])->name('list.job'); + Route::post('/create', [CreatePackingListController::class, 'create'])->name('create'); + Route::post('/create/deliver', [CreateDeliverPackingListController::class, 'create'])->name('create.deliver'); - Route::put('/update/{id}', 'UpdatePackingListController@update')->name('update'); - Route::put('/status/{id}/update/{status}', 'UpdatePackingListStatusController@update')->name('status.update'); - Route::delete('/delete/{id}', 'DeletePackingListController@delete')->name('delete'); - Route::delete('/delete-by-package-id/{id}', 'DeletePackingListByPackageIdController@delete')->name('delete.by_package_id'); + Route::put('/update/{id}', [UpdatePackingListController::class, 'update'])->name('update'); + Route::put('/status/{id}/update/{status}', [UpdatePackingListStatusController::class, 'update'])->name('status.update'); + Route::delete('/delete/{id}', [DeletePackingListController::class, 'delete'])->name('delete'); + Route::delete('/delete-by-package-id/{id}', [DeletePackingListByPackageIdController::class, 'delete'])->name('delete.by_package_id'); - Route::put('/reschedule/{id}', 'ReschedulePackingListController@reschedule')->name('reschedule'); - Route::put('/update-dispatch-date/{id}', 'UpdateDispatchDatePackingListController@update')->name('update_dispatch_date'); - Route::put('/update-drop-date/{id}', 'UpdateDropDatePackingListController@update')->name('update_drop_date'); - Route::put('/complete/{id}', 'CompletePackingListController@complete')->name('complete'); - Route::put('/assign-remark/{id}', 'AssignPackingListRemarkController@create')->name('assign.remark'); - Route::put('/assign-order/{id}/{reference}', 'AssignPackingListOrderController@assign')->name('assign.order'); + Route::put('/reschedule/{id}', [ReschedulePackingListController::class, 'reschedule'])->name('reschedule'); + Route::put('/update-dispatch-date/{id}', [UpdateDispatchDatePackingListController::class, 'update'])->name('update_dispatch_date'); + Route::put('/update-drop-date/{id}', [UpdateDropDatePackingListController::class, 'update'])->name('update_drop_date'); + Route::put('/complete/{id}', [CompletePackingListController::class, 'complete'])->name('complete'); + Route::put('/assign-remark/{id}', [AssignPackingListRemarkController::class, 'create'])->name('assign.remark'); + Route::put('/assign-order/{id}/{reference}', [AssignPackingListOrderController::class, 'assign'])->name('assign.order'); - Route::post('/{id}/warehouse-transport/create', 'CreateWarehouseTransportController@create')->name('warehouse_transport.create'); + Route::post('/{id}/warehouse-transport/create', [CreateWarehouseTransportController::class, 'create'])->name('warehouse_transport.create'); Route::group(['prefix' => 'listing', 'as' => 'listing.'], function () { Route::get('/warehouse-list', [ListPackingListsController::class, 'warehouseList'])->name('warehouse_list'); @@ -33,36 +66,36 @@ Route::group(['namespace' => 'PackingLists', 'as' => 'packing_list.', 'prefix' = Route::get('/paid-invoice-list', [ListPackingListsController::class, 'paidInvoiceList'])->name('paid_invoice'); }); - Route::group(['namespace' => 'Containers', 'prefix' => 'container', 'as' => 'container.'], function () { - Route::get('/{id}/show', 'FetchContainerController@fetch')->name('show'); - Route::get('/list', 'ListContainersController@list')->name('list'); - Route::post('/create', 'CreateContainerController@create')->name('create'); - Route::post('/create/load', 'CreateLoadContainerController@create')->name('create.load'); - Route::put('/update/{id}', 'UpdateContainerController@update')->name('update'); - Route::delete('/delete/{id}', 'DeleteContainerController@delete')->name('delete'); - Route::put('/assign-packing_list/{id}', 'AssignPackingListContainerController@assign')->name('assign.packing_list'); - Route::put('/reschedule/{id}', 'RescheduleContainerController@reschedule')->name('reschedule'); - Route::put('/update-dispatch-date/{id}', 'UpdateDispatchDateContainerController@update')->name('update_dispatch_date'); - Route::put('/update-drop-date/{id}', 'UpdateDropDateContainerController@update')->name('update_drop_date'); - Route::put('/complete/{id}', 'CompleteContainerController@complete')->name('complete'); - Route::post('/{id}/remark/create', 'CreateContainerRemarkController@create')->name('remark.create'); + Route::group(['prefix' => 'container', 'as' => 'container.'], function () { + Route::get('/{id}/show', [FetchContainerController::class, 'fetch'])->name('show'); + Route::get('/list', [ListContainersController::class, 'list'])->name('list'); + Route::post('/create', [CreateContainerController::class, 'create'])->name('create'); + Route::post('/create/load', [CreateLoadContainerController::class, 'create'])->name('create.load'); + Route::put('/update/{id}', [UpdateContainerController::class, 'update'])->name('update'); + Route::delete('/delete/{id}', [DeleteContainerController::class, 'delete'])->name('delete'); + Route::put('/assign-packing_list/{id}', [AssignPackingListContainerController::class, 'assign'])->name('assign.packing_list'); + Route::put('/reschedule/{id}', [RescheduleContainerController::class, 'reschedule'])->name('reschedule'); + Route::put('/update-dispatch-date/{id}', [UpdateDispatchDateContainerController::class, 'update'])->name('update_dispatch_date'); + Route::put('/update-drop-date/{id}', [UpdateDropDateContainerController::class, 'update'])->name('update_drop_date'); + Route::put('/complete/{id}', [CompleteContainerController::class, 'complete'])->name('complete'); + Route::post('/{id}/remark/create', [CreateContainerRemarkController::class, 'create'])->name('remark.create'); }); - Route::group(['namespace' => 'Packages', 'as' => 'package.', 'prefix' => 'package'], function () { - Route::get('/{id}/show', 'FetchPackageController@fetch')->name('show'); - Route::get('/list', 'ListPackagesController@list')->name('list'); - Route::post('/create', 'CreatePackageController@create')->name('create'); - Route::put('/update/{id}', 'UpdatePackageController@update')->name('update'); - Route::delete('/delete/{id}', 'DeletePackageController@delete')->name('delete'); - // Route::get('/inbound-custom-cleared', 'InboundCustomClearedController@list')->name('list.inbound.custom.cleared'); - Route::put('/switch-packing-list/{id}', 'SwitchPackagePackingListController@switch')->name('switch.packing_list'); + Route::group(['as' => 'package.', 'prefix' => 'package'], function () { + Route::get('/{id}/show', [FetchPackageController::class, 'fetch'])->name('show'); + Route::get('/list', [ListPackagesController::class, 'list'])->name('list'); + Route::post('/create', [CreatePackageController::class, 'create'])->name('create'); + Route::put('/update/{id}', [UpdatePackageController::class, 'update'])->name('update'); + Route::delete('/delete/{id}', [DeletePackageController::class, 'delete'])->name('delete'); + // Route::get('/inbound-custom-cleared', [InboundCustomClearedController::class, 'list'])->name('list.inbound.custom.cleared'); + Route::put('/switch-packing-list/{id}', [SwitchPackagePackingListController::class, 'switch'])->name('switch.packing_list'); - Route::group(['namespace' => 'PackageItems', 'prefix' => 'item', 'as' => 'item.'], function () { - // Route::get('/{id}/show', 'FetchPackageItemController@fetch')->name('show'); - // Route::get('/list', 'ListPackageItemsController@list')->name('list'); - // Route::post('/create', 'CreatePackageItemController@create')->name('create'); - // Route::put('/update/{id}', 'UpdatePackageItemController@update')->name('update'); - // Route::delete('/delete/{id}', 'DeletePackageItemController@delete')->name('delete'); + Route::group(['prefix' => 'item', 'as' => 'item.'], function () { + // Route::get('/{id}/show', [FetchPackageItemController::class, 'fetch'])->name('show'); + // Route::get('/list', [ListPackageItemsController::class, 'list'])->name('list'); + // Route::post('/create', [CreatePackageItemController::class, 'create'])->name('create'); + // Route::put('/update/{id}', [UpdatePackageItemController::class, 'update'])->name('update'); + // Route::delete('/delete/{id}', [DeletePackageItemController::class, 'delete'])->name('delete'); }); }); diff --git a/routes/permits_reminder.php b/routes/permits_reminder.php index efad81ce..4e0cff82 100644 --- a/routes/permits_reminder.php +++ b/routes/permits_reminder.php @@ -1,13 +1,18 @@ 'permits-reminder', 'as' => 'permits_reminder.', 'namespace' => 'PermitsReminder'], function () { - Route::get('/list', 'ListPermitsReminderController@list')->name('list'); - Route::post('/create', 'CreatePermitsReminderController@create')->name('create'); - Route::delete('/{id}/delete', 'DeletePermitsReminderController@delete')->name('delete'); - Route::post('/{id}/update', 'UpdatePermitsReminderController@update')->name('update'); +Route::group(['prefix' => 'permits-reminder', 'as' => 'permits_reminder.'], function () { + Route::get('/list', [ListPermitsReminderController::class, 'list'])->name('list'); + Route::post('/create', [CreatePermitsReminderController::class, 'create'])->name('create'); + Route::delete('/{id}/delete', [DeletePermitsReminderController::class, 'delete'])->name('delete'); + Route::post('/{id}/update', [UpdatePermitsReminderController::class, 'update'])->name('update'); }); -Route::post('/import/upload-permits-reminder', 'Imports\ImportPermitsReminderController@import')->name('permits_reminder.upload'); +Route::post('/import/upload-permits-reminder', [ImportPermitsReminderController::class, 'import'])->name('permits_reminder.upload'); diff --git a/routes/receipt.php b/routes/receipt.php index aa532fe8..ecbe4505 100644 --- a/routes/receipt.php +++ b/routes/receipt.php @@ -1,10 +1,10 @@ 'receipt', 'namespace' => 'Receipts', 'as' => 'receipt.'], function () { +Route::group(['prefix' => 'receipt', 'as' => 'receipt.'], function () { - Route::post('/create/{id}', 'CreateReceiptController@create')->name('create'); - //Route::post('/create-transaction/{id}', 'CreateWalletTransactionController@create')->name('create_transaction'); + Route::post('/create/{id}', [CreateReceiptController::class, 'create'])->name('create'); }); \ No newline at end of file diff --git a/routes/remark.php b/routes/remark.php index 91ae4676..ea173592 100644 --- a/routes/remark.php +++ b/routes/remark.php @@ -1,11 +1,16 @@ 'Remarks', 'as' => 'remark.', 'prefix' => 'remark'], function () { - Route::get('/{id}/show', 'FetchRemarkController@fetch')->name('show'); - Route::get('/list', 'ListRemarksController@list')->name('list'); - Route::post('/{id}/create', 'CreateRemarkController@create')->name('create'); - Route::put('/update/{id}', 'UpdateRemarkController@update')->name('update'); - Route::delete('/delete/{id}', 'DeleteRemarkController@delete')->name('delete'); +Route::group(['as' => 'remark.', 'prefix' => 'remark'], function () { + Route::get('/{id}/show', [FetchRemarkController::class, 'fetch'])->name('show'); + Route::get('/list', [ListRemarksController::class, 'list'])->name('list'); + Route::post('/{id}/create', [CreateRemarkController::class, 'create'])->name('create'); + Route::put('/update/{id}', [UpdateRemarkController::class, 'update'])->name('update'); + Route::delete('/delete/{id}', [DeleteRemarkController::class, 'delete'])->name('delete'); }); diff --git a/routes/report.php b/routes/report.php index 905f0115..33da4961 100644 --- a/routes/report.php +++ b/routes/report.php @@ -1,16 +1,17 @@ 'report', 'as' => 'report.', 'namespace' => 'Reports'], function () { - Route::get('/customer/{marking}/{from?}/{to?}', 'MonthlyReportController@customerReport')->name('customer'); +Route::group(['prefix' => 'report', 'as' => 'report.'], function () { + Route::get('/customer/{marking}/{from?}/{to?}', [MonthlyReportController::class, 'customerReport'])->name('customer'); - Route::get('/sales/{from?}/{to?}', 'MonthlyReportController@salesReport')->name('sales'); + Route::get('/sales/{from?}/{to?}', [MonthlyReportController::class, 'salesReport'])->name('sales'); - Route::get('/profit/{model}/{value}/{from?}/{to?}', 'MonthlyReportController@profitModelReport')->name('profit'); + Route::get('/profit/{model}/{value}/{from?}/{to?}', [MonthlyReportController::class, 'profitModelReport'])->name('profit'); - Route::get('/service', 'MonthlyReportController@serviceReport')->name('service'); - Route::get('/service/job', 'MonthlyReportController@serviceReportJob')->name('service.job'); + Route::get('/service', [MonthlyReportController::class, 'serviceReport'])->name('service'); + Route::get('/service/job', [MonthlyReportController::class, 'serviceReportJob'])->name('service.job'); - Route::get('/customers/active', 'MonthlyReportController@customerActivityReport')->name('customerActivity'); + Route::get('/customers/active', [MonthlyReportController::class, 'customerActivityReport'])->name('customerActivity'); }); diff --git a/routes/schedule.php b/routes/schedule.php index 3ac9fca5..e9ecb375 100644 --- a/routes/schedule.php +++ b/routes/schedule.php @@ -1,11 +1,16 @@ 'Schedules', 'as' => 'schedule.', 'prefix' => 'schedule'], function () { - Route::get('/{id}/show', 'FetchScheduleController@fetch')->name('show'); - Route::get('/list', 'ListSchedulesController@list')->name('list'); - Route::post('/create', 'CreateScheduleController@create')->name('create'); - Route::put('/update/{id}', 'UpdateScheduleController@update')->name('update'); - Route::delete('/delete/{id}', 'DeleteScheduleController@delete')->name('delete'); +Route::group(['as' => 'schedule.', 'prefix' => 'schedule'], function () { + Route::get('/{id}/show', [FetchScheduleController::class, 'fetch'])->name('show'); + Route::get('/list', [ListSchedulesController::class, 'list'])->name('list'); + Route::post('/create', [CreateScheduleController::class, 'create'])->name('create'); + Route::put('/update/{id}', [UpdateScheduleController::class, 'update'])->name('update'); + Route::delete('/delete/{id}', [DeleteScheduleController::class, 'delete'])->name('delete'); }); diff --git a/routes/segment.php b/routes/segment.php index c59f4ca9..6f98ba37 100644 --- a/routes/segment.php +++ b/routes/segment.php @@ -1,24 +1,37 @@ 'segment', 'as' => 'segment.', 'namespace' => 'Segments'], function () { - Route::post('/create', 'CreateSegmentController@create')->name('create'); - Route::delete('/delete/{id}', 'DeleteSegmentController@destroy')->name('delete'); - Route::get('/{id}/show', 'FetchSegmentController@fetch')->name('show'); - Route::put('/update/{id}', 'UpdateSegmentController@update')->name('update'); - Route::put('price/update/{id}', 'UpdateSegmentPriceController@update')->name('price.update'); - Route::get('/list', 'ListSegmentsController@list')->name('list'); +Route::group(['prefix' => 'segment', 'as' => 'segment.'], function () { + Route::post('/create', [CreateSegmentController::class, 'create'])->name('create'); + Route::delete('/delete/{id}', [DeleteSegmentController::class, 'destroy'])->name('delete'); + Route::get('/{id}/show', [FetchSegmentController::class, 'fetch'])->name('show'); + Route::put('/update/{id}', [UpdateSegmentController::class, 'update'])->name('update'); + Route::put('price/update/{id}', [UpdateSegmentPriceController::class, 'update'])->name('price.update'); + Route::get('/list', [ListSegmentsController::class, 'list'])->name('list'); - Route::get('/air-shipment/item-price/list', 'ListAirShipmentPriceController@list')->name('air_shipment.price.list'); + Route::get('/air-shipment/item-price/list', [ListAirShipmentPriceController::class, 'list'])->name('air_shipment.price.list'); Route::group(['prefix' => '{id}/constant', 'as' => 'constant.'], function () { - Route::put('/service/update', 'UpdateCustomServiceConstantController@update')->name('service.update'); - Route::put('/update', 'UpdateConstantController@update')->name('update'); - Route::get('/show/{reference}', 'FetchConstantController@fetch')->name('show'); - Route::put('/update/postcode', 'UpdateConstantPostcodeController@update')->name('update.postcode'); + Route::put('/service/update', [UpdateCustomServiceConstantController::class, 'update'])->name('service.update'); + Route::put('/update', [UpdateConstantController::class, 'update'])->name('update'); + Route::get('/show/{reference}', [FetchConstantController::class, 'fetch'])->name('show'); + Route::put('/update/postcode', [UpdateConstantPostcodeController::class, 'update'])->name('update.postcode'); - Route::post('base-price/create', 'CreateBasePriceController@create')->name('basePrice.create'); - Route::get('base-price/show', 'FetchBasePriceController@fetch')->name('basePrice.show'); + Route::post('base-price/create', [CreateBasePriceController::class, 'create'])->name('basePrice.create'); + Route::get('base-price/show', [FetchBasePriceController::class, 'fetch'])->name('basePrice.show'); }); -}); \ No newline at end of file +}); diff --git a/routes/step.php b/routes/step.php index c9333164..3e98461b 100644 --- a/routes/step.php +++ b/routes/step.php @@ -1,8 +1,8 @@ 'order/step/{id}', 'as' => 'order.step.', 'namespace' => 'Steps'], function () { - Route::put('complete', 'CompletesOrderStepsController@complete')->name('complete'); +Route::group(['prefix' => 'order/step/{id}', 'as' => 'order.step.'], function () { + Route::put('complete', [CompletesStepController::class, 'complete'])->name('complete'); }); - diff --git a/routes/transaction.php b/routes/transaction.php index 8c5dd95f..57bef643 100644 --- a/routes/transaction.php +++ b/routes/transaction.php @@ -1,39 +1,64 @@ 'transactions', 'namespace' => 'Transactions', 'as' => 'transaction.'], function () { +Route::group(['prefix' => 'transactions', 'as' => 'transaction.'], function () { - Route::get('/list', 'ListTransactionsController@list')->middleware('storage.invoice.check.bytransactions')->name('list'); - Route::delete('/suspend/{id}', 'SuspendTransactionController@suspend')->name('suspend'); - Route::delete('/delete/{id}', 'DeleteTransactionController@delete')->name('delete'); - Route::delete('/delete-payment/{id}', 'DeletePaymentTransactionController@delete')->name('payment.delete'); - Route::put('{id}/status/update/{status}', 'UpdateTransactionStatusController@update')->where('status', 'approve|expire|reject')->name('update'); - route::post('/{invoice_id}/regenerate', 'RegenerateSingleShippingInvoiceTransactionController@regenerate')->name('invoice.regenerate'); - Route::post('/waive/{id}', 'WaiveTransactionController@waive')->name('waive'); - Route::post('/e-invoice/{invoice_id}/regenerate', 'RegenerateSingleShippingInvoiceTransactionController@regenerateEInvoice')->name('einvoice.regenerate'); - Route::post('/storage-invoice/{invoice_id}/regenerate', 'RegenerateSingleStorageInvoiceTransactionController@regenerate')->name('storage.invoice.regenerate'); - Route::post('/sales-order/{invoice_id}/regenerate', 'RegenerateSingleShippingInvoiceTransactionController@regenerateSalesOrder')->name('sales.order.regenerate'); - Route::post('/storage-e-invoice/{invoice_id}/regenerate', 'RegenerateSingleStorageInvoiceTransactionController@regenerateEInvoice')->name('storage.einvoice.regenerate'); + Route::get('/list', [ListTransactionsController::class, 'list'])->middleware('storage.invoice.check.bytransactions')->name('list'); + Route::delete('/suspend/{id}', [SuspendTransactionController::class, 'suspend'])->name('suspend'); + Route::delete('/delete/{id}', [DeleteTransactionController::class, 'delete'])->name('delete'); + Route::delete('/delete-payment/{id}', [DeletePaymentTransactionController::class, 'delete'])->name('payment.delete'); + Route::put('{id}/status/update/{status}', [UpdateTransactionStatusController::class, 'update'])->where('status', 'approve|expire|reject')->name('update'); + Route::post('/{invoice_id}/regenerate', [RegenerateSingleShippingInvoiceTransactionController::class, 'regenerate'])->name('invoice.regenerate'); + Route::post('/waive/{id}', [WaiveTransactionController::class, 'waive'])->name('waive'); + Route::post('/e-invoice/{invoice_id}/regenerate', [RegenerateSingleShippingInvoiceTransactionController::class, 'regenerateEInvoice'])->name('einvoice.regenerate'); + Route::post('/storage-invoice/{invoice_id}/regenerate', [RegenerateSingleStorageInvoiceTransactionController::class, 'regenerate'])->name('storage.invoice.regenerate'); + Route::post('/sales-order/{invoice_id}/regenerate', [RegenerateSingleShippingInvoiceTransactionController::class, 'regenerateSalesOrder'])->name('sales.order.regenerate'); + Route::post('/storage-e-invoice/{invoice_id}/regenerate', [RegenerateSingleStorageInvoiceTransactionController::class, 'regenerateEInvoice'])->name('storage.einvoice.regenerate'); - Route::get('wallet/list', 'ListWalletTransactionsController@list')->name('wallet.list'); + Route::get('wallet/list', [ListWalletTransactionsController::class, 'list'])->name('wallet.list'); - Route::get('/verify/{transaction_ids}', 'VerifyTransactionsController@verify')->name('verify.transactions'); + Route::get('/verify/{transaction_ids}', [VerifyTransactionsController::class, 'verify'])->name('verify.transactions'); Route::group(['prefix' => 'payment', 'as' => 'payment.'], function () { - Route::post('/create', 'CreatePaymentTransactionController@create')->name('create'); - Route::post('/upload-verification-document/{transaction_id}', 'UploadPaymentVerificationDocumentController@upload')->name('verification.create'); - Route::put('/approve/{transaction_id}/{status}', 'ApprovePaymentTransactionController@approve')->where('status', 'approve|reject')->name('approval'); + Route::post('/create', [CreatePaymentTransactionController::class, 'create'])->name('create'); + Route::post('/upload-verification-document/{transaction_id}', [UploadPaymentVerificationDocumentController::class, 'upload'])->name('verification.create'); + Route::put('/approve/{transaction_id}/{status}', [ApprovePaymentTransactionController::class, 'approve'])->where('status', 'approve|reject')->name('approval'); }); Route::group(['prefix' => 'invoice', 'as' => 'invoice.'], function () { - route::post('/shipping-invoice/create', 'CreateShippingInvoiceTransactionController@create')->name('create'); - route::post('/shipping-invoice/company/{company_module_id}/regenerate', 'RegenerateShippingInvoiceTransactionController@regenerate')->name('company.regenerate'); - route::put('/shipping-invoice/{id}/update', 'UpdateShippingInvoiceTransactionController@update')->name('update'); - route::put('/shipping-invoice/{id}/approve', 'ApproveShippingInvoiceTransactionController@approve')->name('approve'); + Route::post('/shipping-invoice/create', [CreateShippingInvoiceTransactionController::class, 'create'])->name('create'); + Route::post('/shipping-invoice/company/{company_module_id}/regenerate', [RegenerateShippingInvoiceTransactionController::class, 'regenerate'])->name('company.regenerate'); + Route::put('/shipping-invoice/{id}/update', [UpdateShippingInvoiceTransactionController::class, 'update'])->name('update'); + Route::put('/shipping-invoice/{id}/approve', [ApproveShippingInvoiceTransactionController::class, 'approve'])->name('approve'); }); - route::post('/shipping-invoice/calculator', 'ShippingEstimationCalculatorController@calculate')->name('shipping.estimation.calculator'); + Route::post('/shipping-invoice/calculator', [ShippingEstimationCalculatorController::class, 'calculate'])->name('shipping.estimation.calculator'); // Route::group(['prefix' => '{id}/payment', 'as' => 'payment.'], function () { // Route::post('quotation', 'FetchBookingPaymentQuotationController@fetch')->name('quotation'); @@ -48,17 +73,17 @@ Route::group(['prefix' => 'transactions', 'namespace' => 'Transactions', 'as' => // Route::post('booking/{id}/details/update', 'CreatePurchaseOrderTransactionController@create')->name('po.create'); Route::group(['prefix' => 'groups', 'as' => 'group.'], function () { - Route::post('/{transaction_ids}/create', 'CreateGroupsController@create')->name('create'); - Route::get('/list', 'ListGroupsController@list')->name('list'); + Route::post('/{transaction_ids}/create', [CreateGroupsController::class, 'create'])->name('create'); + Route::get('/list', [ListGroupsController::class, 'list'])->name('list'); // Route::get('/list', 'ListGroupsController@list')->middleware('storage.invoice.check.bygroup')->name('list'); - Route::delete('/{id}/delete', 'DeleteGroupController@delete')->name('delete'); - Route::delete('/{id}/delete-paid', 'DeletePaidGroupController@delete')->name('paidGroup.delete'); - Route::put('/{id}/update', 'UpdateGroupController@update')->name('update'); + Route::delete('/{id}/delete', [DeleteGroupController::class, 'delete'])->name('delete'); + Route::delete('/{id}/delete-paid', [DeletePaidGroupController::class, 'delete'])->name('paidGroup.delete'); + Route::put('/{id}/update', [UpdateGroupController::class, 'update'])->name('update'); // Route::post('/{id}/approve', 'CreateBulkPurchaseOrderDocumentController@aprove')->name('approve'); // Route::post('/bulk/po', 'CreateBulkPurchaseOrderDocumentController@create')->name('bulk.po'); - Route::get('/single/{group_id}', 'FetchGroupController@fetch')->name('fetch.single'); + Route::get('/single/{group_id}', [FetchGroupController::class, 'fetch'])->name('fetch.single'); }); - Route::get('/single/{transaction_id}', 'FetchTransactionController@fetch')->middleware('storage.invoice.check.bytransaction')->name('fetch'); + Route::get('/single/{transaction_id}', [FetchTransactionController::class, 'fetch'])->middleware('storage.invoice.check.bytransaction')->name('fetch'); }); diff --git a/routes/transport.php b/routes/transport.php index 507d7f90..bf2b7fa7 100644 --- a/routes/transport.php +++ b/routes/transport.php @@ -1,11 +1,16 @@ 'Transports', 'as' => 'transport.', 'prefix' => 'transport'], function () { - Route::get('/{id}/show', 'FetchTransportController@fetch')->name('show'); - Route::get('/list', 'ListTransportsController@list')->name('list'); - Route::post('/create', 'CreateTransportController@create')->name('create'); - Route::put('/update/{id}', 'UpdateTransportController@update')->name('update'); - Route::delete('/delete/{id}', 'DeleteTransportController@delete')->name('delete'); +Route::group(['as' => 'transport.', 'prefix' => 'transport'], function () { + Route::get('/{id}/show', [FetchTransportController::class, 'fetch'])->name('show'); + Route::get('/list', [ListTransportsController::class, 'list'])->name('list'); + Route::post('/create', [CreateTransportController::class, 'create'])->name('create'); + Route::put('/update/{id}', [UpdateTransportController::class, 'update'])->name('update'); + Route::delete('/delete/{id}', [DeleteTransportController::class, 'delete'])->name('delete'); }); diff --git a/routes/wallet.php b/routes/wallet.php index b93a1514..f558d6ce 100644 --- a/routes/wallet.php +++ b/routes/wallet.php @@ -1,18 +1,25 @@ 'wallets', 'namespace' => 'Wallets', 'as' => 'wallet.'], function () { - Route::get('/', 'ListWalletController@list')->name('list'); +Route::group(['prefix' => 'wallets', 'as' => 'wallet.'], function () { + Route::get('/', [ListWalletController::class, 'list'])->name('list'); - Route::get('/company-module/{company_module_id}', 'FetchWalletByCompanyModuleController@fetch')->name('company_module.show'); + Route::get('/company-module/{company_module_id}', [FetchWalletByCompanyModuleController::class, 'fetch'])->name('company_module.show'); - Route::post('/create', 'CreateWalletController@create')->name('create'); + Route::post('/create', [CreateWalletController::class, 'create'])->name('create'); - Route::post('/topup', 'TopUpWalletController@topUp')->name('topup'); // user - Route::post('/credit', 'CreditWalletController@credit')->name('credit'); // admin + + Route::post('/topup', [TopUpWalletController::class, 'topUp'])->name('topup'); // user + Route::post('/credit', [CreditWalletController::class, 'credit'])->name('credit'); // admin + - Route::put('/{transaction_id}/update-status/{status}', 'UpdateStatusWalletController@updateStatus')->where('status', 'approve|reject')->name('approval'); + Route::put('/{transaction_id}/update-status/{status}', [UpdateStatusWalletController::class, 'updateStatus'])->where('status', 'approve|reject')->name('approval'); - Route::get('/reports', 'WalletReportController@walletsReport')->name('reports'); + Route::get('/reports', [WalletReportController::class, 'walletsReport'])->name('reports'); }); diff --git a/routes/web.php b/routes/web.php index 899b421e..1b2efd33 100644 --- a/routes/web.php +++ b/routes/web.php @@ -50,6 +50,22 @@ use App\Classes\General\AWSS3Helper; use App\Classes\Jobs\Commands\V2\YD\ProcessYDByTrakingNoDataV2Job; use App\Classes\Jobs\Commands\V2\YD\ProcessYDPortalDataV2Job; use App\Http\Controllers\Orders\MoveOrderToCustomerController; +use App\Http\Controllers\Delivery\ExportDeliveryOrdersToExcelController; +use App\Http\Controllers\Orders\DownloadOrderQrPdfController; +use App\Http\Controllers\Orders\DownloadTaxRebateQrPdfController; +use App\Http\Controllers\Reports\CustomcClearanceReportController; +use App\Http\Controllers\Exports\ExportCustomersToExcelController; +use App\Http\Controllers\Exports\ExportContainerPackingListController; +use App\Http\Controllers\Exports\ExportPendingArrangementPackingListV2Controller; +use App\Http\Controllers\Exports\ExportParcelPostcodesController; +use App\Http\Controllers\Exports\ExportPendingArrangementPackingListController; +use App\Http\Controllers\Exports\ExportArrivedParcelController; +use App\Http\Controllers\Exports\ExportCompanyModuleSummaryController; +use App\Http\Controllers\Billplz\CallbackBillplzController; +use App\Http\Controllers\Notifications\ListNotificationsController; +use App\Http\Controllers\Exports\ExportCustomersWalletTransactionToExcelController; +use App\Http\Controllers\Exports\ExportFeedbackDataController; +use App\Http\Controllers\Transactions\GenerateCreditNotePdfController; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Log; @@ -76,12 +92,12 @@ Route::domain('hywave.izyim.com')->group(function () { return view('pages.delivery.dashboard'); })->name('dashboard'); - Route::get('/orders/export', 'Delivery\ExportDeliveryOrdersToExcelController@lineClear')->name('order.export'); + Route::get('/orders/export', [ExportDeliveryOrdersToExcelController::class, 'lineClear'])->name('order.export'); }); }); -Route::group(['prefix'=> '/last_mile_delivery', 'as' => 'last_mile_delivery.'], function () { +Route::group(['prefix' => '/last_mile_delivery', 'as' => 'last_mile_delivery.'], function () { Route::get('/', function () { return view('pages.accounts.signup'); })->name('login'); @@ -90,11 +106,11 @@ Route::group(['prefix'=> '/last_mile_delivery', 'as' => 'last_mile_delivery.'], return view('pages.delivery.dashboard'); })->name('dashboard'); - Route::get('/orders/export', 'Delivery\ExportDeliveryOrdersToExcelController@lineClear')->name('order.export'); + Route::get('/orders/export', [ExportDeliveryOrdersToExcelController::class, 'lineClear'])->name('order.export'); }); -Route::group(['prefix'=> '/air_shipment', 'as' => 'air_shipment.'], function () { +Route::group(['prefix' => '/air_shipment', 'as' => 'air_shipment.'], function () { // Route::get('/', function () { // return view('pages.accounts.signup'); // })->name('login'); @@ -148,22 +164,22 @@ Route::get('/orders', function () { Route::get('/support', function () { return view('pages.support', [ - 'email' => null, - 'orderNo' => null, - 'orderNoNotFound' => null, - 'marking' => null, - 'markingReturn' => null, - 'markingNotFound' => null, + 'email' => null, + 'orderNo' => null, + 'orderNoNotFound' => null, + 'marking' => null, + 'markingReturn' => null, + 'markingNotFound' => null, ]); })->name('support'); Route::post('/support', function (Request $request) { $orderNoNotFound = false; - $orderNo = $request->input('orderNo'); + $orderNo = $request->input('orderNo'); - $marking = $request->input('marking'); - $markingReturn = null; + $marking = $request->input('marking'); + $markingReturn = null; $markingNotFound = false; if ($orderNo) { @@ -176,23 +192,23 @@ Route::post('/support', function (Request $request) { if ($marking) { $orderNo = null; - $markingReturn = CompanyConnection::where('invitee_reference', 'LIKE', '%'. $marking .'%')->get(); + $markingReturn = CompanyConnection::where('invitee_reference', 'LIKE', '%' . $marking . '%')->get(); $dataReturn = []; if (count($markingReturn)) { $markingReturn = $markingReturn; foreach ($markingReturn as $connection) { - $company_module = $connection->invitee; + $company_module = $connection->invitee; $company_module_contact = $company_module->contacts()->first(); - $company = $company_module->company; - $company_contact = $company->contacts()->first(); + $company = $company_module->company; + $company_contact = $company->contacts()->first(); $dataReturn[] = json_encode( [ - 'connection' => $connection ? $connection->toArray() : null, - 'company_module' => $company_module ? $company_module->toArray() : null, + 'connection' => $connection ? $connection->toArray() : null, + 'company_module' => $company_module ? $company_module->toArray() : null, 'company_module_contact' => $company_module_contact ? $company_module_contact->toArray() : null, - 'company' => $company ? $company->toArray() : null, - 'company_contact' => $company_contact ? $company_contact->toArray() : null, + 'company' => $company ? $company->toArray() : null, + 'company_contact' => $company_contact ? $company_contact->toArray() : null, ] ); @@ -203,12 +219,12 @@ Route::post('/support', function (Request $request) { } return view('pages.support', [ - 'email' => null, - 'orderNo' => $orderNo, - 'orderNoNotFound' => $orderNoNotFound, - 'marking' => $marking, - 'markingReturn' => $dataReturn, - 'markingNotFound' => $markingNotFound, + 'email' => null, + 'orderNo' => $orderNo, + 'orderNoNotFound' => $orderNoNotFound, + 'marking' => $marking, + 'markingReturn' => $dataReturn, + 'markingNotFound' => $markingNotFound, ]); })->name('support'); @@ -227,7 +243,7 @@ Route::get('/order/v2/show/{order_number}', function (Illuminate\Http\Request $r return view('pages.orders.profile_v2', [ 'id' => $orderNumber, 'q' => $request->query('q', null) -]); + ]); })->name('order.v2.show'); Route::get('/address', function () { @@ -279,7 +295,7 @@ Route::get('/customer-invoices/{company_module_id}/payment-and-billing', functio return view('pages.customers.paymentsBilling', ['company_module_id' => $company_module_id]); })->name('customer.payment-and-billing-by-company-module-id'); -Route::get('/orders/refresh', function(Request $request){ +Route::get('/orders/refresh', function (Request $request) { $packingLists = PackingList::where('type', PackingListType::WAREHOUSE_RECEIVE_LIST)->has('containers')->get(); dd($packingLists); $packingLists->each(function (PackingList $packingList) { @@ -294,17 +310,17 @@ Route::get('/orders/refresh', function(Request $request){ })->name('orders.refresh'); -Route::get('/containers/refresh', function(){ +Route::get('/containers/refresh', function () { dd((App()->make(FetchLoadedContainersFromVTPortalProcessor::class))->execute()); -// FetchLoadedContainersFromVTPortalJob::dispatch(); + // FetchLoadedContainersFromVTPortalJob::dispatch(); // FetchContainersStatusUpdateFromVTPortalJob::dispatch(); return redirect('orders'); })->name('containers.refresh'); -Route::get('/deliveries/refresh', function(){ +Route::get('/deliveries/refresh', function () { FetchDeliveryListFromVTPortalJob::dispatch(); @@ -312,10 +328,10 @@ Route::get('/deliveries/refresh', function(){ })->name('deliveries.refresh'); -Route::get('/order/{id}/download', 'Orders\DownloadOrderQrPdfController@download')->name('order.qr.download'); -Route::get('/tax-rebate-order/{id}/download', 'Orders\DownloadTaxRebateQrPdfController@download')->name('order.taxt_rebate_qr.download'); +Route::get('/order/{id}/download', [DownloadOrderQrPdfController::class, 'download'])->name('order.qr.download'); +Route::get('/tax-rebate-order/{id}/download', [DownloadTaxRebateQrPdfController::class, 'download'])->name('order.taxt_rebate_qr.download'); -Route::get('/report/customclearance/{orderid}', 'Reports\CustomcClearanceReportController@download')->name('report.customclearance'); +Route::get('/report/customclearance/{orderid}', [CustomcClearanceReportController::class, 'download'])->name('report.customclearance'); Route::group(['prefix' => 'template', 'as' => 'template.'], function () { Route::get('/payment-and-billing', function () { @@ -328,37 +344,37 @@ Route::group(['prefix' => 'template', 'as' => 'template.'], function () { }); Route::get('/yiwu', function () { - $orders = Order::whereHas('OrderRoles', function($query){ + $orders = Order::whereHas('OrderRoles', function ($query) { return $query->where('role_id', OrderRoleTypes::ORIGIN_WAREHOUSE)->where('company_module_id', 2358); })->get(); - foreach ($orders as $order){ - echo ''. $order->reference.' - '.$order->created_at.'
'; + foreach ($orders as $order) { + echo '' . $order->reference . ' - ' . $order->created_at . '
'; } }); Route::get('/guangzhou', function () { - $orders = Order::whereHas('OrderRoles', function($query){ + $orders = Order::whereHas('OrderRoles', function ($query) { return $query->where('role_id', OrderRoleTypes::ORIGIN_WAREHOUSE)->where('company_module_id', 3); - })->whereHas('addresses', function($query){ + })->whereHas('addresses', function ($query) { return $query->where('status', ApprovalStatus::APPROVED)->whereIn('state_id', [5, 13, 14]); })->get(); - foreach ($orders as $order){ - echo ''. $order->reference.' - '.$order->created_at.'
'; + foreach ($orders as $order) { + echo '' . $order->reference . ' - ' . $order->created_at . '
'; } }); -Route::get('/debug', function (){ +Route::get('/debug', function () { $orders = Order::all(); $issues = []; - foreach ($orders as $order){ + foreach ($orders as $order) { $received = $order->parcels()->warehouseReceiveList()->sum('quantity'); $shipping = $order->parcels()->shippingList()->sum('quantity'); - if( $received < $shipping){ + if ($received < $shipping) { $issues[] = [ 'order' => $order->reference, 'received' => $received, @@ -371,26 +387,26 @@ Route::get('/debug', function (){ }); Route::group(['prefix' => 'yd', 'as' => 'yd.'], function () { - Route::get('/packingLists', function (Request $request){ - $start = $request->input('start_date') ? Carbon::parse($request->input('start_date')): null; - $end = $request->input('end_date') ? Carbon::parse($request->input('end_date')): null; + Route::get('/packingLists', function (Request $request) { + $start = $request->input('start_date') ? Carbon::parse($request->input('start_date')) : null; + $end = $request->input('end_date') ? Carbon::parse($request->input('end_date')) : null; (App()->make(FetchPackingListsFromYdPortalProcessor::class))->execute($start, $end); }); - Route::get('/containers', function (){ + Route::get('/containers', function () { (App()->make(FetchContainersFromYdPortalProcessor::class))->execute(); (App()->make(FetchContainersUpdatesFromYdPortalProcessor::class))->execute(); }); - Route::get('/deliveries', function (){ + Route::get('/deliveries', function () { (App()->make(FetchDeliveryUpdatesFromYdPortalProcessor::class))->execute(); }); }); -Route::get('/yd', function (Request $request){ - $start = $request->input('start_date') ? Carbon::parse($request->input('start_date')): null; - $end = $request->input('end_date') ? Carbon::parse($request->input('end_date')): null; +Route::get('/yd', function (Request $request) { + $start = $request->input('start_date') ? Carbon::parse($request->input('start_date')) : null; + $end = $request->input('end_date') ? Carbon::parse($request->input('end_date')) : null; if ($start) { dispatch(new ProcessYDPortalDataV2Job($start, $end)); @@ -407,7 +423,7 @@ Route::get('/yd', function (Request $request){ })->name('yd.refresh'); -Route::get('/yd-track', function (Request $request){ +Route::get('/yd-track', function (Request $request) { $trackingNo = $request->input('tracking_no'); if ($trackingNo) { @@ -428,33 +444,33 @@ Route::get('/yd-track', function (Request $request){ })->name('yd.track'); -Route::get('/container/{reference}/refresh/', function (string $reference){ +Route::get('/container/{reference}/refresh/', function (string $reference) { $container = Container::where('reference', $reference)->first(); $supplier = in_array($container->owner_id, [3, 4]) ? 'VT' : 'YD'; - $arrivalDates = PackingList::whereIn('reference', $container->packingLists->pluck('reference'))->where('type', PackingListType::WAREHOUSE_RECEIVE_LIST)->get()->map(function($packingList){ + $arrivalDates = PackingList::whereIn('reference', $container->packingLists->pluck('reference'))->where('type', PackingListType::WAREHOUSE_RECEIVE_LIST)->get()->map(function ($packingList) { return $packingList->transports()->first()->drop_date; - })->sortBy(function($date){ + })->sortBy(function ($date) { return $date; }); $startDate = $arrivalDates->first()->subDay()->format('d-m-Y'); $endDate = $arrivalDates->last()->addDay()->format('d-m-Y'); - if($supplier === 'VT'){ + if ($supplier === 'VT') { return (App()->make(FetchLoadedContainersFromVTPortalProcessor::class))->execute(Carbon::parse($endDate), Carbon::parse($endDate)->addDays(5)); } - if($supplier === 'YD'){ - return redirect(route('yd.refresh').'?start_date='.$startDate.'&end_date='.$endDate); + if ($supplier === 'YD') { + return redirect(route('yd.refresh') . '?start_date=' . $startDate . '&end_date=' . $endDate); } })->name('container.refresh'); -Route::get('/min_cbm', function (){ - $companies = CompanyModule::where('type', BusinessType::IMPORTER)->whereHas('orders', function ($query){ - return $query->whereHas('packingLists')->whereDoesntHave('packingLists', function($query){ - return $query->whereHas('packages', function($query){ +Route::get('/min_cbm', function () { + $companies = CompanyModule::where('type', BusinessType::IMPORTER)->whereHas('orders', function ($query) { + return $query->whereHas('packingLists')->whereDoesntHave('packingLists', function ($query) { + return $query->whereHas('packages', function ($query) { return $query->selectRaw('sum((width/100) * (height/100) * (length/100) * quantity) as cbm')->where('type', PackingListType::SHIPPING_PACKING_LIST)->where('status', '!=', 5)->having('cbm', '>', 0.3); }); }); @@ -463,7 +479,7 @@ Route::get('/min_cbm', function (){ $i = 0; foreach ($companies as $company) { $marking = $company->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference; - echo ''.$i++.'. '.$marking.'
'; + echo '' . $i++ . '. ' . $marking . '
'; } }); @@ -476,21 +492,21 @@ Route::get('/warehouse/{id}/show', function ($id) { // $id = $connection->invitee->company->id; return view('pages.templates.warehouseDetails', ['id' => $id]); })->name('warehouse.show'); -Route::get('/export/customer-latest-order-date/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@export')->name('customer.latest.order.date.export'); -Route::get('/export/packing-list/{id}', 'Exports\ExportContainerPackingListController@export')->name('container.packaging_list.export'); -Route::get('/export/pending-arrangement-delivery-list', 'Exports\ExportPendingArrangementPackingListV2Controller@export')->name('packaging_list.pending_arrangement.export'); +Route::get('/export/customer-latest-order-date/f614e339d7058904a831aad742e24d55', [ExportCustomersToExcelController::class, 'export'])->name('customer.latest.order.date.export'); +Route::get('/export/packing-list/{id}', [ExportContainerPackingListController::class, 'export'])->name('container.packaging_list.export'); +Route::get('/export/pending-arrangement-delivery-list', [ExportPendingArrangementPackingListV2Controller::class, 'export'])->name('packaging_list.pending_arrangement.export'); // Route::get('/export/on-hold-packing-list', 'Exports\ExportPendingArrangementPackingListV2Controller@onHold')->name('packaging_list.on_hold.export'); -Route::get('/export/parcel-postcode', 'Exports\ExportParcelPostcodesController@export')->name('parcel.postcode.export'); -Route::get('/export/{year}/customer-total-order', 'Exports\ExportCustomersToExcelController@totalOrders'); +Route::get('/export/parcel-postcode', [ExportParcelPostcodesController::class, 'export'])->name('parcel.postcode.export'); +Route::get('/export/{year}/customer-total-order', [ExportCustomersToExcelController::class, 'totalOrders']); //Converted to protected route starts (20240925) -Route::get('/export/on-hold-packing-list', 'Exports\ExportPendingArrangementPackingListController@onHold')->middleware(['api'])->middleware(['valid.token'])->name('packaging_list.on_hold.export'); -Route::get('/export/packing-list-warehouse/guangzhou2-to-johor', 'Exports\ExportArrivedParcelController@guangZhou2ToJohor')->middleware(['api'])->middleware(['valid.token'])->name('packing_list.arrived_parcel.guangZhou2ToJohor'); -Route::get('/export/arrived-parcel', 'Exports\ExportArrivedParcelController@export')->middleware(['api'])->middleware(['valid.token'])->name('packing_list.arrived_parcel.export'); -Route::get('/export/parcel-summary', 'Exports\ExportArrivedParcelController@summary')->middleware(['api'])->middleware(['valid.token'])->name('packing_list.arrived_parcel.parcel-summary'); -Route::get('/export/aging-list', 'Exports\ExportArrivedParcelController@aging')->middleware(['api'])->middleware(['valid.token'])->name('aging-listing.export'); -Route::get('/export/segment-customers/{segment}/{companyMarking}', 'Exports\ExportCompanyModuleSummaryController@exportSegmentCustomers')->middleware(['api'])->middleware(['valid.token'])->name('segment-customers.export'); -Route::get('/export/all-customers-info-for-lark-system', 'Exports\ExportCompanyModuleSummaryController@exportAllCustomersInfoForLarkSystem')->middleware(['api'])->middleware(['valid.token'])->name('exportAllCustomersInfoForLarkSystem.export'); +Route::get('/export/on-hold-packing-list', [ExportPendingArrangementPackingListController::class, 'onHold'])->middleware(['api'])->middleware(['valid.token'])->name('packaging_list.on_hold.export'); +Route::get('/export/packing-list-warehouse/guangzhou2-to-johor', [ExportArrivedParcelController::class, 'guangZhou2ToJohor'])->middleware(['api'])->middleware(['valid.token'])->name('packing_list.arrived_parcel.guangZhou2ToJohor'); +Route::get('/export/arrived-parcel', [ExportArrivedParcelController::class, 'export'])->middleware(['api'])->middleware(['valid.token'])->name('packing_list.arrived_parcel.export'); +Route::get('/export/parcel-summary', [ExportArrivedParcelController::class, 'summary'])->middleware(['api'])->middleware(['valid.token'])->name('packing_list.arrived_parcel.parcel-summary'); +Route::get('/export/aging-list', [ExportArrivedParcelController::class, 'aging'])->middleware(['api'])->middleware(['valid.token'])->name('aging-listing.export'); +Route::get('/export/segment-customers/{segment}/{companyMarking}', [ExportCompanyModuleSummaryController::class, 'exportSegmentCustomers'])->middleware(['api'])->middleware(['valid.token'])->name('segment-customers.export'); +Route::get('/export/all-customers-info-for-lark-system', [ExportCompanyModuleSummaryController::class, 'exportAllCustomersInfoForLarkSystem'])->middleware(['api'])->middleware(['valid.token'])->name('exportAllCustomersInfoForLarkSystem.export'); //Converted to protected route ends (20240925) Route::get('/settings', function () { @@ -500,8 +516,8 @@ Route::get('/settings', function () { return view('pages.settings'); })->name('settings'); -Route::get('/customer/{company_module_id}/summary', 'Exports\ExportCompanyModuleSummaryController@export')->name('customer.summary.export'); -Route::get('/export-customer-order/{marking}', 'Exports\ExportCompanyModuleSummaryController@exportorderSummaryByMarking')->name('customer.orderSummary.export'); +Route::get('/customer/{company_module_id}/summary', [ExportCompanyModuleSummaryController::class, 'export'])->name('customer.summary.export'); +Route::get('/export-customer-order/{marking}', [ExportCompanyModuleSummaryController::class, 'exportorderSummaryByMarking'])->name('customer.orderSummary.export'); Route::get('/customer/summary/{year}/monthly', function ($year) { if (!in_array($year, [2022, 2023])) { @@ -521,12 +537,13 @@ Route::get('/customer/summary/{year}/monthly', function ($year) { $marking = '769SMC'; $connection = CompanyConnection::where('invitee_reference', $marking)->first(); $companyModuleId = $connection->invitee->id; - foreach ($containers as $container){ - $packingLists = $container->packingLists()->get()->filter(function ($packingList) use ($companyModuleId){ + foreach ($containers as $container) { + $packingLists = $container->packingLists()->get()->filter(function ($packingList) use ($companyModuleId) { return $packingList->owner->company_module_id === $companyModuleId; }); - if (!count($packingLists)) continue; + if (!count($packingLists)) + continue; echo ' @@ -540,22 +557,22 @@ Route::get('/customer/summary/{year}/monthly', function ($year) { '; - foreach ($packingLists as $packingList){ - if($packingList->packingLists->first()){ + foreach ($packingLists as $packingList) { + if ($packingList->packingLists->first()) { $packingList = $packingList->packingLists->first(); } $packages = $packingList->packages; - foreach ($packages as $package){ + foreach ($packages as $package) { echo ' - - - - - - - - - + + + + + + + + + '; } } @@ -567,6 +584,7 @@ Route::get('/customer/summary/{year}/monthly', function ($year) { }); Route::get('/customers/active/{active_start}/{active_end}/{inactive_start?}/{inactive_end?}/{with_cbm?}', function ($active_start, $active_end, $inactive_start = null, $inactive_end = null, $with_cbm = false) { + dd('Deprecated, call Tech Support'); /* $activeCompanies = CompanyModule::where('type', BusinessType::IMPORTER)->whereHas('orderPackingLists', function($query) use($inactive_start, $inactive_end) { return $query->where('packing_lists.type', PackingListType::WAREHOUSE_RECEIVE_LIST)->whereHas('transports', function ($query) use ($inactive_start, $inactive_end) { return $query->where('drop_date', '>=', Carbon::parse($inactive_start))->where('drop_date', '<=', Carbon::parse($inactive_end)->addDay()); @@ -582,7 +600,7 @@ Route::get('/customers/active/{active_start}/{active_end}/{inactive_start?}/{ina $companies = getActiveCompanies($inactive_start, $inactive_end, $active_start, $active_end); - echo '

List of customers active between '. Carbon::parse($active_start)->format('d/m/Y'). ' - '. Carbon::parse($active_end)->format('d/m/Y').' & inactive between '. Carbon::parse($inactive_start)->format('d/m/Y'). ' - '. Carbon::parse($inactive_end)->format('d/m/Y').'

'; + echo '

List of customers active between ' . Carbon::parse($active_start)->format('d/m/Y') . ' - ' . Carbon::parse($active_end)->format('d/m/Y') . ' & inactive between ' . Carbon::parse($inactive_start)->format('d/m/Y') . ' - ' . Carbon::parse($inactive_end)->format('d/m/Y') . '

'; echo '
W (cm) CBM
'.$container->loading_date->format('d-m-Y').'MS/CIEF/769SMC/'.$packingList->owner->owner->reference.''.$container->reference.''.$package->description.''.$package->quantity.''.$package->length.''.$package->height.''.$package->width.''.((($package->length / 100) * ($package->height / 100) * ($package->width / 100)) * $package->quantity).'' . $container->loading_date->format('d-m-Y') . 'MS/CIEF/769SMC/' . $packingList->owner->owner->reference . '' . $container->reference . '' . $package->description . '' . $package->quantity . '' . $package->length . '' . $package->height . '' . $package->width . '' . ((($package->length / 100) * ($package->height / 100) * ($package->width / 100)) * $package->quantity) . '
@@ -590,32 +608,32 @@ Route::get('/customers/active/{active_start}/{active_end}/{inactive_start?}/{ina '; - foreach ($companies as $key => $company){ + foreach ($companies as $key => $company) { $connection = $company->inviters()->withPivot('invitee_reference')->first(); - $marking = $connection ? $connection->pivot->invitee_reference:''; + $marking = $connection ? $connection->pivot->invitee_reference : ''; $packingList = collect(); $totalCbm = 0; - if($with_cbm){ + if ($with_cbm) { $packingList = $company->orderPackingLists()->where('packing_lists.type', PackingListType::SHIPPING_PACKING_LIST)->get(); $totalCbm = $packingList->flatMap(function ($packingList) { return $packingList->packages; - })->sum(function($package){ - return (( (float) $package->width / 100) * ( (float) $package->length / 100) * ( (float) $package->height / 100)) * $package->quantity; + })->sum(function ($package) { + return (((float) $package->width / 100) * ((float) $package->length / 100) * ((float) $package->height / 100)) * $package->quantity; }); } echo ' - - - - + + + + '; } echo '
#Number of Orders CBM
'.$key.''.$marking.''. $packingList->count() .''. $totalCbm .'' . $key . '' . $marking . '' . $packingList->count() . '' . $totalCbm . '
'; }); -Route::get('/online_payment/redirect', 'Billplz\CallbackBillplzController@callback')->name('online_payment.redirect'); +Route::get('/online_payment/redirect', [CallbackBillplzController::class, 'callback'])->name('online_payment.redirect'); Route::get('/order/tracking/{tracking_no?}', function ($tracking_no = null) { return view('pages.tracking.search', ['tracking_no' => $tracking_no]); @@ -629,42 +647,42 @@ Route::get('/payment-and-billing', function () { return view('pages.paymentAndBilling'); })->name('admin.payment-and-billing'); -Route::get('/notifications/list', 'Notifications\ListNotificationsController@list')->name('notifications.list'); +Route::get('/notifications/list', [ListNotificationsController::class, 'list'])->name('notifications.list'); -Route::get('billplz/bills/{bill_no}', function($bill_no){ - return redirect(env('BILLPLZ_BASE_URL').'/bills/'.$bill_no); - })->name('billplz.bill'); +Route::get('billplz/bills/{bill_no}', function ($bill_no) { + return redirect(env('BILLPLZ_BASE_URL') . '/bills/' . $bill_no); +})->name('billplz.bill'); -Route::get('/export/null-debtor/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@nullDebtor')->name('newDebtor.export'); -Route::get('/export/payment-transactions/{section}/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@paymentTransactions')->name('paymentTransactions.export'); -Route::get('/export/group-transactions/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@groupTransaction')->name('groupTransaction.export'); +Route::get('/export/null-debtor/f614e339d7058904a831aad742e24d55', [ExportCustomersToExcelController::class, 'nullDebtor'])->name('newDebtor.export'); +Route::get('/export/payment-transactions/{section}/f614e339d7058904a831aad742e24d55', [ExportCustomersToExcelController::class, 'paymentTransactions'])->name('paymentTransactions.export'); +Route::get('/export/group-transactions/f614e339d7058904a831aad742e24d55', [ExportCustomersToExcelController::class, 'groupTransaction'])->name('groupTransaction.export'); -Route::get('/delayed_container/customers', function(){ - $containers = Container::whereHas('transports', function($query){ - return $query->whereHas('Schedules', function($query){ +Route::get('/delayed_container/customers', function () { + $containers = Container::whereHas('transports', function ($query) { + return $query->whereHas('Schedules', function ($query) { return $query->where('etd', '>', Carbon::parse('15-10-2022')); }); })->get(); - $orders = $containers->map(function($container){ + $orders = $containers->map(function ($container) { return $container->orders; - })->flatten()->unique(function($order){ + })->flatten()->unique(function ($order) { return $order->company_module_id; }); $companies = CompanyModule::whereIn('id', $orders->pluck('company_module_id'))->get(); - foreach ($companies as $company){ + foreach ($companies as $company) { $marking = $company->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference; - echo ''.$marking.'
'; + echo '' . $marking . '
'; } }); -Route::get('/container/billing/{month}/{year}', function($month, $year){ - $containers = Container::whereDate('loading_date', '>=', Carbon::parse('01-'.$month.'-'.$year))->whereDate('loading_date', '<', Carbon::parse('01-'.$month.'-'.$year)->addMonth())->get(); +Route::get('/container/billing/{month}/{year}', function ($month, $year) { + $containers = Container::whereDate('loading_date', '>=', Carbon::parse('01-' . $month . '-' . $year))->whereDate('loading_date', '<', Carbon::parse('01-' . $month . '-' . $year)->addMonth())->get(); $totalBillable = 0; $billed = 0; @@ -682,7 +700,7 @@ Route::get('/container/billing/{month}/{year}', function($month, $year){ $outstationStates = [8, 3, 16, 10]; - foreach($containers as $container) { + foreach ($containers as $container) { $containerTotalBillable = 0; $containerBilled = 0; $containerTotalBilled = 0; @@ -693,7 +711,7 @@ Route::get('/container/billing/{month}/{year}', function($month, $year){ $totalBillable += count($packingLists); $containerTotalBillable += count($packingLists); - echo '

'.$container->reference.' ('.$container->loading_date->format('d-m-Y').')

'; + echo '

' . $container->reference . ' (' . $container->loading_date->format('d-m-Y') . ')

'; foreach ($packingLists as $packingList) { try { @@ -703,7 +721,7 @@ Route::get('/container/billing/{month}/{year}', function($month, $year){ $warehouseList = PackingList::where('reference', $packingList->reference)->where('type', 1)->first(); - if($warehouseList){ + if ($warehouseList) { $packing_list_drop_date = $warehouseList->transports->first()->drop_date; } else { echo '<------------- can\'t find arrival date -------------->'; @@ -713,30 +731,30 @@ Route::get('/container/billing/{month}/{year}', function($month, $year){ $address = $order->addresses()->where('status', ApprovalStatus::APPROVED)->first(); $warehouseId = $order->orderRoles()->where('role_id', OrderRoleTypes::ORIGIN_WAREHOUSE)->first()->company_module_id; - $cbm = round($packingList->packages->where('type', '!=', PackageType::OVER_WEIGHT)->sum(function($package) { - return ($package->width / 100) * ($package->height / 100) *($package->length / 100) * ($package->quantity); + $cbm = round($packingList->packages->where('type', '!=', PackageType::OVER_WEIGHT)->sum(function ($package) { + return ($package->width / 100) * ($package->height / 100) * ($package->length / 100) * ($package->quantity); }), 2); - $over_weight_cbm = round($packingList->packages->where('type', PackageType::OVER_WEIGHT)->sum(function($package) { - return ($package->width / 100) * ($package->height / 100) *($package->length / 100) * ($package->quantity); + $over_weight_cbm = round($packingList->packages->where('type', PackageType::OVER_WEIGHT)->sum(function ($package) { + return ($package->width / 100) * ($package->height / 100) * ($package->length / 100) * ($package->quantity); }), 2); $price = $basePrice; - if($warehouseId === 2358){ + if ($warehouseId === 2358) { $price += $yiwuCost; - if($packing_list_drop_date >= Carbon::parse('19-9-2022')){ + if ($packing_list_drop_date >= Carbon::parse('19-9-2022')) { $price += $yiwuDiscount; } } else { - if($cbm >= 2 && in_array($address->state_id, [4, 15])){ + if ($cbm >= 2 && in_array($address->state_id, [4, 15])) { $price += $bigParcelDiscount; } - if($packing_list_drop_date >= Carbon::parse('19-9-2022')){ + if ($packing_list_drop_date >= Carbon::parse('19-9-2022')) { $price += $discount; } } - if(in_array($address->state_id,$outstationStates)) { + if (in_array($address->state_id, $outstationStates)) { $price += 50; } @@ -745,14 +763,14 @@ Route::get('/container/billing/{month}/{year}', function($month, $year){ $containerCost += $cost; - if(in_array($address->state_id, [13, 14])) { + if (in_array($address->state_id, [13, 14])) { echo 'East Malaysia - '; } - echo 'estimated cost: [QTY: '.($cbm + $over_weight_cbm).' | Unit Price: '.$price.' | Total: '.$cost.']'; + echo 'estimated cost: [QTY: ' . ($cbm + $over_weight_cbm) . ' | Unit Price: ' . $price . ' | Total: ' . $cost . ']'; echo '
'; - if(!$invoice) { - echo '

'.$packingList->reference .' Warning: no billing

'; + if (!$invoice) { + echo '

' . $packingList->reference . ' Warning: no billing

'; continue; } @@ -769,67 +787,67 @@ Route::get('/container/billing/{month}/{year}', function($month, $year){ $totalPaid += $payments->sum('amount'); $containerTotalPaid += $payments->sum('amount'); - echo '

'.$packingList->reference .' | Amount: '.$invoice->amount.' | Paid: '.$payments->sum('amount').' | Invoice Date: '.$invoice->created_at->format('d-m-Y'). (($invoice->amount - $payments->sum('amount')) < 0.01 ? '' : '('.$invoice->created_at->diffForHumans().')').''; + echo '

' . $packingList->reference . ' | Amount: ' . $invoice->amount . ' | Paid: ' . $payments->sum('amount') . ' | Invoice Date: ' . $invoice->created_at->format('d-m-Y') . (($invoice->amount - $payments->sum('amount')) < 0.01 ? '' : '(' . $invoice->created_at->diffForHumans() . ')') . ''; echo '

'; - } catch (Exception $e){ + } catch (Exception $e) { echo "<------------- Error processing packing list {$packingList->reference}: " . $e->getMessage() . " -------------->"; } } - echo '

Container Invoices: '.$containerBilled.'/'.$containerTotalBillable.'

'; - echo '

Billed Total: '.$containerTotalBilled.'

'; - echo '

Total Paid: '.$containerTotalPaid.'

'; - echo '

Outstanding: '.($totalBilled - $containerTotalPaid).'

'; - echo '

Estimated Cost: '.$containerCost.'

'; + echo '

Container Invoices: ' . $containerBilled . '/' . $containerTotalBillable . '

'; + echo '

Billed Total: ' . $containerTotalBilled . '

'; + echo '

Total Paid: ' . $containerTotalPaid . '

'; + echo '

Outstanding: ' . ($totalBilled - $containerTotalPaid) . '

'; + echo '

Estimated Cost: ' . $containerCost . '

'; echo '


'; } - echo '

Total Invoices: '.$billed.'/'.$totalBillable.'

'; - echo '

Billed Total: '.$totalBilled.'

'; - echo '

Total Paid: '.$totalPaid.'

'; - echo '

Outstanding: '.($totalBilled - $totalPaid).'

'; + echo '

Total Invoices: ' . $billed . '/' . $totalBillable . '

'; + echo '

Billed Total: ' . $totalBilled . '

'; + echo '

Total Paid: ' . $totalPaid . '

'; + echo '

Outstanding: ' . ($totalBilled - $totalPaid) . '

'; }); -Route::get('/yd/fix', function(){ +Route::get('/yd/fix', function () { $packingLists = PackingList::where('type', PackingListType::SHIPPING_PACKING_LIST)->where('status', ApprovalStatus::APPROVED)->where('claimant_id', 2307)->get(); $i = 0; - echo count($packingLists).'

'; - foreach ($packingLists as $packingList){ + echo count($packingLists) . '

'; + foreach ($packingLists as $packingList) { try { (App()->make(UpdateDoFromYDPortalProcessor::class))->execute($packingList); - echo 'success'.'
'; - } catch (Exception $exception){ - echo ''.$packingList->reference.''; + echo 'success' . '
'; + } catch (Exception $exception) { + echo '' . $packingList->reference . ''; } } }); -Route::get('/billplz/fix', function(){ +Route::get('/billplz/fix', function () { $payments = Transaction::where('type', TransactionType::PAYMENT)->where('payment_method', PaymentMethodType::PAYMENT_GATEWAY)->get(); echo '

fixed orders

'; - foreach ($payments as $payment){ - $response = Http::withBasicAuth(config('billplz.api_key').':', '')->get(config('billplz.base_url').'/api/v3/bills/'.$payment->payment_reference); + foreach ($payments as $payment) { + $response = Http::withBasicAuth(config('billplz.api_key') . ':', '')->get(config('billplz.base_url') . '/api/v3/bills/' . $payment->payment_reference); - if($response->successful()){ + if ($response->successful()) { $data = $response->json(); $invoice = $payment->owner; - if(!$invoice){ + if (!$invoice) { continue; } $packingList = $invoice->owner; - $order = $packingList->owner; + $order = $packingList->owner; $orderNumber = $order->reference; - if(!$data['paid'] && $payment->status === ApprovalStatus::APPROVED) { - echo '
Fraude: '.$orderNumber.'
'; + if (!$data['paid'] && $payment->status === ApprovalStatus::APPROVED) { + echo '
Fraude: ' . $orderNumber . '
'; continue; } - if($data['paid']){ - if($payment->status !== ApprovalStatus::APPROVED){ - echo ''.$orderNumber.'
'; + if ($data['paid']) { + if ($payment->status !== ApprovalStatus::APPROVED) { + echo '' . $orderNumber . '
'; } $payment->status = ApprovalStatus::APPROVED; $payment->save(); @@ -838,30 +856,30 @@ Route::get('/billplz/fix', function(){ $invoice->save(); $packingList = $payment->owner->owner; - if(app()->environment('production')){ + if (app()->environment('production')) { try { (App()->make(UpdateDoFromVTPortalProcessor::class))->execute($packingList); (App()->make(UpdateDoFromYDPortalProcessor::class))->execute($packingList); - } catch (Exception $exception){ - echo '
Malformed Address: '.$orderNumber.'
'; + } catch (Exception $exception) { + echo '
Malformed Address: ' . $orderNumber . '
'; } } } - }else{ - echo "billplz error"; + } else { + echo "billplz error"; } } }); -Route::get('/invoices/fix/{company_module_id}', function($company_module_id) { +Route::get('/invoices/fix/{company_module_id}', function ($company_module_id) { $orders = Order::whereIn('company_module_id', json_decode($company_module_id))->get(); - foreach ($orders as $order){ + foreach ($orders as $order) { $invoices = $order->transactions()->where('transactions.type', TransactionType::SHIPPING_INVOICE)->get(); - foreach ($invoices as $invoice){ + foreach ($invoices as $invoice) { // $invoice->documents()->delete(); $invoice->documents()->where('document_type', DocumentType::SHIPPING_EINVOICE)->delete(); @@ -871,10 +889,10 @@ Route::get('/invoices/fix/{company_module_id}', function($company_module_id) { dump($invoice); } } - echo('?'); + echo ('?'); }); -Route::get('/invoices/combine/{ids}', function($ids){ +Route::get('/invoices/combine/{ids}', function ($ids) { $ids = json_decode($ids); $transactions = Transaction::whereIn('id', $ids)->get(); @@ -893,11 +911,10 @@ Route::get('/invoices/combine/{ids}', function($ids){ $pdf = LaravelMpdf::loadView($view, ['invoice_transactions' => $transactions, 'brn' => $brn]); $exportFileName = 'combined_invoices.pdf'; $filesystemDriver = Storage::getDefaultDriver(); - if($filesystemDriver === 's3'){ + if ($filesystemDriver === 's3') { $pdfContent = $pdf->output(); - return response([ 'src' => AWSS3Helper::S3PDF($exportFileName, $pdfContent) ]); - } - else{ + return response(['src' => AWSS3Helper::S3PDF($exportFileName, $pdfContent)]); + } else { return $pdf->download($exportFileName); } })->name('invoice.combined_summary'); @@ -930,19 +947,19 @@ Route::get('/invoices/combine/{ids}', function($ids){ // } // })->name('generate.invoices'); -Route::get('/invoices/approve', function(Request $request){ +Route::get('/invoices/approve', function (Request $request) { $invoices = Transaction::where('type', TransactionType::SHIPPING_INVOICE)->where('status', ApprovalStatus::PENDING_SUBMISSION)->get(); foreach ($invoices as $invoice) { $packingList = $invoice->owner; if (!$packingList) { - dump ('Error packingList not found. Invoice ID - ' . $invoice->id); + dump('Error packingList not found. Invoice ID - ' . $invoice->id); continue; } $order = $packingList->owner; - if ($request->input('exclude')){ - if(in_array($order->reference, json_decode($request->input('exclude')))){ + if ($request->input('exclude')) { + if (in_array($order->reference, json_decode($request->input('exclude')))) { continue; } } @@ -951,7 +968,7 @@ Route::get('/invoices/approve', function(Request $request){ (App()->make(ApproveShippingInvoiceTransactionProcessor::class))->execute($packingList); echo 'Invoice Approved...
'; - } catch (Exception $exception){ + } catch (Exception $exception) { echo 'failed to approve...
'; } @@ -960,7 +977,7 @@ Route::get('/invoices/approve', function(Request $request){ })->name('invoices.approve'); -Route::get('/invoices/show-duplicated', function(Request $request){ +Route::get('/invoices/show-duplicated', function (Request $request) { $transactionWithMultipleInvoice = DB::table('transactions') ->where('type', TransactionType::SHIPPING_INVOICE) ->whereNotIn('status', [ApprovalStatus::EXPIRED, ApprovalStatus::SUSPENDED]) @@ -974,7 +991,7 @@ Route::get('/invoices/show-duplicated', function(Request $request){ $duplicatedOrderId = []; $duplicatedOrderArray = []; - foreach($transactionWithMultipleInvoice as $invoice) { + foreach ($transactionWithMultipleInvoice as $invoice) { $duplicatedOrderId[] = $invoice->owner_id; $duplicatedOrderArray[$invoice->owner_id] = $invoice->count; } @@ -990,32 +1007,32 @@ Route::get('/invoices/show-duplicated', function(Request $request){ echo "Count"; echo ""; - foreach($duplicatedInvoice as $invoice) { + foreach ($duplicatedInvoice as $invoice) { $order = $invoice->owner->owner; $billplzPaymentId = ''; if ($invoice->status == ApprovalStatus::COMPLETED) { if ($invoice->transactions->first()->type == TransactionType::PAYMENT) { - $billplzPaymentId = $invoice->transactions->first()->payment_reference ; + $billplzPaymentId = $invoice->transactions->first()->payment_reference; } } echo ""; - echo ''. $order->reference.' - ' . $order->created_at . ''; - echo "".ApprovalStatus::APPROVAL_STATUS_ID[$invoice->status]. ' Billplz reference: ' . $billplzPaymentId . ""; + echo '' . $order->reference . ' - ' . $order->created_at . ''; + echo "" . ApprovalStatus::APPROVAL_STATUS_ID[$invoice->status] . ' Billplz reference: ' . $billplzPaymentId . ""; echo "$invoice->owner_id"; echo "$invoice->amount"; - echo "".$duplicatedOrderArray[$invoice->owner_id].""; + echo "" . $duplicatedOrderArray[$invoice->owner_id] . ""; echo ""; } echo ''; }); -Route::get('/invoices/delete-duplicated', function(Request $request){ +Route::get('/invoices/delete-duplicated', function (Request $request) { $duplicatedInvoices = DB::table('transactions') ->where('type', TransactionType::SHIPPING_INVOICE) - ->where('status', '!=' , ApprovalStatus::EXPIRED) + ->where('status', '!=', ApprovalStatus::EXPIRED) ->where('deleted_at', null) ->select('owner_id', DB::raw('count(*) as count')) ->groupBy('owner_id') @@ -1024,7 +1041,7 @@ Route::get('/invoices/delete-duplicated', function(Request $request){ $duplicatedInvoices = Transaction::whereIn('owner_id', $duplicatedInvoices->pluck('owner_id'))->get()->groupBy('owner_id'); - foreach($duplicatedInvoices as $invoice) { + foreach ($duplicatedInvoices as $invoice) { $packingList = $invoice->first()->owner; $order = $packingList->owner; @@ -1065,12 +1082,12 @@ Route::get('/invoices/delete-duplicated', function(Request $request){ } }); -Route::get('/packing-lists/show-duplicated', function(Request $request){ +Route::get('/packing-lists/show-duplicated', function (Request $request) { $results = PackingList::select('reference', 'type', DB::raw('count(*) as total')) - ->groupBy('reference', 'type') - ->having('total', '>', 1) - ->get() - ->toArray(); + ->groupBy('reference', 'type') + ->having('total', '>', 1) + ->get() + ->toArray(); echo ''; echo ""; @@ -1079,7 +1096,7 @@ Route::get('/packing-lists/show-duplicated', function(Request $request){ echo ""; echo ""; - foreach($results as $result) { + foreach ($results as $result) { // dd($result); echo ""; echo ""; @@ -1090,18 +1107,18 @@ Route::get('/packing-lists/show-duplicated', function(Request $request){ echo '
count
" . $result['reference'] . "
'; }); -Route::get('/packing-lists/delete-duplicated', function(Request $request){ +Route::get('/packing-lists/delete-duplicated', function (Request $request) { $results = PackingList::select('reference', 'type', DB::raw('count(*) as total')) ->groupBy('reference', 'type') ->having('total', '>', 1) ->get() ->toArray(); - foreach($results as $result) { + foreach ($results as $result) { $duplicatedPackingList = PackingList::where('reference', $result['reference'])->where('type', $result['type'])->orderBy('id', 'desc')->get(); // if packinglist has paid inivoice - $paidPackinglist = PackingList::where('reference', $result['reference'])->where('type', $result['type'])->whereHas('transactions', function($query){ + $paidPackinglist = PackingList::where('reference', $result['reference'])->where('type', $result['type'])->whereHas('transactions', function ($query) { return $query->where('type', TransactionType::SHIPPING_INVOICE)->where('status', ApprovalStatus::COMPLETED); })->get(); @@ -1132,42 +1149,47 @@ Route::get('/wallet/{marking}/details', function ($marking) { return view('pages.wallet.index', ['id' => $id, 'marking' => $marking]); })->name('wallet.details'); -Route::get('/wallet/{wallet_id}/{is_precise}/export', 'Exports\ExportCustomersWalletTransactionToExcelController@export')->name('wallet.details-export'); +Route::get('/wallet/{wallet_id}/{is_precise}/export', [ExportCustomersWalletTransactionToExcelController::class, 'export'])->name('wallet.details-export'); Route::get('/wallet/audit', function (Request $request) { $wallets = \App\Models\Wallet::all(); $i = 0; - foreach ($wallets as $wallet){ + foreach ($wallets as $wallet) { $topups = 0; $credit = 0; $payments = 0; $debit = 0; - foreach ($wallet->transactions as $transaction){ - if(!in_array((int) $transaction->status, [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])) continue; - if((int) $transaction->type === TransactionType::TOP_UP || (int) $transaction->type === TransactionType::GROUP_PAYMENT) { - // if((int) $transaction->type === TransactionType::TOP_UP) { + foreach ($wallet->transactions as $transaction) { + if (!in_array((int) $transaction->status, [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])) + continue; + if ((int) $transaction->type === TransactionType::TOP_UP || (int) $transaction->type === TransactionType::GROUP_PAYMENT) { + // if((int) $transaction->type === TransactionType::TOP_UP) { $topups += (float) $transaction->amount; } - if((int) $transaction->type === TransactionType::CREDIT_NOTE) $credit += (float) $transaction->amount; - if((int) $transaction->type === TransactionType::PAYMENT) $payments += (float) $transaction->amount; - if((int) $transaction->type === TransactionType::DEBIT_NOTE) $debit += (float) $transaction->amount; + if ((int) $transaction->type === TransactionType::CREDIT_NOTE) + $credit += (float) $transaction->amount; + if ((int) $transaction->type === TransactionType::PAYMENT) + $payments += (float) $transaction->amount; + if ((int) $transaction->type === TransactionType::DEBIT_NOTE) + $debit += (float) $transaction->amount; } - if((round((float) $wallet->amount - (($topups + $credit) - ($payments + $debit)), 2) == 0) AND $wallet->amount > -0.01) continue; + if ((round((float) $wallet->amount - (($topups + $credit) - ($payments + $debit)), 2) == 0) AND $wallet->amount > -0.01) + continue; $i++; - echo $i.". Marking: ". $wallet->owner->connections->first()->invitee_reference ."(".$wallet->id.")
Current Balance: ". $wallet->amount ."
Audit Balance: ". (($topups + $credit) - ($payments + $debit)) ."
Difference: ". round((float) $wallet->amount - (($topups + $credit) - ($payments + $debit)), 2) ."


"; + echo $i . ". Marking: " . $wallet->owner->connections->first()->invitee_reference . "(" . $wallet->id . ")
Current Balance: " . $wallet->amount . "
Audit Balance: " . (($topups + $credit) - ($payments + $debit)) . "
Difference: " . round((float) $wallet->amount - (($topups + $credit) - ($payments + $debit)), 2) . "


"; } }); -Route::get('/final-duplicated-invoice-debug', function(){ +Route::get('/final-duplicated-invoice-debug', function () { $duplicatedTransactions = Transaction::select(DB::raw('owner_type, owner_id, receiver, type, GROUP_CONCAT(id) as transaction_ids, COUNT(*) as count')) - ->whereNotIn('status', [ApprovalStatus::REJECTED,ApprovalStatus::SUSPENDED,ApprovalStatus::EXPIRED]) - ->groupBy('owner_type', 'owner_id', 'receiver', 'type') - ->having('count', '>', 1) - ->get(); + ->whereNotIn('status', [ApprovalStatus::REJECTED, ApprovalStatus::SUSPENDED, ApprovalStatus::EXPIRED]) + ->groupBy('owner_type', 'owner_id', 'receiver', 'type') + ->having('count', '>', 1) + ->get(); $approvalStatusArray = ApprovalStatus::APPROVAL_STATUS_ID; @@ -1197,24 +1219,24 @@ Route::get('/final-duplicated-invoice-debug', function(){ } echo ''; - // echo '' . $transaction->owner_type . ''; - // echo '' . $transaction->owner_id . ''; - echo '' . $transaction->receiver . ''; - echo '' . ''. $order_reference .'' . ''; - echo '' . $transactionType[$transaction->type] . ''; - echo '' . count($transactionIds) . ''; - echo ''; - foreach ($duplicatedInvoice as $invoice) { - echo '

ID: ' . $invoice->id . '. Status: ' . $approvalStatusArray[$invoice->status] . '. Amount: ' . $invoice->amount . '

'; - } - echo''; + // echo '' . $transaction->owner_type . ''; + // echo '' . $transaction->owner_id . ''; + echo '' . $transaction->receiver . ''; + echo '' . '' . $order_reference . '' . ''; + echo '' . $transactionType[$transaction->type] . ''; + echo '' . count($transactionIds) . ''; + echo ''; + foreach ($duplicatedInvoice as $invoice) { + echo '

ID: ' . $invoice->id . '. Status: ' . $approvalStatusArray[$invoice->status] . '. Amount: ' . $invoice->amount . '

'; + } + echo ''; echo ''; } echo ''; }); -Route::get('/duplicate-package-clean-up', function(){ +Route::get('/duplicate-package-clean-up', function () { // Fetching duplicate rows based on given columns $duplicates = Package::select('packing_list_id', 'description', 'width', 'height', 'weight', 'quantity', DB::raw('COUNT(*) as count')) ->groupBy('packing_list_id', 'description', 'width', 'height', 'weight', 'quantity') @@ -1267,23 +1289,23 @@ Route::get('/feedback', function () { return view('pages.feedback'); })->name('admin.feedback'); -Route::get('/export/feedback', 'Exports\ExportFeedbackDataController@export')->middleware(['api'])->middleware(['valid.token'])->name('feedback.export'); +Route::get('/export/feedback', [ExportFeedbackDataController::class, 'export'])->middleware(['api'])->middleware(['valid.token'])->name('feedback.export'); Route::get('/404', function () { abort(404); })->name('error.404'); -Route::get('transaction/{id}/credit_note/download', 'Transactions\GenerateCreditNotePdfController@download')->name('transaction.credit_note.download'); +Route::get('transaction/{id}/credit_note/download', [GenerateCreditNotePdfController::class, 'download'])->name('transaction.credit_note.download'); -Route::get('/wallets/active', function(){ +Route::get('/wallets/active', function () { $wallets = Wallet::all(); echo ''; - foreach ($wallets as $wallet){ + foreach ($wallets as $wallet) { $companyMarking = $wallet->owner->getMarking(); echo ''; - echo ''; - echo ''; + echo ''; + echo ''; echo ''; } echo '
'.$companyMarking.''."(".$wallet->id.")".''.$wallet->amount.'' . $companyMarking . '' . "(" . $wallet->id . ")" . '' . $wallet->amount . '
'; @@ -1350,7 +1372,7 @@ Route::get('/show-all-extra-payments', function () { $packingList = $invoice->owner; $order = $packingList->owner; - $companyModule= $order->companyModule; + $companyModule = $order->companyModule; $marking = $companyModule->getMarking(); if (($paidAmount <= $invoice->amount) || ($paidAmount - $invoice->amount < 0.01)) { @@ -1362,13 +1384,13 @@ Route::get('/show-all-extra-payments', function () { echo '' . $invoice->type . ''; echo '' . $invoice->amount . ''; echo '' . $paidAmount . ''; - echo ''.$marking.''; + echo '' . $marking . ''; echo '' . $order->reference . ' - ' . $order->created_at . '
'; echo ''; } echo ''; - echo'
Total: ' . $transactionCounter; + echo '
Total: ' . $transactionCounter; }); Route::get('/segments', function (Request $request) { diff --git a/staging.Dockerfile b/staging.Dockerfile index 53dee762..40e0e69d 100644 --- a/staging.Dockerfile +++ b/staging.Dockerfile @@ -1,3 +1,3 @@ -FROM laravelphp/vapor:php74 +FROM laravelphp/vapor:php83 COPY . /var/task diff --git a/test.Dockerfile b/test.Dockerfile new file mode 100644 index 00000000..40e0e69d --- /dev/null +++ b/test.Dockerfile @@ -0,0 +1,3 @@ +FROM laravelphp/vapor:php83 + +COPY . /var/task diff --git a/tests/Feature/Companies/ControllersLogic/UpdateCompanyEInvoiceInfoLogicTest.php b/tests/Feature/Companies/ControllersLogic/UpdateCompanyEInvoiceInfoLogicTest.php new file mode 100644 index 00000000..a9b30394 --- /dev/null +++ b/tests/Feature/Companies/ControllersLogic/UpdateCompanyEInvoiceInfoLogicTest.php @@ -0,0 +1,318 @@ +canCreateAddressMock = Mockery::mock(CanCreateAddress::class); + $this->fetchesDistrictMock = Mockery::mock(FetchesDistrict::class); + $this->fetchesCompanyModuleMock = Mockery::mock(FetchesCompanyModule::class); + $this->createsAddressMock = Mockery::mock(CreatesAddress::class); + $this->ruleEvaluatorMock = Mockery::mock(RuleEvaluator::class); + $this->updatesCompanyEInvoiceInfoMock = Mockery::mock(UpdatesCompanyEInvoiceInfo::class); + $this->canPassEInvoicePromptedRuleMock = Mockery::mock(CanPassEInvoicePromptedRule::class); + + $this->updateCompanyEInvoiceInfoLogic = new UpdateCompanyEInvoiceInfoLogic( + $this->canCreateAddressMock, + $this->fetchesDistrictMock, + $this->fetchesCompanyModuleMock, + $this->createsAddressMock, + $this->ruleEvaluatorMock, + $this->updatesCompanyEInvoiceInfoMock, + $this->canPassEInvoicePromptedRuleMock + ); + } + + public function tearDown(): void + { + Mockery::close(); + parent::tearDown(); + } + + public function test_logic_successfully_updates_einvoice_info_with_new_billing_address() + { + // Arrange + $requestData = [ + 'tin' => self::TIN, + 'msic_code' => self::MSIC_CODE, + 'district_id' => 1, + 'state_id' => 1, + 'company_module_id' => 1, + 'street_one' => '123 Main Street', + 'street_two' => 'Suite 100', + 'post_code' => '50000', + ]; + + $mockDistrict = Mockery::mock(District::class)->makePartial(); + $mockDistrict->id = 1; + $mockDistrict->country_id = 1; + + $mockCompany = Mockery::mock(Company::class)->makePartial(); + $mockCompany->id = 1; + + $mockCompanyModule = Mockery::mock(CompanyModule::class)->makePartial(); + $mockCompanyModule->id = 1; + $mockCompanyModule->company = $mockCompany; + + // Mock addresses collection with no billing address + $addressesCollection = new Collection([]); + $mockCompanyModule->addresses = $addressesCollection; + + // Mock rule evaluation - success + $this->ruleEvaluatorMock->shouldReceive('evaluate') + ->once() + ->andReturn(new RuleEvaluationResult(true, [])); + + $this->fetchesDistrictMock->shouldReceive('execute') + ->once() + ->with(['id' => 1]) + ->andReturn($mockDistrict); + + $this->canCreateAddressMock->shouldReceive('passes') + ->once() // Only once for E-Invoice address, not for billing address + ->with(Mockery::type(AddressObject::class)) + ->andReturn(true); + + //CompanyModule for checking billing address + $this->fetchesCompanyModuleMock->shouldReceive('execute') + ->once() + ->with(['id' => 1]) + ->andReturn($mockCompanyModule); + + $this->createsAddressMock->shouldReceive('execute') + ->twice() // Once for E-Invoice address, once for billing address + ->andReturn(Mockery::mock(Address::class)); + + //Update tin, msic code + $this->updatesCompanyEInvoiceInfoMock->shouldReceive('execute') + ->once() + ->with($mockCompany, self::TIN, self::MSIC_CODE) + ->andReturn($mockCompany); + + $request = Request::create('/company/einvoice', 'POST', $requestData); + + // Act + $response = $this->updateCompanyEInvoiceInfoLogic->logic($request); + + // Assert + $this->assertInstanceOf(JsonResponse::class, $response); + $this->assertEquals(200, $response->getStatusCode()); + } + + public function test_logic_successfully_updates_einvoice_info_with_existing_billing_address() + { + // Arrange + $requestData = [ + 'tin' => self::TIN, + 'msic_code' => self::MSIC_CODE, + 'district_id' => 2, + 'state_id' => 2, + 'company_module_id' => 2, + 'street_one' => '456 Second Street', + 'street_two' => 'Floor 2', + 'post_code' => '60000', + ]; + + $mockDistrict = Mockery::mock(District::class)->makePartial(); + $mockDistrict->id = 2; + $mockDistrict->country_id = 1; + + $mockCompany = Mockery::mock(Company::class)->makePartial(); + $mockCompany->id = 2; + + $mockBillingAddress = Mockery::mock(Address::class)->makePartial(); + $mockBillingAddress->id = 1; + $mockBillingAddress->type = AddressType::BILLING; + $mockBillingAddress->status = ApprovalStatus::APPROVED; + + $mockCompanyModule = Mockery::mock(CompanyModule::class)->makePartial(); + $mockCompanyModule->id = 2; + $mockCompanyModule->company = $mockCompany; + + // Mock addresses collection with existing billing address + $addressesCollection = new Collection([$mockBillingAddress]); + $mockCompanyModule->addresses = $addressesCollection; + + // Mock rule evaluation - success + $this->ruleEvaluatorMock->shouldReceive('evaluate') + ->once() + ->andReturn(new RuleEvaluationResult(true, [])); + + $this->fetchesDistrictMock->shouldReceive('execute') + ->once() + ->with(['id' => 2]) + ->andReturn($mockDistrict); + + $this->canCreateAddressMock->shouldReceive('passes') + ->once() // Only once for E-Invoice address, not for billing + ->with(Mockery::type(AddressObject::class)) + ->andReturn(true); + + $this->fetchesCompanyModuleMock->shouldReceive('execute') + ->once() + ->with(['id' => 2]) + ->andReturn($mockCompanyModule); + + $this->createsAddressMock->shouldReceive('execute') + ->once() // Only once for E-Invoice address + ->andReturn(Mockery::mock(Address::class)); + + //Update tin, msic code + $this->updatesCompanyEInvoiceInfoMock->shouldReceive('execute') + ->once() + ->with($mockCompany, self::TIN, self::MSIC_CODE) + ->andReturn($mockCompany); + + $request = Request::create('/company/einvoice', 'POST', $requestData); + + // Act + $response = $this->updateCompanyEInvoiceInfoLogic->logic($request); + + // Assert + $this->assertInstanceOf(JsonResponse::class, $response); + $this->assertEquals(200, $response->getStatusCode()); + } + + public function test_logic_throws_exception_when_rule_evaluation_fails() + { + // Arrange + $requestData = [ + 'tin' => 'invalid', + 'msic_code' => 'invalid', + 'district_id' => 1, + 'state_id' => 1, + 'company_module_id' => 1, + 'street_one' => 'Test Street', + 'street_two' => '', + 'post_code' => '12345', + ]; + + // Mock rule evaluation - failure + $this->ruleEvaluatorMock->shouldReceive('evaluate') + ->once() + ->andReturn(new RuleEvaluationResult(false, ['Invalid TIN format', 'Invalid MSIC code'])); + + $request = Request::create('/company/einvoice', 'POST', $requestData); + + // Assert + $this->expectException(CriteriaNotFulfilledException::class); + $this->expectExceptionMessage('- Invalid TIN format
- Invalid MSIC code'); + + // Act + $this->updateCompanyEInvoiceInfoLogic->logic($request); + } + + public function test_logic_validates_address_creation() + { + // Arrange + $requestData = [ + 'tin' => self::TIN, + 'msic_code' => self::MSIC_CODE, + 'district_id' => 3, + 'state_id' => 3, + 'company_module_id' => 3, + 'street_one' => '789 Third Avenue', + 'street_two' => 'Unit 5', + 'post_code' => '70000', + ]; + + $mockDistrict = Mockery::mock(District::class)->makePartial(); + $mockDistrict->id = 3; + $mockDistrict->country_id = 1; + + $mockCompany = Mockery::mock(Company::class)->makePartial(); + $mockCompany->id = 3; + + $mockCompanyModule = Mockery::mock(CompanyModule::class)->makePartial(); + $mockCompanyModule->id = 3; + $mockCompanyModule->company = $mockCompany; + + // Mock addresses collection with no billing address + $addressesCollection = new Collection([]); + $mockCompanyModule->addresses = $addressesCollection; + + // Mock rule evaluation - success + $this->ruleEvaluatorMock->shouldReceive('evaluate') + ->once() + ->andReturn(new RuleEvaluationResult(true, [])); + + $this->fetchesDistrictMock->shouldReceive('execute') + ->once() + ->with(['id' => 3]) + ->andReturn($mockDistrict); + + // Verify that passes() is called with AddressObject + $this->canCreateAddressMock->shouldReceive('passes') + ->once() // Only once for E-Invoice address, not for billing address + ->with(Mockery::type(AddressObject::class)) + ->andReturn(true); + + $this->fetchesCompanyModuleMock->shouldReceive('execute') + ->once() + ->with(['id' => 3]) + ->andReturn($mockCompanyModule); + + $this->createsAddressMock->shouldReceive('execute') + ->twice() + ->andReturn(Mockery::mock(Address::class)); + + //Update tin, msic code + $this->updatesCompanyEInvoiceInfoMock->shouldReceive('execute') + ->once() + ->with($mockCompany, self::TIN, self::MSIC_CODE) + ->andReturn($mockCompany); + + $request = Request::create('/company/einvoice', 'POST', $requestData); + + // Act + $response = $this->updateCompanyEInvoiceInfoLogic->logic($request); + + // Assert + $this->assertInstanceOf(JsonResponse::class, $response); + } +} diff --git a/tests/Feature/Companies/Processors/CreateCompanyTest.php b/tests/Feature/Companies/Processors/CreateCompanyTest.php new file mode 100644 index 00000000..dc1f91a4 --- /dev/null +++ b/tests/Feature/Companies/Processors/CreateCompanyTest.php @@ -0,0 +1,54 @@ +execute( + $name, + CompanyType::COMPANY_BUSINESS, + ApprovalStatus::APPROVED + ); + + // Assert + $this->assertInstanceOf(Company::class, $company); + $this->assertEquals($name, $company->name); + $this->assertEquals(CompanyType::COMPANY_BUSINESS, $company->type); + $this->assertEquals(ApprovalStatus::APPROVED, $company->status); + $this->assertNotEmpty($company->reference); + + // Final database verification + $this->assertDatabaseHas('companies', [ + 'id' => $company->id, + 'name' => $name, + 'reference' => $company->reference + ]); + } +} diff --git a/tests/Feature/ExampleTest.php b/tests/Feature/ExampleTest.php deleted file mode 100644 index fa24b57a..00000000 --- a/tests/Feature/ExampleTest.php +++ /dev/null @@ -1,20 +0,0 @@ -get('/swagger'); - - $response->assertStatus(200); - } -} diff --git a/tests/Unit/Orders/ControllersLogic/ListOrderTrackingLogicTest.php b/tests/Feature/Orders/ControllersLogic/ListOrderTrackingLogicTest.php similarity index 65% rename from tests/Unit/Orders/ControllersLogic/ListOrderTrackingLogicTest.php rename to tests/Feature/Orders/ControllersLogic/ListOrderTrackingLogicTest.php index feda3b2a..f16ffeaf 100644 --- a/tests/Unit/Orders/ControllersLogic/ListOrderTrackingLogicTest.php +++ b/tests/Feature/Orders/ControllersLogic/ListOrderTrackingLogicTest.php @@ -1,6 +1,6 @@ listOrderTrackingLogic = new ListOrderTrackingLogic($this->canListTrackingsMock, $this->listsOrderTrackingMock); } - public function tearDown(): void - { - Mockery::close(); - parent::tearDown(); - } - - public function test_logic_with_valid_tracking_number() { // Arrange $trackingNo = '123456789'; $reference = 'X202503131317208'; - $orderId = 1; - $packingListId = 1; - $mockOrder = Mockery::mock('overload:' . Order::class)->makePartial(); - $mockOrder->shouldReceive('where') - ->with('reference', $trackingNo) - ->andReturnSelf(); - $mockOrder->shouldReceive('first') - ->andReturn($mockOrder); - $mockOrder->id = $orderId; - $mockOrder->reference = $trackingNo; + $company = new Company(); + $company->name = 'Test Company'; + $company->reference = 'TEST-' . uniqid(); + $company->status = ApprovalStatus::APPROVED; + $company->save(); - $mockPackingList = Mockery::mock('overload:' . PackingList::class)->makePartial(); - $mockPackingList->id = $packingListId; - $mockPackingList->reference = $reference; + $companyModule = new CompanyModule(); + $companyModule->company_id = $company->id; + $companyModule->type = BusinessType::IMPORTER; + $companyModule->reference = 'TEST-IMP-' . uniqid(); + $companyModule->name = 'Test Company Module'; + $companyModule->unity_hash_id = '123456789'; + $companyModule->unity_signature = '123456789'; + $companyModule->status = ApprovalStatus::APPROVED; + $companyModule->save(); - $mockOrder->shouldReceive('packingLists')->andReturn(collect([$mockPackingList])); + $order = new Order(); + $order->reference = $trackingNo; + $order->type = OrderType::SHARED_CONTAINER; + $order->status = ApprovalStatus::APPROVED; + $order->company_module_id = $companyModule->id; + $order->save(); + + $packingList = new PackingList(); + $packingList->reference = $reference; + $packingList->owner_type = Order::class; + $packingList->owner_id = $order->id; + $packingList->save(); Artisan::shouldReceive('call') ->once() @@ -87,7 +106,7 @@ class ListOrderTrackingLogicTest extends TestCaseChild public function test_logic_with_invalid_tracking_number_for_admin() { - // Arrange + // Arrange $user = (object) ['type' => ['ADMIN']]; Auth::shouldReceive('user')->andReturn($user); @@ -100,9 +119,9 @@ class ListOrderTrackingLogicTest extends TestCaseChild $request = Request::create('/tracking', 'GET', ['filters' => json_encode(['tracking_no' => Crypt::encryptString('invalid')])]); Artisan::shouldReceive('call') - ->once() - ->withArgs(['process-yd-by-traking-no-data-command', ['trackingNo' => 'invalid']]) - ->andReturn(0); + ->once() + ->withArgs(['process-yd-by-traking-no-data-command', ['trackingNo' => 'invalid']]) + ->andReturn(0); // Act $fakeRequest = $this->listOrderTrackingLogic->logic($request); @@ -123,8 +142,8 @@ class ListOrderTrackingLogicTest extends TestCaseChild $request = Request::create('/tracking', 'GET', ['filters' => json_encode(['tracking_no' => 'test'])]); $this->canListTrackingsMock - ->shouldReceive('passes') - ->andThrow(new AccessForbiddenException("You don't have permission to perform this action")); + ->shouldReceive('passes') + ->andThrow(new AccessForbiddenException("You don't have permission to perform this action")); // Assert $this->expectException(AccessForbiddenException::class); diff --git a/tests/Feature/Orders/Processors/CreateOrderTest.php b/tests/Feature/Orders/Processors/CreateOrderTest.php new file mode 100644 index 00000000..95ede0c0 --- /dev/null +++ b/tests/Feature/Orders/Processors/CreateOrderTest.php @@ -0,0 +1,161 @@ +name = 'CIEF'; + $cief->reference = 'CIEF'; + $cief->status = ApprovalStatus::APPROVED; + $cief->save(); + + $ciefFreightForwarder = new CompanyModule(); + $ciefFreightForwarder->company_id = $cief->id; + $ciefFreightForwarder->type = BusinessType::FREIGHT_FORWARDER; + $ciefFreightForwarder->status = ApprovalStatus::APPROVED; + $ciefFreightForwarder->name = 'CIEF Freight Forwarder'; + $ciefFreightForwarder->reference = 'CIEF'; + $ciefFreightForwarder->unity_hash_id = 'CIEF-HASH-' . uniqid(); + $ciefFreightForwarder->unity_signature = 'CIEF-SIG-' . uniqid(); + $ciefFreightForwarder->save(); + + // 2. Create Destination Warehouse (required by CreateOrderRolesProcessor) + $destWarehouseCompany = new Company(); + $destWarehouseCompany->name = 'Destination Warehouse Company'; + $destWarehouseCompany->reference = 'DWC-' . uniqid(); + $destWarehouseCompany->status = ApprovalStatus::APPROVED; + $destWarehouseCompany->save(); + + $destWarehouseModule = new CompanyModule(); + $destWarehouseModule->company_id = $destWarehouseCompany->id; + $destWarehouseModule->reference = WarehouseReferences::YD_DESTINATION_WAREHOUSE; + $destWarehouseModule->type = BusinessType::WAREHOUSE; + $destWarehouseModule->status = ApprovalStatus::APPROVED; + $destWarehouseModule->name = 'Destination Warehouse Module'; + $destWarehouseModule->unity_hash_id = 'DWM-HASH-' . uniqid(); + $destWarehouseModule->unity_signature = 'DWM-SIG-' . uniqid(); + $destWarehouseModule->save(); + + // 3. Create Origin Warehouse and its Freight Forwarder (required by CreateOrderRolesProcessor) + $originWarehouseCompany = new Company(); + $originWarehouseCompany->name = 'Origin Warehouse Company'; + $originWarehouseCompany->reference = 'OWC-' . uniqid(); + $originWarehouseCompany->status = ApprovalStatus::APPROVED; + $originWarehouseCompany->save(); + + $originWarehouse = new CompanyModule(); + $originWarehouse->company_id = $originWarehouseCompany->id; + $originWarehouse->reference = WarehouseReferences::YD_GUANG_ZHOU; + $originWarehouse->type = BusinessType::WAREHOUSE; + $originWarehouse->status = ApprovalStatus::APPROVED; + $originWarehouse->name = 'Origin Warehouse Module'; + $originWarehouse->unity_hash_id = 'OWM-HASH-' . uniqid(); + $originWarehouse->unity_signature = 'OWM-SIG-' . uniqid(); + $originWarehouse->save(); + + $originFreightForwarder = new CompanyModule(); + $originFreightForwarder->company_id = $originWarehouseCompany->id; + $originFreightForwarder->type = BusinessType::FREIGHT_FORWARDER; + $originFreightForwarder->status = ApprovalStatus::APPROVED; + $originFreightForwarder->name = 'Origin Freight Forwarder'; + $originFreightForwarder->reference = 'OFF-' . uniqid(); + $originFreightForwarder->unity_hash_id = 'OFF-HASH-' . uniqid(); + $originFreightForwarder->unity_signature = 'OFF-SIG-' . uniqid(); + $originFreightForwarder->save(); + + // 4. Create Importer Company + $importerCompany = new Company(); + $importerCompany->name = 'Test Importer'; + $importerCompany->reference = '123456789'; + $importerCompany->status = ApprovalStatus::APPROVED; + $importerCompany->save(); + + $importerModule = new CompanyModule(); + $importerModule->company_id = $importerCompany->id; + $importerModule->type = BusinessType::IMPORTER; + $importerModule->status = ApprovalStatus::APPROVED; + $importerModule->name = 'Test Importer Module'; + $importerModule->reference = 'TEST-IMP-' . uniqid(); + $importerModule->unity_hash_id = 'IM-HASH-' . uniqid(); + $importerModule->unity_signature = 'IM-SIG-' . uniqid(); + $importerModule->save(); + + // 5. Create Input Address + $address = new Address(); + $address->street_one = '123 Test St'; + $address->country_id = 1; + $address->district_id = 1; + $address->state_id = 1; + $address->postcode = '12345'; + $address->type = 1; + $address->owner_type = Company::class; + $address->owner_id = $importerCompany->id; + $address->save(); + + /** @var CreateOrderProcessor $processor */ + $processor = app(CreateOrderProcessor::class); + + $orderNumber = mt_rand(100000, 999999); + + // Act + $order = $processor->execute( + $importerCompany, + $originWarehouse, + $address, + $orderNumber + ); + + // Assert + $this->assertInstanceOf(Order::class, $order); + $this->assertEquals($orderNumber, $order->reference); + $this->assertEquals(OrderType::SHARED_CONTAINER, $order->type); + + // Verify Order Address was created + $this->assertCount(1, $order->addresses); + $this->assertEquals($address->street_one, $order->addresses->first()->street_one); + + // Verify Roles (at least basic ones) + $this->assertDatabaseHas('order_roles', [ + 'order_id' => $order->id, + 'company_module_id' => $originWarehouse->id, + ]); + + $this->assertDatabaseHas('orders', [ + 'id' => $order->id, + 'reference' => $orderNumber + ]); + } +} diff --git a/tests/Feature/Segments/ControllersLogic/UpdateSegmentPriceTest.php b/tests/Feature/Segments/ControllersLogic/UpdateSegmentPriceTest.php new file mode 100644 index 00000000..5250f08d --- /dev/null +++ b/tests/Feature/Segments/ControllersLogic/UpdateSegmentPriceTest.php @@ -0,0 +1,122 @@ +admin = new User(); + $this->admin->name = 'Admin User'; + $this->admin->email = 'admin@example.com'; + $this->admin->password = bcrypt('password'); + $this->admin->type = RoleTypes::ADMIN; + $this->admin->status = 1; + $this->admin->save(); + + // Create a test segment + $this->segment = new Segment(); + $this->segment->name = 'Test Segment'; + $this->segment->company_module_id = 1; + $this->segment->save(); + } + + /** + * Test updating an existing segment price constant. + */ + public function test_it_can_update_segment_price_constant() + { + // Arrange + $reference = 'test_price_ref'; + $value = 100.50; + + $constant = new SegmentConstant(); + $constant->segment_id = $this->segment->id; + $constant->reference = $reference; + $constant->value = [50.00]; + $constant->save(); + + $payload = [ + 'reference' => $reference, + 'value' => $value + ]; + + // Act + $response = $this->actingAs($this->admin, 'api') + ->putJson("/v1/api/segment/price/update/{$this->segment->id}", $payload); + + // Assert + $response->assertStatus(200); + $response->assertJsonStructure([ + 'data' => [ + 'id', + 'reference', + 'value' + ], + 'notification' => [ + 'title', + 'message' + ] + ]); + + $this->assertDatabaseHas('segment_constants', [ + 'segment_id' => $this->segment->id, + 'reference' => $reference, + 'value' => json_encode([$value]) + ]); + } + + /** + * Test creating a constant if it doesn't exist and then updating it. + */ + public function test_it_creates_constant_if_not_exists_then_updates_it() + { + // Arrange + $reference = 'new_price_ref'; + $value = 75.25; + + $payload = [ + 'reference' => $reference, + 'value' => $value + ]; + + // Act + $response = $this->actingAs($this->admin, 'api') + ->putJson("/v1/api/segment/price/update/{$this->segment->id}", $payload); + + // Assert + $response->assertStatus(200); + + $this->assertDatabaseHas('segment_constants', [ + 'segment_id' => $this->segment->id, + 'reference' => $reference, + 'value' => json_encode([$value]) + ]); + } +} diff --git a/tests/Unit/Segments/Services/CreatesConstantTest.php b/tests/Unit/Segments/Services/CreatesConstantTest.php new file mode 100644 index 00000000..01f1d6d9 --- /dev/null +++ b/tests/Unit/Segments/Services/CreatesConstantTest.php @@ -0,0 +1,58 @@ +service = new CreatesConstant(); + } + + public function test_it_can_create_a_constant() + { + // Arrange + $segment = new Segment(); + $segment->name = 'Test Segment'; + $segment->company_module_id = 1; + $segment->save(); + + $reference = 'test_reference'; + $values = ['value1', 'value2']; + $object = new ConstantObject($reference, $values); + + // Act + $constant = $this->service->execute($segment, $object); + + // Assert + $this->assertInstanceOf(SegmentConstant::class, $constant); + $this->assertEquals($reference, $constant->reference); + $this->assertEquals($values, $constant->value); + $this->assertEquals($segment->id, $constant->segment_id); + + $this->assertDatabaseHas('segment_constants', [ + 'segment_id' => $segment->id, + 'reference' => $reference, + ]); + $this->assertEquals($values, $constant->fresh()->value); + } +} diff --git a/tests/Unit/Segments/Services/UpdatesConstantTest.php b/tests/Unit/Segments/Services/UpdatesConstantTest.php new file mode 100644 index 00000000..d9c20b8c --- /dev/null +++ b/tests/Unit/Segments/Services/UpdatesConstantTest.php @@ -0,0 +1,57 @@ +service = new UpdatesConstant(); + } + + public function test_it_can_update_a_constant() + { + // Arrange + $constant = new SegmentConstant(); + $constant->segment_id = 1; // Assuming segment_id 1 exists (we don't strictly need the Segment model to update the constant if we set the ID) + $constant->reference = 'old_reference'; + $constant->value = ['old_value']; + $constant->save(); + + $reference = 'new_reference'; + $values = ['new_value1', 'new_value2']; + $object = new ConstantObject($reference, $values); + + // Act + $result = $this->service->execute($constant, $object); + + // Assert + $this->assertEquals($reference, $constant->reference); + $this->assertEquals($values, $constant->value); + $this->assertSame($constant, $result); + + $this->assertDatabaseHas('segment_constants', [ + 'id' => $constant->id, + 'reference' => $reference, + ]); + $this->assertEquals($values, $constant->fresh()->value); + } +} diff --git a/vapor.yml b/vapor.yml index e6e07cc3..67b9067f 100644 --- a/vapor.yml +++ b/vapor.yml @@ -62,4 +62,21 @@ environments: - 'gulp build' deploy: - 'php artisan migrate --force' + test: + memory: 1024 + cli-memory: 512 + queues: + - shipping-portal-default-test + - shipping-portal-high_priority-test + database: cief-amazon-rds-mysql + storage: shipping-portal-test + runtime: 'docker' + timeout: 180 + build: + - 'composer update' + - 'npm install' + - 'npm run dev' + - 'gulp build' + deploy: + - 'php artisan migrate --force'