diff --git a/app/Classes/General/Eloquent/Filters/ClaimantId.php b/app/Classes/General/Eloquent/Filters/ClaimantId.php new file mode 100644 index 00000000..7d473825 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/ClaimantId.php @@ -0,0 +1,20 @@ +where('claimant_id', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/PackingListDeliveryStatus.php b/app/Classes/General/Eloquent/Filters/PackingListDeliveryStatus.php new file mode 100644 index 00000000..4f316148 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/PackingListDeliveryStatus.php @@ -0,0 +1,29 @@ +whereDoesntHave('transports') : ($value == 2 ? $builder->whereHas('transports', function (Builder $query) use ($value) { + $query->whereDoesntHave('schedules', function (Builder $query) use ($value) { + $query->where('status', '!=', ApprovalStatus::EXPIRED)->where('eta', '>', Carbon::now()); + }); + }) : $builder->whereHas('transports', function (Builder $query) use ($value) { + $query->whereHas('schedules', function (Builder $query) use ($value) { + $query->where('status', '!=', ApprovalStatus::EXPIRED)->where('eta', '<', Carbon::now()); + }); + })); + } +} diff --git a/app/Classes/General/Interfaces/Notifiable.php b/app/Classes/General/Interfaces/Notifiable.php new file mode 100644 index 00000000..e9d8f22d --- /dev/null +++ b/app/Classes/General/Interfaces/Notifiable.php @@ -0,0 +1,15 @@ + 'Retrieved Company Moduels', + 'message' => 'You have successfully retrieved a list of Companies' + ]; + } + + /** @var CanListCompanies */ + private $canListCompanies; + + /** @var ListsCompanyModules */ + private $listsCompanyModules; + + /** + * ListCompaniesControllersLogic constructor. + * @param CanListCompanies $canListCompanies + * @param ListsCompanyModules $listsCompanyModules + */ + public function __construct(CanListCompanies $canListCompanies, ListsCompanyModules $listsCompanyModules) + { + $this->canListCompanies = $canListCompanies; + $this->listsCompanyModules = $listsCompanyModules; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request) : JsonResponse + { + $this->canListCompanies->passes(); + + $query = $this->listsCompanyModules->execute($this->listsCompanyModules->deserializeFilters($request->input('filters'))); + return $this->collectionResponse(CompanyModuleResource::collection($query)); + + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Companies/Services/ListsCompanyModules.php b/app/Classes/Modules/Companies/Services/ListsCompanyModules.php new file mode 100644 index 00000000..906578c1 --- /dev/null +++ b/app/Classes/Modules/Companies/Services/ListsCompanyModules.php @@ -0,0 +1,33 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Notifications/DataTransferObjects/NotificationObject.php b/app/Classes/Modules/Notifications/DataTransferObjects/NotificationObject.php new file mode 100644 index 00000000..40dc4f3c --- /dev/null +++ b/app/Classes/Modules/Notifications/DataTransferObjects/NotificationObject.php @@ -0,0 +1,101 @@ +title = $title; + $this->description = $description; + $this->subject = $subject; + $this->target = $target; + $this->causer = $causer; + $this->status = $status; + } + + /** + * @return int + */ + public function getTitle(): string + { + return $this->title; + } + + /** + * @return int + */ + public function getDescription(): string + { + return $this->description; + } + + /** + * @return Notifiable + */ + public function getSubject(): Notifiable + { + return $this->subject; + } + + /** + * @return Notifiable + */ + public function getTarget(): Notifiable + { + return $this->target; + } + + /** + * @return Notifiable + */ + public function getCauser(): Notifiable + { + return $this->causer; + } + + /** + * @return int + */ + public function getStatus(): int + { + return $this->status; + } + + +} diff --git a/app/Classes/Modules/Notifications/Processors/CreateNotificationProcessor.php b/app/Classes/Modules/Notifications/Processors/CreateNotificationProcessor.php new file mode 100644 index 00000000..d6b077f8 --- /dev/null +++ b/app/Classes/Modules/Notifications/Processors/CreateNotificationProcessor.php @@ -0,0 +1,27 @@ +createsNotification = $createsNotification; + } + + public function execute(NotificationObject $object) + { + $notification = $this->createsNotification->execute($object); + return $notification; + } +} diff --git a/app/Classes/Modules/Notifications/Services/CreatesNotification.php b/app/Classes/Modules/Notifications/Services/CreatesNotification.php new file mode 100644 index 00000000..4f5ca5fd --- /dev/null +++ b/app/Classes/Modules/Notifications/Services/CreatesNotification.php @@ -0,0 +1,30 @@ +title = $object->getTitle(); + $model->description = $object->getDescription(); + $model->status = $object->getStatus(); + $model->subject_type = get_class($object->getSubject()); + $model->subject_id = $object->getSubject()->id; + $model->target_type = get_class($object->getTarget()); + $model->target_id = $object->getTarget()->id; + $model->causer_type = get_class($object->getCauser()); + $model->causer_id = $object->getCauser()->id; + $model->save(); + + return $model; + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Orders/ControllersLogic/CreateOrderRemarkLogic.php b/app/Classes/Modules/Orders/ControllersLogic/CreateOrderRemarkLogic.php deleted file mode 100644 index e134bcc7..00000000 --- a/app/Classes/Modules/Orders/ControllersLogic/CreateOrderRemarkLogic.php +++ /dev/null @@ -1,60 +0,0 @@ - 'Created Order', - 'message' => 'You have successfully created a new Order' - ]; - } - - /** @var FetchesOrder */ - private $fetchesOrder; - - /** @var CreateRemarkProcessor */ - private $createRemarkProcessor; - - /** - * CreateOrderRemarkLogic constructor. - * @param FetchesOrder $fetchesOrder - * @param CreateRemarkProcessor $createRemarkProcessor - */ - public function __construct(FetchesOrder $fetchesOrder, CreateRemarkProcessor $createRemarkProcessor) - { - $this->fetchesOrder = $fetchesOrder; - $this->createRemarkProcessor = $createRemarkProcessor; - } - - /** - * @param Request $request - * @return JsonResponse - * @throws \App\Classes\Exceptions\AccessForbiddenException - * @throws \App\Classes\Exceptions\MalformedRequestException - * @throws \App\Classes\Exceptions\RequestValidationException - */ - public function logic(Request $request) : JsonResponse - { - $order = $this->fetchesOrder->execute(['id' => $request->route('id')]); - - $object = new RemarkObject($request->input('content'), auth()->user()->id); - - $this->createRemarkProcessor->execute($order, $object); - - return $this->resourceResponse(new OrderResource($order)); - - } -} diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Containers/CreateContainerRemarkLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Containers/CreateContainerRemarkLogic.php index bb4b2a06..f35b828e 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Containers/CreateContainerRemarkLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Containers/CreateContainerRemarkLogic.php @@ -20,8 +20,8 @@ class CreateContainerRemarkLogic extends AbstractControllerLogic */ protected function notification():array { return [ - 'title' => 'Created Container', - 'message' => 'You have successfully created a new Container' + 'title' => 'Created Container Remark', + 'message' => 'You have successfully created a new Container Remark' ]; } diff --git a/app/Classes/Modules/Remarks/ControllersLogic/CreateRemarkLogic.php b/app/Classes/Modules/Remarks/ControllersLogic/CreateRemarkLogic.php index a5bf50b0..46d822c5 100644 --- a/app/Classes/Modules/Remarks/ControllersLogic/CreateRemarkLogic.php +++ b/app/Classes/Modules/Remarks/ControllersLogic/CreateRemarkLogic.php @@ -4,18 +4,16 @@ namespace App\Classes\Modules\Remarks\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; -use App\Classes\Modules\Remarks\Services\CreatesRemark; -use App\Classes\Modules\Remarks\Standards\Rules\CanCreateRemark; use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject; -use App\Classes\Modules\Accounts\Services\FetchesUser; -use App\Http\Resources\RemarkResource; -use ErrorException; +use App\Classes\Modules\Remarks\Processors\CreateRemarkProcessor; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Illuminate\Support\Str; +use App\Classes\Exceptions\MalformedRequestException; +use App\Http\Resources\RemarkResource; class CreateRemarkLogic extends AbstractControllerLogic { - /** * @return array */ @@ -26,25 +24,16 @@ class CreateRemarkLogic extends AbstractControllerLogic ]; } - /** @var CanCreateRemark */ - private $canCreateRemark; - - /** @var CreatesRemark */ - private $createsRemark; - - /** @var FetchesUser */ - private $fetchesUser; + /** @var CreateRemarkProcessor */ + private $createRemarkProcessor; /** * CreateRemarkLogic constructor. - * @param CanCreateRemark $canCreateRemark - * @param CreatesRemark $createsRemark + * @param CreateRemarkProcessor $createRemarkProcessor */ - public function __construct(CanCreateRemark $canCreateRemark, CreatesRemark $createsRemark, FetchesUser $fetchesUser) + public function __construct(CreateRemarkProcessor $createRemarkProcessor) { - $this->canCreateRemark = $canCreateRemark; - $this->createsRemark = $createsRemark; - $this->fetchesUser = $fetchesUser; + $this->createRemarkProcessor = $createRemarkProcessor; } /** @@ -56,15 +45,18 @@ class CreateRemarkLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { + $classs = '\\App\\Models\\' . Str::studly($request->input('model_type')); - $object = new RemarkObject($request->input('content'), $request->input('commenter_id')); + if (!class_exists($classs)) { + throw new MalformedRequestException('Unable to process this entity'); + } + + $remarkOwner = $classs::find($request->route('id')); - $this->canCreateRemark->passes($object); + $remarkObject = new RemarkObject($request->input('content'), auth()->user()->id); - $query = $this->createsRemark->execute($this->fetchesUser->execute(['id' => $request->input('commenter_id')]), $object); - - return $this->resourceResponse(new RemarkResource($query)); + $remmark = $this->createRemarkProcessor->execute($remarkOwner, $remarkObject); + return $this->resourceResponse(new RemarkResource($remmark)); } - } diff --git a/app/Classes/Modules/Transactions/ControllersLogic/CreateShippingInvoiceTransactionLogic.php b/app/Classes/Modules/Transactions/ControllersLogic/CreateShippingInvoiceTransactionLogic.php index b6edcc5f..6e6c5882 100644 --- a/app/Classes/Modules/Transactions/ControllersLogic/CreateShippingInvoiceTransactionLogic.php +++ b/app/Classes/Modules/Transactions/ControllersLogic/CreateShippingInvoiceTransactionLogic.php @@ -8,29 +8,37 @@ use App\Classes\Modules\PackingLists\Services\FetchesPackingList; use App\Classes\Modules\SegmentConstants\Services\FetchesSegmentConstant; use App\Classes\Modules\Transactions\Services\GeneratesTransactionBillNumber; use App\Classes\Modules\Transactions\Services\CreatesTransaction; +use App\Classes\Modules\Transactions\Services\CreatesTransactionDetail; +use App\Classes\Modules\Documents\Services\CreatesDocument; +use App\Classes\Modules\Documents\Services\CreatesFiles; use App\Classes\Modules\Transactions\DataTransferObjects\TransactionObject; +use App\Classes\Modules\Transactions\DataTransferObjects\TransactionDetailObject; +use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; + use App\Classes\ValueObjects\Constants\OrderRoleTypes; use App\Classes\ValueObjects\Constants\TransactionType; use App\Classes\ValueObjects\Constants\PaymentMethodType; use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Classes\ValueObjects\Constants\DocumentType; // use App\Classes\Modules\Documents\DataTransferObjects\DocumentObject; // use App\Classes\Modules\Transactions\Services\FetchesTransaction; // use App\Classes\Modules\Transactions\Services\UpdatesTransactionStatus; -// use App\Classes\Modules\Documents\Services\CreatesDocument; -// use App\Classes\Modules\Documents\Services\CreatesFiles; -// use App\Classes\ValueObjects\Constants\DocumentType; + // use App\Models\Document; // use App\Models\Transaction; // use Barryvdh\DomPDF\PDF; // use Carbon\Carbon; + + + use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Str; // use Meneses\LaravelLaravelMpdf\Facades\LaravelLaravelMpdf; -// use Meneses\LaravelMpdf\Facades\LaravelMpdf; +use Meneses\LaravelMpdf\Facades\LaravelMpdf; class CreateShippingInvoiceTransactionLogic extends AbstractControllerLogic { @@ -58,8 +66,16 @@ class CreateShippingInvoiceTransactionLogic extends AbstractControllerLogic /** @var CreatesTransaction */ private $createsTransaction; + /** @var CreatesTransactionDetail */ + private $createsTransactionDetail; + + /** @var CreatesDocument */ + private $createsDocument; + + /** @var CreatesFiles */ + private $createsFile; + // /** @var FetchesTransaction */ - // private $fetchesTransaction; // /** @var UpdatesTransactionStatus */ // private $updatesTransactionStatus; // /** @var CreatesDocument */ @@ -68,23 +84,16 @@ class CreateShippingInvoiceTransactionLogic extends AbstractControllerLogic // private $createsFile; // /** @var PDF */ // private $pdf; - - /** - * CreateSupplierTransactionLogic constructor. - * @param FetchesPackingList $fetchesPackingList - * @param GeneratesTransactionBillNumber $generatesTransactionBillNumber - * @param CreatesTransaction $createsTransaction - * @param FetchesTransaction $fetchesTransaction - * @param UpdatesTransactionStatus $updatesTransactionStatus - * @param PDF $pdf - */ + public function __construct( FetchesPackingList $fetchesPackingList, FetchesSegmentConstant $fetchesSegmentConstant, GeneratesTransactionBillNumber $generatesTransactionBillNumber, - CreatesTransaction $createsTransaction + CreatesTransaction $createsTransaction, + CreatesTransactionDetail $createsTransactionDetail, + CreatesDocument $createsDocument, + CreatesFiles $createsFile - // UpdatesTransactionStatus $updatesTransactionStatus, // CreatesDocument $createsDocument, // CreatesFiles $createsFile, // PDF $pdf @@ -95,6 +104,9 @@ class CreateShippingInvoiceTransactionLogic extends AbstractControllerLogic $this->fetchesSegmentConstant = $fetchesSegmentConstant; $this->generatesTransactionBillNumber = $generatesTransactionBillNumber; $this->createsTransaction = $createsTransaction; + $this->createsTransactionDetail = $createsTransactionDetail; + $this->createsDocument = $createsDocument; + $this->createsFile = $createsFile; // $this->updatesTransactionStatus = $updatesTransactionStatus; // $this->createsDocument = $createsDocument; @@ -185,8 +197,31 @@ class CreateShippingInvoiceTransactionLogic extends AbstractControllerLogic ApprovalStatus::PENDING_SUBMISSION ); - $transactions = $this->createsTransaction->execute($packing_list, $object); + $invoice_transaction = $this->createsTransaction->execute($packing_list, $object); + $object_detail = new TransactionDetailObject( + $invoice_transaction->bill_no, + $invoice_transaction->bill_no, + 1, + $invoice_transaction->amount, + $invoice_transaction->amount + ); + $transaction_detail = $this->createsTransactionDetail->execute($invoice_transaction, $object_detail); + + $transaction_invoice_pdf = LaravelMpdf::loadView('pages.pdfs.shipping_invoice', ['invoice_transaction' => $invoice_transaction]); + + $document_object = new DocumentObject( + DocumentType::SHIPPING_INVOICE, + [chunk_split('data:application/pdf;base64,'.base64_encode($transaction_invoice_pdf->output()))], + '', + ApprovalStatus::COMPLETED, + 'shipping_invoice' + ); + /** @var Document $document */ + $document = $this->createsDocument->execute($invoice_transaction, $document_object); + $this->createsFile->execute($document, $document_object); + + // dd('yess'); return $this->response([]); } } diff --git a/app/Classes/Modules/Transactions/Services/CreatesTransactionDetail.php b/app/Classes/Modules/Transactions/Services/CreatesTransactionDetail.php index 0e852ddf..bdb0f387 100644 --- a/app/Classes/Modules/Transactions/Services/CreatesTransactionDetail.php +++ b/app/Classes/Modules/Transactions/Services/CreatesTransactionDetail.php @@ -18,8 +18,8 @@ class CreatesTransactionDetail extends AbstractUpdateRelationshipRecord */ public function execute(Transaction $transaction, TransactionDetailObject $object) { $model = new TransactionDetail(); - $model->product_code = $object->getCode(); - $model->product_name = $object->getName(); + $model->reference = $object->getReference(); + $model->name = $object->getName(); $model->quantity = $object->getQuantity(); $model->price = $object->getPrice(); $model->amount = $object->getAmount(); diff --git a/app/Classes/ValueObjects/Constants/DocumentType.php b/app/Classes/ValueObjects/Constants/DocumentType.php index 2b053163..75db231a 100644 --- a/app/Classes/ValueObjects/Constants/DocumentType.php +++ b/app/Classes/ValueObjects/Constants/DocumentType.php @@ -21,4 +21,8 @@ final class DocumentType { public const DELIVER_ORDER = 'DELIVER_ORDER'; public const INVOICE = 'INVOICE'; public const SUPPLIER_DELIVER_ORDER = 'SUPPLIER_DELIVER_ORDER'; + + + public const SHIPPING_INVOICE = 'SHIPPING_INVOICE'; + } diff --git a/app/Classes/ValueObjects/Constants/NotificationType.php b/app/Classes/ValueObjects/Constants/NotificationType.php new file mode 100644 index 00000000..0c9ec5a4 --- /dev/null +++ b/app/Classes/ValueObjects/Constants/NotificationType.php @@ -0,0 +1,11 @@ + 'Unknown Action', - 'message' => 'unknown message..' + public const NEW_ARRIVED_PARCEL = [ + 'title' => 'New Arrived Parcel', + 'message' => 'you have received new parcel for your order #-' ]; + public const UNDEFINED = [ + 'title' => 'UNDEFINED TITLE', + 'message' => 'undefined message' + ]; } \ No newline at end of file diff --git a/app/Http/Controllers/Companies/ListCompanyModulesController.php b/app/Http/Controllers/Companies/ListCompanyModulesController.php new file mode 100644 index 00000000..68bca75e --- /dev/null +++ b/app/Http/Controllers/Companies/ListCompanyModulesController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Orders/CreateOrderRemarkController.php b/app/Http/Controllers/Orders/CreateOrderRemarkController.php deleted file mode 100644 index 3464566a..00000000 --- a/app/Http/Controllers/Orders/CreateOrderRemarkController.php +++ /dev/null @@ -1,14 +0,0 @@ -execute($request); - } -} \ No newline at end of file diff --git a/app/Http/Controllers/Orders/DownloadOrderQrPdfController.php b/app/Http/Controllers/Orders/DownloadOrderQrPdfController.php index b87012ec..3218be52 100644 --- a/app/Http/Controllers/Orders/DownloadOrderQrPdfController.php +++ b/app/Http/Controllers/Orders/DownloadOrderQrPdfController.php @@ -24,9 +24,9 @@ class DownloadOrderQrPdfController $warehousePrefix = ''; $deliveryPrefix = ''; $customerMarking = ''; + $remark = $warehouse->remarks()->first()->content; if($warehouse->reference === WarehouseReferences::VT_GUANG_ZHOU || $warehouse->reference === WarehouseReferences::VT_YIWU) { - $remark = '周一 至 周六 , 早上八点到下午六点'; $customerMarking = $order->companyModule->connections()->first()->invitee_reference.'/'; if(strtolower($deliveryAddress->state->name) === 'sabah' || strtolower($deliveryAddress->state->name) === 'labuan') { $deliveryPrefix = 'SB/'; @@ -38,12 +38,10 @@ class DownloadOrderQrPdfController } if($warehouse->reference === WarehouseReferences::YD_YIWU){ - $remark = '周一 至 周六 , 早上九点到下午六点'; $warehousePrefix = 'YW/'; } if($warehouse->reference === WarehouseReferences::YD_GUANG_ZHOU){ - $remark = '周日 至 周五 , 早上八点到下午六点'; $warehousePrefix = 'YD/'; if(strtolower($deliveryAddress->state->name) === 'sabah' || strtolower($deliveryAddress->state->name) === 'labuan') { diff --git a/app/Http/Resources/CompanyModuleResource.php b/app/Http/Resources/CompanyModuleResource.php index e1f253be..7af3ae8d 100644 --- a/app/Http/Resources/CompanyModuleResource.php +++ b/app/Http/Resources/CompanyModuleResource.php @@ -39,6 +39,7 @@ class CompanyModuleResource extends JsonResource 'reference' => $this->reference, 'address' => new AddressResource($defaultAddress), 'company' => new CompanyResource($this->whenLoaded('company')), + 'remarks' => RemarkResource::collection($this->remarks), 'marking' => $marking ]; diff --git a/app/Http/Resources/CountryResource.php b/app/Http/Resources/CountryResource.php new file mode 100644 index 00000000..f15c41f8 --- /dev/null +++ b/app/Http/Resources/CountryResource.php @@ -0,0 +1,24 @@ + $this->id, + 'name' => $this->name, + 'short_code' => $this->short_code, + 'phone_code' => $this->phone_code, + ]; + } +} diff --git a/app/Http/Resources/PackingListResource.php b/app/Http/Resources/PackingListResource.php index 82065b18..5256e3de 100644 --- a/app/Http/Resources/PackingListResource.php +++ b/app/Http/Resources/PackingListResource.php @@ -3,6 +3,7 @@ namespace App\Http\Resources; use App\Classes\ValueObjects\Constants\PackingListType; +use App\Classes\ValueObjects\Constants\TransactionType; use App\Classes\ValueObjects\Constants\RoleTypes; use App\Models\Order; use App\Models\PackingList; @@ -32,7 +33,8 @@ class PackingListResource extends JsonResource 'packages' => PackageResource::collection($packages), $this->mergeWhen($this->owner instanceof Order, [ 'order' => New OrderResource($this->owner) - ]) + ]), + 'shippng_transaction' => new TransactionResource($this->transactions()->where('type', TransactionType::SHIPPING_INVOICE)->first()), ]; } } diff --git a/app/Http/Resources/TransactionResource.php b/app/Http/Resources/TransactionResource.php index ef652fd7..05c35038 100644 --- a/app/Http/Resources/TransactionResource.php +++ b/app/Http/Resources/TransactionResource.php @@ -18,7 +18,7 @@ class TransactionResource extends JsonResource return [ 'id' => $this->id, - 'booking' => new BookingResource($this->booking), + // 'booking' => new BookingResource($this->booking), 'type' => (int) $this->type, 'bill_no' => $this->bill_no, 'amount' => (double) $this->amount, diff --git a/app/Models/AbstractModel.php b/app/Models/AbstractModel.php index 7a7c9c06..f459750f 100644 --- a/app/Models/AbstractModel.php +++ b/app/Models/AbstractModel.php @@ -3,11 +3,39 @@ namespace App\Models; +use App\Classes\General\Interfaces\Notifiable; use Illuminate\Database\Eloquent\Model; use Spatie\Activitylog\Traits\LogsActivity; +use Illuminate\Database\Eloquent\Relations\MorphTo; -class AbstractModel extends Model +class AbstractModel extends Model implements Notifiable { use LogsActivity; protected static $logFillable = true; + + /** + * @return MorphTo + */ + public function subject(): MorphTo + { + return $this->MorphTo('subject'); + } + + /** + * @return MorphTo + */ + public function target(): MorphTo + { + return $this->MorphTo('target'); + } + + /** + * @return MorphTo + */ + public function causer(): MorphTo + { + return $this->MorphTo('causer'); + } + + } \ No newline at end of file diff --git a/app/Models/CompanyModule.php b/app/Models/CompanyModule.php index 180d8286..c4964447 100644 --- a/app/Models/CompanyModule.php +++ b/app/Models/CompanyModule.php @@ -23,6 +23,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; use PhpParser\Node\Expr\AssignOp\Mod; use Staudenmeir\EloquentHasManyDeep\HasManyDeep; use Staudenmeir\EloquentHasManyDeep\HasRelationships; +use App\Classes\General\Interfaces\Remarkable; /** * Class CompanyModule @@ -32,7 +33,7 @@ use Staudenmeir\EloquentHasManyDeep\HasRelationships; * @property integer type * @property integer status */ -class CompanyModule extends AbstractModel implements Addressable, Documentable, Contactable, ContainerOwner, Packable +class CompanyModule extends AbstractModel implements Addressable, Documentable, Contactable, ContainerOwner, Packable, Remarkable { use HasRelationships; use SoftDeletes; @@ -177,6 +178,14 @@ class CompanyModule extends AbstractModel implements Addressable, Documentable, return $query->where('type', '=', BusinessType::WAREHOUSE); } + /** + * @return MorphMany + */ + public function remarks(): morphMany + { + return $this->morphMany(Remark::class, 'owner'); + } + } diff --git a/app/Models/Notification.php b/app/Models/Notification.php new file mode 100644 index 00000000..06bd6024 --- /dev/null +++ b/app/Models/Notification.php @@ -0,0 +1,18 @@ +BelongsTo(Package::class, 'package_id', 'id'); + } +} diff --git a/app/Models/Order.php b/app/Models/Order.php index 5aabfd44..5011fd36 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -6,6 +6,7 @@ use App\Classes\General\Interfaces\Addressable; use App\Classes\General\Interfaces\Contactable; use App\Classes\General\Interfaces\Packable; use App\Classes\General\Interfaces\Remarkable; +use App\Classes\General\Interfaces\Notifiable; use App\Classes\ValueObjects\Constants\PackingListType; use App\Classes\ValueObjects\Constants\RoleTypes; use App\Classes\ValueObjects\Constants\ApprovalStatus; @@ -16,7 +17,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\MorphMany; -class Order extends AbstractModel implements Addressable, Packable, Remarkable +class Order extends AbstractModel implements Addressable, Packable, Remarkable, Notifiable { use SoftDeletes; @@ -153,8 +154,8 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable /** * @return morphMany */ - public function transactions(): morphMany - { - return $this->morphMany(Transaction::class, 'owner'); - } + // public function transactions(): morphMany + // { + // return $this->morphMany(Transaction::class, 'owner'); + // } } diff --git a/app/Models/Transaction.php b/app/Models/Transaction.php index 232964d9..9ca9c24f 100644 --- a/app/Models/Transaction.php +++ b/app/Models/Transaction.php @@ -10,7 +10,7 @@ use Illuminate\Database\Eloquent\Builder; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\MorphMany; - +use Illuminate\Database\Eloquent\Relations\MorphTo; class Transaction extends AbstractModel implements Documentable { diff --git a/database/migrations/2022_02_18_120837_create_notifications_table.php b/database/migrations/2022_02_18_120837_create_notifications_table.php new file mode 100644 index 00000000..d14cdc89 --- /dev/null +++ b/database/migrations/2022_02_18_120837_create_notifications_table.php @@ -0,0 +1,40 @@ +id(); + $table->string('title'); + $table->text('description'); + $table->morphs('subject'); + $table->morphs('target'); + $table->morphs('causer'); + $table->integer('status')->default(ApprovalStatus::APPROVED); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('notifications'); + } +} diff --git a/resources/assets/vue/components/companies/sections/CustomerProfileDetailsSectionComponent.vue b/resources/assets/vue/components/companies/sections/CustomerProfileDetailsSectionComponent.vue new file mode 100644 index 00000000..f61275e2 --- /dev/null +++ b/resources/assets/vue/components/companies/sections/CustomerProfileDetailsSectionComponent.vue @@ -0,0 +1,180 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/companies/sections/WarehouseDetailsSectionComponent.vue b/resources/assets/vue/components/companies/sections/WarehouseDetailsSectionComponent.vue new file mode 100644 index 00000000..7428e1b3 --- /dev/null +++ b/resources/assets/vue/components/companies/sections/WarehouseDetailsSectionComponent.vue @@ -0,0 +1,54 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/companies/sections/WarehouseSectionComponent.vue b/resources/assets/vue/components/companies/sections/WarehouseSectionComponent.vue new file mode 100644 index 00000000..bf7f8363 --- /dev/null +++ b/resources/assets/vue/components/companies/sections/WarehouseSectionComponent.vue @@ -0,0 +1,112 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/containers/elements/ContainerComponent.vue b/resources/assets/vue/components/containers/elements/ContainerComponent.vue index 8230862a..e60059a1 100644 --- a/resources/assets/vue/components/containers/elements/ContainerComponent.vue +++ b/resources/assets/vue/components/containers/elements/ContainerComponent.vue @@ -51,6 +51,9 @@

