src/Service/WarehouseContextService.php line 184

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\Service;
  4. use App\Entity\Source;
  5. use App\Entity\User;
  6. use App\Entity\Warehouse;
  7. use App\Repository\WarehouseRepository;
  8. use Symfony\Component\HttpFoundation\RequestStack;
  9. class WarehouseContextService
  10. {
  11.     private const SESSION_KEY 'admin_current_warehouse_id';
  12.     public function __construct(
  13.         private RequestStack $requestStack,
  14.         private WarehouseRepository $warehouseRepository
  15.     ) {
  16.     }
  17.     /**
  18.      * @return Warehouse[]
  19.      */
  20.     public function getAccessibleWarehouses(?User $user null): array
  21.     {
  22.         if ($user instanceof User) {
  23.             try {
  24.                 if ($user->getWarehouses()->count() > 0) {
  25.                     $warehouses array_values(array_filter(
  26.                         $user->getWarehouses()->toArray(),
  27.                         static fn ($warehouse): bool => $warehouse instanceof Warehouse && $warehouse->getIsActive()
  28.                     ));
  29.                     usort($warehouses, static function (Warehouse $aWarehouse $b): int {
  30.                         if ($a->getIsDefault() !== $b->getIsDefault()) {
  31.                             return $a->getIsDefault() ? -1;
  32.                         }
  33.                         return strcasecmp((string) $a->getName(), (string) $b->getName());
  34.                     });
  35.                     if ($warehouses !== []) {
  36.                         return $warehouses;
  37.                     }
  38.                     return [];
  39.                 }
  40.             } catch (\Throwable $e) {
  41.                 // La migration user_warehouse peut ne pas être encore appliquée.
  42.             }
  43.         }
  44.         $warehouses $this->warehouseRepository->findBy(
  45.             ['isActive' => true],
  46.             ['isDefault' => 'DESC''name' => 'ASC']
  47.         );
  48.         if ($warehouses !== []) {
  49.             return $warehouses;
  50.         }
  51.         $fallback $this->warehouseRepository->findDefault();
  52.         return $fallback instanceof Warehouse ? [$fallback] : [];
  53.     }
  54.     public function getCurrentWarehouse(?User $user null): ?Warehouse
  55.     {
  56.         $available $this->getAccessibleWarehouses($user);
  57.         if ($available === []) {
  58.             return null;
  59.         }
  60.         $currentId $this->getStoredWarehouseId();
  61.         if ($currentId === 0) {
  62.             return null;
  63.         }
  64.         if ($currentId !== null) {
  65.             foreach ($available as $warehouse) {
  66.                 if ((int) $warehouse->getId() === $currentId) {
  67.                     return $warehouse;
  68.                 }
  69.             }
  70.         }
  71.         if (\count($available) === 1) {
  72.             return $this->rememberWarehouse($available[0]);
  73.         }
  74.         $default $this->getGlobalDefaultWarehouse();
  75.         if ($default instanceof Warehouse) {
  76.             foreach ($available as $warehouse) {
  77.                 if ((int) $warehouse->getId() === (int) $default->getId()) {
  78.                     return $this->rememberWarehouse($warehouse);
  79.                 }
  80.             }
  81.         }
  82.         return $this->rememberWarehouse($available[0]);
  83.     }
  84.     public function getCurrentWarehouseName(?User $user nullstring $fallback 'Principal'): string
  85.     {
  86.         if ($this->getStoredWarehouseId() === 0) {
  87.             return 'Tous les dépôts';
  88.         }
  89.         return $this->getCurrentWarehouse($user)?->getName() ?: $fallback;
  90.     }
  91.     public function setCurrentWarehouseById(?int $warehouseId, ?User $user null): ?Warehouse
  92.     {
  93.         if (($warehouseId ?? 0) <= 0) {
  94.             return $this->rememberWarehouse(nulltrue);
  95.         }
  96.         foreach ($this->getAccessibleWarehouses($user) as $warehouse) {
  97.             if ((int) $warehouse->getId() === (int) $warehouseId) {
  98.                 return $this->rememberWarehouse($warehouse);
  99.             }
  100.         }
  101.         return $this->getCurrentWarehouse($user);
  102.     }
  103.     public function resolveOperationWarehouse(
  104.         ?Source $source null,
  105.         ?User $user null,
  106.         ?Warehouse $preferredWarehouse null
  107.     ): ?Warehouse {
  108.         if ($preferredWarehouse instanceof Warehouse && $preferredWarehouse->getIsActive()) {
  109.             return $preferredWarehouse;
  110.         }
  111.         $sourceWarehouse $source?->getDefaultWarehouse();
  112.         if ($sourceWarehouse instanceof Warehouse && $sourceWarehouse->getIsActive()) {
  113.             return $sourceWarehouse;
  114.         }
  115.         $current $this->getCurrentWarehouse($user);
  116.         if ($current instanceof Warehouse) {
  117.             return $current;
  118.         }
  119.         $default $this->getGlobalDefaultWarehouse();
  120.         if ($default instanceof Warehouse) {
  121.             return $default;
  122.         }
  123.         $available $this->getAccessibleWarehouses($user);
  124.         return $available[0] ?? null;
  125.     }
  126.     public function getGlobalDefaultWarehouse(): ?Warehouse
  127.     {
  128.         $default $this->warehouseRepository->findDefault();
  129.         if ($default instanceof Warehouse) {
  130.             return $default;
  131.         }
  132.         $activeWarehouses $this->warehouseRepository->findBy(
  133.             ['isActive' => true],
  134.             ['isDefault' => 'DESC''name' => 'ASC']
  135.         );
  136.         return $activeWarehouses[0] ?? null;
  137.     }
  138.     private function getStoredWarehouseId(): ?int
  139.     {
  140.         $request $this->requestStack->getCurrentRequest();
  141.         if (!$request || !$request->hasSession()) {
  142.             return null;
  143.         }
  144.         if (!$request->getSession()->has(self::SESSION_KEY)) {
  145.             return null;
  146.         }
  147.         $warehouseId = (int) $request->getSession()->get(self::SESSION_KEY0);
  148.         return $warehouseId $warehouseId 0;
  149.     }
  150.     private function rememberWarehouse(?Warehouse $warehousebool $allWarehouses false): ?Warehouse
  151.     {
  152.         $request $this->requestStack->getCurrentRequest();
  153.         if ($request && $request->hasSession()) {
  154.             if ($warehouse instanceof Warehouse && $warehouse->getId() !== null) {
  155.                 $request->getSession()->set(self::SESSION_KEY, (int) $warehouse->getId());
  156.             } elseif ($allWarehouses) {
  157.                 $request->getSession()->set(self::SESSION_KEY0);
  158.             } else {
  159.                 $request->getSession()->remove(self::SESSION_KEY);
  160.             }
  161.         }
  162.         return $warehouse;
  163.     }
  164. }