<?php
namespace App\Controller;
use App\Entity\AvocadostoreOrder;
use App\Entity\AvocadostoreOrderLine;
use App\Entity\AvocadostoreToShopwareConnection;
use App\Service\Avocadostore\AvocadostoreOrderSyncService;
use App\Service\OrderImportService;
use App\Service\Shopware\AdminApiClient;
use App\Service\Shopware\StoreApiClient;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Shopware\Core\Framework\DataAbstractionLayer\EntityRepositoryInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class TestController extends AbstractController
{
/**
* @Route("/job/sync_orders_to_shopware", name="test")
*/
public function index(OrderImportService $orderImportService, StoreApiClient $storeApiClient, AdminApiClient $adminApiClient, AvocadostoreOrderSyncService $orderSyncService, EntityManagerInterface $entityManager)
{
/** @var EntityRepository $avocadostoreToShopwareConnectionRepository */
$avocadostoreToShopwareConnectionRepository = $entityManager->getRepository(AvocadostoreToShopwareConnection::class);
$connections = $avocadostoreToShopwareConnectionRepository->findBy([], ['id' => 'ASC']);
/** @var AvocadostoreToShopwareConnection $connection */
foreach ($connections as $connection) {
$orderSyncService->syncOrders($connection);
}
// Load sales channel data.
// $context = $storeApiClient->getContext($shopBaseUrl, $apiVersion, $swAccessKey);
// $languages = $storeApiClient->getLanguages($shopBaseUrl, $apiVersion, $swAccessKey);
// $currencies = $storeApiClient->getCurrencies($shopBaseUrl, $apiVersion, $swAccessKey);
// $paymentMethods = $storeApiClient->getPaymentMethods($shopBaseUrl, $apiVersion, $swAccessKey);
// $shippingMethods = $storeApiClient->getShippingMethods($shopBaseUrl, $apiVersion, $swAccessKey);
// foreach ($numbers as $number) {
// try {
// $productNumber2Id[$number] = $storeApiClient->findProductIdByNumber($shopBaseUrl, $apiVersion, $swAccessKey, $number);
// } catch (\Exception $e) {
// dd($e);
// }
// }
// Login user.
// $contextToken = $storeApiClient->loginCustomer($shopBaseUrl, $apiVersion, $swAccessKey, $username, $password);
// Add products to cart.
// $cart = $storeApiClient->cartAddLineItem($shopBaseUrl, $apiVersion, $swAccessKey, $contextToken, '123');
// dd($productNumber2Id);
// die();
return $this->render('test/index.html.twig', [
'controller_name' => 'TestController',
]);
}
/**
* @Route("/avocadostore/order_export_webhook/{connection}", name="avocadostore_order_export_webhook")
*/
public function test2(AvocadostoreToShopwareConnection $connection, Request $request, EntityManagerInterface $em) {
try {
$this->log('Starting import.');
$body = $request->getContent();
$orderRepository = $em->getRepository(AvocadostoreOrder::class);
$orderLineRepository = $em->getRepository(AvocadostoreOrderLine::class);
$this->log('Decoding data.');
$json = json_decode($body);
if($json === false) {
$this->log('false');
return new Response('', 503);
}
if(empty($json->exportUrl)) {
$this->log('false');
mail('[email protected]', 'Avocadostore', 'No exportUrl in body.');
return new Response('No exportUrl in body.', 503);
}
$this->log('Loading external data from "' . $json->exportUrl . '".');
$content = file_get_contents($json->exportUrl);
$this->log('Content: ' . $content);
$header = [];
$orders = [];
// LINE START
foreach (explode("\n", $content) as $key => $line) {
$this->log('Line: ' . $line);
if(empty($line)) {
$this->log('empty line.');
continue;
}
$lineData = str_getcsv($line, ';', '"');
if($key === 0) {
$header = $lineData;
} else {
$orderedLineData = [];
// Arrange array keys.
foreach ($lineData as $arrayKey => $value) {
$orderedLineData[$header[$arrayKey]] = $value;
}
$orders[$orderedLineData['order-id']]['order'] = $orderedLineData;
$orders[$orderedLineData['order-id']]['lines'][] = $orderedLineData;
}
}// LINE END
foreach ($orders as $orderId => $orderCsv) {
// Order import
if(empty($orderCsv['order']['payment-date'])) {
$this->log('Skipping line because payment-date is not set.');
continue;
}
$this->log('search order with id "' . $orderCsv['order']['order-id'] . '"');
/** @var null|AvocadostoreOrder $order */
$order = $orderRepository->findOneBy([
'avocadostoreOrderId' => $orderCsv['order']['order-id']
]);
if($order !== null) {
// Skip if already added.
$this->log('Skipping order with id "' . $order->getAvocadostoreOrderId() . '" because it is already there.');
continue;
}
$purchaseDate = \DateTime::createFromFormat('Y-m-d H:i:s O', $orderCsv['order']['purchase-date']);
$paymentDate = null;
$this->log('Payment date: ' . $orderCsv['order']['payment-date']);
try {
$newPaymentDate = \DateTime::createFromFormat('Y-m-d H:i:s O', $orderCsv['order']['payment-date']);
if($newPaymentDate !== false) {
$paymentDate = $newPaymentDate;
$this->log('New payment date: ' . $newPaymentDate->format('Y-m-d'));
}
} catch (\Exception $e) {
}
$this->log('Setting variables');
$order = new AvocadostoreOrder();
$order->setConnection($connection);
$order->setAvocadostoreOrderId($orderCsv['order']['order-id']);
$order->setSynced(false);
$order->setErrorCount(0);
$this->log('Purchase date: ' . $purchaseDate->format('Y-m-d H:i:s'));
$this->log('Payment date: ' . $paymentDate->format('Y-m-d H:i:s'));
$this->log('Currency: ' . $orderCsv['order']['currency']);
$this->log('Shipping price: ' . $orderCsv['order']['shipping-price']);
// Only update if not already synced.
$order->setPurchaseDate($purchaseDate);
$order->setPaymentDate($paymentDate);
$order->setCurrency($orderCsv['order']['currency']);
$this->log('Shipping price: ' . str_replace(',', '.', $orderCsv['order']['shipping-price']));
$order->setShippingPrice(floatval(str_replace(',', '.', $orderCsv['order']['shipping-price'])));
$this->log('Shipping tax: ' . str_replace(',', '.', $orderCsv['order']['shipping-tax']));
$order->setShippingTax(floatval(str_replace(',', '.', $orderCsv['order']['shipping-tax'])));
$this->log('check123');
$order->setShippingServiceLevel($orderCsv['order']['shipping-service-level']);
$order->setRecipientName($orderCsv['order']['recipient-name']);
$order->setShipAddress1($orderCsv['order']['ship-address-1']);
$order->setShipAddress2($orderCsv['order']['ship-address-2']);
$order->setShipPostalCode($orderCsv['order']['ship-postal-code']);
$order->setShipCity($orderCsv['order']['ship-city']);
$order->setShipCountry($orderCsv['order']['ship-country']);
$order->setShipAddressAdditional($orderCsv['order']['ship-address-additional']);
$order->setShipAddressStreet($orderCsv['order']['ship-address-street']);
$order->setShipAddressNo($orderCsv['order']['ship-address-no']);
$order->setBuyerName($orderCsv['order']['buyer-name']);
$order->setBillAddress1($orderCsv['order']['bill-address-1']);
$order->setBillAddress2($orderCsv['order']['bill-address-2']);
$order->setBillPostalCode($orderCsv['order']['bill-postal-code']);
$order->setBillCity($orderCsv['order']['bill-city']);
$order->setBillCountry($orderCsv['order']['bill-country']);
$order->setBillAddressAdditional($orderCsv['order']['bill-address-additional']);
$order->setBillAddressStreet($orderCsv['order']['bill-address-street']);
$order->setBillAddressNo($orderCsv['order']['bill-address-no']);
$order->setBuyerId($orderCsv['order']['buyer-id']);
$this->log('persisting data.');
$em->persist($order);
$em->flush();
$this->log('persisting data finished.');
foreach ($orderCsv['lines'] as $key => $orderedLineData) {
// Order line import.
$this->log('Importing line: ' . print_r($orderedLineData, true));
// Create order line.
// $orderLine = $orderLineRepository->findOneBy([
// 'avocadostoreOrderId' => $orderedLineData['order-id'],
// 'avocadostoreOrderItemId' => $orderedLineData['order-item-id'],
// ]);
// if($orderLine === null) {
$orderLine = new AvocadostoreOrderLine();
$orderLine->setAvocadostoreOrderId($orderedLineData['order-id']);
$orderLine->setAvocadostoreOrderItemId($orderedLineData['order-item-id']);
// }
$orderLine->setSku($orderedLineData['sku']);
$orderLine->setProductName($orderedLineData['product-name']);
$orderLine->setQuantityPurchased($orderedLineData['quantity-purchased']);
$orderLine->setItemPrice(str_replace(',', '.', $orderedLineData['item-price']));
$orderLine->setItemTax(str_replace(',', '.', $orderedLineData['item-tax']));
$em->persist($orderLine);
$em->flush();
}
}
$this->log('ok');
} catch (\Exception $e) {
$this->log('Error: ' . $e->getMessage() . "\n" . 'Line: ' . $e->getLine());
mail('[email protected]', 'Avocadostore', $e->getMessage() . "\n" . $e->getTraceAsString());
}
$this->log('Finishing import.');
return new Response('ok');
}
private function log($string) {
$log = file_get_contents(__DIR__ . '/../../var/log/avl.log.txt');
$log .= (new \DateTime())->format('Y-m-d H:i:s') . ': ' . $string . "\n";
file_put_contents(__DIR__ . '/../../var/log/avl.log.txt', $log);
}
}