src/Controller/ImportOrderSummaryAPIController.php line 30

Open in your IDE?
  1. <?php
  2. namespace App\Controller;
  3. use App\Entity\ImportOrderSummary;
  4. use App\Service\MessageService;
  5. use Psr\Log\LoggerInterface;
  6. use App\Entity\ClassificationFeedbackRaw;
  7. use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
  8. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  9. use Symfony\Component\HttpFoundation\JsonResponse;
  10. use Symfony\Component\HttpFoundation\Response;
  11. use Symfony\Component\Routing\Annotation\Route;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use \DateTime;
  14. use PDO;
  15. use Symfony\Component\Validator\Constraints\Json;
  16. class ImportOrderSummaryAPIController extends AbstractController
  17. {
  18.     /**
  19.      * @Route("/import-order-summary/api/get-data", name="import_order_summary_api_get_data")
  20.      * @IsGranted("ROLE_USER")
  21.      * @param Request $request
  22.      * @param LoggerInterface $logger
  23.      * @param PDO $pdo
  24.      * @param MessageService $messageService
  25.      * @return Response
  26.      */
  27.     public function getData(Request $requestLoggerInterface $loggerPDO $pdoMessageService $messageService)
  28.     {
  29.         // load project id from request or exit
  30.         $project_id $request->get('project_id'false);
  31.         $import_id $request->get('import_id'false);
  32.         if ($project_id === false || !$import_id) {
  33.             exit('missing ids');
  34.         }
  35.         // load project
  36.         $entityManager $this->getDoctrine()->getManager();
  37.         $import_order_summary_array $entityManager->getRepository(ImportOrderSummary::class)->findBy(array(
  38.             "project_id" => $project_id,
  39.             "import_id" => $import_id
  40.         ));
  41.         $data = array();
  42.         foreach ($import_order_summary_array as $import_order_summary){
  43.             $cogs_net $import_order_summary->getCogsNet();
  44.             $cogs_net = !empty($cogs_net) ? number_format($cogs_net2',''') : '';
  45.             $sum_net $import_order_summary->getSumNet();
  46.             $sum_net number_format($sum_net2',''');
  47.             $price_gross $import_order_summary->getPriceGross();
  48.             $price_gross number_format($price_gross2',''');
  49.             $data[] = array(
  50.                 "id" => $import_order_summary->getId(),
  51.                 "item_id" => $import_order_summary->getItemId(),
  52.                 "item_name" => $import_order_summary->getItemName(),
  53.                 "quantity" => $import_order_summary->getQuantity(),
  54.                 "sum_net" => $sum_net,
  55.                 "price_gross" => $price_gross,
  56.                 "category" => $import_order_summary->getCategory(),
  57.                 "super_category" => $import_order_summary->getSuperCategory(),
  58.                 "cogs_net" => $cogs_net,
  59.             );
  60.         }
  61.         // prepare data for return
  62.         $return = array(
  63.             'result' => true,
  64.             'message' => 'loaded data successfully',
  65.             'data' => $data
  66.         );
  67.         // return data
  68.         return new JsonResponse($return200);
  69.     }
  70.     /**
  71.      * @Route("/import-order-summary/api/save-data", name="import_order_summary_api_save_data")
  72.      * @IsGranted("ROLE_USER")
  73.      * @param Request $request
  74.      * @param LoggerInterface $logger
  75.      * @param PDO $pdo
  76.      * @param MessageService $messageService
  77.      * @return Response
  78.      */
  79.     public function saveData(Request $requestLoggerInterface $loggerPDO $pdoMessageService $messageService)
  80.     {
  81.         // load project id from request or exit
  82.         $project_id $request->get('project_id'false);
  83.         $import_id $request->get('import_id'false);
  84.         if ($project_id === false || !$import_id) {
  85.             exit('missing ids');
  86.         }
  87.         $items_to_save json_decode($request->get('items'false),true);
  88.         if (!$items_to_save) {
  89.             exit('nothing to save');
  90.         }
  91.         $entityManager $this->getDoctrine()->getManager();
  92.         foreach($items_to_save as $item_to_save){
  93.             $cogs_net $item_to_save['cogs_net'];
  94.             $cogs_net $cogs_net str_replace(',''.'$cogs_net) * null;
  95.             $import_order_summary $entityManager->getRepository(ImportOrderSummary::class)->find($item_to_save['id']);
  96.             
  97.             /*
  98.              * Write to class.feedback-table if changes
  99.              */
  100.             $oldCat $import_order_summary->getCategory();
  101.             if ($oldCat != $item_to_save["category"]) {
  102.                 $cf = new ClassificationFeedbackRaw();
  103.                 $cf->setProjectId($project_id);
  104.                 $cf->setImportId($import_id);
  105.                 $cf->setItemId($item_to_save["item_id"]);
  106.                 $cf->setItemName($item_to_save["item_name"]);
  107.                 $cf->setItemPrice($item_to_save["price_gross"]);
  108.                 $cf->setClassType("category");
  109.                 $cf->setPredictedClass($oldCat ?: "");
  110.                 $cf->setFeedbackClass($item_to_save["category"] ?: "");
  111.                 $cf->setTimestamp(DateTime::createFromFormat('Y-m-d H:i:s'date('Y-m-d H:i:s')));
  112.                 $cf->setExport("");
  113.                 $entityManager->persist($cf);
  114.             }
  115.             /*
  116.              * Write to class.feedback-table if changes
  117.              */
  118.             $oldSuperCat =$import_order_summary->getSuperCategory();
  119.             if ($oldSuperCat != $item_to_save["super_category"]) {
  120.                 $scf = new ClassificationFeedbackRaw();
  121.                 $scf->setProjectId($project_id);
  122.                 $scf->setImportId($import_id);
  123.                 $scf->setItemId($item_to_save["item_id"]);
  124.                 $scf->setItemName($item_to_save["item_name"]);
  125.                 $scf->setItemPrice($item_to_save["price_gross"]);
  126.                 $scf->setClassType("super_category");
  127.                 $scf->setPredictedClass($oldSuperCat ?: "");
  128.                 $scf->setFeedbackClass($item_to_save["super_category"] ?: "");
  129.                 $scf->setTimestamp(DateTime::createFromFormat('Y-m-d H:i:s'date('Y-m-d H:i:s')));
  130.                 $scf->setExport("");
  131.                 $entityManager->persist($scf);
  132.             }
  133.             $import_order_summary->setCategory($item_to_save['category']);
  134.             $import_order_summary->setSuperCategory($item_to_save['super_category']);
  135.             $import_order_summary->setCogsNet($cogs_net);
  136.             $import_order_summary->setModified(new \DateTime());
  137.             $entityManager->persist($import_order_summary);
  138.             $entityManager->flush();
  139.         }
  140.         // return data
  141.         return new JsonResponse(array(
  142.             'result' => true,
  143.             'message' => 'saved data successfully',
  144.             'data' => count($items_to_save)
  145.         ), 200);
  146.     }
  147.     /**
  148.      * @Route("/import-order-summary/api/categorize-data", name="import_order_summary_api_categorize_data")
  149.      * @IsGranted("ROLE_USER")
  150.      * @param Request $request
  151.      * @param LoggerInterface $logger
  152.      * @param PDO $pdo
  153.      * @param MessageService $messageService
  154.      * @return Response
  155.      */
  156.     public function categorizeData(Request $requestLoggerInterface $loggerPDO $pdoMessageService $messageService)
  157.     {
  158.         // load project id from request or exit
  159.         $project_id $request->get('project_id'false);
  160.         $import_id $request->get('import_id'false);
  161.         if ($project_id === false || !$import_id) {
  162.             exit('missing ids');
  163.         }
  164.         // load project
  165.         $entityManager $this->getDoctrine()->getManager();
  166.         $import_order_summary_array $entityManager->getRepository(ImportOrderSummary::class)->findBy(array(
  167.             "project_id" => $project_id,
  168.             "import_id" => $import_id
  169.         ));
  170.         $data $invoices = array();
  171.         foreach ($import_order_summary_array as $import_order_summary){
  172.             $arr = array();
  173.             $cogs_net $import_order_summary->getCogsNet();
  174.             $cogs_net = !empty($cogs_net) ? number_format($cogs_net2',''') : '';
  175.             $sum_net $import_order_summary->getSumNet();
  176.             $sum_net number_format($sum_net2',''');
  177.             $price_gross $import_order_summary->getPriceGross();
  178.             $price_gross number_format($price_gross2',''');
  179.             $arr = array(
  180.                 "id" => $import_order_summary->getId(),
  181.                 "item_id" => $import_order_summary->getItemId(),
  182.                 "item_name" => $import_order_summary->getItemName(),
  183.                 "quantity" => $import_order_summary->getQuantity(),
  184.                 "sum_net" => $sum_net,
  185.                 "price_gross" => $price_gross,
  186.                 "category" => $import_order_summary->getCategory(),
  187.                 "super_category" => $import_order_summary->getSuperCategory(),
  188.                 "cogs_net" => $cogs_net               
  189.             );
  190.             $data[] = $arr;
  191.             $arr["category_changed"] = 0;
  192.             $arr["super_category_changed"] = 0;
  193.             $invoices[$import_order_summary->getId()] = $arr;
  194.         }
  195.         $url $this->getParameter("categorization_url");
  196.         // Initialize cURL session
  197.         $ch curl_init($url);
  198.         // Setup request to send JSON via POST
  199.         $payload json_encode($data);
  200.         // Set cURL options
  201.         curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
  202.         curl_setopt($chCURLOPT_POSTtrue);
  203.         curl_setopt($chCURLOPT_HTTPHEADER, [
  204.             'Content-Type: application/json',
  205.             'Accept: application/json'
  206.         ]);
  207.         curl_setopt($chCURLOPT_POSTFIELDS$payload);
  208.         // Execute the POST request
  209.         $response curl_exec($ch);
  210.         // Check for errors
  211.         if ($response === false) {
  212.             $error curl_error($ch);
  213.             //echo 'Error: ' . $error;
  214.             $return = array(
  215.                 'code' => 500,
  216.                 'message' => $error,
  217.                 'data' => null
  218.             );
  219.         } else {
  220.             $result json_decode($response,true);
  221.             foreach ($result as $k => $v) {
  222.                 $id $v['id'];
  223.                 
  224.                 if($v["category"] != $invoices[$id]["category"] && $v["category"] !== "\u0027\u0027" && $v['category'] !== "''" && $v['category'] !== '' && $v['category'] !== null){
  225.                     if(strlen($v["category"]) <= 20){
  226.                         $invoices[$id]["category"] = $v["category"];
  227.                         $invoices[$id]["category_changed"] = 1;
  228.                     }
  229.                 }
  230.                 if($v["super_category"] != $invoices[$id]["super_category"] && $v["super_category"] !== "\u0027\u0027" && $v['super_category'] !== "''" && $v['super_category'] !== '' && $v['super_category'] !== null){
  231.                     if(strlen($v["super_category"]) <= 14){
  232.                         $invoices[$id]["super_category"] = $v["super_category"];
  233.                         $invoices[$id]["super_category_changed"] = 1;
  234.                     }
  235.                 }
  236.             }
  237.             // Save updated categories
  238.             foreach ($invoices as $invoice) {
  239.                 if (isset($invoice['category_changed']) || isset($invoice['super_category_changed'])) {
  240.                     $import_order_summary $this->getDoctrine()
  241.                         ->getRepository(ImportOrderSummary::class)
  242.                         ->find($invoice['id']);
  243.                     
  244.                     if ($import_order_summary) {
  245.                         if (isset($invoice['category_changed'])) {
  246.                             $import_order_summary->setCategory($invoice['category']);
  247.                         }
  248.                         if (isset($invoice['super_category_changed'])) {
  249.                             $import_order_summary->setSuperCategory($invoice['super_category']);
  250.                         }
  251.                         
  252.                         $entityManager $this->getDoctrine()->getManager();
  253.                         $entityManager->persist($import_order_summary);
  254.                         $entityManager->flush();
  255.                     }
  256.                 }
  257.             }
  258.             // prepare data for return
  259.             $return = array(
  260.                 'result' => true,
  261.                 'message' => 'loaded data successfully',
  262.                 'data' => array_values($invoices),
  263.                 'code' => 200
  264.             );
  265.         }
  266.         
  267.         return new JsonResponse($return200);
  268.     }
  269. }