src/Api/DeliveryController.php line 113

Open in your IDE?
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: parcel
  5. * Date: 1/3/19
  6. * Time: 9:02 AM
  7. */
  8. namespace App\Api;
  9. use App\Controller\SendSms;
  10. use App\Entity\CollectedParcel;
  11. use App\Entity\Delivery;
  12. use App\Entity\DeliveryParcel;
  13. use App\Entity\DeliveryVehicle;
  14. use App\Entity\Parcel;
  15. use App\Entity\Sms;
  16. use App\Entity\Station;
  17. use App\Entity\UserStation;
  18. use App\Entity\Vehicle;
  19. use App\Entity\WayBill;
  20. use App\Service\ActionMatrix;
  21. use DateTime;
  22. use Doctrine\Persistence\ManagerRegistry;
  23. use Doctrine\Persistence\ObjectManager;
  24. use FOS\RestBundle\Controller\AbstractFOSRestController;
  25. use JMS\Serializer\SerializationContext;
  26. use JMS\Serializer\SerializerBuilder;
  27. use Psr\Log\LoggerInterface;
  28. use Symfony\Component\Config\Definition\Exception\Exception;
  29. use Symfony\Component\HttpFoundation\JsonResponse;
  30. use Symfony\Component\HttpFoundation\Request;
  31. use Symfony\Component\HttpFoundation\Response;
  32. use FOS\RestBundle\Controller\Annotations as Rest;
  33. use Symfony\Component\Messenger\MessageBusInterface;
  34. use Symfony\Component\Serializer\Encoder\JsonDecode;
  35. class DeliveryController extends AbstractFOSRestController {
  36. private LoggerInterface $logger;
  37. private ActionMatrix $actionMatrix;
  38. private ObjectManager $em;
  39. private MessageBusInterface $messageBus;
  40. public function __construct(LoggerInterface $logger, ManagerRegistry $managerRegistry, MessageBusInterface $messageBus){
  41. $this->logger = $logger;
  42. $this->em = $managerRegistry->getManager();
  43. $this->messageBus = $messageBus;
  44. }
  45. /**
  46. * @Rest\Get("/stations", name="get_all_stations")
  47. */
  48. public function getStations(Request $request): JsonResponse
  49. {
  50. $em = $this->em;
  51. /** @var $stations Station[] */
  52. $stations = $em->getRepository(Station::class)->findAllStations(1);
  53. return new JsonResponse($stations, Response::HTTP_OK);
  54. }
  55. /**
  56. * @Rest\Get("/deliveries/receive_init/{station_id}", name="initialize_receive_totals")
  57. */
  58. public function receiveInitDelivery($station_id): JsonResponse
  59. {
  60. $em = $this->em;
  61. $deliveries = $em->getRepository(Delivery::class)->findBy([
  62. 'destination' => $station_id,
  63. 'isReceivedFully' => false,
  64. 'isVerified' => true
  65. ]);
  66. $data = [
  67. 'deliveries_total' => count($deliveries),
  68. 'deliveries' => $deliveries
  69. ];
  70. return new JsonResponse($data, Response::HTTP_OK);
  71. }
  72. /**
  73. * @Rest\Get("/deliveries/receive/{station_id}", name="deliveries_on_route")
  74. */
  75. public function onRouteDeliveries($station_id): JsonResponse
  76. {
  77. $em = $this->em;
  78. $deliveries = $em->getRepository(Delivery::class)->findBy([
  79. 'destination' => $station_id,
  80. 'isReceivedFully' => false,
  81. 'isVerified' => true,
  82. 'isCancelled' => false,
  83. 'isLoaded' => true
  84. ]);
  85. return new JsonResponse($deliveries, Response::HTTP_OK);
  86. }
  87. /**
  88. * @Rest\Patch("/deliveries/receive/{delivery_id}", name="receive_delivery")
  89. */
  90. public function receiveDelivery($delivery_id): JsonResponse
  91. {
  92. $em = $this->em;
  93. /** @var Delivery $delivery */
  94. $delivery = $em->getRepository(Delivery::class)->findOneBy([
  95. 'id' => $delivery_id
  96. ]);
  97. if($delivery->getisReceived()){
  98. $data = [
  99. 'error' => [
  100. 'message' => "Delivery was received by: ".$delivery->getReceivedBy()->getPerson()->getFirstName().' '.$delivery->getReceivedBy()->getPerson()->getSecondName()
  101. ]
  102. ];
  103. return new JsonResponse($data,Response::HTTP_CONFLICT);
  104. }
  105. try {
  106. $delivery->setIsReceived(true);
  107. $delivery->setReceivedAt(new \DateTime());
  108. $delivery->setReceivedBy($this->getUser());
  109. $em->flush();
  110. $data = [
  111. 'id' => $delivery->getId(),
  112. 'parcel_count' => $delivery->getParcelCount(),
  113. 'destination' => $delivery->getDestination()->getId(),
  114. 'origin_station' => $delivery->getOriginStation()->getId(),
  115. 'is_cancelled' => $delivery->getisCancelled(),
  116. 'is_received' => $delivery->getisReceived()
  117. ];
  118. return new JsonResponse($data, Response::HTTP_OK);
  119. }catch (Exception $e){
  120. return new JsonResponse($delivery, Response::HTTP_EXPECTATION_FAILED);
  121. }
  122. }
  123. /**
  124. * @Rest\Patch("/deliveries/receive/waybill/{waybill}/{station}", name="receive_waybill")
  125. * @param $waybill
  126. * @param $station
  127. * @return JsonResponse
  128. */
  129. public function receiveSingleWaybill($waybill, $station): JsonResponse
  130. {
  131. $em = $this->em;
  132. /** @var WayBill $waybill */
  133. $waybill = $em->getRepository(WayBill::class)->findOneBy([
  134. 'id' => $waybill,
  135. 'toStation' => $station
  136. ]);
  137. if(!$waybill){
  138. $data = [
  139. 'message' => "WAYBILL NOT FOUND"
  140. ];
  141. return new JsonResponse($data, Response::HTTP_NOT_FOUND);
  142. }
  143. if(0==1){
  144. $data = [
  145. 'message' => "WAYBILL ALREADY RECEIVED"
  146. ];
  147. return new JsonResponse($data, Response::HTTP_ALREADY_REPORTED);
  148. }
  149. $waybill->setReceivedBy($this->getUser());
  150. $waybill->setIsReceived(true);
  151. $waybill->setReceivedAt(new \DateTime());
  152. $this->actionMatrix = new ActionMatrix($this->messageBus,$this->em,$waybill);
  153. $this->actionMatrix->receivingAction($this->getUser());
  154. $data = [
  155. "message" => "PARCEL RECEIVED"
  156. ];
  157. return new JsonResponse($data, Response::HTTP_OK);
  158. }
  159. /**
  160. * @Rest\Post("/deliveries/receive/bulk/{station}", name="receive_bulk_waybill")
  161. * @param Request $request
  162. * @param $station
  163. * @return JsonResponse
  164. */
  165. public function receiveBulkWaybill(Request $request,$station): JsonResponse
  166. {
  167. // [{"waybill":1044435},{"waybill":1044488},{"waybill":1044506}]
  168. $waybillNumberArrayObject = json_decode($request->getContent());
  169. $em = $this->em;
  170. foreach ($waybillNumberArrayObject as $index => $item) {
  171. /* $response = $this->forward('App\Api\DeliveryController::receiveSingleWaybill', [
  172. 'waybill' => $item->waybill,
  173. 'station' => $station,
  174. ]);*/
  175. // /** @var WayBill $waybill */
  176. // $waybill = $em->getRepository(WayBill::class)->findOneBy([
  177. // 'id' => $item->waybill
  178. // ]);
  179. // $this->logger->debug("JSON CONTENT".$waybill->getTransaction()->getAmount());
  180. /** @var WayBill $waybill */
  181. $waybill = $em->getRepository(WayBill::class)->findOneBy([
  182. 'id' => $item->waybill,
  183. 'toStation' => $station
  184. ]);
  185. if(!$waybill){
  186. $data = [
  187. 'message' => "WAYBILL NOT FOUND"
  188. ];
  189. return new JsonResponse($data, Response::HTTP_NOT_FOUND);
  190. }
  191. if(0==1){
  192. $data = [
  193. 'message' => "WAYBILL ALREADY RECEIVED"
  194. ];
  195. return new JsonResponse($data, Response::HTTP_ALREADY_REPORTED);
  196. }
  197. $waybill->setReceivedBy($this->getUser());
  198. $waybill->setIsReceived(true);
  199. $waybill->setReceivedAt(new \DateTime());
  200. //1044588
  201. $this->actionMatrix = new ActionMatrix($this->messageBus,$this->em,$waybill);
  202. $this->actionMatrix->receivingAction($this->getUser());
  203. }
  204. $this->logger->debug("JSON CONTENT".$request->getContent());
  205. $data = [
  206. "message" => $request->getContent()
  207. ];
  208. return new JsonResponse($data, Response::HTTP_OK);
  209. }
  210. /**
  211. * @Rest\Patch("/deliveries/receive/parcel/{parcel_id}", name="receive_delivery_parcel")
  212. */
  213. public function receiveParcel($parcel_id): JsonResponse
  214. {
  215. $em = $this->em;
  216. /** @var DeliveryParcel $deliveryParcel */
  217. $deliveryParcel = $em->getRepository(DeliveryParcel::class)->findOneBy([
  218. 'id' => $parcel_id
  219. ]);
  220. if($deliveryParcel->getisReceived()){
  221. $data = [
  222. 'id' => $deliveryParcel->getId(),
  223. 'parcel' => $deliveryParcel->getParcel()->getId(),
  224. 'delivery' => $deliveryParcel->getDelivery()->getId(),
  225. 'is_cancelled' => $deliveryParcel->getisCancelled(),
  226. 'cancelled_because' => $deliveryParcel->getCancelledBecause()
  227. ];
  228. return new JsonResponse($data, Response::HTTP_CONFLICT);
  229. }
  230. /** @var UserStation $userStation */
  231. $userStation = $em->getRepository(UserStation::class)->findOneBy([
  232. 'user' => $this->getUser()
  233. ],['id' =>'DESC']);
  234. try {
  235. $deliveryParcel->setIsReceived(true);
  236. $deliveryParcel->setReceivedAt(new \DateTime());
  237. $deliveryParcel->setReceivedBy($this->getUser());
  238. $deliveryParcel->getParcel()->getWaybill()->setIsReceived(true);
  239. $deliveryParcel->getParcel()->getWaybill()->setReceivedBy($this->getUser());
  240. $delivery = $em->getRepository(Delivery::class)->findOneBy([
  241. 'id' => $deliveryParcel->getDelivery()
  242. ]);
  243. if(($delivery->getReceivedParcels() + 1) === $delivery->getParcelCount()){
  244. $delivery->setIsReceivedFully(true);
  245. }
  246. $delivery->setReceivedParcels($delivery->getReceivedParcels() + 1);
  247. if($deliveryParcel->getParcel()->getWaybill()->getToStation() === $userStation->getStation()) {
  248. $this->actionMatrix = new ActionMatrix($this->messageBus,$this->em,$deliveryParcel->getParcel()->getWaybill());
  249. $this->actionMatrix->receivingAction($this->getUser());
  250. }
  251. $data = [
  252. 'id' => $deliveryParcel->getId(),
  253. 'parcel' => $deliveryParcel->getParcel()->getId(),
  254. 'delivery' => $deliveryParcel->getDelivery()->getId(),
  255. 'is_cancelled' => $deliveryParcel->getisCancelled(),
  256. 'cancelled_because' => $deliveryParcel->getCancelledBecause()
  257. ];
  258. return new JsonResponse($data, Response::HTTP_OK);
  259. }catch (Exception $e){
  260. $data = [
  261. 'id' => $deliveryParcel->getId(),
  262. 'parcel' => $deliveryParcel->getParcel()->getId(),
  263. 'delivery' => $deliveryParcel->getDelivery()->getId(),
  264. 'is_cancelled' => $deliveryParcel->getisCancelled(),
  265. 'cancelled_because' => $deliveryParcel->getCancelledBecause()
  266. ];
  267. return new JsonResponse($data, Response::HTTP_EXPECTATION_FAILED);
  268. }
  269. }
  270. /**
  271. * @Rest\Get("/deliveries/collect/{waybill_id}", name="getOneWaybill_for_Collection")
  272. */
  273. public function getWayBillForCollection($waybill_id): JsonResponse
  274. {
  275. $em = $this->em;
  276. /** @var UserStation $userStation */
  277. $userStation = $em->getRepository(UserStation::class)->findOneBy([
  278. 'user' => $this->getUser()
  279. ],['id' => 'DESC']);
  280. $parcel = $em->getRepository(DeliveryParcel::class)->unCollectedParcel(
  281. $waybill_id
  282. );
  283. if(!$parcel) {
  284. $data = [
  285. 'error' => [
  286. 'message' => "Parcel Not found or already Collected"
  287. ]
  288. ];
  289. return new JsonResponse($data, Response::HTTP_CONFLICT);
  290. }
  291. $waybill = $em->getRepository(WayBill::class)->findOneBy([
  292. 'id' => $waybill_id
  293. ]);
  294. return new JsonResponse($waybill, Response::HTTP_OK);
  295. }
  296. /**
  297. * @Rest\Get("/deliveries/incoming/waybill/{station_id}/{waybill}", name="search_delivery_by_waybill")
  298. * @param $station_id
  299. * @param $waybill
  300. * @param Request $request
  301. * @return JsonResponse|Response
  302. */
  303. public function searchDeliveryByWaybill($station_id, $waybill, Request $request): JsonResponse|Response
  304. {
  305. $em = $this->em;
  306. $context = new SerializationContext();
  307. $context->setSerializeNull(true);
  308. $serializer = SerializerBuilder::create()->build();
  309. $resultWaybill = $em->getRepository(DeliveryParcel::class)->findWaybill($station_id, $waybill);
  310. if(!$resultWaybill){
  311. return new JsonResponse(null, Response::HTTP_NOT_FOUND);
  312. }
  313. $delivery_id = $resultWaybill['delivery_id'];
  314. $delivery = $em->getRepository(Delivery::class)->findIncomingDelivery($station_id, $delivery_id);
  315. if($delivery){
  316. $incomingParcels = $em->getRepository(DeliveryParcel::class)->commonDeliveryIncomingParcels($delivery_id);
  317. /** @var DeliveryVehicle $deliveryVehicle */
  318. $deliveryVehicle = $em->getRepository(DeliveryVehicle::class)->findOneBy([
  319. 'delivery' => $delivery_id
  320. ],['id' => 'DESC']);
  321. if($deliveryVehicle){
  322. $delivery['delivery_vehicle'] = $deliveryVehicle->getVehicle()->getRegNumber();
  323. }
  324. if($incomingParcels){
  325. $delivery['parcels'] = $incomingParcels;
  326. }
  327. }else{
  328. return new JsonResponse(null, Response::HTTP_NOT_FOUND);
  329. }
  330. $data = $serializer->serialize($delivery, 'json', $context);
  331. return new Response($data, Response::HTTP_OK);
  332. }
  333. /**
  334. * @Rest\Post("/deliveries/collect/{waybill_id}", name="update_waybill_as_collected")
  335. */
  336. public function collectWaybill($waybill_id, Request $request) {
  337. $em = $this->em;
  338. $collectorName = $request->request->get('collector_name');
  339. $collectorID = $request->request->get('collector_id');
  340. $waybill = $em->getRepository(WayBill::class)->findOneBy([
  341. 'id' => $waybill_id
  342. ]);
  343. if($waybill) {
  344. $waybill->setIsCollected(true);
  345. $collectedParcel = new CollectedParcel();
  346. $collectedParcel->setCreatedBy($this->getUser());
  347. $collectedParcel->setCreatedAt(new \DateTime());
  348. $collectedParcel->setWaybill($waybill);
  349. $collectedParcel->setCollectorName($collectorName);
  350. $collectedParcel->setNationalId($collectorID);
  351. $waybill->setCollectedParcel($collectedParcel);
  352. try {
  353. $em->persist($collectedParcel);
  354. $em->flush();
  355. $data = [
  356. 'id' => $waybill->getId(),
  357. 'sender_name' => $waybill->getSenderName(),
  358. 'receiver_name' => $waybill->getReceiverName(),
  359. 'sender_phone_number' => $waybill->getSenderPhoneNumber(),
  360. 'receiver_phone_number' => $waybill->getReceiverPhoneNumber(),
  361. 'from_station' => $waybill->getFromStation()->getId(),
  362. 'to_station' => $waybill->getToStation()->getId(),
  363. 'transaction' => $waybill->getTransaction()->getId(),
  364. 'is_collected' => $waybill->getIsCollected()
  365. ];
  366. return new JsonResponse($data, Response::HTTP_CREATED);
  367. }catch (Exception $e){
  368. return new JsonResponse($waybill, Response::HTTP_EXPECTATION_FAILED);
  369. }
  370. }
  371. }
  372. /**
  373. * @Rest\Get("/deliveries/parcels/{way_bill}/{id}/", name="getOneParcel_for_delivery")
  374. */
  375. public function getParcel($way_bill, $id): JsonResponse
  376. {
  377. $em = $this->em;
  378. /** @var UserStation $userStation */
  379. $userStation = $em->getRepository(UserStation::class)->findOneBy([
  380. 'user' => $this->getUser()
  381. ],['id' => 'DESC']);
  382. $deliveryParcel = $em->getRepository(DeliveryParcel::class)->findOneBy([
  383. 'parcel' => $id,
  384. 'isCancelled' => false
  385. ],['id' => 'DESC']);
  386. $waybill = $em->getRepository(WayBill::class)->findOneBy([
  387. 'id' => $way_bill,
  388. 'fromStation' => $userStation->getStation()
  389. ]);
  390. if(!$waybill) {
  391. $data = [
  392. 'parcel' => null,
  393. 'parcels' => null,
  394. 'waybill' => null
  395. ];
  396. return new JsonResponse($data, Response::HTTP_NOT_FOUND);
  397. }
  398. $parcel = $em->getRepository(Parcel::class)->findOneBy([
  399. 'number' => $id,
  400. 'waybill' => $waybill
  401. ]);
  402. $parcels = $em->getRepository(Parcel::class)->findBy([
  403. 'waybill' => $waybill
  404. ]);
  405. $data = [
  406. 'parcel' => $parcel,
  407. 'parcels' => $parcels,
  408. 'waybill' => $waybill
  409. ];
  410. return new JsonResponse($data, Response::HTTP_OK);
  411. }
  412. /**
  413. * @Rest\Patch("/deliveries/verify/{delivery}", name="verify_delivery_to_vehicle")
  414. */
  415. public function verifyDelivery($delivery) {
  416. $em = $this->em;
  417. $deliveryVehicle = $em->getRepository(DeliveryVehicle::class)->findOneBy([
  418. 'delivery' => $delivery,
  419. 'isCancelled' => false
  420. ]);
  421. $deliveryParcels = $em->getRepository(DeliveryParcel::class)->findBy([
  422. 'delivery' => $delivery,
  423. 'isCancelled' => false
  424. ]);
  425. if($deliveryVehicle){
  426. /** @var Delivery $delivery */
  427. $delivery = $em->getRepository(Delivery::class)->findOneBy([
  428. 'id' => $deliveryVehicle->getDelivery()
  429. ]);
  430. if($deliveryVehicle) {
  431. $deliveryVehicle->setIsVerified(true);
  432. $deliveryVehicle->setVerifiedBy($this->getUser());
  433. $deliveryVehicle->setVerifiedAt(new DateTime());
  434. $delivery->setIsVerified(true);
  435. $delivery->setParcelCount(count($deliveryParcels));
  436. try {
  437. $em->flush();
  438. $data = [
  439. 'id' => $delivery->getId(),
  440. 'parcel_count' => $delivery->getParcelCount(),
  441. 'destination' => $delivery->getDestination()->getId(),
  442. 'origin_station' => $delivery->getOriginStation()->getId(),
  443. 'is_cancelled' => $delivery->getisCancelled(),
  444. ];
  445. $this->sendLoadingSms($delivery, $this->logger);
  446. return new JsonResponse($data, Response::HTTP_OK);
  447. }catch (Exception $e){
  448. return new JsonResponse($delivery, Response::HTTP_EXPECTATION_FAILED);
  449. }
  450. }
  451. }else{
  452. $data = [
  453. 'error' => [
  454. 'message' => "This parcel is not loaded"
  455. ]
  456. ];
  457. return new JsonResponse($data, Response::HTTP_CONFLICT);
  458. }
  459. }
  460. /**
  461. * @Rest\Post("/deliveries/load/{delivery_id}/{vehicle_id}", name="load_delivery_to_vehicle")
  462. */
  463. public function loadDelivery($delivery_id, $vehicle_id): JsonResponse
  464. {
  465. $em = $this->em;
  466. $delivery = $em->getRepository(Delivery::class)->findOneBy([
  467. 'id' => $delivery_id
  468. ]);
  469. if($vehicle_id == 1796){
  470. return new JsonResponse(['message' => 'No vehicle'], Response::HTTP_EXPECTATION_FAILED);
  471. }
  472. $vehicle = $em->getRepository(Vehicle::class)->findOneBy([
  473. 'id' => $vehicle_id
  474. ]);
  475. /** @var DeliveryVehicle $deliveryVehicle */
  476. $deliveryVehicle = $em->getRepository(DeliveryVehicle::class)->findOneBy([
  477. 'delivery' => $delivery,
  478. 'isCancelled' => false
  479. ]);
  480. if($deliveryVehicle){
  481. $deliveryVehicle->setIsCancelled(true);
  482. $deliveryVehicle->setCancelledBy($this->getUser());
  483. $deliveryVehicle->setCancelledAt(new DateTime());
  484. }
  485. $newDeliveryVehicle = new DeliveryVehicle();
  486. $newDeliveryVehicle->setVehicle($vehicle);
  487. $newDeliveryVehicle->setDelivery($delivery);
  488. $newDeliveryVehicle->setCreatedAt(new DateTime());
  489. $newDeliveryVehicle->setIsCancelled(false);
  490. $newDeliveryVehicle->setIsVerified(false);
  491. $newDeliveryVehicle->setCreatedBy($this->getUser());
  492. $data = [];
  493. try {
  494. $em->persist($newDeliveryVehicle);
  495. $delivery->setIsLoaded(true);
  496. $delivery->setLoadedAt(new DateTime());
  497. $delivery->setLoadedBy($this->getUser());
  498. $em->flush();
  499. /** @var DeliveryParcel[] $parcels */
  500. $parcels = $delivery->getParcels();
  501. foreach ($parcels as $index => $parcel) {
  502. $waybill = $parcel->getParcel()->getWaybill();
  503. $this->actionMatrix = new ActionMatrix($this->messageBus,$this->em,$waybill);
  504. $this->actionMatrix->loadingAction($this->getUser());
  505. }
  506. $em->flush();
  507. $data = [
  508. 'id' => $newDeliveryVehicle->getId(),
  509. 'delivery' => $newDeliveryVehicle->getDelivery()->getId(),
  510. 'vehicle' => $newDeliveryVehicle->getVehicle()->getId(),
  511. 'is_verified' => $newDeliveryVehicle->getisVerified(),
  512. 'is_cancelled' => $newDeliveryVehicle->getisCancelled()
  513. ];
  514. return new JsonResponse($data, Response::HTTP_CREATED);
  515. }catch (Exception $e){
  516. return new JsonResponse($data, Response::HTTP_EXPECTATION_FAILED);
  517. }
  518. }
  519. /**
  520. * @Rest\Delete("/deliveries/delete/{delivery_parcel_id}", name="delete_parcel_from_delivery")
  521. */
  522. public function deleteParcelFromDelivery($delivery_parcel_id) {
  523. $em = $this->getDoctrine()->getManager();
  524. /** @var DeliveryParcel $deliveryParcel */
  525. $deliveryParcel = $em->getRepository(DeliveryParcel::class)->findOneBy([
  526. 'id' => $delivery_parcel_id
  527. ]);
  528. if($deliveryParcel) {
  529. $delivery = $em->getRepository(Delivery::class)->findOneBy([
  530. 'id' => $deliveryParcel->getDelivery()
  531. ]);
  532. $delivery->setParcelCount($delivery->getParcelCount() - 1);
  533. $em->remove($deliveryParcel);
  534. // $deliveryParcel->getDelivery()->setParcelCount($deliveryParcel->getDelivery()->getParcelCount() - 1);
  535. try {
  536. $em->flush();
  537. return new JsonResponse(null, Response::HTTP_NO_CONTENT);
  538. }catch (Exception $e){
  539. return new JsonResponse($deliveryParcel, Response::HTTP_EXPECTATION_FAILED);
  540. }
  541. }
  542. }
  543. /**
  544. * @Rest\Get("/deliveries/parcels/{id}", name="get_delivery_parcels")
  545. * @param Delivery $delivery
  546. */
  547. public function deliveryParcels(Delivery $delivery){
  548. $em = $this->em;
  549. $deliveryParcels = $em->getRepository(DeliveryParcel::class)->deliveryParcels($delivery);
  550. if(!$deliveryParcels)
  551. return new JsonResponse(null, Response::HTTP_NO_CONTENT);
  552. return new JsonResponse($deliveryParcels, Response::HTTP_OK);
  553. }
  554. /**
  555. * @Rest\Delete("/deliveries/parcels/{id}", name="delete_delivery_parcel")
  556. * @param $id
  557. */
  558. public function deleteDeliveryParcel($id){
  559. $em = $this->em;
  560. $deliveryParcel = $em->getRepository(DeliveryParcel::class)->findOneBy([
  561. 'id' => $id
  562. ]);
  563. if($deliveryParcel){
  564. $em->remove($deliveryParcel);
  565. $em->flush();
  566. return new JsonResponse(null, Response::HTTP_NO_CONTENT);
  567. }
  568. return new JsonResponse(null, Response::HTTP_NO_CONTENT);
  569. }
  570. /**
  571. * @Rest\Post("/deliveries/parcels", name="add_parcel_delivery")
  572. * @param Request $request
  573. */
  574. public function addParcelDelivery(Request $request){
  575. $em = $this->em;
  576. $arrayParcels = json_decode($request->getContent(), true);
  577. $delivery = $em->getRepository(Delivery::class)->findOneBy([
  578. 'id' => $arrayParcels['delivery']
  579. ]);
  580. $parcel = $em->getRepository(Parcel::class)->findOneBy([
  581. 'id' => $arrayParcels['parcel']
  582. ]);
  583. $parcels = $em->getRepository(DeliveryParcel::class)->findBy([
  584. 'delivery' => $delivery
  585. ]);
  586. $delivery->setParcelCount(count($parcels));
  587. if($delivery && $parcel){
  588. $deliveryParcel = $em->getRepository(DeliveryParcel::class)->findOneBy([
  589. 'parcel' => $parcel,
  590. 'isCancelled' => false
  591. ]);
  592. $newDParcel = new DeliveryParcel();
  593. $newDParcel->setParcel($parcel);
  594. $newDParcel->setDelivery($delivery);
  595. $newDParcel->setCreatedAt(new \DateTime());
  596. $newDParcel->setCreatedBy($this->getUser());
  597. $newDParcel->setIsCancelled(false);
  598. $newDParcel->setIsReceived(false);
  599. if($deliveryParcel){
  600. $newDParcel->setCancelledAt(new \DateTime());
  601. $newDParcel->setCancelledBy($this->getUser());
  602. $newDParcel->setIsCancelled(true);
  603. $newDParcel->setCancelledBecause("Another parcel is added to delivery:".$deliveryParcel->getDelivery()->getId());
  604. }
  605. try {
  606. // $count = $delivery->getParcelCount()? 0: $delivery->getParcelCount();
  607. $count = $delivery->getParcelCount();
  608. $delivery->setParcelCount(($count+1));
  609. $em->persist($newDParcel);
  610. $em->flush();
  611. $data = [
  612. 'id' => $newDParcel->getId(),
  613. 'parcel' => $newDParcel->getParcel()->getId(),
  614. 'delivery' => $newDParcel->getDelivery()->getId(),
  615. 'is_cancelled' => $newDParcel->getisCancelled(),
  616. 'cancelled_because' => $newDParcel->getCancelledBecause()
  617. ];
  618. return new JsonResponse($data, Response::HTTP_CREATED);
  619. }catch (Exception $e) {
  620. $data = [
  621. 'error' => [
  622. 'message' => "Error occurred: could not add parcel to this delivery ".$e->getMessage()
  623. ]
  624. ];
  625. //
  626. return new JsonResponse($data, Response::HTTP_EXPECTATION_FAILED);
  627. }
  628. }
  629. }
  630. /**
  631. * @Rest\Get("/deliveries", name="all_un_verified_deliveries")
  632. */
  633. public function getDeliveries(): JsonResponse
  634. {
  635. $em = $this->em;
  636. $deliveries = $em->getRepository(Delivery::class)->findBy([
  637. 'isReceived' => false,
  638. 'isLoaded' => false,
  639. 'isCancelled' => false
  640. ]);
  641. return new JsonResponse($deliveries, Response::HTTP_OK);
  642. }
  643. /**
  644. * @Rest\Get("/deliveries/{station_id}", name="all_un_verified_station_deliveries")
  645. * @param $station_id
  646. */
  647. public function getStationDeliveries($station_id) {
  648. $em = $this->em;
  649. $deliveries = $em->getRepository(Delivery::class)->findDeliveries($station_id);
  650. $newDeliveries = array();
  651. foreach ($deliveries as $index => $delivery) {
  652. $deliveryParcels = $em->getRepository(DeliveryParcel::class)->getDeliveryParcels($delivery['id']);
  653. $deliveryVehicle = $em->getRepository(DeliveryVehicle::class)->findDeliveryVehicle($delivery['id']);
  654. $deliveries[$index]['parcels'] = $deliveryParcels;
  655. $deliveries[$index]['vehicle'] = $deliveryVehicle;
  656. }
  657. // $deliveryVehicles = $em->getRepository(DeliveryVehicle::class)->findDeliveryVehicles($station_id);
  658. $data = [
  659. "deliveries" => $deliveries
  660. ];
  661. return new JsonResponse($data, Response::HTTP_OK);
  662. }
  663. /**
  664. * @Rest\Post("/deliveries/{station_id}", name="create_delivery")
  665. */
  666. public function createDelivery($station_id, Request $request) {
  667. $em = $this->em;
  668. $station = $em->getRepository(Station::class)->findOneBy([
  669. 'id' => $station_id
  670. ]);
  671. $userStation = $em->getRepository(UserStation::class)->findOneBy([
  672. 'user' => $this->getUser()
  673. ], ['id' => 'DESC']);
  674. if($station === $userStation->getStation()) {
  675. $data = [
  676. 'error' => [
  677. 'message' => "Cannot create Delivery for ".$userStation->getStation()->getStationName()
  678. ]
  679. ];
  680. return new JsonResponse($data, Response::HTTP_OK);
  681. }
  682. $delivery = new Delivery();
  683. $delivery->setCreatedAt(new \DateTime());
  684. $delivery->setIsCancelled(false);
  685. $delivery->setCreatedBy($this->getUser());
  686. $delivery->setIsReceived(false);
  687. $delivery->setIsLoaded(false);
  688. $delivery->setDestination($station);
  689. $delivery->setParcelCount(0);
  690. $delivery->setIsVerified(false);
  691. $delivery->setIsReceivedFully(false);
  692. $delivery->setIsReceived(false);
  693. $delivery->setReceivedParcels(0);
  694. $userStation = $em->getRepository(UserStation::class)->findOneBy([
  695. 'user' => $this->getUser()
  696. ], ['id' => 'DESC']);
  697. $delivery->setOriginStation($userStation->getStation());
  698. try {
  699. $em->persist($delivery);
  700. $em->flush();
  701. return new JsonResponse($delivery->getId(), Response::HTTP_CREATED);
  702. }catch (Exception $e){
  703. return new JsonResponse($delivery, Response::HTTP_EXPECTATION_FAILED);
  704. }
  705. }
  706. /**
  707. * @Rest\Get("/deliveries/{id}/{delivery_id}", name="get_delivery")
  708. */
  709. public function getDelivery(Station $station, $delivery_id) {
  710. $em = $this->em;
  711. $delivery = $em->getRepository(Delivery::class)->findOneBy([
  712. 'id' => $delivery_id
  713. ]);
  714. return new JsonResponse($delivery, Response::HTTP_OK);
  715. }
  716. /**
  717. * @Rest\Get("/deliveries/incoming/{station_id}/{delivery_id}", name="get_one_incoming_delivery")
  718. * @param $station_id
  719. * @param $delivery_id
  720. * @return JsonResponse
  721. */
  722. public function getIncomingDelivery($station_id, $delivery_id): JsonResponse
  723. {
  724. $em = $this->em;
  725. $delivery = $em->getRepository(Delivery::class)->findIncomingDelivery($station_id, $delivery_id);
  726. if($delivery){
  727. $incomingParcels = $em->getRepository(DeliveryParcel::class)->commonDeliveryIncomingParcels($delivery_id);
  728. /** @var DeliveryVehicle $deliveryVehicle */
  729. $deliveryVehicle = $em->getRepository(DeliveryVehicle::class)->findOneBy([
  730. 'delivery' => $delivery_id
  731. ],['id' => 'DESC']);
  732. if($deliveryVehicle){
  733. $delivery['delivery_vehicle'] = $deliveryVehicle->getVehicle()->getRegNumber();
  734. }
  735. if($incomingParcels){
  736. $parcels = [
  737. 'parcels' => $incomingParcels
  738. ];
  739. $delivery['parcels'] = $incomingParcels;
  740. }
  741. }else{
  742. return new JsonResponse(null, Response::HTTP_NOT_FOUND);
  743. }
  744. return new JsonResponse($delivery, Response::HTTP_OK);
  745. }
  746. private function sendLoadingSms(Delivery $delivery): void
  747. {
  748. $em = $this->em;
  749. $deliveryParcels = $em->getRepository(DeliveryParcel::class)->findBy([
  750. 'isCancelled' => false,
  751. 'delivery'=>$delivery
  752. ]);
  753. foreach ($deliveryParcels as $index => $deliveryParcel) {
  754. $waybill = $deliveryParcel->getParcel()->getWaybill();
  755. $this->actionMatrix = new ActionMatrix($this->messageBus,$this->em,$waybill);
  756. $this->actionMatrix->loadingAction($this->getUser());
  757. }
  758. }
  759. /**
  760. * @Rest\Get("/delivery/sms_test", name="test_sms")
  761. */
  762. public function sendTestSMs(): JsonResponse
  763. {
  764. $em = $this->em;
  765. /** @var WayBill $waybill */
  766. $waybill = $em->getRepository(WayBill::class)->findOneBy([
  767. 'id' => 10001,
  768. ]);
  769. $data = $this->sendSms($waybill, $em, $this->logger);
  770. return new JsonResponse($data, Response::HTTP_OK);
  771. }
  772. /**
  773. * @Rest\Get("/delivery/sms_failed", name="failed_smses")
  774. */
  775. public function getFailedSms(){
  776. $em = $this->em;
  777. $sql = "SELECT * FROM sms where date(created_at) >= cast('2023-10-05' as date) and amount = 0";
  778. $stmt = $em->getConnection()->prepare($sql);
  779. // $stmt->bindValue('cap',$cap);
  780. // $stmt->bindValue('year',$year);
  781. // $stmt->bindValue('month',$month);
  782. $stmt->execute();
  783. $smses = $stmt->executeQuery()->fetchAllAssociative();
  784. // ];
  785. foreach ($smses as $index => $sms) {
  786. /** @var Sms $realSms */
  787. $realSms = $em->getRepository(Sms::class)->findOneBy([
  788. 'id' => $sms['id']
  789. ]);
  790. $smsi = new SendSms();
  791. // $smsi->sendOutSms($sms['recepient'],$sms['sms']);
  792. $data = $this->sendSms($realSms->getTransaction()->getWayBill(), $em, $this->logger);
  793. }
  794. $view = $this->view($smses, Response::HTTP_OK);
  795. //
  796. return $view;
  797. // return new JsonResponse($smses, Response::HTTP_OK);
  798. }
  799. }