{{item.status === 3 ? 'Un-stuffed' : 'In Progress'}}

+ + +
diff --git a/resources/assets/vue/components/containers/elements/PackingListComponent.vue b/resources/assets/vue/components/containers/elements/PackingListComponent.vue index 078fd100..b5fdc4ab 100644 --- a/resources/assets/vue/components/containers/elements/PackingListComponent.vue +++ b/resources/assets/vue/components/containers/elements/PackingListComponent.vue @@ -26,17 +26,45 @@

{{item.transport ? item.transport.current_schedule.eta : 'n/a'}}

-
-
Release
-
Hold
+
+
+
+
Release
+
Hold
+
+
Unclaimed
+
+
+
+
+
+
Generate Invoice
+
+
+
+ + + +
+ +
+
-
Unclaimed
diff --git a/resources/assets/vue/components/orders/forms/DeleteOrderRemarkFormComponent.vue b/resources/assets/vue/components/general/forms/DeleteRemarkFormComponent.vue similarity index 94% rename from resources/assets/vue/components/orders/forms/DeleteOrderRemarkFormComponent.vue rename to resources/assets/vue/components/general/forms/DeleteRemarkFormComponent.vue index a23d077f..4e50d8c4 100644 --- a/resources/assets/vue/components/orders/forms/DeleteOrderRemarkFormComponent.vue +++ b/resources/assets/vue/components/general/forms/DeleteRemarkFormComponent.vue @@ -5,9 +5,9 @@
-
+

