Compare commits

...

87 Commits

Author SHA1 Message Date
Dillon Ngo ffdaf8bb1d Merge branch 'dillon/137-project-upgrade-update-1A' into vapor/production 2026-08-10 17:07:13 +08:00
Dillon Ngo 253889709b Emergency fix for inaccurate storage fee calculation 2026-08-10 17:06:34 +08:00
Dillon Ngo 9d1524c9d6 Merge branch 'dillon/137-project-upgrade-update-1A' into vapor/production 2026-08-06 12:15:19 +08:00
Dillon Ngo 6cc8283594 Sin Yee requested for additional info to be included in arrived-parcel.xlsx 2026-08-06 12:01:43 +08:00
Dillon Ngo 386e1c36e1 Merge branch 'dillon/137-project-upgrade-update-1A' into vapor/production 2026-07-24 15:42:00 +08:00
Dillon Ngo 390510e8aa Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment)
- Fix an error reported by KS on settings > Warehouses > Extra Charges
2026-07-24 15:41:27 +08:00
Dillon Ngo d95efdcf27 Merge branch 'dillon/137-project-upgrade-update-1A' into vapor/production 2026-07-23 13:06:45 +08:00
Dillon Ngo f834bfd63a Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment)
- Fix an error reported by KS on settings > Warehouses > Extra Charges
2026-07-23 13:06:12 +08:00
Dillon Ngo 45f9c091d2 Merge branch 'dillon/137-project-upgrade-update-1A' into vapor/production 2026-07-22 21:47:00 +08:00
Dillon Ngo 1336b3f3ae Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment)
- Fix an error reported by KS on settings > Warehouses > Extra Charges
2026-07-22 21:46:38 +08:00
Dillon Ngo 1ae885ea78 Merge branch 'dillon/137-project-upgrade-update-1A' into vapor/production 2026-07-22 03:14:12 +08:00
Dillon Ngo fe1df936ed Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-22 03:05:31 +08:00
Dillon Ngo f61381a734 Merge branch 'dillon/137-project-upgrade-update-1A' into vapor/production 2026-07-08 02:12:54 +08:00
Dillon Ngo f05ce01a40 Fix previously marked TODO 2026-07-08 02:12:40 +08:00
Dillon Ngo 7dd796ad50 Merge branch 'dillon/137-project-upgrade-update-1A' into vapor/production 2026-07-08 01:50:37 +08:00
Dillon Ngo f1d5de226f Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment)
- Fix a timing problem exist before upgrade from Vue 2 to Vue 3
2026-07-08 01:37:54 +08:00
Dillon Ngo adfa6e2626 Merge branch 'dillon/137-project-upgrade-update-1A' into vapor/production 2026-07-07 01:28:03 +08:00
Dillon Ngo 2625d58da2 Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-07 00:33:55 +08:00
Dillon Ngo 75d3f74d09 Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-05 12:24:11 +08:00
Dillon Ngo f420afd790 Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-05 12:16:51 +08:00
Dillon Ngo d41b82bcee Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-04 22:48:14 +08:00
Dillon Ngo c70d6244f2 Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-04 21:32:13 +08:00
Dillon Ngo d09709c65d Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-04 21:09:57 +08:00
Dillon Ngo 0a24113fdb Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-04 20:28:00 +08:00
Dillon Ngo 7cc22d555c Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-03 22:24:55 +08:00
Dillon Ngo eac7885ef9 Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-03 22:06:14 +08:00
Dillon Ngo c01c127846 Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-03 21:47:14 +08:00
Dillon Ngo 76692755ca Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-01 12:25:08 +08:00
Dillon Ngo 9d09eb4dd7 Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-01 12:09:29 +08:00
Dillon Ngo ab67557d89 Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment)
- Minor update on docker-compose,yml
2026-07-01 11:13:27 +08:00
Dillon Ngo f9eef62536 Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-01 11:03:40 +08:00
Dillon Ngo 2566f26c53 Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-07-01 10:10:07 +08:00
Dillon Ngo dc553e5e95 Fix server error reported by Mira: failed to approve address due to an error related to VT portal: Client error: POST http://portal.vtnation.com.my/Services/DataControllerService.asmx/Login 2026-06-30 12:20:30 +08:00
Dillon Ngo 000c212085 Fix server error reported by Kanisha: failed to approve address due to an error related to VT portal: Client error: POST http://portal.vtnation.com.my/Services/DataControllerService.asmx/Login 2026-06-29 11:38:37 +08:00
Dillon Ngo 01c53c20df Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-06-21 15:53:07 +08:00
Dillon Ngo 7a7c096aba Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-06-21 15:10:34 +08:00
Dillon Ngo e5a474f21c Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-06-16 16:51:12 +08:00
Dillon Ngo 11b24f376c Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-06-16 16:02:03 +08:00
Dillon Ngo 7314c3aa0b Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-06-16 15:47:17 +08:00
Dillon Ngo e52dee2877 Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-06-10 15:30:07 +08:00
Dillon Ngo 1c393e86e2 Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-06-08 19:42:42 +08:00
Dillon Ngo 7f66e616de Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-06-05 20:15:52 +08:00
Dillon Ngo 56e4c07adb Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml (Post PROD Deployment) 2026-05-28 11:30:50 +08:00
Dillon Ngo 9b0746246c Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml 2026-05-27 20:59:43 +08:00
Dillon Ngo baa3bb3d4e Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml 2026-05-27 20:52:19 +08:00
Dillon Ngo 51ae5c756e Update: Vue 2 to Vue 3 with Typescript, node 14 to node 22, Jenkinsfile, Dockerfile, vapor.yml 2026-05-27 20:43:27 +08:00
Dillon Ngo 5ca007ab28 Fix YD API integration issue reported by Zhy Mei 2026-05-26 22:50:54 +08:00
Dillon Ngo f190997634 Show reference info on order page > Received Parcels section requested by Kanisha 2026-05-13 11:09:34 +08:00
Dillon Ngo 5dd8a70677 Fix a 504 Endpoint request timed out error at customer payment-and-billing page with storage invoice 2026-05-01 12:07:33 +08:00
Dillon Ngo 9dbb6a8b49 Fix a 504 Endpoint request timed out error at customer payment-and-billing page with storage invoice 2026-05-01 11:49:31 +08:00
Dillon Ngo 812da07f63 Fix a 504 Endpoint request timed out error at customer payment-and-billing page with storage invoice 2026-05-01 10:34:25 +08:00
Dillon Ngo 130aa78dfe Fix a 504 Endpoint request timed out error at customer payment-and-billing page with storage invoice 2026-05-01 10:13:38 +08:00
Dillon Ngo f820ba578f Fx to resolve a 504 Endpoint request timed out error on loading packages details on order page 2026-04-24 17:48:41 +08:00
Dillon Ngo 961f8acf65 Fx to resolve a 504 Endpoint request timed out error on loading packages details on order page 2026-04-24 15:53:58 +08:00
Dillon Ngo 9a2a5d797c Fx to resolve a 504 Endpoint request timed out error on loading packages details on order page 2026-04-24 15:38:22 +08:00
Dillon Ngo 743662af9e Temporary undo a previous fix to resolve a 504 Endpoint request timed out error 2026-04-24 10:26:57 +08:00
Dillon Ngo 1ba98379bf Temporary fix some yd integration api not showing reported by Zhy Mei 2026-04-14 23:07:50 +08:00
Dillon Ngo 0f18556667 Temporary fix some yd integration api not showing reported by Zhy Mei 2026-04-14 22:49:49 +08:00
Dillon Ngo 27b4dee1e3 Fix Jenkins Deployment issue 2026-04-10 13:08:44 +08:00
Dillon Ngo 3e982f5351 Fix missing E-Invoice no. in invoices's pdf summary 2026-04-10 13:00:08 +08:00
Dillon Ngo b17fe23652 Fix missing E-Invoice no. in invoices's pdf summary 2026-04-10 12:30:04 +08:00
Dillon Ngo 191bd161f3 Fix missing E-Invoice no. in invoices's pdf summary 2026-04-10 12:17:27 +08:00
Dillon Ngo 6b8a61877e Fix missing E-Invoice no. in invoices's pdf summary 2026-04-10 11:37:36 +08:00
Dillon Ngo 9730fa79e4 Fix missing E-Invoice no. in invoices's pdf summary 2026-04-10 11:22:48 +08:00
Dillon Ngo 009c064002 Fix missing E-Invoice no. in invoices's pdf summary 2026-04-10 11:11:40 +08:00
Dillon Ngo 6be228e7fd Fix missing E-Invoice no. in invoices's pdf summary 2026-04-10 10:11:19 +08:00
Dillon Ngo fd52aa6b01 Fix missing E-Invoice no. in invoices's pdf summary 2026-04-10 09:50:22 +08:00
Dillon Ngo de4c09fb07 Update tests 2026-04-06 11:26:16 +08:00
Dillon Ngo adb81ebfe9 Minor UI update 2026-03-26 11:04:45 +08:00
Dillon Ngo 8d11ff6b7f Update: laravel 8 to 12, php 7.3 to php 8.3, Jenkinsfile, Unit/Feature testing, vapor 2026-03-25 07:51:49 +08:00
Dillon Ngo 76cc4296a3 Minor UI update 2026-03-19 01:56:23 +08:00
Dillon Ngo 90f485f84b Update to use cheaper claude model 2026-03-18 09:27:34 +08:00
Dillon Ngo 1cc3581800 Enhancement to allow admin to delete package safely with immediate pull again from YD api 2026-03-17 16:30:33 +08:00
Dillon Ngo 7dfa7b0220 Update Jenkinsfile 2026-03-16 22:52:12 +08:00
Dillon Ngo 27204bca13 Emergency fix invoice transaction details inaccurate 2026-03-16 22:28:59 +08:00
Edmond Lang b735462321 rename qr warehouse prefix 2026-03-10 15:31:07 +08:00
Dillon Ngo 8b2ef2acd4 FIx an issue reported by Eileen, a customer payment and billing page not loading 2026-03-07 00:46:09 +08:00
Dillon Ngo f5f278fb77 Merge branch 'dillon/138-fix-generate-summary-invoice-issue' into vapor/production 2026-02-23 03:22:58 +08:00
Dillon Ngo 8afa6a496e Minor update on UX 2026-02-23 03:22:47 +08:00
Dillon Ngo 03a7ed5785 Added missing environment variable into .env.example 2026-02-18 23:06:18 +08:00
Dillon Ngo efe5ccecea Fix a problem reported by Joanne about group payment invoices not appearing properly 2026-02-12 16:05:33 +08:00
Dillon Ngo 7faeec6ef7 Fix a problem reported by Joanne about group payment invoices not appearing properly 2026-02-12 15:44:05 +08:00
Dillon Ngo 20e7e19bc6 Merge branch 'dillon/138-fix-generate-summary-invoice-issue' into vapor/production 2026-02-06 15:56:56 +08:00
Dillon Ngo 151447c573 Emergency DB issue Restore 2026-02-06 15:53:59 +08:00
Dillon Ngo a21614ba32 Emergency DB issue Restore 2026-02-06 15:32:21 +08:00
Dillon Ngo d99cb103ce Fix an issue reported by Eileen not able to generate summary invoice for multiple pending payment shipping invoices 2026-02-06 14:32:44 +08:00
Dillon Ngo 4c92ac5a83 Fix an issue reported by Eileen not able to generate summary invoice for multiple pending payment shipping invoices 2026-02-06 14:30:07 +08:00
560 changed files with 22900 additions and 14836 deletions
+3
View File
@@ -70,3 +70,6 @@ SST_START_DATE="2024-04-01 00:00:00"
E_INVOICE_START_DATE="2025-07-01 00:00:00"
MAINTENANCE_MESSAGE_TITLE="We'll be back online on 00:00 1/7/2025"
MAINTENANCE_MESSAGE="Sorry for the inconvenience but we're performing some maintenance at the moment."
OPENAI_API_KEY=""
ANTHROPIC_API_KEY=""
+12
View File
@@ -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=mysql
DB_PORT=3306
DB_DATABASE=ci_test_shipping_portal
DB_USERNAME=ci
DB_PASSWORD=bi9y@T8r
+3 -1
View File
@@ -6,6 +6,7 @@
**/.idea/
.env
.env.backup
.env.testing.example
.phpunit.result.cache
Homestead.json
Homestead.yaml
@@ -21,7 +22,6 @@ gox.iml
rebuild_docker.sh
docker/*
db/*
package-lock.json
public/*
/public/*
storage/framework/laravel-excel/*
@@ -29,3 +29,5 @@ storage/framework/laravel-excel/*
.env.production
.env.staging
.env.development
docz/*
.phpunit.cache/
+7
View File
@@ -19,12 +19,19 @@
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
}
</style>
<script>
setInterval(function() {
window.location.href = "/";
}, 60000); // 60000 ms = 1 minute, 300000 ms = 5 minutes
</script>
</head>
<body>
<div class="content">
<h1>We'll be back soon!</h1>
<p>Sorry for the inconvenience but we're performing some maintenance at the moment. We'll be back online shortly!</p>
<p>&mdash; CIEF IZYIM</p>
<a href="/" class="btn">Go Back Home</a>
</div>
</body>
</html>
Vendored
+68 -18
View File
@@ -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-node-22: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
@@ -107,10 +138,29 @@ pipeline {
steps {
script {
try {
sh 'docker image prune -a -f'
sh '''
echo "Starting Docker cleanup..."
# Remove stopped containers
docker container prune -f
# Remove unused networks
docker network prune -f
# Remove unused images
docker image prune -a -f
# Remove unused build cache
docker builder prune -f
echo "Docker cleanup completed."
docker system df
'''
} catch (Exception e) {
echo "Error during cleanup: ${e.message}"
}
currentBuild.description = 'Step 6 of 6 Completed'
}
}
@@ -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);
}
+1 -1
View File
@@ -10,4 +10,4 @@ interface Steppable
public function steps(): morphMany;
}
}
@@ -69,7 +69,7 @@ class SuccessUpdatePaymentStatusV2CommandJob implements ShouldQueue
$packingList->save();
if(app()->environment('production')){
(App()->make(UpdateDoFromVTPortalProcessor::class))->execute($packingList);
//(App()->make(UpdateDoFromVTPortalProcessor::class))->execute($packingList);
(App()->make(UpdateDoFromYDPortalProcessor::class))->execute($packingList);
}
@@ -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();
@@ -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',
];
}
@@ -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'
@@ -30,7 +30,7 @@ class CreatesClaudeResponse
'anthropic-version' => config('anthropic.api_version', '2023-06-01'),
'Content-Type' => 'application/json',
])->post(config('anthropic.base_url') . '/v1/messages', [
'model' => config('anthropic.default_model', 'claude-sonnet-4-5-20250929'),
'model' => !empty($model) ? $model : config('anthropic.default_model', 'claude-sonnet-4-5-20250929'),
'max_tokens' => 8192,
'messages' => [
[
@@ -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();
}
/**
@@ -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());
}
@@ -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;
}
}
}
@@ -2,6 +2,7 @@
namespace App\Classes\Modules\Exports\Services;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Models\Order;
use App\Models\PackingList;
use Carbon\Carbon;
@@ -38,7 +39,10 @@ class ExportsArrivedParcel implements WithHeadings, WithHeadingRow, WithMapping,
'Received Date',
'Recorded On',
'Days to Record',
'Remarks'
'Remarks',
'Delivery Address',
'Post Code',
'State',
];
}
@@ -79,6 +83,8 @@ class ExportsArrivedParcel implements WithHeadings, WithHeadingRow, WithMapping,
$recorded_on = $packingList->created_at->format('d-m-Y');
$days_to_record = Carbon::parse($arrival_date)->diffInDays(Carbon::parse($recorded_on));
$address = $order->addresses()->where('status', '=', ApprovalStatus::APPROVED)->first();
return [
$packingList->owner->reference,
$marking,
@@ -89,7 +95,10 @@ class ExportsArrivedParcel implements WithHeadings, WithHeadingRow, WithMapping,
$arrival_date,
$recorded_on,
$days_to_record,
''
'',
$address->street_one . ' ' . ($address->street_two ? $address->street_two : '') . ', ' . $address->district->name,
$address->postcode,
$address->state->name,
];
}
}
@@ -0,0 +1,59 @@
<?php
namespace App\Classes\Modules\Orders\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Orders\Services\FetchesOrder;
use App\Classes\Modules\Orders\Standards\Rules\CanFetchOrder;
use App\Http\Resources\OrderPackagesOriginWarehouseResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class FetchOrderPackagesOriginWarehouseV2Logic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => 'Retrieved Order Packages Origin Warehouse',
'message' => 'You have successfully retrieved an order packages'
];
}
/** @var CanFetchOrder */
private $canFetchOrder;
/** @var FetchesOrder */
private $fetchesOrder;
/**
* FetchOrderPackagesOriginWarehouseV2Logic constructor.
* @param CanFetchOrder $canFetchOrder
* @param FetchesOrder $fetchesOrder
*/
public function __construct(CanFetchOrder $canFetchOrder, FetchesOrder $fetchesOrder)
{
$this->canFetchOrder = $canFetchOrder;
$this->fetchesOrder = $fetchesOrder;
}
/**
* @param Request $request
* @return JsonResponse
* @throws \App\Classes\Exceptions\AccessForbiddenException
* @throws \App\Classes\Exceptions\RequestValidationException
*/
public function logic(Request $request) : JsonResponse
{
$this->canFetchOrder->passes();
$query = $this->fetchesOrder->execute(['reference' => $request->route('id'), 'with_packing_lists' => true]);
//Can refer FetchOrderPackagesLogic for different type of OrderPackages Resources
return $this->resourceResponse(new OrderPackagesOriginWarehouseResource($query));
}
}
@@ -68,7 +68,7 @@ class ApproveChangeOrderAddressProcessor
$appointee = $address->owner->orderRoles()->where('role_id', '=', OrderRoleTypes::ORIGIN_FREIGHT_FORWARDER)->first()->appointee->id;
if($appointee === 2) {
foreach($address->owner->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST) as $packingList){
$this->updateDoFromVTPortalProcessor->execute($packingList);
//$this->updateDoFromVTPortalProcessor->execute($packingList);
}
}
@@ -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,
@@ -0,0 +1,50 @@
<?php
namespace App\Classes\Modules\Orders\Services;
use App\Classes\ValueObjects\Constants\WarehouseReferences;
use App\Models\Address;
use App\Models\CompanyModule;
class ResolveIzyimQrWarehousePrefix
{
public const NEW_LOCATION_PREFIX_MAP = [
'kuching' => 'KCH-',
'bintulu' => 'BNT-',
'miri' => 'MIRI-',
];
public function execute(CompanyModule $originWarehouse, Address $deliveryAddress): string
{
$warehousePrefix = '';
if ($originWarehouse->reference === WarehouseReferences::YD_YIWU) {
$warehousePrefix = 'YW/';
}
$stateName = strtolower((string) optional($deliveryAddress->state)->name);
$districtName = strtolower((string) optional($deliveryAddress->district)->name);
if (in_array($originWarehouse->reference, [WarehouseReferences::YD_GUANG_ZHOU, WarehouseReferences::YD_GUANG_ZHOU_2, WarehouseReferences::YD_FS_EAST_MALAYSIA, WarehouseReferences::YD_FS_WEST_MALAYSIA])) {
$warehousePrefix = 'YD/';
if (strtolower($deliveryAddress->state->name) === 'sabah' || strtolower($deliveryAddress->state->name) === 'labuan' || in_array(strtolower($deliveryAddress->district->name), ['limbang', 'lawas'])) {
$warehousePrefix = 'KK/';
}
if (strtolower($deliveryAddress->state->name) === 'sarawak' && !in_array(strtolower($deliveryAddress->district->name), ['limbang', 'lawas'])) {
$warehousePrefix = 'KU/';
}
if (strtolower($deliveryAddress->state->name) === 'johor') {
$warehousePrefix = 'NX/';
}
}
if (isset(self::NEW_LOCATION_PREFIX_MAP[$districtName])) {
$warehousePrefix = self::NEW_LOCATION_PREFIX_MAP[$districtName];
}
return $warehousePrefix;
}
}
@@ -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')]
];
}
@@ -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')],
];
}
@@ -4,15 +4,19 @@ namespace App\Classes\Modules\PackingLists\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Jobs\Commands\V2\YD\FetchPackingListsFromYdPortalV2CommandJob;
use App\Classes\Modules\PackingLists\Services\DeletesPackingList;
use App\Classes\Modules\PackingLists\Services\FetchesPackingList;
use App\Classes\Modules\PackingLists\Services\Packages\FetchesPackage;
use App\Classes\Modules\PackingLists\Standards\Rules\CanDeletePackingList;
use App\Classes\ValueObjects\Constants\PackingListType;
use App\Classes\ValueObjects\Constants\TransactionType;
use App\Models\PackingList;
use Carbon\Carbon;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class DeletePackingListByPackageIdLogic extends AbstractControllerLogic
{
@@ -69,13 +73,48 @@ class DeletePackingListByPackageIdLogic extends AbstractControllerLogic
$packingList = PackingList::where('reference', $packingList->reference)->get();
foreach ($packingList as $singlePL) {
$invoice_transaction = $singlePL->transactions()->where('transactions.type', TransactionType::SHIPPING_INVOICE)->get();
if($invoice_transaction->count() > 0){
throw new ErrorException('Effective 2026, packages cannot be deleted if a related invoice has already been generated. Please delete the invoice first before proceeding with this action. Please contact IT support for more information.');
}
}
$childPackingList = PackingList::where('owner_type', PackingList::class)->whereIn('owner_id', $packingList->pluck('id'))->get();
$packingList->each->delete();
$childPackingList->each->delete();
$jobs1 = $this->fetchPackingListsFromYdPortalV2CommandJobs();
foreach ($jobs1 as $index => $job) {
dispatch($job)->delay(now()->addSeconds($index * 2));
}
return $this->response([]);
}
private function fetchPackingListsFromYdPortalV2CommandJobs()
{
$jobs = [];
$count = 0;
// Always take last 10 days INCLUDING today
for ($x = 0; $x < 10; $x++) {
$startDate = Carbon::today()->subDays($x)->startOfDay();
$endDate = Carbon::today()->subDays($x - 1)->startOfDay();
$jobs[] = new FetchPackingListsFromYdPortalV2CommandJob($startDate, $endDate);
Log::info('Dispatched FetchPackingListsFromYdPortalV2CommandJob for start date: ' . $startDate . ', end date: ' . $endDate);
$count++;
}
Log::info('Total FetchPackingListsFromYdPortalV2CommandJob dispatched: ' . $count);
return $jobs;
}
}
@@ -1,15 +1,15 @@
<?php
namespace App\Classes\Modules\PackingList\Packages\Items\ControllersLogic;
namespace App\Classes\Modules\PackingLists\ControllersLogic\Packages\Items;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\PackingLists\Services\Packages\Items\CreatesItem;
use App\Classes\Modules\Orders\Services\FetchesOrder;
use App\Classes\Modules\PackingLists\Standards\Rules\Packages\Items\CanCreatePackageItem;
use App\Classes\Modules\PackingLists\DataTransferObjects\ItemObject;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use App\Classes\Modules\Packages\Services\FetchesPackage;
use App\Classes\Modules\PackingLists\DataTransferObjects\ItemObject;
use App\Classes\Modules\PackingLists\Standards\Rules\Packages\CanCreatePackageItem;
use App\Classes\Modules\PackingLists\Services\Packages\FetchesPackage;
use App\Http\Resources\ItemResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
@@ -21,7 +21,8 @@ class CreatePackageItemLogic extends AbstractControllerLogic
/**
* @return array
*/
protected function notification():array {
protected function notification(): array
{
return [
'title' => '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);
@@ -1,6 +1,6 @@
<?php
namespace App\Classes\Modules\PackageItems\ControllersLogic;
namespace App\Classes\Modules\PackingLists\ControllersLogic\Packages\Items;
use App\Classes\General\Abstracts\AbstractControllerLogic;
@@ -16,7 +16,8 @@ class DeletePackageItemLogic extends AbstractControllerLogic
/**
* @return array
*/
protected function notification():array {
protected function notification(): array
{
return [
'title' => '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());
}
@@ -1,6 +1,6 @@
<?php
namespace App\Classes\Modules\PackageItems\ControllersLogic;
namespace App\Classes\Modules\PackingLists\ControllersLogic\Packages\Items;
use App\Classes\General\Abstracts\AbstractControllerLogic;
@@ -17,7 +17,8 @@ class FetchPackageItemLogic extends AbstractControllerLogic
/**
* @return array
*/
protected function notification():array {
protected function notification(): array
{
return [
'title' => '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());
}
@@ -1,6 +1,6 @@
<?php
namespace App\Classes\Modules\PackageItems\ControllersLogic;
namespace App\Classes\Modules\PackingLists\ControllersLogic\Packages\Items;
use App\Classes\General\Abstracts\AbstractControllerLogic;
@@ -17,7 +17,8 @@ class ListPackageItemsLogic extends AbstractControllerLogic
/**
* @return array
*/
protected function notification():array {
protected function notification(): array
{
return [
'title' => '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());
}
@@ -1,6 +1,6 @@
<?php
namespace App\Classes\Modules\PackageItems\ControllersLogic;
namespace App\Classes\Modules\PackingLists\ControllersLogic\Packages\Items;
use App\Classes\General\Abstracts\AbstractControllerLogic;
@@ -19,7 +19,8 @@ class UpdatePackageItemLogic extends AbstractControllerLogic
/**
* @return array
*/
protected function notification():array {
protected function notification(): array
{
return [
'title' => '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);
@@ -77,7 +77,7 @@ class UpdatePackingListStatusLogic extends AbstractControllerLogic
// $appointee = $address->owner->orderRoles()->where('role_id', '=', OrderRoleTypes::ORIGIN_FREIGHT_FORWARDER)->first()->appointee->id;
$this->updateDoFromVTPortalProcessor->execute($packingList);
// $this->updateDoFromVTPortalProcessor->execute($packingList);
$this->updateDoFromYDPortalProcessor->execute($packingList);
return $this->resourceResponse(new PackingListResource($packingList));
@@ -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;
@@ -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;
@@ -1,6 +1,6 @@
<?php
namespace App\Classes\Modules\PackingList\Processors;
namespace App\Classes\Modules\PackingLists\Processors;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Modules\Orders\Processors\UpdatesOrderCurrentStepProcessor;
@@ -21,9 +21,13 @@ use App\Models\Step;
use App\Classes\Jobs\UnityLogin;
use Config;
use Illuminate\Support\Facades\Http;
use App\Classes\General\Interfaces\Steppable;
use function PHPSTORM_META\map;
/**
* @deprecated This class uses incorrect StepsObject instantiation (5 parameters instead of 4)
* FIXME: Correct pattern: new StepsObject($appointee_id, $obligation->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);
@@ -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;
@@ -221,13 +221,18 @@ class FetchByTrakingNoYdPortalV2Processor
{$remark}
What are the ETA and ETD?";
Log::info('prompt: '.$userPrompt);
$result = $this->createsClaudeResponse->execute($userPrompt);
$result = $this->createsClaudeResponse->execute($userPrompt, 'claude-haiku-4-5-20251001');
Log::info('result (json_encoded): '.json_encode($result));
// $content = $result['choices'][0]['message']['content'] ?? null;
$content = $result['content'][0]['text'] ?? '[]';
Log::info('content (json_encoded):'. json_encode($content));
if ($content) {
$parsedContent = json_decode($content, true);
Log::info('raw ETA/ETD content: ' . $content);
// Remove markdown code fences if they exist
$contentClean = preg_replace('/^```json\s*|\s*```$/', '', $content);
$contentClean = trim($contentClean);
if ($contentClean) {
$parsedContent = json_decode($contentClean, true);
// $parsedContent = json_decode(str_replace("'", '"', $content), true);
if (is_array($parsedContent) && isset($parsedContent['ETA'], $parsedContent['ETD'])) {
@@ -327,22 +332,46 @@ class FetchByTrakingNoYdPortalV2Processor
private function translateTracking($textToTranslate)
{
$userPrompt = "Please translate mandarin to english and return result in this format, e.g. {'mandarin': '.$textToTranslate.', 'english': ''}. ".$textToTranslate." ";
Log::info('prompt: '.$userPrompt);
$result = $this->createsClaudeResponse->execute($userPrompt);
Log::info('result (json_encoded): '.json_encode($result));
// $content = $result['choices'][0]['message']['content'] ?? null;
$content = $result['content'][0]['text'] ?? '[]';
Log::info('content (json_encoded):'. json_encode($content));
$parsedContent = json_decode(str_replace("'", '"', $content), true);
// Return null immediately if no Mandarin character is present
if (!preg_match('/\p{Han}/u', $textToTranslate)) {
Log::info('No Mandarin characters detected, skipping translation.');
return null;
}
if($parsedContent && $parsedContent['english']){
$userPrompt = "Translate the following Mandarin text to English.
You must respond with raw JSON only.
No explanations.
No markdown.
No code fences.
No comments.
Only this JSON structure:
{\"mandarin\": \"".$textToTranslate."\", \"english\": \"<translation>\"}
Text: ".$textToTranslate;
Log::info('prompt: '.$userPrompt);
$result = $this->createsClaudeResponse->execute($userPrompt, 'claude-haiku-4-5-20251001');
Log::info('result (json_encoded): '.json_encode($result));
$content = $result['content'][0]['text'] ?? '[]';
Log::info('raw content: ' . $content);
// Remove markdown code fences if they exist
$contentClean = preg_replace('/^```json\s*|\s*```$/', '', $content);
$contentClean = trim($contentClean);
// Decode JSON safely
$parsedContent = json_decode($contentClean, true);
if($parsedContent && isset($parsedContent['english'])){
Log::info('Translated Text: ' . $parsedContent['english']);
return $parsedContent['english'];
}
else{
return null;
}
return null;
}
}
@@ -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;
@@ -29,6 +29,7 @@ use App\Models\Order;
use App\Models\PackingList;
use Carbon\Carbon;
use DateTime;
use Illuminate\Support\Facades\Cache;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
@@ -158,6 +159,7 @@ class FetchPackingListsFromYdPortalV2Processor
$packingListReference = $row->expressno;
try{
Log::info('Fetch SHIPPING_PACKING_LIST expressno: ' . $row->expressno);
$packingList = $this->fetchesPackingList->execute(['reference' => $row->expressno, 'type' => PackingListType::SHIPPING_PACKING_LIST]);
Log::info('Fetch SHIPPING_PACKING_LIST id: ' . $packingList->id);
@@ -175,6 +177,14 @@ class FetchPackingListsFromYdPortalV2Processor
} catch (ResourceNotFoundException $exception) {
Log::info('SHIPPING_PACKING_LIST/WAREHOUSE_RECEIVE_LIST NOT FOUND');
$lockKey = "FetchPackingListsFromYdPortalV2Processor-expressno:{$row->expressno}";
$lock = Cache::lock($lockKey, 300);
if (!$lock->get()) {
Log::info("SHIPPING_PACKING_LIST expressno {$row->expressno} is already being processed. Try again later.");
return;
}
if (!$allow_contract) {
$appointee_id = 2307;
} else {
@@ -1,6 +1,6 @@
<?php
namespace App\Classes\Modules\PackingLists\Services;
namespace App\Classes\Modules\PackingLists\Services\Packages\Items;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Classes\Modules\PackingLists\DataTransferObjects\ItemObject;
@@ -8,7 +8,8 @@ use App\Models\Item;
class UpdatesItem extends AbstractUpdateRecord
{
public function execute(Item $model, ItemObject $object) {
public function execute(Item $model, ItemObject $object)
{
$model->name = $object->getName();
$model->reference = $object->getReference();
@@ -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;
@@ -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);
}
@@ -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]);
@@ -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);
}
@@ -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;
@@ -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,
@@ -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);
@@ -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,
@@ -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);
@@ -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
];
}
@@ -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);
@@ -5,6 +5,7 @@ namespace App\Classes\Modules\Transactions\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Transactions\Services\ListsGroups;
use App\Http\Resources\GroupPaidInvoicesPNBPageResource;
use App\Http\Resources\GroupPendingInvoicesPNBPageResource;
use App\Http\Resources\GroupResource;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -45,6 +46,9 @@ class ListGroupsLogic extends AbstractControllerLogic
if($section === 'customerPaidGroupInvoiceComponent'){
return $this->collectionResponse(GroupPaidInvoicesPNBPageResource::collection($query));
}
else if($section === 'customerGroupPaymentInProgressInvoiceComponent'){
return $this->collectionResponse(GroupPendingInvoicesPNBPageResource::collection($query));
}
else{
return $this->collectionResponse(GroupResource::collection($query));
}
@@ -6,6 +6,7 @@ namespace App\Classes\Modules\Transactions\ControllersLogic;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Transactions\Services\ListsTransactions;
use App\Http\Resources\TransactionWithStorageResource;
use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
@@ -39,8 +40,20 @@ class ListTransactionsLogic extends AbstractControllerLogic
{
$query = $this->listsTransactions->execute($this->listsTransactions->deserializeFilters($request->input('filters')));
foreach ($query->items() as $item) {
if($item instanceof \App\Models\Transaction && $item->owner->owner->companyModule){
$item['is_einvoice_applicable'] = $item->owner->owner->companyModule->company->e_invoice === 1;
if($item instanceof \App\Models\Transaction && $item->owner && $item->owner->owner->companyModule){
$eInvoice = false;
$eInvoiceStartDate = Carbon::parse(env('E_INVOICE_START_DATE', '2025-07-01 00:00:00'));
$transactionCreatedDate = Carbon::parse($item->created_at);
$eInvoiceRequestedDate = Carbon::parse($item->owner->owner->companyModule->company->e_invoice_requested_at);
if ($transactionCreatedDate->isAfter($eInvoiceStartDate)
&&($transactionCreatedDate->isAfter($eInvoiceRequestedDate) || $transactionCreatedDate->diffInMinutes($eInvoiceRequestedDate) <= 60)
&& $item->owner->owner->companyModule->company->e_invoice === 1)
{
$eInvoice = true;
}
$item['is_einvoice_applicable'] = $eInvoice;
// $item['is_einvoice_applicable'] = $item->owner->owner->companyModule->company->e_invoice === 1;
}
}
@@ -267,6 +267,9 @@ class CheckStorageInvoiceTransactionProcessor
$transactionDetailsItems = $transaction->transactionDetails()->get();
$cbm = 0.00;
foreach ($transactionDetailsItems as $tdItem){
if (in_array($tdItem->reference, ['PAY_ON_BEHALF', 'CUSTOM_CHARGES'])) {
continue;
}
$quantity = $tdItem->quantity;
if($tdItem->price < 0.00){
$quantity = $quantity * -1;
@@ -135,7 +135,13 @@ class CreateInvoiceTransactionProcessor
$warehouseId = $order->orderRoles()->where('role_id', OrderRoleTypes::ORIGIN_WAREHOUSE)->first()->company_module_id;
$selected_warehouse_rate = $this->getConstantByKey($warehouse_rate_constant, $warehouseId);
$warehouse_rate = is_object($selected_warehouse_rate) ? $selected_warehouse_rate->amount : 0;
$warehouse_rate = 0;
if (is_object($selected_warehouse_rate)) {
$warehouse_rate = $selected_warehouse_rate->amount;
} elseif (is_array($selected_warehouse_rate)) {
$warehouse_rate = $selected_warehouse_rate['amount'] ?? 0;
}
$stateId = $address->state_id;
$state_rate_constant = $this->getConstantByKey($state_rate_constant, $stateId);
@@ -144,7 +144,7 @@ class CreatePaymentTransactionOneTimeFixProcessor
$packingList->save();
if(app()->environment('production')){
$this->updateDoFromVTPortalProcessor->execute($packingList);
//$this->updateDoFromVTPortalProcessor->execute($packingList);
$this->updateDoFromYDPortalProcessor->execute($packingList);
}
}
@@ -135,7 +135,7 @@ class CreatePaymentTransactionProcessor
$packingList->save();
if(app()->environment('production')){
$this->updateDoFromVTPortalProcessor->execute($packingList);
//$this->updateDoFromVTPortalProcessor->execute($packingList);
$this->updateDoFromYDPortalProcessor->execute($packingList);
}
}
@@ -93,7 +93,7 @@ class ReleaseGoodsToCustomerProcessor
$packingList->save();
if (app()->environment('production')) {
$this->updateDoFromVTPortalProcessor->execute($packingList);
// $this->updateDoFromVTPortalProcessor->execute($packingList);
$this->updateDoFromYDPortalProcessor->execute($packingList);
}
@@ -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;
@@ -28,9 +28,9 @@ class PermitsReminderEmail extends AbstractEmail
public function toMail()
{
return (new MailMessage)
->subject('Permits Renew Remidner Email')
->subject('Permits Renew Reminder Email')
->view('emails.reminder.permits_reminder', ['user' => $this->user, 'reminders' => $this->reminders]);
}
}
}
@@ -22,4 +22,8 @@ class SegmentConstants
public const OUTSTATION_POSTCODE = 'OUTSTATION_POSTCODE';
public const CUSTOMER_RATE = 'CUSTOMER_RATE';
}
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
}
@@ -76,10 +76,10 @@ class SuccessUpdatePaymentStatusButFailedCallback extends Command
*/
public function handle()
{
ini_set('memory_limit', '-1');
ini_set('memory_limit', '-1');
$this->info(Carbon::now() . ' : Billplz Failled Callback cron started.');
$this->outputArray = [];
$this->outputArray = [];
$start = new Carbon();
$approvalStatusArray = ApprovalStatus::APPROVAL_STATUS_ID;
@@ -107,27 +107,27 @@ class SuccessUpdatePaymentStatusButFailedCallback extends Command
$this->info('PackingList has no owner. PackingList ID: ' . $packingList->id);
continue;
}
if ($invoice->status == ApprovalStatus::APPROVED) {
$totalPaidAmount = $invoice->transactions->where('type', TransactionType::PAYMENT)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])->sum('amount');
if(($invoice->amount - $totalPaidAmount) < 0.01) {
$this->updatesTransactionStatus->execute($invoice, ApprovalStatus::COMPLETED);
$packingList->status = ApprovalStatus::APPROVED;
$packingList->save();
if(app()->environment('production')){
$this->updateDoFromVTPortalProcessor->execute($packingList);
//$this->updateDoFromVTPortalProcessor->execute($packingList);
$this->updateDoFromYDPortalProcessor->execute($packingList);
}
dump('Updated invoice ' . $invoice->id . '. Order: '. $order->reference);
} else {
$this->info('Failed Update invoice ' . $invoice->id . ' because payment not enough. Invoice Amount: ' . $invoice->amount . ' . Paid Amount: ' . $totalPaidAmount . ' . Order: '. $order->reference);
}
}
}
}
$end = new Carbon();
@@ -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(){
-162
View File
@@ -1,162 +0,0 @@
<?php
namespace App\Console;
use App\Classes\Jobs\FetchContainersStatusUpdateFromVTPortalJob;
use App\Classes\Jobs\FetchDeliveryListFromVTPortalJob;
use App\Classes\Jobs\FetchLoadedContainersFromVTPortalJob;
use App\Classes\Jobs\FetchPackingListFromVTPortalJob;
use App\Classes\Jobs\FetchWarehouseReceiveListFromVTPortalJob;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel
{
/**
* The Artisan commands provided by your application.
*
* @var array
*/
protected $commands = [];
/**
* Define the application's command schedule.
*
* @param \Illuminate\Console\Scheduling\Schedule $schedule
* @return void
*/
protected function schedule(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()
->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');
}
}
-72
View File
@@ -1,72 +0,0 @@
<?php
namespace App\Exceptions;
use App\Classes\ValueObjects\Constants\HttpStatus;
use App\Classes\ValueObjects\Response\ApiResponseObject;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Foundation\Http\Exceptions\MaintenanceModeException;
use Illuminate\Support\Facades\Log;
use Throwable;
class Handler extends ExceptionHandler
{
/**
* A list of the exception types that are not reported.
*
* @var array
*/
protected $dontReport = [
//
];
/**
* A list of the inputs that are never flashed for validation exceptions.
*
* @var array
*/
protected $dontFlash = [
'password',
'password_confirmation',
];
/**
* @param Throwable $exception
* @throws Throwable
*/
public function report(Throwable $exception)
{
if (env('LOG_STACK_TRACE', false)) {
Log::error($exception->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);
}
}
@@ -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;
@@ -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;
@@ -3,6 +3,7 @@
namespace App\Http\Controllers\Orders;
use App\Classes\Modules\Orders\Services\ResolveIzyimQrWarehousePrefix;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\OrderRoleTypes;
use App\Classes\ValueObjects\Constants\WarehouseReferences;
@@ -15,7 +16,7 @@ use Illuminate\Support\Facades\Storage;
class DownloadOrderQrPdfController
{
public function download(Request $request){
public function download(Request $request, ResolveIzyimQrWarehousePrefix $resolveIzyimQrWarehousePrefix){
$order = Order::find($request->route('id'));
$deliveryAddress = $order->addresses()->where('status', ApprovalStatus::APPROVED)->first();
$warehouse= $order->orderRoles()->where('role_id', OrderRoleTypes::ORIGIN_WAREHOUSE)->first()->appointee;
@@ -39,25 +40,7 @@ class DownloadOrderQrPdfController
}
}
if($warehouse->reference === WarehouseReferences::YD_YIWU){
$warehousePrefix = 'YW/';
}
if(in_array($warehouse->reference,[WarehouseReferences::YD_GUANG_ZHOU, WarehouseReferences::YD_GUANG_ZHOU_2, WarehouseReferences::YD_FS_EAST_MALAYSIA, WarehouseReferences::YD_FS_WEST_MALAYSIA])){
$warehousePrefix = 'YD/';
if(strtolower($deliveryAddress->state->name) === 'sabah' || strtolower($deliveryAddress->state->name) === 'labuan' || in_array(strtolower($deliveryAddress->district->name), ['limbang', 'lawas'])) {
$warehousePrefix = 'KK/';
}
if(strtolower($deliveryAddress->state->name) === 'sarawak' && !in_array(strtolower($deliveryAddress->district->name), ['limbang', 'lawas'])) {
$warehousePrefix = 'KU/';
}
if(strtolower($deliveryAddress->state->name) === 'johor') {
$warehousePrefix = 'NX/';
}
}
$warehousePrefix = $resolveIzyimQrWarehousePrefix->execute($warehouse, $deliveryAddress);
$data = [
'order' => $order,
@@ -3,6 +3,7 @@
namespace App\Http\Controllers\Orders;
use App\Classes\Modules\Orders\Services\ResolveIzyimQrWarehousePrefix;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\OrderRoleTypes;
use App\Classes\ValueObjects\Constants\WarehouseReferences;
@@ -16,7 +17,7 @@ use Illuminate\Support\Facades\Storage;
class DownloadTaxRebateQrPdfController
{
public function download(Request $request){
public function download(Request $request, ResolveIzyimQrWarehousePrefix $resolveIzyimQrWarehousePrefix){
$order = Order::find($request->route('id'));
$deliveryAddress = $order->addresses()->where('status', ApprovalStatus::APPROVED)->first();
$warehouse= $order->orderRoles()->where('role_id', OrderRoleTypes::ORIGIN_WAREHOUSE)->first()->appointee;
@@ -40,25 +41,7 @@ class DownloadTaxRebateQrPdfController
}
}
if($warehouse->reference === WarehouseReferences::YD_YIWU){
$warehousePrefix = 'YW/';
}
if(in_array($warehouse->reference,[WarehouseReferences::YD_GUANG_ZHOU, WarehouseReferences::YD_GUANG_ZHOU_2, WarehouseReferences::YD_FS_EAST_MALAYSIA, WarehouseReferences::YD_FS_WEST_MALAYSIA])){
$warehousePrefix = 'YD/';
if(strtolower($deliveryAddress->state->name) === 'sabah' || strtolower($deliveryAddress->state->name) === 'labuan' || in_array(strtolower($deliveryAddress->district->name), ['limbang', 'lawas'])) {
$warehousePrefix = 'KK/';
}
if(strtolower($deliveryAddress->state->name) === 'sarawak' && !in_array(strtolower($deliveryAddress->district->name), ['limbang', 'lawas'])) {
$warehousePrefix = 'KU/';
}
if(strtolower($deliveryAddress->state->name) === 'johor') {
$warehousePrefix = 'NX/';
}
}
$warehousePrefix = $resolveIzyimQrWarehousePrefix->execute($warehouse, $deliveryAddress);
// tax rebate data
$tax_rebate_refeerence = $request->query('tax_rebate_refeerence');
@@ -4,11 +4,22 @@ namespace App\Http\Controllers\Orders;
use App\Classes\Modules\Orders\ControllersLogic\FetchOrderPackagesReceivedV2Logic;
use App\Classes\Modules\Orders\ControllersLogic\FetchOrderPackagesV2Logic;
use App\Classes\Modules\Orders\ControllersLogic\FetchOrderPackagesOriginWarehouseV2Logic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class FetchOrderPackagesV2Controller
{
/**
* @param Request $request
* @param FetchOrderPackagesV2Logic $logic
* @return JsonResponse
*/
public function fetch(Request $request, FetchOrderPackagesV2Logic $logic): JsonResponse
{
return $logic->execute($request);
}
/**
* @param Request $request
* @param FetchOrderPackagesReceivedV2Logic $logic
@@ -21,10 +32,10 @@ class FetchOrderPackagesV2Controller
/**
* @param Request $request
* @param FetchOrderPackagesV2Logic $logic
* @param FetchOrderPackagesOriginWarehouseV2Logic $logic
* @return JsonResponse
*/
public function fetch(Request $request, FetchOrderPackagesV2Logic $logic): JsonResponse
public function fetchOriginWarehouse(Request $request, FetchOrderPackagesOriginWarehouseV2Logic $logic): JsonResponse
{
return $logic->execute($request);
}
@@ -1,8 +1,8 @@
<?php
namespace App\Http\Controllers\PackingLists\Packages\items;
namespace App\Http\Controllers\PackingLists\Packages\Items;
use App\Classes\Modules\PackageItems\ControllersLogic\CreatePackageItemLogic;
use App\Classes\Modules\PackingLists\ControllersLogic\Packages\Items\CreatePackageItemLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -13,7 +13,8 @@ class CreatePackageItemController
* @param CreatePackageItemLogic $logic
* @return JsonResponse
*/
public function create(Request $request, CreatePackageItemLogic $logic): JsonResponse {
public function create(Request $request, CreatePackageItemLogic $logic): JsonResponse
{
return $logic->execute($request);
}
@@ -1,8 +1,8 @@
<?php
namespace App\Http\Controllers\PackingLists\Packages\items;
namespace App\Http\Controllers\PackingLists\Packages\Items;
use App\Classes\Modules\PackageItems\ControllersLogic\DeletePackageItemLogic;
use App\Classes\Modules\PackingLists\ControllersLogic\Packages\Items\DeletePackageItemLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -13,7 +13,8 @@ class DeletePackageItemController
* @param DeletePackageItemLogic $logic
* @return JsonResponse
*/
public function delete(Request $request, DeletePackageItemLogic $logic): JsonResponse {
public function delete(Request $request, DeletePackageItemLogic $logic): JsonResponse
{
return $logic->execute($request);
}
@@ -1,8 +1,8 @@
<?php
namespace App\Http\Controllers\PackingLists\Packages\items;
namespace App\Http\Controllers\PackingLists\Packages\Items;
use App\Classes\Modules\PackageItems\ControllersLogic\FetchPackageItemLogic;
use App\Classes\Modules\PackingLists\ControllersLogic\Packages\Items\FetchPackageItemLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -13,7 +13,8 @@ class FetchPackageItemController
* @param FetchPackageItemLogic $logic
* @return JsonResponse
*/
public function fetch(Request $request, FetchPackageItemLogic $logic): JsonResponse {
public function fetch(Request $request, FetchPackageItemLogic $logic): JsonResponse
{
return $logic->execute($request);
}
@@ -1,8 +1,8 @@
<?php
namespace App\Http\Controllers\PackingLists\Packages\items;
namespace App\Http\Controllers\PackingLists\Packages\Items;
use App\Classes\Modules\PackageItems\ControllersLogic\ListPackageItemsLogic;
use App\Classes\Modules\PackingLists\ControllersLogic\Packages\Items\ListPackageItemsLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -10,10 +10,11 @@ class ListPackageItemsController
{
/**
* @param Request $request
* @param ListPackageItemLogic $logic
* @param ListPackageItemsLogic $logic
* @return JsonResponse
*/
public function list(Request $request, ListPackageItemsLogic $logic): JsonResponse {
public function list(Request $request, ListPackageItemsLogic $logic): JsonResponse
{
return $logic->execute($request);
}
@@ -1,8 +1,8 @@
<?php
namespace App\Http\Controllers\PackingLists\Packages\items;
namespace App\Http\Controllers\PackingLists\Packages\Items;
use App\Classes\Modules\PackageItems\ControllersLogic\UpdatePackageItemLogic;
use App\Classes\Modules\PackingLists\ControllersLogic\Packages\Items\UpdatePackageItemLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
@@ -13,7 +13,8 @@ class UpdatePackageItemController
* @param UpdatePackageItemLogic $logic
* @return JsonResponse
*/
public function update(Request $request, UpdatePackageItemLogic $logic): JsonResponse {
public function update(Request $request, UpdatePackageItemLogic $logic): JsonResponse
{
return $logic->execute($request);
}
@@ -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',
];
@@ -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',
];
@@ -17,6 +17,7 @@ use Carbon\Carbon;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use App\Classes\Modules\Jobs\ControllersLogic\SubmitJobLogic;
use Illuminate\Support\Facades\Log;
class MonthlyReportController
{
@@ -150,45 +151,84 @@ class MonthlyReportController
}
public function customerReport(Request $request): JsonResponse {
try {
$connection = CompanyConnection::where('invitee_reference', $request->route('marking'))->firstOrFail();
$invitee = $connection->invitee;
$connection = CompanyConnection::where('invitee_reference', $request->route('marking'))->firstOrFail();
$id = $connection->invitee->id;
if (!$invitee) {
Log::warning('Customer report: invitee not found for marking', ['marking' => $request->route('marking')]);
return (new ApiResponseObject('Customer not found',
'The customer associated with this marking no longer exists.',
HttpStatus::OK_WITH_MESSAGE, ['data' => [
'activated_orders' => 0,
'total_cbm' => 0,
'packages' => 0,
]]))->handler();
}
$from = $request->route('from') ? Carbon::parse($request->route('from')) : Carbon::parse('01-01-2018');
$to = $request->route('to') ? Carbon::parse($request->route('to')) : Carbon::now();
$id = $invitee->id;
$containers = Container::whereBetween('loading_date', [$from, $to])->orderBy('loading_date')->get();
$from = $request->route('from') ? Carbon::parse($request->route('from')) : Carbon::parse('01-01-2018');
$to = $request->route('to') ? Carbon::parse($request->route('to')) : Carbon::now();
$packingLists = $containers->flatMap(function ($container) {
return $container->packingLists;
});
// Only load containers that actually have packing lists belonging to this customer,
// instead of loading ALL containers and filtering in PHP (which causes memory exhaustion).
$containers = Container::whereBetween('loading_date', [$from, $to])
->whereHas('packingLists', function ($query) use ($id) {
$query->whereHas('packages', function ($pkgQuery) use ($id) {
$pkgQuery->whereHas('companyModule', function ($cmQuery) use ($id) {
$cmQuery->where('company_modules.id', $id);
});
});
})
->orderBy('loading_date')
->get();
$packages = $packingLists->map(function ($packingList) {
$replica = in_array(Auth()->user()->type, [RoleTypes::SHADOW_ADMIN, RoleTypes::SUPER_ADMIN]) ? $packingList : $packingList->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST_REPLICA)->first();
return $replica ? $replica : $packingList;
})->flatMap(function ($packingList) {
return $packingList->packages;
});
$packingLists = $containers->flatMap(function ($container) {
return $container->packingLists;
});
$packages = $packages->filter(function($package) use ($id) {
return $package->companyModule->id === $id;
});
$userType = Auth() && Auth()->user() ? Auth()->user()->type : RoleTypes::USER;
$exceptionUsers = in_array($userType, [RoleTypes::SHADOW_ADMIN, RoleTypes::SUPER_ADMIN]);
$orders = $packages->unique(function ($package) {
return $package->order;
});
$packages = $packingLists->map(function ($packingList) use ($exceptionUsers) {
$replica = $exceptionUsers ? $packingList : $packingList->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST_REPLICA)->first();
return $replica ? $replica : $packingList;
})->flatMap(function ($packingList) {
return $packingList->packages;
});
$totalCbm = $packages->sum(function($package){
return (( (float) $package->width / 100) * ( (float) $package->length / 100) * ( (float) $package->height / 100)) * $package->quantity;
});
$packages = $packages->filter(function($package) use ($id) {
$companyModule = $package->companyModule;
return $companyModule && $companyModule->id === $id;
});
return (new ApiResponseObject('fetch monthly report Successful',
'',
HttpStatus::OK_WITH_MESSAGE, ['data' => [
'activated_orders' => count($orders),
'total_cbm' => $totalCbm,
'packages' => $packages->sum('quantity'),
]]))->handler();
$orders = $packages->unique(function ($package) {
return $package->order;
});
$totalCbm = $packages->sum(function($package){
return (( (float) $package->width / 100) * ( (float) $package->length / 100) * ( (float) $package->height / 100)) * $package->quantity;
});
return (new ApiResponseObject('fetch monthly report Successful',
'',
HttpStatus::OK_WITH_MESSAGE, ['data' => [
'activated_orders' => count($orders),
'total_cbm' => $totalCbm,
'packages' => $packages->sum('quantity'),
]]))->handler();
} catch (\Exception $e) {
Log::error('Customer report failed', [
'marking' => $request->route('marking'),
'from' => $request->route('from'),
'to' => $request->route('to'),
'error' => $e->getMessage(),
'trace' => $e->getTraceAsString(),
]);
throw $e;
}
}
public function serviceReport(Request $request): JsonResponse {
-81
View File
@@ -1,81 +0,0 @@
<?php
namespace App\Http;
use App\Http\Middleware\ValidateToken;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
// \App\Http\Middleware\TrustHosts::class,
\App\Http\Middleware\TrustProxies::class,
\Fruitcake\Cors\HandleCors::class,
\App\Http\Middleware\PreventRequestsDuringMaintenance::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\TrimStrings::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\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
];
}
@@ -0,0 +1,36 @@
<?php
namespace App\Http\Middleware;
use App\Classes\General\LogHelper;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class LogRequestPathMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next)
{
if(env('APP_ENV') !== 'local'){
$method = $request->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);
}
}
@@ -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');
}
}
+1 -1
View File
@@ -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
+3 -14
View File
@@ -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) {
+14 -1
View File
@@ -5,6 +5,7 @@ namespace App\Http\Resources;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\OrderRoleTypes;
use App\Classes\ValueObjects\Constants\TransactionType;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;
class FetchOrderResource extends JsonResource
@@ -30,7 +31,19 @@ class FetchOrderResource extends JsonResource
'invoices' => $this->whenLoaded('packingLists', function() {
$transactions = $this->transactions()->whereNotIn('transactions.status', [0, 1])->whereIn('transactions.type', [TransactionType::SHIPPING_INVOICE, TransactionType::STORAGE_INVOICE])->get();
foreach ($transactions as $transaction) {
$transaction['is_einvoice_applicable'] = $this->companyModule->company->e_invoice === 1;
$eInvoice = false;
$eInvoiceStartDate = Carbon::parse(env('E_INVOICE_START_DATE', '2025-07-01 00:00:00'));
$transactionCreatedDate = Carbon::parse($transaction->created_at);
$eInvoiceRequestedDate = Carbon::parse($this->companyModule->company->e_invoice_requested_at);
if ($transactionCreatedDate->isAfter($eInvoiceStartDate)
&&($transactionCreatedDate->isAfter($eInvoiceRequestedDate) || $transactionCreatedDate->diffInMinutes($eInvoiceRequestedDate) <= 60)
&& $this->companyModule->company->e_invoice === 1)
{
$eInvoice = true;
}
$transaction['is_einvoice_applicable'] = $eInvoice;
// $transaction['is_einvoice_applicable'] = $this->companyModule->company->e_invoice === 1;
}
return TransactionWithStorageResource::collection($transactions);
}),
@@ -0,0 +1,49 @@
<?php
namespace App\Http\Resources;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\PaymentMethodType;
use App\Models\Transaction;
use Carbon\Carbon;
use Illuminate\Http\Resources\Json\JsonResource;
//PNB - Payment And Billing Page
//Class based on GroupResource.php
class GroupPendingInvoicesPNBPageResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$payment_transaction = Transaction::where('payment_reference', $this->reference)->first();
return [
'id' => $this->id,
'original_amount' => (float) $this->original_amount,
'original_currency' => new CurrencyResource($this->original_currency),
'issuer_name' => $this->issuerCompany->name,
'issuer_id' => $this->issuerCompany->id,
'amount' => (float) $this->amount,
'service_charge' => (float) $this->amount,
'currency' => new CurrencyResource($this->currency),
'created_at' => Carbon::parse($this->created_at)->format('d-m-Y h:i:s A'),
'currency_rate' => (float) $this->currency_rate,
'status' => $this->status,
'status_name' => ApprovalStatus::APPROVAL_STATUS_ID[$this->status],
'payment_method' => $this->payment_method,
'payment_method_name' => ucwords(PaymentMethodType::PAYMENT_METHODS_ID[$this->payment_method]),
'reference' => $this->reference,
'payment_transaction' => $payment_transaction ? [
'id' => $payment_transaction->id,
'status' => $payment_transaction->status,
'status_name' => ApprovalStatus::APPROVAL_STATUS_ID[$payment_transaction->status],
'documents' => $this->status === ApprovalStatus::APPROVED ? DocumentResource::collection($payment_transaction->documents->where('status', ApprovalStatus::APPROVED)) : DocumentResource::collection($payment_transaction->documents->where('status', ApprovalStatus::PENDING_VERIFICATION)),
] : []
];
}
}
@@ -0,0 +1,30 @@
<?php
namespace App\Http\Resources;
use App\Classes\ValueObjects\Constants\PackingListType;
use Illuminate\Http\Resources\Json\JsonResource;
//Originally from OrderPackagesDeprecatedResource
class OrderPackagesOriginWarehouseResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
$origin_warehouse_packages = $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST)->whereHas('packages')->get(); //$this->originWarehousePackages()->get();
return [
'id' => $this->id,
'reference_contract' => (int) $this->type,
'type' => (int) $this->type,
'status' => (int) $this->status,
'origin_warehouse_packages' => PackingListForOriginWarehouseResource::collection($origin_warehouse_packages),
'created_at' => $this->created_at->format('d-m-Y')
];
}
}
@@ -7,6 +7,7 @@ use App\Models\PackingList;
use App\Classes\ValueObjects\Constants\RoleTypes;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\Log;
class PackageReceivedResource extends JsonResource
{
@@ -19,7 +20,7 @@ class PackageReceivedResource extends JsonResource
public function toArray($request)
{
$userType = Auth() && Auth()->user() ? Auth()->user()->type : RoleTypes::USER;
$exceptionUsers = in_array($userType, [RoleTypes::SHADOW_ADMIN, RoleTypes::SUPER_ADMIN]);
$exceptionUsers = in_array($userType, RoleTypes::ADMIN_ROLES);
$originalPackingList = $this->packingList->owner instanceof PackingList ? $this->packingList->owner : $this->packingList;
return [
@@ -38,8 +39,8 @@ class PackageReceivedResource extends JsonResource
]),
'container' => new ContainerResource($originalPackingList->containers()->first()),
'transport' => new TransportResource($originalPackingList->transports()->first()),
'reference' => $exceptionUsers ? $this->packingList->reference : '',
// 'reference' => $exceptionUsers ? $this->packingList->reference : '',
'reference' => $exceptionUsers ? str_replace('_01', '', $this->packingList->reference) : '',
'reference_hash' => hash('sha256', $this->packingList->reference),
'reference_encrypted' => Crypt::encryptString($this->packingList->reference),
];
@@ -0,0 +1,41 @@
<?php
namespace App\Http\Resources;
use App\Classes\ValueObjects\Constants\RoleTypes;
use App\Models\Order;
use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\Log;
class PackingListForOriginWarehouseResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function toArray($request)
{
// $exceptionUsers = in_array(Auth()->user()->type, [RoleTypes::SHADOW_ADMIN, RoleTypes::SUPER_ADMIN]);
$userType = Auth() && Auth()->user() ? Auth()->user()->type : RoleTypes::USER;
$exceptionUsers = in_array($userType, [RoleTypes::SHADOW_ADMIN, RoleTypes::SUPER_ADMIN]);
$data = [
'id' => $this->id,
'claimant_id' => $this->claimant_id,
'status' => $this->status,
'transport' => new TransportResource($this->transports()->first()),
'type' => $this->type,
'container' => new ContainerResource($this->containers->first()),
$this->mergeWhen($this->owner instanceof Order, [
'order' => New OrderResource($this->owner)
]),
];
$packages = !$this->packingLists()->exists() || $exceptionUsers ? $this->packages : $this->packingLists->first()->packages;
$data['packages'] = PackageReceivedResource::collection($packages);
return $data;
}
}
+7 -1
View File
@@ -14,10 +14,16 @@ class UserCompanyResource extends JsonResource
*/
public function toArray($request)
{
$companyModule = $this->companyModule()->first();
if(!$companyModule){
return [];
}
return [
'id' => $this->id,
'name' => $this->name,
'reference' => $this->companyModule()->first()->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference,
'reference' => $companyModule->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference,
'type' => (int) $this->type,
'status' => (int) $this->status,
'email' => $this->email
+1 -1
View File
@@ -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;
+10 -1
View File
@@ -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
+18 -10
View File
@@ -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'];
+15 -10
View File
@@ -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);
}
+13 -5
View File
@@ -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
+7 -4
View File
@@ -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
{
+37 -29
View File
@@ -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']);
}
/**
+9 -4
View File
@@ -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
+16 -8
View File
@@ -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
+6 -1
View File
@@ -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
{
+9 -4
View File
@@ -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'];
+14 -5
View File
@@ -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
+6 -1
View File
@@ -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',
];
}
}
+13 -5
View File
@@ -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

Some files were not shown because too many files have changed in this diff Show More