diff --git a/.gitignore b/.gitignore index 95d268cf..9b34cbea 100644 --- a/.gitignore +++ b/.gitignore @@ -24,4 +24,5 @@ db/* docker-compose.yml package-lock.json public/* -/public/* \ No newline at end of file +/public/* +storage/framework/laravel-excel/* diff --git a/app/Classes/General/Eloquent/AbstractListRecord.php b/app/Classes/General/Eloquent/AbstractListRecord.php index c5d2e6e6..01e66c29 100644 --- a/app/Classes/General/Eloquent/AbstractListRecord.php +++ b/app/Classes/General/Eloquent/AbstractListRecord.php @@ -43,4 +43,4 @@ abstract class AbstractListRecord extends AbstractGetRecord } -} \ No newline at end of file +} diff --git a/app/Classes/General/Eloquent/Filters/WithOwner.php b/app/Classes/General/Eloquent/Filters/WithOwner.php new file mode 100644 index 00000000..7d31691e --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/WithOwner.php @@ -0,0 +1,20 @@ +with('owner'); + } +} \ No newline at end of file diff --git a/app/Classes/General/Eloquent/Filters/WithPackingLists.php b/app/Classes/General/Eloquent/Filters/WithPackingLists.php new file mode 100644 index 00000000..927aa526 --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/WithPackingLists.php @@ -0,0 +1,20 @@ +with('packingLists'); + } +} \ No newline at end of file diff --git a/app/Classes/Jobs/CurlContainerListJob.php b/app/Classes/Jobs/CurlContainerListJob.php index abc93c1a..e65a1a18 100644 --- a/app/Classes/Jobs/CurlContainerListJob.php +++ b/app/Classes/Jobs/CurlContainerListJob.php @@ -45,7 +45,7 @@ class CurlContainerListJob implements ShouldQueue $last_two_month = Carbon::now()->subMonth(2)->format('Y-m-d'); $client = new \GuzzleHttp\Client(['headers' => $headers]); - $res = $client->post('https://portalvt.azurewebsites.net/Services/DataControllerService.asmx/GetPage', [\GuzzleHttp\RequestOptions::JSON => json_decode('{"controller":"VCustomercontainer","view":"grid1","request":{"PageIndex":' . $this->page . ',"PageSize":10,"PageOffset":0,"SortExpression":"CreatedOn DESC","GroupExpression":"","Filter":["LoadedTime:<=%js%\"' . $last_two_month . 'T00:00:00.000\"\u0000"],"ContextKey":"view1","FilterIsExternal":false,"LookupContextFieldName":null,"LookupContextController":null,"LookupContextView":null,"LookupContext":null,"Inserting":false,"LastCommandName":null,"ExternalFilter":[],"DoesNotRequireData":false,"LastView":"grid1","Tag":null,"RequiresFirstLetters":false,"ViewType":"Grid","SupportsCaching":true,"SystemFilter":null,"RequiresRowCount":true,"QuickFindHint":null,"RequiresPivot":false,"PivotDefinitions":null,"RequiresMetaData":true}}')]); + $res = $client->post('http://portal.vtnation.com.my/Services/DataControllerService.asmx/GetPage', [\GuzzleHttp\RequestOptions::JSON => json_decode('{"controller":"VCustomercontainer","view":"grid1","request":{"PageIndex":' . $this->page . ',"PageSize":10,"PageOffset":0,"SortExpression":"CreatedOn DESC","GroupExpression":"","Filter":["LoadedTime:<=%js%\"' . $last_two_month . 'T00:00:00.000\"\u0000"],"ContextKey":"view1","FilterIsExternal":false,"LookupContextFieldName":null,"LookupContextController":null,"LookupContextView":null,"LookupContext":null,"Inserting":false,"LastCommandName":null,"ExternalFilter":[],"DoesNotRequireData":false,"LastView":"grid1","Tag":null,"RequiresFirstLetters":false,"ViewType":"Grid","SupportsCaching":true,"SystemFilter":null,"RequiresRowCount":true,"QuickFindHint":null,"RequiresPivot":false,"PivotDefinitions":null,"RequiresMetaData":true}}')]); $data = json_decode($res->getBody()->getContents()); @@ -63,7 +63,7 @@ class CurlContainerListJob implements ShouldQueue { // get latest cookies $client = new \GuzzleHttp\Client(['cookies' => true]); - $r = $client->request('GET', 'https://portalvt.azurewebsites.net'); + $r = $client->request('GET', 'http://portal.vtnation.com.my'); $call_cookie = $client->getConfig('cookies'); $call_cookie = $call_cookie->toArray(); $latest_cookie = []; @@ -79,7 +79,7 @@ class CurlContainerListJob implements ShouldQueue 'Cookie' => $latest_cookie, ]; $client = new \GuzzleHttp\Client(['headers' => $headers]); - $res = $client->post('https://portalvt.azurewebsites.net/Services/DataControllerService.asmx/Login', [\GuzzleHttp\RequestOptions::JSON => [ + $res = $client->post('http://portal.vtnation.com.my/Services/DataControllerService.asmx/Login', [\GuzzleHttp\RequestOptions::JSON => [ "username" => "CIEF", "password" => "0122120880", "createPersistentCookie" => true, diff --git a/app/Classes/Modules/Accounts/ControllersLogic/CreateInvitedCustomerLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/CreateInvitedCustomerLogic.php new file mode 100644 index 00000000..ebd4587e --- /dev/null +++ b/app/Classes/Modules/Accounts/ControllersLogic/CreateInvitedCustomerLogic.php @@ -0,0 +1,105 @@ + 'Created User', + 'message' => 'You have successfully created a new User' + ]; + } + + /** @var CreateUserProcessor */ + private $createUserProcessor; + + /** @var CreateContactProcessor */ + private $createContactProcessor; + + /** @var FetchesCompany */ + private $fetchesCompany; + + /** @var AssignEmployeeProcessor */ + private $assignEmployeeProcessor; + + /** @var AuthenticationProcessor */ + private $authenticationProcessor; + + + /** + * CreateInvitedCustomerLogic constructor. + * @param CreateUserProcessor $createUserProcessor + * @param CreateContactProcessor $createContactProcessor + * @param FetchesCompany $fetchesCompany + * @param AssignEmployeeProcessor $assignEmployeeProcessor + * @param AuthenticationProcessor $authenticationProcessor + */ + public function __construct(CreateUserProcessor $createUserProcessor, CreateContactProcessor $createContactProcessor, FetchesCompany $fetchesCompany, AssignEmployeeProcessor $assignEmployeeProcessor, AuthenticationProcessor $authenticationProcessor) + { + $this->createUserProcessor = $createUserProcessor; + $this->createContactProcessor = $createContactProcessor; + $this->fetchesCompany = $fetchesCompany; + $this->assignEmployeeProcessor = $assignEmployeeProcessor; + $this->authenticationProcessor = $authenticationProcessor; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\AccessUnauthorisedException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request): JsonResponse + { + /** @var Company $company */ + $company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]); + + /** @var CompanyModule $companyModule */ + $companyModule = $company->companyModules()->first(); + + if($companyModule->employees()->exists()){ + throw new AccessForbiddenException('This company\'s account has been claimed by another user already!'); + } + + /** @var User $user */ + $user = $this->createUserProcessor->execute($request, RoleTypes::USER, !App::environment(['production']) ? ApprovalStatus::APPROVED : ApprovalStatus::PENDING_VERIFICATION); + + $contactObject = new ContactObject($request->input('name'), $request->input('phone'), $request->input('contact_email'), $request->input('wechat_id')); + + $this->createContactProcessor->execute($contactObject, $company); + + $Object = new EmploymentObject($companyModule, $user); + + $this->assignEmployeeProcessor->execute($Object); + + return $this->response($this->authenticationProcessor->execute($request)); + } +} diff --git a/app/Classes/Modules/Accounts/ControllersLogic/LogoutUserLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/LogoutUserLogic.php index bfa1f20a..aea1f932 100644 --- a/app/Classes/Modules/Accounts/ControllersLogic/LogoutUserLogic.php +++ b/app/Classes/Modules/Accounts/ControllersLogic/LogoutUserLogic.php @@ -37,7 +37,6 @@ class LogoutUserLogic extends AbstractControllerLogic */ protected function logic(Request $request): JsonResponse { - logger("logout"); $this->invalidatesAuthenticationToken->execute(); return $this->response(); diff --git a/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php b/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php index 76c66b52..b4453c3a 100644 --- a/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php +++ b/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php @@ -3,6 +3,7 @@ namespace App\Classes\Modules\Addresses\DataTransferObjects; use App\Classes\General\Interfaces\DataTransferObject; +use App\Classes\ValueObjects\Constants\ApprovalStatus; class AddressObject implements DataTransferObject { @@ -38,7 +39,7 @@ class AddressObject implements DataTransferObject * @param int $postCode * @param null|string $reference */ - public function __construct(string $streetOne, ?string $streetTwo, int $countryId, int $stateId, int $districtId, int $postCode, ?string $reference = null) + public function __construct(string $streetOne, ?string $streetTwo, int $countryId, int $stateId, int $districtId, int $postCode, ?string $reference = null, ?int $status = ApprovalStatus::APPROVED) { $this->streetOne = $streetOne; $this->streetTwo = $streetTwo; @@ -47,6 +48,7 @@ class AddressObject implements DataTransferObject $this->districtId = $districtId; $this->postCode = $postCode; $this->reference = $reference; + $this->status = $status; } /** @@ -105,5 +107,13 @@ class AddressObject implements DataTransferObject return $this->reference; } + /** + * @return int + */ + public function getStatus(): int + { + return $this->status; + } + } \ No newline at end of file diff --git a/app/Classes/Modules/Addresses/Processors/CreateAddressFromOldAddressProcessor.php b/app/Classes/Modules/Addresses/Processors/CreateAddressFromOldAddressProcessor.php index 7cd04d1f..3e209927 100644 --- a/app/Classes/Modules/Addresses/Processors/CreateAddressFromOldAddressProcessor.php +++ b/app/Classes/Modules/Addresses/Processors/CreateAddressFromOldAddressProcessor.php @@ -7,6 +7,7 @@ use App\Classes\Modules\Addresses\Services\CleansOldAddress; use App\Classes\Modules\Addresses\Services\CreatesAddress; use App\Classes\Modules\Addresses\Services\FetchesAddress; use App\Models\OldAddress; +use App\Models\Order; use Illuminate\Database\Eloquent\Model; class CreateAddressFromOldAddressProcessor @@ -44,8 +45,8 @@ class CreateAddressFromOldAddressProcessor } - if($address = $addressable->addresses()->where('street_one', $object->getStreetOne())->first()){ - return $address; + if(!$addressable instanceof Order && $address = $addressable->addresses()->where('street_one', $object->getStreetOne())->first()) { + return $address; } return $this->createsAddress->execute($addressable, $object); diff --git a/app/Classes/Modules/Addresses/Services/CreatesAddress.php b/app/Classes/Modules/Addresses/Services/CreatesAddress.php index b6662a98..b9f2716c 100644 --- a/app/Classes/Modules/Addresses/Services/CreatesAddress.php +++ b/app/Classes/Modules/Addresses/Services/CreatesAddress.php @@ -28,6 +28,7 @@ class CreatesAddress extends AbstractUpdateRelationshipRecord $model->state_id = $object->getStateId(); $model->district_id = $object->getDistrictId(); $model->postcode = $object->getPostCode(); + $model->status = $object->getStatus(); return $this->handler($addressable->addresses(), $model); diff --git a/app/Classes/Modules/Orders/ControllersLogic/ApproveChangeOrderAddressLogic.php b/app/Classes/Modules/Orders/ControllersLogic/ApproveChangeOrderAddressLogic.php new file mode 100644 index 00000000..0b469fd1 --- /dev/null +++ b/app/Classes/Modules/Orders/ControllersLogic/ApproveChangeOrderAddressLogic.php @@ -0,0 +1,44 @@ + 'Change Order Address Approval', + 'message' => 'You have successfully change the order address' + ]; + } + + /** @var ApproveChangeOrderAddressProcessor */ + private $approveChangeOrderAddressProcessor; + + /** + * ApproveChangeOrderAddressLogic constructor. + * @param ApproveChangeOrderAddressProcessor $approveChangeOrderAddressProcessor + */ + + public function __construct(ApproveChangeOrderAddressProcessor $approveChangeOrderAddressProcessor) + { + $this->approveChangeOrderAddressProcessor = $approveChangeOrderAddressProcessor; + } + + public function logic(Request $request): JsonResponse + { + $address = $this->approveChangeOrderAddressProcessor->execute($request); + + return $this->resourceResponse(new AddressResource($address)); + } +} diff --git a/app/Classes/Modules/Orders/ControllersLogic/RequestChangeOrderAddressLogic.php b/app/Classes/Modules/Orders/ControllersLogic/RequestChangeOrderAddressLogic.php new file mode 100644 index 00000000..b0c24f0b --- /dev/null +++ b/app/Classes/Modules/Orders/ControllersLogic/RequestChangeOrderAddressLogic.php @@ -0,0 +1,49 @@ + 'Request To Change Order Address', + 'message' => 'You have successfully request to change order address' + ]; + } + + /** @var RequestChangeOrderAddressProcessor */ + private $requestChangeOrderAddressProcessor; + + /** + * RequestChangeOrderAddressLogic constructor. + * @param RequestChangeOrderAddressProcessor $requestChangeOrderAddressProcessor + */ + + public function __construct(RequestChangeOrderAddressProcessor $requestChangeOrderAddressProcessor) + { + $this->requestChangeOrderAddressProcessor = $requestChangeOrderAddressProcessor; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + + public function logic(Request $request): JsonResponse + { + $order = $this->requestChangeOrderAddressProcessor->execute($request); + + return $this->resourceResponse(new OrderResource($order)); + } +} diff --git a/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php b/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php new file mode 100644 index 00000000..fbd84f90 --- /dev/null +++ b/app/Classes/Modules/Orders/Processors/ApproveChangeOrderAddressProcessor.php @@ -0,0 +1,61 @@ +canApproveChangeOrderAddress = $canApproveChangeOrderAddress; + $this->fetchesAddress = $fetchesAddress; + $this->updatesOrdersAddress = $updatesOrdersAddress; + } + + + /** + * @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) + { + + $status = (int) $request->route('status'); + + $this->canApproveChangeOrderAddress->passes(); + + $address = $this->fetchesAddress->execute(['id' => $request->route('id')]); + + if($status === ApprovalStatus::APPROVED){ + $address->owner->addresses()->update(['status' => ApprovalStatus::EXPIRED]); + } + + $this->updatesOrdersAddress->execute($address, $status); + + return $address; + } +} diff --git a/app/Classes/Modules/Orders/Processors/CreateOrderRolesProcessor.php b/app/Classes/Modules/Orders/Processors/CreateOrderRolesProcessor.php index 0d4b1860..24495752 100644 --- a/app/Classes/Modules/Orders/Processors/CreateOrderRolesProcessor.php +++ b/app/Classes/Modules/Orders/Processors/CreateOrderRolesProcessor.php @@ -79,6 +79,7 @@ class CreateOrderRolesProcessor $roleObject = new OrderRoleObject($order, $destinationWarehouse, OrderRoleTypes::DESTINATION_WAREHOUSE); $this->createsOrderRole->execute($roleObject); + $roleObject = new OrderRoleObject($order, $freightForwarder, OrderRoleTypes::LAST_MILE_DELIVERY_DRIVER); $this->createsOrderRole->execute($roleObject); diff --git a/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php b/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php new file mode 100644 index 00000000..7f01726b --- /dev/null +++ b/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php @@ -0,0 +1,66 @@ +canChangeOrderAddress = $canChangeOrderAddress; + $this->fetchesOrder = $fetchesOrder; + $this->createsAddress = $createsAddress; + $this->fetchesAddress = $fetchesAddress; + $this->deletesAddress = $deletesAddress; + } + + + public function execute(Request $request) + { + + $this->canChangeOrderAddress->passes(); + + $order = $this->fetchesOrder->execute(['id' => $request->get('order_id')]); + foreach ($order->addressesPendingVerification as $address) { + $this->deletesAddress->execute($address); + } + + $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); + + return $order; + } +} diff --git a/app/Classes/Modules/Orders/Services/FetchesDataFromVTPortal.php b/app/Classes/Modules/Orders/Services/FetchesDataFromVTPortal.php index 6d77abce..0a6ed2b9 100644 --- a/app/Classes/Modules/Orders/Services/FetchesDataFromVTPortal.php +++ b/app/Classes/Modules/Orders/Services/FetchesDataFromVTPortal.php @@ -68,7 +68,7 @@ class FetchesDataFromVTPortal $latest_cookie = []; $cookieRequest = new \GuzzleHttp\Client(['cookies' => true]); - $cookieRequest->get('https://portalvt.azurewebsites.net'); + $cookieRequest->get('http://portal.vtnation.com.my'); foreach ($cookieRequest->getConfig('cookies')->toArray() as $key => $row) { $latest_cookie[] = $row['Name'] . '=' . $row['Value']; } @@ -77,7 +77,7 @@ class FetchesDataFromVTPortal /** @var $loginRequest */ - $loginRequest = $this->clientRequest('https://portalvt.azurewebsites.net/Services/DataControllerService.asmx/Login', 'POST', [ + $loginRequest = $this->clientRequest('http://portal.vtnation.com.my/Services/DataControllerService.asmx/Login', 'POST', [ "username" => "CIEF", "password" => "0122120880", "createPersistentCookie" => true, diff --git a/app/Classes/Modules/Orders/Services/UpdatesOrdersAddress.php b/app/Classes/Modules/Orders/Services/UpdatesOrdersAddress.php new file mode 100644 index 00000000..352ce64d --- /dev/null +++ b/app/Classes/Modules/Orders/Services/UpdatesOrdersAddress.php @@ -0,0 +1,21 @@ +status = $type; + return $this->handler($address); + } +} diff --git a/app/Classes/Modules/Orders/Standards/Rules/CanApproveChangeOrderAddress.php b/app/Classes/Modules/Orders/Standards/Rules/CanApproveChangeOrderAddress.php new file mode 100644 index 00000000..24ce6418 --- /dev/null +++ b/app/Classes/Modules/Orders/Standards/Rules/CanApproveChangeOrderAddress.php @@ -0,0 +1,39 @@ + 'Assign Packing List Container', + 'message' => 'You have successfully assign Packing List to Container' + ]; + } + + /** @var FetchesContainer */ + private $fetchesContainer; + + /** @var FetchesPackingList */ + private $fetchesPackingList; + + /** + * DeleteContainerControllersLogic constructor. + * @param FetchesContainer $fetchesContainer + * @param FetchesPackingList $fetchesPackingList + */ + public function __construct(FetchesContainer $fetchesContainer, FetchesPackingList $fetchesPackingList) + { + $this->fetchesContainer = $fetchesContainer; + $this->fetchesPackingList = $fetchesPackingList; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + try { + $container = $this->fetchesContainer->execute(['id' => $request->route('id')]); + $packing_list = $request->input('packing_list_id'); + + foreach ($packing_list as $key => $row) { + $packing_list_item = $this->fetchesPackingList->execute(['id' => $row]); + $container->packingLists()->attach($packing_list_item); + } + + return $this->resourceResponse(new ContainerResource($container)); + + } catch (\Exception $exception){ + throw new ErrorException($exception->getMessage(), $exception->getCode()); + } + + } + +} diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Containers/CreateContainerLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Containers/CreateContainerLogic.php index cff8cbb6..40376b12 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Containers/CreateContainerLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Containers/CreateContainerLogic.php @@ -4,10 +4,12 @@ namespace App\Classes\Modules\PackingLists\ControllersLogic\Containers; use App\Classes\General\Abstracts\AbstractControllerLogic; +use App\Classes\Modules\Companies\Services\FetchesCompanyModule; use App\Classes\Modules\PackingLists\Services\Containers\CreatesContainer; use App\Classes\Modules\PackingLists\Standards\Rules\Containers\CanCreateContainer; use App\Classes\Modules\PackingLists\DataTransferObjects\ContainerObject; use App\Classes\Modules\PackingLists\Services\FetchesPackingList; + use App\Http\Resources\ContainerResource; use ErrorException; use Illuminate\Http\JsonResponse; @@ -32,13 +34,17 @@ class CreateContainerLogic extends AbstractControllerLogic /** @var FetchesPackingList */ private $fetchesPackingList; + /** @var FetchesCompanyModule */ + private $fetchesCompanyModule; + /** @var CreatesPackingList */ private $createsContainer; - public function __construct(CanCreateContainer $canCreateContainer, FetchesPackingList $fetchesPackingList, CreatesContainer $createsContainer) + public function __construct(CanCreateContainer $canCreateContainer, FetchesPackingList $fetchesPackingList, FetchesCompanyModule $fetchesCompanyModule, CreatesContainer $createsContainer) { $this->canCreateContainer = $canCreateContainer; $this->fetchesPackingList = $fetchesPackingList; + $this->fetchesCompanyModule = $fetchesCompanyModule; $this->createsContainer = $createsContainer; } @@ -51,15 +57,21 @@ class CreateContainerLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { + $object = new ContainerObject( + $request->input('container_reference'), + $request->input('container_number'), + $request->input('seal_reference'), + $request->input('container_type'), + $request->input('status') + ); - $object = new ContainerObject($request->input('container_reference'), $request->input('container_type'), $request->input('seal_reference')); + $company = $this->fetchesCompanyModule->execute(['id' => 2]); $this->canCreateContainer->passes($object); - $query = $this->createsContainer->execute($object); + $query = $this->createsContainer->execute($object, $this->fetchesCompanyModule->execute(['id' => $request->input('company_module_id')])); return $this->resourceResponse(new ContainerResource($query)); - } } diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Containers/FetchContainerLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Containers/FetchContainerLogic.php index 8969126c..c8c8548d 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Containers/FetchContainerLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Containers/FetchContainerLogic.php @@ -53,7 +53,7 @@ class FetchContainerLogic extends AbstractControllerLogic $this->canFetchContainer->passes(); - $query = $this->fetchesContainer->execute(['id' => $request->route('id')]); + $query = $this->fetchesContainer->execute(['id' => $request->route('id'), 'with_packing_lists' => true]); return $this->resourceResponse(new ContainerResource($query)); diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Containers/InboundCustomClearedLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Containers/InboundCustomClearedLogic.php new file mode 100644 index 00000000..1df92ffa --- /dev/null +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Containers/InboundCustomClearedLogic.php @@ -0,0 +1,66 @@ + 'Retrieved Containers', + 'message' => 'You have successfully retrieved a list of Containers' + ]; + } + + /** @var CanListContainers */ + private $canListContainers; + + /** @var ListsContainers */ + private $listsContainers; + + private $fetchInboundCustomCleared; + + /** + * ListContainersLogic constructor. + * @param CanListContainers $canListContainers + * @param ListsContainers $listsContainers + */ + public function __construct(CanListContainers $canListContainers, ListsContainers $listsContainers, FetchInboundCustomClearedProcessor $fetchInboundCustomCleared) + { + $this->canListContainers = $canListContainers; + $this->listsContainers = $listsContainers; + $this->fetchInboundCustomCleared = $fetchInboundCustomCleared; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + //$this->canListOrders->passes(); + + //$query = $this->listsOrders->execute(array_merge($this->listsOrders->deserializeFilters($request->input('filters')), ['with_parcels' => true])); + + $d = $this->fetchInboundCustomCleared->execute(); + + return response()->json($d); + + } +} diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Containers/UpdateContainerLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Containers/UpdateContainerLogic.php index 3d1516f0..72537db2 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Containers/UpdateContainerLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Containers/UpdateContainerLogic.php @@ -58,8 +58,14 @@ class UpdateContainerLogic extends AbstractControllerLogic { $container = $this->fetchesContainer->execute(['id' => $request->route('id')]); - - $object = new ContainerObject( $container->packing_list_id , $request->input('container_reference'), $request->input('container_type'), $request->input('seal_reference')); + + $object = new ContainerObject( + $request->input('container_reference'), + $container->container_number, + $request->input('container_type'), + $request->input('seal_reference'), + $container->status, + ); $this->canUpdateContainer->passes($object); diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/CreatePackingListLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/CreatePackingListLogic.php index a06a6842..afd8f3d7 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/CreatePackingListLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/CreatePackingListLogic.php @@ -5,6 +5,7 @@ namespace App\Classes\Modules\PackingLists\ControllersLogic; use App\Classes\Modules\Companies\Services\FetchesCompany; use App\Classes\Modules\PackingLists\DataTransferObjects\PackageObject; use App\Classes\Modules\PackingLists\Processors\CreatePackingListProcessor; +use App\Classes\Modules\Orders\Services\FetchesOrder; use App\Classes\Modules\PackingLists\Services\Packages\FetchesPackage; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\General\Abstracts\AbstractControllerLogic; @@ -13,6 +14,9 @@ use App\Classes\Modules\PackingLists\Services\CreatesPackingListPackage; use App\Classes\Modules\PackingLists\Standards\Rules\CanCreatePackingList; use App\Classes\Modules\PackingLists\Standards\Rules\CanCreatePackingListPackage; use App\Classes\Modules\PackingLists\DataTransferObjects\PackingListObject; +use App\Classes\ValueObjects\Constants\OrderRoleTypes; +use App\Classes\ValueObjects\Constants\PackingListType; + use App\Http\Resources\PackingListResource; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -34,13 +38,18 @@ class CreatePackingListLogic extends AbstractControllerLogic /** @var CreatePackingListProcessor */ private $createPackingListProcessor; + /** @var FetchesOrder */ + private $fetchesOrder; + /** * CreatePackingListLogic constructor. * @param CreatePackingListProcessor $createPackingListProcessor + * @param FetchesOrder $fetchesOrder */ - public function __construct(CreatePackingListProcessor $createPackingListProcessor) + public function __construct(CreatePackingListProcessor $createPackingListProcessor, FetchesOrder $fetchesOrder) { $this->createPackingListProcessor = $createPackingListProcessor; + $this->fetchesOrder = $fetchesOrder; } /** @@ -50,11 +59,13 @@ class CreatePackingListLogic extends AbstractControllerLogic public function logic(Request $request) : JsonResponse { - $object = new PackingListObject($request->input('reference_number'), ApprovalStatus::PENDING_SUBMISSION); + $order = $this->fetchesOrder->execute(['reference' => $request->input('reference_number')]); - $query = $this->createPackingListProcessor->execute($object); + $packingListObject = new PackingListObject($request->input('reference_number'), $order->orderRoles()->where('role_id', '=', OrderRoleTypes::ORIGIN_WAREHOUSE)->first()->appointee->id, PackingListType::WAREHOUSE_RECEIVE_LIST, ApprovalStatus::PENDING_SUBMISSION); - return $this->resourceResponse(new PackingListResource($query)); + $packingList = $this->createPackingListProcessor->execute($packingListObject, $order); + + return $this->resourceResponse(new PackingListResource($packingList)); } diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/CreatePackageLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/CreatePackageLogic.php index c9eebc15..80a5ee5d 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/CreatePackageLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/CreatePackageLogic.php @@ -12,6 +12,7 @@ use App\Classes\Modules\Companies\Services\FetchesCompany; use App\Http\Resources\PackageResource; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use App\Classes\ValueObjects\Constants\PackageType; class CreatePackageLogic extends AbstractControllerLogic { @@ -61,23 +62,23 @@ class CreatePackageLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - + $order = $this->fetchesOrder->execute(['id' => $request->input('order_id')]); $object = new PackageObject( - null, $request->input('type'), $request->input('description'), $request->input('width'), $request->input('height'), $request->input('length'), $request->input('weight'), + 0, $request->input('quantity'), ApprovalStatus::PENDING_VERIFICATION); $this->canCreatePackage->passes($object); - $query = $this->createsPackage->execute($object); + $query = $this->createsPackage->execute($object, $order->packingLists()->first()); return $this->resourceResponse(new PackageResource($query)); diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/FetchPackageLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/FetchPackageLogic.php index d2e8be81..0dcb6b07 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/FetchPackageLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/FetchPackageLogic.php @@ -4,8 +4,8 @@ namespace App\Classes\Modules\PackingLists\ControllersLogic\Packages; use App\Classes\General\Abstracts\AbstractControllerLogic; -use App\Classes\Modules\Packages\Services\FetchesPackage; -use App\Classes\Modules\Packages\Standards\Rules\CanFetchPackage; +use App\Classes\Modules\PackingLists\Services\Packages\FetchesPackage; +use App\Classes\Modules\PackingLists\Standards\Rules\Packages\CanFetchPackage; use App\Http\Resources\PackageResource; use ErrorException; use Illuminate\Http\JsonResponse; diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/ListPackagesLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/ListPackagesLogic.php index 48aee051..80d73e5b 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/ListPackagesLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/ListPackagesLogic.php @@ -4,8 +4,8 @@ namespace App\Classes\Modules\PackingLists\ControllersLogic\Packages; use App\Classes\General\Abstracts\AbstractControllerLogic; -use App\Classes\Modules\Packages\Services\ListsPackages; -use App\Classes\Modules\Packages\Standards\Rules\CanListPackages; +use App\Classes\Modules\PackingLists\Services\Packages\ListsPackages; +use App\Classes\Modules\PackingLists\Standards\Rules\Packages\CanListPackages; use App\Http\Resources\PackageResource; use ErrorException; use Illuminate\Http\JsonResponse; diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/SwitchPackagePackingListLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/SwitchPackagePackingListLogic.php new file mode 100644 index 00000000..cdbc7917 --- /dev/null +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/SwitchPackagePackingListLogic.php @@ -0,0 +1,68 @@ + 'Switched Package Packing List', + 'message' => 'You have successfully switched the Package Packing List' + ]; + } + + /** @var SwitchesPackagePackingList */ + private $switchesPackagePackingList; + + /** @var FetchesPackage */ + private $fetchesPackage; + + /** @var FetchesPackingList */ + private $fetchesPackingList; + + /** + * UpdatePackageLogic constructor. + * @param SwitchesPackagePackingList $switchesPackagePackingList + * @param FetchesPackage $fetchesPackage + * @param FetchesPackingList $fetchesPackingList + */ + public function __construct(SwitchesPackagePackingList $switchesPackagePackingList, FetchesPackage $fetchesPackage, FetchesPackingList $fetchesPackingList) + { + $this->switchesPackagePackingList = $switchesPackagePackingList; + $this->fetchesPackage = $fetchesPackage; + $this->fetchesPackingList = $fetchesPackingList; + } + + + /** + * @param Request $request + * @return JsonResponse + * @throws ErrorException + */ + public function logic(Request $request) : JsonResponse + { + $package = $this->fetchesPackage->execute(['id' => $request->route('id')]); + + $packing_list = $this->fetchesPackingList->execute(['id' => $request->input('packing_list_id')]); + + $query = $this->switchesPackagePackingList->execute($package, $packing_list); + + return $this->resourceResponse(new PackageResource($query)); + } + +} diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/UpdatePackageLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/UpdatePackageLogic.php index b96e6933..6b25e3a5 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/Packages/UpdatePackageLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Packages/UpdatePackageLogic.php @@ -4,10 +4,10 @@ namespace App\Classes\Modules\PackingLists\ControllersLogic\Packages; use App\Classes\General\Abstracts\AbstractControllerLogic; -use App\Classes\Modules\Packages\Services\UpdatesPackage; -use App\Classes\Modules\Packages\Services\FetchesPackage; -use App\Classes\Modules\Packages\Standards\Rules\CanUpdatePackage; -use App\Classes\Modules\Packages\DataTransferObjects\PackageObject; +use App\Classes\Modules\PackingLists\Services\Packages\UpdatesPackage; +use App\Classes\Modules\PackingLists\Services\Packages\FetchesPackage; +use App\Classes\Modules\PackingLists\Standards\Rules\Packages\CanUpdatePackage; +use App\Classes\Modules\PackingLists\DataTransferObjects\PackageObject; use App\Http\Resources\PackageResource; use ErrorException; use Illuminate\Http\JsonResponse; @@ -60,8 +60,6 @@ class UpdatePackageLogic extends AbstractControllerLogic $package = $this->fetchesPackage->execute(['id' => $request->route('id')]); $object = new PackageObject( - $package->order_id, - null, $request->input('type'), $request->input('description'), $request->input('width'), @@ -69,7 +67,9 @@ class UpdatePackageLogic extends AbstractControllerLogic $request->input('length'), $request->input('weight'), $request->input('quantity'), - $request->input('status')); + $request->input('status'), + $package->reference + ); $this->canUpdatePackage->passes($object); diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/UpdatePackingListLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/UpdatePackingListLogic.php index 926b9873..7f5232dc 100644 --- a/app/Classes/Modules/PackingLists/ControllersLogic/UpdatePackingListLogic.php +++ b/app/Classes/Modules/PackingLists/ControllersLogic/UpdatePackingListLogic.php @@ -57,7 +57,7 @@ class UpdatePackingListLogic extends AbstractControllerLogic { $packingList = $this->fetchesPackingList->execute(['id' => $request->route('id')]); - $object = new PackingListObject($packingList->reference, $request->input('status')); + $object = new PackingListObject($packingList->reference, $packingList->claimant_id, $packingList->type, $request->input('status')); $this->canUpdatePackingList->passes($object); diff --git a/app/Classes/Modules/PackingLists/ControllersLogic/UpdatePackingListStatusLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/UpdatePackingListStatusLogic.php new file mode 100644 index 00000000..67a1733c --- /dev/null +++ b/app/Classes/Modules/PackingLists/ControllersLogic/UpdatePackingListStatusLogic.php @@ -0,0 +1,62 @@ + 'Updated PackingList Status', + 'message' => 'You have successfully updated the PackingList status' + ]; + } + + + /** @var FetchesPackingList */ + private $fetchesPackingList; + + /** @var UpdatesPackingListStatus */ + private $updatesPackingListStatus; + + /** + * UpdatePackingListStatusLogic constructor. + * @param FetchesPackingList $fetchesPackingList + * @param UpdatesPackingListStatus $updatesPackingListStatus + */ + public function __construct(FetchesPackingList $fetchesPackingList, UpdatesPackingListStatus $updatesPackingListStatus) + { + $this->fetchesPackingList = $fetchesPackingList; + $this->updatesPackingListStatus = $updatesPackingListStatus; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\MalformedRequestException + */ + public function logic(Request $request) : JsonResponse + { + $packingList = $this->fetchesPackingList->execute(['id' => $request->route('id')]); + + $query = $this->updatesPackingListStatus->execute($packingList, $request->route('status')); + + return $this->resourceResponse(new PackingListResource($query)); + } + +} diff --git a/app/Classes/Modules/PackingLists/DataTransferObjects/ContainerObject.php b/app/Classes/Modules/PackingLists/DataTransferObjects/ContainerObject.php index 92b0effa..3924102c 100644 --- a/app/Classes/Modules/PackingLists/DataTransferObjects/ContainerObject.php +++ b/app/Classes/Modules/PackingLists/DataTransferObjects/ContainerObject.php @@ -14,7 +14,7 @@ class ContainerObject implements DataTransferObject private $containerNumber; /** @var string */ - private $sealNumber; + private $sealReference; /** @var int */ private $containerType; @@ -26,15 +26,15 @@ class ContainerObject implements DataTransferObject * ContainerObject constructor. * @param string $reference * @param string $containerNumber - * @param string $sealNumber + * @param string $sealReference * @param int $containerType * @param int $status */ - public function __construct(string $reference, string $containerNumber, string $sealNumber, int $containerType, int $status) + public function __construct(string $reference, string $containerNumber, string $sealReference, int $containerType, int $status) { $this->reference = $reference; $this->containerNumber = $containerNumber; - $this->sealNumber = $sealNumber; + $this->sealReference = $sealReference; $this->containerType = $containerType; $this->status = $status; } @@ -58,9 +58,9 @@ class ContainerObject implements DataTransferObject /** * @return string */ - public function getSealNumber(): string + public function getSealReference(): string { - return $this->sealNumber; + return $this->sealReference; } /** diff --git a/app/Classes/Modules/PackingLists/Processors/FetchContainersStatusUpdateFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchContainersStatusUpdateFromVTPortalProcessor.php index a50bbfdf..955d68d0 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchContainersStatusUpdateFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchContainersStatusUpdateFromVTPortalProcessor.php @@ -65,7 +65,6 @@ class FetchContainersStatusUpdateFromVTPortalProcessor /** * @return array - * @throws \App\Classes\Exceptions\MalformedRequestException */ public function execute(){ @@ -77,7 +76,7 @@ class FetchContainersStatusUpdateFromVTPortalProcessor try { $filter = '["RefNo:=%js%\"'.$container->reference.'\"\u0000"]'; - $containerDetailsRequest = $this->fetchesDataFRomVTPortal->clientRequest('https://portalvt.azurewebsites.net/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"VCustomercontainer","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"ModifiedOn DESC","Filter":'.$filter.'}}'), ''); + $containerDetailsRequest = $this->fetchesDataFRomVTPortal->clientRequest('http://portal.vtnation.com.my/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"VCustomercontainer","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"CreatedOn asc","Filter":'.$filter.'}}'), ''); $containerDetails = $this->fetchesDataFRomVTPortal->getResponseBody($containerDetailsRequest); @@ -89,6 +88,8 @@ class FetchContainersStatusUpdateFromVTPortalProcessor $eta = Carbon::parse($eta); + $etd = Carbon::parse($eta)->subDays(5); + $delayDate = $containerDetails[6]; $containerStatus = $containerDetails[9]; @@ -98,31 +99,37 @@ class FetchContainersStatusUpdateFromVTPortalProcessor $transport = $container->transports()->first(); if(!$transport){ - $transportObject = new TransportObject(TransportType::SEA, null, null, $eta, null, ApprovalStatus::APPROVED); + $transportObject = new TransportObject(TransportType::SEA, null, null, $etd, null, ApprovalStatus::APPROVED); /** @var Transport $transport */ $transport = $this->createsTransport->execute($transportObject, $container); - $this->createsSchedule->execute($transport, new ScheduleObject($eta->subDays(5), $eta, ApprovalStatus::APPROVED)); + $this->createsSchedule->execute($transport, new ScheduleObject($etd, $eta, ApprovalStatus::APPROVED)); } if($delayDate){ + $delayDate = Carbon::parse($delayDate); $transport = $container->transports()->first(); - $schedule = $transport->schedules()->where('eta', '=', $delayDate)->first(); - $etd = $delayDate->subDays(5); - if(!$schedule){ - $etd = $schedule->etd; + + if(!$transport->schedules()->where('eta', '=', $delayDate)->first()) { + $etd = $transport->schedules()->where('status', '=', ApprovalStatus::APPROVED)->first()->etd; $transport->schedules()->update(['status' => ApprovalStatus::EXPIRED]); + $this->createsSchedule->execute($transport, new ScheduleObject($etd, $delayDate, ApprovalStatus::APPROVED)); } - $this->createsSchedule->execute($transport, new ScheduleObject($etd, $delayDate, ApprovalStatus::APPROVED)); } if($containerStatus === 'Unstuffing'){ $container->update(['status' => ApprovalStatus::COMPLETED]); $container->transports()->first()->update(['drop_date' => Carbon::parse($unstuffingDate)->subDay(), 'status' => ApprovalStatus::COMPLETED]); - $container->packingLists()->update(['status' => ApprovalStatus::APPROVED]); + /** @var PackingList $packingList */ foreach($container->packingLists as $packingList){ + + if($packingList->status === ApprovalStatus::PENDING_VERIFICATION){ + $packingList->status = ApprovalStatus::APPROVED; + $packingList->save(); + } + $signature = $packingList->owner->orderRoles()->where('role_id', '=', OrderRoleTypes::SUPERVISOR)->first()->appointee->entity_sigiture; foreach($packingList->steps()->where('reference', '!=', 'DELIVERY')->get() as $step){ $this->updatesContractObligations->execute($signature, $step->obligation_hash_id); diff --git a/app/Classes/Modules/PackingLists/Processors/FetchDeliveryListFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchDeliveryListFromVTPortalProcessor.php index 6714472b..3a9ebdea 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchDeliveryListFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchDeliveryListFromVTPortalProcessor.php @@ -3,8 +3,6 @@ namespace App\Classes\Modules\PackingLists\Processors; use App\Classes\Modules\Orders\Services\FetchesDataFromVTPortal; -use App\Classes\Modules\PackingLists\DataTransferObjects\PackageObject; -use App\Classes\Modules\PackingLists\Services\ListsPackingLists; use App\Classes\Modules\Schedules\DataTransferObjects\ScheduleObject; use App\Classes\Modules\Schedules\Services\CreatesSchedule; use App\Classes\Modules\Transports\DataTransferObjects\TransportObject; @@ -12,7 +10,6 @@ use App\Classes\Modules\Transports\Services\CreatesTransport; use App\Classes\Modules\Unity\Services\UpdatesContractObligation; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\OrderRoleTypes; -use App\Classes\ValueObjects\Constants\PackageType; use App\Classes\ValueObjects\Constants\PackingListType; use App\Classes\ValueObjects\Constants\TransportType; use App\Models\PackingList; @@ -58,36 +55,37 @@ class FetchDeliveryListFromVTPortalProcessor public function execute(){ try { - $packingLists = PackingList::where('type', '=', PackingListType::SHIPPING_PACKING_LIST)->where('status', '=', ApprovalStatus::APPROVED)->get(); + $packingLists = PackingList::where('type', '=', PackingListType::SHIPPING_PACKING_LIST)->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::SUSPENDED])->get(); /** @var PackingList $packingList */ foreach($packingLists as $packingList){ try { $filter = '["PoNumber:=%js%\"'.$packingList->reference.'\"\u0000"]'; - $shippingPackingListsRequest = $this->fetchesDataFRomVTPortal->clientRequest('https://portalvt.azurewebsites.net/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"VPodetailparcel","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"ModifiedOn DESC","Filter":'.$filter.'}}'), ''); + $shippingPackingListsRequest = $this->fetchesDataFRomVTPortal->clientRequest('http://portal.vtnation.com.my/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"VPodetailparcel","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"CreatedOn asc","Filter":'.$filter.'}}'), ''); $shippingPackingLists = $this->fetchesDataFRomVTPortal->getResponseBody($shippingPackingListsRequest); - foreach($shippingPackingLists->Rows as $shippingPackingList){ - if(!$shippingPackingList[9] && !$shippingPackingList[10]) { - continue; - } - - $deliveryDate = Carbon::parse($shippingPackingList[9] ? $shippingPackingList[9]:$shippingPackingList[10]); - $transportObject = new TransportObject(TransportType::LAND, null, null, $deliveryDate, $deliveryDate, ApprovalStatus::APPROVED); - /** @var Transport $transport */ - $transport = $this->createsTransport->execute($transportObject, $packingList); - $this->createsSchedule->execute($transport, new ScheduleObject($deliveryDate, $deliveryDate, ApprovalStatus::APPROVED)); - - $deliveryStep = $packingList->steps()->where('reference', '=', 'LAST_MILE_DELIVERY')->first(); - $signature = $packingList->owner->orderRoles()->where('role_id', '=', OrderRoleTypes::SUPERVISOR)->first()->appointee->entity_sigiture; - $this->updatesContractObligations->execute($signature, $deliveryStep->obligation_hash_id); - $deliveryStep->update(['status' => ApprovalStatus::COMPLETED]); - + $shippingPackingList = $shippingPackingLists->Rows[0]; + if(!$shippingPackingList[9] && !$shippingPackingList[10]) { + continue; } + $packingList->status = ApprovalStatus::COMPLETED; + $packingList->save(); + + $deliveryDate = Carbon::parse($shippingPackingList[9] ? $shippingPackingList[9]:$shippingPackingList[10]); + $transportObject = new TransportObject(TransportType::LAND, null, null, $deliveryDate, $deliveryDate, ApprovalStatus::APPROVED); + /** @var Transport $transport */ + $transport = $this->createsTransport->execute($transportObject, $packingList); + $this->createsSchedule->execute($transport, new ScheduleObject($deliveryDate, $deliveryDate, ApprovalStatus::APPROVED)); + + $deliveryStep = $packingList->steps()->where('reference', '=', 'LAST_MILE_DELIVERY')->first(); + $signature = $packingList->owner->orderRoles()->where('role_id', '=', OrderRoleTypes::SUPERVISOR)->first()->appointee->entity_sigiture; + $this->updatesContractObligations->execute($signature, $deliveryStep->obligation_hash_id); + $deliveryStep->update(['status' => ApprovalStatus::COMPLETED]); + } catch (GuzzleException $exception) { continue; } diff --git a/app/Classes/Modules/PackingLists/Processors/FetchInboundCustomClearedProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchInboundCustomClearedProcessor.php new file mode 100644 index 00000000..b4ea6395 --- /dev/null +++ b/app/Classes/Modules/PackingLists/Processors/FetchInboundCustomClearedProcessor.php @@ -0,0 +1,105 @@ +fetchesDataFRomVTPortal = $fetchesDataFRomVTPortal; + $this->createsTransport = $createsTransport; + $this->createsSchedule = $createsSchedule; + $this->updatesContractObligations = $updatesContractObligations; + } + + + /** + * @return array + */ + public function execute(){ + + $packingLists = PackingList::query()->with(['steps' => function ($query) { + $query->where('steps.status', '<>', 3); + }])->first(); + dd($packingLists); + /* + $packingLists = PackingList::where('type', '=', PackingListType::SHIPPING_PACKING_LIST) + ->whereIn('status', [ApprovalStatus::APPROVED, ApprovalStatus::SUSPENDED])->get(); + + foreach($packingLists as $packingList){ + try { + $filter = '["PoNumber:=%js%\"'.$packingList->reference.'\"\u0000"]'; + + $shippingPackingListsRequest = $this->fetchesDataFRomVTPortal->clientRequest('https://portalvt.azurewebsites.net/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"VPodetailparcel","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"CreatedOn asc","Filter":'.$filter.'}}'), ''); + + $shippingPackingLists = $this->fetchesDataFRomVTPortal->getResponseBody($shippingPackingListsRequest); + + $shippingPackingList = $shippingPackingLists->Rows[0]; + + if(!$shippingPackingList[9] && !$shippingPackingList[10]) { + continue; + } + + $packingList->status = ApprovalStatus::COMPLETED; + $packingList->save(); + + $deliveryDate = Carbon::parse($shippingPackingList[9] ? $shippingPackingList[9]:$shippingPackingList[10]); + $transportObject = new TransportObject(TransportType::LAND, null, null, $deliveryDate, $deliveryDate, ApprovalStatus::APPROVED); + $transport = $this->createsTransport->execute($transportObject, $packingList); + $this->createsSchedule->execute($transport, new ScheduleObject($deliveryDate, $deliveryDate, ApprovalStatus::APPROVED)); + + $deliveryStep = $packingList->steps()->where('reference', '=', 'LAST_MILE_DELIVERY')->first(); + $signature = $packingList->owner->orderRoles()->where('role_id', '=', OrderRoleTypes::SUPERVISOR)->first()->appointee->entity_sigiture; + $this->updatesContractObligations->execute($signature, $deliveryStep->obligation_hash_id); + $deliveryStep->update(['status' => ApprovalStatus::COMPLETED]); + + } catch (GuzzleException $exception) { + continue; + } + + }*/ + + + return []; + + } + + +} diff --git a/app/Classes/Modules/PackingLists/Processors/FetchLoadedContainersFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchLoadedContainersFromVTPortalProcessor.php index 2776124d..23dc50ad 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchLoadedContainersFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchLoadedContainersFromVTPortalProcessor.php @@ -137,14 +137,14 @@ class FetchLoadedContainersFromVTPortalProcessor $end = $end ? $end : Carbon::now(); $filter = '["LoadedTime:$between$%js%\"'.$start->format('Y-m-d').'T00:00:00.000\"$and$%js%\"'.$end->format('Y-m-d').'T00:00:00.000\"\u0000"]'; - $containersRequest = $this->fetchesDataFRomVTPortal->clientRequest('https://portalvt.azurewebsites.net/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"VCustomercontainer","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"ModifiedOn DESC","Filter":'.$filter.'}}'), ''); + $containersRequest = $this->fetchesDataFRomVTPortal->clientRequest('http://portal.vtnation.com.my/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"VCustomercontainer","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"LoadedTime asc","Filter":'.$filter.'}}'), ''); $containers = $this->fetchesDataFRomVTPortal->getResponseBody($containersRequest); foreach ($containers->Rows as $container){ $filter = '["ContainerID:=%js%'.$container[11].'"]'; - $containerDetailRequest = $this->fetchesDataFRomVTPortal->clientRequest('https://portalvt.azurewebsites.net/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"VPodetailparcel","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"ModifiedOn DESC","Filter":'.$filter.'}}'), ''); + $containerDetailRequest = $this->fetchesDataFRomVTPortal->clientRequest('http://portal.vtnation.com.my/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"VPodetailparcel","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"CreatedOn asc","Filter":'.$filter.'}}'), ''); $containerDetail = $this->fetchesDataFRomVTPortal->getResponseBody($containerDetailRequest); @@ -199,7 +199,10 @@ class FetchLoadedContainersFromVTPortalProcessor $this->unityAssignContractEntity->execute($supervisorContractEntity->hash_id, $contractObligations); - $packingListObject = new PackingListObject($packingListReference, $order->orderRoles()->where('role_id', '=', OrderRoleTypes::ORIGIN_FREIGHT_FORWARDER)->first()->appointee->id, PackingListType::SHIPPING_PACKING_LIST, ApprovalStatus::PENDING_VERIFICATION, $contractReference); + $connection = $order->companyModule->connections()->first(); + $marking = $connection->invitee_reference; + + $packingListObject = new PackingListObject($packingListReference, $order->orderRoles()->where('role_id', '=', OrderRoleTypes::ORIGIN_FREIGHT_FORWARDER)->first()->appointee->id, PackingListType::SHIPPING_PACKING_LIST, (int) filter_var($marking, FILTER_SANITIZE_NUMBER_INT) <= 1000 ? ApprovalStatus::PENDING_VERIFICATION : ApprovalStatus::SUSPENDED, $contractReference); /** @var PackingList $packingList */ $packingList = $this->createPackingListProcessor->execute($packingListObject, $order); diff --git a/app/Classes/Modules/PackingLists/Processors/FetchPackingListFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchPackingListFromVTPortalProcessor.php index 715c61ba..00c3e112 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchPackingListFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchPackingListFromVTPortalProcessor.php @@ -46,7 +46,9 @@ class FetchPackingListFromVTPortalProcessor */ public function execute(){ - $packingLists = PackingList::where('type', '=', PackingListType::SHIPPING_PACKING_LIST)->where('status', '=', ApprovalStatus::PENDING_VERIFICATION)->get(); + $packingLists = PackingList::where('type', '=', PackingListType::SHIPPING_PACKING_LIST)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::SUSPENDED])->whereDoesntHave('containers', function($query){ + $query->where('status', '=', ApprovalStatus::COMPLETED); + })->get(); foreach($packingLists as $packingList){ @@ -55,7 +57,7 @@ class FetchPackingListFromVTPortalProcessor $filter = '["PoNumber:=%js%\"'.$packingList->reference.'\"\u0000"]'; - $shippingPackingListsRequest = $this->fetchesDataFRomVTPortal->clientRequest('https://portalvt.azurewebsites.net/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"VPodetailparcel","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"ModifiedOn DESC","Filter":'.$filter.'}}'), ''); + $shippingPackingListsRequest = $this->fetchesDataFRomVTPortal->clientRequest('http://portal.vtnation.com.my/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"VPodetailparcel","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"CreatedOn asc","Filter":'.$filter.'}}'), ''); $shippingPackingLists = $this->fetchesDataFRomVTPortal->getResponseBody($shippingPackingListsRequest); diff --git a/app/Classes/Modules/PackingLists/Processors/FetchPackingListProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchPackingListProcessor.php new file mode 100644 index 00000000..508e2293 --- /dev/null +++ b/app/Classes/Modules/PackingLists/Processors/FetchPackingListProcessor.php @@ -0,0 +1,64 @@ +listsPackingLists = $listsPackingLists; + } + + /** + * @return array + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function execute($params){ + + $packingLists = PackingList::where('type', '=', PackingListType::SHIPPING_PACKING_LIST) + ->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::SUSPENDED]) + ->whereDoesntHave('containers', function($query){ + $query->where('status', '=', ApprovalStatus::COMPLETED); + })->orderBy('created_at','desc')->where('owner_id',$params['orderId'])->get(); + + //dd($packingLists); + $packingListsArray=[]; + foreach($packingLists as $packingList){ + + $address = $packingList->owner->addresses()->first(); + $packingList->fulladdress = $address->street_one.', '.$address->street_two.', '.$address->district->name.', '.$address->post_code.' '.$address->state->name.', '.$address->country->name; + + $container = $packingList->containers()->first(); + $packingList->container_reference = $container->reference; + $packingList->container_number = $container->container_number; + + $packingListsArray[]=$packingList; + + } + + return $packingListsArray; + + } + + +} diff --git a/app/Classes/Modules/PackingLists/Processors/FetchWarehouseReceiveListFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchWarehouseReceiveListFromVTPortalProcessor.php index 862fdb60..d1eb8516 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchWarehouseReceiveListFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchWarehouseReceiveListFromVTPortalProcessor.php @@ -125,13 +125,15 @@ class FetchWarehouseReceiveListFromVTPortalProcessor } $end = $end ? $end : Carbon::now(); + $filter = '["ParcelDate:$between$%js%\"'.$start->format('Y-m-d').'T00:00:00.000\"$and$%js%\"'.$end->format('Y-m-d').'T00:00:00.000\"\u0000"]'; - $warehouseListRequest = $this->fetchesDataFRomVTPortal->clientRequest('https://portalvt.azurewebsites.net/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"WarehouseList","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"ModifiedOn DESC","Filter":'.$filter.'}}'), ''); + $warehouseListRequest = $this->fetchesDataFRomVTPortal->clientRequest('http://portal.vtnation.com.my/Services/DataControllerService.asmx/GetPage', 'POST', json_decode('{"controller":"WarehouseList","view":"grid1","request":{"PageIndex":-1,"PageSize":10000,"SortExpression":"ParcelDate asc","Filter":'.$filter.'}}'), ''); $response = $this->fetchesDataFRomVTPortal->getResponseBody($warehouseListRequest); foreach ($response->Rows as $parcel){ + $marking = explode('/', explode('CIEF/', $parcel[5])[1]); if(!array_key_exists(1, $marking)){ @@ -144,6 +146,7 @@ class FetchWarehouseReceiveListFromVTPortalProcessor continue; } + try { $order = $this->fetchesOrder->execute(['reference' => $orderNumber]); } catch (ResourceNotFoundException $exception) { @@ -154,13 +157,16 @@ class FetchWarehouseReceiveListFromVTPortalProcessor continue; } - $customerMarking = str_replace(' ', '', str_replace('/', '', str_replace('CIEF/', '', $oldOrder->company->marking))); + + $customerMarking = str_replace('/', '', str_replace(' ', '', explode('CIEF/', $oldOrder->company->marking)[1])); $companyModule = CompanyModule::whereHas('inviters', function($query) use ($customerMarking) { return $query->where('invitee_reference', '=', $customerMarking); })->first(); - if(!$companyModule) { + + if(!$companyModule){ + log::error('unknown customer: '.$customerMarking); continue; } @@ -180,6 +186,10 @@ class FetchWarehouseReceiveListFromVTPortalProcessor $originWarehouse = $this->fetchesCompanyModule->execute(['id' => $warehouseId === 11 ? 3 : 4]); $order = $this->createOrderProcessor->execute($companyModule->company, $originWarehouse, $address, $orderNumber); + + $order->created_at = Carbon::parse($parcel[1]); + $order->save(); + } $packingListReference = $parcel[17]; @@ -217,13 +227,13 @@ class FetchWarehouseReceiveListFromVTPortalProcessor } - return []; + } catch (\Exception $exception){ Log::error($exception->getMessage()); } DB::commit(); - + return []; } diff --git a/app/Classes/Modules/PackingLists/Services/Containers/CreatesContainer.php b/app/Classes/Modules/PackingLists/Services/Containers/CreatesContainer.php index d8d733b2..eb8ff4e0 100644 --- a/app/Classes/Modules/PackingLists/Services/Containers/CreatesContainer.php +++ b/app/Classes/Modules/PackingLists/Services/Containers/CreatesContainer.php @@ -22,7 +22,7 @@ class CreatesContainer extends AbstractUpdateRelationshipRecord $model->reference = $object->getReference(); $model->container_number = $object->getContainerNumber(); $model->container_type = $object->getContainerType(); - $model->seal_reference = $object->getSealNumber(); + $model->seal_reference = $object->getSealReference(); $model->status = $object->getStatus(); return $this->handler($owner->containers(), $model); diff --git a/app/Classes/Modules/PackingLists/Services/Containers/UpdatesContainer.php b/app/Classes/Modules/PackingLists/Services/Containers/UpdatesContainer.php index c3f6f1a4..d10102e1 100644 --- a/app/Classes/Modules/PackingLists/Services/Containers/UpdatesContainer.php +++ b/app/Classes/Modules/PackingLists/Services/Containers/UpdatesContainer.php @@ -17,7 +17,7 @@ class UpdatesContainer extends AbstractUpdateRecord */ public function execute(Container $model, ContainerObject $object) { - $model->container_reference = $object->getContainerReference(); + $model->reference = $object->getReference(); $model->container_type = $object->getContainerType(); $model->seal_reference = $object->getSealReference(); diff --git a/app/Classes/Modules/PackingLists/Services/Packages/SwitchesPackagePackingList.php b/app/Classes/Modules/PackingLists/Services/Packages/SwitchesPackagePackingList.php new file mode 100644 index 00000000..9abedc0b --- /dev/null +++ b/app/Classes/Modules/PackingLists/Services/Packages/SwitchesPackagePackingList.php @@ -0,0 +1,25 @@ +packing_list_id = $packing_list->id; + + return $this->handler($model); + + } +} diff --git a/app/Classes/Modules/PackingLists/Services/Packages/UpdatesPackage.php b/app/Classes/Modules/PackingLists/Services/Packages/UpdatesPackage.php index 9cb265fd..b1903eb5 100644 --- a/app/Classes/Modules/PackingLists/Services/Packages/UpdatesPackage.php +++ b/app/Classes/Modules/PackingLists/Services/Packages/UpdatesPackage.php @@ -10,7 +10,6 @@ class UpdatesPackage extends AbstractUpdateRecord { public function execute(Package $model, PackageObject $object) { - $model->claimant_id = $object->getClaimantId(); $model->type = $object->getType(); $model->description = $object->getDescription(); $model->width = $object->getWidth(); diff --git a/app/Classes/Modules/PackingLists/Services/UpdatesPackingListStatus.php b/app/Classes/Modules/PackingLists/Services/UpdatesPackingListStatus.php new file mode 100644 index 00000000..e25b550f --- /dev/null +++ b/app/Classes/Modules/PackingLists/Services/UpdatesPackingListStatus.php @@ -0,0 +1,24 @@ +status = $status; + + return $this->handler($model); + + } +} diff --git a/app/Classes/Modules/Reports/ControllersLogic/CustomcClearanceLogic.php b/app/Classes/Modules/Reports/ControllersLogic/CustomcClearanceLogic.php new file mode 100644 index 00000000..c7fa2c0d --- /dev/null +++ b/app/Classes/Modules/Reports/ControllersLogic/CustomcClearanceLogic.php @@ -0,0 +1,39 @@ +listsPackingListProcessor = $listsPackingListProcessor; + } + + protected function notification():array { + return []; + } + + public function logic(Request $request) : JsonResponse + { + $params = $request->all(); + $packingLists = $this->listsPackingListProcessor->execute($params); + $excelExportLogic = new ExportExcelLogic(collect($packingLists)); + $this->excelExportLogic = $excelExportLogic; + + return response()->json(['success' => true]); + } + + public function getExcelCollection(){ + return $this->excelExportLogic; + } +} diff --git a/app/Classes/Modules/Reports/ControllersLogic/ExportExcelLogic.php b/app/Classes/Modules/Reports/ControllersLogic/ExportExcelLogic.php new file mode 100644 index 00000000..c1d332a5 --- /dev/null +++ b/app/Classes/Modules/Reports/ControllersLogic/ExportExcelLogic.php @@ -0,0 +1,50 @@ +data=$data; + } + public function collection() + { + return $this->data; + } + public function map($order): array + { + return [ + (string)$order->reference, + (string)$order->container_number, + (string)$order->fulladdress, + (string)$order->created_at, + "ssxxx" + ]; + } + + public function columnFormats(): array + { + return [ + 'A'=>'@', + 'B' => NumberFormat::FORMAT_DATE_DDMMYYYY, + + ]; + } + + public function headings(): array + { + return ["Reference", "Container", "Address", "Created", "Status"]; + } + +} diff --git a/app/Classes/Modules/Schedules/ControllersLogic/CreateScheduleLogic.php b/app/Classes/Modules/Schedules/ControllersLogic/CreateScheduleLogic.php index 5bf9c7e9..aecff745 100644 --- a/app/Classes/Modules/Schedules/ControllersLogic/CreateScheduleLogic.php +++ b/app/Classes/Modules/Schedules/ControllersLogic/CreateScheduleLogic.php @@ -56,7 +56,7 @@ class CreateScheduleLogic extends AbstractControllerLogic */ public function logic(Request $request) : JsonResponse { - $object = new ScheduleObject($request->input('etd'), $request->input('eta'), $request->input('transport_id'), ApprovalStatus::PENDING_SUBMISSION); + $object = new ScheduleObject($request->input('etd'), $request->input('eta'), ApprovalStatus::PENDING_SUBMISSION); $this->canCreateSchedule->passes($object); diff --git a/app/Classes/Modules/Schedules/Standards/Validators/ScheduleValidation.php b/app/Classes/Modules/Schedules/Standards/Validators/ScheduleValidation.php index 7d14a3f1..485dc833 100644 --- a/app/Classes/Modules/Schedules/Standards/Validators/ScheduleValidation.php +++ b/app/Classes/Modules/Schedules/Standards/Validators/ScheduleValidation.php @@ -16,7 +16,6 @@ class ScheduleValidation extends AbstractValidation */ protected function data($object): array { return [ - 'transport_id' => $object->getTransportId(), 'etd' => $object->getETD(), 'eta' => $object->getETA(), 'status' => $object->getStatus(), @@ -28,7 +27,6 @@ class ScheduleValidation extends AbstractValidation */ protected function rules(): array { return [ - 'transport_id' => 'required', 'etd' => 'required', 'eta' => 'required', ]; diff --git a/app/Classes/Modules/Transports/ControllersLogic/CreateTransportLogic.php b/app/Classes/Modules/Transports/ControllersLogic/CreateTransportLogic.php index af438830..edd5690f 100644 --- a/app/Classes/Modules/Transports/ControllersLogic/CreateTransportLogic.php +++ b/app/Classes/Modules/Transports/ControllersLogic/CreateTransportLogic.php @@ -7,7 +7,7 @@ use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Transports\Services\CreatesTransport; use App\Classes\Modules\Transports\Standards\Rules\CanCreateTransport; use App\Classes\Modules\Transports\DataTransferObjects\TransportObject; -use App\Classes\Modules\PackingLists\Services\Containers\FetchesContainer; +use App\Classes\Modules\PackingLists\Services\FetchesPackingList; use App\Http\Resources\TransportResource; use ErrorException; use Illuminate\Http\JsonResponse; @@ -29,8 +29,8 @@ class CreateTransportLogic extends AbstractControllerLogic /** @var CanCreateTransport */ private $canCreateTransport; - /** @var FetchesContainer */ - private $fetchesContainer; + /** @var FetchesPackingList */ + private $fetchesPackingList; /** @var CreatesTransport */ private $createsTransport; @@ -38,13 +38,13 @@ class CreateTransportLogic extends AbstractControllerLogic /** * CreateTransportLogic constructor. * @param CanCreateTransport $canCreateTransport - * @param FetchesContainer $fetchesContainer + * @param FetchesPackingList $fetchesPackingList * @param CreatesTransport $createsTransport */ - public function __construct(CanCreateTransport $canCreateTransport, FetchesContainer $fetchesContainer, CreatesTransport $createsTransport) + public function __construct(CanCreateTransport $canCreateTransport, FetchesPackingList $fetchesPackingList, CreatesTransport $createsTransport) { $this->canCreateTransport = $canCreateTransport; - $this->fetchesContainer = $fetchesContainer; + $this->fetchesPackingList = $fetchesPackingList; $this->createsTransport = $createsTransport; } @@ -58,11 +58,18 @@ class CreateTransportLogic extends AbstractControllerLogic public function logic(Request $request) : JsonResponse { - $object = new TransportObject($request->input('type'), $request->input('courier'), $request->input('tracking_number'), null, null, ApprovalStatus::PENDING_SUBMISSION); + $object = new TransportObject( + $request->input('type'), + $request->input('courier'), + $request->input('tracking_number'), + null, + null, + pprovalStatus::PENDING_SUBMISSION + ); $this->canCreateTransport->passes($object); - $query = $this->createsTransport->execute($this->fetchesContainer->execute(['id' => $request->input('container_id')]), $object); + $query = $this->createsTransport->execute($object, $this->fetchesPackingList->execute(['id' => $request->input('packing_list_id')])); return $this->resourceResponse(new TransportResource($query)); diff --git a/app/Classes/Modules/Transports/ControllersLogic/UpdateTransportLogic.php b/app/Classes/Modules/Transports/ControllersLogic/UpdateTransportLogic.php index cab03419..6f6cfd4c 100644 --- a/app/Classes/Modules/Transports/ControllersLogic/UpdateTransportLogic.php +++ b/app/Classes/Modules/Transports/ControllersLogic/UpdateTransportLogic.php @@ -58,7 +58,14 @@ class UpdateTransportLogic extends AbstractControllerLogic { $query = $this->fetchesTransport->execute(['id' => $request->route('id')]); - $object = new TransportObject($request->input('type'), $request->input('courier'), $request->input('tracking_number'), $request->input('dispatch_date'), $request->input('drop_date'), $request->input('status')); + $object = new TransportObject( + $request->input('type'), + $request->input('courier'), + $request->input('tracking_number'), + $request->input('dispatch_date'), + $request->input('drop_date'), + $request->input('status') + ); $this->canUpdateTransport->passes($object); diff --git a/app/Console/Commands/CurlVTCommand.php b/app/Console/Commands/CurlVTCommand.php new file mode 100644 index 00000000..e779cd5c --- /dev/null +++ b/app/Console/Commands/CurlVTCommand.php @@ -0,0 +1,57 @@ +dispatch(); + } +} diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index bec96f83..2e082565 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -17,9 +17,7 @@ class Kernel extends ConsoleKernel * * @var array */ - protected $commands = [ - // - ]; + protected $commands = []; /** * Define the application's command schedule. @@ -29,11 +27,15 @@ class Kernel extends ConsoleKernel */ protected function schedule(Schedule $schedule) { - $schedule->job(FetchWarehouseReceiveListFromVTPortalJob::class)->dailyAt('21:00'); - $schedule->job(FetchLoadedContainersFromVTPortalJob::class)->dailyAt('21:15'); - $schedule->job(FetchPackingListFromVTPortalJob::class)->dailyAt('21:30'); - $schedule->job(FetchContainersStatusUpdateFromVTPortalJob::class)->dailyAt('21:45'); - $schedule->job(FetchDeliveryListFromVTPortalJob::class)->dailyAt('22:00'); + $schedule->command('command:curlVTCommand') + ->dailyAt('15:00') + ->withoutOverlapping() + ->appendOutputTo (storage_path().'/logs/curlvt.log'); + + $schedule->command('command:curlVTCommand') + ->dailyAt('21:00') + ->withoutOverlapping() + ->appendOutputTo (storage_path().'/logs/curlvt.log'); } /** diff --git a/app/Http/Controllers/Accounts/CreateInvitedCustomerController.php b/app/Http/Controllers/Accounts/CreateInvitedCustomerController.php new file mode 100644 index 00000000..dce70e1e --- /dev/null +++ b/app/Http/Controllers/Accounts/CreateInvitedCustomerController.php @@ -0,0 +1,20 @@ +execute($request); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Orders/ApproveChangeOrderAddressController.php b/app/Http/Controllers/Orders/ApproveChangeOrderAddressController.php new file mode 100644 index 00000000..9443ad7b --- /dev/null +++ b/app/Http/Controllers/Orders/ApproveChangeOrderAddressController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/Orders/RequestChangeOrderAddressController.php b/app/Http/Controllers/Orders/RequestChangeOrderAddressController.php new file mode 100644 index 00000000..3fb8881f --- /dev/null +++ b/app/Http/Controllers/Orders/RequestChangeOrderAddressController.php @@ -0,0 +1,20 @@ +execute($request); + } +} diff --git a/app/Http/Controllers/PackingLists/Containers/AssignPackingListContainerController.php b/app/Http/Controllers/PackingLists/Containers/AssignPackingListContainerController.php new file mode 100644 index 00000000..7cda1111 --- /dev/null +++ b/app/Http/Controllers/PackingLists/Containers/AssignPackingListContainerController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/PackingLists/Containers/CreateContainerPackingListController.php b/app/Http/Controllers/PackingLists/Containers/CreateContainerController.php similarity index 100% rename from app/Http/Controllers/PackingLists/Containers/CreateContainerPackingListController.php rename to app/Http/Controllers/PackingLists/Containers/CreateContainerController.php diff --git a/app/Http/Controllers/PackingLists/Containers/DeleteContainerPackingListController.php b/app/Http/Controllers/PackingLists/Containers/DeleteContainerController.php similarity index 100% rename from app/Http/Controllers/PackingLists/Containers/DeleteContainerPackingListController.php rename to app/Http/Controllers/PackingLists/Containers/DeleteContainerController.php diff --git a/app/Http/Controllers/PackingLists/Containers/FetchContainerPackingListController.php b/app/Http/Controllers/PackingLists/Containers/FetchContainerController.php similarity index 100% rename from app/Http/Controllers/PackingLists/Containers/FetchContainerPackingListController.php rename to app/Http/Controllers/PackingLists/Containers/FetchContainerController.php diff --git a/app/Http/Controllers/PackingLists/Containers/InboundCustomClearedController.php b/app/Http/Controllers/PackingLists/Containers/InboundCustomClearedController.php new file mode 100644 index 00000000..303ea5dc --- /dev/null +++ b/app/Http/Controllers/PackingLists/Containers/InboundCustomClearedController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/PackingLists/Containers/ListContainerPackingListsController.php b/app/Http/Controllers/PackingLists/Containers/ListContainersController.php similarity index 91% rename from app/Http/Controllers/PackingLists/Containers/ListContainerPackingListsController.php rename to app/Http/Controllers/PackingLists/Containers/ListContainersController.php index 61084f53..8cff9f2e 100644 --- a/app/Http/Controllers/PackingLists/Containers/ListContainerPackingListsController.php +++ b/app/Http/Controllers/PackingLists/Containers/ListContainersController.php @@ -10,7 +10,7 @@ class ListContainersController { /** * @param Request $request - * @param ListContainerLogic $logic + * @param ListContainersLogic $logic * @return JsonResponse */ public function list(Request $request, ListContainersLogic $logic): JsonResponse { diff --git a/app/Http/Controllers/PackingLists/Containers/UpdateContainerPackingListController.php b/app/Http/Controllers/PackingLists/Containers/UpdateContainerController.php similarity index 100% rename from app/Http/Controllers/PackingLists/Containers/UpdateContainerPackingListController.php rename to app/Http/Controllers/PackingLists/Containers/UpdateContainerController.php diff --git a/app/Http/Controllers/PackingLists/Packages/CreatePackageController.php b/app/Http/Controllers/PackingLists/Packages/CreatePackageController.php index a3f1ddbb..a540ca51 100644 --- a/app/Http/Controllers/PackingLists/Packages/CreatePackageController.php +++ b/app/Http/Controllers/PackingLists/Packages/CreatePackageController.php @@ -2,7 +2,7 @@ namespace App\Http\Controllers\PackingLists\Packages; -use App\Classes\Modules\ControllersLogic\Packages\CreatePackageLogic; +use App\Classes\Modules\PackingLists\ControllersLogic\Packages\CreatePackageLogic; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; diff --git a/app/Http/Controllers/PackingLists/Packages/DeletePackageController.php b/app/Http/Controllers/PackingLists/Packages/DeletePackageController.php index 455e550d..4e9235c9 100644 --- a/app/Http/Controllers/PackingLists/Packages/DeletePackageController.php +++ b/app/Http/Controllers/PackingLists/Packages/DeletePackageController.php @@ -2,7 +2,7 @@ namespace App\Http\Controllers\PackingLists\Packages; -use App\Classes\Modules\ControllersLogic\Packages\DeletePackageLogic; +use App\Classes\Modules\PackingLists\ControllersLogic\Packages\DeletePackageLogic; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; diff --git a/app/Http/Controllers/PackingLists/Packages/FetchPackageController.php b/app/Http/Controllers/PackingLists/Packages/FetchPackageController.php index 6ad30c56..0bb60451 100644 --- a/app/Http/Controllers/PackingLists/Packages/FetchPackageController.php +++ b/app/Http/Controllers/PackingLists/Packages/FetchPackageController.php @@ -2,7 +2,7 @@ namespace App\Http\Controllers\PackingLists\Packages; -use App\Classes\Modules\ControllersLogic\Packages\FetchPackageLogic; +use App\Classes\Modules\PackingLists\ControllersLogic\Packages\FetchPackageLogic; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; diff --git a/app/Http/Controllers/PackingLists/Packages/ListPackagesController.php b/app/Http/Controllers/PackingLists/Packages/ListPackagesController.php index fe834b6b..75bed1d5 100644 --- a/app/Http/Controllers/PackingLists/Packages/ListPackagesController.php +++ b/app/Http/Controllers/PackingLists/Packages/ListPackagesController.php @@ -2,7 +2,7 @@ namespace App\Http\Controllers\PackingLists\Packages; -use App\Classes\Modules\ControllersLogic\Packages\ListPackagesLogic; +use App\Classes\Modules\PackingLists\ControllersLogic\Packages\ListPackagesLogic; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; diff --git a/app/Http/Controllers/PackingLists/Packages/SwitchPackagePackingListController.php b/app/Http/Controllers/PackingLists/Packages/SwitchPackagePackingListController.php new file mode 100644 index 00000000..42c85cff --- /dev/null +++ b/app/Http/Controllers/PackingLists/Packages/SwitchPackagePackingListController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/PackingLists/Packages/UpdatePackageController.php b/app/Http/Controllers/PackingLists/Packages/UpdatePackageController.php index cfc2e248..bc334d11 100644 --- a/app/Http/Controllers/PackingLists/Packages/UpdatePackageController.php +++ b/app/Http/Controllers/PackingLists/Packages/UpdatePackageController.php @@ -2,7 +2,7 @@ namespace App\Http\Controllers\PackingLists\Packages; -use App\Classes\Modules\ControllersLogic\Packages\UpdatePackageLogic; +use App\Classes\Modules\PackingLists\ControllersLogic\Packages\UpdatePackageLogic; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; diff --git a/app/Http/Controllers/PackingLists/UpdatePackingListStatusController.php b/app/Http/Controllers/PackingLists/UpdatePackingListStatusController.php new file mode 100644 index 00000000..5d653449 --- /dev/null +++ b/app/Http/Controllers/PackingLists/UpdatePackingListStatusController.php @@ -0,0 +1,20 @@ +execute($request); + } + +} diff --git a/app/Http/Controllers/Reports/CustomcClearanceReportController.php b/app/Http/Controllers/Reports/CustomcClearanceReportController.php new file mode 100644 index 00000000..061f4a0b --- /dev/null +++ b/app/Http/Controllers/Reports/CustomcClearanceReportController.php @@ -0,0 +1,18 @@ +merge(['orderId' => $orderId]); + $filename = date("Y-m-d H:i:s")." - Custom cleared report "; + $customClearancelogic->logic($request); + return Excel::download( $customClearancelogic->getExcelCollection(), $filename.'.xlsx'); + } +} diff --git a/app/Http/Resources/AddressResource.php b/app/Http/Resources/AddressResource.php index 3b4c465b..6f6a6237 100644 --- a/app/Http/Resources/AddressResource.php +++ b/app/Http/Resources/AddressResource.php @@ -2,6 +2,8 @@ namespace App\Http\Resources; +use App\Classes\ValueObjects\Constants\ApprovalStatus; +use App\Models\Order; use Illuminate\Http\Resources\Json\JsonResource; class AddressResource extends JsonResource @@ -14,6 +16,7 @@ class AddressResource extends JsonResource */ public function toArray($request) { + return [ 'id' => $this->id, 'reference' => $this->reference, @@ -23,7 +26,16 @@ class AddressResource extends JsonResource 'state' => $this->state, 'post_code' => $this->postcode, 'country' => $this->country, - 'default' => (int) $this->default + 'default' => (int) $this->default, + 'status' => (int) $this->status, + $this->mergeWhen($this->relationLoaded('owner'), [ + 'owner' => $this->when($this->owner instanceof Order, [ + 'reference' => $this->owner->reference, + 'company_module' => new CompanyModuleResource($this->owner->companyModule), + 'address' => new AddressResource($this->owner->addresses()->where('status', '=', ApprovalStatus::APPROVED)->first()) + ]) + ]) + ]; } } diff --git a/app/Http/Resources/CompanyResource.php b/app/Http/Resources/CompanyResource.php index f338d095..cae286b9 100644 --- a/app/Http/Resources/CompanyResource.php +++ b/app/Http/Resources/CompanyResource.php @@ -11,6 +11,7 @@ use App\Models\CompanyModule; use App\Models\Currency; use App\Models\SegmentConstant; use Illuminate\Http\Resources\Json\JsonResource; +use Illuminate\Support\Facades\Crypt; class CompanyResource extends JsonResource { @@ -25,6 +26,7 @@ class CompanyResource extends JsonResource $companyModule = $this->companyModules()->where('type', '=', BusinessType::IMPORTER)->first(); return [ 'id' => $this->id, + 'hash_id' => Crypt::encryptString($this->id), 'name' => $this->name, 'reference' => $this->reference, 'type' => (int) $this->type, @@ -35,6 +37,7 @@ class CompanyResource extends JsonResource 'company_module' => new CompanyModuleResource($companyModule), 'last_order' => new OrderResource($companyModule ? $companyModule->orders()->orderBy('id', 'DESC')->first(): null), 'identification' => new DocumentResource($this->documents->whereIn('document_type', DocumentType::IDENTIFICATION_DOCUMENTS)->first()), + 'created_at' => $this->created_at->format('d-m-Y') ]; diff --git a/app/Http/Resources/ContainerResource.php b/app/Http/Resources/ContainerResource.php index 59c60916..bc6337cc 100644 --- a/app/Http/Resources/ContainerResource.php +++ b/app/Http/Resources/ContainerResource.php @@ -2,6 +2,7 @@ namespace App\Http\Resources; +use App\Classes\ValueObjects\Constants\ContainerTypes; use Illuminate\Http\Resources\Json\JsonResource; class ContainerResource extends JsonResource @@ -17,10 +18,14 @@ class ContainerResource extends JsonResource return [ 'id' => $this->id, 'container_reference' => $this->reference, - 'container_type' => $this->container_type, + 'container_specification' => ContainerTypes::CONTAINER_SPECIFICATION[$this->container_type], 'container_number' => $this->container_number, 'seal_reference' => $this->seal_reference, - 'transport' => TransportResource::collection($this->transports), + 'transport' => new TransportResource($this->transports()->first()), + 'packing_lists' => PackingListResource::collection($this->whenLoaded('packingLists', function(){ + return $this->packingLists()->whereHas('packages')->get(); + })), + 'status' => $this->status ]; } } diff --git a/app/Http/Resources/OrderResource.php b/app/Http/Resources/OrderResource.php index 183536e3..e3a66981 100644 --- a/app/Http/Resources/OrderResource.php +++ b/app/Http/Resources/OrderResource.php @@ -19,65 +19,71 @@ class OrderResource extends JsonResource */ public function toArray($request) { - return [ - 'id' => $this->id, - 'reference' => $this->reference, - 'reference_contract' => (int) $this->type, - 'type' => (int) $this->type, - 'status' => (int) $this->status, - 'company_module' => new CompanyModuleResource($this->companyModule), - 'warehouse' => new CompanyModuleResource($this->orderRoles()->where('role_id', '=', OrderRoleTypes::ORIGIN_WAREHOUSE)->first()->appointee), - 'address' => new AddressResource($this->addresses()->first()), - $this->mergeWhen($this->relationLoaded('parcels'), [ - 'origin_warehouse_packages' => PackageResource::collection($this->parcels()->whereHas('packingList', function($query){ - return $query->where('type', PackingListType::SHIPPING_PACKING_LIST)->whereDoesntHave('containers', function($query) { - return $query->whereHas('transports', function($query){ - return $query->whereHas('schedules', function($query){ + try { + return [ + 'id' => $this->id, + 'reference' => $this->reference, + 'reference_contract' => (int) $this->type, + 'type' => (int) $this->type, + 'status' => (int) $this->status, + 'company_module' => new CompanyModuleResource($this->companyModule), + 'warehouse' => new CompanyModuleResource($this->orderRoles()->where('role_id', '=', OrderRoleTypes::ORIGIN_WAREHOUSE)->first()->appointee), + 'address' => new AddressResource($this->addresses()->where('status', '=', ApprovalStatus::APPROVED)->first()), + 'address_change_request' => new AddressResource($this->addressesPendingVerification()->first()), + $this->mergeWhen($this->relationLoaded('parcels'), [ + 'origin_warehouse_packages' => PackageResource::collection($this->parcels()->whereHas('packingList', function($query){ + return $query->where('type', PackingListType::SHIPPING_PACKING_LIST)->whereDoesntHave('containers', function($query) { + return $query->whereHas('transports', function($query){ + return $query->whereHas('schedules', function($query){ + return $query->where('etd', '<', Carbon::now()); + }); + }); + }); + })->get()), + 'in_transit_packages' => PackageResource::collection($this->parcels()->whereHas('packingList', function($query){ + return $query->where('type', PackingListType::SHIPPING_PACKING_LIST)->whereHas('containers', function($query) { + return $query->whereHas('transports', function($query){ + return $query->where('status', '=', ApprovalStatus::APPROVED)->whereHas('schedules', function($query){ + return $query->where('etd', '<', Carbon::now()); + }); + }); + }); + })->get()), + 'destination_warehouse_packages' => PackageResource::collection($this->parcels()->whereHas('packingList', function($query){ + return $query->where('type', PackingListType::SHIPPING_PACKING_LIST)->whereHas('containers', function($query) { + return $query->whereHas('transports', function($query){ + return $query->where('type', '=', TransportType::SEA)->where('status', '=', ApprovalStatus::COMPLETED)->whereHas('schedules', function($query){ + return $query->where('etd', '<', Carbon::now()); + }); + }); + })->whereDoesntHave('transports', function($query){ + return $query->where('type', '=', TransportType::LAND)->where('status', '=', ApprovalStatus::APPROVED)->whereHas('schedules', function($query){ return $query->where('etd', '<', Carbon::now()); }); }); - }); - })->get()), - 'in_transit_packages' => PackageResource::collection($this->parcels()->whereHas('packingList', function($query){ - return $query->where('type', PackingListType::SHIPPING_PACKING_LIST)->whereHas('containers', function($query) { - return $query->whereHas('transports', function($query){ - return $query->where('status', '=', ApprovalStatus::APPROVED)->whereHas('schedules', function($query){ + })->get()), + 'delivered_packages' => PackageResource::collection($this->parcels()->whereHas('packingList', function($query){ + return $query->where('type', PackingListType::SHIPPING_PACKING_LIST)->whereHas('containers', function($query) { + return $query->whereHas('transports', function($query){ + return $query->where('type', '=', TransportType::SEA)->where('status', '=', ApprovalStatus::COMPLETED)->whereHas('schedules', function($query){ + return $query->where('etd', '<', Carbon::now()); + }); + }); + })->whereHas('transports', function($query){ + return $query->where('type', '=', TransportType::LAND)->where('status', '=', ApprovalStatus::APPROVED)->whereHas('schedules', function($query){ return $query->where('etd', '<', Carbon::now()); }); }); - }); - })->get()), - 'destination_warehouse_packages' => PackageResource::collection($this->parcels()->whereHas('packingList', function($query){ - return $query->where('type', PackingListType::SHIPPING_PACKING_LIST)->whereHas('containers', function($query) { - return $query->whereHas('transports', function($query){ - return $query->where('type', '=', TransportType::SEA)->where('status', '=', ApprovalStatus::COMPLETED)->whereHas('schedules', function($query){ - return $query->where('etd', '<', Carbon::now()); - }); - }); - })->whereDoesntHave('transports', function($query){ - return $query->where('type', '=', TransportType::LAND)->where('status', '=', ApprovalStatus::APPROVED)->whereHas('schedules', function($query){ - return $query->where('etd', '<', Carbon::now()); - }); - }); - })->get()), - 'delivered_packages' => PackageResource::collection($this->parcels()->whereHas('packingList', function($query){ - return $query->where('type', PackingListType::SHIPPING_PACKING_LIST)->whereHas('containers', function($query) { - return $query->whereHas('transports', function($query){ - return $query->where('type', '=', TransportType::SEA)->where('status', '=', ApprovalStatus::COMPLETED)->whereHas('schedules', function($query){ - return $query->where('etd', '<', Carbon::now()); - }); - }); - })->whereHas('transports', function($query){ - return $query->where('type', '=', TransportType::LAND)->where('status', '=', ApprovalStatus::APPROVED)->whereHas('schedules', function($query){ - return $query->where('etd', '<', Carbon::now()); - }); - }); - })->get()), - 'parcels' => PackageResource::collection($this->parcels()->whereHas('packingList', function($query){ - return $query->where('type', PackingListType::WAREHOUSE_RECEIVE_LIST); - })->get()), - ]), - 'created_at' => $this->created_at->format('d-m-Y') - ]; + })->get()), + 'parcels' => PackageResource::collection($this->parcels()->whereHas('packingList', function($query){ + return $query->where('type', PackingListType::WAREHOUSE_RECEIVE_LIST); + })->get()), + ]), + 'created_at' => $this->created_at->format('d-m-Y') + ]; + } catch (\Exception $exception){ + $this->id; + } + } } diff --git a/app/Http/Resources/PackageResource.php b/app/Http/Resources/PackageResource.php index 7a3209d1..d69ae652 100644 --- a/app/Http/Resources/PackageResource.php +++ b/app/Http/Resources/PackageResource.php @@ -23,7 +23,7 @@ class PackageResource extends JsonResource 'length' => floatval($this->length), 'weight' => $this->weight, 'quantity' => $this->quantity, - 'cbm' => (($this->width / 100) * ($this->width / 100) * ($this->width / 100)) * $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->packingList->containers()->first()), diff --git a/app/Http/Resources/PackingListResource.php b/app/Http/Resources/PackingListResource.php index e75ce164..4024833d 100644 --- a/app/Http/Resources/PackingListResource.php +++ b/app/Http/Resources/PackingListResource.php @@ -21,6 +21,7 @@ class PackingListResource extends JsonResource 'status' => $this->status, 'transport' => new TransportResource($this->transports()->first()), 'packages' => PackageResource::collection($this->packages), + 'order' => New OrderResource($this->owner) ]; } } diff --git a/app/Http/Resources/TransportResource.php b/app/Http/Resources/TransportResource.php index 6656721a..b931964d 100644 --- a/app/Http/Resources/TransportResource.php +++ b/app/Http/Resources/TransportResource.php @@ -24,7 +24,7 @@ class TransportResource extends JsonResource 'drop_date' => $this->drop_date ? $this->drop_date->format('d-m-Y') : $this->drop_date, 'status' => $this->status, 'current_schedule' => new ScheduleResource($this->schedules()->where('status', '=', ApprovalStatus::APPROVED)->first()), - 'schedule_history' => ScheduleResource::collection($this->schedules()->where('status', '!=', ApprovalStatus::APPROVED)->get()) + 'schedule_history' => ScheduleResource::collection($this->schedules()->where('status', '=', ApprovalStatus::EXPIRED)->get()) ]; } } diff --git a/app/Models/Exchange/Company.php b/app/Models/Exchange/Company.php new file mode 100644 index 00000000..fc85080c --- /dev/null +++ b/app/Models/Exchange/Company.php @@ -0,0 +1,36 @@ +belongsToMany(User::class, (new Employee())->getTable(), 'company_id','user_id'); + } + +} + + + diff --git a/app/Models/Exchange/Employee.php b/app/Models/Exchange/Employee.php new file mode 100644 index 00000000..b310f078 --- /dev/null +++ b/app/Models/Exchange/Employee.php @@ -0,0 +1,37 @@ +HasMany(Company::class, 'company_id', 'id'); + } + + /** + * @return \Illuminate\Database\Eloquent\Relations\HasOne + **/ + public function user(): HasOne + { + return $this->hasOne(User::class, 'user_id', 'id'); + } +} diff --git a/app/Models/Exchange/User.php b/app/Models/Exchange/User.php new file mode 100644 index 00000000..cc102ba2 --- /dev/null +++ b/app/Models/Exchange/User.php @@ -0,0 +1,19 @@ +belongsToMany(Company::class, (new Employee())->getTable(), 'user_id', 'company_id'); + } +} diff --git a/app/Models/OldOrders.php b/app/Models/OldOrders.php index 81041fab..c6901929 100644 --- a/app/Models/OldOrders.php +++ b/app/Models/OldOrders.php @@ -17,7 +17,7 @@ class OldOrders extends Model */ public function address(): hasOne { - return $this->hasOne(OldAddress::class, 'reference_id', 'address_id')->where('type', '=', 1); + return $this->hasOne(OldAddress::class, 'id', 'address_id')->where('type', '=', 1); } /** diff --git a/app/Models/Order.php b/app/Models/Order.php index 4d537646..9d3099a5 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\ValueObjects\Constants\RoleTypes; +use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Scopes\CustomerOrdersScope; use Illuminate\Database\Eloquent\Relations\HasMany; use Illuminate\Database\Eloquent\Relations\HasManyThrough; @@ -77,4 +78,14 @@ class Order extends AbstractModel implements Addressable, Packable // static::addGlobalScope(new CustomerOrdersScope); // } } + + public function addressesPendingVerification() + { + return $this->addresses()->where('status','=',ApprovalStatus::PENDING_VERIFICATION); + } + + public function addressesApproved() + { + return $this->addresses()->where('status','=',ApprovalStatus::APPROVED); + } } diff --git a/composer.json b/composer.json index 824d2d3f..56ab4aac 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ "intervention/image": "^2.5", "laravel/framework": "^8.40", "laravel/tinker": "^2.5", + "maatwebsite/excel": "^3.1", "rinvex/countries": "^6.1", "spatie/laravel-activitylog": "^3.14", "spatie/laravel-permission": "^4.2", diff --git a/config/app.php b/config/app.php index bad26462..df3e7a90 100644 --- a/config/app.php +++ b/config/app.php @@ -178,7 +178,8 @@ return [ // Third Parties Spatie\Permission\PermissionServiceProvider::class, Barryvdh\DomPDF\ServiceProvider::class, - Meneses\LaravelMpdf\LaravelMpdfServiceProvider::class + Meneses\LaravelMpdf\LaravelMpdfServiceProvider::class, + Maatwebsite\Excel\ExcelServiceProvider::class, ], /* @@ -233,6 +234,7 @@ return [ 'View' => Illuminate\Support\Facades\View::class, 'PDF' => Barryvdh\DomPDF\Facade::class, 'MPDF' => Meneses\LaravelMpdf\Facades\LaravelMpdf::class, + 'Excel' => Maatwebsite\Excel\Facades\Excel::class, ], ]; diff --git a/config/database.php b/config/database.php index 4e8bc250..8b5c199f 100644 --- a/config/database.php +++ b/config/database.php @@ -82,7 +82,25 @@ return [ PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), ]) : [], ], - + 'exchange_db' => [ + 'driver' => 'mysql', + 'url' => env('DATABASE_URL'), + 'host' => env('DB_HOST', '127.0.0.1'), + 'port' => env('DB_PORT', '3306'), + 'database' => env('DB_DATABASE_EXCHANGE', 'forge'), + 'username' => env('DB_USERNAME', 'forge'), + 'password' => env('DB_PASSWORD', ''), + 'unix_socket' => env('DB_SOCKET_IZYIM', ''), + 'charset' => 'utf8mb4', + 'collation' => 'utf8mb4_unicode_ci', + 'prefix' => '', + 'prefix_indexes' => true, + 'strict' => true, + 'engine' => null, + 'options' => extension_loaded('pdo_mysql') ? array_filter([ + PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'), + ]) : [], + ], 'pgsql' => [ 'driver' => 'pgsql', 'url' => env('DATABASE_URL'), diff --git a/config/excel.php b/config/excel.php new file mode 100644 index 00000000..c3199b92 --- /dev/null +++ b/config/excel.php @@ -0,0 +1,328 @@ + [ + + /* + |-------------------------------------------------------------------------- + | Chunk size + |-------------------------------------------------------------------------- + | + | When using FromQuery, the query is automatically chunked. + | Here you can specify how big the chunk should be. + | + */ + 'chunk_size' => 1000, + + /* + |-------------------------------------------------------------------------- + | Pre-calculate formulas during export + |-------------------------------------------------------------------------- + */ + 'pre_calculate_formulas' => false, + + /* + |-------------------------------------------------------------------------- + | Enable strict null comparison + |-------------------------------------------------------------------------- + | + | When enabling strict null comparison empty cells ('') will + | be added to the sheet. + */ + 'strict_null_comparison' => false, + + /* + |-------------------------------------------------------------------------- + | CSV Settings + |-------------------------------------------------------------------------- + | + | Configure e.g. delimiter, enclosure and line ending for CSV exports. + | + */ + 'csv' => [ + 'delimiter' => ',', + 'enclosure' => '"', + 'line_ending' => PHP_EOL, + 'use_bom' => false, + 'include_separator_line' => false, + 'excel_compatibility' => false, + ], + + /* + |-------------------------------------------------------------------------- + | Worksheet properties + |-------------------------------------------------------------------------- + | + | Configure e.g. default title, creator, subject,... + | + */ + 'properties' => [ + 'creator' => '', + 'lastModifiedBy' => '', + 'title' => '', + 'description' => '', + 'subject' => '', + 'keywords' => '', + 'category' => '', + 'manager' => '', + 'company' => '', + ], + ], + + 'imports' => [ + + /* + |-------------------------------------------------------------------------- + | Read Only + |-------------------------------------------------------------------------- + | + | When dealing with imports, you might only be interested in the + | data that the sheet exists. By default we ignore all styles, + | however if you want to do some logic based on style data + | you can enable it by setting read_only to false. + | + */ + 'read_only' => true, + + /* + |-------------------------------------------------------------------------- + | Ignore Empty + |-------------------------------------------------------------------------- + | + | When dealing with imports, you might be interested in ignoring + | rows that have null values or empty strings. By default rows + | containing empty strings or empty values are not ignored but can be + | ignored by enabling the setting ignore_empty to true. + | + */ + 'ignore_empty' => false, + + /* + |-------------------------------------------------------------------------- + | Heading Row Formatter + |-------------------------------------------------------------------------- + | + | Configure the heading row formatter. + | Available options: none|slug|custom + | + */ + 'heading_row' => [ + 'formatter' => 'slug', + ], + + /* + |-------------------------------------------------------------------------- + | CSV Settings + |-------------------------------------------------------------------------- + | + | Configure e.g. delimiter, enclosure and line ending for CSV imports. + | + */ + 'csv' => [ + 'delimiter' => ',', + 'enclosure' => '"', + 'escape_character' => '\\', + 'contiguous' => false, + 'input_encoding' => 'UTF-8', + ], + + /* + |-------------------------------------------------------------------------- + | Worksheet properties + |-------------------------------------------------------------------------- + | + | Configure e.g. default title, creator, subject,... + | + */ + 'properties' => [ + 'creator' => '', + 'lastModifiedBy' => '', + 'title' => '', + 'description' => '', + 'subject' => '', + 'keywords' => '', + 'category' => '', + 'manager' => '', + 'company' => '', + ], + + ], + + /* + |-------------------------------------------------------------------------- + | Extension detector + |-------------------------------------------------------------------------- + | + | Configure here which writer/reader type should be used when the package + | needs to guess the correct type based on the extension alone. + | + */ + 'extension_detector' => [ + 'xlsx' => Excel::XLSX, + 'xlsm' => Excel::XLSX, + 'xltx' => Excel::XLSX, + 'xltm' => Excel::XLSX, + 'xls' => Excel::XLS, + 'xlt' => Excel::XLS, + 'ods' => Excel::ODS, + 'ots' => Excel::ODS, + 'slk' => Excel::SLK, + 'xml' => Excel::XML, + 'gnumeric' => Excel::GNUMERIC, + 'htm' => Excel::HTML, + 'html' => Excel::HTML, + 'csv' => Excel::CSV, + 'tsv' => Excel::TSV, + + /* + |-------------------------------------------------------------------------- + | PDF Extension + |-------------------------------------------------------------------------- + | + | Configure here which Pdf driver should be used by default. + | Available options: Excel::MPDF | Excel::TCPDF | Excel::DOMPDF + | + */ + 'pdf' => Excel::DOMPDF, + ], + + /* + |-------------------------------------------------------------------------- + | Value Binder + |-------------------------------------------------------------------------- + | + | PhpSpreadsheet offers a way to hook into the process of a value being + | written to a cell. In there some assumptions are made on how the + | value should be formatted. If you want to change those defaults, + | you can implement your own default value binder. + | + | Possible value binders: + | + | [x] Maatwebsite\Excel\DefaultValueBinder::class + | [x] PhpOffice\PhpSpreadsheet\Cell\StringValueBinder::class + | [x] PhpOffice\PhpSpreadsheet\Cell\AdvancedValueBinder::class + | + */ + 'value_binder' => [ + 'default' => Maatwebsite\Excel\DefaultValueBinder::class, + ], + + 'cache' => [ + /* + |-------------------------------------------------------------------------- + | Default cell caching driver + |-------------------------------------------------------------------------- + | + | By default PhpSpreadsheet keeps all cell values in memory, however when + | dealing with large files, this might result into memory issues. If you + | want to mitigate that, you can configure a cell caching driver here. + | When using the illuminate driver, it will store each value in a the + | cache store. This can slow down the process, because it needs to + | store each value. You can use the "batch" store if you want to + | only persist to the store when the memory limit is reached. + | + | Drivers: memory|illuminate|batch + | + */ + 'driver' => 'memory', + + /* + |-------------------------------------------------------------------------- + | Batch memory caching + |-------------------------------------------------------------------------- + | + | When dealing with the "batch" caching driver, it will only + | persist to the store when the memory limit is reached. + | Here you can tweak the memory limit to your liking. + | + */ + 'batch' => [ + 'memory_limit' => 60000, + ], + + /* + |-------------------------------------------------------------------------- + | Illuminate cache + |-------------------------------------------------------------------------- + | + | When using the "illuminate" caching driver, it will automatically use + | your default cache store. However if you prefer to have the cell + | cache on a separate store, you can configure the store name here. + | You can use any store defined in your cache config. When leaving + | at "null" it will use the default store. + | + */ + 'illuminate' => [ + 'store' => null, + ], + ], + + /* + |-------------------------------------------------------------------------- + | Transaction Handler + |-------------------------------------------------------------------------- + | + | By default the import is wrapped in a transaction. This is useful + | for when an import may fail and you want to retry it. With the + | transactions, the previous import gets rolled-back. + | + | You can disable the transaction handler by setting this to null. + | Or you can choose a custom made transaction handler here. + | + | Supported handlers: null|db + | + */ + 'transactions' => [ + 'handler' => 'db', + ], + + 'temporary_files' => [ + + /* + |-------------------------------------------------------------------------- + | Local Temporary Path + |-------------------------------------------------------------------------- + | + | When exporting and importing files, we use a temporary file, before + | storing reading or downloading. Here you can customize that path. + | + */ + 'local_path' => storage_path('framework/laravel-excel'), + + /* + |-------------------------------------------------------------------------- + | Remote Temporary Disk + |-------------------------------------------------------------------------- + | + | When dealing with a multi server setup with queues in which you + | cannot rely on having a shared local temporary path, you might + | want to store the temporary file on a shared disk. During the + | queue executing, we'll retrieve the temporary file from that + | location instead. When left to null, it will always use + | the local path. This setting only has effect when using + | in conjunction with queued imports and exports. + | + */ + 'remote_disk' => null, + 'remote_prefix' => null, + + /* + |-------------------------------------------------------------------------- + | Force Resync + |-------------------------------------------------------------------------- + | + | When dealing with a multi server setup as above, it's possible + | for the clean up that occurs after entire queue has been run to only + | cleanup the server that the last AfterImportJob runs on. The rest of the server + | would still have the local temporary file stored on it. In this case your + | local storage limits can be exceeded and future imports won't be processed. + | To mitigate this you can set this config value to be true, so that after every + | queued chunk is processed the local temporary file is deleted on the server that + | processed it. + | + */ + 'force_resync_remote' => null, + ], +]; diff --git a/database/seeders/CompaniesTableSeeder.php b/database/seeders/CompaniesTableSeeder.php index 01bb3801..c2ffdeb4 100644 --- a/database/seeders/CompaniesTableSeeder.php +++ b/database/seeders/CompaniesTableSeeder.php @@ -172,49 +172,49 @@ class CompaniesTableSeeder extends Seeder } - if(true){ - $companies = OldCompany::all(); + // if(true){ + // $companies = OldCompany::all(); - foreach($companies as $company){ + // foreach($companies as $company){ - $marking = explode("CIEF/", $company->marking); + // $marking = explode("CIEF/", $company->marking); - if(count($marking) < 2){ - continue; - } + // if(count($marking) < 2){ + // continue; + // } - $marking = str_replace(' ', '', str_replace('/', '', $marking[1])); + // $marking = str_replace(' ', '', str_replace('/', '', $marking[1])); - /** @var Company $newCompany */ - $newCompany = $this->createCompanyProcessor->execute($company->name, CompanyType::COMPANY_BUSINESS, ApprovalStatus::PENDING_SUBMISSION); + // /** @var Company $newCompany */ + // $newCompany = $this->createCompanyProcessor->execute($company->name, CompanyType::COMPANY_BUSINESS, ApprovalStatus::PENDING_SUBMISSION); - $this->updatesCompanyStatus->execute($newCompany, ApprovalStatus::APPROVED); + // $this->updatesCompanyStatus->execute($newCompany, ApprovalStatus::APPROVED); - /** @var CompanyModule $companyModule */ - $companyModule = $this->createCompanyModuleProcessor->execute($newCompany, BusinessType::IMPORTER); + // /** @var CompanyModule $companyModule */ + // $companyModule = $this->createCompanyModuleProcessor->execute($newCompany, BusinessType::IMPORTER); - $connectionObject = new CompanyConnectionObject($companyModule, 'CIEF', $marking); + // $connectionObject = new CompanyConnectionObject($companyModule, 'CIEF', $marking); - $connection = $this->createsCompanyConnection->execute($connectionObject); - $this->approvesCompanyConnection->execute($connection); + // $connection = $this->createsCompanyConnection->execute($connectionObject); + // $this->approvesCompanyConnection->execute($connection); - $i = 0; - foreach($company->addresses as $address){ - $this->createAddressFromOldAddressProcessor->execute($address, $companyModule); - $contact = preg_replace("/[^0-9.]/", "", $address->contact); - if($contact){ - $i++; - if($i === 1) { - $contactObject = new ContactObject('', $contact, $company->email, '',); - $this->createContactProcessor->execute($contactObject, $newCompany); - } - } + // $i = 0; + // foreach($company->addresses as $address){ + // $this->createAddressFromOldAddressProcessor->execute($address, $companyModule); + // $contact = preg_replace("/[^0-9.]/", "", $address->contact); + // if($contact){ + // $i++; + // if($i === 1) { + // $contactObject = new ContactObject('', $contact, $company->email, '',); + // $this->createContactProcessor->execute($contactObject, $newCompany); + // } + // } - } - } - } + // } + // } + // } } diff --git a/database/seeders/CompanyEmployeesTableSeeder.php b/database/seeders/CompanyEmployeesTableSeeder.php new file mode 100644 index 00000000..40473ed1 --- /dev/null +++ b/database/seeders/CompanyEmployeesTableSeeder.php @@ -0,0 +1,76 @@ +assignEmployeeProcessor = $assignEmployeeProcessor; + } + + + /** + * Run the database seeds. + * + * @return void + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function run() + { + DB::beginTransaction(); + foreach(ExchangeCompany::all() as $company) { + + if($connection = CompanyConnection::where('invitee_reference', $company->reference)->first()){ + + $companyModule = $connection->invitee; + + if($companyModule->employees()->exists()) { + continue; + } + + $exchangeUser = $company->employees()->first(); + + if(User::where('email', '=', $exchangeUser->email)->count()){ + continue; + } + + $user = new User(); + $user->name = $exchangeUser->name; + $user->email = $exchangeUser->email; + $user->password = $exchangeUser->password; + $user->type = $exchangeUser->type; + $user->status = $exchangeUser->status; + + $user->save(); + + $Object = new EmploymentObject($companyModule, $user); + + $this->assignEmployeeProcessor->execute($Object); + } + + } + DB::commit(); + + + } + +} diff --git a/database/seeders/DeleteOldOrdersSeeder.php b/database/seeders/DeleteOldOrdersSeeder.php new file mode 100644 index 00000000..74afabf6 --- /dev/null +++ b/database/seeders/DeleteOldOrdersSeeder.php @@ -0,0 +1,54 @@ +reference)->first(); + if($oldOrder){ + $order->addresses()->forceDelete(); + $order->packingLists()->forceDelete(); + $order->OrderRoles()->forceDelete(); + $order->orderSteps()->forceDelete(); + $order->forceDelete(); + } + } + } + +} diff --git a/database/seeders/OrdersTableSeeder.php b/database/seeders/OrdersTableSeeder.php index 60caa71c..0e881591 100644 --- a/database/seeders/OrdersTableSeeder.php +++ b/database/seeders/OrdersTableSeeder.php @@ -21,7 +21,6 @@ class OrdersTableSeeder extends Seeder */ public function run() { - FetchWarehouseReceiveListFromVTPortalJob::withChain([ new FetchLoadedContainersFromVTPortalJob, new FetchPackingListFromVTPortalJob, diff --git a/resources/assets/sass/modules/_modals.scss b/resources/assets/sass/modules/_modals.scss index 73272c57..1bafb1cd 100644 --- a/resources/assets/sass/modules/_modals.scss +++ b/resources/assets/sass/modules/_modals.scss @@ -269,7 +269,7 @@ body.modal-open { box-shadow: none; } .modal-dialog { - width: 600px; + width: 1140px; } .modal-sm { width: 300px; diff --git a/resources/assets/vue/components/accounts/forms/InviteRegistrationFormComponent.vue b/resources/assets/vue/components/accounts/forms/InviteRegistrationFormComponent.vue new file mode 100644 index 00000000..9b8af5ea --- /dev/null +++ b/resources/assets/vue/components/accounts/forms/InviteRegistrationFormComponent.vue @@ -0,0 +1,101 @@ + + diff --git a/resources/assets/vue/components/accounts/forms/RegistrationCheckEmailFormComponent.vue b/resources/assets/vue/components/accounts/forms/RegistrationCheckEmailFormComponent.vue index e96c3f46..04a74241 100644 --- a/resources/assets/vue/components/accounts/forms/RegistrationCheckEmailFormComponent.vue +++ b/resources/assets/vue/components/accounts/forms/RegistrationCheckEmailFormComponent.vue @@ -38,7 +38,6 @@ \ No newline at end of file diff --git a/resources/assets/vue/components/address/forms/NewEditAddressFormComponent.vue b/resources/assets/vue/components/address/forms/NewEditAddressFormComponent.vue deleted file mode 100644 index 8f2fad2b..00000000 --- a/resources/assets/vue/components/address/forms/NewEditAddressFormComponent.vue +++ /dev/null @@ -1,145 +0,0 @@ - - diff --git a/resources/assets/vue/components/address/elements/AddressComponent.vue b/resources/assets/vue/components/addresses/elements/AddressComponent.vue similarity index 100% rename from resources/assets/vue/components/address/elements/AddressComponent.vue rename to resources/assets/vue/components/addresses/elements/AddressComponent.vue diff --git a/resources/assets/vue/components/addresses/elements/AddressVerificationComponent.vue b/resources/assets/vue/components/addresses/elements/AddressVerificationComponent.vue new file mode 100644 index 00000000..5c5e1cbe --- /dev/null +++ b/resources/assets/vue/components/addresses/elements/AddressVerificationComponent.vue @@ -0,0 +1,135 @@ + + + diff --git a/resources/assets/vue/components/addresses/elements/SelectAddressComponent.vue b/resources/assets/vue/components/addresses/elements/SelectAddressComponent.vue index 587f2394..d3e8daf2 100644 --- a/resources/assets/vue/components/addresses/elements/SelectAddressComponent.vue +++ b/resources/assets/vue/components/addresses/elements/SelectAddressComponent.vue @@ -5,10 +5,10 @@
-
+
{{item.reference}}
-
+
{{item.street_one}} {{item.street_two}}, {{item.district.name}}, {{item.post_code}} {{item.state.name}}, {{item.country.name}}
diff --git a/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue b/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue index 3999ce1d..450fe5aa 100644 --- a/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue +++ b/resources/assets/vue/components/addresses/forms/AddressFormComponent.vue @@ -20,13 +20,13 @@
-
+
-
+
diff --git a/resources/assets/vue/components/address/forms/SetDefaultAddressFormComponent.vue b/resources/assets/vue/components/addresses/forms/SetDefaultAddressFormComponent.vue similarity index 100% rename from resources/assets/vue/components/address/forms/SetDefaultAddressFormComponent.vue rename to resources/assets/vue/components/addresses/forms/SetDefaultAddressFormComponent.vue diff --git a/resources/assets/vue/components/address/sections/AddressListComponent.vue b/resources/assets/vue/components/addresses/sections/AddressListComponent.vue similarity index 100% rename from resources/assets/vue/components/address/sections/AddressListComponent.vue rename to resources/assets/vue/components/addresses/sections/AddressListComponent.vue diff --git a/resources/assets/vue/components/companies/elements/CompanyComponent.vue b/resources/assets/vue/components/companies/elements/CompanyComponent.vue index c0c63716..88c0480c 100644 --- a/resources/assets/vue/components/companies/elements/CompanyComponent.vue +++ b/resources/assets/vue/components/companies/elements/CompanyComponent.vue @@ -10,8 +10,9 @@
{{this.item.name}}
CIEF/{{this.item.company_module.marking}}
-
- +
+
Date
+
{{this.item.created_at}}
{{this.item.status === 2 ? 'Active':'Inactive'}}
diff --git a/resources/assets/vue/components/companies/elements/CustomerProfileComponent.vue b/resources/assets/vue/components/companies/elements/CustomerProfileComponent.vue index 5584ec86..af3e0e7c 100644 --- a/resources/assets/vue/components/companies/elements/CustomerProfileComponent.vue +++ b/resources/assets/vue/components/companies/elements/CustomerProfileComponent.vue @@ -30,25 +30,29 @@
-
+
-
+
Account Owner
{{item.employee.name}}
+
+
+
Email Address
+
{{item.employee.email}}
+
+
-
+
Contact Number
{{item.contact.phone}}
-
-
WeChat ID
@@ -57,35 +61,39 @@
-
-
-
+
+
+
-
{{ item.type === 0 ? 'Identification Card' : 'SSM Registration' }}
-
{{item.identification.reference}}
-
-
- - - +
+
+
{{ item.type === 0 ? 'Identification Card' : 'SSM Registration' }}
+
{{item.identification.reference}}
+
+
+ + + +
+
-
-
-
-
-
-
- +
+
+
+
+ +
+
+ + +
- - -
@@ -99,6 +107,17 @@
+
+
+
+ Claimed +
+
+ Invitation Link +
+ +
+
@@ -106,6 +125,19 @@ \ No newline at end of file diff --git a/resources/assets/vue/components/containers/elements/ContainerComponent.vue b/resources/assets/vue/components/containers/elements/ContainerComponent.vue new file mode 100644 index 00000000..4b6ba607 --- /dev/null +++ b/resources/assets/vue/components/containers/elements/ContainerComponent.vue @@ -0,0 +1,114 @@ + + diff --git a/resources/assets/vue/components/containers/elements/ContainerProfileSectionComponent.vue b/resources/assets/vue/components/containers/elements/ContainerProfileSectionComponent.vue new file mode 100644 index 00000000..b63f317c --- /dev/null +++ b/resources/assets/vue/components/containers/elements/ContainerProfileSectionComponent.vue @@ -0,0 +1,255 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/orders/elements/ApproveChangeAddressComponent.vue b/resources/assets/vue/components/orders/elements/ApproveChangeAddressComponent.vue new file mode 100644 index 00000000..d4217fd5 --- /dev/null +++ b/resources/assets/vue/components/orders/elements/ApproveChangeAddressComponent.vue @@ -0,0 +1,22 @@ + + diff --git a/resources/assets/vue/components/orders/elements/OrderComponent.vue b/resources/assets/vue/components/orders/elements/OrderComponent.vue index 907f3d73..2262d768 100644 --- a/resources/assets/vue/components/orders/elements/OrderComponent.vue +++ b/resources/assets/vue/components/orders/elements/OrderComponent.vue @@ -2,7 +2,7 @@ @@ -52,6 +52,10 @@ Status

{{status}}

+
+ Container +

{{item.container.container_reference}}

+
@@ -66,15 +70,29 @@
-
-
-
- +
+
+
+
+
+ +
+
+
+
+
+
+
-
+ +
+
+
+
+
@@ -84,11 +102,31 @@
@@ -69,4 +93,4 @@ }, mixins: [componentHandler] } - \ No newline at end of file + diff --git a/resources/assets/vue/components/orders/forms/ApproveChangeAddressFormComponent.vue b/resources/assets/vue/components/orders/forms/ApproveChangeAddressFormComponent.vue new file mode 100644 index 00000000..ce9f4769 --- /dev/null +++ b/resources/assets/vue/components/orders/forms/ApproveChangeAddressFormComponent.vue @@ -0,0 +1,49 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/orders/forms/ChangeOrderAddressFormComponent.vue b/resources/assets/vue/components/orders/forms/ChangeOrderAddressFormComponent.vue new file mode 100644 index 00000000..b138b680 --- /dev/null +++ b/resources/assets/vue/components/orders/forms/ChangeOrderAddressFormComponent.vue @@ -0,0 +1,84 @@ + + \ No newline at end of file diff --git a/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue b/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue index 84525c41..22215504 100644 --- a/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue +++ b/resources/assets/vue/components/orders/sections/OrderProfileSectionComponent.vue @@ -16,29 +16,71 @@
-
+

