diff --git a/app/Classes/General/Eloquent/Filters/TypeIn.php b/app/Classes/General/Eloquent/Filters/TypeIn.php new file mode 100644 index 00000000..3a064f7a --- /dev/null +++ b/app/Classes/General/Eloquent/Filters/TypeIn.php @@ -0,0 +1,20 @@ +whereIn('type', $value); + } + +} \ No newline at end of file diff --git a/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php b/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php index 7762dffa..327a3666 100644 --- a/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php +++ b/app/Classes/Modules/Accounts/ControllersLogic/CreateCustomerLogic.php @@ -15,6 +15,7 @@ use App\Classes\Modules\Companies\Processors\CreateCompanyModuleProcessor; use App\Classes\Modules\Companies\DataTransferObjects\EmploymentObject; use App\Classes\Modules\Companies\Services\ApprovesCompanyConnection; use App\Classes\Modules\Companies\Services\CreatesCompanyConnection; +use App\Classes\Modules\Companies\Services\FetchesCompanyModule; use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; use App\Classes\Modules\Documents\Processors\UploadIdentityDocumentProcessor; @@ -76,6 +77,9 @@ class CreateCustomerLogic extends AbstractControllerLogic /** @var GenerateEmailVerificationAttemptProcessor */ private $generateEmailVerificationAttemptProcessor; + /** @var FetchesCompanyModule */ + private $fetchesCompanyModule; + /** * CreateCustomerLogic constructor. * @param CreateUserProcessor $createUserProcessor @@ -88,8 +92,9 @@ class CreateCustomerLogic extends AbstractControllerLogic * @param UploadIdentityDocumentProcessor $uploadIdentityDocumentProcessor * @param AuthenticationProcessor $authenticationProcessor * @param GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor + * @param FetchesCompanyModule $fetchesCompanyModule */ - public function __construct(CreateUserProcessor $createUserProcessor, CreateCompanyProcessor $createCompanyProcessor, CreateCompanyModuleProcessor $createCompanyModuleProcessor, CreateContactProcessor $createContactProcessor, CreatesCompanyConnection $createsCompanyConnection, ApprovesCompanyConnection $approvesCompanyConnection, AssignEmployeeProcessor $assignEmployeeProcessor, UploadIdentityDocumentProcessor $uploadIdentityDocumentProcessor, AuthenticationProcessor $authenticationProcessor, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor) + public function __construct(CreateUserProcessor $createUserProcessor, CreateCompanyProcessor $createCompanyProcessor, CreateCompanyModuleProcessor $createCompanyModuleProcessor, CreateContactProcessor $createContactProcessor, CreatesCompanyConnection $createsCompanyConnection, ApprovesCompanyConnection $approvesCompanyConnection, AssignEmployeeProcessor $assignEmployeeProcessor, UploadIdentityDocumentProcessor $uploadIdentityDocumentProcessor, AuthenticationProcessor $authenticationProcessor, GenerateEmailVerificationAttemptProcessor $generateEmailVerificationAttemptProcessor, FetchesCompanyModule $fetchesCompanyModule) { $this->createUserProcessor = $createUserProcessor; $this->createCompanyProcessor = $createCompanyProcessor; @@ -101,6 +106,7 @@ class CreateCustomerLogic extends AbstractControllerLogic $this->uploadIdentityDocumentProcessor = $uploadIdentityDocumentProcessor; $this->authenticationProcessor = $authenticationProcessor; $this->generateEmailVerificationAttemptProcessor = $generateEmailVerificationAttemptProcessor; + $this->fetchesCompanyModule = $fetchesCompanyModule; } /** @@ -128,7 +134,7 @@ class CreateCustomerLogic extends AbstractControllerLogic $inviter = $this->fetchesCompanyModule->execute(['reference'=>'CIEF']); - $connectionObject = new CompanyConnectionObject($companyModule, $inviter, 'CIEF', mt_rand(1000, 9999).(new GeneratesInitials())->name($company->name)->length(3)->generate()); + $connectionObject = new CompanyConnectionObject($companyModule, $inviter, mt_rand(1000, 9999).(new GeneratesInitials())->name($company->name)->length(3)->generate(), 'CIEF'); $connection = $this->createsCompanyConnection->execute($connectionObject); diff --git a/app/Classes/Modules/Accounts/Services/AuthenticationRedirect.php b/app/Classes/Modules/Accounts/Services/AuthenticationRedirect.php index 1d08a191..4222aaf8 100644 --- a/app/Classes/Modules/Accounts/Services/AuthenticationRedirect.php +++ b/app/Classes/Modules/Accounts/Services/AuthenticationRedirect.php @@ -12,9 +12,11 @@ class AuthenticationRedirect public function url(User $user){ if($user->type === RoleTypes::USER){ - if ($user->companyModule()->first()->type === BusinessType::ONLINE_SELLER) { - return route('delivery.dashboard'); + + if (in_array($user->companyModule()->first()->type, [BusinessType::ONLINE_SELLER, BusinessType::LAST_MILE_DELIVERY_AGENT])) { + return route('last_mile_delivery.dashboard'); } + return route('dashboard'); } diff --git a/app/Classes/Modules/Accounts/Services/GeneratesAuthenticationToken.php b/app/Classes/Modules/Accounts/Services/GeneratesAuthenticationToken.php index b327e175..88645795 100644 --- a/app/Classes/Modules/Accounts/Services/GeneratesAuthenticationToken.php +++ b/app/Classes/Modules/Accounts/Services/GeneratesAuthenticationToken.php @@ -68,7 +68,9 @@ class GeneratesAuthenticationToken { $companyModule = $user->companyModule()->first(); $claims = array_merge($claims, [ - 'company_id' => $companyModule->company_id + 'company_id' => $companyModule->company_id, + 'company_module_id' => $companyModule->id, + 'company_module_type' => $companyModule->type ]); } diff --git a/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php b/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php index 91f5c42e..f019bab3 100644 --- a/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php +++ b/app/Classes/Modules/Addresses/ControllersLogic/CreateAddressLogic.php @@ -14,6 +14,7 @@ use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject; use App\Classes\Modules\Remarks\Processors\CreateRemarkProcessor; +use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Http\Resources\AddressResource; use App\Models\Address; use ErrorException; @@ -82,7 +83,7 @@ class CreateAddressLogic extends AbstractControllerLogic $district = $this->fetchesDistrict->execute(['id' => $request->input('district_id')]); - $object = new AddressObject($request->input('street_one'), $request->input('street_two'), $district->country_id, $district->state_id, $district->id, $request->input('post_code'), $request->input('reference')); + $object = new AddressObject($request->input('street_one'), $request->input('street_two'), $district->country_id, $district->state_id, $district->id, $request->input('post_code'), $request->input('type'), ApprovalStatus::APPROVED, $request->input('reference')); $this->canCreateAddress->passes($object); diff --git a/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php b/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php index 95b8bf64..94d960f6 100644 --- a/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php +++ b/app/Classes/Modules/Addresses/ControllersLogic/UpdateAddressLogic.php @@ -13,6 +13,8 @@ use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject; use App\Classes\Modules\Remarks\Processors\CreateRemarkProcessor; +use App\Classes\ValueObjects\Constants\AddressType; +use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Http\Resources\AddressResource; use App\Models\Address; use Illuminate\Http\JsonResponse; @@ -79,7 +81,7 @@ class UpdateAddressLogic extends AbstractControllerLogic { $district = $this->fetchesDistrict->execute(['id' => $request->input('district_id')]); - $object = new AddressObject($request->input('street_one'), $request->input('street_two'), $district->country_id, $district->state_id, $district->id, $request->input('post_code'), $request->input('reference')); + $object = new AddressObject($request->input('street_one'), $request->input('street_two'), $district->country_id, $district->state_id, $district->id, $request->input('post_code'), AddressType::DELIVERY, ApprovalStatus::APPROVED, $request->input('reference')); $this->canUpdateAddress->passes($object); diff --git a/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php b/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php index b4453c3a..f1d79e53 100644 --- a/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php +++ b/app/Classes/Modules/Addresses/DataTransferObjects/AddressObject.php @@ -26,6 +26,12 @@ class AddressObject implements DataTransferObject /** @var int */ private $postCode; + /** @var int */ + private $type; + + /** @var int */ + private $status; + /** @var string|null */ private $reference; @@ -37,9 +43,11 @@ class AddressObject implements DataTransferObject * @param int $stateId * @param int $districtId * @param int $postCode + * @param int $type + * @param int $status * @param null|string $reference */ - public function __construct(string $streetOne, ?string $streetTwo, int $countryId, int $stateId, int $districtId, int $postCode, ?string $reference = null, ?int $status = ApprovalStatus::APPROVED) + public function __construct(string $streetOne, ?string $streetTwo, int $countryId, int $stateId, int $districtId, int $postCode, int $type, int $status, ?string $reference = null) { $this->streetOne = $streetOne; $this->streetTwo = $streetTwo; @@ -47,8 +55,9 @@ class AddressObject implements DataTransferObject $this->stateId = $stateId; $this->districtId = $districtId; $this->postCode = $postCode; - $this->reference = $reference; + $this->type = $type; $this->status = $status; + $this->reference = $reference; } /** @@ -100,11 +109,11 @@ class AddressObject implements DataTransferObject } /** - * @return null|string + * @return int */ - public function getReference(): ?string + public function getType(): int { - return $this->reference; + return $this->type; } /** @@ -115,5 +124,13 @@ class AddressObject implements DataTransferObject return $this->status; } + /** + * @return null|string + */ + public function getReference(): ?string + { + return $this->reference; + } + } \ No newline at end of file diff --git a/app/Classes/Modules/Addresses/Services/CleansOldAddress.php b/app/Classes/Modules/Addresses/Services/CleansOldAddress.php index 90fad41c..59463ad9 100644 --- a/app/Classes/Modules/Addresses/Services/CleansOldAddress.php +++ b/app/Classes/Modules/Addresses/Services/CleansOldAddress.php @@ -10,6 +10,8 @@ namespace App\Classes\Modules\Addresses\Services; use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject; +use App\Classes\ValueObjects\Constants\AddressType; +use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Models\District; use App\Models\OldAddress; @@ -31,7 +33,7 @@ class CleansOldAddress return null; } - return new AddressObject($this->cleanAddress($address->street_one, $district, $address->post_code), $this->cleanAddress($address->street_two, $district, $address->post_code), $district->country_id, $district->state_id, $district->id, $address->post_code, 'Delivery Address'); + return new AddressObject($this->cleanAddress($address->street_one, $district, $address->post_code), $this->cleanAddress($address->street_two, $district, $address->post_code), $district->country_id, $district->state_id, $district->id, $address->post_code, AddressType::DELIVERY, ApprovalStatus::APPROVED, 'Delivery Address'); } diff --git a/app/Classes/Modules/Addresses/Services/CreatesAddress.php b/app/Classes/Modules/Addresses/Services/CreatesAddress.php index b9f2716c..522b5d82 100644 --- a/app/Classes/Modules/Addresses/Services/CreatesAddress.php +++ b/app/Classes/Modules/Addresses/Services/CreatesAddress.php @@ -29,6 +29,7 @@ class CreatesAddress extends AbstractUpdateRelationshipRecord $model->district_id = $object->getDistrictId(); $model->postcode = $object->getPostCode(); $model->status = $object->getStatus(); + $model->type = $object->getType(); return $this->handler($addressable->addresses(), $model); diff --git a/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryCustomerLogic.php b/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryCustomerLogic.php index c7368439..521d88c5 100644 --- a/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryCustomerLogic.php +++ b/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryCustomerLogic.php @@ -132,9 +132,9 @@ class CreateDeliveryCustomerLogic extends AbstractControllerLogic /** @var CompanyModule $companyModule */ $companyModule = $this->createCompanyModuleProcessor->execute($company, BusinessType::ONLINE_SELLER); - $inviter = $this->fetchesCompanyModule->execute(['reference'=>'EXP']); + $inviter = $this->fetchesCompanyModule->execute(['reference'=>'LMD']); - $connectionObject = new CompanyConnectionObject($companyModule, $inviter, 'EXP', mt_rand(1000, 9999).(new GeneratesInitials())->name($company->name)->length(3)->generate()); + $connectionObject = new CompanyConnectionObject($companyModule, $inviter, mt_rand(1000, 9999).(new GeneratesInitials())->name($company->name)->length(3)->generate(), 'LMD'); $connection = $this->createsCompanyConnection->execute($connectionObject); diff --git a/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryOrderLogic.php b/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryOrderLogic.php new file mode 100644 index 00000000..0c5af797 --- /dev/null +++ b/app/Classes/Modules/Delivery/ControllersLogic/CreateDeliveryOrderLogic.php @@ -0,0 +1,178 @@ + 'Created Order', + 'message' => 'You have successfully created a new Order' + ]; + } + + /** @var FetchesCompany */ + private $fetchesCompany; + + /** @var fetchesAddress */ + private $fetchesAddress; + + /** @var CanCreateOrder */ + private $canCreateOrder; + + /** @var CreatesOrder */ + private $createsOrder; + + /** @var CreatesAddress */ + private $createAddress; + + /** @var CreateContactProcessor */ + private $createContactProcessor; + + /** @var CreateRemarkProcessor */ + private $createRemarkProcessor; + + /** @var GeneratesOrderNumber */ + private $generatesOrderNumber; + + /** @var CreatesPackingList */ + private $createsPackingList; + + /** @var CreatesPackage */ + private $createsPackage; + + + /** + * CreateDeliveryOrderLogic constructor. + * @param FetchesCompany $fetchesCompany + * @param FetchesAddress $fetchesAddress + * @param CanCreateOrder $canCreateOrder + * @param CreatesOrder $createsOrder + * @param CreatesAddress $createAddress + * @param CreateContactProcessor $createContactProcessor + * @param CreateRemarkProcessor $createRemarkProcessor + * @param GeneratesOrderNumber $generatesOrderNumber + * @param CreatesPackingList $createsPackingList + * @param CreatesPackage $createPackage + */ + public function __construct(FetchesCompany $fetchesCompany, FetchesAddress $fetchesAddress, CanCreateOrder $canCreateOrder, CreatesOrder $createsOrder, CreatesAddress $createAddress, CreateContactProcessor $createContactProcessor, CreateRemarkProcessor $createRemarkProcessor, GeneratesOrderNumber $generatesOrderNumber, CreatesPackingList $createsPackingList, CreatesPackage $createsPackage) + { + $this->fetchesCompany = $fetchesCompany; + $this->fetchesAddress = $fetchesAddress; + $this->canCreateOrder = $canCreateOrder; + $this->createsOrder = $createsOrder; + $this->createAddress = $createAddress; + $this->createContactProcessor = $createContactProcessor; + $this->createRemarkProcessor = $createRemarkProcessor; + $this->generatesOrderNumber = $generatesOrderNumber; + $this->createsPackingList = $createsPackingList; + $this->createsPackage = $createsPackage; + } + + /** + * @param Request $request + * @return JsonResponse + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function logic(Request $request): JsonResponse + { + $company = $this->fetchesCompany->execute(['id' => $request->input('company_id')]); + + $senderAddress = $this->fetchesAddress->execute(['id' => $request->input('sender_address_id')]); + $deliveryAddress = $this->fetchesAddress->execute(['id' => $request->input('delivery_address_id')]); + + /** @var CompanyModule $companyModule */ + $companyModule = $company->companyModules()->where('type', BusinessType::ONLINE_SELLER)->first(); + + $orderObject = new OrderObject($this->generatesOrderNumber->execute(), OrderType::LAST_MILE_DELIVERY, ApprovalStatus::APPROVED); + + $this->canCreateOrder->passes($orderObject); + + /** @var Order $order */ + $order = $this->createsOrder->execute($companyModule, $orderObject); + + $senderAddressObject = new AddressObject($senderAddress->street_one, $senderAddress->street_two, $senderAddress->country_id, $senderAddress->state_id, $senderAddress->district_id, $senderAddress->postcode, $senderAddress->type, ApprovalStatus::APPROVED, $senderAddress->reference); + $deliveryAddressObject = new AddressObject($deliveryAddress->street_one, $deliveryAddress->street_two, $deliveryAddress->country_id, $deliveryAddress->state_id, $deliveryAddress->district_id, $deliveryAddress->postcode, $deliveryAddress->type, ApprovalStatus::APPROVED, $senderAddress->reference); + + /** @var Address $orderSenderAddress */ + $orderSenderAddress = $this->createAddress->execute($order, $senderAddressObject); + /** @var Address $orderDeliveryAddress */ + $orderDeliveryAddress = $this->createAddress->execute($order, $deliveryAddressObject); + + $senderContact = $senderAddress->contacts()->first(); + $deliveryContact = $deliveryAddress->contacts()->first(); + + $contactObject = new ContactObject($senderContact->reference, $senderContact->phone, '',''); + $this->createContactProcessor->execute($contactObject, $orderSenderAddress); + + $contactObject = new ContactObject($deliveryContact->reference, $deliveryContact->phone, '',''); + $this->createContactProcessor->execute($contactObject, $orderDeliveryAddress); + + $senderRemark = $senderAddress->remarks()->first(); + $deliveryRemark = $deliveryAddress->remarks()->first(); + + if ($senderRemark){ + $remarkObject = new RemarkObject($senderRemark->content, Auth()->user()->id); + + if($remarkObject->getContent()){ + $this->createRemarkProcessor->execute($orderSenderAddress, $remarkObject); + } + } + + if ($deliveryRemark){ + $remarkObject = new RemarkObject($deliveryRemark->content, Auth()->user()->id); + + if($remarkObject->getContent()){ + $this->createRemarkProcessor->execute($orderDeliveryAddress, $remarkObject); + } + } + + $packingListObject = new PackingListObject($order->reference, $companyModule->id, PackingListType::DELIVERY_PACKING_LIST, ApprovalStatus::PENDING_VERIFICATION); + + /** @var PackingList $packingList */ + $packingList = $this->createsPackingList->execute($packingListObject, $order); + + $packageObject = new PackageObject($request->input('packing_list.type'), $request->input('packing_list.description'), (float) 1, (float) 1, (float) 1, $request->input('packing_list.weight'), (float) $request->input('packing_list.quantity'), ApprovalStatus::APPROVED); + $this->createsPackage->execute($packageObject, $packingList); + + return $this->resourceResponse(new DeliveryOrderResource($order)); + + } +} diff --git a/app/Classes/Modules/Delivery/ControllersLogic/ListOrdersLogic.php b/app/Classes/Modules/Delivery/ControllersLogic/ListOrdersLogic.php new file mode 100644 index 00000000..ae51f1b2 --- /dev/null +++ b/app/Classes/Modules/Delivery/ControllersLogic/ListOrdersLogic.php @@ -0,0 +1,57 @@ + 'Retrieved Orders', + 'message' => 'You have successfully retrieved a list of Orders' + ]; + } + + /** @var CanListOrders */ + private $canListOrders; + + /** @var ListsOrders */ + private $listsOrders; + + /** + * ListOrdersLogic constructor. + * @param CanListOrders $canListOrders + * @param ListsOrders $listsOrders + */ + public function __construct(CanListOrders $canListOrders, ListsOrders $listsOrders) + { + $this->canListOrders = $canListOrders; + $this->listsOrders = $listsOrders; + } + + public function logic(Request $request) : JsonResponse + { + $this->canListOrders->passes(); + + $query = $this->listsOrders->execute(array_merge($this->listsOrders->deserializeFilters($request->input('filters')), ['with_parcels' => true, 'type_in' => [OrderType::LAST_MILE_DELIVERY]])); + + return $this->collectionResponse(DeliveryOrderResource::collection($query)); + + } + + + +} diff --git a/app/Classes/Modules/Exports/Services/ExportsDeliveryOrders.php b/app/Classes/Modules/Exports/Services/ExportsDeliveryOrders.php new file mode 100644 index 00000000..03525eeb --- /dev/null +++ b/app/Classes/Modules/Exports/Services/ExportsDeliveryOrders.php @@ -0,0 +1,109 @@ +request = $request; + } + + public function headings(): array + { + return [ + 'Types_Of_Services', + 'Service_Type', + 'Sender_Name', + 'Sender_Company_Name', + 'Sender_Building_Unit', + 'Sender_Address', + 'Sender_Address_2', + 'Sender_Postal_Code', + 'Sender_Phone_Number', + 'Delivery_Name', + 'Delivery Company Name', + 'Delivery_Building_Unit', + 'Delivery_Address', + 'Delivery_Address_2', + 'Delivery_Postal_Code', + 'Delivery_Phone_Number', + 'Shipment_Type', + 'Mode', + 'Pickup_Address_Type', + 'Reference_Number', + 'Quantity', + 'Weight', + 'Length', + 'Width', + 'Height', + 'COD_Amount', + 'DO_Numbers' + ]; + } + + /** + * @return \Illuminate\Support\Collection|mixed + */ + public function query() + { + return Order::where('type', OrderType::LAST_MILE_DELIVERY); + } + + /** + * @param Order $order + * + * @return array + */ + public function map($order): array + { + $senderAddress = $order->addresses()->where('type', AddressType::PICK_UP)->first(); + $deliveryAddress = $order->addresses()->where('type', AddressType::DELIVERY)->first(); + $package = $order->packingLists()->first()->packages()->first(); + return [ + 'Standard Delivery', + 'ST00000003', + $senderAddress->contacts()->first()->reference, + '', + '*', + $senderAddress->street_one.', '.$senderAddress->street_two.' '.$senderAddress->district->name.' '.$senderAddress->postcode.' '.$senderAddress->state->name.' '.$senderAddress->country->name, + '', + $senderAddress->postcode, + $senderAddress->contacts()->first()->phone, + $deliveryAddress->contacts()->first()->reference, + '', + '*', + $deliveryAddress->street_one.', '.$deliveryAddress->street_two.' '.$deliveryAddress->district->name.' '.$deliveryAddress->postcode.' '.$deliveryAddress->state->name.' '.$deliveryAddress->country->name, + '', + $deliveryAddress->postcode, + $deliveryAddress->contacts()->first()->phone, + $package->type === PackageType::CARTON ? 'Package' : ($package->type === PackageType::PALLET ? 'Pallet' : 'Documents'), + 'Lodge In / Walk In', + 'Sender', + $order->reference, + $package->quantity, + $package->weight, + 1, + 1, + 1, + '', + '' + ]; + } +} \ No newline at end of file diff --git a/app/Classes/Modules/Orders/ControllersLogic/ListOrdersLogic.php b/app/Classes/Modules/Orders/ControllersLogic/ListOrdersLogic.php index da0eb033..3096de9d 100644 --- a/app/Classes/Modules/Orders/ControllersLogic/ListOrdersLogic.php +++ b/app/Classes/Modules/Orders/ControllersLogic/ListOrdersLogic.php @@ -6,6 +6,7 @@ namespace App\Classes\Modules\Orders\ControllersLogic; use App\Classes\General\Abstracts\AbstractControllerLogic; use App\Classes\Modules\Orders\Services\ListsOrders; use App\Classes\Modules\Orders\Standards\Rules\CanListOrders; +use App\Classes\ValueObjects\Constants\OrderType; use App\Http\Resources\OrderResource; use ErrorException; use Illuminate\Http\JsonResponse; @@ -44,7 +45,7 @@ class ListOrdersLogic extends AbstractControllerLogic { $this->canListOrders->passes(); - $query = $this->listsOrders->execute(array_merge($this->listsOrders->deserializeFilters($request->input('filters')), ['with_parcels' => true])); + $query = $this->listsOrders->execute(array_merge($this->listsOrders->deserializeFilters($request->input('filters')), ['with_parcels' => true, 'type_in' => [OrderType::SHARED_CONTAINER, OrderType::DEDICATED_CONTAINER]])); return $this->collectionResponse(OrderResource::collection($query)); diff --git a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php index 5a7c22eb..c427a20f 100644 --- a/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php +++ b/app/Classes/Modules/Orders/Processors/CreateOrderProcessor.php @@ -84,7 +84,7 @@ class CreateOrderProcessor /** @var Order $order */ $order = $this->createsOrder->execute($importer, $orderObject); - $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode,$address->reference); + $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode, $address->type, ApprovalStatus::APPROVED, $address->reference); /** @var Address $order_address */ $order_address = $this->createAddress->execute($order, $addressObject); diff --git a/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php b/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php index 81b31026..514aafca 100644 --- a/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php +++ b/app/Classes/Modules/Orders/Processors/RequestChangeOrderAddressProcessor.php @@ -8,6 +8,7 @@ use App\Classes\Modules\Addresses\Services\CreatesAddress; use App\Classes\Modules\Addresses\Services\FetchesAddress; use App\Classes\Modules\Addresses\Services\DeletesAddress; use App\Classes\Modules\Addresses\DataTransferObjects\AddressObject; +use App\Classes\ValueObjects\Constants\AddressType; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Remarks\DataTransferObjects\RemarkObject; @@ -76,7 +77,7 @@ class RequestChangeOrderAddressProcessor } $address = $this->fetchesAddress->execute(['id' => $request->get('address_id')]); - $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode, $address->reference, ApprovalStatus::PENDING_VERIFICATION); + $addressObject = new AddressObject($address->street_one, $address->street_two, $address->country_id, $address->state_id, $address->district_id, $address->postcode, AddressType::DELIVERY, ApprovalStatus::PENDING_VERIFICATION, $address->reference); $order_address = $this->createsAddress->execute($order, $addressObject); $contact = $address->contacts()->first(); diff --git a/app/Classes/ValueObjects/Constants/AddressType.php b/app/Classes/ValueObjects/Constants/AddressType.php index 4fdc3a29..614b9774 100644 --- a/app/Classes/ValueObjects/Constants/AddressType.php +++ b/app/Classes/ValueObjects/Constants/AddressType.php @@ -8,4 +8,6 @@ final class AddressType { public const DELIVERY = 2; + public const PICK_UP = 3; + } diff --git a/app/Classes/ValueObjects/Constants/OrderType.php b/app/Classes/ValueObjects/Constants/OrderType.php index ca203697..6558edd1 100644 --- a/app/Classes/ValueObjects/Constants/OrderType.php +++ b/app/Classes/ValueObjects/Constants/OrderType.php @@ -8,4 +8,6 @@ final class OrderType { public const DEDICATED_CONTAINER = 1; + public const LAST_MILE_DELIVERY = 2; + } diff --git a/app/Classes/ValueObjects/Constants/PackageType.php b/app/Classes/ValueObjects/Constants/PackageType.php index c38ad962..7865473a 100644 --- a/app/Classes/ValueObjects/Constants/PackageType.php +++ b/app/Classes/ValueObjects/Constants/PackageType.php @@ -10,4 +10,6 @@ final class PackageType { public const OVER_WEIGHT = 2; + public const DOCUMENT = 3; + } diff --git a/app/Http/Controllers/Delivery/CreateDeliveryOrderController.php b/app/Http/Controllers/Delivery/CreateDeliveryOrderController.php new file mode 100644 index 00000000..c6ab0ba2 --- /dev/null +++ b/app/Http/Controllers/Delivery/CreateDeliveryOrderController.php @@ -0,0 +1,20 @@ +execute($request); + } +} \ No newline at end of file diff --git a/app/Http/Controllers/Delivery/ExportDeliveryOrdersToExcelController.php b/app/Http/Controllers/Delivery/ExportDeliveryOrdersToExcelController.php new file mode 100644 index 00000000..9121fe00 --- /dev/null +++ b/app/Http/Controllers/Delivery/ExportDeliveryOrdersToExcelController.php @@ -0,0 +1,33 @@ +headers->set('Authorization', 'Bearer '.$token); + } + + public function lineClear(Request $request){ + $exportsTransactions = new ExportsDeliveryOrders($request); + $response = $exportsTransactions->download('line-clear-export.xls', Excel::XLS, ['Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']); + ob_end_clean(); + return $response; + } + +} \ No newline at end of file diff --git a/app/Http/Controllers/Delivery/ListOrdersController.php b/app/Http/Controllers/Delivery/ListOrdersController.php new file mode 100644 index 00000000..6106eb7e --- /dev/null +++ b/app/Http/Controllers/Delivery/ListOrdersController.php @@ -0,0 +1,22 @@ +execute($request); + } +} diff --git a/app/Http/Resources/CompanyResource.php b/app/Http/Resources/CompanyResource.php index 38459a35..8e27ab73 100644 --- a/app/Http/Resources/CompanyResource.php +++ b/app/Http/Resources/CompanyResource.php @@ -18,7 +18,7 @@ class CompanyResource extends JsonResource */ public function toArray($request) { - $companyModule = $this->companyModules()->where('type', '=', BusinessType::IMPORTER)->first(); + $companyModule = $this->companyModules()->first(); return [ 'id' => $this->id, 'hash_id' => Crypt::encryptString($this->id), @@ -30,8 +30,8 @@ class CompanyResource extends JsonResource 'contact' => new ContactResource ($this->when($this->has('contacts'), $this->contacts->first())), 'employee' => new UserResource($companyModule->employees()->first()), 'company_module' => new CompanyModuleResource($companyModule), - 'last_order' => new OrderResource($companyModule ? $companyModule->orders()->orderBy('id', 'DESC')->first(): null), - 'order_count' => $this->orders()->count(), + 'last_order' => $companyModule->type === 7 ? new DeliveryOrderResource($companyModule->orders()->orderBy('id', 'DESC')->first()) : new OrderResource($companyModule->orders()->orderBy('id', 'DESC')->first()), + 'order_count' => $companyModule->orders()->count(), 'identification' => new DocumentResource($this->documents->whereIn('document_type', DocumentType::IDENTIFICATION_DOCUMENTS)->whereIn('status', [ApprovalStatus::PENDING_VERIFICATION, ApprovalStatus::APPROVED])->first()), 'created_at' => $this->created_at->format('d-m-Y') diff --git a/app/Http/Resources/DeliveryOrderResource.php b/app/Http/Resources/DeliveryOrderResource.php new file mode 100644 index 00000000..cc81bfad --- /dev/null +++ b/app/Http/Resources/DeliveryOrderResource.php @@ -0,0 +1,33 @@ + $this->id, + 'reference' => $this->reference, + 'type' => (int) $this->type, + 'status' => (int) $this->status, + 'company_module' => new CompanyModuleResource($this->companyModule), + 'sender_address' => new AddressResource($this->addresses()->where('status', '=', ApprovalStatus::APPROVED)->where('type', AddressType::PICK_UP)->first()), + 'delivery_address' => new AddressResource($this->addresses()->where('status', '=', ApprovalStatus::APPROVED)->where('type', AddressType::DELIVERY)->first()), + 'packingList' => new DeliveryPackingListResource($this->packingLists()->first()), + 'remarks' => RemarkResource::collection($this->remarks), + 'created_at' => $this->created_at->format('d-m-Y') + ]; + + } +} diff --git a/app/Http/Resources/DeliveryPackingListResource.php b/app/Http/Resources/DeliveryPackingListResource.php new file mode 100644 index 00000000..16e71caf --- /dev/null +++ b/app/Http/Resources/DeliveryPackingListResource.php @@ -0,0 +1,36 @@ +packages()->first(); + + return [ + 'id' => $this->id, + 'claimant_id' => $this->claimant_id, + 'reference' => $this->reference, + 'status' => $this->status, + 'transport' => new TransportResource($this->transports()->first()), + 'type' => $package->type, + 'description' => $package->description, + 'weight' => (float) $package->weight, + 'quantity' => (float) $package->quantity, + ]; + } +} diff --git a/app/Models/Addon.php b/app/Models/Addon.php new file mode 100644 index 00000000..68118643 --- /dev/null +++ b/app/Models/Addon.php @@ -0,0 +1,36 @@ +morphTo(); + } +} diff --git a/app/Models/Order.php b/app/Models/Order.php index 5011fd36..352f46fb 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -58,6 +58,14 @@ class Order extends AbstractModel implements Addressable, Packable, Remarkable, return $this->morphMany(PackingList::class, 'owner'); } + /** + * @return MorphMany + */ + public function addons(): morphMany + { + return $this->morphMany(Addon::class, 'owner'); + } + /** * @return MorphMany */ diff --git a/app/Models/PackingList.php b/app/Models/PackingList.php index a6fd95e5..1ca19f1d 100644 --- a/app/Models/PackingList.php +++ b/app/Models/PackingList.php @@ -36,6 +36,14 @@ class PackingList extends AbstractModel implements Transportable, Steppable, Pac return $this->morphTo(); } + /** + * @return MorphMany + */ + public function addons(): morphMany + { + return $this->morphMany(Addon::class, 'owner'); + } + public function containers(): BelongsToMany { return $this->BelongsToMany(Container::class, ContainerPackingList::class); diff --git a/database/migrations/2022_03_14_133555_create_addons_table.php b/database/migrations/2022_03_14_133555_create_addons_table.php new file mode 100644 index 00000000..4b58535c --- /dev/null +++ b/database/migrations/2022_03_14_133555_create_addons_table.php @@ -0,0 +1,37 @@ +id(); + $table->morphs('owner'); + $table->string('reference',200); + $table->integer('type')->default(0); + $table->integer('quantity')->default(1); + $table->integer('status')->default(0); + $table->softDeletes(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('order_addons'); + } +} diff --git a/database/seeders/CompaniesTableSeeder.php b/database/seeders/CompaniesTableSeeder.php index da6c1061..bcabe9a0 100644 --- a/database/seeders/CompaniesTableSeeder.php +++ b/database/seeders/CompaniesTableSeeder.php @@ -16,6 +16,7 @@ use App\Classes\Modules\Companies\Services\UpdatesCompanyStatus; use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; use App\Classes\Modules\Contacts\Services\CreatesContact; +use App\Classes\ValueObjects\Constants\AddressType; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\CompanyType; use App\Classes\ValueObjects\Constants\BusinessType; @@ -112,7 +113,7 @@ class CompaniesTableSeeder extends Seeder /** @var CompanyModule $companyModule */ $companyModule = $this->createCompanyModuleProcessor->execute($company, BusinessType::FREIGHT_FORWARDER); - $address = new AddressObject('Malaysian Global Innovation & Creativity Center Level 1 CWS', 'Block 3730,Persiaran APEC', 1, 15, 402, 63000); + $address = new AddressObject('Malaysian Global Innovation & Creativity Center Level 1 CWS', 'Block 3730,Persiaran APEC', 1, 15, 402, 63000, AddressType::BILLING, ApprovalStatus::APPROVED); $this->createsAddress->execute($companyModule, $address); $contact = new ContactObject('Office Number', '0182909252', '', ''); @@ -131,22 +132,22 @@ class CompaniesTableSeeder extends Seeder if ($name === 'Guangzhou'){ $companyModule->update(['name' => $name, 'reference' => 'GZ-V01']); - $address = new AddressObject('白云区,大朗南路 白云湖大道自编13号 7号仓库', '高德地图导航:广州市世通行', 2, 35, 633, 510450); + $address = new AddressObject('白云区,大朗南路 白云湖大道自编13号 7号仓库', '高德地图导航:广州市世通行', 2, 35, 633, 510450, AddressType::DELIVERY, ApprovalStatus::APPROVED); $contact = new ContactObject('杨维民', '13600055019', '', ''); } elseif ($name === 'Yiwu') { $companyModule->update(['name' => $name, 'reference' => 'YW-V01']); - $address = new AddressObject('义乌市诚信大道义乌港A区2楼194号', '', 2, 27, 532, 322000); + $address = new AddressObject('义乌市诚信大道义乌港A区2楼194号', '', 2, 27, 532, 322000, AddressType::DELIVERY, ApprovalStatus::APPROVED); $contact = new ContactObject('小曾', '13575982901', '', ''); } elseif ($name === 'Klang') { $companyModule->update(['name' => $name, 'reference' => 'KL-V01']); - $address = new AddressObject('LOT 1357 A, JALAN TANJUNG SHAWAL', 'KAMPUNG SUNGAI PINANG', 1, 15, 412, 41400); + $address = new AddressObject('LOT 1357 A, JALAN TANJUNG SHAWAL', 'KAMPUNG SUNGAI PINANG', 1, 15, 412, 41400, AddressType::DELIVERY, ApprovalStatus::APPROVED); $contact = new ContactObject('Mr. Yang', '0162237680', '', ''); } elseif ($name === 'Sabah') { $companyModule->update(['name' => $name, 'reference' => 'SB-V01']); - $address = new AddressObject('Warehouse A & B, No. 2, Lorong Kacang Tanah 1', 'Jalan Kolombong, Kolombong', 1, 13, 316, 88450); + $address = new AddressObject('Warehouse A & B, No. 2, Lorong Kacang Tanah 1', 'Jalan Kolombong, Kolombong', 1, 13, 316, 88450, AddressType::DELIVERY, ApprovalStatus::APPROVED); } elseif ($name === 'Sarawak') { $companyModule->update(['name' => $name, 'reference' => 'SRW-V01']); - $address = new AddressObject('OPPOSITE HT POLE 51, LT 664 JALAN SUNGAI SALIM', '', 1, 14, 381, 96000); + $address = new AddressObject('OPPOSITE HT POLE 51, LT 664 JALAN SUNGAI SALIM', '', 1, 14, 381, 96000, AddressType::DELIVERY, ApprovalStatus::APPROVED); } @@ -161,7 +162,7 @@ class CompaniesTableSeeder extends Seeder /** @var CompanyModule $companyModule */ $companyModule = $this->createCompanyModuleProcessor->execute($company, $businessType); - $address = new AddressObject('2, Jalan TSB 6, Taman Industri Sungai Buloh', '', 1, 15, 419, 47000); + $address = new AddressObject('2, Jalan TSB 6, Taman Industri Sungai Buloh', '', 1, 15, 419, 47000, AddressType::BILLING, ApprovalStatus::APPROVED); $this->createsAddress->execute($companyModule, $address); $contact = new ContactObject('Office Number', '036148 8108', '', ''); diff --git a/database/seeders/LastMileDeliveryTableSeeder.php b/database/seeders/LastMileDeliveryTableSeeder.php new file mode 100644 index 00000000..e56a1ea8 --- /dev/null +++ b/database/seeders/LastMileDeliveryTableSeeder.php @@ -0,0 +1,123 @@ +createCompanyProcessor = $createCompanyProcessor; + $this->updatesCompanyStatus = $updatesCompanyStatus; + $this->createCompanyModuleProcessor = $createCompanyModuleProcessor; + $this->createContactProcessor = $createContactProcessor; + $this->createsCompanyConnection = $createsCompanyConnection; + $this->approvesCompanyConnection = $approvesCompanyConnection; + $this->createAddressFromOldAddressProcessor = $createAddressFromOldAddressProcessor; + $this->createsAddress = $createsAddress; + $this->createsCompany = $createsCompany; + $this->createsContact = $createsContact; + } + + + /** + * Run the database seeds. + * + * @return void + * @throws \App\Classes\Exceptions\AccessForbiddenException + * @throws \App\Classes\Exceptions\MalformedRequestException + * @throws \App\Classes\Exceptions\RequestValidationException + */ + public function run() + { + + $companies = [ + new CompanyObject('Last Mile Delivery', 'LMD', CompanyType::COMPANY_BUSINESS, ApprovalStatus::APPROVED), + ]; + + + foreach ($companies as $companyObject) { + + /** @var Company $company */ + $company = $this->createsCompany->execute($companyObject); + + /** @var CompanyModule $companyModule */ + $companyModule = $this->createCompanyModuleProcessor->execute($company, BusinessType::LAST_MILE_DELIVERY_AGENT); + + $address = new AddressObject('Malaysian Global Innovation & Creativity Center Level 1 CWS', 'Block 3730,Persiaran APEC', 1, 15, 402, 63000, AddressType::BILLING, ApprovalStatus::APPROVED); + $this->createsAddress->execute($companyModule, $address); + + $contact = new ContactObject('Office Number', '0182909252', '', ''); + $this->createsContact->execute($companyModule, $contact); + + continue; + + } + } +} diff --git a/database/seeders/ModernWarehouseTableSeeder.php b/database/seeders/ModernWarehouseTableSeeder.php index 7f76fd2e..2d97241d 100644 --- a/database/seeders/ModernWarehouseTableSeeder.php +++ b/database/seeders/ModernWarehouseTableSeeder.php @@ -17,6 +17,7 @@ use App\Classes\Modules\Companies\Services\UpdatesCompanyStatus; use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject; use App\Classes\Modules\Contacts\Processors\CreateContactProcessor; use App\Classes\Modules\Contacts\Services\CreatesContact; +use App\Classes\ValueObjects\Constants\AddressType; use App\Classes\ValueObjects\Constants\ApprovalStatus; use App\Classes\ValueObjects\Constants\CompanyType; use App\Classes\ValueObjects\Constants\BusinessType; @@ -106,7 +107,7 @@ class ModernWarehouseTableSeeder extends Seeder $companyModule = $this->createCompanyModuleProcessor->execute($company, BusinessType::WAREHOUSE); $companyModule->update(['name' => 'Yiwu', 'reference' => 'YW-V02']); - $address = new AddressObject('义乌市 后宅街道 起航路233号百汇科创园园区里面', '(进口处进来第一个路口左转至出口处右手边国际物流仓库)', 2, 27, 532, 322000); + $address = new AddressObject('义乌市 后宅街道 起航路233号百汇科创园园区里面', '(进口处进来第一个路口左转至出口处右手边国际物流仓库)', 2, 27, 532, 322000, AddressType::BILLING, ApprovalStatus::APPROVED); $contact = new ContactObject('韩成名', '18058489899 / 18058929899', '', ''); $this->createsAddress->execute($companyModule, $address); diff --git a/resources/assets/images/lineclear.png b/resources/assets/images/lineclear.png new file mode 100644 index 00000000..3a71fc9f Binary files /dev/null and b/resources/assets/images/lineclear.png differ diff --git a/resources/assets/vue/app.js b/resources/assets/vue/app.js index b81feb10..5195d9c8 100644 --- a/resources/assets/vue/app.js +++ b/resources/assets/vue/app.js @@ -14,6 +14,10 @@ import vuelidate from 'vuelidate'; /** Input Mask **/ import VueTheMask from 'vue-the-mask'; +import VueEasytable from "vue-easytable"; // import library + +Vue.use(VueEasytable); + /** Mixins */ import request from './general/mixins/request'; diff --git a/resources/assets/vue/components/accounts/elements/LogoutComponent.vue b/resources/assets/vue/components/accounts/elements/LogoutComponent.vue index a3d65272..1236d117 100644 --- a/resources/assets/vue/components/accounts/elements/LogoutComponent.vue +++ b/resources/assets/vue/components/accounts/elements/LogoutComponent.vue @@ -67,11 +67,11 @@ this.submit(this.route('api.account.authentication.logout'), 'get', this.section, false, false) }, successHandler(){ - this.$store.dispatch('userAuthentication', {access_token: '', redirect_url: this.route('login')}); + this.$store.dispatch('userAuthentication', {access_token: '', redirect_url: [7, 8].includes(this.$store.getters.getCompanyModuleType) ? this.route('last_mile_delivery.login') : this.route('login') }); this.$store.dispatch('updateIfCreateNewOrder',''); }, errorHandler(){ - this.$store.dispatch('userAuthentication', {access_token: '', redirect_url: this.route('login')}); + this.$store.dispatch('userAuthentication', {access_token: '', redirect_url: [7, 8].includes(this.$store.getters.getCompanyModuleType) ? this.route('last_mile_delivery.login') : this.route('login') }); } } } diff --git a/resources/assets/vue/components/accounts/forms/LoginFormComponent.vue b/resources/assets/vue/components/accounts/forms/LoginFormComponent.vue index a88815cf..8db903db 100644 --- a/resources/assets/vue/components/accounts/forms/LoginFormComponent.vue +++ b/resources/assets/vue/components/accounts/forms/LoginFormComponent.vue @@ -25,7 +25,7 @@
{{item.contact.reference}}
+{{item.contact.phone}}
+{{item.street_one+' '+(item.street_two ? item.street_two : '')+', '+ item.district.name+', '+item.post_code+' '+item.state.name+', '+item.country.name}}
+Place an order with us, and attach our label to your parcel.
+
-
-
-
- {{item.length}}
- -Items
+{{parameters.packing_list.description}}
+{{ parameters.packing_list.type === '0' ? 'Package' : parameters.packing_list.type === '1' ? 'Pallet' : 'Documents'}} X {{parameters.packing_list.quantity}} - {{parameters.packing_list.weight}}KG
+There are no items added yet!
+From
+There are no address selected yet!
+To
+There are no address selected yet!
+| + | Order Number | +Marking | +Service Type | +Parcel Type | +Item Content | +Quantity | +Weight | +Sender Name | +Sender Address | +Sender Phone | +Receiver Name | +Receiver Address | +Receiver Phone | +
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| + | {{data.reference}} | +{{data.company_module.marking}} | +Walk In | +{{data.packingList.type === 0 ? 'Package' : data.packingList.type === 1 ? 'Pallet' : 'Documents'}} | +{{data.packingList.description}} | +{{data.packingList.quantity}} | +{{(Math.ceil(parseFloat((data.packingList.weight * 10))) / 10).toFixed(1)}}KG | +{{data.sender_address.contact.reference}} | +{{data.sender_address.street_one+' '+(data.sender_address.street_two ? data.sender_address.street_two : '')+', '+ data.sender_address.district.name+', '+data.sender_address.post_code+' '+data.sender_address.state.name+', '+data.sender_address.country.name}} | +{{data.sender_address.contact.phone}} | +{{data.delivery_address.contact.reference}} | +{{data.delivery_address.street_one+' '+(data.delivery_address.street_two ? data.delivery_address.street_two : '')+', '+ data.delivery_address.district.name+', '+data.delivery_address.post_code+' '+data.delivery_address.state.name+', '+data.delivery_address.country.name}} | +{{data.delivery_address.contact.phone}} | +
orders list
+