diff --git a/app/Classes/Jobs/Commands/V2/YD/FetchContainersFromYdPortalV2CommandJob.php b/app/Classes/Jobs/Commands/V2/YD/FetchContainersFromYdPortalV2CommandJob.php
new file mode 100644
index 00000000..068fa727
--- /dev/null
+++ b/app/Classes/Jobs/Commands/V2/YD/FetchContainersFromYdPortalV2CommandJob.php
@@ -0,0 +1,37 @@
+packingList = $packingList;
+ }
+
+
+ public function handle()
+ {
+ Log::info('Processing FetchContainersFromYdPortalV2CommandJob');
+ $processor = app(FetchContainersFromYdPortalV2Processor::class);
+ $processor->execute($this->packingList);
+ }
+}
diff --git a/app/Classes/Jobs/Commands/V2/YD/FetchContainersUpdatesFromYdPortalV2CommandJob.php b/app/Classes/Jobs/Commands/V2/YD/FetchContainersUpdatesFromYdPortalV2CommandJob.php
new file mode 100644
index 00000000..c48b3d07
--- /dev/null
+++ b/app/Classes/Jobs/Commands/V2/YD/FetchContainersUpdatesFromYdPortalV2CommandJob.php
@@ -0,0 +1,36 @@
+container = $container;
+ }
+
+ public function handle()
+ {
+ Log::info('Processing FetchContainersUpdatesFromYdPortalV2CommandJob');
+ $processor = app(FetchContainersUpdatesFromYdPortalV2Processor::class);
+ $processor->execute($this->container);
+ }
+}
diff --git a/app/Classes/Jobs/Commands/V2/YD/FetchDeliveryUpdatesFromYdPortalV2CommandJob.php b/app/Classes/Jobs/Commands/V2/YD/FetchDeliveryUpdatesFromYdPortalV2CommandJob.php
new file mode 100644
index 00000000..936ba679
--- /dev/null
+++ b/app/Classes/Jobs/Commands/V2/YD/FetchDeliveryUpdatesFromYdPortalV2CommandJob.php
@@ -0,0 +1,36 @@
+packingList = $packingList;
+ }
+
+ public function handle()
+ {
+ Log::info('Processing FetchDeliveryUpdatesFromYdPortalV2CommandJob');
+ $processor = app(FetchDeliveryUpdatesFromYdPortalV2Processor::class);
+ $processor->execute($this->packingList);
+ }
+}
diff --git a/app/Classes/Jobs/Commands/V2/YD/FetchPackingListsFromYdPortalV2CommandJob.php b/app/Classes/Jobs/Commands/V2/YD/FetchPackingListsFromYdPortalV2CommandJob.php
new file mode 100644
index 00000000..1f358a0d
--- /dev/null
+++ b/app/Classes/Jobs/Commands/V2/YD/FetchPackingListsFromYdPortalV2CommandJob.php
@@ -0,0 +1,34 @@
+startDate = $startDate;
+ $this->endDate = $endDate;
+ }
+
+ public function handle()
+ {
+ Log::info('Processing FetchPackingListsFromYdPortalV2CommandJob for start date: ' . $this->startDate. ', and end date: ' . $this->endDate);
+ $processor = app(FetchPackingListsFromYdPortalV2Processor::class);
+ $processor->execute($this->startDate, $this->endDate);
+ }
+}
diff --git a/app/Classes/Modules/PackingLists/Processors/V2/FetchContainersFromYdPortalV2Processor.php b/app/Classes/Modules/PackingLists/Processors/V2/FetchContainersFromYdPortalV2Processor.php
new file mode 100644
index 00000000..1be03d14
--- /dev/null
+++ b/app/Classes/Modules/PackingLists/Processors/V2/FetchContainersFromYdPortalV2Processor.php
@@ -0,0 +1,171 @@
+fetchesDataFRomYDPortal = $fetchesDataFRomYDPortal;
+ $this->createsTransport = $createsTransport;
+ $this->createsSchedule = $createsSchedule;
+ $this->fetchesContainer = $fetchesContainer;
+ $this->createContainerProcessor = $createContainerProcessor;
+ $this->packingListToPerfexCRMProcessor = $packingListToPerfexCRMProcessor;
+ }
+
+
+ /**
+ * @param PackingList $packingList
+ * @return void
+ * @throws MalformedRequestException
+ * @throws AccessForbiddenException
+ * @throws RequestValidationException
+ */
+ public function execute(PackingList $packingList)
+ {
+ Log::info('FetchContainersFromYdPortalV2Processor with packingList ' . json_encode($packingList) );
+ return;
+
+ $time_start = microtime(true);
+
+ $containerReference = null;
+ $loadingDate = null;
+ $etd = null;
+ $eta = null;
+
+ $trackingRequest = $this->fetchesDataFRomYDPortal->clientRequest('http://www.yd-wl.com/api/ApiTracking.ashx', 'GET', [
+ 'trakingno' => $packingList->reference
+ ]);
+
+ $rows = $this->fetchesDataFRomYDPortal->getResponseBody($trackingRequest);
+
+ if(!$rows->data){
+ return;
+ }
+
+ foreach (array_reverse($rows->data) as $trackingRow) {
+ if (strpos($trackingRow->tracking, '货物装柜完成。') !== false) {
+ $tracking = explode(':', $trackingRow->tracking);
+ $containerReference = explode('预计到港时间', $tracking[1])[0];
+ $loadingDate = Carbon::parse($trackingRow->trackingtime);
+ $etd = Carbon::parse($tracking[2])->subDays(5);
+ $eta = Carbon::parse($tracking[2]);
+ }
+ }
+
+ if($containerReference) {
+ try {
+ $container = $this->fetchesContainer->execute(['reference' => $containerReference]);
+ $container->packingLists()->detach($packingList);
+ $container->packingLists()->attach($packingList);
+ } catch (ResourceNotFoundException $exception){
+
+ if(!($packingList->owner instanceof Order)) return;
+
+ $originWarehouse = $packingList->owner->orderRoles()->where('role_id', '=', OrderRoleTypes::ORIGIN_WAREHOUSE)->first()->appointee;
+
+
+ $containerObject = new ContainerObject($containerReference, '', '', ContainerTypes::FORTY_FEET_DRY_CONTAINER, $loadingDate, ApprovalStatus::PENDING_VERIFICATION);
+
+ /** @var Container $container */
+ $container = $this->createContainerProcessor->execute($containerObject, $originWarehouse);
+
+ $container->packingLists()->detach($packingList);
+ $container->packingLists()->attach($packingList);
+
+ if(config('perfexcrm.is_enabled') == 'true'){
+ $this->packingListToPerfexCRMProcessor->execute($packingList, PerfexCRMTasksYDStages::LOAD_CONTAINER);
+ }
+
+ $transport = $container->transports()->first();
+
+ if(!$transport){
+ $transportObject = new TransportObject(TransportType::SEA, null, null, $etd, null, ApprovalStatus::APPROVED);
+ /** @var Transport $transport */
+ $transport = $this->createsTransport->execute($transportObject, $container);
+ $this->createsSchedule->execute($transport, new ScheduleObject($etd, $eta, ApprovalStatus::APPROVED));
+ }
+ }
+ }
+
+ $time_end = microtime(true);
+
+ $execution_time = ($time_end - $time_start)/60;
+
+ echo 'successful => Total Execution Time: '.$execution_time.' Mins
';
+ }
+}
+
diff --git a/app/Classes/Modules/PackingLists/Processors/V2/FetchContainersUpdatesFromYdPortalV2Processor.php b/app/Classes/Modules/PackingLists/Processors/V2/FetchContainersUpdatesFromYdPortalV2Processor.php
new file mode 100644
index 00000000..13c903b3
--- /dev/null
+++ b/app/Classes/Modules/PackingLists/Processors/V2/FetchContainersUpdatesFromYdPortalV2Processor.php
@@ -0,0 +1,200 @@
+fetchesDataFRomYDPortal = $fetchesDataFRomYDPortal;
+ $this->updatesContractObligations = $updatesContractObligations;
+ $this->createsSchedule = $createsSchedule;
+ $this->packingListToPerfexCRMProcessor = $packingListToPerfexCRMProcessor;
+ }
+
+
+ /**
+ * @param Container $container
+ * @return void
+ * @throws MalformedRequestException
+ */
+ public function execute(Container $container)
+ {
+ Log::info('FetchContainersUpdatesFromYdPortalV2Processor with container ' . json_encode($container) );
+ return;
+
+ $time_start = microtime(true);
+
+ $packingList = $container->packingLists()->first();
+
+ $trackingRequest = $this->fetchesDataFRomYDPortal->clientRequest('http://www.yd-wl.com/api/ApiTracking.ashx', 'GET', [
+ 'trakingno' => $packingList->reference
+ ]);
+
+ $rows = $this->fetchesDataFRomYDPortal->getResponseBody($trackingRequest);
+
+ if(!$rows->data){
+ return;
+ }
+
+ $unstuffingDate = null;
+ $delayDate = null;
+ $checkShipSailDate = null;
+ $checkShipArrivalDate = null;
+
+ foreach (array_reverse($rows->data) as $trackingRow) {
+ $rescheduleETD = strpos($trackingRow->remark, '开') || strpos($trackingRow->remark, '到港');
+ $rescheduleETA = strpos($trackingRow->remark, '到港');
+
+
+ if (($rescheduleETD !== false || $rescheduleETA !== false) && strpos($trackingRow->tracking, '货物装柜完成。') === false) {
+ preg_match_all('/([0-9]+.{3})/', $trackingRow->remark, $matches);
+ $dates = collect();
+
+ foreach($matches[0] as $date){
+ try {
+ $dates->push(Carbon::parse(str_replace('.', '/', $date).Carbon::now()->format('Y')));
+ } catch (\Exception $exception) {
+ continue;
+ }
+
+ }
+
+ $rescheduleDate = $dates->sortDesc()->first();
+
+ if(!$delayDate || $rescheduleDate > $delayDate){
+ /** @var Carbon $delayDate */
+ $delayDate = $rescheduleDate;
+
+ if($rescheduleETA === false && $delayDate) {
+ $delayDate = $delayDate->addDays('5');
+ }
+ }
+
+ }
+
+ if ($trackingRow->tracking === '到港') {
+ $delayDate = Carbon::parse($trackingRow->trackingtime);
+ $checkShipArrivalDate = Carbon::parse($trackingRow->trackingtime);
+ }
+
+ if ($trackingRow->tracking === '已开船') {
+ $delayDate = Carbon::parse($trackingRow->trackingtime)->addDays('5');
+ $checkShipSailDate = Carbon::parse($trackingRow->trackingtime);
+ }
+
+ if ($trackingRow->tracking === '货物已进目的港仓库') {
+ $unstuffingDate = Carbon::parse($trackingRow->trackingtime);
+ }
+ }
+
+ dump($delayDate, $unstuffingDate);
+
+ if($checkShipSailDate){
+ //check if ship has sailed
+ if($checkShipSailDate->isPast()){
+ foreach ($container->packingLists as $packingList){
+ if(config('perfexcrm.is_enabled') == 'true'){
+ $this->packingListToPerfexCRMProcessor->execute($packingList, PerfexCRMTasksYDStages::SHIP_SAILED);
+ }
+ }
+ }
+ }
+
+ if($checkShipArrivalDate){
+ //check if ship has arrived at destination
+ if($checkShipArrivalDate->isPast()){
+ foreach ($container->packingLists as $packingList){
+ if(config('perfexcrm.is_enabled') == 'true'){
+ $this->packingListToPerfexCRMProcessor->execute($packingList, PerfexCRMTasksYDStages::SHIP_ARRIVED);
+ }
+ }
+ }
+ }
+
+ if($delayDate){
+
+ $transport = $container->transports()->first();
+
+ if(!$transport->schedules()->whereDate('eta', '>=', $delayDate)->first()) {
+ $etd = $transport->schedules()->where('status', '=', ApprovalStatus::APPROVED)->first()->etd;
+ $transport->schedules()->update(['status' => ApprovalStatus::EXPIRED]);
+ $this->createsSchedule->execute($transport, new ScheduleObject($etd, $delayDate, ApprovalStatus::APPROVED));
+ foreach ($container->packingLists as $packingList){
+ if(!($packingList->owner instanceof Order)) continue;
+ $user = $packingList->owner->companyModule->employees()->first();
+ if(app()->environment(['production'])) {
+ $user->notify(new ShipmentRescheduleEmail($user, $packingList));
+ }
+ }
+ }
+ }
+
+ if($unstuffingDate){
+ $container->update(['status' => ApprovalStatus::COMPLETED]);
+ $container->transports()->first()->update(['drop_date' => $unstuffingDate, 'status' => ApprovalStatus::COMPLETED]);
+
+ /** @var PackingList $packingList */
+ foreach($container->packingLists as $packingList){
+
+ if($packingList->status === ApprovalStatus::PENDING_VERIFICATION){
+ $packingList->status = ApprovalStatus::APPROVED;
+ $packingList->save();
+ }
+
+ if(!($packingList->owner instanceof Order)) continue;
+
+ $signature = $packingList->owner->orderRoles()->where('role_id', '=', OrderRoleTypes::SUPERVISOR)->first()->appointee->entity_sigiture;
+ foreach($packingList->steps()->where('reference', '!=', 'DELIVERY')->get() as $step){
+ $this->updatesContractObligations->execute($signature, $step->obligation_hash_id);
+ $step->update(['status' => ApprovalStatus::COMPLETED]);
+ }
+ if(config('perfexcrm.is_enabled') == 'true'){
+ $this->packingListToPerfexCRMProcessor->execute($packingList, PerfexCRMTasksYDStages::UNSTUFFING);
+ }
+ }
+ }
+
+ $time_end = microtime(true);
+
+ $execution_time = ($time_end - $time_start)/60;
+
+ echo 'successful => Total Execution Time: '.$execution_time.' Mins
';
+ }
+}
+
diff --git a/app/Classes/Modules/PackingLists/Processors/V2/FetchDeliveryUpdatesFromYdPortalV2Processor.php b/app/Classes/Modules/PackingLists/Processors/V2/FetchDeliveryUpdatesFromYdPortalV2Processor.php
new file mode 100644
index 00000000..68357cc8
--- /dev/null
+++ b/app/Classes/Modules/PackingLists/Processors/V2/FetchDeliveryUpdatesFromYdPortalV2Processor.php
@@ -0,0 +1,119 @@
+updatesContractObligations = $updatesContractObligations;
+ $this->createsTransport = $createsTransport;
+ $this->createsSchedule = $createsSchedule;
+ $this->packingListToPerfexCRMProcessor = $packingListToPerfexCRMProcessor;
+ }
+
+
+ /**
+ * @param PackingList $packingList
+ * @return void
+ * @throws MalformedRequestException
+ * @throws GuzzleException
+ */
+ public function execute(PackingList $packingList)
+ {
+ Log::info('FetchDeliveryUpdatesFromYdPortalV2Processor with packingList ' . json_encode($packingList) );
+ return;
+
+ if(!$packingList->reference) return;
+ $time_start = microtime(true);
+
+ $deliveryDate = null;
+
+ try {
+ $client = new \GuzzleHttp\Client(['cookies' => true, 'headers' => ['Cookie' => 'utc_offset=480']]);
+
+ $request = $client->request('get', 'https://main.universe.com.my/Tracking/User/Paging?sEcho=1&sTrackingNo='.$packingList->reference.'&sOrgId=sti', ['timeout' => 3]);
+ $deliveryTracking = json_decode($request->getBody()->getContents());
+ foreach (array_reverse($deliveryTracking->aaData) as $trackingRow) {
+ $trackingDate = Carbon::createFromFormat('d/m/y H:i', $trackingRow->LocalDateTime);
+ if (Str::contains($trackingRow->PublicDescription, ['delivered'])) {
+ $deliveryDate = $trackingDate;
+ }
+ }
+ } catch (\Exception $exception){
+ dump($exception);
+ Log::debug('failed to fetch delivery tracking');
+ }
+
+ if($deliveryDate){
+ $packingList->status = ApprovalStatus::COMPLETED;
+ $packingList->save();
+
+ $deliveryDate = Carbon::parse($deliveryDate);
+ $transportObject = new TransportObject(TransportType::LAND, null, null, $deliveryDate, $deliveryDate, ApprovalStatus::APPROVED);
+ /** @var Transport $transport */
+ $transport = $this->createsTransport->execute($transportObject, $packingList);
+ $this->createsSchedule->execute($transport, new ScheduleObject($deliveryDate, $deliveryDate, ApprovalStatus::APPROVED));
+
+ if(!($packingList->owner instanceof Order)) return;
+
+ $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]);
+
+ if(config('perfexcrm.is_enabled') == 'true'){
+ $this->packingListToPerfexCRMProcessor->execute($packingList, PerfexCRMTasksYDStages::DELIVERY);
+ }
+ }
+
+ $time_end = microtime(true);
+
+ $execution_time = ($time_end - $time_start)/60;
+
+ echo 'successful => Total Execution Time: '.$execution_time.' Mins
';
+
+ }
+}
+
diff --git a/app/Classes/Modules/PackingLists/Processors/V2/FetchPackingListsFromYdPortalV2Processor.php b/app/Classes/Modules/PackingLists/Processors/V2/FetchPackingListsFromYdPortalV2Processor.php
new file mode 100644
index 00000000..04209948
--- /dev/null
+++ b/app/Classes/Modules/PackingLists/Processors/V2/FetchPackingListsFromYdPortalV2Processor.php
@@ -0,0 +1,257 @@
+fetchesDataFRomYDPortal = $fetchesDataFRomYDPortal;
+ $this->fetchesOrder = $fetchesOrder;
+ $this->createPackingListProcessor = $createPackingListProcessor;
+ $this->createPackageProcessor = $createPackageProcessor;
+ $this->createsTransport = $createsTransport;
+ $this->fetchesPackingList = $fetchesPackingList;
+ $this->fetchesCompanyModule = $fetchesCompanyModule;
+ $this->unityCreateContract = $unityCreateContract;
+ $this->unityAssignContractEntity = $unityAssignContractEntity;
+ $this->unityCreateContractEntity = $unityCreateContractEntity;
+ $this->createsStep = $createsStep;
+ $this->unityActivateContract = $unityActivateContract;
+ }
+
+
+ /**
+ * @param Carbon $startDate
+ * @param Carbon $endDate
+ * @return void
+ * @throws GuzzleException
+ */
+ public function execute(Carbon $startDate = null, Carbon $endDate = null)
+ {
+ Log::info('FetchPackingListsFromYdPortalV2Processor for start date: ' . $startDate . ', and end date: ' . $endDate);
+ return;
+
+ try {
+ $orderRequest = $this->fetchesDataFRomYDPortal->clientRequest('http://www.yd-wl.com/api/GetOrderList.ashx', 'GET', [
+ 'begintime' => $startDate->timestamp,
+ 'endtime' => $endDate->timestamp,
+ ]);
+
+ $rows = $this->fetchesDataFRomYDPortal->getResponseBody($orderRequest);
+
+ if(!$rows->data) return;
+
+ foreach($rows->data as $row){
+ if(!is_numeric($row->goodcount)) continue;
+
+ $time_start = microtime(true);
+
+ $receiveDate = Carbon::parse(substr(preg_replace("/[^0-9]/", "", $row->expressno), 0, 8));
+
+ $customerno = preg_split('(-|\(|\)|\/)', $row->customerno);
+
+ $orderNumber = $customerno[array_key_last($customerno)];
+ $allow_contract = true;
+
+ try {
+ $order = $this->fetchesOrder->execute(['reference' => $orderNumber]);
+ } catch (ResourceNotFoundException $exception) {
+ try {
+ $order = $this->fetchesOrder->execute(['reference' => substr($orderNumber, -9)]);
+ } catch (ResourceNotFoundException $exception) {
+ $order = $this->fetchesCompanyModule->execute(['id' => 1]);
+ $allow_contract = false;
+ }
+
+ }
+
+ $packingListReference = $row->expressno;
+
+ try{
+ $packingList = $this->fetchesPackingList->execute(['reference' => $row->expressno, 'type' => PackingListType::SHIPPING_PACKING_LIST]);
+
+ $packingList->packages()->delete();
+ $replica = $packingList->packingLists()->where('type', PackingListType::SHIPPING_PACKING_LIST_REPLICA)->first();
+ if($replica) $replica->packages()->delete();
+
+ $warehouseReceiveList = $this->fetchesPackingList->execute(['reference' => $row->expressno, 'type' => PackingListType::WAREHOUSE_RECEIVE_LIST]);
+ $warehouseReceiveList->packages()->delete();
+ $replica = $warehouseReceiveList->packingLists()->where('type', PackingListType::WAREHOUSE_RECEIVE_LIST_REPLICA)->first();
+ if($replica) $replica->packages()->delete();
+
+ } catch (ResourceNotFoundException $exception) {
+
+ if (!$allow_contract) {
+ $appointee_id = 2307;
+ } else {
+ $appointee_id = $order->orderRoles()->where('role_id', '=', OrderRoleTypes::ORIGIN_FREIGHT_FORWARDER)->first()->appointee->id;
+ }
+
+ $warehouseReceiveObject = new PackingListObject($packingListReference, $appointee_id, PackingListType::WAREHOUSE_RECEIVE_LIST, $allow_contract ? ApprovalStatus::APPROVED : ApprovalStatus::REJECTED);
+
+ /** @var PackingList $warehouseReceiveList */
+ $warehouseReceiveList = $this->createPackingListProcessor->execute($warehouseReceiveObject, $order);
+
+ $transportObject = new TransportObject(TransportType::LAND, null, $row->kuaidilist, Carbon::parse($receiveDate), Carbon::parse($receiveDate), $allow_contract ? ApprovalStatus::APPROVED : ApprovalStatus::REJECTED);
+ $transport = $this->createsTransport->execute($transportObject, $warehouseReceiveList);
+
+ if ($allow_contract) {
+
+ $contract = $this->unityCreateContract->execute();
+
+ $contractReference = $contract->hash_id;
+ $contractObligations = $contract->contract_obligation_list;
+
+ $this->unityActivateContract->execute($contractReference);
+
+ $supervisorHashId = $order->orderRoles()->where('role_id', '=', OrderRoleTypes::SUPERVISOR)->first()->appointee->unity_hash_id;
+
+ $supervisorContractEntity = $this->unityCreateContractEntity->execute($contractReference, $supervisorHashId);
+ $order->orderRoles()->where('role_id', '=', OrderRoleTypes::SUPERVISOR)->first()->update(['entity_hash_id' => $supervisorContractEntity->hash_id, 'entity_signature' => $supervisorContractEntity->entity_signature_hash_id]);
+
+ $importerContractEntity = $this->unityCreateContractEntity->execute($contractReference, $order->orderRoles()->where('role_id', '=', OrderRoleTypes::IMPORTER)->first()->appointee->unity_hash_id);
+ $order->orderRoles()->where('role_id', '=', OrderRoleTypes::IMPORTER)->first()->update(['entity_hash_id' => $importerContractEntity->hash_id, 'entity_signature' => $importerContractEntity->entity_signature_hash_id]);
+
+ $this->unityAssignContractEntity->execute($supervisorContractEntity->hash_id, $contractObligations);
+ }
+
+ $packingListObject = new PackingListObject($packingListReference, $appointee_id, PackingListType::SHIPPING_PACKING_LIST, ApprovalStatus::SUSPENDED, !$allow_contract ? null : $contractReference);
+
+ /** @var PackingList $packingList */
+ $packingList = $this->createPackingListProcessor->execute($packingListObject, $order);
+
+ if ($allow_contract) {
+ foreach ($contractObligations as $obligation) {
+ $stepObject = new StepsObject($order->orderRoles()->where('role_id', '=', OrderRoleTypes::SUPERVISOR)->first()->appointee->id, $obligation->reference, $obligation->sequence, $obligation->hash_id);
+ $this->createsStep->execute($packingList, $stepObject);
+ }
+ }
+ }
+
+ foreach($row->deliverysize as $package) {
+ $packageObject = new PackageObject(PackageType::CARTON, $row->goodname, (float) $package->width, (float) $package->height, (float) $package->length, 0, (float) $package->num, ApprovalStatus::APPROVED);
+ $this->createPackageProcessor->execute($packageObject, $warehouseReceiveList);
+ $this->createPackageProcessor->execute($packageObject, $packingList);
+ }
+
+ if(!count($row->deliverysize)){
+ $measurement = round(((float) $row->volume / (float) $row->goodcount) ** (1/3) * 100, 2);
+ $packageObject = new PackageObject(PackageType::CARTON, $row->goodname, (float) $measurement, (float) $measurement, (float) $measurement, 0, (float) $row->goodcount, ApprovalStatus::APPROVED);
+ $this->createPackageProcessor->execute($packageObject, $warehouseReceiveList);
+ $this->createPackageProcessor->execute($packageObject, $packingList);
+ }
+
+ $weightCbm = (float) $row->weight / 500;
+ $overWeightCbm = $weightCbm - $packingList->packages()->sum(DB::raw('(width/100) * (height/100) * (length/100) * quantity'));
+
+ if($overWeightCbm > 0){
+ $measurement = round($overWeightCbm ** (1/3) * 100, 2);
+ $packageObject = new PackageObject(PackageType::OVER_WEIGHT, 'Overweight CBM', (float) $measurement, (float) $measurement, (float) $measurement, 0, 1, ApprovalStatus::APPROVED);
+ $this->createPackageProcessor->execute($packageObject, $packingList);
+ }
+
+ if($order instanceof Order){
+ $marking = $order->companyModule->inviters()->withPivot('invitee_reference')->first()->pivot->invitee_reference;
+ if(!in_array($marking, ['1290CSW', '8997ITB', '3992WHE', '962LOW', '1152AAT'])){
+ $this->fetchesDataFRomYDPortal->clientRequest('http://www.yd-wl.com/api/confirmsendorder.ashx', 'GET', [
+ 'expressno' => $row->expressno
+ ]);
+ }
+ }
+
+ $time_end = microtime(true);
+
+ $execution_time = ($time_end - $time_start)/60;
+
+ echo 'successful => Total Execution Time: '.$execution_time.' Mins
';
+
+ }
+
+ } catch (\Exception $exception) {
+ Log::debug($exception);
+ }
+ }
+}
+
diff --git a/app/Console/Commands/V2/ProcessYDPortalDataV2Command.php b/app/Console/Commands/V2/ProcessYDPortalDataV2Command.php
new file mode 100644
index 00000000..1e6f697d
--- /dev/null
+++ b/app/Console/Commands/V2/ProcessYDPortalDataV2Command.php
@@ -0,0 +1,125 @@
+fetchPackingListsFromYdPortalV2CommandJobs());
+ $jobs = array_merge($jobs, $this->fetchContainersFromYdPortalV2CommandJobs());
+ $jobs = array_merge($jobs, $this->fetchContainersUpdatesFromYdPortalV2CommandJob());
+ $jobs = array_merge($jobs, $this->fetchDeliveryUpdatesFromYdPortalV2CommandJobs());
+ Bus::chain($jobs)->dispatch();
+ }
+
+ private function fetchPackingListsFromYdPortalV2CommandJobs(){
+ $jobs = [];
+
+ $start = $this->argument('start_date') ? Carbon::parse($this->argument('start_date')) : null;
+ $end = $this->argument('end_date') ? Carbon::parse($this->argument('end_date')) : null;
+
+ // $start = $this->startDate ? Carbon::parse($this->startDate) : null;
+ // $end = $this->endDate ? Carbon::parse($this->endDate) : null;
+
+ $from = $end ? Carbon::today()->diffInDays($end) : 0;
+ $to = $start ? Carbon::today()->diffInDays($start) : 10;
+
+ for ($x = $from; $x <= $to; $x++) {
+
+ $startDate = Carbon::today()->subDays($x);
+ $startLimit = Carbon::parse('01-12-2021');
+
+ if($startDate->isBefore($startLimit)){
+ $startDate = $startLimit;
+ }
+
+ $endDate = Carbon::today()->subDays($x - 1);
+
+ $jobs[] = new FetchPackingListsFromYdPortalV2CommandJob($startDate, $endDate);
+ //FetchPackingListsFromYdPortalV2CommandJob::dispatch($startDate, $endDate);
+
+ Log::info('Dispatched FetchPackingListsFromYdPortalV2CommandJob for start date: ' . $startDate . ', end date: ' . $endDate);
+ }
+
+ return $jobs;
+ }
+
+ private function fetchContainersFromYdPortalV2CommandJobs(){
+ $jobs = [];
+ $maxFetchTime = Carbon::now()->subMonths(4);
+ $packingLists = PackingList::where('type', PackingListType::SHIPPING_PACKING_LIST)->whereDate('created_at', '>=', $maxFetchTime)->doesntHave('containers')->get();
+
+ foreach ($packingLists as $packingList) {
+ $jobs[] = new FetchContainersFromYdPortalV2CommandJob($packingList);
+ Log::info('Dispatched FetchContainersFromYdPortalV2CommandJob for packingList with id ' . $packingList->id);
+ }
+
+ return $jobs;
+ }
+
+ private function fetchContainersUpdatesFromYdPortalV2CommandJob(){
+ $jobs = [];
+ $containers = Container::where('status', ApprovalStatus::PENDING_VERIFICATION)->get();
+
+ foreach ($containers as $container) {
+ $jobs[] = new FetchContainersUpdatesFromYdPortalV2CommandJob($container);
+ Log::info('Dispatched FetchContainersUpdatesFromYdPortalV2CommandJob for container with id ' . $container->id);
+ }
+
+ return $jobs;
+ }
+
+ private function fetchDeliveryUpdatesFromYdPortalV2CommandJobs(){
+ $jobs = [];
+
+ $packingLists = PackingList::where('type', PackingListType::SHIPPING_PACKING_LIST)->whereRaw('LENGTH(reference) > 12')->whereHas('containers', function ($container){
+ return $container->where('status', 3);
+ })->doesntHave('transports')->get()->reverse();
+ foreach ($packingLists->chunk(50) as $chunk) {
+ foreach ($chunk as $packingList){
+ // $processor = app(FetchDeliveryUpdatesFromYdPortalV2Processor::class);
+ // $processor->execute($packingList);
+ $jobs[] = new FetchDeliveryUpdatesFromYdPortalV2CommandJob($packingList);
+ Log::info('Dispatched FetchDeliveryUpdatesFromYdPortalV2CommandJob for packingList with id' . $packingList->id);
+ }
+ }
+
+ return $jobs;
+ }
+}