Order No. {{order.reference}}

-
+
-
Delivery Address: {{order.address.reference}}
+
Order Date: {{order.created_at}}
Warehouse: {{order.warehouse.id === 3 ? 'Guang Zhou' : 'Yiwu'}}
-
-
Order Date: {{order.created_at}}
-
-
-
- +
+
+
Delivery Address: {{order.address.reference}}
+
+
+
+
+
Change Delivery Address
+ + + +
+
+
+
+
Your Delivery address change request is being reviewed
+
+
+ +
+ +
+
+
+
+
+
+
Cancel Address Change Request
+
Are you sure you want to cancel your order delivery address change request?
+
+
+
+
+
Cancel
+
+
+
Confirm
+
+
+
+
+
+
+
+
+
+
Gentle reminder: You need to send the QR code to your supplier to print and stick on your packages, this QR code is required for us to identify your packages when they arrives at our warehouse!
diff --git a/resources/assets/vue/components/orders/sections/OrderSectionComponent.vue b/resources/assets/vue/components/orders/sections/OrderSectionComponent.vue index 18df2ac5..840e5ecf 100644 --- a/resources/assets/vue/components/orders/sections/OrderSectionComponent.vue +++ b/resources/assets/vue/components/orders/sections/OrderSectionComponent.vue @@ -170,7 +170,7 @@
- + diff --git a/resources/assets/vue/components/paymentsBilling/elements/PaymentsBillingComponents.vue b/resources/assets/vue/components/paymentsBilling/elements/PaymentsBillingComponents.vue new file mode 100644 index 00000000..86535a80 --- /dev/null +++ b/resources/assets/vue/components/paymentsBilling/elements/PaymentsBillingComponents.vue @@ -0,0 +1,131 @@ + + diff --git a/resources/assets/vue/components/shippingQueue/elements/shippingQueueComponents.vue b/resources/assets/vue/components/shippingQueue/elements/shippingQueueComponents.vue new file mode 100644 index 00000000..41c20a1c --- /dev/null +++ b/resources/assets/vue/components/shippingQueue/elements/shippingQueueComponents.vue @@ -0,0 +1,94 @@ + + diff --git a/resources/assets/vue/general/mixins/accounts/validation/inviteRegistrationFormValidation.js b/resources/assets/vue/general/mixins/accounts/validation/inviteRegistrationFormValidation.js new file mode 100644 index 00000000..7879ff6d --- /dev/null +++ b/resources/assets/vue/general/mixins/accounts/validation/inviteRegistrationFormValidation.js @@ -0,0 +1,27 @@ +import { required, email, numeric, sameAs, requiredUnless, requiredIf } from "vuelidate/lib/validators"; +import authenticationHandler from '../authenticationHandler' +export default { + validations: { + parameters: { + name: { + required: required + }, + email: { + required: required, + email + }, + phone: { + required: required, + numeric + }, + password: { + required: required, + }, + password_confirmation: { + required: required, + sameAs: sameAs('password') + } + } + }, + mixins: [authenticationHandler] +} \ No newline at end of file diff --git a/resources/assets/vue/general/mixins/guards.js b/resources/assets/vue/general/mixins/guards.js index 18681e5d..ffa96e7d 100644 --- a/resources/assets/vue/general/mixins/guards.js +++ b/resources/assets/vue/general/mixins/guards.js @@ -5,7 +5,10 @@ export default { (this.$store.getters.isAuthenticated && !this.isProtectedRoute()&& this.isWithTokenRoute()) ? window.location.href = this.route('dashboard') : ''; }, isProtectedRoute(){ - const unprotectedRoutes = [this.route('login'), this.route('account.email.verification')]; + const unprotectedRoutes = [this.route('login'), this.route('account.email.verification'), this.route('company.claim')]; + if(window.location.href.indexOf(this.route('company.claim')) === 0) { + return false; + } return !unprotectedRoutes.includes(window.location.href); }, isWithTokenRoute(){ diff --git a/resources/assets/vue/general/mixins/stepNavi.js b/resources/assets/vue/general/mixins/stepNavi.js deleted file mode 100644 index a3c05a0d..00000000 --- a/resources/assets/vue/general/mixins/stepNavi.js +++ /dev/null @@ -1,22 +0,0 @@ -export default { - methods: { - changeStep(direction) { - this.status.direction = direction; - - if (direction === 'next') { - - if (this.validate()) { - //this.step += 1; - this.status.email = this.parameters.email; - this.$emit('updateStatus', this.status); - } - return; - } - this.$emit('updateStatus', this.status); - this.$v.$reset(); - }, - }, - beforeDestroy: function (event) { - }, - -} \ No newline at end of file diff --git a/resources/views/layouts/base_portal.blade.php b/resources/views/layouts/base_portal.blade.php index 452d1560..96025829 100644 --- a/resources/views/layouts/base_portal.blade.php +++ b/resources/views/layouts/base_portal.blade.php @@ -19,6 +19,16 @@ @include('partials.header')
+
+
+
+ + +
+ +
@yield('inner_content')
@@ -102,4 +112,4 @@
-@endsection \ No newline at end of file +@endsection diff --git a/resources/views/pages/accounts/claim_business.blade.php b/resources/views/pages/accounts/claim_business.blade.php new file mode 100644 index 00000000..645b8e5f --- /dev/null +++ b/resources/views/pages/accounts/claim_business.blade.php @@ -0,0 +1,23 @@ +@extends('layouts.base_login') + +@section('inner_content') +
+
+
+
+ +
+
+
+
+ +
+
+ +
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/pages/admin/dashboard.blade.php b/resources/views/pages/admin/dashboard.blade.php index 431120dc..0fe49ba7 100644 --- a/resources/views/pages/admin/dashboard.blade.php +++ b/resources/views/pages/admin/dashboard.blade.php @@ -1,5 +1,5 @@
-
+
Customers List
@@ -30,5 +30,19 @@
+
+
+
Address Change Verification
+
+
+
+
+ + + +
+
\ No newline at end of file diff --git a/resources/views/pages/containers.blade.php b/resources/views/pages/containers.blade.php new file mode 100644 index 00000000..642d8c33 --- /dev/null +++ b/resources/views/pages/containers.blade.php @@ -0,0 +1,17 @@ +@extends('layouts.base_portal') +@section('inner_content') +
+
+
Search
+
+
+
Filter
+
+
+ + + + +@endsection \ No newline at end of file diff --git a/resources/views/pages/templates/containers.blade.php b/resources/views/pages/templates/containers.blade.php new file mode 100644 index 00000000..995e7b93 --- /dev/null +++ b/resources/views/pages/templates/containers.blade.php @@ -0,0 +1,17 @@ +@extends('layouts.base_portal') +@section('inner_content') +
+
+
Search
+
+
+
Filter
+
+
+ + + + +@endsection \ No newline at end of file diff --git a/resources/views/pages/templates/paymentsBilling.blade.php b/resources/views/pages/templates/paymentsBilling.blade.php new file mode 100644 index 00000000..f8a7719d --- /dev/null +++ b/resources/views/pages/templates/paymentsBilling.blade.php @@ -0,0 +1,128 @@ +@extends('layouts.base_portal') +@section('inner_content') +
+
+
+
+
+
+
+
+
+
+ +
+
+
Invoice No
+
+
+
Invoice Date
+
+
+
Status
+
+
+
Amount
+
+ +
+
+
+
+
+ + + +
+
+
+
+
+
+
Payment Summary
+
+
+
+
+
+ +
+
+
+
2 Invoice Selected
+
+
+
+
+
+
+
x1
+
+
+
lorem ipsum
+
+
+
52x62x635 CM
+
+
+
+
+
x1
+
+
+
lorem ipsum
+
+
+
52x62x635 CM
+
+
+
+
+
+
+
+
Shipping Fee
+
+
+
RM 212.15
+
+
+
+
+
Serrvice Fee
+
+
+
RM 41.25
+
+
+
+
+
Discount
+
+
+
RM 0.00
+
+
+
+
+
+
Total Payments
+
+
+
RM 3300.00
+
+
+
+
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/pages/templates/shippingQueue.blade.php b/resources/views/pages/templates/shippingQueue.blade.php new file mode 100644 index 00000000..455d5bb2 --- /dev/null +++ b/resources/views/pages/templates/shippingQueue.blade.php @@ -0,0 +1,120 @@ +@extends('layouts.base_portal') +@section('inner_content') +
+
+
+
+
+
+

Shipping ID: 05052021-25-0100

+
+
+
+
+
+
+
+
+
Discount Code
+
+
+
+
+
Free 10
+
+
+
Removed
+
+
+
+
+
+
+
+
+
+
+ + + +
+
+
+
+
+
+
+
+

Shipping cost estimation

+
+
+
+
+
+
+
Shipping Cost: RM8400
+
+
+
+
+
SST(6%): RM600
+
+
+
+
+
Discount: RM100
+
+
+
+
+
+
+
+
+
Total Cost:
+
+
+
+
+

RM7300

+
+
+
+
+
+
+
+
+
+
+
+
+

Group my products with same destination

+
+
+
+
+

You will get grouped package at once if possible

+
+
+
+
+
+
+
+
+
+
+
+
+ Checkout +
+
+
+
+
+
+
+@endsection \ No newline at end of file diff --git a/resources/views/pages/templates/warehouseFlow.blade.php b/resources/views/pages/templates/warehouseFlow.blade.php new file mode 100644 index 00000000..6800fcd6 --- /dev/null +++ b/resources/views/pages/templates/warehouseFlow.blade.php @@ -0,0 +1,4 @@ +@extends('layouts.base_portal') +@section('inner_content') + +@endsection \ No newline at end of file diff --git a/resources/views/pages/warehouse_list.blade.php b/resources/views/pages/warehouse_list.blade.php new file mode 100644 index 00000000..a57fc834 --- /dev/null +++ b/resources/views/pages/warehouse_list.blade.php @@ -0,0 +1,12 @@ +@extends('layouts.base_portal') +@section('inner_content') +
+
+ + + +
+
+@endsection \ No newline at end of file diff --git a/resources/views/partials/menu.blade.php b/resources/views/partials/menu.blade.php index 90d7d4d2..0d7693a5 100644 --- a/resources/views/partials/menu.blade.php +++ b/resources/views/partials/menu.blade.php @@ -41,6 +41,28 @@
Orders
+
+
+ +
+ +
+
+
+ +
+ +
-
Payments & Billing
+
Payments & Billing
@@ -85,6 +107,17 @@
Tracking
+
+
+ +
+ +
diff --git a/resources/views/swagger/json.blade.php b/resources/views/swagger/json.blade.php index 1e09fa9c..cd4df686 100644 --- a/resources/views/swagger/json.blade.php +++ b/resources/views/swagger/json.blade.php @@ -28,13 +28,17 @@ "name": "Order", "description": "Endpoints related to order module." }, + { + "name": "Packing", + "description": "Endpoints related to packing module." + }, { "name": "Package", "description": "Endpoints related to package module." }, { - "name": "Packing", - "description": "Endpoints related to packing module." + "name": "Container", + "description": "Endpoints related to container module." }, { "name": "Transport", @@ -71,9 +75,9 @@ "description": "", "parameters": [ { - "name": "package_id", + "name": "reference_number", "in": "query", - "description": "Package Id", + "description": "Reference No", "required": true, "type": "integer" } @@ -103,6 +107,54 @@ } } }, + "/packing_list/container/inbound-custom-cleared": { + "get": { + "tags": [ + "Packing" + ], + "produces": [ + "application/json" + ], + "operationId": "listPackingIn", + "summary": "List packing", + "description": "", + "parameters": [ + { + "name": "filter", + "in": "query", + "description": "Filters", + "required": false, + "type": "array", + "items": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + }, + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + } + }, + "schema": { + "type": "string" + } + }, + "422": { + "description": "Invalid input supplied" + } + } + } + }, "/packing_list/list": { "get": { "tags": [ @@ -221,7 +273,7 @@ "description": "Status", "required": true, "type": "integer" - }, + } ], "responses": { "200": { @@ -296,7 +348,7 @@ "/packing_list/container/create": { "post": { "tags": [ - "Packing" + "Container" ], "produces": [ "application/json" @@ -362,7 +414,7 @@ "/packing_list/container/list": { "get": { "tags": [ - "Packing" + "Container" ], "produces": [ "application/json" @@ -410,7 +462,7 @@ "/packing_list/container/{id}/show": { "get": { "tags": [ - "Packing" + "Container" ], "produces": [ "application/json" @@ -455,7 +507,7 @@ "/packing_list/container/update/{id}": { "put": { "tags": [ - "Packing" + "Container" ], "produces": [ "application/json" @@ -528,7 +580,7 @@ "/packing_list/container/delete/{id}": { "delete": { "tags": [ - "Packing" + "Container" ], "produces": [ "application/json" @@ -826,7 +878,7 @@ } } }, - "/package/create": { + "/packing_list/package/create": { "post": { "tags": [ "Package" @@ -893,7 +945,7 @@ "description": "Quantity", "required": true, "type": "integer" - }, + } ], "responses": { "200": { @@ -920,7 +972,7 @@ } } }, - "/package/list": { + "/packing_list/package/list": { "get": { "tags": [ "Package" @@ -968,7 +1020,7 @@ } } }, - "/package/{id}/show": { + "/packing_list/package/{id}/show": { "get": { "tags": [ "Package" @@ -1013,7 +1065,7 @@ } } }, - "/package/update/{id}": { + "/packing_list/package/update/{id}": { "put": { "tags": [ "Package" @@ -1087,7 +1139,7 @@ "description": "Status", "required": true, "type": "integer" - }, + } ], "responses": { "200": { @@ -1114,7 +1166,7 @@ } } }, - "/package/delete/{id}": { + "/packing_list/package/delete/{id}": { "delete": { "tags": [ "Package" @@ -1159,7 +1211,7 @@ } } }, - "/package/item/create": { + "/packing_list/package/item/create": { "post": { "tags": [ "Package" @@ -1219,7 +1271,7 @@ "description": "Total", "required": true, "type": "number" - }, + } ], "responses": { "200": { @@ -1246,7 +1298,7 @@ } } }, - "/package/item/list": { + "/packing_list/package/item/list": { "get": { "tags": [ "Package" @@ -1294,7 +1346,7 @@ } } }, - "/package/item/{id}/show": { + "/packing_list/package/item/{id}/show": { "get": { "tags": [ "Package" @@ -1339,7 +1391,7 @@ } } }, - "/package/item/update/{id}": { + "/packing_list/package/item/update/{id}": { "put": { "tags": [ "Package" @@ -1406,7 +1458,7 @@ "description": "Status", "required": true, "type": "integer" - }, + } ], "responses": { "200": { @@ -1433,7 +1485,7 @@ } } }, - "/package/item/delete/{id}": { + "/packing_list/package/item/delete/{id}": { "delete": { "tags": [ "Package" @@ -1490,7 +1542,7 @@ "summary": "Create transport", "description": "", "parameters": [ - { + { "name": "container_id", "in": "query", "description": "Container Id", @@ -1697,7 +1749,7 @@ "description": "Status", "required": true, "type": "integer" - }, + } ], "responses": { "200": { @@ -2294,9 +2346,9 @@ "description": "", "parameters": [ { - "name": "company_module_id", + "name": "company_id", "in": "query", - "description": "Company Module ID", + "description": "Company ID", "required": true, "type": "integer" }, @@ -2430,6 +2482,148 @@ } } }, + "/order/show/{id}": { + "get": { + "tags": [ + "Order" + ], + "produces": [ + "application/json" + ], + "operationId": "showOrder", + "summary": "Show order", + "description": "", + "parameters": [ + { + "name": "id", + "in": "path", + "description": "Order Reference Id", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + }, + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + } + }, + "schema": { + "type": "string" + } + }, + "422": { + "description": "Invalid input supplied" + } + } + } + }, + "/order/address/change/request": { + "post": { + "tags": [ + "Order" + ], + "produces": [ + "application/json" + ], + "operationId": "requestChangeOrderAddress", + "summary": "Request Change Order Address", + "description": "", + "parameters": [ + { + "name": "order_id", + "in": "query", + "description": "Order ID", + "required": true, + "type": "integer" + }, + { + "name": "address_id", + "in": "query", + "description": "New Order Address ID", + "required": true, + "type": "integer" + }, + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + }, + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + } + }, + "schema": { + "type": "string" + } + }, + "422": { + "description": "Invalid input supplied" + } + } + } + }, + "/order/address/change/approve": { + "post": { + "tags": [ + "Order" + ], + "produces": [ + "application/json" + ], + "operationId": "approveChangeOrderAddress", + "summary": "Approve Change Order Address", + "description": "", + "parameters": [ + { + "name": "order_id", + "in": "query", + "description": "Order ID", + "required": true, + "type": "integer" + } + ], + "responses": { + "200": { + "description": "successful operation", + "headers": { + "X-Expires-After": { + "type": "string", + "format": "date-time", + "description": "date in UTC when token expires" + }, + "X-Rate-Limit": { + "type": "integer", + "format": "int32", + "description": "calls per hour allowed by the user" + } + }, + "schema": { + "type": "string" + } + }, + "422": { + "description": "Invalid input supplied" + } + } + } + }, "/address/create": { "post": { "tags": [ @@ -2836,7 +3030,7 @@ } } }, - "/account/registration/registration": { + "/account/registration": { "post": { "tags": [ "Account", diff --git a/routes/account.php b/routes/account.php index cd4e33ae..b62064aa 100644 --- a/routes/account.php +++ b/routes/account.php @@ -5,6 +5,7 @@ use Illuminate\Support\Facades\Route; Route::group(['prefix' => 'account', 'namespace' => 'Accounts', 'as' => 'account.'], function () { Route::post('/registration', 'CreateCustomerController@create')->name('registration.register'); + Route::post('/invite/registration', 'CreateInvitedCustomerController@create')->name('registration.invite.register'); diff --git a/routes/order.php b/routes/order.php index 4f31ecff..6a0c04d3 100644 --- a/routes/order.php +++ b/routes/order.php @@ -9,4 +9,6 @@ Route::group(['prefix' => 'order', 'as' => 'order.', 'namespace' => 'Orders'], f Route::put('/confirm/{id}', 'ConfirmOrderController@confirm')->name('confirm'); Route::put('/cancel/{id}', 'CancelOrderController@cancel')->name('cancel'); Route::put('/restore/{id}', 'RestoreOrderController@restore')->name('restore'); + Route::post('/address/change/request', 'RequestChangeOrderAddressController@request')->name('address.change.request'); + Route::put('/address/{id}/status/{status}', 'ApproveChangeOrderAddressController@approve')->name('address.status.update'); }); diff --git a/routes/packing_list.php b/routes/packing_list.php index 06b11950..4eb27ddf 100644 --- a/routes/packing_list.php +++ b/routes/packing_list.php @@ -7,6 +7,7 @@ Route::group(['namespace' => 'PackingLists', 'as' => 'packing_list.', 'prefix' = Route::get('/list', 'ListPackingListsController@list')->name('list'); Route::post('/create', 'CreatePackingListController@create')->name('create'); Route::put('/update/{id}', 'UpdatePackingListController@update')->name('update'); + Route::put('/status/{id}/update/{status}', 'UpdatePackingListStatusController@update')->name('status.update'); Route::delete('/delete/{id}', 'DeletePackingListController@delete')->name('delete'); Route::group(['namespace' => 'Containers', 'prefix' => 'container', 'as' => 'container.'], function () { @@ -15,6 +16,8 @@ Route::group(['namespace' => 'PackingLists', 'as' => 'packing_list.', 'prefix' = Route::post('/create', 'CreateContainerController@create')->name('create'); Route::put('/update/{id}', 'UpdateContainerController@update')->name('update'); Route::delete('/delete/{id}', 'DeleteContainerController@delete')->name('delete'); + + Route::put('/assign-packing_list/{id}', 'AssignPackingListContainerController@assign')->name('assign.packing_list'); }); Route::group(['namespace' => 'Packages', 'as' => 'package.', 'prefix' => 'package'], function () { @@ -23,6 +26,8 @@ Route::group(['namespace' => 'PackingLists', 'as' => 'packing_list.', 'prefix' = Route::post('/create', 'CreatePackageController@create')->name('create'); Route::put('/update/{id}', 'UpdatePackageController@update')->name('update'); Route::delete('/delete/{id}', 'DeletePackageController@delete')->name('delete'); + Route::get('/inbound-custom-cleared', 'InboundCustomClearedController@list')->name('list.inbound.custom.cleared'); + Route::put('/switch-packing-list/{id}', 'SwitchPackagePackingListController@switch')->name('switch.packing_list'); Route::group(['namespace' => 'PackageItems', 'prefix' => 'item', 'as' => 'item.'], function () { Route::get('/{id}/show', 'FetchPackageItemController@fetch')->name('show'); diff --git a/routes/web.php b/routes/web.php index 0281ac90..2e98d3c8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -1,10 +1,13 @@ name('login'); Route::group(['prefix' => 'swagger'], function () { Route::get('/', function () { @@ -33,9 +36,9 @@ Route::group(['prefix' => 'swagger'], function () { }); }); -Route::get('', function () { - return view('pages.accounts.login');//temporary showing welcome page. -})->name('login'); +Route::get('/business/claim/{hash}', function ($hash) { + return view('pages.accounts.claim_business', ['id' => Crypt::decryptString($hash)]); +})->name('company.claim'); Route::get('/account/email/verification/{token}', function ($token) { return view('pages.accounts.email_verified', ['token' => $token]); @@ -61,19 +64,67 @@ Route::get('/address', function () { return view('pages.addresses.index'); })->name('address'); +Route::get('/warehouse-list', function () { + return view('pages.warehouse_list'); +})->name('warehouse.list'); + +Route::get('/containers', function () { + return view('pages.containers'); +})->name('containers'); + +Route::get('/container/show/{reference}', function ($reference) { + $container = Container::where('reference', $reference)->first(); + return view('pages.templates.warehouseFlow', ['id' => $container->id]); +})->name('container.show'); + Route::get('/customer/{marking}', function ($marking) { $connection = CompanyConnection::where('invitee_reference', $marking)->first(); $id = $connection->invitee->company->id; return view('pages.customers.profile', ['id' => $id]); })->name('customer.profile'); +Route::get('/orders/refresh', function(){ + + FetchWarehouseReceiveListFromVTPortalJob::withChain([ + new FetchLoadedContainersFromVTPortalJob, + new FetchPackingListFromVTPortalJob, + new FetchContainersStatusUpdateFromVTPortalJob, + new FetchDeliveryListFromVTPortalJob + ])->dispatch(); + + return redirect('orders'); + +})->name('orders.refresh'); + +Route::get('/containers/refresh', function(){ + + FetchContainersStatusUpdateFromVTPortalJob::dispatch(); + + return redirect('orders'); + +})->name('containers.refresh'); + +Route::get('/deliveries/refresh', function(){ + + FetchDeliveryListFromVTPortalJob::dispatch(); + + return redirect('orders'); + +})->name('deliveries.refresh'); + Route::get('/order/{id}/download', 'Orders\DownloadOrderQrPdfController@download')->name('order.qr.download'); -Route::get('/test', function(){ - $addresses = \App\Models\Address::all(); - foreach ($addresses as $address){ - $address->street_one = (new \App\Classes\Modules\Addresses\Services\CleansOldAddress())->cleanAddress($address->street_one, $address->district, $address->postcode); - $address->street_two = (new \App\Classes\Modules\Addresses\Services\CleansOldAddress())->cleanAddress($address->street_two, $address->district, $address->postcode); - $address->save(); - } -})->name('test'); \ No newline at end of file +Route::get('/report/customclearance', 'Reports\CustomcClearanceReportController@download')->name('report.customclearance'); + +Route::get('/report/customclearance/{orderid}', 'Reports\CustomcClearanceReportController@download')->name('report.customclearance'); + +Route::group(['prefix' => 'template', 'as' => 'template.'], function () { + Route::get('/payments-and-billing', function () { + return view('pages.templates.paymentsBilling'); + })->name('payments-and-billing'); + + Route::get('/shipping-queue', function () { + return view('pages.templates.shippingQueue'); + })->name('shipping-queue'); +}); +