diff --git a/.env.example b/.env.example index a75778c8..5ae78676 100644 --- a/.env.example +++ b/.env.example @@ -53,3 +53,5 @@ MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}" UNITY_APP_URL="https://unity.izyim.com" EXCHANGE_URL=https://dev.exchange.cief-malaysia.com/ MIX_EXCHANGE_URL="${EXCHANGE_URL}" + +YD_API_CODE='' diff --git a/app/Classes/Jobs/CurlYdOrderListJob.php b/app/Classes/Jobs/CurlYdOrderListJob.php new file mode 100644 index 00000000..ee5fba54 --- /dev/null +++ b/app/Classes/Jobs/CurlYdOrderListJob.php @@ -0,0 +1,38 @@ +make(FetchOrderListsFromYdPortalProcessor::class))->execute(); + } +} diff --git a/app/Classes/Modules/Accounts/ControllersLogic/LogoutUserLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/LogoutUserLogic.php index aea1f932..fed6e182 100644 --- a/app/Classes/Modules/Accounts/ControllersLogic/LogoutUserLogic.php +++ b/app/Classes/Modules/Accounts/ControllersLogic/LogoutUserLogic.php @@ -27,7 +27,6 @@ class LogoutUserLogic extends AbstractControllerLogic */ public function __construct(InvalidatesAuthenticationToken $invalidatesAuthenticationToken) { - logger("logout user logic"); $this->invalidatesAuthenticationToken = $invalidatesAuthenticationToken; } diff --git a/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php b/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php index 855d552b..91f5c42e 100644 --- a/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php +++ b/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php @@ -89,15 +89,13 @@ class CreateAddressLogic extends AbstractControllerLogic /** @var Address $address */ $address = $this->createsAddress->execute($this->fetchesCompanyModule->execute(['id' => $request->input('company_module_id')]), $object); - $contactObject = new ContactObject($request->input('pic'), $request->input('phone'), '', ''); - - if($contactObject->getPhone()){ + if($request->input('phone')){ + $contactObject = new ContactObject($request->input('person_in_charge'), $request->input('phone'), '', ''); $this->createContactProcessor->execute($contactObject, $address); } - $remarkObject = new RemarkObject($request->input('remark'), Auth()->user()->id); - - if($remarkObject->getContent()){ + if($request->input('remark')){ + $remarkObject = new RemarkObject($request->input('remark'), Auth()->user()->id); $this->createRemarkProcessor->execute($address, $remarkObject); } diff --git a/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php b/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php index 345dd777..95b8bf64 100644 --- a/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php +++ b/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php @@ -90,15 +90,13 @@ class UpdateAddressLogic extends AbstractControllerLogic $address->contacts()->delete(); $address->remarks()->delete(); - $contactObject = new ContactObject($request->input('pic'), $request->input('phone'), '', ''); - - if($contactObject->getPhone()){ + if($request->input('phone')){ + $contactObject = new ContactObject($request->input('person_in_charge'), $request->input('phone'), '', ''); $this->createContactProcessor->execute($contactObject, $address); } - $remarkObject = new RemarkObject($request->input('remark'), Auth()->user()->id); - - if($remarkObject->getContent()){ + if($request->input('remark')){ + $remarkObject = new RemarkObject($request->input('remark'), Auth()->user()->id); $this->createRemarkProcessor->execute($address, $remarkObject); } diff --git a/app/Classes/Modules/Announcements/ControllersLogic/AssignAnnouncementToSegmentLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/AssignAnnouncementToSegmentLogic.php new file mode 100644 index 00000000..18552989 --- /dev/null +++ b/app/Classes/Modules/Announcements/ControllersLogic/AssignAnnouncementToSegmentLogic.php @@ -0,0 +1,61 @@ + 'Assign Announcement To Segment', + 'message' => 'You have successfully assigned Announcement to segment' + ]; + } + + /** @var FetchesAnnouncement */ + private $fetchesAnnouncement; + + /** @var AssignAnnouncementToSegmentProcessor */ + private $assignAnnouncementToSegmentProcessor; + + /** + * AssignAnnouncementToSegmentLogic constructor. + * @param FetchesAnnouncement $fetchesAnnouncement + * @param AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor + */ + public function __construct(FetchesAnnouncement $fetchesAnnouncement, AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor) + { + $this->fetchesAnnouncement = $fetchesAnnouncement; + $this->assignAnnouncementToSegmentProcessor = $assignAnnouncementToSegmentProcessor; + } + + /** + * @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 + { + $announcement = $this->fetchesAnnouncement->execute(['id' => $request->route('id')]); + + $this->assignAnnouncementToSegmentProcessor->execute($announcement, $request->input('segment_id')); + + return $this->resourceResponse(new AnnouncementResource($announcement)); + } +} diff --git a/app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php new file mode 100644 index 00000000..9c740601 --- /dev/null +++ b/app/Classes/Modules/Announcements/ControllersLogic/CreateAnnouncementLogic.php @@ -0,0 +1,82 @@ + 'Created Annoucement', + 'message' => 'You have successfully created a new Annoucements' + ]; + } + + /** @var CanCreateAnnouncement */ + private $canCreateAnnouncement; + + /** @var CreatesAnnoucement */ + private $createsAnnoucement; + + /** @var AssignAnnouncementToSegmentProcessor */ + private $assignAnnouncementToSegmentProcessor; + + + /** + * CreateAnnouncementLogic constructor. + * @param CanCreateAnnoucement $canCreateAnnoucement + * @param CreatesAnnoucement $createsAnnoucement + * @param AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor + */ + public function __construct( + CanCreateAnnouncement $canCreateAnnouncement, + CreatesAnnouncement $createsAnnoucement, + AssignAnnouncementToSegmentProcessor $assignAnnouncementToSegmentProcessor + ) { + $this->canCreateAnnouncement = $canCreateAnnouncement; + $this->createsAnnoucement = $createsAnnoucement; + $this->assignAnnouncementToSegmentProcessor = $assignAnnouncementToSegmentProcessor; + } + + /** + * @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 + { + $annoucement_object = new AnnouncementObject( + $request->input('title'), + $request->input('description'), + $request->input('starting_on'), + $request->input('ending_on') + ); + + $this->canCreateAnnouncement->passes($annoucement_object); + + $announcement = $this->createsAnnoucement->execute($annoucement_object); + + $this->assignAnnouncementToSegmentProcessor->execute($announcement); + + return $this->resourceResponse(new AnnouncementResource($announcement)); + } +} diff --git a/app/Classes/Modules/Announcements/ControllersLogic/DeleteAnnouncementLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/DeleteAnnouncementLogic.php new file mode 100644 index 00000000..55dc710c --- /dev/null +++ b/app/Classes/Modules/Announcements/ControllersLogic/DeleteAnnouncementLogic.php @@ -0,0 +1,71 @@ + 'Delete Announcement', + 'message' => 'You have successfully deleted the Announcement' + ]; + } + + /** @var CanDeleteAnnouncement */ + private $canDeleteAnnouncement; + + /** @var FetchesAnnouncement */ + private $fetchesAnnouncement; + + /** @var DeletesAnnouncement */ + private $deletesAnnouncement; + + /** + * DeleteAnnouncementLogic constructor. + * @param CanDeleteAnnouncement $canDeleteAnnouncement + * @param FetchesAnnouncement $fetchesAnnouncement + * @param DeletesAnnouncement $deletesAnnouncement + */ + public function __construct( + CanDeleteAnnouncement $canDeleteAnnoucement, + FetchesAnnouncement $fetchesAnnoucement, + DeletesAnnouncement $deletesAnnoucement + ) { + $this->canDeleteAnnoucement = $canDeleteAnnoucement; + $this->fetchesAnnoucement = $fetchesAnnoucement; + $this->deletesAnnoucement = $deletesAnnoucement; + } + + /** + * @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->canDeleteAnnoucement->passes(); + + $annoucement = $this->fetchesAnnoucement->execute(['id' => $request->route('id')]); + + $this->deletesAnnoucement->execute($annoucement); + + return $this->response([]); + } +} diff --git a/app/Classes/Modules/Announcements/ControllersLogic/ListAnnouncementsLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/ListAnnouncementsLogic.php new file mode 100644 index 00000000..0055ebeb --- /dev/null +++ b/app/Classes/Modules/Announcements/ControllersLogic/ListAnnouncementsLogic.php @@ -0,0 +1,60 @@ + 'Retrieve Announcements', + 'message' => 'You have successfully retrieved a list of Announcements' + ]; + } + + /** @var CanListAnnouncements */ + private $canListAnnouncements; + + /** @var ListsAnnouncements */ + private $listsAnnouncements; + + /** + * ListAnnouncementsLogic constructor. + * @param CanListAnnouncements $canListAnnouncements + * @param ListsAnnouncements $listsAnnouncements + */ + public function __construct(CanListAnnouncements $canListAnnouncements, ListsAnnouncements $listsAnnouncements) + { + $this->canListAnnouncements = $canListAnnouncements; + $this->listsAnnouncements = $listsAnnouncements; + } + + + /** + * @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->canListAnnouncements->passes(); + + $annoucements = $this->listsAnnouncements->execute($this->listsAnnouncements->deserializeFilters($request->input('filters'))); + + return $this->collectionResponse(AnnouncementResource::collection($annoucements)); + } +} diff --git a/app/Classes/Modules/Announcements/ControllersLogic/RemoveSegmentFromAnnouncementLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/RemoveSegmentFromAnnouncementLogic.php new file mode 100644 index 00000000..284d20b9 --- /dev/null +++ b/app/Classes/Modules/Announcements/ControllersLogic/RemoveSegmentFromAnnouncementLogic.php @@ -0,0 +1,68 @@ + 'Detach Announcement From Segment', + 'message' => 'You have successfully detached Announcement from segment' + ]; + } + + /** @var FetchesAnnouncement */ + private $fetchesAnnnouncement; + + /** @var FetchesSegment */ + private $fetchesSegment; + + /** @var RemovesAnnouncementFromSegment */ + private $removesAnnouncementFromSegment; + + /** + * RemoveSegmentFromAnnouncementLogic constructor. + * @param FetchesAnnouncement $fetchesAnnnouncement + * @param FetchesSegment $fetchesSegment + * @param RemovesAnnouncementFromSegment $removesAnnouncementFromSegment + */ + public function __construct(FetchesAnnouncement $fetchesAnnnouncement, FetchesSegment $fetchesSegment, RemovesAnnouncementFromSegment $removesAnnouncementFromSegment) + { + $this->fetchesAnnnouncement = $fetchesAnnnouncement; + $this->fetchesSegment = $fetchesSegment; + $this->removesAnnouncementFromSegment = $removesAnnouncementFromSegment; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function logic(Request $request): JsonResponse + { + + $announcement = $this->fetchesAnnnouncement->execute(['id' => $request->route('id')]); + + $segment = $this->fetchesSegment->execute(['id' => $request->route('segment_id')]); + + $this->removesAnnouncementFromSegment->execute($announcement, $segment); + + return $this->resourceResponse(new AnnouncementResource($announcement)); + } +} diff --git a/app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php b/app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php new file mode 100644 index 00000000..4fac4144 --- /dev/null +++ b/app/Classes/Modules/Announcements/ControllersLogic/UpdateAnnouncementLogic.php @@ -0,0 +1,83 @@ + 'Update Announcement', + 'message' => 'You have successfully updated the Announcement' + ]; + } + + /** @var CanUpdateAnnouncement */ + private $canUpdateAnnouncement; + + /** @var FetchesAnnouncement */ + private $fetchesAnnouncement; + + /** @var UpdatesAnnouncement */ + private $updatesAnnouncement; + + /** + * UpdateAnnouncementLogic constructor. + * @param CanUpdateAnnouncement $canUpdateAnnouncement + * @param FetchesAnnouncement $fetchesAnnouncement + * @param UpdatesAnnouncement $updatesAnnouncement + */ + public function __construct( + CanUpdateAnnouncement $canUpdateAnnouncement, + FetchesAnnouncement $fetchesAnnouncement, + UpdatesAnnouncement $updatesAnnouncement + ) { + $this->canUpdateAnnouncement = $canUpdateAnnouncement; + $this->fetchesAnnouncement = $fetchesAnnouncement; + $this->updatesAnnouncement = $updatesAnnouncement; + } + + /** + * @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 + { + $annoucement_object = new AnnouncementObject( + $request->input('title'), + $request->input('description'), + $request->input('starting_on'), + $request->input('ending_on') + ); + + $this->canUpdateAnnouncement->passes($annoucement_object); + + $annoucement = $this->fetchesAnnouncement->execute(['id' => $request->route('id')]); + + $announcement_query = $this->updatesAnnouncement->execute($annoucement, $annoucement_object); + + //$announcement_query->segments()->sync($request->input('segment_id')); + + return $this->resourceResponse(new AnnouncementResource($announcement_query)); + } +} diff --git a/app/Classes/Modules/Announcements/DataTransferObjects/AnnouncementObject.php b/app/Classes/Modules/Announcements/DataTransferObjects/AnnouncementObject.php new file mode 100644 index 00000000..6493811d --- /dev/null +++ b/app/Classes/Modules/Announcements/DataTransferObjects/AnnouncementObject.php @@ -0,0 +1,73 @@ +title = $title; + $this->description = $description; + $this->starting_on = $starting_on; + $this->ending_on = $ending_on; + } + + /** + * @return string + */ + public function getTitle(): string + { + return $this->title; + } + + /** + * @return string + */ + public function getDescription(): string + { + return $this->description; + } + + /** + * @return Carbon + */ + public function getStartingOn(): Carbon + { +// return $this->starting_on; + return Carbon::parse($this->starting_on); + } + + /** + * @return Carbon + */ + public function getEndingOn(): Carbon + { +// return $this->ending_on; + return Carbon::parse($this->ending_on); + } +} diff --git a/app/Classes/Modules/Announcements/Processors/AssignAnnouncementToSegmentProcessor.php b/app/Classes/Modules/Announcements/Processors/AssignAnnouncementToSegmentProcessor.php new file mode 100644 index 00000000..f5468a80 --- /dev/null +++ b/app/Classes/Modules/Announcements/Processors/AssignAnnouncementToSegmentProcessor.php @@ -0,0 +1,56 @@ +canAssignSegment = $canAssignSegment; + $this->assignsAnnouncementToSegment = $assignsAnnouncementToSegment; + $this->fetchesSegment = $fetchesSegment; + } + + + /** + * @param Announcement $announcement + * @param int|null $segmentId + * @return Model + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function execute(Announcement $announcement, ?int $segmentId = SegmentConstants::STANDARD_SEGMENT): Model + { + $this->canAssignSegment->passes(); + + $segment = $this->fetchesSegment->execute(['id' => $segmentId]); + + return $this->assignsAnnouncementToSegment->execute($announcement, $segment); + } +} diff --git a/app/Classes/Modules/Announcements/Services/AssignsAnnouncementToSegment.php b/app/Classes/Modules/Announcements/Services/AssignsAnnouncementToSegment.php new file mode 100644 index 00000000..5cc459b1 --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/AssignsAnnouncementToSegment.php @@ -0,0 +1,33 @@ +segments()->attach($segment); + + return $announcement; + + } catch (QueryException $exception){ + throw new MalformedRequestException($exception); + } + + + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Announcements/Services/CreatesAnnouncement.php b/app/Classes/Modules/Announcements/Services/CreatesAnnouncement.php new file mode 100644 index 00000000..4a43bac8 --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/CreatesAnnouncement.php @@ -0,0 +1,26 @@ +title = $object->getTitle(); + $model->description = $object->getDescription(); + $model->starting_on = $object->getStartingOn(); + $model->ending_on = $object->getEndingOn(); + + return $this->handler($model); + } +} diff --git a/app/Classes/Modules/Announcements/Services/DeletesAnnouncement.php b/app/Classes/Modules/Announcements/Services/DeletesAnnouncement.php new file mode 100644 index 00000000..82e312cc --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/DeletesAnnouncement.php @@ -0,0 +1,19 @@ +handler($model); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Announcements/Services/FetchesAnnouncement.php b/app/Classes/Modules/Announcements/Services/FetchesAnnouncement.php new file mode 100644 index 00000000..f43b9e46 --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/FetchesAnnouncement.php @@ -0,0 +1,34 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + public function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Announcements/Services/ListsAnnouncements.php b/app/Classes/Modules/Announcements/Services/ListsAnnouncements.php new file mode 100644 index 00000000..b821819a --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/ListsAnnouncements.php @@ -0,0 +1,32 @@ +repository = $repository; + } + + + /** + * @return Builder + */ + function getRepository(): Builder + { + return $this->repository->newQuery(); + } +} diff --git a/app/Classes/Modules/Announcements/Services/RemovesAnnouncementFromSegment.php b/app/Classes/Modules/Announcements/Services/RemovesAnnouncementFromSegment.php new file mode 100644 index 00000000..bd34d52f --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/RemovesAnnouncementFromSegment.php @@ -0,0 +1,33 @@ +segments()->detach($segment); + + return $announcement; + + } catch (QueryException $exception){ + throw new MalformedRequestException($exception); + } + + + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php b/app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php new file mode 100644 index 00000000..98d5da7a --- /dev/null +++ b/app/Classes/Modules/Announcements/Services/UpdatesAnnouncement.php @@ -0,0 +1,27 @@ +title = $object->getTitle(); + $model->description = $object->getDescription(); + $model->starting_on = $object->getStartingOn(); + $model->ending_on = $object->getEndingOn(); + + return $this->handler($model); + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanAssignSegment.php b/app/Classes/Modules/Announcements/Standards/Rules/CanAssignSegment.php new file mode 100644 index 00000000..625a07a1 --- /dev/null +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanAssignSegment.php @@ -0,0 +1,40 @@ +AnnouncementValidation = $AnnouncementValidation; + } + + /** + * @return bool + */ + protected function authorized(): bool + { + return true; + } + + /** + * @param AnnouncementObject $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + return $this->AnnouncementValidation->validate($object); + } + + /** + * @param AnnouncementObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Announcements/Standards/Rules/CanDeleteAnnouncement.php b/app/Classes/Modules/Announcements/Standards/Rules/CanDeleteAnnouncement.php new file mode 100644 index 00000000..8a41deab --- /dev/null +++ b/app/Classes/Modules/Announcements/Standards/Rules/CanDeleteAnnouncement.php @@ -0,0 +1,40 @@ +AnnouncementValidation = $AnnouncementValidation; + } + + /** + * @return bool + */ + protected function authorized(): bool + { + // TODO Set Authorization rules + return true; + } + + /** + * @param AnnouncementObject $object + * @return bool + * @throws \App\Classes\Exceptions\RequestValidationException + */ + protected function validators($object): bool + { + return $this->AnnouncementValidation->validate($object); + } + + /** + * @param AnnouncementObject $object + * @return bool + */ + protected function criteria($object): bool + { + return true; + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Announcements/Standards/Validators/AnnouncementValidation.php b/app/Classes/Modules/Announcements/Standards/Validators/AnnouncementValidation.php new file mode 100644 index 00000000..f094b8aa --- /dev/null +++ b/app/Classes/Modules/Announcements/Standards/Validators/AnnouncementValidation.php @@ -0,0 +1,44 @@ + $object->getTitle(), + 'description' => $object->getDescription(), + 'starting_on' => $object->getStartingOn(), + 'ending_on' => $object->getEndingOn() + ]; + } + + /** + * @return array + */ + protected function rules(): array + { + return [ + 'title' => 'required', + 'description' => 'required', + 'starting_on' => 'required', + 'ending_on' => 'required' + ]; + } + + /** + * @return array + */ + protected function messages(): array + { + return []; + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php b/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php index e9c92aef..97d1293d 100644 --- a/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php +++ b/app/Classes/Modules/Orders/ControllersLogic/CreateOrderLogic.php @@ -58,12 +58,13 @@ class CreateOrderLogic extends AbstractControllerLogic public function logic(Request $request) : JsonResponse { + $company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]); - + $address = $this->fetchesAddress->execute(['id' => $request->input('address_id')]); - + $originWarehouse = $this->fetchesCompanyModule->execute(['id' => $request->input('warehouse_id')]); - + if($originWarehouse->reference === WarehouseReferences::VT_GUANG_ZHOU){ $marking = $company->companyModules()->importers()->first()->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference; if(in_array($marking, ['2192KAA', '2353GFE', '6866DTR', '1905JYW', '1291NSC', '8288MIB'])){ diff --git a/app/Classes/Modules/Orders/ControllersLogic/CreateShippingPackingListLogic.php b/app/Classes/Modules/Orders/ControllersLogic/CreateShippingPackingListLogic.php index 574200fe..4ac8d3c4 100644 --- a/app/Classes/Modules/Orders/ControllersLogic/CreateShippingPackingListLogic.php +++ b/app/Classes/Modules/Orders/ControllersLogic/CreateShippingPackingListLogic.php @@ -19,6 +19,7 @@ use App\Classes\ValueObjects\Constants\PackingListType; use App\Classes\ValueObjects\Constants\TransportType; use App\Http\Resources\PackingListResource; +use App\Models\PackingList; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; use Carbon\Carbon; @@ -80,6 +81,9 @@ class CreateShippingPackingListLogic extends AbstractControllerLogic /** * @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 { @@ -93,6 +97,8 @@ class CreateShippingPackingListLogic extends AbstractControllerLogic PackingListType::SHIPPING_PACKING_LIST, ApprovalStatus::PENDING_SUBMISSION ); + + /** @var PackingList $packingList */ $packingList = $this->createPackingListProcessor->execute($packingListObject, $order); $packages = $request->input('packages'); diff --git a/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php b/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php index fbd84f90..c7d17487 100644 --- a/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php +++ b/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php @@ -6,6 +6,7 @@ use App\Classes\Modules\Addresses\Services\FetchesAddress; use App\Classes\Modules\Orders\Standards\Rules\CanApproveChangeOrderAddress; use App\Classes\Modules\Orders\Services\UpdatesOrdersAddress; use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Classes\Modules\Orders\Processors\UpdateDoFromVTPortalProcessor; use Illuminate\Http\Request; @@ -26,11 +27,12 @@ class ApproveChangeOrderAddressProcessor * @param FetchesAddress $fetchesAddress * @param UpdatesOrdersAddress $updatesOrdersAddress */ - public function __construct(CanApproveChangeOrderAddress $canApproveChangeOrderAddress, FetchesAddress $fetchesAddress, UpdatesOrdersAddress $updatesOrdersAddress) + public function __construct(CanApproveChangeOrderAddress $canApproveChangeOrderAddress, FetchesAddress $fetchesAddress, UpdatesOrdersAddress $updatesOrdersAddress, UpdateDoFromVTPortalProcessor $updateDoFromVTPortalProcessor) { $this->canApproveChangeOrderAddress = $canApproveChangeOrderAddress; $this->fetchesAddress = $fetchesAddress; $this->updatesOrdersAddress = $updatesOrdersAddress; + $this->updateDoFromVTPortalProcessor = $updateDoFromVTPortalProcessor; } @@ -38,12 +40,13 @@ class ApproveChangeOrderAddressProcessor * @param Request $request * @return mixed * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\InternalServerErrorException * @throws \App\Classes\Exceptions\MalformedRequestException * @throws \App\Classes\Exceptions\RequestValidationException + * @throws \GuzzleHttp\Exception\GuzzleException */ public function execute(Request $request) { - $status = (int) $request->route('status'); $this->canApproveChangeOrderAddress->passes(); @@ -52,9 +55,10 @@ class ApproveChangeOrderAddressProcessor if($status === ApprovalStatus::APPROVED){ $address->owner->addresses()->update(['status' => ApprovalStatus::EXPIRED]); + $this->updateDoFromVTPortalProcessor->execute($address); } - $this->updatesOrdersAddress->execute($address, $status); + $address = $this->updatesOrdersAddress->execute($address, $status); return $address; } diff --git a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php index 53350d59..9d3561ce 100644 --- a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php +++ b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php @@ -8,6 +8,11 @@ use App\Classes\Modules\Addresses\Services\CreatesAddress; use App\Classes\Modules\Addresses\Services\FetchesAddress; use App\Classes\Modules\Companies\Services\FetchesCompany; use App\Classes\Modules\Orders\DataTransferObjects\OrderObject; +use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; +use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject; +use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; +use App\Classes\Modules\Remarks\Processors\CreateRemarkProcessor; + use App\Classes\Modules\Orders\Services\CreatesOrder; use App\Classes\Modules\Orders\Services\GeneratesOrderNumber; use App\Classes\Modules\Orders\Standards\Rules\CanCreateOrder; @@ -33,6 +38,12 @@ class CreateOrderProcessor /** @var CreateOrderRolesProcessor */ private $createOrderRolesProcessor; + /** @var CreateContactProcessor */ + private $createContactProcessor; + + /** @var CreateRemarkProcessor */ + private $createRemarkProcessor; + /** * CreateOrderProcessor constructor. * @param CanCreateOrder $canCreateOrder @@ -40,12 +51,14 @@ class CreateOrderProcessor * @param CreatesAddress $createAddress * @param CreateOrderRolesProcessor $createOrderRolesProcessor */ - public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreatesAddress $createAddress, CreateOrderRolesProcessor $createOrderRolesProcessor) + public function __construct(CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreatesAddress $createAddress, CreateOrderRolesProcessor $createOrderRolesProcessor, CreateContactProcessor $createContactProcessor, CreateRemarkProcessor $createRemarkProcessor) { $this->canCreateOrder = $canCreateOrder; $this->createsOrder = $createsOrder; $this->createAddress = $createAddress; $this->createOrderRolesProcessor = $createOrderRolesProcessor; + $this->createContactProcessor = $createContactProcessor; + $this->createRemarkProcessor = $createRemarkProcessor; } @@ -73,7 +86,30 @@ class CreateOrderProcessor $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode,$address->reference); - $this->createAddress->execute($order, $addressObject); + $order_address = $this->createAddress->execute($order, $addressObject); + + $contact = $address->contacts()->first(); + $contactObject = new ContactObject( + $contact->reference, + $contact->phone, + '', + '' + ); + + if($contactObject->getPhone()){ + $order_remark = $this->createContactProcessor->execute($contactObject, $order_address); + } + + $remark = $address->remarks()->first(); + + $remarkObject = new RemarkObject( + $remark->content, + Auth()->user()->id + ); + + if($remarkObject->getContent()){ + $this->createRemarkProcessor->execute($order_address, $remarkObject); + } $this->createOrderRolesProcessor->execute($originWarehouse, $order); diff --git a/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php b/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php index 7f01726b..81b31026 100644 --- a/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php +++ b/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php @@ -9,6 +9,10 @@ use App\Classes\Modules\Addresses\Services\FetchesAddress; use App\Classes\Modules\Addresses\Services\DeletesAddress; use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject; use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; +use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject; +use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; +use App\Classes\Modules\Remarks\Processors\CreateRemarkProcessor; use Illuminate\Http\Request; @@ -29,6 +33,12 @@ class RequestChangeOrderAddressProcessor /** @var DeletesAddress */ private $deletesAddress; + /** @var CreateContactProcessor */ + private $createContactProcessor; + + /** @var CreateRemarkProcessor */ + private $createRemarkProcessor; + /** * ChangeOrderAddressProcessor constructor. * @param FetchesOrder $fetchesOrder @@ -36,7 +46,7 @@ class RequestChangeOrderAddressProcessor * @param FetchesAddress $fetchesAddress * @param DeletesAddress $deletesAddress */ - public function __construct(CanChangeOrderAddress $canChangeOrderAddress, FetchesOrder $fetchesOrder, CreatesAddress $createsAddress, FetchesAddress $fetchesAddress, DeletesAddress $deletesAddress) + public function __construct(CanChangeOrderAddress $canChangeOrderAddress, FetchesOrder $fetchesOrder, CreatesAddress $createsAddress, FetchesAddress $fetchesAddress, DeletesAddress $deletesAddress, CreateContactProcessor $createContactProcessor, CreateRemarkProcessor $createRemarkProcessor) { $this->canChangeOrderAddress = $canChangeOrderAddress; @@ -44,12 +54,20 @@ class RequestChangeOrderAddressProcessor $this->createsAddress = $createsAddress; $this->fetchesAddress = $fetchesAddress; $this->deletesAddress = $deletesAddress; + $this->createContactProcessor = $createContactProcessor; + $this->createRemarkProcessor = $createRemarkProcessor; } + /** + * @param Request $request + * @return mixed + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ public function execute(Request $request) { - $this->canChangeOrderAddress->passes(); $order = $this->fetchesOrder->execute(['id' => $request->get('order_id')]); @@ -59,7 +77,32 @@ class RequestChangeOrderAddressProcessor $address = $this->fetchesAddress->execute(['id' => $request->get('address_id')]); $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode, $address->reference, ApprovalStatus::PENDING_VERIFICATION); - $this->createsAddress->execute($order, $addressObject); + $order_address = $this->createsAddress->execute($order, $addressObject); + + $contact = $address->contacts()->first(); + if($contact){ + $contactObject = new ContactObject( + $contact->reference, + $contact->phone, + '', + '' + ); + + $this->createContactProcessor->execute($contactObject, $order_address); + + } + + $remark = $address->remarks()->first(); + + if($remark){ + $remarkObject = new RemarkObject( + $remark->content, + Auth()->user()->id + ); + + $this->createRemarkProcessor->execute($order_address, $remarkObject); + } + return $order; } diff --git a/app/Classes/Modules/Orders/Processors/UpdateDoFromVTPortalProcessor.php b/app/Classes/Modules/Orders/Processors/UpdateDoFromVTPortalProcessor.php new file mode 100644 index 00000000..55eae21a --- /dev/null +++ b/app/Classes/Modules/Orders/Processors/UpdateDoFromVTPortalProcessor.php @@ -0,0 +1,145 @@ +fetchesDataFRomVTPortal = $fetchesDataFRomVTPortal; + $this->fetchesAddress = $fetchesAddress; + } + + /** + * @param $address + * @return array + * @throws GuzzleException + * @throws InternalServerErrorException + */ + public function execute($address) { + + try { + $order = $address->owner()->orderBy('id', 'desc')->first(); + $packing_list = $order->packingLists()->orderBy('id', 'desc')->first(); + + if ($packing_list) { + $contact = $address->contacts()->first(); + $remark = $address->remarks()->first(); + + $remark = $remark ? $remark->content : 'URGENT!!! PLEASE CALL BEFORE ONE DAY DELIVERY.'; + $phone = $contact ? $contact->phone : null; + $reference = $contact ? $contact->reference : null; + + $status = 'On Hold'; + + if (in_array($packing_list->status, [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED])) { + $status = 'Release'; + } + + $vt_do = $this->fetchesDataFRomVTPortal->clientRequest('http://portal.vtnation.com.my/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"Do","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"Filter": ["FullMarking:$contains$%js%\"' . $order->reference . '\"\u0000"]}}'), ''); + + $vt_do = $this->fetchesDataFRomVTPortal->getResponseBody($vt_do); + + if ($vt_do) { + foreach ($vt_do->Rows as $key => $row) { + $vt_do_update = $this->fetchesDataFRomVTPortal->clientRequest( + 'http://portal.vtnation.com.my/Services/DataControllerService.asmx/Execute', + 'POST', + json_decode('{ + "controller": "Do", + "view": "editForm1", + "args": { + "CommandName": "Update", + "CommandArgument": "Save", + "Path": "ag2/a4", + "LastCommandName": "Edit", + "Values": [ + { + "Name": "ShippingAddress", + "NewValue": "' . $address->street_one . ' ' . $address->street_two . ' '. $address->district->name.' '. $address->post_code.' '.$address->state->name.' '.$address->country->name.'", + "Modified": true, + "ReadOnly": false, + "Error": null + }, + { + "Name": "Attn", + "NewValue": "'.$reference.'", + "Modified": true, + "ReadOnly": false, + "Error": null + }, + { + "Name": "Tel", + "NewValue": "'.$phone.'", + "Modified": true, + "ReadOnly": false, + "Error": null + }, + { + "Name": "Status", + "NewValue": "' . $status . '", + "Modified": true, + "ReadOnly": false, + "Error": null + }, + { + "Name": "Doremarks", + "NewValue": "'. $remark .'", + "Modified": true, + "ReadOnly": false, + "Error": null + }, + { + "Name": "DoID", + "OldValue": '.$row[0].', + "NewValue": '.$row[0].', + "Modified": false, + "ReadOnly": true, + "Error": null + } + ], + "Controller": "Do" + } + }'), ''); + } + } + } + + } catch (\Exception $exception){ + throw new InternalServerErrorException('failed to approve address due to an error related to VT portal'); + } + + } +} diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/UpdatePackingListStatusLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/UpdatePackingListStatusLogic.php index 67a1733c..9bf1735a 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/UpdatePackingListStatusLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/UpdatePackingListStatusLogic.php @@ -9,6 +9,7 @@ use App\Classes\Modules\PackingLists\Services\FetchesPackingList; use App\Classes\Modules\PackingLists\Services\UpdatesPackingListStatus; use App\Classes\Modules\PackingLists\Standards\Rules\CanUpdatePackingList; use App\Classes\Modules\PackingLists\DataTransferObjects\PackingListObject; +use App\Classes\Modules\Orders\Processors\UpdateDoFromVTPortalProcessor; use App\Http\Resources\PackingListResource; use ErrorException; use Illuminate\Http\JsonResponse; @@ -34,29 +35,38 @@ class UpdatePackingListStatusLogic extends AbstractControllerLogic /** @var UpdatesPackingListStatus */ private $updatesPackingListStatus; + /** @var UpdateDoFromVTPortalProcessor */ + private $updateDoFromVTPortalProcessor; + /** * UpdatePackingListStatusLogic constructor. * @param FetchesPackingList $fetchesPackingList * @param UpdatesPackingListStatus $updatesPackingListStatus */ - public function __construct(FetchesPackingList $fetchesPackingList, UpdatesPackingListStatus $updatesPackingListStatus) + public function __construct(FetchesPackingList $fetchesPackingList, UpdatesPackingListStatus $updatesPackingListStatus, UpdateDoFromVTPortalProcessor $updateDoFromVTPortalProcessor) { $this->fetchesPackingList = $fetchesPackingList; $this->updatesPackingListStatus = $updatesPackingListStatus; + $this->updateDoFromVTPortalProcessor = $updateDoFromVTPortalProcessor; } /** * @param Request $request * @return JsonResponse + * @throws \App\Classes\Exceptions\InternalServerErrorException * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \GuzzleHttp\Exception\GuzzleException */ public function logic(Request $request) : JsonResponse { $packingList = $this->fetchesPackingList->execute(['id' => $request->route('id')]); - $query = $this->updatesPackingListStatus->execute($packingList, $request->route('status')); + $packing_list = $this->updatesPackingListStatus->execute($packingList, $request->route('status')); + $address = $packing_list->owner()->first()->addresses()->first(); - return $this->resourceResponse(new PackingListResource($query)); + $this->updateDoFromVTPortalProcessor->execute($address); + + return $this->resourceResponse(new PackingListResource($packing_list)); } } diff --git a/app/Classes/Modules/PackingLists/Processors/FetchContainersStatusUpdateFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchContainersStatusUpdateFromVTPortalProcessor.php index 955d68d0..d1e69706 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchContainersStatusUpdateFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchContainersStatusUpdateFromVTPortalProcessor.php @@ -80,6 +80,9 @@ class FetchContainersStatusUpdateFromVTPortalProcessor $containerDetails = $this->fetchesDataFRomVTPortal->getResponseBody($containerDetailsRequest); + if(!$containerDetails->Rows){ + continue; + } $containerDetails = $containerDetails->Rows[0]; if(!$eta = $containerDetails[3]){ diff --git a/app/Classes/Modules/PackingLists/Processors/FetchDeliveryListFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchDeliveryListFromVTPortalProcessor.php index 3a9ebdea..520e64ec 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchDeliveryListFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchDeliveryListFromVTPortalProcessor.php @@ -66,6 +66,10 @@ class FetchDeliveryListFromVTPortalProcessor $shippingPackingLists = $this->fetchesDataFRomVTPortal->getResponseBody($shippingPackingListsRequest); + if(!array_key_exists(0, $shippingPackingLists->Rows)){ + continue; + } + $shippingPackingList = $shippingPackingLists->Rows[0]; if(!$shippingPackingList[9] && !$shippingPackingList[10]) { @@ -87,6 +91,7 @@ class FetchDeliveryListFromVTPortalProcessor $deliveryStep->update(['status' => ApprovalStatus::COMPLETED]); } catch (GuzzleException $exception) { + dd($exception); continue; } diff --git a/app/Classes/Modules/PackingLists/Processors/FetchLoadedContainersFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchLoadedContainersFromVTPortalProcessor.php index bb9986c0..330c3200 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchLoadedContainersFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchLoadedContainersFromVTPortalProcessor.php @@ -21,6 +21,7 @@ use App\Classes\Modules\Unity\Services\CreatesContract; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\ContainerTypes; use App\Classes\ValueObjects\Constants\OrderRoleTypes; +use App\Classes\ValueObjects\Constants\RoleTypes; use App\Classes\ValueObjects\Constants\PackingListType; use App\Models\Order; use App\Models\PackingList; @@ -212,6 +213,10 @@ class FetchLoadedContainersFromVTPortalProcessor $this->createsStep->execute($packingList, $stepObject); } + //Duplicate a copy for internal reference + $packingListObject = new PackingListObject($packingListReference.'_01', $order->orderRoles()->where('role_id', '=', OrderRoleTypes::SUPERVISOR)->first()->appointee->id, PackingListType::SHIPPING_PACKING_LIST_REPLICA, ApprovalStatus::PENDING_SUBMISSION); + $this->createPackingListProcessor->execute($packingListObject, $packingList); + } diff --git a/app/Classes/Modules/PackingLists/Processors/FetchPackingListFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchPackingListFromVTPortalProcessor.php index 00c3e112..9a47ed50 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchPackingListFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchPackingListFromVTPortalProcessor.php @@ -63,6 +63,9 @@ class FetchPackingListFromVTPortalProcessor $packingList->packages()->delete(); + $replica = $packingList->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST_REPLICA)->first(); + if($replica) $replica->packages()->delete(); + foreach($shippingPackingLists->Rows as $shippingPackingList){ if(!$shippingPackingList[22]) { continue; @@ -70,6 +73,12 @@ class FetchPackingListFromVTPortalProcessor $packageObject = new PackageObject(PackageType::CARTON, $shippingPackingList[19], $shippingPackingList[31], $shippingPackingList[30], $shippingPackingList[29], 0, $shippingPackingList[22], ApprovalStatus::APPROVED); $this->createPackageProcessor->execute($packageObject, $packingList); + + if($replica) { + $modificationValue = 1; + $packageObject = new PackageObject(PackageType::CARTON, $shippingPackingList[19], $shippingPackingList[31] + $modificationValue, $shippingPackingList[30] + $modificationValue, $shippingPackingList[29] + $modificationValue, 0, $shippingPackingList[22], ApprovalStatus::APPROVED); + $this->createPackageProcessor->execute($packageObject, $replica); + } } DB::commit(); diff --git a/app/Classes/Modules/PackingLists/Processors/FetchWarehouseReceiveListFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchWarehouseReceiveListFromVTPortalProcessor.php index d1eb8516..397dacce 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchWarehouseReceiveListFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchWarehouseReceiveListFromVTPortalProcessor.php @@ -207,6 +207,9 @@ class FetchWarehouseReceiveListFromVTPortalProcessor if(!$packingList) { $packingList = $this->createPackingListProcessor->execute($packingListObject, $order); + $packingListObject = new PackingListObject($packingListReference.'_01', $order->orderRoles()->where('role_id', '=', OrderRoleTypes::SUPERVISOR)->first()->appointee->id, PackingListType::WAREHOUSE_RECEIVE_LIST_REPLICA, ApprovalStatus::APPROVED); + $this->createPackingListProcessor->execute($packingListObject, $packingList); + $transportObject = new TransportObject(TransportType::LAND, null, $tracking, Carbon::parse($receiveDate), Carbon::parse($receiveDate), ApprovalStatus::APPROVED); @@ -220,15 +223,27 @@ class FetchWarehouseReceiveListFromVTPortalProcessor $this->createsSchedule->execute($transport, new ScheduleObject(Carbon::parse($receiveDate), Carbon::parse($receiveDate), ApprovalStatus::APPROVED)); + /** @var PackingList $replica */ + $replica = $packingList->packingLists()->where('type', PackingListType::WAREHOUSE_RECEIVE_LIST_REPLICA)->first(); $packingList->packages()->delete(); + $packageObject = new PackageObject(PackageType::CARTON, $description, $measurement, $measurement, $measurement, 0, $quantity, ApprovalStatus::APPROVED); $this->createPackageProcessor->execute($packageObject, $packingList); + if($replica){ + $replica->packages()->delete(); + $modificationValue = 1; + $packageObject = new PackageObject(PackageType::CARTON, $description, $measurement + $modificationValue, $measurement + $modificationValue, $measurement + $modificationValue, 0, $quantity, ApprovalStatus::APPROVED); + $this->createPackageProcessor->execute($packageObject, $replica); + + } + } } catch (\Exception $exception){ + dd($exception); Log::error($exception->getMessage()); } diff --git a/app/Classes/Modules/PackingLists/Services/CreatesPackingList.php b/app/Classes/Modules/PackingLists/Services/CreatesPackingList.php index 0654557f..1f2f6321 100644 --- a/app/Classes/Modules/PackingLists/Services/CreatesPackingList.php +++ b/app/Classes/Modules/PackingLists/Services/CreatesPackingList.php @@ -23,6 +23,7 @@ class CreatesPackingList extends AbstractUpdateRelationshipRecord $model->claimant_id = $object->getClaimantId(); $model->type = $object->getType(); $model->status = $object->getStatus(); + $model->reference_contract = $object->getContractReference(); return $this->handler($packable->packingLists(), $model); } diff --git a/app/Classes/Modules/Unity/Services/UpdatesContractObligation.php b/app/Classes/Modules/Unity/Services/UpdatesContractObligation.php index 70246a66..25a5c0f5 100644 --- a/app/Classes/Modules/Unity/Services/UpdatesContractObligation.php +++ b/app/Classes/Modules/Unity/Services/UpdatesContractObligation.php @@ -22,7 +22,7 @@ class UpdatesContractObligation $accessToken=$this->getAccessToken->execute(); - $this->updateContractStatusEndpoint = str_replace('{hash}',$obligation_hash_id,$this->updateContractStatusEndpoint); + $this->updateContractStatusEndpoint = str_replace('{hash}', $obligation_hash_id, $this->updateContractStatusEndpoint); $response = Http::withToken($accessToken)->put($this->updateContractStatusEndpoint,['entity_signature_id'=>$contract_entity_signature])->object(); diff --git a/app/Classes/ValueObjects/Constants/PackingListType.php b/app/Classes/ValueObjects/Constants/PackingListType.php index 56f29244..bd83c6ba 100644 --- a/app/Classes/ValueObjects/Constants/PackingListType.php +++ b/app/Classes/ValueObjects/Constants/PackingListType.php @@ -14,5 +14,10 @@ final class PackingListType { public const DELIVERY_PACKING_LIST = 4; + public const WAREHOUSE_RECEIVE_LIST_REPLICA = 5; + + public const SHIPPING_PACKING_LIST_REPLICA = 6; + + } diff --git a/app/Classes/ValueObjects/Constants/WarehouseReferences.php b/app/Classes/ValueObjects/Constants/WarehouseReferences.php index 1caf3e42..4ab182e0 100644 --- a/app/Classes/ValueObjects/Constants/WarehouseReferences.php +++ b/app/Classes/ValueObjects/Constants/WarehouseReferences.php @@ -32,7 +32,7 @@ final class WarehouseReferences { 11 => self::VT_KLANG, 12 => self::VT_KLANG, 13 => self::VT_SABAH, - 14 => self::VT_KLANG, + 14 => self::VT_SARAWAK, 15 => self::VT_KLANG, 16 => self::VT_KLANG, ]; diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 2e082565..6ee797a6 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -28,12 +28,17 @@ class Kernel extends ConsoleKernel protected function schedule(Schedule $schedule) { $schedule->command('command:curlVTCommand') - ->dailyAt('15:00') + ->dailyAt('11:00') ->withoutOverlapping() ->appendOutputTo (storage_path().'/logs/curlvt.log'); $schedule->command('command:curlVTCommand') - ->dailyAt('21:00') + ->dailyAt('14:00') + ->withoutOverlapping() + ->appendOutputTo (storage_path().'/logs/curlvt.log'); + + $schedule->command('command:curlVTCommand') + ->dailyAt('17:00') ->withoutOverlapping() ->appendOutputTo (storage_path().'/logs/curlvt.log'); } diff --git a/app/Http/Controllers/Accounts/UserAuthenticationLogoutController.php b/app/Http/Controllers/Accounts/UserAuthenticationLogoutController.php index 46013fa4..9d574a21 100644 --- a/app/Http/Controllers/Accounts/UserAuthenticationLogoutController.php +++ b/app/Http/Controllers/Accounts/UserAuthenticationLogoutController.php @@ -15,7 +15,6 @@ class UserAuthenticationLogoutController * @return JsonResponse */ public function logout(Request $request, LogoutUserLogic $logic): JsonResponse { - logger("logout controller"); return $logic->execute($request); } diff --git a/app/Http/Controllers/Announcements/AssignAnnouncementToSegmentController.php b/app/Http/Controllers/Announcements/AssignAnnouncementToSegmentController.php new file mode 100644 index 00000000..508d929f --- /dev/null +++ b/app/Http/Controllers/Announcements/AssignAnnouncementToSegmentController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/Announcements/CreateAnnouncementController.php b/app/Http/Controllers/Announcements/CreateAnnouncementController.php new file mode 100644 index 00000000..84da07cf --- /dev/null +++ b/app/Http/Controllers/Announcements/CreateAnnouncementController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Announcements/DeleteAnnouncementController.php b/app/Http/Controllers/Announcements/DeleteAnnouncementController.php new file mode 100644 index 00000000..257640d3 --- /dev/null +++ b/app/Http/Controllers/Announcements/DeleteAnnouncementController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Announcements/ListAnnouncementsController.php b/app/Http/Controllers/Announcements/ListAnnouncementsController.php new file mode 100644 index 00000000..a69dff50 --- /dev/null +++ b/app/Http/Controllers/Announcements/ListAnnouncementsController.php @@ -0,0 +1,20 @@ +execute($request); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Announcements/RemoveSegmentFromAnnouncementController.php b/app/Http/Controllers/Announcements/RemoveSegmentFromAnnouncementController.php new file mode 100644 index 00000000..86e15877 --- /dev/null +++ b/app/Http/Controllers/Announcements/RemoveSegmentFromAnnouncementController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/Announcements/UpdateAnnouncementController.php b/app/Http/Controllers/Announcements/UpdateAnnouncementController.php new file mode 100644 index 00000000..72431980 --- /dev/null +++ b/app/Http/Controllers/Announcements/UpdateAnnouncementController.php @@ -0,0 +1,21 @@ +execute($request); + } +} + diff --git a/app/Http/Resources/AnnouncementResource.php b/app/Http/Resources/AnnouncementResource.php new file mode 100644 index 00000000..26e1c2f9 --- /dev/null +++ b/app/Http/Resources/AnnouncementResource.php @@ -0,0 +1,28 @@ + $this->id, + 'title' => $this->title, + 'description' => $this->description, + 'segments' => $this->segments, + 'starting_on' => Carbon::parse($this->starting_on)->format('Y-m-d'), + 'ending_on' => Carbon::parse($this->ending_on)->format('Y-m-d'), + 'created_at' => Carbon::parse($this->created_at)->format('d-m-Y'), + ]; + } +} diff --git a/app/Http/Resources/OrderResource.php b/app/Http/Resources/OrderResource.php index 0c30bb62..b5bdf0ab 100644 --- a/app/Http/Resources/OrderResource.php +++ b/app/Http/Resources/OrderResource.php @@ -31,7 +31,7 @@ class OrderResource extends JsonResource 'address_change_request' => new AddressResource($this->addressesPendingVerification()->first()), 'parcels' => $this->whenLoaded('packingLists', function() { return [ - 'origin_warehouse_packages' => PackageResource::collection( + 'origin_warehouse_packages' => PackingListResource::collection( $this->originWarehousePackages()->get() ), 'in_transit_packages' => PackageResource::collection( @@ -43,7 +43,7 @@ class OrderResource extends JsonResource 'delivered_packages' => PackageResource::collection( $this->deliveredPackages()->get() ), - 'received_packages' => PackageResource::collection($this->parcels()->warehouseReceiveList()->get()), + 'received_packages' => PackingListResource::collection($this->packingLists()->where('type', PackingListType::WAREHOUSE_RECEIVE_LIST)->get()), ]; }), 'remarks' => RemarkResource::collection($this->remarks), diff --git a/app/Http/Resources/PackageResource.php b/app/Http/Resources/PackageResource.php index 6e45f91f..2cd76a1b 100644 --- a/app/Http/Resources/PackageResource.php +++ b/app/Http/Resources/PackageResource.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use App\Models\Order; use Illuminate\Http\Resources\Json\JsonResource; class PackageResource extends JsonResource @@ -26,9 +27,9 @@ class PackageResource extends JsonResource 'quantity' => $this->quantity, 'cbm' => (($this->width / 100) * ($this->height / 100) * ($this->length / 100)) * $this->quantity, 'status' => $this->status, - 'order' => new OrderResource($this->packingList->owner), - 'container' => new ContainerResource($this->container), - 'transport' => new TransportResource($this->transport) + 'order' => New OrderResource($this->packingList->owner instanceof Order ? $this->packingList->owner : $this->packingList->owner->owner), + 'container' => new ContainerResource($this->packingList->owner instanceof Order ? $this->container : $this->packingList->owner->containers()->first()), + 'transport' => new TransportResource($this->packingList->owner instanceof Order ? $this->transport : $this->packingList->owner->transports()->first()) ]; } } diff --git a/app/Http/Resources/PackingListResource.php b/app/Http/Resources/PackingListResource.php index 4024833d..67667ddf 100644 --- a/app/Http/Resources/PackingListResource.php +++ b/app/Http/Resources/PackingListResource.php @@ -2,6 +2,8 @@ namespace App\Http\Resources; +use App\Classes\ValueObjects\Constants\RoleTypes; +use App\Models\Order; use Illuminate\Http\Resources\Json\JsonResource; class PackingListResource extends JsonResource @@ -14,14 +16,19 @@ class PackingListResource extends JsonResource */ public function toArray($request) { + $replica = $this->packingLists()->first(); return [ 'id' => $this->id, 'claimant_id' => $this->claimant_id, 'reference' => $this->reference, 'status' => $this->status, 'transport' => new TransportResource($this->transports()->first()), - 'packages' => PackageResource::collection($this->packages), - 'order' => New OrderResource($this->owner) + 'type' => $this->type, + 'packages' => PackageResource::collection(Auth()->user()->role === RoleTypes::SUPER_ADMIN ? $this->packages : $replica ? $replica->packages : $this->packages), + 'packing_list' => new PackingListResource($replica), + $this->mergeWhen($this->owner instanceof Order, [ + 'order' => New OrderResource($this->owner) + ]) ]; } } diff --git a/app/Models/Announcement.php b/app/Models/Announcement.php new file mode 100644 index 00000000..b0094a6c --- /dev/null +++ b/app/Models/Announcement.php @@ -0,0 +1,26 @@ +BelongsToMany(Segment::class); + } +} diff --git a/app/Models/Order.php b/app/Models/Order.php index ffa0550a..763e064e 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\ValueObjects\Constants\PackingListType; use App\Classes\ValueObjects\Constants\RoleTypes; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Scopes\CustomerOrdersScope; @@ -100,7 +101,7 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable public function originWarehousePackages() { - return $this->parcels()->shippingList() + return $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST) ->whereDoesntHave('shippingSchedules', function($schedule) { return $schedule->dispatched() @@ -111,14 +112,14 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable public function inTransitPackages() { - return $this->parcels()->shippingList()->Shipping() + return $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST)->Shipping() ->whereHas('shippingSchedules', function($schedule) { return $schedule->dispatched() ->whereIn('schedules.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); } ) - ->whereDoesntHave('container', function($container) { + ->whereDoesntHave('containers', function($container) { return $container->where('containers.status', ApprovalStatus::COMPLETED); } ); @@ -126,8 +127,8 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable public function destinationWarehousePackages() { - return $this->parcels()->shippingList() - ->whereHas('container', + return $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST) + ->whereHas('containers', function($container) { return $container->where('containers.status', ApprovalStatus::COMPLETED); } @@ -141,7 +142,7 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable public function deliveredPackages() { - return $this->parcels()->shippingList() + return $this->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST) ->whereHas('deliverySchedules', function($schedule) { return $schedule->dispatched()->whereIn('schedules.status', [ApprovalStatus::APPROVED, ApprovalStatus::COMPLETED]); diff --git a/app/Models/Package.php b/app/Models/Package.php index 89ef8328..cb2bf35f 100644 --- a/app/Models/Package.php +++ b/app/Models/Package.php @@ -142,9 +142,9 @@ class Package extends AbstractModel protected static function booted() { - if (auth()->user()->type === RoleTypes::USER) { +// if (auth()->user()->type === RoleTypes::USER) { // static::addGlobalScope(new CustomerPackagesScope()); - } +// } } } diff --git a/app/Models/PackingList.php b/app/Models/PackingList.php index fc775ba2..d2594210 100644 --- a/app/Models/PackingList.php +++ b/app/Models/PackingList.php @@ -4,15 +4,22 @@ namespace App\Models; use App\Classes\General\Interfaces\Steppable; use App\Classes\General\Interfaces\Transportable; +use App\Classes\General\Interfaces\Packable; +use App\Classes\ValueObjects\Constants\ApprovalStatus; +use Carbon\Carbon; use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Illuminate\Database\Eloquent\Relations\MorphMany; use Illuminate\Database\Eloquent\Relations\MorphTo; use Illuminate\Database\Eloquent\SoftDeletes; +use Staudenmeir\EloquentHasManyDeep\HasManyDeep; +use Staudenmeir\EloquentHasManyDeep\HasRelationships; -class PackingList extends AbstractModel implements Transportable, Steppable +class PackingList extends AbstractModel implements Transportable, Steppable, Packable { + use HasRelationships; use SoftDeletes; protected $table = 'packing_lists'; @@ -71,4 +78,49 @@ class PackingList extends AbstractModel implements Transportable, Steppable { return $this->BelongsToMany(PackingList::class, 'packing_list_owner', 'owner_packing_list_id', 'packing_list_id'); } + + /** + * @return MorphMany + */ + public function packingLists(): morphMany + { + return $this->morphMany(PackingList::class, 'owner'); + } + + /** + * @return hasManyDeep + */ + public function shippingTransports(): hasManyDeep + { + return $this->hasManyDeep(Transport::class, [ContainerPackingList::class, Container::class], ['packing_list_id', 'id', ['owner_type', 'owner_id']], ['id', 'container_id', null]); + } + + /** + * @return hasManyDeep + */ + public function shippingSchedules(): hasManyDeep + { + return $this->hasManyDeep(Schedule::class, [ContainerPackingList::class, Container::class, Transport::class], ['packing_list_id', 'id', ['owner_type', 'owner_id'], ['owner_type', 'owner_id']], ['id', 'container_id', null, null]); + } + + + /** + * @return hasManyDeep + */ + public function deliverySchedules(): hasManyDeep + { + return $this->hasManyDeep(Schedule::class, [Transport::class], [['owner_type', 'owner_id'], ['owner_type', 'owner_id']], [null, null]); + } + + /** + * @param $query + * @return mixed + */ + public function scopeShipping($query){ + return $query->whereHas('shippingSchedules', function($schedule){ + return $schedule->where('etd', '<', Carbon::now())->where('schedules.status', ApprovalStatus::APPROVED); + })->whereDoesntHave('shippingTransports', function($transport){ + return $transport->where('transport_arrangements.status', ApprovalStatus::COMPLETED); + }); + } } diff --git a/database/migrations/2021_10_17_201021_create_announcements_table.php b/database/migrations/2021_10_17_201021_create_announcements_table.php new file mode 100644 index 00000000..35508479 --- /dev/null +++ b/database/migrations/2021_10_17_201021_create_announcements_table.php @@ -0,0 +1,40 @@ +id(); + $table->string('title', 50); + $table->longText('description'); + $table->timestamp('starting_on')->nullable(); + $table->timestamp('ending_on')->nullable(); + $table->boolean('is_all_day')->default(false); + $table->integer('duration')->default(0); + $table->boolean('is_recurring')->default(false); + $table->string('recurrence_pattern')->nullable(); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('announcements'); + } +} diff --git a/database/migrations/2021_10_17_201244_create_announcement_segment_table.php b/database/migrations/2021_10_17_201244_create_announcement_segment_table.php new file mode 100644 index 00000000..c2777abf --- /dev/null +++ b/database/migrations/2021_10_17_201244_create_announcement_segment_table.php @@ -0,0 +1,40 @@ +primary(['announcement_id', 'segment_id']); + $table->bigInteger('announcement_id')->unsigned(); + $table->bigInteger('segment_id')->unsigned(); + $table->timestamps(); + $table->foreign('announcement_id') + ->references('id') + ->on('announcements')->onDelete('cascade'); + $table->foreign('segment_id') + ->references('id') + ->on('segments')->onDelete('cascade'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('announcement_segment'); + } +} diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index 983c7aad..474a16de 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -23,7 +23,7 @@ class DatabaseSeeder extends Seeder $this->call(CountriesTableSeeder::class); $this->call(CurrenciesTableSeeder::class); - // $this->call(CompaniesTableSeeder::class); + $this->call(CompaniesTableSeeder::class); // $this->call(OrdersTableSeeder::class); } } \ No newline at end of file diff --git a/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue b/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue index 98d405e9..0b6edc6b 100644 --- a/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue +++ b/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue @@ -47,9 +47,9 @@
- + - +
@@ -106,7 +106,7 @@ post_code: '', remark: '', phone: '', - pic: '', + person_in_charge: '', } } @@ -118,9 +118,9 @@ this.parameters.street_two = this.data.street_two; this.parameters.district_id = this.data.district.id; this.parameters.post_code = this.data.post_code; - this.parameters.phone = this.data.contact.phone; - this.parameters.pic = this.data.contact.reference; - this.parameters.remark = this.data.remark.content; + this.parameters.phone = this.data.contact ? this.data.contact.phone : ''; + this.parameters.person_in_charge = this.data.contact ? this.data.contact.reference : ''; + this.parameters.remark = this.data.remark ? this.data.remark.content : ''; } }, watch: { diff --git a/resources/assets/vue/components/companies/sections/CustomerProfileSectionComponent.vue b/resources/assets/vue/components/companies/sections/CustomerProfileSectionComponent.vue index 749e7ef8..055097ed 100644 --- a/resources/assets/vue/components/companies/sections/CustomerProfileSectionComponent.vue +++ b/resources/assets/vue/components/companies/sections/CustomerProfileSectionComponent.vue @@ -11,6 +11,30 @@
+
+
+ + +
+
diff --git a/resources/assets/vue/components/general/elements/chineseNewYearMemoComponent.vue b/resources/assets/vue/components/general/elements/chineseNewYearMemoComponent.vue new file mode 100644 index 00000000..81e4a875 --- /dev/null +++ b/resources/assets/vue/components/general/elements/chineseNewYearMemoComponent.vue @@ -0,0 +1,136 @@ + + + + \ No newline at end of file diff --git a/resources/assets/vue/components/orders/elements/PackageComponent.vue b/resources/assets/vue/components/orders/elements/PackageComponent.vue index 16d8f5c0..fb804ad6 100644 --- a/resources/assets/vue/components/orders/elements/PackageComponent.vue +++ b/resources/assets/vue/components/orders/elements/PackageComponent.vue @@ -60,7 +60,7 @@
Warehouse -
{{item.order.warehouse.id === 3 ? 'Guang Zhou' : 'Yiwu'}}
+
{{item.order.warehouse.name}}
Delivery Address diff --git a/resources/assets/vue/components/orders/elements/QuickOrderComponent.vue b/resources/assets/vue/components/orders/elements/QuickOrderComponent.vue index e6b1d167..6fd8c062 100644 --- a/resources/assets/vue/components/orders/elements/QuickOrderComponent.vue +++ b/resources/assets/vue/components/orders/elements/QuickOrderComponent.vue @@ -10,7 +10,7 @@
-

{{item.last_order.warehouse.id === 3 ? 'Guang Zhou': 'Yiwu'}}

+

{{item.last_order.warehouse.name}}

diff --git a/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue b/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue index 1332bfe6..33a69cb6 100644 --- a/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue +++ b/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue @@ -293,7 +293,7 @@
- +
@@ -310,10 +310,10 @@
-
+
-
-
+
+
@@ -343,10 +343,10 @@
-
+
-
-
+
+
@@ -376,10 +376,10 @@
-
+
-
-
+
+
@@ -409,16 +409,16 @@
-
+
-
-
+
+
-
+
diff --git a/resources/assets/vue/components/orders/sections/OrderSearchSectionComponent.vue b/resources/assets/vue/components/orders/sections/OrderSearchSectionComponent.vue new file mode 100644 index 00000000..802f38d0 --- /dev/null +++ b/resources/assets/vue/components/orders/sections/OrderSearchSectionComponent.vue @@ -0,0 +1,47 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/orders/sections/OrderSectionComponent.vue b/resources/assets/vue/components/orders/sections/OrderSectionComponent.vue index f9660969..5000ec6d 100644 --- a/resources/assets/vue/components/orders/sections/OrderSectionComponent.vue +++ b/resources/assets/vue/components/orders/sections/OrderSectionComponent.vue @@ -1,6 +1,15 @@