Files
izyim/app/Classes/Modules/Orders/Services/Steps/GenerateOrderSteps.php
T
Omair Saleh 919e0252f7 large commit
2019-06-03 10:29:08 +08:00

90 lines
2.6 KiB
PHP

<?php
namespace App\Classes\Modules\Orders\Services\Steps;
use App\Classes\Constants;
use App\Classes\Modules\Orders\DataTransferObjects\OrderObject;
use App\Classes\Objects\Orders\OrderStepObject;
use App\Models\ModularStep;
use App\Models\Order;
use App\Models\PrimaryStep;
use Illuminate\Support\Collection;
class GenerateOrderSteps
{
/**
* @var Order
*/
private $repository;
/** @var CreatesOrderSteps */
private $createsOrderSteps;
/** @var Collection */
protected $steps;
/**
* GenerateOrderSteps constructor.
*/
public function __construct()
{
$this->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){
$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()
]);
}
}