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/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/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/PackingLists/ControllersLogic/Containers/AssignPackingListContainerLogic.php b/app/Classes/Modules/PackingLists/ControllersLogic/Containers/AssignPackingListContainerLogic.php new file mode 100644 index 00000000..33310711 --- /dev/null +++ b/app/Classes/Modules/PackingLists/ControllersLogic/Containers/AssignPackingListContainerLogic.php @@ -0,0 +1,67 @@ + '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/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/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/Processors/FetchContainersStatusUpdateFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchContainersStatusUpdateFromVTPortalProcessor.php index 0a0c0158..955d68d0 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchContainersStatusUpdateFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchContainersStatusUpdateFromVTPortalProcessor.php @@ -76,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":"CreatedOn asc","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); diff --git a/app/Classes/Modules/PackingLists/Processors/FetchDeliveryListFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchDeliveryListFromVTPortalProcessor.php index fbab0c5b..3a9ebdea 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchDeliveryListFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchDeliveryListFromVTPortalProcessor.php @@ -62,7 +62,7 @@ class FetchDeliveryListFromVTPortalProcessor 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.'}}'), ''); + $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/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 4069a40d..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":"LoadedTime asc","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":"CreatedOn asc","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); diff --git a/app/Classes/Modules/PackingLists/Processors/FetchPackingListFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchPackingListFromVTPortalProcessor.php index ecc9c9f0..00c3e112 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchPackingListFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchPackingListFromVTPortalProcessor.php @@ -57,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":"CreatedOn asc","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/FetchWarehouseReceiveListFromVTPortalProcessor.php b/app/Classes/Modules/PackingLists/Processors/FetchWarehouseReceiveListFromVTPortalProcessor.php index b9043479..d1eb8516 100644 --- a/app/Classes/Modules/PackingLists/Processors/FetchWarehouseReceiveListFromVTPortalProcessor.php +++ b/app/Classes/Modules/PackingLists/Processors/FetchWarehouseReceiveListFromVTPortalProcessor.php @@ -128,7 +128,7 @@ class FetchWarehouseReceiveListFromVTPortalProcessor $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":"ParcelDate asc","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); 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/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/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/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/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/Resources/CompanyResource.php b/app/Http/Resources/CompanyResource.php index 702319aa..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, diff --git a/app/Http/Resources/ContainerResource.php b/app/Http/Resources/ContainerResource.php index 774ada84..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,7 +18,7 @@ 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' => new TransportResource($this->transports()->first()), 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/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/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/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/containers/elements/ContainerComponent.vue b/resources/assets/vue/components/containers/elements/ContainerComponent.vue index a6e53001..694efdac 100644 --- a/resources/assets/vue/components/containers/elements/ContainerComponent.vue +++ b/resources/assets/vue/components/containers/elements/ContainerComponent.vue @@ -22,6 +22,10 @@

ETA

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

+
+

Loaded CBM

+

{{ (Math.ceil((item.packing_lists.reduce((total, obj) => total + obj.packages.reduce((total, obj) => obj.cbm + total, 0), 0)) * 1000) / 1000).toFixed(3) }}

+

Status

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

@@ -30,6 +34,9 @@
+ + +
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/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/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/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/partials/menu.blade.php b/resources/views/partials/menu.blade.php index e0881b5f..8986d034 100644 --- a/resources/views/partials/menu.blade.php +++ b/resources/views/partials/menu.blade.php @@ -93,7 +93,7 @@ style=" fill:#000000;">
-
Payments & Billing
+
Payments & Billing
@@ -107,6 +107,17 @@
Tracking
+
+
+ +
+
+
Shipping Queue
+
+
diff --git a/resources/views/swagger/json.blade.php b/resources/views/swagger/json.blade.php index 4fa056ef..cd4df686 100644 --- a/resources/views/swagger/json.blade.php +++ b/resources/views/swagger/json.blade.php @@ -107,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": [ @@ -2982,7 +3030,7 @@ } } }, - "/account/registration/registration": { + "/account/registration": { "post": { "tags": [ "Account", diff --git a/routes/account.php b/routes/account.php index 7a9e08df..ff6a9960 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'); Route::group(['prefix' => 'authentication', 'as' => 'authentication.'], function () { Route::group(['prefix' => 'login', 'as' => 'authenticate.'], function () { diff --git a/routes/packing_list.php b/routes/packing_list.php index ea64c7e1..4eb27ddf 100644 --- a/routes/packing_list.php +++ b/routes/packing_list.php @@ -16,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 () { @@ -24,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 f4d71a9c..68121d43 100644 --- a/routes/web.php +++ b/routes/web.php @@ -6,6 +6,8 @@ use App\Classes\Jobs\FetchLoadedContainersFromVTPortalJob; use App\Classes\Jobs\FetchPackingListFromVTPortalJob; use App\Classes\Jobs\FetchWarehouseReceiveListFromVTPortalJob; use App\Models\CompanyConnection; +use Illuminate\Support\Facades\Crypt; +use App\Models\Container; use Illuminate\Support\Facades\Route; /* @@ -21,9 +23,9 @@ use Illuminate\Support\Facades\Route; require __DIR__ . '/template.php'; -Route::get('/', function () { - return view('welcome'); -}); +Route::get('', function () { + return view('pages.accounts.login'); +})->name('login'); Route::group(['prefix' => 'swagger'], function () { Route::get('/', function () { @@ -34,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]); @@ -70,6 +72,11 @@ 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; @@ -97,6 +104,10 @@ Route::get('/containers/refresh', function(){ })->name('containers.refresh'); +Route::get('/shipping-queue', function () { + return view('pages.templates.shippingQueue'); +})->name('shipping-queue'); + Route::get('/deliveries/refresh', function(){ FetchDeliveryListFromVTPortalJob::dispatch(); @@ -107,16 +118,6 @@ Route::get('/deliveries/refresh', function(){ Route::get('/order/{id}/download', 'Orders\DownloadOrderQrPdfController@download')->name('order.qr.download'); -Route::get('/report/customclearance', 'Reports\CustomcClearanceReportController@download')->name('report.customclearance'); - -Route::get('/report/customclearance/{orderid}', 'Reports\CustomcClearanceReportController@download')->name('report.customclearance'); - -//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'); - +Route::get('/payments-and-billing', function () { + return view('pages.templates.paymentsBilling'); +})->name('payments-and-billing');