Merge branch 'master' into 'task/EXC-337'

# Conflicts:
#   routes/web.php
This commit is contained in:
omair saleh
2021-09-27 09:10:46 +00:00
46 changed files with 1725 additions and 61 deletions
+3 -3
View File
@@ -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,
@@ -0,0 +1,105 @@
<?php
namespace App\Classes\Modules\Accounts\ControllersLogic;
use App\Classes\Exceptions\AccessForbiddenException;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\Accounts\Processors\AuthenticationProcessor;
use App\Classes\Modules\Accounts\Processors\CreateUserProcessor;
use App\Classes\Modules\Companies\Processors\AssignEmployeeProcessor;
use App\Classes\Modules\Companies\DataTransferObjects\EmploymentObject;
use App\Classes\Modules\Companies\Services\FetchesCompany;
use App\Classes\Modules\Contacts\DataTransferObjects\ContactObject;
use App\Classes\Modules\Contacts\Processors\CreateContactProcessor;
use App\Classes\ValueObjects\Constants\ApprovalStatus;
use App\Classes\ValueObjects\Constants\RoleTypes;
use App\Models\Company;
use App\Models\CompanyModule;
use App\Models\User;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\App;
class CreateInvitedCustomerLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification(): array
{
return [
'title' => '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));
}
}
@@ -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);
@@ -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,
@@ -0,0 +1,67 @@
<?php
namespace App\Classes\Modules\PackingLists\ControllersLogic\Containers;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\PackingLists\Services\Containers\FetchesContainer;
use App\Classes\Modules\PackingLists\Services\FetchesPackingList;
use App\Http\Resources\ContainerResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class AssignPackingListContainerLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => '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());
}
}
}
@@ -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));
@@ -0,0 +1,66 @@
<?php
namespace App\Classes\Modules\PackingLists\ControllersLogic\Containers;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\PackingLists\Services\Containers\ListsContainers;
use App\Classes\Modules\PackingLists\Standards\Rules\Containers\CanListContainers;
use App\Classes\Modules\PackingLists\Processors\FetchInboundCustomClearedProcessor;
use App\Http\Resources\ContainerResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class InboundCustomClearedLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => '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);
}
}
@@ -0,0 +1,68 @@
<?php
namespace App\Classes\Modules\PackingLists\ControllersLogic\Packages;
use App\Classes\General\Abstracts\AbstractControllerLogic;
use App\Classes\Modules\PackingLists\Services\Packages\SwitchesPackagePackingList;
use App\Classes\Modules\PackingLists\Services\Packages\FetchesPackage;
use App\Classes\Modules\PackingLists\Services\FetchesPackingList;
use App\Classes\Modules\PackingLists\DataTransferObjects\PackageObject;
use App\Http\Resources\PackageResource;
use ErrorException;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class SwitchPackagePackingListLogic extends AbstractControllerLogic
{
/**
* @return array
*/
protected function notification():array {
return [
'title' => '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));
}
}
@@ -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);
@@ -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);
@@ -0,0 +1,105 @@
<?php
namespace App\Classes\Modules\PackingLists\Processors;
use App\Classes\Modules\Orders\Services\FetchesDataFromVTPortal;
use App\Classes\Modules\Schedules\DataTransferObjects\ScheduleObject;
use App\Classes\Modules\Schedules\Services\CreatesSchedule;
use App\Classes\Modules\Transports\DataTransferObjects\TransportObject;
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\PackingListType;
use App\Classes\ValueObjects\Constants\TransportType;
use App\Models\PackingList;
use App\Models\Transport;
use App\Models\Container;
use Carbon\Carbon;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Facades\Log;
class FetchInboundCustomClearedProcessor
{
/** @var FetchesDataFromVTPortal */
private $fetchesDataFRomVTPortal;
/** @var CreatesTransport */
private $createsTransport;
/** @var CreatesSchedule */
private $createsSchedule;
/** @var UpdatesContractObligation */
private $updatesContractObligations;
/**
* FetchDeliveryListFromVTPortalProcessor constructor.
* @param FetchesDataFromVTPortal $fetchesDataFRomVTPortal
* @param CreatesTransport $createsTransport
* @param CreatesSchedule $createsSchedule
* @param UpdatesContractObligation $updatesContractObligations
*/
public function __construct(FetchesDataFromVTPortal $fetchesDataFRomVTPortal, CreatesTransport $createsTransport, CreatesSchedule $createsSchedule, UpdatesContractObligation $updatesContractObligations)
{
$this->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 [];
}
}
@@ -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);
@@ -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);
@@ -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);
@@ -0,0 +1,25 @@
<?php
namespace App\Classes\Modules\PackingLists\Services\Packages;
use App\Classes\General\Eloquent\AbstractUpdateRecord;
use App\Models\Package;
use App\Models\PackingList;
class SwitchesPackagePackingList extends AbstractUpdateRecord
{
/**
* @param Package $model
* @param int $status
* @return \Illuminate\Database\Eloquent\Model
* @throws \App\Classes\Exceptions\MalformedRequestException
*/
public function execute(Package $model, PackingList $packing_list) {
$model->packing_list_id = $packing_list->id;
return $this->handler($model);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\Accounts;
use App\Classes\Modules\Accounts\ControllersLogic\CreateInvitedCustomerLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class CreateInvitedCustomerController
{
/**
* @param Request $request
* @param CreateInvitedCustomerLogic $createCustomerLogic
* @return JsonResponse
*/
public function create(Request $request, CreateInvitedCustomerLogic $createCustomerLogic): JsonResponse
{
return $createCustomerLogic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\PackingLists\Containers;
use App\Classes\Modules\PackingLists\ControllersLogic\Containers\AssignPackingListContainerLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class AssignPackingListContainerController
{
/**
* @param Request $request
* @param AssignPackingListContainerLogic $logic
* @return JsonResponse
*/
public function assign(Request $request, AssignPackingListContainerLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\PackingLists\Containers;
use App\Classes\Modules\PackingLists\ControllersLogic\Containers\InboundCustomClearedLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class InboundCustomClearedController
{
/**
* @param Request $request
* @param InboundCustomClearedLogic $logic
* @return JsonResponse
*/
public function list(Request $request, InboundCustomClearedLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
@@ -0,0 +1,20 @@
<?php
namespace App\Http\Controllers\PackingLists\Packages;
use App\Classes\Modules\PackingLists\ControllersLogic\Packages\SwitchPackagePackingListLogic;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class SwitchPackagePackingListController
{
/**
* @param Request $request
* @param SwitchPackagePackingListLogic $logic
* @return JsonResponse
*/
public function switch(Request $request, SwitchPackagePackingListLogic $logic): JsonResponse {
return $logic->execute($request);
}
}
+2
View File
@@ -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,
+2 -1
View File
@@ -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()),
+36
View File
@@ -0,0 +1,36 @@
<?php
namespace App\Models\Exchange;
use App\Models\AbstractModel;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
/**
* Class Company
* @package App\Models
*
* @property \App\Models\Country country_id
* @property \App\Models\State state_id
* @property \App\Models\District district_id
* @property string postcode
* @property string street_one
* @property string street_two
* @property integer billing_type
*/
class Company extends AbstractModel
{
protected $connection = 'exchange_db';
protected $table = 'companies';
/**
* @return belongsToMany
*/
public function employees(): belongsToMany
{
return $this->belongsToMany(User::class, (new Employee())->getTable(), 'company_id','user_id');
}
}
+37
View File
@@ -0,0 +1,37 @@
<?php
namespace App\Models\Exchange;
use App\Models\AbstractModel;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasOne;
/**
* Class CompanyEmployee
* @package App\Models
*
* @property \App\Models\Company company_id
* @property \App\Models\User user_id
*/
class Employee extends AbstractModel
{
protected $connection = 'exchange_db';
protected $table = 'employees';
/**
* @return HasMany
*/
public function company(): HasMany
{
return $this->HasMany(Company::class, 'company_id', 'id');
}
/**
* @return \Illuminate\Database\Eloquent\Relations\HasOne
**/
public function user(): HasOne
{
return $this->hasOne(User::class, 'user_id', 'id');
}
}
+19
View File
@@ -0,0 +1,19 @@
<?php
namespace App\Models\Exchange;
use App\Models\AbstractModel;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
class User extends AbstractModel {
protected $connection = 'exchange_db';
/**
* @return belongsToMany
*/
public function company(): belongsToMany
{
return $this->belongsToMany(Company::class, (new Employee())->getTable(), 'user_id', 'company_id');
}
}
+19 -1
View File
@@ -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'),
@@ -0,0 +1,76 @@
<?php
namespace Database\Seeders;
use App\Classes\Modules\Companies\DataTransferObjects\EmploymentObject;
use App\Classes\Modules\Companies\Processors\AssignEmployeeProcessor;
use App\Models\CompanyConnection;
use App\Models\Exchange\Company as ExchangeCompany;
use App\Models\User;
use Illuminate\Database\Seeder;
use Illuminate\Support\Facades\DB;
class CompanyEmployeesTableSeeder extends Seeder
{
/** @var AssignEmployeeProcessor */
private $assignEmployeeProcessor;
/**
* CompanyEmployeesTableSeeder constructor.
* @param AssignEmployeeProcessor $assignEmployeeProcessor
*/
public function __construct(AssignEmployeeProcessor $assignEmployeeProcessor)
{
$this->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();
}
}
@@ -0,0 +1,101 @@
<template>
<div class="row">
<div class="col">
<div class="row text-left" @keyup.enter="submitForm">
<div class="col">
<error-message-component class="m-b-20" :error="error"></error-message-component>
<div class="row">
<div class="col">
<div class="row" >
<div class="col">
<div class="row">
<div class="col">
<p class="bold fs-11 all-caps muted">Personal Information</p>
</div>
</div>
<div class="row m-b-15">
<div class="col p-r-5">
<validation-wrapper-component :validator="$v.parameters.name">
<label>Full Name</label>
<input class="form-control" v-model="parameters.name">
</validation-wrapper-component>
</div>
<div class="col p-l-5">
<validation-wrapper-component :validator="$v.parameters.phone">
<label>Phone</label>
<input class="form-control" v-model="parameters.phone">
</validation-wrapper-component>
</div>
</div>
<div class="row m-b-15">
<div class="col">
<validation-wrapper-component :validator="$v.parameters.email">
<label>Email</label>
<input class="form-control" v-model="parameters.email">
</validation-wrapper-component>
</div>
</div>
<div class="row m-b-15">
<div class="col p-r-5">
<validation-wrapper-component :validator="$v.parameters.password">
<label>Password</label>
<input class="form-control" type="password" v-model="parameters.password">
</validation-wrapper-component>
</div>
<div class="col p-l-5">
<validation-wrapper-component :validator="$v.parameters.password_confirmation">
<label>Password Confirmation</label>
<input class="form-control" type="password" v-model="parameters.password_confirmation">
</validation-wrapper-component>
</div>
</div>
<div class="row">
<div class="col-auto">
<button type="button" class="btn btn-sm p-t-10 p-b-10 btn-default bg-master-lighter b-rad-none" @click="$store.dispatch('toggleSection', {name: 'registrationForm', status: false})">
<div class="row align-items-center">
<div class="col-auto p-r-10">
<i class="fa fa-angle-left fs-16" style="margin-top: 1px;"></i>
</div>
<div class="col p-l-5">I already have an account</div>
</div>
</button>
</div>
<div class="col text-right">
<button type="button" class="btn btn-sm btn-block p-t-10 p-b-10 p-r-35 p-l-35 btn-primary b-rad-none p-r-30" @click="submit(route('api.account.registration.invite.register'), 'post', section, false, false)"><i class="fa fa-check fs-18 m-r-10"></i>Complete Registration</button>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import inviteRegistrationFormValidation from '../../../general/mixins/accounts/validation/inviteRegistrationFormValidation';
export default {
props: {
id: {
required: true,
type: Number
}
},
data() {
return {
error: '',
parameters : {
company_id: this.id,
name: '',
email: '',
phone: '',
password: '',
password_confirmation: '',
}
}
},
mixins: [inviteRegistrationFormValidation]
}
</script>
@@ -38,7 +38,6 @@
</template>
<script>
import registrationCheckEmailValidation from '../../../general/mixins/accounts/validation/registrationCheckEmailValidation';
import stepNavi from '../../../general/mixins/stepNavi';
export default {
data() {
return {
@@ -257,7 +257,6 @@
</template>
<script>
import registrationFormValidation from '../../../general/mixins/accounts/validation/registrationFormValidation';
import stepNavi from '../../../general/mixins/stepNavi';
export default {
data() {
return {
@@ -41,7 +41,7 @@
</div>
<div class="row align-items-center">
<div class="col">
<h6 class="no-margin fs-12">Account Owner</h6>
<h6 class="no-margin fs-12">Email Address</h6>
<h6 class="no-margin">{{item.employee.email}}</h6>
</div>
</div>
@@ -107,6 +107,17 @@
</div>
</div>
</div>
<div class="row justify-content-end m-t-5 m-b-5">
<div class="col-auto text-right">
<div class="font-heading fs-10 all-caps p-t-5 p-b-5 p-l-10 p-r-15 b-rad-sm bg-master-lighter" v-if="item.employee">
<i class="fa fa-circle text-success m-r-5"></i>Claimed
</div>
<div class="font-heading fs-10 all-caps p-t-5 p-b-5 p-l-10 p-r-15 b-rad-sm bg-master-lighter pointer" ref="copyButton" v-if="!item.employee" @click="copyUrl">
Invitation Link <i class="fa fa-clipboard text-complete m-l-5"></i>
</div>
<textarea style="position: absolute; left: -99999px;" ref="invitationLink">{{ route('company.claim', item.hash_id) }}</textarea>
</div>
</div>
</div>
</div>
</template>
@@ -114,6 +125,19 @@
<script>
import componentHandler from '../../../general/mixins/componentHandler';
export default {
methods: {
copyUrl(event) {
this.$refs.invitationLink.select();
document.execCommand('copy');
$(this.$refs.copyButton).tooltip({
title: 'Url Copied To Clipboard!',
placement: 'left',
delay: 1000
});
$(this.$refs.copyButton).tooltip('show');
}
},
mixins: [componentHandler]
}
</script>
@@ -22,6 +22,10 @@
<p class="no-margin fs-10 all-caps">ETA</p>
<p class="no-margin">{{item.transport ? item.transport.current_schedule.eta : 'n/a'}}</p>
</div>
<div class="col-auto">
<p class="no-margin fs-10 all-caps">Loaded CBM</p>
<p class="no-margin">{{ (Math.ceil((item.packing_lists.reduce((total, obj) => total + obj.packages.reduce((total, obj) => obj.cbm + total, 0), 0)) * 1000) / 1000).toFixed(3) }}</p>
</div>
<div class="col">
<p class="no-margin fs-10 all-caps">Status</p>
<p class="no-margin bold" :class="{'text-success': item.status === 3, 'text-complete': item.status !== 3}">{{item.status === 3 ? 'Un-stuffed' : 'In Progress'}}</p>
@@ -30,6 +34,9 @@
<div class="btn btn-default no-border" @click="expanded = !expanded">
<i class="fa" :class="{'fa-angle-down': !expanded, 'fa-angle-up': expanded}" ></i>
</div>
<a class="btn btn-default no-border" :href="route('container.show', item.container_reference)">
<i class="fa fa-angle-right fa-fw"></i>
</a>
</div>
</div>
</div>
@@ -0,0 +1,255 @@
<template>
<div class="row">
<div class="col">
<div class="row align-items-center">
<div class="col bg-master-light rounded padding-20 m-l-10 m-r-10">
<div class="row d-flex justify-content-between align-items-center">
<div class="col-auto">
<div class="row">
<div class="col">
<h5 class="bold m-b-0">{{container.container_reference}}</h5>
<p>{{container.container_number}}</p>
</div>
</div>
<div class="row">
<div class="col">
<p class="m-t-0">Container Type: {{container.container_type}}</p>
</div>
</div>
</div>
<div class="col-auto">
<div class="row">
<div class="col">
<h5 class="m-b-0 large-text normal l-20">ETD</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="m-t-0 large-text">{{container.transport.current_schedule.etd}}</h5>
</div>
</div>
</div>
<div class="col-auto">
<div class="row">
<div class="col">
<h5 class="m-b-0 large-text normal l-20">ETA</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="m-t-0 large-text">{{container.transport.current_schedule.eta}}</h5>
</div>
</div>
</div>
<div class="col-auto">
<div class="row">
<div class="col">
<h5 class="m-b-0 large-text normal l-20">Loading Place</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="m-t-0 large-text">SHANGHAI, CHINA</h5>
</div>
</div>
</div>
<div class="col-auto">
<div class="row">
<div class="col">
<h5 class="m-b-0 large-text normal l-20">Destination port</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="m-t-0 large-text">PORT KLANG NORTH PORT, MALAYSIA</h5>
</div>
</div>
</div>
<div class="col-auto p-r-50">
<div class="row">
<div class="col">
<h5 class="m-b-0 large-text normal l-20">Status</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="m-t-0 large-text">{{container.status}}</h5>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row m-t-20">
<div class="col bg-master-light rounded m-l-10 m-r-10">
<div class="row align-items-center p-t-10 p-b-10 padding-10">
<div class="col-auto">
<div class="row">
<div class="col">
<h5 class="bold m-b-0">Package List</h5>
<p>(Total 77 Package in this container)</p>
</div>
</div>
</div>
<div class="col-auto">
<p class="m-b-0">{{ containerFilledPercentage }}%</p>
</div>
<div class="batteryContainer">
<div class="batteryOuter">
<div id="batteryLevel" :style="{ width: svgLenght + 'px' }"></div>
</div>
<div class="batteryBump"></div>
</div>
<div class="col">
<div class="btn btn-default">
Add Package
</div>
<div class="btn btn-default">
Export List
</div>
<div class="btn btn-default">
Print Custom
</div>
</div>
<div class="col-auto p-r-30">
<h5 class="m-b-0 large-text normal l-20">Custom Declaration Status</h5>
<h5 class="m-t-0 text-right">__</h5>
</div>
</div>
<div class="row">
<div class="col padding-20 p-l-40 p-r-50">
<div class="row" v-for="packingList in container.packing_lists">
<div class="col">
<div class="row">
<div class="col">
<div class="row b-a b-grey bg-master-lightest rounded align-items-center m-b-15 p-t-10 p-b-10" v-for="package_item in packingList.packages">
<div class="col">{{package_item.description}}</div>
<div class="col">Quantity: {{package_item.quantity}}</div>
<div class="col">cbm:{{ package_item.cbm }}</div>
<div class="col">Remark</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row m-t-10">
<div class="col">
<div class="row">
<div class="col" style="height: 300px;">
<div class="row h-100">
<div class="col">
<h5 class="m-b-5 large-text bold l-20">Timeline:</h5>
<div class="row h-100 p-l-10 p-r-10">
<div class="col rounded bg-master-lighter padding-15">
Timeline
</div>
</div>
</div>
</div>
</div>
<div class="col">
<div class="row">
<div class="col">
<h5 class="m-b-5 large-text bold l-20">Comments:</h5>
<div class="row p-l-10 p-r-10">
<div class="col rounded bg-master-lighter padding-15">
Comments
</div>
</div>
</div>
</div>
<div class="row m-t-15">
<div class="col">
<div class="row p-l-10 p-r-10">
<div class="col">
<h5 class="m-b-5 large-text bold l-20">Related documents:</h5>
</div>
<div class="co-auto">
<div class="btn justify-content bg-master-light">
<i class="fa fa-upload m-r-10" ></i>Upload Documents
</div>
</div>
</div>
<div class="row p-l-10 p-r-10">
<div class="col rounded bg-master-lighter padding-15">
documents
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
props: {
id: {
type: Number,
required: true,
}
},
data(){
return {
section: 'containerPofileSection',
isLoading: true,
container: null,
expanded: false,
totalCBM: 6,
CBMcapacity: 30,
svgLenght: 0,
svgLenghtSquare: 0,
confirmLanding: false,
}
},
computed: {
pendingQueue () {
return this.$store.getters.isInCompleteQueue(this.section);
},
containerFilledPercentage() {
this.svgLenght = this.totalCBM / this.CBMcapacity * 25;
this.svgLenghtSquare = this.totalCBM / this.CBMcapacity * 100 -2;
return this.totalCBM / this.CBMcapacity * 100;
}
// totalCbm () {
// let totalCbm = 0;
// return this.container.packing_lists.map(function(packing_list){
// totalCbm += packing_list.packages.reduce((total, obj) => obj.quantity + total, 0);
// })
// }
},
watch: {
pendingQueue(inComplete){
if(inComplete){
this.fetchCompany();
}
}
},
created(){
this.$store.dispatch('updateListQueue', {'name': this.section});
},
methods: {
fetchCompany(){
this.isLoading = true;
this.submit(route('api.packing_list.container.show', this.id), 'get', this.section, false, false)
},
successHandler(response){
this.$store.dispatch('completeList', {'name': this.section, 'data': []});
this.isLoading = false;
this.container = response.payload.data;
},
confirmStatus(){
this.confirmLanding = true;
console.log(this.confirmLanding);
}
}
}
</script>
@@ -0,0 +1,131 @@
<template>
<div class="row m-b-15 m-l-5 m-r-10">
<div class="col bg-master-lightest rounded" :class="{'b-gray': !selected, 'b-primary': selected, 'bg-primary-lighter': selected}">
<div class="row">
<div class="col padding-20">
<div class="row align-items-center">
<div class="col-auto pointer align-items-center" @click="selected = !selected">
<i class="fa fs-30 fa-fw" :class="{'fa-square-o': !selected, 'fa-check-square': selected, 'text-primary':selected}" ></i>
</div>
<div class="col">
<h5 class="no-margin">{{item.country.id}}05052021</h5>
</div>
<div class="col">
<h5 class="no-margin">Invoice Date Invoice Date</h5>
</div>
<div class="col">
<h5 class="no-margin">Status</h5>
</div>
<div class="col">
<h5 class="no-margin">Amount</h5>
</div>
<div class="col-auto">
<div class="btn bg-grey no-border" @click="expanded = !expanded">
<i class="fa" :class="{'fa-angle-down': !expanded, 'fa-angle-up': expanded}" ></i>
</div>
</div>
</div>
</div>
</div>
<div class="row b-t b-grey p-t-10" v-show="expanded">
<div class="col p-b-10">
<div class="row">
<div class="col p-l-20 p-r-20 p-t-10 p-b-10">
<div class="row align-items-center">
<div class="col-auto invisible">
<i class="fa fs-30 fa-fw" :class="{'fa-square-o': !selected, 'fa-check-square': selected, 'text-primary':selected}" ></i>
</div>
<div class="col">
<div class="row">
<div class="col">
<h5 class="m-b-0">Carrier Tracking Number</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="semi-bold m-t-0 m-b-0 large-text">#1zbr06tw403742920</h5>
</div>
</div>
</div>
<div class="col">
<div class="row">
<div class="col">
<h5 class="m-b-0">Due Date</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="semi-bold m-t-0 m-b-0 large-text">11.04.2021</h5>
</div>
</div>
</div>
<div class="col">
<div class="row">
<div class="col">
<h5 class="semi-bold m-t-0 m-b-0 large-text">Outstanding</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="semi-bold m-t-0 m-b-0 large-text">RM0.00</h5>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col p-l-20 p-r-20 p-t-10 p-b-10">
<div class="row align-items-center">
<div class="col-auto invisible">
<i class="fa fs-30 fa-fw" :class="{'fa-square-o': !selected, 'fa-check-square': selected, 'text-primary':selected}" ></i>
</div>
<div class="col">
<div class="row">
<div class="col">
<h5 class="m-b-0 normal-text">This package was delivered by</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="semi-bold m-t-0 m-b-0 large-text">#1zbr06tw403742920</h5>
</div>
</div>
</div>
<div class="col">
<div class="row">
<div class="col">
<h5 class="m-b-0">Date Paid</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="semi-bold m-t-0 m-b-0 large-text">21.01.2021</h5>
</div>
</div>
</div>
<div class="col">
<div class="btn btn-outline-complete btn-lg">
Invoice Detail
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import componentHandler from '../../../general/mixins/componentHandler';
export default {
data(){
return {
expanded: false,
selected: false,
}
},
mixins: [componentHandler]
}
</script>
@@ -0,0 +1,94 @@
<template>
<div class="row padding-15">
<div class="col rounded p-l-20 p-r-20">
<div class="row bg-master-light rounded align-items-center padding-20">
<div class="col">
<div class="row m-b-5">
<div class="col">
<div class="row">
<div class="col">
<h5 class="m-b-0 m-t-0 font-weight-normal">Package ID:</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="m-b-0 m-t-0">9956665659-MY5568978458</h5>
</div>
</div>
</div>
</div>
<div class="row m-b-5">
<div class="col">
<div class="row">
<div class="col">
<h5 class="m-b-0 m-t-0 font-weight-normal">Package Size:</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="m-b-0 m-t-0">52x65x35 CM / 10KG</h5>
</div>
</div>
</div>
</div>
</div>
<div class="col">
<div class="row m-b-5">
<div class="col">
<div class="row">
<div class="col">
<h5 class="m-b-0 m-t-0 font-weight-normal">Delivery Address</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="m-b-0 m-t-0">Home</h5>
</div>
</div>
</div>
</div>
<div class="row m-b-5">
<div class="col">
<div class="row">
<div class="col">
<h5 class="m-b-0 m-t-0 font-weight-normal">Delivery Estimation</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="m-b-0 m-t-0">05/05/2022</h5>
</div>
</div>
</div>
</div>
</div>
<div class="col">
<div class="row">
<div class="col">
<h5 class="m-b-0 m-t-0">Shipping Cost</h5>
</div>
</div>
<div class="row">
<div class="col">
<h3 class="m-b-0 m-t-0">RM2800</h3>
</div>
</div>
</div>
<div class="col-auto pointer">
<div class="btn btn-lg btn-default btn-rounded"><i class="fa fa-check lightest lh-50"></i></div>
</div>
</div>
</div>
</div>
</template>
<script>
import componentHandler from '../../../general/mixins/componentHandler';
export default {
data(){
return {
expanded: false,
}
},
mixins: [componentHandler]
}
</script>
@@ -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]
}
+4 -1
View File
@@ -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(){
-22
View File
@@ -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) {
},
}
@@ -0,0 +1,23 @@
@extends('layouts.base_login')
@section('inner_content')
<div class="row h-100 no-margin align-items-center justify-content-center">
<div class="col col-md-10">
<div class="row m-b-50">
<div class="col-8 col-md-6">
<img class="w-100" src="{{asset('images/cief-izyim-logo.png')}}" alt="">
</div>
</div>
<div class="row">
<div class="col">
<loading-component style="height: 350px;" key="1" color="primary" v-show="$store.getters.isLoading('loginSection')"></loading-component>
<div class="row justify-content-center" v-show="!$store.getters.isLoading('loginSection')">
<div class="col">
<invite-registration-form-component section="loginSection" :id={{ $id }}></invite-registration-form-component>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
@@ -0,0 +1,128 @@
@extends('layouts.base_portal')
@section('inner_content')
<div class="row">
<div class="col">
<div class="row">
<div class="col-12 col-sm-12 col-md-9">
<div class="row m-b-15 m-l-5 m-r-10">
<div class="col b-a b-grey rounded bg-master-light">
<div class="row">
<div class="col padding-20">
<div class="row align-items-center justify-conten-center">
<div class="col-auto pointer">
<i class="fa fs-30 fa-fw fa-square-o"></i>
</div>
<div class="col">
<h5 class="no-margin font-heading">Invoice No</h5>
</div>
<div class="col">
<h5 class="no-margin">Invoice Date</h5>
</div>
<div class="col">
<h5 class="no-margin">Status</h5>
</div>
<div class="col">
<h5 class="no-margin">Amount</h5>
</div>
<div class="col-auto invisible">
<div class="btn btn-default no-border">
<i class="fa fa-angle-up"></i>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<list-component section="containerListSection" :endpoint="route('api.address.district.list')">
<template slot="list" slot-scope="{data}">
<payments-billing-components :data="data"></payments-billing-components>
</template>
</list-component>
</div>
<div class="col-12 col-sm-12 col-md-3">
<div class="row align-items-center">
<div class="col b-a b-grey rounded padding-25">
<div class="row">
<div class="col">
<h6 class="semi-bold muted">Payment Summary</h6>
</div>
</div>
<div class="row align-items-center justify-content-center">
<div class="col-auto">
<div class="padding-5">
<i class="fa fa-angle-up"></i>
</div>
</div>
<div class="col p-l-0">
<h6 class="semi-bold text-primary">2 Invoice Selected</h6>
</div>
</div>
<div class="row">
<div class="col">
<div class="row">
<div class="col-auto">
<h6 class="no-margin">x1</h6>
</div>
<div class="col">
<h6 class="no-margin">lorem ipsum</h6>
</div>
<div class="col-auto">
<h6 class="no-margin">52x62x635 CM</h6>
</div>
</div>
<div class="row">
<div class="col-auto">
<h6 class="no-margin">x1</h6>
</div>
<div class="col">
<h6 class="no-margin">lorem ipsum</h6>
</div>
<div class="col-auto">
<h6 class="no-margin">52x62x635 CM</h6>
</div>
</div>
</div>
</div>
<hr>
<div class="row">
<div class="col">
<h6 class="normal m-t-5 m-b-5">Shipping Fee</h6>
</div>
<div class="col-auto">
<h6 class="normal m-t-5 m-b-5">RM 212.15</h6>
</div>
</div>
<div class="row">
<div class="col">
<h6 class="normal m-t-5 m-b-5">Serrvice Fee</h6>
</div>
<div class="col-auto">
<h6 class="normal m-t-5 m-b-5">RM 41.25</h6>
</div>
</div>
<div class="row">
<div class="col">
<h6 class="normal m-t-5 m-b-5">Discount</h6>
</div>
<div class="col-auto">
<h6 class="normal m-t-5 m-b-5">RM 0.00</h6>
</div>
</div>
<hr>
<div class="row">
<div class="col">
<h6 class="normal">Total Payments</h6>
</div>
<div class="col-auto">
<h6 class="text-primary bold">RM 3300.00</h6>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
@@ -0,0 +1,120 @@
@extends('layouts.base_portal')
@section('inner_content')
<div class="row">
<div class="col-12 col-sm-12 col-md-8">
<div class="row h-100 padding-15">
<div class="col rounded bg-master-lighter">
<div class="row align-items-center h-100 padding-20">
<div class="col">
<h2><span class="normal">Shipping ID:</span> 05052021-25-0100</h2>
</div>
</div>
</div>
</div>
</div>
<div class="col-12 col-sm-12 col-md-4">
<div class="row h-100 padding-15">
<div class="col rounded bg-master-lighter padding-20">
<h6 class="normal">Discount Code</h6>
<div class="row">
<div class="col bg-master-lightest rounded m-l-20 m-r-20 padding-15">
<div class="row align-items-center">
<div class="col">
<h6>Free 10</h6>
</div>
<div class="col-auto">
<div class="btn rounded bg-master-light">Removed</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-12 col-sm-12 col-md-8">
<list-component section="containerListSection" :endpoint="route('api.address.district.list')">
<template slot="list" slot-scope="{data}">
<shipping-queue-components :data="data"></shipping-queue-components>
</template>
</list-component>
</div>
<div class="col-12 col-sm-12 col-md-4">
<div class="row padding-15">
<div class="col rounded p-l-20 p-r-20">
<div class="row">
<div class="col bg-master-light rounded padding-30">
<div class="row">
<div class="col">
<h3 class="normal">Shipping cost estimation</h3>
</div>
</div>
<div class="row">
<div class="col m-t-10 m-b-10">
<div class="row">
<div class="col">
<h5 class="m-t-0 m-b-5">Shipping Cost: RM8400</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="m-t-0 m-b-5">SST(6%): RM600</h5>
</div>
</div>
<div class="row">
<div class="col">
<h5 class="m-t-0 m-b-5">Discount: RM100</h5>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="row">
<div class="col">
<h5 class="no-margin">Total Cost: </h5>
</div>
</div>
<div class="row">
<div class="col">
<h4 class="no-margin normal">RM7300</h4>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col p-t-20 p-b-20">
<div class="row align-items-center">
<div class="col">
<div class="row">
<div class="col">
<p class="no-margin normal-text">Group my products with same destination</p>
</div>
</div>
<div class="row">
<div class="col">
<p class="no-margin normal-text">You will get grouped package at once if possible</p>
</div>
</div>
</div>
<div class="col-auto">
<div class="btn bg-master-light"><i class="fa fa-check lightest"></i></div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col">
<div class="btn w-100 bg-master text-white p-t-15 p-b-15 large-text">
Checkout
</div>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection
@@ -0,0 +1,4 @@
@extends('layouts.base_portal')
@section('inner_content')
<container-profile-section-component :id="{{$id}}"></container-profile-section-component>
@endsection
File diff suppressed because one or more lines are too long
+49 -1
View File
@@ -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",
+1
View File
@@ -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 () {
+4
View File
@@ -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');
+20 -19
View File
@@ -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');