Are you Sure?

-
Are you sure you want to delete this comment?
+
Are you sure you want to delete this remark?
diff --git a/resources/assets/vue/components/general/forms/RemarkFormComponent.vue b/resources/assets/vue/components/general/forms/RemarkFormComponent.vue new file mode 100644 index 00000000..8b67c246 --- /dev/null +++ b/resources/assets/vue/components/general/forms/RemarkFormComponent.vue @@ -0,0 +1,74 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/orders/forms/OrderRemarkFormComponent.vue b/resources/assets/vue/components/orders/forms/OrderRemarkFormComponent.vue deleted file mode 100644 index b57e0115..00000000 --- a/resources/assets/vue/components/orders/forms/OrderRemarkFormComponent.vue +++ /dev/null @@ -1,49 +0,0 @@ - - diff --git a/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue b/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue index 3f98964b..7156d78c 100644 --- a/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue +++ b/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue @@ -35,38 +35,24 @@
Remark:
-
-
-
Add a Remark
-
-
-
{{order.remarks[0].content}}
- - - - - - - - + +
-
-
-
- -
-
-
-
- Cancel -
-
-
-
+
+
Add a Remark
-
- +
+
{{ order.remarks[0].content }}
+ + + + + + + + +
@@ -465,7 +451,6 @@ section: 'orderProfileSection', isLoading: true, order: null, - isEditRemark: false, addComment: false, } }, diff --git a/resources/assets/vue/components/settings/elements/WarehouseChargesComponent.vue b/resources/assets/vue/components/settings/elements/WarehouseChargesComponent.vue index 59611841..0498cd55 100644 --- a/resources/assets/vue/components/settings/elements/WarehouseChargesComponent.vue +++ b/resources/assets/vue/components/settings/elements/WarehouseChargesComponent.vue @@ -7,7 +7,7 @@
-
+
Warehouse Name
@@ -19,7 +19,7 @@
-
+
Extra Charges
@@ -27,17 +27,43 @@
-
MYR 0.00
+
MYR 0.00
+ + +
+
+
+
+
Remarks
+
+
+
+
+
+ {{ data.remarks[0].content }} + + +
+
+
+ Add +
+ + + + + + +
+
-
Edit
- - - + + View Details
@@ -56,7 +82,7 @@ required: false }, section: { - default: '' + default: 'warhouseListSection' }, }, mixins: [modalFormHandler] diff --git a/resources/views/pages/customers/profile_details.blade.php b/resources/views/pages/customers/profile_details.blade.php new file mode 100644 index 00000000..10534ff7 --- /dev/null +++ b/resources/views/pages/customers/profile_details.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.base_portal') +@section('inner_content') + +@endsection \ No newline at end of file diff --git a/resources/views/pages/delivery_list.blade.php b/resources/views/pages/delivery_list.blade.php new file mode 100644 index 00000000..ff4a407e --- /dev/null +++ b/resources/views/pages/delivery_list.blade.php @@ -0,0 +1,135 @@ +@extends('layouts.base_portal') +@section('inner_content') + +
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
Pending Arrangement
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
Pending Delivery
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+
+
Delivered
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Marking
+
Quantity
+
CBM
+
Overweight CBM
+
Total CBM
+
status
+
Delivery Date
+
Action
+
+ + + +
+
+
+
+
+
Marking
+
Quantity
+
CBM
+
Overweight CBM
+
Total CBM
+
status
+
Delivery Date
+
+ + + +
+
+
+
+
+
Marking
+
Quantity
+
CBM
+
Overweight CBM
+
Total CBM
+
status
+
Delivery Date
+
+ + + +
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/pages/pdfs/shipping_invoice.blade.php b/resources/views/pages/pdfs/shipping_invoice.blade.php new file mode 100644 index 00000000..df4f2298 --- /dev/null +++ b/resources/views/pages/pdfs/shipping_invoice.blade.php @@ -0,0 +1,144 @@ +@extends('layouts.base_pdf') +@section('inner_content') +
+ +

