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 @@
!!!! 海运费涨价通知 NOTICE OF PRICE INCREMENT !!!
+由于近期海运费非常不稳定,运费每个星期都会调整,请发货入仓之前按以下按键确认最新运费价格。
+Due to the recent unstable shipping rates, shipping costs are adjusted weekly, please confirm the latest shipping prices before shipping into the warehouse by following the button below.
+尊敬的顾客,
+Dear Valued Customers,
+为确保您的货物在华人农历新年前收到, 务必提前通知您的供应商安排在以下日期前把货物送到仓库:
+To ensure your goods received before the Chinese New Year Holidays, we advised the customer to inform their suppliers to arrange their goods earlier beforehand to the schedule below:
+| 仓库 WAREHOUSE | +入仓日期 RECEIVED DATE | +|
|---|---|---|
| 广州 GUANGHZOU |
+ 西马 WEST MALAYSIA |
+ 25/12/2021 | +
| 东马 EAST MALAYSIA |
+ 11/12/2021 | +|
| 义乌 YIWU |
+ 西马 WEST MALAYSIA |
+ 18/12/2021 | +
| 东马 EAST MALAYSIA |
+ 04/12/2021 | +|
我们建议客户尽早安排送货到中国仓库,以确保货物在恶劣天气、运输延误、海关检查等情况下准时到达目的地。
+Customers are advised to arrange delivery to China warehouse as soon as possible to ensure goods reach their destination on time due to the events of Bad weather, Shipping delay, Custom inspection and etc.
+| 仓库 WAREHOUSE |
+ 仓库截止收货日期 LAST DAY RECEIVE GOODS |
+ 仓库復工日期 RESUME OPERATION DATE |
+
|---|---|---|
| 义乌 YIWU |
+ 18/01/2022 西马 WEST MALAYSIA |
+ 16/02/2022 | +
| 25/12/2021 东马 EAST MALAYSIA |
+ ||
| 广州 GUANGHZOU |
+ 18/01/2022 西马 WEST MALAYSIA |
+ 12/02/2022 | +
| 08/01/2022 东马 EAST MALAYSIA |
+
{{item.last_order.warehouse.id === 3 ? 'Guang Zhou': 'Yiwu'}}
+{{item.last_order.warehouse.name}}

!!!! 海运费涨价通知 NOTICE OF PRICE INCREMENT !!!
-由于最近船公司正缩减仓位, 导致持续推高海运费。
-所以从 10/11/2021 开始入仓广州仓库的货物会有所调整。
-广州 - 西马运费+RM50/立方
-有造成不便之处,敬请见谅!谢谢合作
-Shortage of container is getting terrible in the whole worldwide due to Shipping liner company consolidating their ship
-Therefore, the shipping fee from Guangzhou to West Malaysia will be adjusted start from good entering warehouse by 10/11/2021
-Guangzhou - West Malaysia +RM50/CBM
-We apologize that any inconvenience caused! Thanks for your cooperation.
-