src/Api/ParcelController.php line 548

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