<?php
namespace App\Controller\Api;
use App\Entity\Customer;
use App\Entity\Hcp;
use App\Entity\Order;
use App\Repository\HcpProductRepository;
use DateTime;
use Doctrine\Persistence\ManagerRegistry;
use PHPShopify\Exception\ApiException;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
use PHPShopify\ShopifySDK;
class CustomerApiController extends AbstractController
{
/**
* @Route("/api/customer", name="app_customer_api")
*/
public function index(Request $request, ManagerRegistry $doctrine, HcpProductRepository $hcpProductRepo): Response
{
$config = array(
'ShopUrl' => 'solgar-nz.myshopify.com',
'AccessToken' => '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',
);
$shopify = new ShopifySDK($config);
$entityManager = $doctrine->getManager();
$hcpId = $request->query->get('hcp_id');
$hcp = $entityManager->getRepository(Hcp::class)->findOneBy(array('hcpId' => $hcpId));
$hcpDbId = $hcp->getId();
if (empty($hcpDbId)) {
return new JsonResponse(array('data' => []));
}
// Get customer records from hcp id
$customerRecords = $entityManager->getRepository(Customer::class)->findBy(array('hcp' => $hcpDbId));
$objResponse = [];
// foreach($customerRecords as $customer) {
// $customerDbId = $customer->getId();
// Get latest order for each customer
$orderRecords = $entityManager->getRepository(Order::class)->findBy(array('hcp' => $hcpDbId));
if (count($orderRecords) <= 0) {
return new JsonResponse(array('data' => $objResponse));
}
foreach ($orderRecords as $ordr):
// Check payment status to determine if it's order or draft order
$latestOrderStatus = $ordr->getPaymentStatus();
try {
if ($latestOrderStatus == 'completed'){
$obj = $shopify->Order($ordr->getOrderId())->get();
} else {
$obj = $shopify->DraftOrder($ordr->getOrderId())->get();
}
} catch(ApiException $e) {
continue;
}
$hcpProductIds = $hcpProductRepo->findAllProductIds(); // grab all hcp product ids
$latestOrderCreatedAt = new DateTime($obj['created_at']);
$latestOrderCreatedAt = $latestOrderCreatedAt->format('d/m/Y'); // Get order date
// $totalOrderPrice = '$'. $obj['total_price']; // get order price
$totalOrderPrice = 0;
$productData = $quantityData = $productPrice = ''; // Initialize empty variable
foreach ($obj['line_items'] as $product) {
if (in_array($product['product_id'], $hcpProductIds)){
$productObj = $shopify->Product($product['product_id'])->get();
$productData .= '<span><a href="/products/'. $productObj['handle'] .'">'. $product['name'] .' capsules</a></span>';
$quantityData .= '<span>'. $product['quantity'] .'</span>';
$productPrice .= '<span>$'. $product['price'] .'</span>';
$totalOrderPrice += $product['price'] * $product['quantity'];
}
}
array_push($objResponse, [
$ordr->getId(),
$ordr->getCustomer()->getName(),
$latestOrderCreatedAt,
$productData,
$productPrice,
$quantityData,
'$'.number_format((float)$totalOrderPrice, 2, '.', ''),
'<span class="status">'. $latestOrderStatus .'</span>',
]);
endforeach;
// }
$objResponse = array_reverse($objResponse);
return new JsonResponse(array('data' => $objResponse));
}
/**
* @Route("/api/customer/emails", name="app_customer_email_api")
*/
public function customerEmail(Request $request, ManagerRegistry $doctrine): Response
{
$config = array(
'ShopUrl' => 'solgar-nz.myshopify.com',
'AccessToken' => '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',
);
$shopify = new ShopifySDK($config);
$entityManager = $doctrine->getManager();
$hcpId = $request->query->get('hcp_id');
$hcp = $entityManager->getRepository(Hcp::class)->findOneBy(array('hcpId' => $hcpId));
$hcpDbId = $hcp->getId();
// Get customer records from hcp id
$customerRecords = $entityManager->getRepository(Customer::class)->findBy(array('hcp' => $hcpDbId));
$objResponse = [];
foreach($customerRecords as $customer) {
$customerEmail = $customer->getEmail();
array_push($objResponse, $customerEmail);
}
return new JsonResponse($objResponse);
}
/**
* @Route("/api/customer/update_tag", name="app_customer_tag_api")
*/
public function updateCustomerTag(Request $request, ManagerRegistry $doctrine): Response
{
$config = array(
'ShopUrl' => 'solgar-nz.myshopify.com',
'AccessToken' => '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',
);
$shopify = new ShopifySDK($config);
$entityManager = $doctrine->getManager();
$jsonObj = json_decode($request->getContent(), true);
$customerEmail = $jsonObj['email'];
$draftOrderStatus = $jsonObj['status'];
if ($draftOrderStatus != 'completed') {
return new Response('Draft order status is still open', 200);
}
$customer = $entityManager->getRepository(Customer::class)->findOneBy(array('email' => $customerEmail));
if (!empty($customer)):
// Get current tags
$customerObj = $shopify->Customer($customer->getCustomerId())->get();
$currentTags = explode(',', $customerObj['tags']);
$lineItems = $jsonObj['line_items'];
foreach($lineItems as $lineItem){
$productId = $lineItem['product_id'];
$productObj = $shopify->Product($productId)->get();
// if (!in_array($productObj['handle'], $currentTags)){
// array_push($currentTags, $productObj['handle']);
// }
if (!empty($productObj['tags'])) {
$pTags = explode(',', $productObj['tags']);
if (in_array('hcp', $pTags)) {
$productHandleString = 'hcp-unlocked';
$customerResponse = $shopify->Customer($customer->getCustomerId())->put(
array(
'tags' => $productHandleString,
)
);
}
}
}
endif;
return new Response('Customer '. $customerEmail.' has been updated.', 200);
}
/**
* @Route("/api/customer/feed", name="app_customer_feed_api")
*/
public function customerFeed(Request $request, ManagerRegistry $doctrine): Response
{
$config = array(
'ShopUrl' => 'solgar-nz.myshopify.com',
'AccessToken' => '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',
);
$shopify = new ShopifySDK($config);
$entityManager = $doctrine->getManager();
$email = $request->query->get('email');
$hcp = $entityManager->getRepository(Customer::class)->findOneBy(array('email' => $email));
$customerId = $hcp->getCustomerId();
// Get customer records from hcp id
$customerObj = $shopify->Customer($customerId)->get();
return new JsonResponse($customerObj);
}
/**
* @Route("/api/customer/emailFeed", name="app_customer_feed_api")
*/
public function getCustomerFromEmail(Request $request, ManagerRegistry $doctrine): Response
{
$config = array(
'ShopUrl' => 'solgar-nz.myshopify.com',
'AccessToken' => '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',
);
$shopify = new ShopifySDK($config);
// Get customer records from hcp id
$customerObj = $shopify->Customer()->search([
"query" => "email:[email protected]"
]);
return new JsonResponse($customerObj);
}
}