src/Controller/Admin/StockTransfer/StockTransferController.php line 855

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Admin\StockTransfer;
  3. use App\Dto\Stock\StockTransferProductsDto;
  4. use App\Entity\BuyInTurkey;
  5. use App\Entity\Container;
  6. use App\Entity\NewStockTransfer;
  7. use App\Entity\NewTransferProducts;
  8. use App\Entity\Product;
  9. use App\Entity\Sales;
  10. use App\Entity\Stock;
  11. use App\Entity\StockInfo;
  12. use App\Entity\StockTransaction;
  13. use App\Entity\StockTransfer;
  14. use App\Entity\StockTransferProducts;
  15. use App\Entity\Warehouse;
  16. use App\Enum\StockTransactionSource;
  17. use App\Exception\StockNotAvaibleException;
  18. use App\Exception\StockNotFoundException;
  19. use App\Exception\StockTransferWasAdded;
  20. use App\Form\AddStockTransferFormType;
  21. use App\Form\AddStockTransferProductsFormType;
  22. use App\Form\NewStockTransferFormType;
  23. use App\Services\BuyInTurkey\BuyInTurkeyService;
  24. use App\Services\Product\ProductService;
  25. use App\Services\Stock\StockInfoService;
  26. use App\Services\Stock\StockService;
  27. use App\Services\Stock\StockTransferService;
  28. use App\Services\StockTransactionService;
  29. use App\Services\Warehouse\WarehouseService;
  30. use App\Utils\CurrencyHelper;
  31. use Doctrine\Common\Collections\ArrayCollection;
  32. use Doctrine\ORM\EntityManagerInterface;
  33. use Doctrine\ORM\Query;
  34. use PHPUnit\Exception;
  35. use Psr\Log\LoggerInterface;
  36. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  37. use Symfony\Component\HttpFoundation\JsonResponse;
  38. use Symfony\Component\HttpFoundation\Request;
  39. use Symfony\Component\HttpFoundation\Response;
  40. use Symfony\Component\Routing\Annotation\Route;
  41. use Symfony\Component\Serializer\Encoder\JsonEncoder;
  42. use Symfony\Component\Serializer\Encoder\XmlEncoder;
  43. use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
  44. use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
  45. use Symfony\Component\Serializer\Serializer;
  46. use Symfony\Component\Serializer\SerializerInterface;
  47. use Symfony\Contracts\Translation\TranslatorInterface;
  48. class StockTransferController extends AbstractController
  49. {
  50.     private WarehouseService $warehouseService;
  51.     private ProductService $productService;
  52.     private StockTransferService $stockTransferService;
  53.     private StockInfoService $stockInfoService;
  54.     private EntityManagerInterface $entityManager;
  55.     private TranslatorInterface $translator;
  56.     private StockService $stockService;
  57.     private BuyInTurkeyService $buyInTurkeyService;
  58.     private LoggerInterface $logger;
  59.     private StockTransactionService $stockTransactionService;
  60.     /**
  61.      * @param EntityManagerInterface $entityManager
  62.      */
  63.     public function __construct(EntityManagerInterface $entityManagerTranslatorInterface $translatorLoggerInterface $loggerStockTransactionService $stockTransactionService)
  64.     {
  65.         $this->entityManager $entityManager;
  66.         $this->translator $translator;
  67.         $this->logger $logger;
  68.         $this->stockTransactionService $stockTransactionService;
  69.     }
  70.     #[Route('/admin/stock-transfer'name'app_admin_stock_transfer')]
  71.     public function index(Request $requestEntityManagerInterface $entityManager): Response
  72.     {
  73.         $transactions $entityManager->getRepository(StockTransaction::class)->findAll();
  74.         return $this->render('admin/stock_transfer/index.html.twig', [
  75.             'transactions' => $transactions
  76.         ]);
  77.     }
  78.     #[Route('/admin/stock-transfer/new'name'app_admin_stock_transfer_new')]
  79.     public function new(Request $requestEntityManagerInterface $entityManager): Response
  80.     {
  81.         $stocktransfer = new StockTransfer();
  82.         $form $this->createForm(AddStockTransferFormType::class, $stocktransfer);
  83.         $stocktransferProducts = new StockTransferProducts();
  84.         $stockTransferProductForm $this->createForm(AddStockTransferProductsFormType::class, $stocktransferProducts);
  85.         $mainWarehouse $this->warehouseService->getMainWarehouse();
  86.         $form->handleRequest($request);
  87.         if ($form->isSubmitted() && $form->isValid()) {
  88.             if ($request->get('productName')) {
  89.                 $stocktransferProducts = new ArrayCollection();
  90.                 for ($i 0$i count($request->get('productName')); $i++) {
  91.                     try {
  92.                         $this->stockInfoService->checkIsStockAvailable($request->get('quantity')[$i], $request->get('productId')[$i], $mainWarehouse->getId());
  93.                     } catch (StockNotAvaibleException StockNotFoundException $e) {
  94.                         $this->addFlash('error'$e->getMessage());
  95.                         return $this->redirectToRoute('app_admin_stock_transfer_new');
  96.                     }
  97.                     $stocktransferProducts->add(
  98.                         new StockTransferProductsDto(
  99.                             $request->get('productName')[$i],
  100.                             $request->get('quantity')[$i],
  101.                             round($request->get('unitPriceFob')[$i], 3),
  102.                             round($request->get('unitPriceNavlun')[$i], 3),
  103.                             round($request->get('totalUnitPrice')[$i], 3),
  104.                             round($request->get('totalSalePrice')[$i], 3),
  105.                             round($request->get('productId')[$i], 3),
  106.                         )
  107.                     );
  108.                 }
  109.                 try {
  110.                     $stocktransfer $this->stockTransferService->create($form->getData(), $stocktransferProducts);
  111.                     dd("asdasd");
  112.                     return $this->redirectToRoute('app_admin_stock_transfer');
  113.                 } catch (Exception StockTransferWasAdded $exception) {
  114.                     $this->addFlash('error'$exception->getMessage());
  115.                 }
  116.             }
  117.         }
  118.         $warehousesWithoutMain $this->warehouseService->getAll();
  119.         return $this->render('admin/stock_transfer/add.html.twig', [
  120.             'controller_name' => 'StockTransferController',
  121.             'form' => $form->createView(),
  122.             'mainWarehouse' => $mainWarehouse,
  123.             'warehouses' => $warehousesWithoutMain,
  124.             'stockTransferProducts' => $stockTransferProductForm->createView()
  125.         ]);
  126.     }
  127.     #[Route('/admin/stock-transfer/add-containers'name'app_admin_stock_transfer_addcontainers')]
  128.     public function addContainers(Request $request)
  129.     {
  130.         $arrivalWarehouse $request->get('arrival_warehouse');
  131.         $containerNumber $request->get('container_number');
  132.         $invoiceNumber $request->get('invoice_number');
  133.         $konsimento $request->get('konsimento');
  134.         $totalNavlun $request->get('total_navlun');
  135.         $description $request->get('description');
  136.         $warehouseOutDate $request->get('warehouse_out_date');
  137.         $warehouseArrivalDate $request->get('warehouse_arrival_date');
  138.         if (!$arrivalWarehouse || !$containerNumber || !$invoiceNumber || !$konsimento || !$totalNavlun || !$description || !$warehouseOutDate) {
  139.             return $this->redirectToRoute('app_admin_stock_transfer_new');
  140.         }
  141.         return $this->render('admin/stock_transfer/addcontainers.html.twig', [
  142.             'numberOfContainer' => $containerNumber,
  143.             'arrivalWarehouse' => $arrivalWarehouse,
  144.             'invoiceNumber' => $invoiceNumber,
  145.             'konsimento' => $konsimento,
  146.             'totalNavlun' => $totalNavlun,
  147.             'description' => $description,
  148.             'warehouseOutDate' => $warehouseOutDate,
  149.             'warehouseArrivalDate' => $warehouseArrivalDate
  150.         ]);
  151.     }
  152.     private function checkTransfer($transferId)
  153.     {
  154.         $stockTransferRepo $this->entityManager->getRepository(NewStockTransfer::class);
  155.         $stockTransfer $stockTransferRepo->find($transferId);
  156.         $totalPrice 0.00;
  157.         foreach ($stockTransfer->getContainers() as $container) {
  158.             $totalContainer 0.00;
  159.             foreach ($container->getNewTransferProducts() as $transferProduct) {
  160.                 $totalPrice += round($transferProduct->getTotalCostPrice(), 3) * round($transferProduct->getQuantity(), 3);
  161.                 $totalContainer += round($transferProduct->getTotalCostPrice(), 3) * round($transferProduct->getQuantity(), 3);
  162.             }
  163.             $container->setTotalPrice($totalContainer);
  164.             $this->entityManager->persist($container);
  165.             $this->entityManager->flush();
  166.         }
  167.         return CurrencyHelper::convertToCurrency($totalPrice);
  168.     }
  169.     #[Route('/admin/stock-transfer/accept/{id}'name'app_admin_stock_transfer_accep')]
  170.     public function acceptTransfer(Request $request$idEntityManagerInterface $entityManager)
  171.     {
  172.         $stocktransfer $this->entityManager->getRepository(NewStockTransfer::class)->find($id);
  173.         $form $this->createForm(NewStockTransferFormType::class, $stocktransfer);
  174.         $stocktransferProduct = new StockTransferProducts();
  175.         $stockTransferProductForm $this->createForm(AddStockTransferProductsFormType::class, $stocktransferProduct);
  176.         $form->handleRequest($request);
  177.         if ($form->isSubmitted() && $form->isValid()) {
  178.             if ($request->get('containerId')) {
  179.                 $this->entityManager->beginTransaction();
  180.                 try {
  181.                     $stocktransferProductsArr = new ArrayCollection();
  182.                     for ($i 0$i count($request->get('containerId')); $i++) {
  183.                         if ($request->get('isTransfered')[$i] == 1) {
  184.                             $containerId $request->get('containerId')[$i];
  185.                             $containerRepository $this->entityManager->getRepository(Container::class);
  186.                             $container $containerRepository->find($containerId);
  187.                             if ($container->isTransfered() == false) {
  188.                                 $products $request->get($container->getId());
  189.                                 $productNames $products['productName'];
  190.                                 $productQuantities $products['quantity'];
  191.                                 $productTotalPrices $products['totalPrice'];
  192.                                 $productIds $products['productId'];
  193.                                 for ($j 0$j count($productIds); $j++) {
  194.                                     $product $this->productService->getEntityId($productIds[$j]);
  195.                                     $container->setIsTransfered(true);
  196.                                     $newStockTransferProduct $this->entityManager->getRepository(NewTransferProducts::class)
  197.                                         ->findOneBy(['container' => $container'product' => $product]);
  198.                                     $newStockTransferProduct->setOnaylananQuantity($productQuantities[$j]);
  199.                                     $entityManager->persist($newStockTransferProduct);
  200.                                     $entityManager->flush();
  201.                                     $stock = new Stock();
  202.                                     $stock->setProduct($product);
  203.                                     $stock->setNewStockTransfer($stocktransfer);
  204.                                     $stock->setPriceNavlun($newStockTransferProduct->getNavlun());
  205.                                     $stock->setPriceFob($newStockTransferProduct->getPriceFob());
  206.                                     $stock->setQuantity($productQuantities[$j]);
  207.                                     $stock->setTotalUnitPrice($productTotalPrices[$j]);
  208.                                     $stock->setWarehouse($stocktransfer->getArrivalWarehouse());
  209.                                     $stock->setInvoiceNumber($stocktransfer->getInvoiceNumber());
  210.                                     $stock->setWarehouseArrivalDate(new \DateTimeImmutable('now'));
  211.                                     $stock->setBuyingDate(new \DateTimeImmutable('now'));
  212.                                     $stock->setBuyingCompany('transfer');
  213.                                     $stock->setContainerNumber($container->getContainerNumber());
  214.                                     $stock->setKonsimento($stocktransfer->getKonsimento());
  215.                                     $stock->setPurchaseTotalAmount(0);
  216.                                     $this->entityManager->persist($stock);
  217.                                     $this->entityManager->flush();
  218.                                     $beforeQuantity $this->stockInfoService->getStockInfoByProductAndWarehouse($product$stocktransfer->getArrivalWarehouse())->getTotalQuantity();
  219.                                     $this->stockInfoService->addStock($product$stocktransfer->getArrivalWarehouse(), CurrencyHelper::convertToFloat($productQuantities[$j]));
  220.                                     $this->log(
  221.                                         $product->getName(),
  222.                                         "Stock Transfer eklendi bu yüzden stok eklendi",
  223.                                         CurrencyHelper::convertToFloat($productQuantities[$j]),
  224.                                         $beforeQuantity,
  225.                                         $this->stockInfoService->getStockInfoByProductAndWarehouse($product$stocktransfer->getArrivalWarehouse())->getTotalQuantity(),
  226.                                         "IN",
  227.                                         $stocktransfer,
  228.                                         $product,
  229.                                         null,
  230.                                         $stocktransfer->getArrivalWarehouse()
  231.                                     );
  232.                                     $this->entityManager->persist($container);
  233.                                     $this->entityManager->flush();
  234.                                     $this->logger->info(sprintf(
  235.                                         "Stok transfer onaylandı. Stok eklendi. Ürün adı= %s, ÜrünId= %s, Miktar= %s, StockId= %s, StokTransferId= %s",
  236.                                         $product->getName(),
  237.                                         $product->getId(),
  238.                                         $productQuantities[$j],
  239.                                         $stock->getId(),
  240.                                         $stocktransfer->getId()
  241.                                     ));
  242.                                 }
  243.                             }
  244.                         }
  245.                     }
  246.                     $isTransferedCompleted true;
  247.                     foreach ($stocktransfer->getContainers() as $container) {
  248.                         if (!$container->isTransfered()) {
  249.                             $isTransferedCompleted false;
  250.                             break;
  251.                         }
  252.                     }
  253.                     if ($isTransferedCompleted) {
  254.                         $stocktransfer->setIsCompleted(true);
  255.                         $this->entityManager->persist($stocktransfer);
  256.                         $this->entityManager->flush();
  257.                     } else {
  258.                         $stocktransfer->setIsCompleted(false);
  259.                         $this->entityManager->persist($stocktransfer);
  260.                         $this->entityManager->flush();
  261.                     }
  262.                     $this->entityManager->commit();
  263.                     //                    $this->stockTransferService->acceptTransfer($form->getData(), $stocktransferProductsArr);
  264.                     return $this->redirect('/admin/stock-transfer');
  265.                 } catch (Exception StockTransferWasAdded $exception) {
  266.                     $this->entityManager->rollback();
  267.                     $this->addFlash('error'$exception->getMessage());
  268.                 }
  269.             }
  270.         }
  271.         //        dd($stocktransfer->getContainers()->get(0)->getNewTransferProducts()->get(0)->getProduct()->getId());
  272.         $warehousesWithoutMain $this->warehouseService->getAllWithoutMainWarehouse();
  273.         $this->checkTransfer($id);
  274.         return $this->render('admin/stock_transfer/acceptransfer.html.twig', [
  275.             'form' => $form->createView(),
  276.             'stockTransfer' => $stocktransfer,
  277.             'stockTransferProducts' => $stockTransferProductForm->createView()
  278.         ]);
  279.     }
  280.     #[Route('/new-stock-transfer-delete/{id}'name'new_stock_transfer_delete')]
  281.     public function delete(Request $request$id)
  282.     {
  283.         $repo $this->entityManager->getRepository(NewStockTransfer::class);
  284.         $entity $repo->find($id);
  285.         if (!$entity) {
  286.             $this->addFlash('error'sprintf("%s id ile kayıtlı stock transfer bulunamadı"$id));
  287.             return $this->redirectToRoute('app_admin_stock_transfer');
  288.         }
  289.         $this->entityManager->beginTransaction();
  290.         try {
  291.             $warehouse $entity->getArrivalWarehouse();
  292.             foreach ($entity->getContainers() as $container) {
  293.                 if ($container->isTransfered()) {
  294.                     foreach ($container->getNewTransferProducts() as $product) {
  295.                         $beforeQuantity $this->stockInfoService->getStockInfoByProductAndWarehouse($product->getProduct(), $warehouse)->getTotalQuantity();
  296.                         $this->stockInfoService->dropStock($product->getQuantity(), $warehouse$product->getProduct());
  297.                         $this->log(
  298.                             $product->getProduct()->getName(),
  299.                             "Stok transfer siliniyor bu yüzden stok düşülüyor",
  300.                             $product->getQuantity(),
  301.                             $beforeQuantity,
  302.                             $this->stockInfoService->getStockInfoByProductAndWarehouse($product->getProduct(), $warehouse)->getTotalQuantity(),
  303.                             "OUT",
  304.                             null,
  305.                             $product->getProduct(),
  306.                             null,
  307.                             $warehouse
  308.                         );
  309.                         $this->entityManager->remove($product);
  310.                     }
  311.                     $this->entityManager->remove($container);
  312.                 } else {
  313.                     foreach ($entity->getContainers() as $container) {
  314.                         foreach ($container->getNewTransferProducts() as $product)
  315.                             $this->entityManager->remove($product);
  316.                         $this->entityManager->remove($container);
  317.                     }
  318.                 }
  319.             }
  320.             $stocks $this->entityManager->getRepository(Stock::class)->findBy(['newStockTransfer' => $entity]);
  321.             foreach ($stocks as $stock) {
  322.                 $this->entityManager->remove($stock);
  323.             }
  324.             $this->entityManager->remove($entity);
  325.             $this->entityManager->flush();
  326.             $this->entityManager->commit();
  327.             $this->addFlash('success'"Stok transferi başarıyla silindi. Stoklar geri alındı.");
  328.             return $this->redirectToRoute('app_admin_stock_transfer');
  329.         } catch (\Exception $exception) {
  330.             $this->entityManager->rollback();
  331.             throw $exception;
  332.         }
  333.     }
  334.     #[Route('/admin/stocktransfer/add-new'name'admin_stocktransfer_add_new')]
  335.     public function addStockTransfer(Request $requestEntityManagerInterface $entityManager)
  336.     {
  337.         $entityManager->beginTransaction();
  338.         try {
  339.             $warehouse $this->warehouseService->getEntityById($request->get('arrivalWarehouse'));
  340.             $stockTransfer = new NewStockTransfer();
  341.             $stockTransfer->setDescription($request->get('description'));
  342.             $stockTransfer->setArrivalWarehouse($warehouse);
  343.             $stockTransfer->setInvoiceNumber($request->get('invoiceNumber'));
  344.             $stockTransfer->setKonsimento($request->get('konsimento'));
  345.             $stockTransfer->setTotalNavlun(CurrencyHelper::convertToFloat($request->get('totalNavlun')));
  346.             $stockTransfer->setContainerNumber($request->get('numberOfContainer'));
  347.             $stockTransfer->setDateOfOutCustoms(new \DateTime($request->get('warehouseOutDate')));
  348.             $stockTransfer->setDateOfArrivalWarehouse(new \DateTime($request->get('warehouseOutDate')));
  349.             $stockTransfer->setIsCompleted(false);
  350.             $entityManager->persist($stockTransfer);
  351.             $entityManager->flush();
  352.             $navlunPricePerContainer CurrencyHelper::convertToFloat($request->get('totalNavlun')) / CurrencyHelper::convertToFloat($request->get('numberOfContainer'));
  353.             for ($i 0$i $request->get('numberOfContainer'); $i++) {
  354.                 $containerNumber $request->get('containerNumber-' $i 1)[0];
  355.                 $container = new Container();
  356.                 $container->setContainerNumber($containerNumber);
  357.                 $container->setTotalNavlun($navlunPricePerContainer);
  358.                 $container->setNewStockTransfer($stockTransfer);
  359.                 $container->setIsTransfered(false);
  360.                 $totalPriceInContainer $request->get($i 1);
  361.                 $totalPrice 0.00;
  362.                 foreach ($totalPriceInContainer['totalSalePrice'] as $singlePrice) {
  363.                     $totalPrice += CurrencyHelper::convertToFloat($singlePrice);
  364.                 }
  365.                 $totalQuantity 0.00;
  366.                 foreach ($totalPriceInContainer['quantity'] as $singleQuantity) {
  367.                     $totalQuantity += CurrencyHelper::convertToFloat($singleQuantity);
  368.                 }
  369.                 $container->setTotalPrice($totalPrice $navlunPricePerContainer);
  370.                 $container->setTotalProductUnit($totalQuantity);
  371.                 $totalUnitNavlunPrice $navlunPricePerContainer $totalQuantity;
  372.                 $container->setUnitNavlunPrice($totalUnitNavlunPrice);
  373.                 $entityManager->persist($container);
  374.                 $entityManager->flush();
  375.                 for ($j 0$j count($request->get($i 1)['productName']); $j++) {
  376.                     $productInfo $request->get($i 1);
  377.                     $newStockTransferProduct = new NewTransferProducts();
  378.                     $newStockTransferProduct->setQuantity(CurrencyHelper::convertToFloat($productInfo['quantity'][$j]));
  379.                     $newStockTransferProduct->setBooking(CurrencyHelper::convertToFloat($productInfo['unitPriceNavlun'][$j]));
  380.                     $newStockTransferProduct->setQuantity(CurrencyHelper::convertToFloat($productInfo['quantity'][$j]));
  381.                     $newStockTransferProduct->setCustomsPrice(CurrencyHelper::convertToFloat($productInfo['customsPrice'][$j]));
  382.                     $newStockTransferProduct->setLashing(CurrencyHelper::convertToFloat($productInfo['lashing'][$j]));
  383.                     $newStockTransferProduct->setPriceFob(CurrencyHelper::convertToFloat($productInfo['unitPriceFob'][$j]));
  384.                     $newStockTransferProduct->setProfitMargin(CurrencyHelper::convertToFloat($productInfo['profitMargin'][$j]));
  385.                     $unitPriceFob round(CurrencyHelper::convertToFloat($productInfo['unitPriceFob'][$j]), 3);
  386.                     $unitNavlunPrice round(CurrencyHelper::convertToFloat($productInfo['unitPriceNavlun'][$j]), 3);
  387.                     $totalCostPrice $unitPriceFob $unitNavlunPrice round($totalUnitNavlunPrice3);
  388.                     $newStockTransferProduct->setTotalCostPrice($totalCostPrice);
  389.                     $newStockTransferProduct->setTransportPrice(CurrencyHelper::convertToFloat($productInfo['transportPrice'][$j]));
  390.                     $buyInTurkeyRepo $this->entityManager->getRepository(BuyInTurkey::class);
  391.                     $product $this->productService->getEntityId($buyInTurkeyRepo->find($productInfo['productId'][$j])->getProduct());
  392.                     $newStockTransferProduct->setProduct($product);
  393.                     $newStockTransferProduct->setContainer($container);
  394.                     $newStockTransferProduct->setBuyingPrice(0);
  395.                     $newStockTransferProduct->setNavlun($totalUnitNavlunPrice);
  396.                     $totalPurchasePrice $totalCostPrice CurrencyHelper::convertToFloat($productInfo['quantity'][$j]);
  397.                     $newStockTransferProduct->setTotalPurchasePrice($totalPurchasePrice);
  398.                     $entityManager->persist($newStockTransferProduct);
  399.                     $entityManager->flush();
  400.                     $buyInTurkeyRow $entityManager->getRepository(BuyInTurkey::class)->find($productInfo['productId'][$j]);
  401.                     $quantity $buyInTurkeyRow->getQuantity();
  402.                     $newQuantity CurrencyHelper::convertToFloat($quantity) - CurrencyHelper::convertToFloat($productInfo['quantity'][$j]);
  403.                     $buyInTurkeyRow->setQuantity($newQuantity);
  404.                     if ($newQuantity <= 0) {
  405.                         $buyInTurkeyRow->setIsTransported(true);
  406.                     }
  407.                     $entityManager->persist($buyInTurkeyRow);
  408.                     $entityManager->flush();
  409.                 }
  410.             }
  411.             $entityManager->commit();
  412.             $this->checkTransfer($stockTransfer->getId());
  413.         } catch (\Exception $exception) {
  414.             $entityManager->rollback();
  415.             throw $exception;
  416.         }
  417.         return $this->redirectToRoute('app_admin_stock_transfer');
  418.     }
  419.     #[Route('/admin/stocktransfer/report'name'admin_stocktransfer_report')]
  420.     public function reportStockTransfer(Request $request)
  421.     {
  422.         $year $request->get('year');
  423.         $year = new \DateTime($year '-01-01');
  424.         $nextYear = clone $year;
  425.         $nextYear->modify('+1 years');
  426.         $fields = [
  427.             'SUM(newtransferproducts.quantity) as totalQuantity',
  428.             //            'SUM(newtransferproducts.totalPurchasePrice) as totalPurchasePrice',
  429. //            'AVG(newtransferproducts.navlun) as averageNavlun', // Navlunun ortalama değeri
  430. //            'AVG(newtransferproducts.totalCostPrice / newtransferproducts.quantity) as averageUnitCost', // Birim başına maliyetin ortalama değeri
  431.             'product.name as name',
  432.             'measurementUnit.name as measurement',
  433.             'product.code as code',
  434.             'product.id as productId'
  435.         ];
  436.         $stockTransfer $this->entityManager->getRepository(NewStockTransfer::class)
  437.             ->createQueryBuilder('c')
  438.             ->select($fields)
  439.             ->leftJoin('c.containers''containers')
  440.             ->leftJoin('containers.newTransferProducts''newtransferproducts')
  441.             ->leftJoin('newtransferproducts.product''product')
  442.             ->leftJoin('product.measurementUnit''measurementUnit')
  443.             ->where('c.dateOfOutCustoms >= :year')
  444.             ->andWhere('c.dateOfOutCustoms <= :nextYear')
  445.             ->setParameter('year'$year)
  446.             ->setParameter('nextYear'$nextYear)
  447.             ->groupBy('newtransferproducts.product')
  448.             ->getQuery()
  449.             ->getResult();
  450.         return $this->render('admin/stock_transfer/stocktransferreport.html.twig', [
  451.             'datas' => $stockTransfer
  452.         ]);
  453.     }
  454.     #[Route('/admin/stocktransfer/gettransferspermonth/{id}/{year}'name'admin_stocktransfer_getTransfersPerMonth')]
  455.     public function getTransfersPerMount(Request $request$id$year)
  456.     {
  457.         $product $this->entityManager->getRepository(Product::class)->find($id);
  458.         $transferedProductsRepo $this->entityManager->getRepository(NewTransferProducts::class);
  459.         $startDate = new \DateTime($year '-01-01');
  460.         $endDate = new \DateTime($year '-12-31');
  461.         $data[] = [];
  462.         $data['product'] = $product->getName();
  463.         $data['productId'] = $product->getId();
  464.         $data['productCode'] = $product->getCode();
  465.         $data['productMeasurement'] = $product->getMeasurementUnit()->getName();
  466.         while ($startDate <= $endDate) {
  467.             $month $startDate->format('m');
  468.             $year $startDate->format('Y');
  469.             // echo "AY :" . $month . "<br>";
  470.             $data['months'][$month] = [];
  471.             while ($startDate->format('Y') == $year && $startDate->format('m') == $month) {
  472.                 $weekStartDate = clone $startDate;
  473.                 $weekEndDate = clone $startDate;
  474.                 $weekEndDate->modify('+6 days');
  475.                 $startDateClone = clone $startDate;
  476.                 $nextMonth $startDate->format('m') !== $startDateClone->modify('+7 days')->format('m');
  477.                 if ($nextMonth) {
  478.                     $weekEndDate $startDate->modify('last day of this month');
  479.                 }
  480.                 $transferedQuantity $transferedProductsRepo
  481.                     ->createQueryBuilder('c')
  482.                     ->leftJoin('c.container''container')
  483.                     ->leftJoin('container.newStockTransfer''newStockTransfer')
  484.                     ->select("SUM(c.quantity) as quantity")
  485.                     ->where('c.product = :product')
  486.                     ->setParameter('product'$product->getId())
  487.                     ->andWhere('newStockTransfer.dateOfOutCustoms >= :startDate')
  488.                     ->andWhere('newStockTransfer.dateOfOutCustoms <= :finishDate')
  489.                     ->setParameter('startDate'$weekStartDate)
  490.                     ->setParameter('finishDate'$weekEndDate)
  491.                     ->getQuery()
  492.                     ->getResult()[0];
  493.                 if ($transferedQuantity["quantity"])
  494.                     $data['months'][$month][$weekStartDate->format('d-m-Y') . "_" $weekEndDate->format('d-m-Y')] = $transferedQuantity['quantity'];
  495.                 //echo "Hafta başlangıç :" . $weekStartDate->format('d.m.Y') . " Hafta Bitiş :" . $weekEndDate->format('d.m.Y') . "<br>";
  496.                 if ($nextMonth)
  497.                     $startDate->modify('first day of next month'); // Ay sonraki ayın 1. gününe geçmek için
  498.                 else
  499.                     $startDate->modify('+7 days');
  500.             }
  501.             if (empty($data['months'][$month]))
  502.                 unset($data['months'][$month]);
  503.         }
  504.         return $this->render('admin/stock_transfer/stocktransferdetailrow.html.twig', [
  505.             'datas' => $data
  506.         ]);
  507.         dd($data);
  508.         dd("assd");
  509.         while ($startDate <= $endDate) {
  510.             $year $startDate->format('Y');
  511.             $month $startDate->format('m');
  512.             $week $startDate->format('W');
  513.             echo $startDate->format('F Y') . ":\n";
  514.             while ($startDate->format('Y') === $year && $startDate->format('m') === $month) {
  515.                 $weekStartDate = clone $startDate;
  516.                 $weekEndDate = clone $startDate;
  517.                 $weekEndDate->modify('+6 days');
  518.                 echo "Week $week: " $weekStartDate->format('d.m.Y') . " - " $weekEndDate->format('d.m.Y') . "\n";
  519.                 $startDate->modify('+1 week');
  520.                 $week $startDate->format('W');
  521.             }
  522.         }
  523.         //        dd($stockTransferStartDate->format('Y'), $stockTransferEndDate->format('Y'));
  524.         dd("sada");
  525.         return new Response();
  526.     }
  527.     #[Route('/admin/stocktransfer/main-warehouse-avaible-products'name'admin_stocktransfer_getmainwarehouse_avaible_stocks')]
  528.     public function getMainWarehouseAvaibleStocks(Request $request)
  529.     {
  530.         $fields = ['c.id as buyingId''product.code as code''product.id as productId''product.name as productName''c.quantity as totalQuantity'];
  531.         $buyinTurkeyRepo $this->entityManager->getRepository(BuyInTurkey::class);
  532.         $avaibleStocks $buyinTurkeyRepo->createQueryBuilder('c')
  533.             ->select($fields)
  534.             ->leftJoin('c.product''product')
  535.             ->where('c.isTransported = 0')
  536.             ->getQuery()
  537.             ->getArrayResult();
  538.         //        $avaibleStocks = $this->buyInTurkeyService->getUnTransferedProducts();
  539.         return $this->json($avaibleStocks);
  540.     }
  541.     #[Route('/admin/stocktransfer/accepted/{id}'name'admin_stocktransfer_accepted')]
  542.     public function acceptedTransfer(Request $request$id)
  543.     {
  544.         $stocktransfer $this->entityManager->getRepository(StockTransfer::class)->find($id);
  545.         if ($stocktransfer->getTransaction()->getName() == 'YOLDA') {
  546.             return $this->redirectToRoute('admin_stock_transfer_edit', ['id' => $stocktransfer->getId()]);
  547.         }
  548.         $stocks $this->stockService->getByStockTransfer($stocktransfer);
  549.         $form $this->createForm(AddStockTransferFormType::class, $stocktransfer);
  550.         $stocktransferProduct = new StockTransferProducts();
  551.         $stockTransferProductForm $this->createForm(AddStockTransferProductsFormType::class, $stocktransferProduct);
  552.         $stocktransferProductsData $stocktransfer->getProducts();
  553.         $mainWarehouse $this->warehouseService->getMainWarehouse();
  554.         $form->handleRequest($request);
  555.         if ($form->isSubmitted() && $form->isValid()) {
  556.             if ($request->get('productName')) {
  557.                 $stocktransferProductsArr = new ArrayCollection();
  558.                 for ($i 0$i count($request->get('productName')); $i++) {
  559.                     $stocktransferProductsArr->add(
  560.                         new StockTransferProductsDto(
  561.                             $request->get('productName')[$i],
  562.                             $request->get('quantity')[$i],
  563.                             $request->get('unitPriceFob')[$i],
  564.                             $request->get('unitPriceNavlun')[$i],
  565.                             $request->get('totalUnitPrice')[$i],
  566.                             $request->get('totalSalePrice')[$i],
  567.                             $request->get('productId')[$i]
  568.                         )
  569.                     );
  570.                 }
  571.                 try {
  572.                     $this->stockTransferService->acceptTransfer($form->getData(), $stocktransferProductsArr);
  573.                     $this->checkTransfer($id);
  574.                     return $this->redirect('/admin/stock-transfer');
  575.                 } catch (Exception StockTransferWasAdded $exception) {
  576.                     $this->addFlash('error'$exception->getMessage());
  577.                 }
  578.             }
  579.         }
  580.         $this->checkTransfer($id);
  581.         $warehousesWithoutMain $this->warehouseService->getAllWithoutMainWarehouse();
  582.         return $this->render('admin/stock_transfer/acceptedtransfers.html.twig', [
  583.             'form' => $form->createView(),
  584.             'stockTransferProductsData' => $stocktransferProductsData,
  585.             'stockTransferProducts' => $stockTransferProductForm->createView(),
  586.             'stocks' => $stocks
  587.         ]);
  588.     }
  589.     #[Route('/admin/stocktransfer/product/information/{buyinTurkeyId}'name'admin_stocktransfer_product_info')]
  590.     public function getProductInfoFromBuyinTurkey(Request $request$buyinTurkeyId)
  591.     {
  592.         $fields = [
  593.             'measurement.thickness',
  594.             'measurement.width as width',
  595.             'measurement.length as length',
  596.             'c.totalCostPrice as avgUnitPrice',
  597.             'c.lashing as lashing',
  598.             'c.customsPrice as customsPrice',
  599.             'c.buyingPrice as buyingPrice',
  600.             'c.totalCostPrice as avgPriceFob',
  601.             'c.profitMargin as profitMargin',
  602.             'c.transportPrice as transportPrice',
  603.         ];
  604.         $repo $this->entityManager->getRepository(BuyInTurkey::class);
  605.         $query $repo->createQueryBuilder('c')
  606.             ->leftJoin('c.product''product')
  607.             ->leftJoin('product.measurement''measurement')
  608.             ->leftJoin('product.measurementUnit''measurementUnit')
  609.             ->select($fields)
  610.             ->where('c.id = :id')
  611.             ->setParameter('id'$buyinTurkeyId)
  612.             ->andWhere('c.isTransported = false')
  613.             ->getQuery()
  614.             ->getSingleResult();
  615.         //        $productInfo = $this->buyInTurkeyService->getProductInfoById($productid);
  616. //        dd($query);
  617.         return $this->json($query);
  618.     }
  619.     #[Route('/admin/stock-transfer/edit/{id}'name'admin_stock_transfer_edit')]
  620.     public function edit(Request $request$id)
  621.     {
  622.         $stocktransfer $this->entityManager->getRepository(StockTransfer::class)->find($id);
  623.         if ($stocktransfer->getTransaction()->getName() == 'TAMAMLANDI') {
  624.             return $this->redirectToRoute('admin_stocktransfer_accepted', ['id' => $stocktransfer->getId()]);
  625.         }
  626.         $form $this->createForm(AddStockTransferFormType::class, $stocktransfer);
  627.         $stocktransferProduct = new StockTransferProducts();
  628.         $stockTransferProductForm $this->createForm(AddStockTransferProductsFormType::class, $stocktransferProduct);
  629.         $stocktransferProductsData $stocktransfer->getProducts();
  630.         $mainWarehouse $this->warehouseService->getMainWarehouse();
  631.         $form->handleRequest($request);
  632.         if ($form->isSubmitted() && $form->isValid()) {
  633.             if ($request->get('productName')) {
  634.                 $stocktransferProductsArr = new ArrayCollection();
  635.                 for ($i 0$i count($request->get('productName')); $i++) {
  636.                     try {
  637.                         $this->stockInfoService->checkIsStockAvailable($request->get('quantity')[$i], $request->get('productId')[$i], $mainWarehouse->getId());
  638.                     } catch (StockNotAvaibleException StockNotFoundException $e) {
  639.                         $this->addFlash('error'$e->getMessage());
  640.                         return $this->redirectToRoute('app_admin_stock_transfer_new');
  641.                     }
  642.                     $stocktransferProductsArr->add(
  643.                         new StockTransferProductsDto(
  644.                             $request->get('productName')[$i],
  645.                             $request->get('quantity')[$i],
  646.                             $request->get('unitPriceFob')[$i],
  647.                             $request->get('unitPriceNavlun')[$i],
  648.                             $request->get('totalUnitPrice')[$i],
  649.                             $request->get('totalSalePrice')[$i],
  650.                             $request->get('productId')[$i]
  651.                         )
  652.                     );
  653.                 }
  654.                 try {
  655.                     $this->stockTransferService->update($form->getData(), $stocktransferProductsArr);
  656.                     return $this->redirectToRoute('admin_stock_transfer_edit', ['id' => $stocktransfer->getId()]);
  657.                 } catch (Exception StockTransferWasAdded $exception) {
  658.                     $this->addFlash('error'$exception->getMessage());
  659.                 }
  660.             }
  661.         }
  662.         $warehousesWithoutMain $this->warehouseService->getAllWithoutMainWarehouse();
  663.         return $this->render('admin/stock_transfer/edit.html.twig', [
  664.             'form' => $form->createView(),
  665.             'stockTransferProductsData' => $stocktransferProductsData,
  666.             'stockTransferProducts' => $stockTransferProductForm->createView()
  667.         ]);
  668.     }
  669.     #[Route('/admin/stock-transfer/show'name'app_admin_stock_transfer_show')]
  670.     public function show(Request $request)
  671.     {
  672.         $s $request->get('search')['value'];
  673.         $id $request->get('id');
  674.         $column $request->get('order')[0]['column'];
  675.         $dir $request->get('order')[0]['dir'];
  676.         $limit $request->get('length');
  677.         if ($request->get('start'))
  678.             $page + ($request->get('start') / $limit);
  679.         else
  680.             $page 1;
  681.         $stockTransferStatusId $request->get('transactionid');
  682.         $stocks $this->createArrayForDataTable(
  683.             $this->stockTransferService->getAllStockTransfersPaginate($page$limit$stockTransferStatusId1$dir$s)
  684.         );
  685.         $this->sortArrayByKey($stocks['data'], $columnfalse$dir == 'asc');
  686.         return new JsonResponse($stocks);
  687.     }
  688.     function sortArrayByKey(&$array$key$string false$asc true)
  689.     {
  690.         if ($string) {
  691.             usort($array, function ($a$b) use (&$key, &$asc) {
  692.                 if ($asc)
  693.                     return strcmp(strtolower($a[$key]), strtolower($b[$key]));
  694.                 else
  695.                     return strcmp(strtolower($b[$key]), strtolower($a[$key]));
  696.             });
  697.         } else {
  698.             usort($array, function ($a$b) use (&$key, &$asc) {
  699.                 if ($a[$key] == $b[$key]) {
  700.                     return 0;
  701.                 }
  702.                 if ($asc)
  703.                     return ($a[$key] < $b[$key]) ? -1;
  704.                 else
  705.                     return ($a[$key] > $b[$key]) ? -1;
  706.             });
  707.         }
  708.     }
  709.     public function log(
  710.         $name,
  711.         $description,
  712.         $quantity,
  713.         $beforeQuantity,
  714.         $afterQuantity,
  715.         $action,
  716.         ?NewStockTransfer $stockTransfer,
  717.         ?Product $product,
  718.         ?Sales $sales,
  719.         ?Warehouse $warehouse,
  720.     ) {
  721.         $stockTransaction = new StockTransaction();
  722.         $stockTransaction->setName($name);
  723.         $stockTransaction->setDescription($description);
  724.         $stockTransaction->setQuantity($quantity);
  725.         $stockTransaction->setAfterQuantity($afterQuantity);
  726.         $stockTransaction->setBeforeQuantity($beforeQuantity);
  727.         $stockTransaction->setSource(StockTransactionSource::TRANSFER);
  728.         $stockTransaction->setAction($action);
  729.         //        $stockTransaction->addStockTransfer(null);
  730.         $stockTransaction->setProductId($product);
  731.         $stockTransaction->setSale($sales);
  732.         $stockTransaction->setWarehouse($warehouse);
  733.         $this->stockTransactionService->create($stockTransaction);
  734.     }
  735.     private function createArrayForDataTable($stocks): array
  736.     {
  737.         $records = [];
  738.         $records['recordsTotal'] = $stocks->getTotalItemCount();
  739.         $records['recordsFiltered'] = $stocks->getTotalItemCount();
  740.         $records["data"] = [];
  741.         foreach ($stocks as $entity) {
  742.             //            $entity  = new NewStockTransfer();
  743.             $totalAmount 0.00;
  744.             foreach ($entity->getContainers() as $container) {
  745.                 $totalAmount += $container->getTotalPrice();
  746.             }
  747.             $records["data"][] = array(
  748.                 $entity->getId(),
  749.                 $entity->getInvoiceNumber(),
  750.                 $entity->getContainerNumber(),
  751.                 $entity->getKonsimento(),
  752.                 $entity->getArrivalWarehouse()->getName(),
  753.                 CurrencyHelper::convertToCurrency($totalAmount),
  754.                 $entity->getDateOfOutCustoms()->format('d.m.Y'),
  755.                 !$entity->isIsCompleted() ? '<a class="btn btn-success" target="_blank" href="' $this->generateUrl('app_admin_stock_transfer_accep', ['id' => $entity->getId()]) . '">' $this->translator->trans('forms.stocktransfer.newstocktransfer.accept') . '</a>' "Tamamlandı",
  756.             );
  757.         }
  758.         return $records;
  759.     }
  760.     public function getUnTransferedStockTransfers()
  761.     {
  762.         $repo $this->entityManager->getRepository(NewStockTransfer::class);
  763.         $result $repo->findBy(['isCompleted' => false]);
  764.         return $this->render('admin/components/customswaitingfr.html.twig', [
  765.             'result' => $result,
  766.             'resultCount' => count($result)
  767.         ]);
  768.     }
  769.     public function setWarehouseService(WarehouseService $warehouseService): void
  770.     {
  771.         $this->warehouseService $warehouseService;
  772.     }
  773.     public function setProductService(ProductService $productService): void
  774.     {
  775.         $this->productService $productService;
  776.     }
  777.     public function setStockTransferService(StockTransferService $stockTransferService): void
  778.     {
  779.         $this->stockTransferService $stockTransferService;
  780.     }
  781.     public function setStockInfoService(StockInfoService $stockInfoService): void
  782.     {
  783.         $this->stockInfoService $stockInfoService;
  784.     }
  785.     public function setStockService(StockService $stockService): void
  786.     {
  787.         $this->stockService $stockService;
  788.     }
  789.     public function setBuyInTurkeyService(BuyInTurkeyService $buyInTurkeyService): void
  790.     {
  791.         $this->buyInTurkeyService $buyInTurkeyService;
  792.     }
  793. }