src/Api/ParcelController.php line 819

Open in your IDE?
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: parcel
  5. * Date: 8/28/18
  6. * Time: 2:47 AM
  7. */
  8. namespace App\Api;
  9. use App\Controller\SendSms;
  10. use App\Entity\DailyAccount;
  11. use App\Entity\Delivery;
  12. use App\Entity\DeliveryParcel;
  13. use App\Entity\Etr;
  14. use App\Entity\Mpesa;
  15. use App\Entity\MpesaAuth;
  16. use App\Entity\MpesaTransaction;
  17. use App\Entity\Organization;
  18. use App\Entity\Parcel;
  19. use App\Entity\ReceivedParcel;
  20. use App\Entity\Station;
  21. use App\Entity\StationDailyAccount;
  22. use App\Entity\TimsStation;
  23. use App\Entity\Transaction;
  24. use App\Entity\UserStation;
  25. use App\Entity\Vehicle;
  26. use App\Entity\WayBill;
  27. use App\Form\api\ApiWayBillForm;
  28. use App\Form\CollectionForm;
  29. use App\Form\ParcelForm;
  30. use App\Form\WayBillForm;
  31. use App\Service\ActionMatrix;
  32. use App\Service\TremolInitiator;
  33. use DateTime;
  34. use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
  35. use Doctrine\Persistence\ManagerRegistry;
  36. use Doctrine\Persistence\ObjectManager;
  37. use FOS\RestBundle\Controller\Annotations as Rest;
  38. use FOS\RestBundle\View\View;
  39. use JMS\Serializer\SerializationContext;
  40. use JMS\Serializer\SerializerBuilder;
  41. use Mpdf\Mpdf;
  42. use Mpdf\QrCode\Output\Png;
  43. use Mpdf\QrCode\QrCode;
  44. use PDOException;
  45. use Psr\Log\LoggerInterface;
  46. use Sasedev\MpdfBundle\Factory\MpdfFactory;
  47. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  48. use Symfony\Component\Form\FormError;
  49. use Symfony\Component\HttpFoundation\JsonResponse;
  50. use Symfony\Component\HttpFoundation\Request;
  51. use Symfony\Component\HttpFoundation\Response;
  52. use Symfony\Component\Messenger\MessageBusInterface;
  53. use Symfony\Component\Validator\ConstraintViolation;
  54. class ParcelController extends AbstractController
  55. {
  56. private ObjectManager $em;
  57. private LoggerInterface $logger;
  58. private MessageBusInterface $messageBus;
  59. private ActionMatrix $actionMatrix;
  60. public function __construct(ManagerRegistry $managerInterface, LoggerInterface $logger, MessageBusInterface $messageBus)
  61. {
  62. $this->em = $managerInterface->getManager();
  63. $this->logger = $logger;
  64. $this->messageBus = $messageBus;
  65. }
  66. /**
  67. * @Rest\Route("/parcels/new", methods={"POST"}, name="app_register_parcel_api_")
  68. * @param Request $request
  69. */
  70. public function registerParcel(Request $request)
  71. {
  72. $waybill = new WayBill();
  73. $waybill->setLatitude(0);
  74. $waybill->setLongitude(0);
  75. $waybill->setParcelValue(1);
  76. $em = $this->em;
  77. $organization = $em->getRepository(Organization::class)->findOneBy([
  78. 'id' => 1 //$request->getSession()->get('ORGANIZATION')
  79. ]);
  80. $serializer = SerializerBuilder::create()->build();
  81. $context = new SerializationContext();
  82. $context->setSerializeNull(true);
  83. $waybill->setOrganization($organization);
  84. $waybill->setParcelValue(0);
  85. $body = $request->getContent();
  86. $data = json_decode($body, true);
  87. $this->logger->debug($body);
  88. $form = $this->createForm(ApiWayBillForm::class, $waybill, [
  89. 'csrf_protection' => false
  90. ]);
  91. $form->submit($data);
  92. /** @var UserStation $userStation */
  93. $userStation = $em->getRepository(UserStation::class)->findOneBy([
  94. 'user' => $this->getUser(),
  95. 'isActive' => true
  96. ], ['id' => 'DESC']);
  97. $date = new \DateTime();
  98. $stringDate = $date->format('Y-m-d');
  99. $dailyId = $em->getRepository(DailyAccount::class)->getMyAccount($userStation->getUser()->getId());
  100. $dailyAccount = null;
  101. if($dailyId) {
  102. $dailyAccount = $em->getRepository(DailyAccount::class)->findOneBy([
  103. 'id' => $dailyId
  104. ]);
  105. }
  106. // return new JsonResponse($dailyId, Response::HTTP_FOUND);
  107. if ($waybill->getToStation()->getId() === $userStation->getStation()->getId()) {
  108. $data = [
  109. 'message' => 'Origin Station and Destination Station cannot be the same'
  110. ];
  111. return new JsonResponse($data, Response::HTTP_EXPECTATION_FAILED);
  112. }
  113. if (!$dailyAccount) {
  114. $availableDailyAccount = $this->em->getRepository(DailyAccount::class)->findOneBy([
  115. 'user' => $this->getUser(),
  116. 'isClosed' => false,
  117. ], ['id' => 'DESC']);
  118. if ($availableDailyAccount) {
  119. $data = [
  120. 'message' => 'Please close your previous daily account to proceed ...'
  121. ];
  122. $this->logger->debug($data['message']);
  123. return new JsonResponse($data, Response::HTTP_EXPECTATION_FAILED);
  124. }
  125. /** @var StationDailyAccount $stationDailyAccount */
  126. $stationDailyAccount = $em->getRepository(StationDailyAccount::class)->findOneBy([
  127. 'station' => $request->getSession()->get('STATION'),
  128. 'accountDate' => $date
  129. ], ['id' => 'DESC']);
  130. if (!$stationDailyAccount) {
  131. $stationDailyAccount = new StationDailyAccount();
  132. $stationDailyAccount->setAccountDate($date);
  133. $stationDailyAccount->setCreatedAt($date);
  134. $stationDailyAccount->setIsClosed(false);
  135. $stationDailyAccount->setIsBanked(false);
  136. $stationDailyAccount->setCreatedBy($this->getUser());
  137. $stationDailyAccount->setStation($userStation->getStation());
  138. $em->persist($stationDailyAccount);
  139. }
  140. $dailyAccount = new DailyAccount();
  141. $dailyAccount->setIsClosed(false);
  142. $dailyAccount->setCreatedAt($date);
  143. $dailyAccount->setAccountDate($date);
  144. $dailyAccount->setUser($this->getUser());
  145. $dailyAccount->setStationDailyAccount($stationDailyAccount);
  146. $dailyAccount->setDrawerCash(0);
  147. $em->persist($dailyAccount);
  148. $em->flush();
  149. }
  150. if ($form->isValid()) {
  151. $waybill->setCreatedAt(new \DateTime());
  152. $waybill->setCreatedBy($this->getUser());
  153. $waybill->setFromStation($userStation->getStation());
  154. $waybill->setIsCollected(false);
  155. $waybill->setPercelCount(count($waybill->getParcels()));
  156. $waybill->setIsCollected(false);
  157. $waybill->setIsReceived(false);
  158. $waybill->addTransaction($dailyAccount);
  159. foreach ($waybill->getParcels() as $key => $item) {
  160. $waybill->getParcels()->get($key)->setNumber($key + 1);
  161. }
  162. $conn = $em->getConnection();
  163. $conn->beginTransaction();
  164. try {
  165. $em->persist($waybill);
  166. $em->flush();
  167. $em->getConnection()->commit();
  168. $this->logger->debug("waybill_id " . $waybill->getId());
  169. $data = $serializer->serialize($waybill, 'json', $context);
  170. return new Response($data, Response::HTTP_CREATED);
  171. } catch (PDOException $e) {
  172. $em->getConnection()->rollBack();
  173. $data = [
  174. 'message' => 'An Error Occurred Please check whether every thing is filled'
  175. ];
  176. return new JsonResponse($data, Response::HTTP_NOT_ACCEPTABLE);
  177. }
  178. }else{
  179. $errorp = '';
  180. foreach ($form->getErrors() as $index => $error) {
  181. $this->logger->debug($error->getMessage());
  182. $errorp = $error;
  183. }
  184. $data = [
  185. 'message' => 'some error occurred contact admin form not valid '.$errorp->getMessage()
  186. ];
  187. return new JsonResponse($data, Response::HTTP_EXPECTATION_FAILED);
  188. }
  189. $errorp = '';
  190. foreach ($form->getErrors() as $index => $error) {
  191. $this->logger->debug($error->getMessage());
  192. $errorp = $error;
  193. }
  194. $data = [
  195. 'message' => 'some error occurred contact admin '.$errorp
  196. ];
  197. return new JsonResponse($data, Response::HTTP_EXPECTATION_FAILED);
  198. }
  199. /**
  200. * @Rest\Route("/parcels/receipt/g03/{waybill_}/{pay_method}", methods={"GET"},name="receipt_action_tremol_api")
  201. */
  202. public function ReceiptGO3Action(Request $request, $waybill_, $pay_method, MpdfFactory $MpdfFactory): Response
  203. {
  204. $em = $this->em;
  205. $userStation = $em->getRepository(UserStation::class)->findOneBy([
  206. 'user' => $this->getUser()
  207. ]);
  208. $timsStation = $em->getRepository(TimsStation::class)->findOneBy([
  209. 'station' => $userStation->getStation()
  210. ]);
  211. $transaction = $em->getRepository(Transaction::class)->findOneBy([
  212. 'wayBill' => $waybill_
  213. ]);
  214. if (!$transaction->getIsPaid()) {
  215. $transaction->setIsComplete(true);
  216. $transaction->setPaymentMethod($pay_method);
  217. $transaction->setIsPaid(true);
  218. if ($pay_method === 'CASH') {
  219. $transaction->setCashAmount($transaction->getAmount());
  220. }else if ($pay_method === 'MPESA') {
  221. $transId = $request->get('transaction_id');
  222. $mpesa = $this->em->getRepository(Mpesa::class)->findOneBy([
  223. 'transactionId' => $transId
  224. ]);
  225. $mpesaTransaction = new MpesaTransaction();
  226. $mpesaTransaction->setTransaction($transaction);
  227. $mpesaTransaction->setMpesa($mpesa);
  228. $mpesaTransaction->setCreatedAt(new DateTime());
  229. $mpesaTransaction->setCreatedBy($this->getUser());
  230. $this->em->persist($mpesaTransaction);
  231. $mpesa->setIsUsed(true);
  232. $transaction->setMpesaAmount($transaction->getAmount());
  233. }
  234. if (!$timsStation) {
  235. $em->flush();
  236. $this->actionMatrix = new ActionMatrix($this->messageBus,$this->em,$transaction->getWayBill());
  237. $this->actionMatrix->registeringAction($this->getUser());
  238. return $this->generateReceipt($transaction, $MpdfFactory);
  239. }
  240. if ($timsStation->getSupplierCode() !== 'TREMOL' ) {
  241. $em->flush();
  242. return $this->generateReceipt($transaction, $MpdfFactory);
  243. }else {
  244. $t= $this->generateCuInvoiceNumber($transaction);
  245. $this->em->flush();
  246. return $this->generateReceipt($t, $MpdfFactory);
  247. }
  248. } else {
  249. if ($pay_method === 'MPESA') {
  250. $transId = $request->get('transaction_id');
  251. $mpesa = $this->em->getRepository(Mpesa::class)->findOneBy([
  252. 'transactionId' => $transId
  253. ]);
  254. if($mpesa->getTransactionAmount() !== $transaction->getAmount()){
  255. $data = [
  256. 'message' => 'Mpesa Amount should be equal to cost of service'
  257. ];
  258. return new JsonResponse($data, Response::HTTP_EXPECTATION_FAILED);
  259. }
  260. $mpesaTransaction = new MpesaTransaction();
  261. $mpesaTransaction->setTransaction($transaction);
  262. $mpesaTransaction->setMpesa($mpesa);
  263. $mpesaTransaction->setCreatedAt(new DateTime());
  264. $mpesaTransaction->setCreatedBy($this->getUser());
  265. $this->em->persist($mpesaTransaction);
  266. $mpesa->setIsUsed(true);
  267. $transaction->setPaymentMethod($pay_method);
  268. $transaction->setMpesaAmount($transaction->getAmount());
  269. $transaction->setCashAmount(0);
  270. $this->em->flush();
  271. }
  272. $receiptType = 'FISCAL RECEIPT COPY';
  273. return $this->generateReceipt($transaction, $MpdfFactory, $receiptType);
  274. }
  275. }
  276. private function generateReceipt(Transaction $transaction, MpdfFactory $MpdfFactory, $receipt=null ): Response
  277. {
  278. $receiptType = $receipt?:'FISCAL RECEIPT';
  279. $mpesa = null;
  280. if ($transaction->getPaymentMethod() == 'MPESA') {
  281. $mpesa = $this->em->getRepository(MpesaTransaction::class)->findOneBy([
  282. 'transaction' => $transaction
  283. ]);
  284. }
  285. /** @var WayBill $waybill */
  286. $waybill = $transaction->getWaybill();
  287. $parcels = $this->em->getRepository(Parcel::class)->findBy([
  288. 'waybill' => $waybill
  289. ]);
  290. // get the logo image and change it to base64
  291. $logoImage = file_get_contents('../public/logo.png');
  292. $logoBase64 = base64_encode($logoImage);
  293. $html='';
  294. if ($transaction->getCuInvoiceNumber()) {
  295. // create TIMS QRCODE change it to base64;
  296. $timsQRCode = 'https://itax.kra.go.ke/KRA-Portal/invoiceChk.htm?actionCode=loadPage&invoiceNo=' . $transaction->getCuInvoiceNumber();
  297. $timsqrCode = new QrCode($timsQRCode);
  298. $output = new Png();
  299. $timsQRCodeData = $output->output($timsqrCode, 100, [255, 255, 255], [0, 0, 0]);
  300. $base64 = base64_encode($timsQRCodeData);
  301. $html = $this->renderView('fos/parcels/receipt/receipt_g03_pdf_mobile.html.twig', [
  302. 'waybill' => $waybill,
  303. 'transaction' => $transaction,
  304. 'parcels' => $parcels,
  305. 'mpesa' => $mpesa,
  306. 'qrcode' => $base64,
  307. 'logoBase64' => $logoBase64,
  308. 'timsInvoiceNumber' => $transaction->getCuInvoiceNumber(),
  309. 'by' => $waybill->getCreatedBy()->getPerson(),
  310. 'receiptType' => $receiptType
  311. ]);
  312. }else {
  313. $html = $this->renderView('fos/parcels/receipt/receipt_g03_pdf_mobile.html.twig', [
  314. 'waybill' => $waybill,
  315. 'transaction' => $transaction,
  316. 'parcels' => $parcels,
  317. 'mpesa' => $mpesa,
  318. 'logoBase64' => $logoBase64,
  319. 'by' => $waybill->getCreatedBy()->getPerson(),
  320. 'receiptType' => $receiptType
  321. ]);
  322. }
  323. $mpdf = new Mpdf();
  324. $height = $mpdf->_getHtmlHeight($html);
  325. $this->logger->debug('HEIGHT ' . $height);
  326. $mPdf = $MpdfFactory->createMpdfObject([
  327. 'mode' => 'utf-8',
  328. 'format' => [70, 230],
  329. 'orientation' => 'P',
  330. 'autoPageBreak' => true
  331. ]);
  332. $mPdf->SetTopMargin("0");
  333. $mpdf->margin_footer = 0;
  334. $mPdf->WriteHTML($html);
  335. return $MpdfFactory->createDownloadResponse($mPdf, "receipt_{$transaction->getWayBill()->getId()}.pdf", Response::HTTP_OK, ["Set-Cookie", "fileDownload=true; path=/"]);
  336. }
  337. private function generateCuInvoiceNumber(Transaction $transaction): ?Transaction
  338. {
  339. /** Check whether etr is available */
  340. try {
  341. $waybill = $transaction->getWaybill();
  342. $parcels = $this->em->getRepository(Parcel::class)->findBy([
  343. 'waybill' => $waybill
  344. ]);
  345. /** @var Etr $etr */
  346. $etr = $this->em->getRepository(Etr::class)->findOneBy([
  347. 'isDefault' => 1
  348. ]);
  349. try {
  350. $tremolInitiator = new TremolInitiator($this->em, $etr);
  351. } catch (\Exception $e) {
  352. dump($e);
  353. }
  354. $receiptType = 'FISCAL RECEIPT';
  355. if ($transaction->getPinNumber()) {
  356. TremolInitiator::$FP->OpenInvoiceWithFreeCustomerData(
  357. '',
  358. $transaction->getPinNumber(),
  359. '',
  360. '',
  361. '',
  362. '',
  363. $waybill->getId()
  364. );
  365. } else {
  366. TremolInitiator::$FP->OpenReceipt(1, $waybill->getId());
  367. }
  368. $parcelCount = $waybill->getPercelCount();
  369. foreach ($parcels as $index => $parcel) {
  370. TremolInitiator::$FP->SellPLUfromExtDB($parcel->getDescription(),
  371. 'A',
  372. ($transaction->getAmount() / $parcelCount),
  373. '',
  374. '',
  375. '',
  376. 16.00,
  377. 1
  378. );
  379. }
  380. $rec = TremolInitiator::$FP->CloseReceipt();
  381. // var_dump($rec);
  382. $invoiceNumber = $rec->InvoiceNum;
  383. $transaction->setCuInvoiceNumber($invoiceNumber);
  384. $transaction->setIsComplete(true);
  385. $transaction->setIsPaid(true);
  386. $transaction->setIsFinal(true);
  387. $transaction->setCuSerialNumber($etr->getSerialNumber());
  388. if ($transaction->getPaymentMethod() == 'CASH') {
  389. $transaction->setCashAmount($transaction->getAmount());
  390. }
  391. if ($transaction->getPaymentMethod() == 'MPESA') {
  392. $transaction->setMpesaAmount($transaction->getAmount());
  393. }
  394. return $transaction;
  395. } catch (\Exception $e) {
  396. }
  397. return null;
  398. }
  399. /**
  400. * @Rest\Route("/parcels", methods={"GET"}, name="app_my_transactions")
  401. * @param Request $request
  402. */
  403. public function getMyTransactions(Request $request): Response
  404. {
  405. $serializer = SerializerBuilder::create()->build();
  406. $context = new SerializationContext();
  407. $context->setSerializeNull(true);
  408. $dailyAccount = $this->em->getRepository(DailyAccount::class)->findOneBy([
  409. 'user' => $this->getUser(),
  410. 'isClosed' => false
  411. ], ['id' => 'desc']);
  412. $waybills = $this->em->getRepository(WayBill::class)->findMyWaybill($dailyAccount);
  413. $data = $serializer->serialize($waybills, 'json', $context);
  414. return new Response($data, Response::HTTP_OK);
  415. }
  416. /**
  417. * @Rest\Route("/parcels/all", methods={"GET"}, name="app_all_my_transactions")
  418. * @param Request $request
  419. */
  420. public function getAllMyTransactions(Request $request): Response
  421. {
  422. $serializer = SerializerBuilder::create()->build();
  423. $context = new SerializationContext();
  424. $context->setSerializeNull(true);
  425. $dailyAccount = $this->em->getRepository(DailyAccount::class)->findOneBy([
  426. 'user' => $this->getUser(),
  427. 'isClosed' => false
  428. ], ['id' => 'desc']);
  429. $userStation = $this->em->getRepository(UserStation::class)->findOneBy([
  430. 'user' => $this->getUser()
  431. ],['id' => 'DESC']);
  432. if($request->get('waybill')){
  433. $waybill = $request->get('waybill');
  434. $waybills = $this->em->getRepository(WayBill::class)->findAllMyWaybill($userStation->getStation()->getId(), $waybill );
  435. }else{
  436. $waybills = $this->em->getRepository(WayBill::class)->findAllMyWaybill($userStation->getStation()->getId());
  437. }
  438. $data = $serializer->serialize($waybills, 'json', $context);
  439. return new Response($data, Response::HTTP_OK);
  440. }
  441. /**
  442. * @Rest\Route("/mpesa_transactions", methods={"GET"}, name="app_mpesa_transactions")
  443. * @param Request $request
  444. * @return Response
  445. */
  446. public function getMpesaTransactions(Request $request): Response
  447. {
  448. $userStation = $this->em->getRepository(UserStation::class)->findOneBy([
  449. 'user' => $this->getUser()
  450. ]);
  451. $mpesaAuth = $this->em->getRepository(MpesaAuth::class)->findOneBy([
  452. 'station' => $userStation->getStation(),
  453. 'authType' => 'PROD'
  454. ]);
  455. $transactions = $this->em->getRepository(Mpesa::class)->getTodaysTransactions($mpesaAuth->getPaybill());
  456. return new JsonResponse($transactions, Response::HTTP_OK);
  457. }
  458. /**
  459. * @Rest\Route("/data2", name="get_all_parcels_waybills_transactions_2")
  460. * @param Request $request
  461. */
  462. public function getData2(Request $request)
  463. {
  464. // $station_id, $waybill, $last_vehicle, $last_delivery_parcel_id, $last_delivery_id;
  465. $station_id = $request->get("station_id");
  466. $last_vehicle = $request->get("last_vehicle");
  467. $waybill = $request->get("last_parcel_id");
  468. $em = $this->getDoctrine()->getManager();
  469. $vehicles = $em->getRepository(Vehicle::class)->findVehicles($last_vehicle);
  470. // $waybills = $em->getRepository(WayBill::class)->findAllWaybills($station_id,$waybill);
  471. $parcels = $em->getRepository(Parcel::class)->getAllParcelWaybills($station_id, $waybill);
  472. /*$deliveries = $em->getRepository(Delivery::class)->findOutGoingDeliveries($station_id, $lastDelivery);
  473. $deliveryParcels = $em->getRepository(DeliveryParcel::class)->outGoingDeliveryParcels($station_id, $lastDelivery);*/
  474. $data = [
  475. "vehicles" => $vehicles,
  476. "parcels" => $parcels
  477. ];
  478. // return $this->view($data, Response::HTTP_OK);
  479. return new JsonResponse($data, Response::HTTP_OK);
  480. }
  481. /**
  482. * @Rest\Route("/data", name="get_all_parcels_waybills_transactions")
  483. * @param Request $request
  484. */
  485. public function getData(Request $request): Response
  486. {
  487. // $station_id, $waybill, $last_vehicle, $last_delivery_parcel_id, $last_delivery_id;
  488. $station_id = $request->get("station_id");
  489. $last_vehicle = $request->get("last_vehicle");
  490. $lastIDelivery = $request->get("last_id");
  491. $waybill = $request->get("last_w");
  492. $lastDelivery = $request->get("last_d");
  493. $em = $this->getDoctrine()->getManager();
  494. $vehicles = $em->getRepository(Vehicle::class)->findVehicles($last_vehicle);
  495. $waybills = $em->getRepository(WayBill::class)->findAllWaybills($station_id, $waybill);
  496. $parcels = $em->getRepository(Parcel::class)->getAllParcels($station_id, $waybill);
  497. $deliveries = $em->getRepository(Delivery::class)->findOutGoingDeliveries($station_id, $lastDelivery);
  498. $deliveryParcels = $em->getRepository(DeliveryParcel::class)->outGoingDeliveryParcels($station_id, $lastDelivery);
  499. $incomingParcels = $em->getRepository(DeliveryParcel::class)->getIncomingParcels($station_id, $lastIDelivery);
  500. $incomingDeliveries = $em->getRepository(Delivery::class)->findIncomingDeliveries($station_id, $lastIDelivery);
  501. $incomingDeliveryParcels = $em->getRepository(DeliveryParcel::class)->deliveryIncomingParcels($station_id, $lastIDelivery);
  502. $deliveryWaybills = $em->getRepository(DeliveryParcel::class)->findAllDeliveryWaybills($station_id, $lastIDelivery);
  503. $data = [
  504. "vehicles" => $vehicles,
  505. "incoming_waybills" => $deliveryWaybills,
  506. "incoming_parcels" => $incomingParcels,
  507. "incoming_delivery_parcels" => $incomingDeliveryParcels,
  508. "incoming_deliveries" => $incomingDeliveries,
  509. "waybills" => $waybills,
  510. "deliveries" => $deliveries,
  511. "delivery_parcels" => $deliveryParcels,
  512. "parcels" => $parcels
  513. ];
  514. // return $this->view($data, Response::HTTP_OK);
  515. return new JsonResponse($data, Response::HTTP_OK);
  516. /*if(!$waybills){
  517. if($vehicles){
  518. $data = [
  519. "vehicles" => $vehicles,
  520. "incoming_waybills"=>$deliveryWaybills,
  521. "waybills" => null,
  522. "incoming_parcels" => null,
  523. "deliveries" => $deliveries,
  524. "delivery_parcels" => $deliveryParcels
  525. ];
  526. return $this->view($data, Response::HTTP_OK);
  527. }
  528. if($deliveries){
  529. $data = [
  530. "incoming_waybills" => $deliveryWaybills,
  531. "waybills" => $waybills,
  532. "incoming_parcels" => $parcels,
  533. "vehicles" => $vehicles,
  534. "deliveries" => $deliveries,
  535. "delivery_parcels" => $deliveryParcels
  536. ];
  537. return $this->view($data, Response::HTTP_OK);
  538. }
  539. return $this->view(null, Response::HTTP_NO_CONTENT);
  540. }else if($deliveries){
  541. $data = [
  542. "incoming_waybills" => $deliveryWaybills,
  543. "waybills" => null,
  544. "incoming_parcels" => $parcels,
  545. "vehicles" => $vehicles,
  546. "deliveries" => $deliveries,
  547. "delivery_parcels" => $deliveryParcels
  548. ];
  549. return $this->view($data, Response::HTTP_OK);
  550. }
  551. $data = [
  552. "incoming_waybills" => $deliveryWaybills,
  553. "waybills" => $waybills,
  554. "incoming_parcels" => $parcels,
  555. "vehicles" => $vehicles,
  556. "deliveries" => $deliveries,
  557. "delivery_parcels" => $deliveryParcels
  558. ];
  559. return $this->view($data, Response::HTTP_OK);*/
  560. }
  561. /**
  562. * @Rest\Route("/data/delivery/{station}/{delivery_number}", name="getOneParcel")
  563. */
  564. public function getDelivery($station, $delivery_number)
  565. {
  566. $em = $this->getDoctrine()->getManager();
  567. /** @var Delivery $delivery */
  568. $delivery = $em->getRepository(Delivery::class)->findOneBy([
  569. 'id' => $delivery_number
  570. ]);
  571. $incomingDelivery = $em->getRepository(Delivery::class)->findOneIncomingDelivery($delivery_number);
  572. $incomingParcels = $em->getRepository(DeliveryParcel::class)->getOneDeliveryIncomingParcels($delivery_number);
  573. $incomingDeliveryParcels = $em->getRepository(DeliveryParcel::class)->oneDeliveryIncomingParcels($delivery_number);
  574. $deliveryWaybills = $em->getRepository(DeliveryParcel::class)->findAllOneDeliveryWaybills($delivery_number);
  575. if ($incomingDelivery) {
  576. if ($delivery->getDestination()->getId() != $station) {
  577. $data = [
  578. 'error' => 'This delivery is meant for:' . $delivery->getDestination()->getStationName()
  579. ];
  580. // return $this->view($data, Response::HTTP_EXPECTATION_FAILED);
  581. return new JsonResponse($data, Response::HTTP_EXPECTATION_FAILED);
  582. }
  583. $data = [
  584. "incoming_waybills" => $deliveryWaybills,
  585. "incoming_parcels" => $incomingParcels,
  586. "incoming_delivery_parcels" => $incomingDeliveryParcels,
  587. "incoming_deliveries" => $incomingDelivery,
  588. ];
  589. // $context = new SerializationContext();
  590. // $context->setSerializeNull(true);
  591. // $serializer = SerializerBuilder::create()->build();
  592. // [ DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s']
  593. // $data = $serializer->serialize($data, 'json', $context );
  594. // return $this->view($data, Response::HTTP_OK);
  595. return new JsonResponse($data, Response::HTTP_OK);
  596. } else {
  597. $data = [
  598. 'error' => 'Delivery Number:' . $delivery_number . ' NOT FOUND'
  599. ];
  600. // return $this->view($data, Response::HTTP_NOT_FOUND);
  601. return new JsonResponse($data, Response::HTTP_NOT_FOUND);
  602. }
  603. }
  604. /**
  605. * @Rest\Route("/parcels/{station_id}/{waybill}", name="getOneWaybill")
  606. * @param $station_id
  607. * @param $waybill
  608. * @return View
  609. */
  610. public function getParcelCollection($station_id, $waybill)
  611. {
  612. $em = $this->getDoctrine()->getManager();
  613. $resultWaybill = $em->getRepository(WayBill::class)->findReceivedWaybill($station_id, $waybill);
  614. if (!$resultWaybill) {
  615. // return $this->view(null, Response::HTTP_NOT_FOUND);
  616. return new JsonResponse(null, Response::HTTP_NOT_FOUND);
  617. }
  618. /*$waybillParcels = $em->getRepository(Parcel::class)->getWaybillParcels($waybill);
  619. if($waybillParcels){
  620. $resultWaybill['parcels'] = $waybillParcels;
  621. }*/
  622. // return $this->view($resultWaybill, Response::HTTP_OK);
  623. return new JsonResponse($resultWaybill, Response::HTTP_OK);
  624. }
  625. /**
  626. * @Rest\Route("/parcels/{}/{}/{way_bill}/{id}/", name="getOneParcel")
  627. */
  628. public function getParcel($way_bill, $id)
  629. {
  630. $em = $this->getDoctrine()->getManager();
  631. $waybill = $em->getRepository(WayBill::class)->findOneBy([
  632. 'id' => $way_bill
  633. ]);
  634. if (!$waybill) {
  635. $data = [
  636. 'parcel' => null,
  637. 'parcels' => null,
  638. 'waybill' => null
  639. ];
  640. return $this->view($data, Response::HTTP_NOT_FOUND);
  641. }
  642. $parcel = $em->getRepository(Parcel::class)->findOneBy([
  643. 'number' => $id,
  644. 'waybill' => $waybill
  645. ]);
  646. $parcels = $em->getRepository(Parcel::class)->findBy([
  647. 'waybill' => $waybill
  648. ]);
  649. $data = [
  650. 'parcel' => $parcel,
  651. 'parcels' => $parcels,
  652. 'waybill' => $waybill
  653. ];
  654. // return $this->view($data, Response::HTTP_OK);
  655. return new JsonResponse($data, Response::HTTP_OK);
  656. }
  657. /**
  658. * @Rest\Route("/parcels/forms/towns", name="getParcels")
  659. */
  660. public function getTowns() {
  661. $em = $this->getDoctrine()->getManager();
  662. $towns = $em->getRepository(Station::class)->findBy([
  663. 'isMobile' => false
  664. ]);
  665. // return $this->view($towns, Response::HTTP_OK);
  666. return new JsonResponse($towns, Response::HTTP_OK);
  667. }
  668. /**
  669. * @Rest\Route("/deliveries/delete/{id}", name="getParcels")
  670. */
  671. public function deleteParcelFromDelivery($id)
  672. {
  673. $em = $this->getDoctrine()->getManager();
  674. $towns = $em->getRepository(Station::class)->findAll();
  675. // return $this->view($towns, Response::HTTP_OK);
  676. return new JsonResponse($towns, Response::HTTP_OK);
  677. }
  678. public function collectParcel(Parcel $parcel, Request $request)
  679. {
  680. $em = $this->getDoctrine()->getManager();
  681. $receivedParcel = $em->getRepository(ReceivedParcel::class)->findBy([
  682. 'parcel' => $parcel
  683. ]);
  684. $user = $em->getRepository(UserStation::class)->findOneBy([
  685. 'user' => $this->getUser()
  686. ], ['id' => 'DESC']);
  687. if ($parcel->getToTown()->getId() != $user->getTown()->getId()) {
  688. $data = [
  689. 'error' => 'You are not logged in from ' . $parcel->getToTown()->getTownName()
  690. ];
  691. // return $this->view($data, Response::HTTP_EXPECTATION_FAILED);
  692. return new JsonResponse($data, Response::HTTP_EXPECTATION_FAILED);
  693. }
  694. if (!$receivedParcel) {
  695. $data = [
  696. 'error' => 'PARCEL HAS NOT BEEN RECEIVED YET'
  697. ];
  698. // return $this->view($data, Response::HTTP_EXPECTATION_FAILED);
  699. return new JsonResponse($data, Response::HTTP_EXPECTATION_FAILED);
  700. }
  701. $collectParcel = new Collected();
  702. $collectParcel->setParcel($parcel);
  703. $collectParcel->setCollectedAt(new \DateTime());
  704. $collectParcel->setUser($this->getUser());
  705. $parcel->setIsReceived(true);
  706. $content = $request->getContent();
  707. $data = json_decode($content, true);
  708. $form = $this->createForm(CollectionForm::class, $collectParcel);
  709. $form->submit($data);
  710. $validator = $this->get('validator');
  711. /** @var $errors */
  712. $errors = $validator->validate($collectParcel);
  713. // dump($errors);die;
  714. if (count($errors) > 0) {
  715. $fields = array();
  716. /** @var $error ConstraintViolation */
  717. foreach ($errors as $key => $error) {
  718. $fields[$error->getPropertyPath()] = $error->getMessage();
  719. }
  720. $data = [
  721. 'error' => 'Please check this fields for errors',
  722. 'fields' => $fields
  723. ];
  724. // $view = $this->view($data, Response::HTTP_BAD_REQUEST);
  725. //
  726. // return $view;
  727. return new JsonResponse($data, Response::HTTP_BAD_REQUEST);
  728. }
  729. try {
  730. $parcel->setIsCollected(true);
  731. $em->persist($collectParcel);
  732. $em->flush();
  733. $sms = new SendSms();
  734. $sms->sendOutSms($parcel->getSenderPhoneNumber(), "HELLO {$parcel->getSenderName()} THE PARCEL YOU SENT TO {$parcel->getToTown()} FROM {$parcel->getFromTown()} HAS BEEN COLLECTED BY {$parcel->getReceiverName()}");
  735. // $view = $this->view($collectParcel, Response::HTTP_CREATED);
  736. // return $view;
  737. return new JsonResponse($collectParcel, Response::HTTP_OK);
  738. } catch (UniqueConstraintViolationException $un) {
  739. $collection = $em->getRepository('AppBundle:Collected')->findOneBy([
  740. 'parcel' => $parcel
  741. ]);
  742. $data = [
  743. 'error' => 'THIS PARCEL HAS ALREADY BEEN COLLECTED #ID ' . $collection->getCollectorNationalId()
  744. ];
  745. // return $this->view($data, Response::HTTP_EXPECTATION_FAILED);
  746. return new JsonResponse($collectParcel, Response::HTTP_EXPECTATION_FAILED);
  747. } catch (\PDOException $e) {
  748. // $view = $this->view($collectParcel, Response::HTTP_EXPECTATION_FAILED);
  749. //
  750. // return $view;
  751. return new JsonResponse($collectParcel, Response::HTTP_EXPECTATION_FAILED);
  752. }
  753. }
  754. /**
  755. * @Rest\Route("/new-parcel", name="api_new-parcel")
  756. */
  757. public function newParcel(Request $request){
  758. $parcel = new Parcel();
  759. $em = $this->getDoctrine()->getManager();
  760. $parcelForm = $this->createForm(ParcelForm::class, $parcel);
  761. $amount = 0;
  762. if (isset($request->get('app_bundle_parcel_form')['amount'])) {
  763. $amount = $request->get('app_bundle_parcel_form')['amount'];
  764. }
  765. $parcelForm->handleRequest($request);
  766. /** @var UserTown $userTown */
  767. $userTown = $em->getRepository(UserStation::class)->findOneBy([
  768. 'user' => $this->getUser(),
  769. 'isActive' => true
  770. ], ['id' => 'DESC']);
  771. if (!$userTown) {
  772. $parcelForm->addError(new FormError('You are not assigned a town Please contact admin'));
  773. return $this->render('parcels/new_parcel.html.twig', [
  774. 'form' => $parcelForm->createView()
  775. ]);
  776. }
  777. if ($parcelForm->isSubmitted() && $parcelForm->isValid()) {
  778. if ($parcel->getToTown()->getId() === $userTown->getTown()->getId()) {
  779. $parcelForm->addError(new FormError('From town and Destination Town cannot be the same'));
  780. return $this->render('parcels/new_parcel.html.twig', [
  781. 'form' => $parcelForm->createView(),
  782. 'user_town' => $userTown
  783. ]);
  784. }
  785. $parcel->setCreatedAt(new \DateTime());
  786. $parcel->setCreatedBy($this->getUser());
  787. $parcel->setFromTown($userTown->getTown());
  788. $parcel->setIsEnRoute(false);
  789. $parcel->setIsCollected(false);
  790. $parcel->setIsReceived(false);
  791. $parcelAmount = new Cost();
  792. $parcelAmount->setCreatedAt(new \DateTime());
  793. $parcelAmount->setAmount($amount);
  794. $parcelAmount->setParcel($parcel);
  795. try {
  796. $em->persist($parcelAmount);
  797. $em->persist($parcel);
  798. $em->flush();
  799. $this->addFlash('success', 'Parcel Saved Successfully');
  800. // $this->redirectToRoute('pdf_report', ['id' => $parcel->getId()]);
  801. // $parcel = new Parcel();
  802. // $parcelForm = $this->createForm(ParcelForm::class, $parcel);
  803. return $this->redirectToRoute('one_parcel', ['id' => $parcel->getId()]);
  804. } catch (\PDOException $e) {
  805. $this->addFlash('error', 'An Error Occurred Please check whether every thin is filled');
  806. return $this->render('parcels/new_parcel.html.twig', [
  807. 'form' => $parcelForm->createView(),
  808. 'user_town' => $userTown
  809. ]);
  810. }
  811. }
  812. return $this->render('parcels/new_parcel.html.twig', [
  813. 'form' => $parcelForm->createView(),
  814. 'user_town' => $userTown
  815. ]);
  816. }
  817. }