<?php
namespace App\Services;
use App\Entity\Paper;
use App\Repository\CustomerOrderItemRepository;
use App\Repository\PaperStockGroupRepository;
use App\Repository\ProviderOrderItemRepository;
class ForecastingManager
{
protected $paperStockGroupRepository;
protected $customerOrderItemRepository;
protected $providerOrderItemRepository;
public function __construct(PaperStockGroupRepository $paperStockGroupRepository, CustomerOrderItemRepository $customerOrderItemRepository, ProviderOrderItemRepository $providerOrderItemRepository)
{
$this->paperStockGroupRepository = $paperStockGroupRepository;
$this->customerOrderItemRepository = $customerOrderItemRepository;
$this->providerOrderItemRepository = $providerOrderItemRepository;
}
public function updateOutOfStocks(Paper $paper, array $stockOrders) {
$outOfStockQuantity = null;
$outOfStockAt = null;
$lowestOutOfStockQuantity = null;
$lowestOutOfStockAt = null;
foreach ($stockOrders as $stock) {
$quantity = $stock->getQuantity();
$date = $stock->getStockDate();
$now = new \DateTimeImmutable();
if ($date < $now) $date = $now;
if ($quantity > $paper->getQuantityMin()) continue;
if (!$outOfStockQuantity) {
$outOfStockQuantity = $quantity;
$outOfStockAt = $date;
} elseif (!$lowestOutOfStockQuantity || $quantity < $lowestOutOfStockQuantity) {
$lowestOutOfStockQuantity = $quantity;
$lowestOutOfStockAt = $date;
}
}
$paper->setOutOfStock( $paper->getQuantity() <= $paper->getQuantityMin());
$paper->setOutOfStockAt($outOfStockAt);
$paper->setOutOfStockQuantity($outOfStockQuantity);
$paper->setLowestOutOfStockAt($lowestOutOfStockAt);
$paper->setLowestOutOfStockQuantity($lowestOutOfStockQuantity);
}
public function getStocks(Paper $paper, array $filters): array
{
$stocks = [];
$groups = $this->paperStockGroupRepository->findForecasting($paper, $filters);
if (count($groups)) $stocks[] = $groups[0]->getPaperStocks()->first();
for ($i = 0; $i < count($groups); $i++) {
$previousQuantity = $i == 0 ? $stocks[$i]->getQuantityPrevious() : $stocks[$i]->getQuantityTmp();
$group = $groups[$i];
$group->setQuantityTmp($previousQuantity + $group->getQuantityMovement());
$stocks[] = $group;
}
return $stocks;
}
public function getStockOrders(Paper $paper, int $previousQuantity, array $filters): array
{
$providerOrderItems = $this->providerOrderItemRepository->findForecasting($paper, $filters);
$customerOrderItems = $this->customerOrderItemRepository->findForecasting($paper, $filters);
$orders = \array_merge($providerOrderItems, $customerOrderItems);
usort($orders, function ($a, $b) {
return $a->getStockDate() > $b->getStockdate();
});
// Parse orders into stocks
$stockOrders = [];
for ($i = 0; $i < count($orders); $i++) {
$order = $orders[$i];
if (!$order->getArchived()) {
$order->setQuantityTmp($previousQuantity + $order->getQuantityMovement());
$previousQuantity = $order->getQuantityTmp();
}
$stockOrders[] = $order;
}
return $stockOrders;
}
}