repository = new Order(); $this->steps = new Collection(); $this->createsOrderSteps = new CreatesOrderSteps(); } /** * @param OrderObject $order * @throws \App\Classes\Modules\Accounts\Exceptions\CannotCreateOrderStepsException */ public function execute(OrderObject $order){ $modules = new Collection(); $order->getWarehouseId() ? $modules->push(Constants::ORDER_MODULE_WAREHOUSE) : $modules->push(Constants::ORDER_MODULE_NO_WAREHOUSE); $orderSteps = $this->getSteps([$this->repository->findOrFail($order->getOrderId())->pluck('warehouse_id') ? Constants::ORDER_MODULE_WAREHOUSE : Constants::ORDER_MODULE_NO_WAREHOUSE]); $this->createsOrderSteps->execute($order, $orderSteps->toArray()); } /** * @param array $modules * @return Collection */ public function getSteps(array $modules): Collection { $this->primarySteps(); $this->modularSteps($modules); return $this->steps->sortBy('sequence'); } public function modularSteps(array $modules){ $modularSteps = ModularStep::with('moduleGroups.steps')->whereIn('reference_id', $modules)->get(); foreach ($modularSteps as $module){ foreach($module->moduleGroups as $group){ $i = 0; foreach ($group->steps as $step){ $i++; $sequence = Constants::ORDER_PRIMARY_STEPS[$group->previous]['sequence'] + ($i/10); $this->addSteps((new OrderStepObject(false, $step->reference_id, $sequence))); } } } } private function primarySteps(){ PrimaryStep::all()->map(function ($step){ $this->addSteps((new OrderStepObject( true, $step->reference_id, Constants::ORDER_PRIMARY_STEPS[$step->reference_id]['sequence']))); }); } private function addSteps(OrderStepObject $step){ $this->steps->push([ 'primary' => $step->isPrimary(), 'reference_id' => $step->getReferenceId(), 'sequence' => $step->getSequence() ]); } }