src/Parcels/DefaultController.php line 194

Open in your IDE?
  1. <?php
  2. namespace App\Parcels;
  3. use App\Entity\CollectedParcel;
  4. use App\Entity\Delivery;
  5. use App\Entity\Transaction;
  6. use App\Entity\UserStation;
  7. use App\Entity\TransactionExpense;
  8. use App\Entity\WayBill;
  9. use Doctrine\Persistence\ManagerRegistry;
  10. use Doctrine\Persistence\ObjectManager;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\Form\Extension\Core\Type\TextType;
  13. use Symfony\Component\Form\FormError;
  14. use Symfony\Component\HttpFoundation\File\File;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\Routing\Annotation\Route;
  17. use Symfony\Component\Validator\Constraints\NotBlank;
  18. class DefaultController extends AbstractController
  19. {
  20. private ObjectManager $em;
  21. public function __construct(ManagerRegistry $managerRegistry)
  22. {
  23. $this->em = $managerRegistry->getManager();
  24. }
  25. /**
  26. * @Route("/", name="parcels_homepage")
  27. */
  28. public function indexAction(Request $request){
  29. $em = $this->em;
  30. /** @var UserStation $userTown */
  31. $userTown = $em->getRepository(UserStation::class)->findOneBy([
  32. 'user' => $this->getUser(),
  33. 'isActive' => true
  34. ], ['id'=>'DESC']);
  35. $form = $this->searchWaybill();
  36. $form->handleRequest($request);
  37. $lastDay = $this->getLastActivityDate();
  38. $dashboardCounts = $userTown ? $this->getDashboardCounts($userTown->getStation(), $lastDay) : null;
  39. if($form->isSubmitted()){
  40. $wayb = $form->getData()['waybill'];
  41. $waybill = $em->getRepository(WayBill::class)->findOneBy([
  42. 'id' => $wayb
  43. ]);
  44. if(!$waybill){
  45. $form->get('waybill')->addError(new FormError(
  46. "waybill {$wayb} does not exist"
  47. ));
  48. }
  49. if($form->isValid()){
  50. // continue here
  51. return $this->redirectToRoute('one_way_bill',['id'=>$wayb]);
  52. }
  53. }
  54. // replace this example code with whatever you need
  55. return $this->render('fos/home/home.html.twig', [
  56. 'user_town' => $userTown,
  57. 'form' => $form->createView(),
  58. 'dashboard_counts' => $dashboardCounts,
  59. 'dashboard_day' => $lastDay
  60. ]);
  61. }
  62. /**
  63. * The most recent calendar date that has any waybill activity in the system.
  64. * Falls back to today when the system has no data yet.
  65. */
  66. private function getLastActivityDate(): \DateTimeImmutable
  67. {
  68. $lastCreatedAt = $this->em->createQueryBuilder()
  69. ->select('MAX(w.createdAt)')
  70. ->from(WayBill::class, 'w')
  71. ->getQuery()
  72. ->getSingleScalarResult();
  73. return $lastCreatedAt ? new \DateTimeImmutable($lastCreatedAt) : new \DateTimeImmutable();
  74. }
  75. /**
  76. * Per-tile dashboard counts, scoped to a single station and a single calendar day.
  77. */
  78. private function getDashboardCounts($station, \DateTimeImmutable $day): array
  79. {
  80. $em = $this->em;
  81. $dayStart = $day->setTime(0, 0, 0);
  82. $dayEnd = $day->setTime(23, 59, 59);
  83. $outgoing = (int) $em->createQueryBuilder()
  84. ->select('COUNT(d.id)')
  85. ->from(Delivery::class, 'd')
  86. ->andWhere('d.originStation = :station')
  87. ->andWhere('d.isReceived = false')
  88. ->andWhere('d.createdAt BETWEEN :start AND :end')
  89. ->setParameter('station', $station)
  90. ->setParameter('start', $dayStart)
  91. ->setParameter('end', $dayEnd)
  92. ->getQuery()
  93. ->getSingleScalarResult();
  94. $incoming = (int) $em->createQueryBuilder()
  95. ->select('COUNT(d.id)')
  96. ->from(Delivery::class, 'd')
  97. ->andWhere('d.destination = :station')
  98. ->andWhere('d.isReceivedFully = false')
  99. ->andWhere('d.isVerified = true')
  100. ->andWhere('d.createdAt BETWEEN :start AND :end')
  101. ->setParameter('station', $station)
  102. ->setParameter('start', $dayStart)
  103. ->setParameter('end', $dayEnd)
  104. ->getQuery()
  105. ->getSingleScalarResult();
  106. $uncollected = (int) $em->createQueryBuilder()
  107. ->select('COUNT(DISTINCT d.id)')
  108. ->from(Delivery::class, 'd')
  109. ->join('d.parcels', 'dp')
  110. ->join('dp.parcel', 'p')
  111. ->join('p.waybill', 'w')
  112. ->andWhere('d.destination = :station')
  113. ->andWhere('d.isReceived = true')
  114. ->andWhere('d.isVerified = true')
  115. ->andWhere('w.isCollected = false')
  116. ->andWhere('d.receivedAt BETWEEN :start AND :end')
  117. ->setParameter('station', $station)
  118. ->setParameter('start', $dayStart)
  119. ->setParameter('end', $dayEnd)
  120. ->getQuery()
  121. ->getSingleScalarResult();
  122. $collected = (int) $em->createQueryBuilder()
  123. ->select('COUNT(cp.id)')
  124. ->from(CollectedParcel::class, 'cp')
  125. ->join('cp.waybill', 'w')
  126. ->andWhere('w.toStation = :station')
  127. ->andWhere('cp.createdAt BETWEEN :start AND :end')
  128. ->setParameter('station', $station)
  129. ->setParameter('start', $dayStart)
  130. ->setParameter('end', $dayEnd)
  131. ->getQuery()
  132. ->getSingleScalarResult();
  133. $atOffice = (int) $em->createQueryBuilder()
  134. ->select('COUNT(w.id)')
  135. ->from(WayBill::class, 'w')
  136. ->andWhere('w.fromStation = :station')
  137. ->andWhere('w.isReceived = false')
  138. ->andWhere('w.isCollected = false')
  139. ->andWhere('w.createdAt BETWEEN :start AND :end')
  140. ->setParameter('station', $station)
  141. ->setParameter('start', $dayStart)
  142. ->setParameter('end', $dayEnd)
  143. ->getQuery()
  144. ->getSingleScalarResult();
  145. $transactions = (int) $em->createQueryBuilder()
  146. ->select('COUNT(t.id)')
  147. ->from(Transaction::class, 't')
  148. ->join('t.wayBill', 'w')
  149. ->andWhere('w.fromStation = :station')
  150. ->andWhere('t.createdAt BETWEEN :start AND :end')
  151. ->setParameter('station', $station)
  152. ->setParameter('start', $dayStart)
  153. ->setParameter('end', $dayEnd)
  154. ->getQuery()
  155. ->getSingleScalarResult();
  156. return [
  157. 'outgoing' => $outgoing,
  158. 'incoming' => $incoming,
  159. 'uncollected' => $uncollected,
  160. 'collected' => $collected,
  161. 'at_office' => $atOffice,
  162. 'transactions' => $transactions,
  163. ];
  164. }
  165. public function nav() {
  166. return $this->render('fos/nav.html.twig', []);
  167. }
  168. /**
  169. * @Route("/add-expense", name="parcels_add_expense")
  170. */
  171. public function addExpense(){
  172. $em = $this->getDoctrine()->getManager();
  173. $transaction = $em->getRepository(Transaction::class)->findOneBy([
  174. 'wayBill' => 23
  175. ]);
  176. $expenseType = $em->getRepository('App:ExpenseType')->findOneBy([
  177. 'id' => 3
  178. ]);
  179. $autoExpenses = $em->getRepository('App:ExpenseType')->findBy([
  180. 'isActive' => true,
  181. 'isAutomatic' => true
  182. ]);
  183. $wayBillExpense = new TransactionExpense();
  184. $wayBillExpense->setCreatedAt(new \DateTime());
  185. $wayBillExpense->setCreatedBy($this->getUser());
  186. $wayBillExpense->setTransaction($transaction);
  187. $wayBillExpense->setAmount(50);
  188. $wayBillExpense->setExpenseType($expenseType);
  189. $em->persist($wayBillExpense);
  190. /*foreach ($autoExpenses as $item) {
  191. if($item->getAutoExpense()) {
  192. if($item->getAutoExpense()->getisSystem()) {
  193. dump($item->getAutoExpense());
  194. $wayBillExpense = new TransactionExpense();
  195. $wayBillExpense->setCreatedAt(new \DateTime());
  196. $wayBillExpense->setCreatedBy($this->getUser());
  197. $wayBillExpense->setTransaction($transaction);
  198. $wayBillExpense->setAmount($item->getAutoExpense()->getAmount());
  199. $wayBillExpense->setExpenseType($item);
  200. $em->persist($wayBillExpense);
  201. }
  202. }
  203. }*/
  204. $em->flush();
  205. /** @var UserStation $userTown */
  206. $userTown = $em->getRepository(UserStation::class)->findOneBy([
  207. 'user' => $this->getUser(),
  208. 'isActive' => true
  209. ], ['id'=>'DESC']);
  210. // replace this example code with whatever you need
  211. return $this->render('fos/home/home.html.twig', [
  212. 'user_town' => $userTown
  213. ]);
  214. }
  215. private function searchWaybill() {
  216. return $this->createFormBuilder()
  217. ->add('waybill',TextType::class,[
  218. 'constraints' =>[
  219. new NotBlank(['message' => 'Please enter a waybill'])
  220. ]
  221. ])
  222. ->setMethod('POST')
  223. ->getForm();
  224. }
  225. /**
  226. * @Route("/download_app", name="download_app")
  227. */
  228. public function downloadApp(){
  229. // load the file from the filesystem
  230. $file = new File("../public/assets/android-app/courier_26032025.apk");
  231. return $this->file($file);
  232. }
  233. }