src/Controller/Etl/Shopify/OrderController.php line 134

Open in your IDE?
  1. <?php
  2. namespace App\Controller\Etl\Shopify;
  3. use App\Entity\Customer;
  4. use App\Entity\Hcp;
  5. use App\Entity\Order;
  6. use App\Service\OrderService;
  7. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpFoundation\Response;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Doctrine\Persistence\ManagerRegistry;
  12. use PHPShopify\ShopifySDK;
  13. use \DateTime;
  14. use Exception;
  15. use PHPShopify\Exception\ApiException;
  16. use Symfony\Component\HttpFoundation\JsonResponse;
  17. class OrderController extends AbstractController
  18. {
  19.     /**
  20.      * Set fields to order object from an order data
  21.      *
  22.      * @param Order $object
  23.      * @param [type] $array
  24.      * @return void
  25.      */
  26.     public function fromOrderArray(Order $objectCustomer $customer$array): Order
  27.     {
  28.         $paymentStatus 'pending';
  29.         if (!empty($array['invoice_url'])){
  30.             $draftOrderLink $array['invoice_url'];
  31.         }
  32.         $orderDate date('Y-m-d H:i:s'strtotime($array['created_at']));
  33.         if ($array['status'] == 'completed'):
  34.             $paymentStatus 'completed';
  35.             $draftOrderLink '';
  36.         endif;
  37.         $object->setOrderId($array['id'])
  38.             ->setDate(new DateTime($orderDate))
  39.             ->setTotal($array['total_price'])
  40.             ->setPaymentStatus($paymentStatus)
  41.             ->setCustomer($customer)
  42.             ->setDraftOrderLink($draftOrderLink)
  43.         ;
  44.         if ($array['shipping_line']){
  45.             $object->setShippingCost($array['shipping_line']['price']);
  46.         } else {
  47.             $object->setShippingCost(0);
  48.         }
  49.         return $object;
  50.     }
  51.     public function createcustomerArr($request)
  52.     {
  53.         $customerArr = [
  54.             'first_name' => $request->get('first_name'),
  55.             'last_name' => $request->get('last_name'),
  56.             'email' => $request->get('email'),
  57.             'phone' => $request->get('mobile_number'),
  58.             'tags' => 'hcp-customer',
  59.         ];
  60.         return $customerArr;
  61.     }
  62.     /**
  63.      * @Route("/draft_order", name="app_draft_order")
  64.      */
  65.     public function index(ManagerRegistry $doctrineOrderService $orderService): Response
  66.     {
  67.         $entityManager $doctrine->getManager();
  68.         $config = array(
  69.             'ShopUrl' => 'solgar-nz.myshopify.com',
  70.             'AccessToken' => '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',
  71.         );
  72.         
  73.         $shopify = new ShopifySDK($config);
  74.         $draftOrders $shopify->DraftOrder->get([
  75.             'status' => 'completed',
  76.             'limit' => 100,
  77.         ]);
  78.         if(!empty($draftOrders)):
  79.             foreach($draftOrders as $draftOrder):
  80.                 if (str_contains($draftOrder['tags'], 'hcp-order')):
  81.                     $draftOrderRecord $entityManager->getRepository(Order::class)->findOneBy(array('orderId' => $draftOrder['id']));
  82.                     if (empty($draftOrder) || empty($draftOrder['customer'])) {
  83.                         continue;
  84.                     }
  85.                     $customer =  $entityManager->getRepository(Customer::class)->findOneBy(array('customerId' => $draftOrder['customer']['id']));
  86.                     if (empty($customer)) {
  87.                         continue;
  88.                     }
  89.                     if (empty($draftOrderRecord)):
  90.                         $draftOrderRecord = new Order();
  91.                     endif;
  92.                         
  93.                     $newOrder $this->fromOrderArray($draftOrderRecord$customer$draftOrder);
  94.                     
  95.                     // Delete the draftorder after updating order in database if order is completed
  96.                     if ($draftOrder['status'] == 'completed'){
  97.                         // Update link with new order url
  98.                         $shopify->DraftOrder($draftOrder['id'])->delete();
  99.                         
  100.                         // Remove order item as well
  101.                         $orderItems $newOrder->getOrderItems();
  102.                         foreach ($orderItems as $orderItem) {
  103.                             $entityManager->remove($orderItem);
  104.                         }
  105.                         $entityManager->remove($newOrder);
  106.                     } else {
  107.                         $entityManager->persist($newOrder);
  108.                     }
  109.                     $entityManager->flush();
  110.                 endif;
  111.             endforeach;
  112.         endif;
  113.         $this->addFlash('success''Orders have been updated successfully.');
  114.         return new Response('Draft orders have been updated successfully.'200);
  115.     }
  116.     /**
  117.      * @Route("/order", name="app_order")
  118.      */
  119.     public function getOrder(ManagerRegistry $doctrineOrderService $orderService): Response
  120.     {
  121.         $entityManager $doctrine->getManager();
  122.         $config = array(
  123.             'ShopUrl' => 'solgar-nz.myshopify.com',
  124.             'AccessToken' => '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',
  125.         );
  126.         // get from date
  127.         $today = new DateTime('yesterday');
  128.         $fromDate $today->format('Y-m-d\T00:00:00-00:00');
  129.         
  130.         $shopify = new ShopifySDK($config);
  131.         $orders $shopify->Order->get([
  132.             // 'tags' => 'hcp-order',
  133.             'created_at_min' => $fromDate
  134.         ]);
  135.         if(!empty($orders)):
  136.             foreach($orders as $order):
  137.                 if (empty($order['customer'])){
  138.                     continue;
  139.                 }
  140.                 $orderRecord $entityManager->getRepository(Order::class)->findOneBy(array('orderId' => $order['id']));
  141.                 $customerRecord =  $entityManager->getRepository(Customer::class)->findOneBy(array('customerId' => $order['customer']['id']));
  142.                 if (empty($orderRecord)){
  143.                     $orderRecord = new Order();
  144.                 } else {
  145.                     continue;
  146.                 }
  147.                 $orderDate date('Y-m-d H:i:s'strtotime($order['created_at']));
  148.                 $paymentStatus 'completed';
  149.                 if (str_contains($order['tags'], 'hcp-order')):
  150.                     $orderRecord->setOrderId($order['id'])
  151.                         ->setDate(new DateTime($orderDate))
  152.                         ->setTotal($order['total_price'])
  153.                         ->setPaymentStatus($paymentStatus)
  154.                         ->setCustomer($customerRecord)
  155.                     ;
  156.                     if($order['shipping_lines']) {
  157.                         $orderRecord->setShippingCost($order['shipping_lines'][0]['price']);
  158.                     } else {
  159.                         $orderRecord->setShippingCost(0);
  160.                     }
  161.                     if ($customerRecord) {
  162.                         if ($customerRecord->getHcp()) {
  163.                             $orderRecord->setHcp($customerRecord->getHcp());
  164.                         }
  165.                     }
  166.                     $entityManager->persist($orderRecord);
  167.                     $entityManager->flush();
  168.                     $orderService->pushProductsFromOrder($orderRecord->getOrderId());
  169.                 else: // Independent order e.g. reorder from customers
  170.                     $newLineItems $orderService->getHcpItems($order['line_items']);
  171.                     if ($newLineItems){ // If there is an HCP product then do below
  172.                         $orderRecord->setOrderId($order['id'])
  173.                             ->setDate(new DateTime($orderDate))
  174.                             ->setTotal($order['total_price'])
  175.                             ->setPaymentStatus($paymentStatus)
  176.                             ->setCustomer($customerRecord)
  177.                         ;
  178.                         if ($customerRecord) {
  179.                             if ($customerRecord->getHcp()) {
  180.                                 $orderRecord->setHcp($customerRecord->getHcp());
  181.                             }
  182.                         }
  183.                         $newOrderTotal 0;
  184.                         foreach($newLineItems as $newItem) {
  185.                             $newOrderTotal += $newItem->getPrice();
  186.                             $newItem->setOrderParent($orderRecord);
  187.                             $entityManager->persist($newItem);
  188.                         }
  189.                         $orderRecord->setTotal($newOrderTotal);
  190.                         $entityManager->persist($orderRecord);
  191.                         $entityManager->flush();
  192.                     }
  193.                 endif;
  194.             endforeach;
  195.         endif;
  196.         return new Response('Orders have been updated successfully.'200);
  197.     }
  198.     /**
  199.      * Get customer from Shopify API with email address
  200.      *
  201.      * @param [String] $email
  202.      * @return Array
  203.      */
  204.     public function getCustomerFromEmail($email)
  205.     {
  206.         $config = array(
  207.             'ShopUrl' => 'solgar-nz.myshopify.com',
  208.             'AccessToken' => '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',
  209.         );
  210.         $shopify = new ShopifySDK($config);
  211.         // Get customer records from hcp id
  212.         $customerObj =  $shopify->Customer()->search([
  213.             "query" => "email:".$email
  214.         ]);
  215.         if (empty($customerObj)) {
  216.             return $customerObj;
  217.         }
  218.         
  219.         $response $customerObj[0];
  220.         foreach($customerObj as $customer) {
  221.             if ($customer['email'] == $email) {
  222.                 return $customer;
  223.             }
  224.         }
  225.         return $response;
  226.     }
  227.     /**
  228.      * @Route("/order/create_order", name="app_create_order")
  229.      */
  230.     public function createOrder(ManagerRegistry $doctrineRequest $requestOrderService $orderService): Response
  231.     {
  232.         $entityManager $doctrine->getManager();
  233.         $config = array(
  234.             'ShopUrl' => 'solgar-nz.myshopify.com',
  235.             'AccessToken' => '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',
  236.         );
  237.         
  238.         $shopify = new ShopifySDK($config);
  239.         // GET request data
  240.         $customerData $request->request;
  241.         $customerEmail $customerData->get('email');
  242.         $customerNotes $customerData->get('notes');
  243.         $orders $customerData->get('orders');
  244.         if (empty($orders)) {
  245.             return new Response('Please add at least 1 product into order'500);
  246.         }
  247.         if (empty($customerEmail)) {
  248.             return new Response('Please fill in patient\'s email'500);
  249.         }
  250.         $customer $entityManager->getRepository(Customer::class)->findOneBy(array('email' => $customerEmail)); // Check if email exists in customer table
  251.         // Set Hcp id to customer
  252.         $hcp_id $customerData->get('hcp_id');
  253.         $hcp $entityManager->getRepository(Hcp::class)->findOneBy(array('hcpId' => $hcp_id));
  254.         $isDraftOrderSent true;
  255.         $shopifyCustomerObj $this->getCustomerFromEmail($customerEmail);
  256.         if(empty($customer)) {
  257.             if (!$shopifyCustomerObj) {
  258.                 $isDraftOrderSent false;
  259.                 $customerArr $this->createcustomerArr($customerData);
  260.                 // try catch api exception
  261.                 try {
  262.                     $customerObject $shopify->Customer->post($customerArr);
  263.                 } catch (ApiException $e) {
  264.                     if (str_contains($e->getMessage(), '500 Internal Server Error' )) {
  265.                         return new Response('Server Error'500);
  266.                     }
  267.                     return new Response($e->getMessage(), 500);
  268.                 }
  269.                 $customer = new Customer();
  270.                 $customer->setName($customerObject['first_name'] .' '$customerObject['last_name']);
  271.                 $customer->setCustomerId($customerObject['id']);
  272.                 $customer->setEmail($customerObject['email']);
  273.                 $customerObject $shopify->Customer($customerObject['id'])->send_invite(
  274.                     [
  275.                         "from" => "Solgar NZ<[email protected]>",
  276.                         "subject" => "Finalise Your Solgar Order"
  277.                         "custom_message" => "<p>An order for Solgar products has been initiated by your HCP. 
  278.                             Use the link below to activate your account and complete the purchase.<br> 
  279.                             If you believe there is an error, please contact your HCP (".$hcp->getName().") 
  280.                             or Solgar Customer Assistance at <a href=\"tel:+6495252355\">+649 525 2355</a>.</p>"
  281.                     ]
  282.                 );
  283.             } else {
  284.                 // $firstCustomerObj = $shopifyCustomerObj[0];
  285.                 if (str_contains($shopifyCustomerObj['tags'], 'HCP')) {
  286.                     $shopify->Customer($shopifyCustomerObj['id'])->put(['tags' => 'HCP, hcp-customer']);
  287.                 } else {
  288.                     $shopify->Customer($shopifyCustomerObj['id'])->put(['tags' => 'hcp-customer']);
  289.                 }
  290.     
  291.                 $customer = new Customer();
  292.                 $customer->setName($shopifyCustomerObj['first_name'] .' '$shopifyCustomerObj['last_name']);
  293.                 $customer->setCustomerId($shopifyCustomerObj['id']);
  294.                 $customer->setEmail($shopifyCustomerObj['email']);
  295.             }
  296.         }
  297.         
  298.         $customer->setHcp($hcp);
  299.         // Persist customer to database
  300.         $entityManager->persist($customer);
  301.         $entityManager->flush();
  302.         
  303.         // Time to create draft order
  304.         $lineItems = array();
  305.         foreach($orders as $order) {
  306.             array_push($lineItems, [
  307.                 "variant_id" => $order['variantId'],
  308.                 "quantity" => $order['quantity'],
  309.             ]);
  310.         }
  311.         $draftOrderData = array (
  312.             "line_items" => $lineItems,
  313.             "tags" => "hcp-order",
  314.             "note" => $customerNotes,
  315.             "customer" => [
  316.                 "id" => $customer->getCustomerId(),
  317.             ]
  318.         );
  319.         try {
  320.             $draftOrderObject $shopify->DraftOrder->post($draftOrderData);
  321.         } catch(ApiException $e) {
  322.             return new Response($e->getMessage(), 500);
  323.         }
  324.         $orderId 0;
  325.         // Create Order obj on database
  326.         if (!empty($draftOrderObject)) {
  327.             $orderId $draftOrderObject['id'];
  328.             $orderObj = new Order();
  329.             $newOrder $this->fromOrderArray($orderObj$customer$draftOrderObject);
  330.             $newOrder->setHcp($hcp);
  331.             // Persist order to database
  332.             $entityManager->persist($newOrder);
  333.             $entityManager->flush();
  334.             // grab product items after order
  335.             try {
  336.                 $response $orderService->pushProductsFromDraftOrder($orderId);
  337.             } catch(Exception $e) {
  338.                 return new Response($e->getMessage(), 500);
  339.             }
  340.         }
  341.         // Send email process
  342.         if ($isDraftOrderSent){
  343.             // Send email to customer for the order invoice.
  344.             $data = ["draft_order_invoice" => [
  345.                 "to" => $customerEmail,
  346.                 "from" => "Solgar NZ<[email protected]>"
  347.                 "bcc" => [], 
  348.                 "subject" => "Finalise Your Solgar Order"
  349.                 "custom_message" => "<p>An order for Solgar products has been initiated by your HCP. 
  350.                     Use the link below to complete the purchase and make a payment.<br> 
  351.                     If you believe there is an error, please contact your HCP (".$hcp->getName().") 
  352.                     or Solgar Customer Assistance at <a href=\"tel:+6495252355\">+649 525 2355</a>.</p>"
  353.                 ]
  354.             ];
  355.             try {
  356.                 $draftorder $shopify->DraftOrder($orderId)->send_invoice($data);
  357.             }
  358.             catch( ApiException $e) {
  359.                 if (str_contains($e->getMessage(), '500 Internal Server Error' )) {
  360.                     return new Response('Server Error'500);
  361.                 }
  362.                 return new Response($e->getMessage(), 500);
  363.             }
  364.         }
  365.         return new Response('The draft order has been created'200);
  366.     }
  367.     /**
  368.      * @Route("/order/testing", name="app_create_order_testing")
  369.      */
  370.     public function testing(ManagerRegistry $doctrineRequest $requestOrderService $orderService): Response
  371.     {
  372.         $entityManager $doctrine->getManager();
  373.         $config = array(
  374.             'ShopUrl' => 'solgar-nz.myshopify.com',
  375.             'AccessToken' => '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',
  376.         );
  377.         
  378.         $shopify = new ShopifySDK($config);
  379.         $data = ["draft_order_invoice" => [
  380.             "to" => '[email protected]',
  381.             "from" => "Solgar NZ<[email protected]>"
  382.             "bcc" => [], 
  383.             "subject" => "Finalise Your Solgar Order"
  384.             "custom_message" => "<p>An order for Solgar products has been initiated by your HCP. 
  385.                 Use the link below to complete the purchase and make a payment.<br> 
  386.                 If you believe there is an error, please contact your HCP"
  387.             ]
  388.         ];
  389.         try {
  390.             $draftorder $shopify->DraftOrder('1099155570921')->send_invoice($data);
  391.         }
  392.         catch( ApiException $e) {
  393.             if (str_contains($e->getMessage(), '500 Internal Server Error' )) {
  394.                 return new Response('Server Error'500);
  395.             }
  396.             return new Response($e->getMessage(), 500);
  397.         }
  398.         return new Response('The draft order has been created'200);
  399.     }
  400. }