+
{{ $invoice_transaction->bill_no }}
+
+ + + + + + + + + + + + +
+ + + CIEF WORLDWIDE SDN BHD + + + (1134596-M)
+ Malaysian Global Innovation & Creativity Center
+ Level 1 CWS, Block 3730, Persiaran APEC,
+ 63000 Cyberjaya, Malaysian.
+ Tel: 018-2909252 +
+
+ + Invoice + +
+ +
EI#: {{ $invoice_transaction->bill_no }}
+ + @php + $companyModule = $invoice_transaction->owner->owner->companyModule; + @endphp + +
Ref# {{ $invoice_transaction->owner->owner->reference }}
+ +
Date: {{ $invoice_transaction->created_at }}
+
 
+ +
+ + Bill To + +
+
+ {{ $companyModule->name }} +
+
+ @php + $addresses = $invoice_transaction->owner->owner->addresses()->where('status', '=', 2)->first(); + @endphp + {{ $addresses->street_one }} + {{ $addresses->street_two }} , + {{ $addresses->district()->first()->name }}, + {{ $addresses->postcode }} + {{ $addresses->state()->first()->name }}, + {{ $addresses->country()->first()->name }} +
+
+ @php + $contact = $companyModule->contacts()->first(); + @endphp + Phone: {{ $contact ? $contact->phone : '' }} +
+
+ +
+
+ + + + + + + + + + + + @foreach ($invoice_transaction->transactionDetails as $key => $transaction_detail) + + + + + + + + @endforeach + + + + + + + + + + + + + @if($invoice_transaction->tax > 0) + + + + + + @endif + + + + + + +
NoDescriptionQuantityUnit Price (RM)Total Amount
(RM)
{{ $key + 1 }}{{ $transaction_detail->name }}{{ $transaction_detail->quantity }} + {{ $transaction_detail->price }} + + {{ $transaction_detail->amount }} +
Subtotal + {{ number_format($invoice_transaction->amount, 2) }} +
Service Charges + {{ number_format($invoice_transaction->service_charge, 2) }} +
Tax{{ number_format($invoice_transaction->tax, 2) }}
Total + {{ number_format($invoice_transaction->amount, 2) }} +
+ + + + + + +
This is generated by computer. No signature required.Page {PAGENO} of {nbpg}
+
+@endsection diff --git a/resources/views/pages/settings.blade.php b/resources/views/pages/settings.blade.php index b6d89f9f..51718eae 100644 --- a/resources/views/pages/settings.blade.php +++ b/resources/views/pages/settings.blade.php @@ -152,13 +152,13 @@
-
+
-
Warehouse Charges
+
Warehouses
@@ -412,7 +412,7 @@
-
+
@@ -420,13 +420,13 @@
- Warehouse Charges + Warehouses
- + diff --git a/resources/views/pages/templates/warehouseDetails.blade.php b/resources/views/pages/templates/warehouseDetails.blade.php new file mode 100644 index 00000000..092dd826 --- /dev/null +++ b/resources/views/pages/templates/warehouseDetails.blade.php @@ -0,0 +1,45 @@ +@extends('layouts.base_portal') +@section('inner_content') +
+
+
+
+
+
+
Parcel in Warehouse
+
+
+ + + +
+
+ +
+
+ + + + +
+
+@endsection \ No newline at end of file diff --git a/resources/views/pages/warehouse.blade.php b/resources/views/pages/warehouse.blade.php new file mode 100644 index 00000000..ce290140 --- /dev/null +++ b/resources/views/pages/warehouse.blade.php @@ -0,0 +1,25 @@ +@extends('layouts.base_portal') +@section('inner_content') +
+
+
+
+
+
+
Warehouse List
+
+
+
+
+ + + +
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/pages/warehouse_list.blade.php b/resources/views/pages/warehouse_list.blade.php index 58e96926..f9d8183b 100644 --- a/resources/views/pages/warehouse_list.blade.php +++ b/resources/views/pages/warehouse_list.blade.php @@ -2,11 +2,38 @@ @section('inner_content')
- +
+
+
Arrived Parcel
+
+
+
+
+
+
+
On Hold Parcel
+
+
+
+
Marking
+
Quantity
+
CBM
+
Overweight CBM
+
Total CBM
+
status
+
Delivery Date
+
+
+ + + +
@endsection \ No newline at end of file diff --git a/resources/views/partials/footer.blade.php b/resources/views/partials/footer.blade.php index e7020345..459488fb 100644 --- a/resources/views/partials/footer.blade.php +++ b/resources/views/partials/footer.blade.php @@ -3,7 +3,7 @@
- Copyright © 2021 CIEF IZYIM. All rights reserved. + Copyright © {{ date('Y'); }} CIEF IZYIM. All rights reserved.
diff --git a/resources/views/partials/menu.blade.php b/resources/views/partials/menu.blade.php index cf62bda3..4ec00248 100644 --- a/resources/views/partials/menu.blade.php +++ b/resources/views/partials/menu.blade.php @@ -60,7 +60,18 @@ style=" fill:#000000;">
+
+
+
+ +
+
@@ -74,6 +85,17 @@
Containers
+
+
+ +
+
+
Warehouse
+
+
'api', 'prefix' => 'v1', 'as' => 'api.'], function require __DIR__ . '/announcement.php'; - Route::get('/report/customer/{marking}/{from?}/{to?}', 'Reports\MonthlyReportController@customerReport')->name('report.customer'); - Route::get('/report/sales/{from?}/{to?}', 'Reports\MonthlyReportController@salesReport')->name('report.sales'); - Route::get('/report/profit/{model}/{value}/{from?}/{to?}', 'Reports\MonthlyReportController@profitModelReport')->name('report.profit'); - Route::get('/report/service', 'Reports\MonthlyReportController@serviceReport')->name('report.service'); + require __DIR__ . '/report.php'; }); diff --git a/routes/company.php b/routes/company.php index 55c731b2..abcf7201 100644 --- a/routes/company.php +++ b/routes/company.php @@ -32,4 +32,5 @@ Route::group(['prefix' => 'company', 'as' => 'company.', 'namespace' => 'Compani Route::put('/{document_id}/approval/{status}', 'ApproveIdentificationDocumentController@approve')->where('status', 'approve|reject')->name('approval'); }); -}); \ No newline at end of file + Route::get('/module/list', 'ListCompanyModulesController@list')->name('module.list'); +}); diff --git a/routes/order.php b/routes/order.php index 2071cae4..79a67bd8 100644 --- a/routes/order.php +++ b/routes/order.php @@ -18,6 +18,4 @@ Route::group(['prefix' => 'order', 'as' => 'order.', 'namespace' => 'Orders'], f Route::put('/assign-remark/{id}', 'AssignOrderRemarkController@create')->name('assign.remark'); Route::get('/{id}/shipping-cost', 'ShippingCostController@calculate')->name('shipping.cost'); - - Route::post('/{id}/remark/create', 'CreateOrderRemarkController@create')->name('remark.create'); }); diff --git a/routes/remark.php b/routes/remark.php index 33756eee..91ae4676 100644 --- a/routes/remark.php +++ b/routes/remark.php @@ -5,7 +5,7 @@ use Illuminate\Support\Facades\Route; Route::group(['namespace' => 'Remarks', 'as' => 'remark.', 'prefix' => 'remark'], function () { Route::get('/{id}/show', 'FetchRemarkController@fetch')->name('show'); Route::get('/list', 'ListRemarksController@list')->name('list'); - Route::post('/create', 'CreateRemarkController@create')->name('create'); + Route::post('/{id}/create', 'CreateRemarkController@create')->name('create'); Route::put('/update/{id}', 'UpdateRemarkController@update')->name('update'); Route::delete('/delete/{id}', 'DeleteRemarkController@delete')->name('delete'); }); diff --git a/routes/report.php b/routes/report.php new file mode 100644 index 00000000..cd084cf6 --- /dev/null +++ b/routes/report.php @@ -0,0 +1,13 @@ + 'report', 'as' => 'report.', 'namespace' => 'Reports'], function () { + Route::get('/customer/{marking}/{from?}/{to?}', 'MonthlyReportController@customerReport')->name('customer'); + + Route::get('/sales/{from?}/{to?}', 'MonthlyReportController@salesReport')->name('sales'); + + Route::get('/profit/{model}/{value}/{from?}/{to?}', 'MonthlyReportController@profitModelReport')->name('profit'); + + Route::get('/service', 'MonthlyReportController@serviceReport')->name('service'); +}); diff --git a/routes/web.php b/routes/web.php index 3b2c90de..b8bbed7a 100644 --- a/routes/web.php +++ b/routes/web.php @@ -80,6 +80,10 @@ Route::get('/warehouse-list', function () { return view('pages.warehouse_list'); })->name('warehouse.list'); +Route::get('/delivery-list', function () { + return view('pages.delivery_list'); +})->name('delivery.list'); + Route::get('/unclaimed-packinglist', function () { return view('pages.unclaimed_packinglist'); })->name('unclaimed-packinglist.list'); @@ -99,6 +103,12 @@ Route::get('/customer/{marking}', function ($marking) { return view('pages.customers.profile', ['id' => $id]); })->name('customer.profile'); +Route::get('/customer/{marking}/details', function ($marking) { + $connection = CompanyConnection::where('invitee_reference', $marking)->first(); + $id = $connection->invitee->company->id; + return view('pages.customers.profile_details', ['id' => $id]); +})->name('customer.profile.details'); + Route::get('/orders/refresh', function(){ FetchWarehouseReceiveListFromVTPortalJob::withChain([ @@ -194,6 +204,31 @@ Route::get('/yd', function (){ (App()->make(FetchOrderListsFromYdPortalProcessor::class))->execute(); }); +Route::get('/min_cbm', function (){ + $companies = CompanyModule::where('type', \App\Classes\ValueObjects\Constants\BusinessType::IMPORTER)->whereHas('orders', function ($query){ + return $query->whereHas('packingLists')->whereDoesntHave('packingLists', function($query){ + return $query->whereHas('packages', function($query){ + return $query->selectRaw('sum((width/100) * (height/100) * (length/100) * quantity) as cbm')->where('type', \App\Classes\ValueObjects\Constants\PackingListType::SHIPPING_PACKING_LIST)->where('status', '!=', 5)->having('cbm', '>', 0.3); + }); + }); + })->limit(1)->get(); + + $i = 0; + foreach ($companies as $company) { + $marking = $company->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference; + echo ''.$i++.'. '.$marking.'
'; + } +}); + +Route::get('/warehouse', function () { + return view('pages.warehouse'); +})->name('warehouse'); + +Route::get('/warehouse/{id}/show', function ($id) { + // $connection = CompanyConnection::where('invitee_reference', '2417MEN')->first(); + // $id = $connection->invitee->company->id; + return view('pages.templates.warehouseDetails', ['id' => $id]); +})->name('warehouse.show'); Route::get('/export/customer-latest-order-date/f614e339d7058904a831aad742e24d55', 'Exports\ExportCustomersToExcelController@export'); Route::get('/export/packing-list/{id}', 'Exports\ExportContainerPackingListController@export')->name('container.packaging_list.export');