owner instanceof \App\Models\Booking) { $bookingInfo = $this->extractBookingInfo($model); $projectName = 'Exchange | ' . $bookingInfo['serviceTypeName'] . ' | ' . $bookingInfo['bookingMarking']; $tasks = $this->defineTasks($model, $status); if(count($tasks) > 0) { $updatePerfexCRMObject = new UpdatePerfexCRMObject( $bookingInfo['companyName'], $bookingInfo['companyReference'], $bookingInfo['contactName'], $bookingInfo['contactEmail'], $bookingInfo['bookingMarking'], $projectName, PerfexCRMProjectStatus::IN_PROGRESS, [], $tasks ); $this->dispatchUpdateJob($model, $status, $updatePerfexCRMObject); } } } catch (\Exception $exception) { Log::error('TransactionToPerfexCRMProcessor debug:'); Log::error($exception); } return true; } private function extractBookingInfo(Transaction $model): array { $bookingInfo = []; $bookingInfo['companyReference'] = $model->owner->company->reference; $bookingInfo['companyName'] = $model->owner->company->name; $bookingInfo['contactEmail'] = $model->owner->company->employees()->first()->email; $bookingInfo['contactName'] = $model->owner->company->employees()->first()->name; $bookingInfo['bookingMarking'] = $model->owner->marking; $bookingInfo['serviceTypeName'] = $model->owner->company->services()->where('id', $model->owner->service_id)->first()->name; return $bookingInfo; } private function defineTasks(Transaction $model, int $status): array { $tasks = []; if($status == ApprovalStatus::APPROVED && $model->type == TransactionType::PAYMENT) { $tasks = $this->definePaymentTasks($model); } elseif($status == ApprovalStatus::PENDING_VERIFICATION && $model->type == TransactionType::PURCHASE_ORDER) { if($model->owner->service_id == 1 || $model->owner->service_id == 3) { $tasks = [PerfexCRMTasks::TASK_PURCHASE_ORDER_1, PerfexCRMTasks::TASK_PURCHASE_ORDER_2]; } } return $tasks; } private function definePaymentTasks(Transaction $model): array { $tasks = [ // PerfexCRMTasks::TASK_1 ]; if ($model->owner->service_id == 1) { $tasks = array_merge($tasks, $this->oneDayTransferTasks()); } elseif ($model->owner->service_id == 3) { $tasks = array_merge($tasks, $this->threeDayTransferTasks()); } elseif ($model->owner->service_id == 4) { $tasks = array_merge($tasks, $this->payment1688Tasks()); } if ($model->owner->service_id == 1 || $model->owner->service_id == 3) { $purchaseOrder = $model->booking->transactions()->where('type', TransactionType::PURCHASE_ORDER)->complete()->first(); if(is_null($purchaseOrder)){ $tasks = array_merge($tasks, $this->purchaseOrderTasks()); } } return $tasks; } private function oneDayTransferTasks(): array { return [ // PerfexCRMTasks::TASK_1_DAY_TRANSFER_1, PerfexCRMTasks::TASK_1_DAY_TRANSFER_2, // PerfexCRMTasks::TASK_1_DAY_TRANSFER_3, // PerfexCRMTasks::TASK_1_DAY_TRANSFER_3_1, // PerfexCRMTasks::TASK_1_DAY_TRANSFER_4, PerfexCRMTasks::TASK_1_DAY_TRANSFER_5, PerfexCRMTasks::TASK_1_DAY_TRANSFER_6 ]; } private function threeDayTransferTasks(): array { return [ // PerfexCRMTasks::TASK_3_DAY_TRANSFER_1, PerfexCRMTasks::TASK_3_DAY_TRANSFER_2, // PerfexCRMTasks::TASK_3_DAY_TRANSFER_3, // PerfexCRMTasks::TASK_3_DAY_TRANSFER_3_1, // PerfexCRMTasks::TASK_3_DAY_TRANSFER_4, PerfexCRMTasks::TASK_3_DAY_TRANSFER_5, PerfexCRMTasks::TASK_3_DAY_TRANSFER_6 ]; } private function payment1688Tasks(): array { return [ // PerfexCRMTasks::TASK_1688_PAYMENT_1, PerfexCRMTasks::TASK_1688_PAYMENT_2, // PerfexCRMTasks::TASK_1688_PAYMENT_3, // PerfexCRMTasks::TASK_1688_PAYMENT_3_1, // PerfexCRMTasks::TASK_1688_PAYMENT_4, PerfexCRMTasks::TASK_1688_PAYMENT_5, // PerfexCRMTasks::TASK_1688_PAYMENT_6, PerfexCRMTasks::TASK_1688_PAYMENT_7, PerfexCRMTasks::TASK_1688_PAYMENT_8, PerfexCRMTasks::TASK_1688_PAYMENT_9, PerfexCRMTasks::TASK_1688_PAYMENT_10, PerfexCRMTasks::TASK_1688_PAYMENT_11, PerfexCRMTasks::TASK_1688_PAYMENT_12, PerfexCRMTasks::TASK_1688_PAYMENT_13 ]; } private function purchaseOrderTasks(): array { $potask1 = PerfexCRMTasks::TASK_PURCHASE_ORDER_1; $potask1['status'] = PerfexCRMTaskStatus::NOT_STARTED; return [ $potask1, // PerfexCRMTasks::TASK_PURCHASE_ORDER_2 ]; } private function dispatchUpdateJob(Transaction $model, int $status, UpdatePerfexCRMObject $updatePerfexCRMObject) { if($status == ApprovalStatus::APPROVED){ UpdatePerfexCRMPrelude::dispatch($model, $updatePerfexCRMObject, UpdatePerfexCRM::class, UpdatePerfexCRMInvoice::class); } elseif($status == ApprovalStatus::PENDING_VERIFICATION){ UpdatePerfexCRM::dispatch($updatePerfexCRMObject, null, null); } } }