<?php
declare(strict_types=1);
namespace App\Controller;
use App\Entity\Customer\Customer;
use App\Entity\Order\Order;
use App\Entity\Order\OrderItem;
use App\Entity\Order\OrderItemCancellation;
use App\Entity\Order\OrderItemRequirement;
use App\Entity\Order\OrderItemReservation;
use App\Entity\Order\OrderNature;
use App\Entity\Order\OrderState;
use App\Entity\Order\OrderType;
use App\Entity\Product\Depot;
use App\Entity\Product\Product;
use App\Form\Type\Order as TypeOrder;
use App\Service\ProductService;
use Pagerfanta\Adapter\ArrayAdapter;
use Pagerfanta\Pagerfanta;
use Sylius\Bundle\OrderBundle\Controller\OrderController as BaseOrderController;
use Sylius\Bundle\ResourceBundle\Grid\View\ResourceGridView;
use Sylius\Component\Resource\ResourceActions;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Sylius\Component\Grid\Parameters;
use Sylius\Component\Order\Model\OrderItemInterface;
use Sylius\Component\Product\Model\ProductInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use ApiPlatform\Core\Api\IriConverterInterface;
use App\Entity\Taxation\TaxRate;
use App\Service\OrderService;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Pagerfanta\Adapter\DoctrineORMAdapter;
use Sylius\Component\Core\Model\ProductVariantInterface;
use Sylius\Component\Order\Model\OrderInterface;
use Symfony\Component\HttpFoundation\File\UploadedFile;
class OrderController extends BaseOrderController
{
protected $searchService;
protected $orderService;
protected $ftpLogService;
public function indexAction(Request $request): Response
{
error_log('indexAction called');
// 1. Configuration et permissions (obligatoire, on ne peut pas l'éviter)
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::INDEX);
// 2. Récupération des services (mise en cache si possible dans le constructeur)
$this->orderService = $this->orderService ?? $this->container->get(OrderService::class);
// 3. Extraction des paramètres (optimisé avec des valeurs par défaut)
$route = $request->get('_route');
$fromCustomerId = ($route === 'sylius_admin_customer_order_index') ? (int)$request->get('id') : 0;
// 4. Gestion des filtres avec valeur par défaut (une seule fois)
$filters = $request->query->get('criteria', []);
if(empty($filters) && empty($fromCustomerId)){$filters['orderState'] = 310;$filters['orderType'] = 3;}
if (empty($filters['date']) && empty($fromCustomerId)) {$filters['createdAt'] = ['from' => (new \DateTimeImmutable('-60 days'))->format('Y-m-d')];
}else{
$filters['createdAt'] = [
'from' => $filters['date']['from']['date'] ?? null,
'to' => $filters['date']['to']['date'] ?? null,
];
}
// 5. Création du QueryBuilder (une seule fois, pas de double requête)
$qb = $this->orderService->createFilteredOrderQBuilder($filters, $fromCustomerId);
// 6. Application du tri (optimisé avec array_walk pour éviter les boucles)
$sorting = $request->query->get('sorting', ['createdAt' => 'desc']);
array_walk($sorting, function($direction, $field) use ($qb) {
$qb->addOrderBy('o.' . $field, $direction);
});
// 7. Paramètres de pagination
$page = (int)$request->query->get('page', 1);
$limit = (int)$request->query->get('limit', 50);
// 8. OPTIMISATION MAJEURE : Utilisation d'un seul adapter optimisé
// Le troisième paramètre (true) active l'output walker pour une meilleure performance
// sur les requêtes complexes avec jointures
$adapter = new DoctrineORMAdapter($qb, true, true);
$pagerfanta = new Pagerfanta($adapter);
$pagerfanta->setMaxPerPage($limit);
try {
$pagerfanta->setCurrentPage($page);
} catch (\OutOfRangeException $e) {
$pagerfanta->setCurrentPage(1);
}
// 9. OPTIMISATION : Récupération des données une seule fois
// On récupère les orders depuis Pagerfanta au lieu de faire une double requête
$orders = $pagerfanta->getCurrentPageResults();
// 10. Calcul optimisé du nombre total (utilise le count du QueryBuilder)
$totalHits = $pagerfanta->getNbResults();
$totalPages = $pagerfanta->getNbPages();
// 11. Grid definition (mise en cache possible dans le constructeur)
$gridProvider = $this->gridProvider ?? $this->container->get('sylius.grid.provider');
$gridDefinition = $gridProvider->get('sylius_admin_order');
// 12. Création de la vue
$resourceGridView = new ResourceGridView(
$pagerfanta,
$gridDefinition,
new Parameters($request->query->all()),
$this->metadata,
$configuration
);
// 13. Dispatch des événements (seulement si nécessaire)
if ($this->eventDispatcher) {
$this->eventDispatcher->dispatchMultiple(ResourceActions::INDEX, $configuration, $orders);
}
error_log('totalHits: ' . $totalHits);
error_log('totalPages: ' . $totalPages);
// 14. Rendu de la réponse
if ($configuration->isHtmlRequest()) {
return $this->render($configuration->getTemplate(ResourceActions::INDEX . '.html'), [
'configuration' => $configuration,
'metadata' => $this->metadata,
'resources' => $resourceGridView,
$this->metadata->getPluralName() => $resourceGridView,
'totalHits' => $totalHits,
'totalPages' => $totalPages,
]);
}
return $this->createRestView($configuration, $orders);
// $configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
// $this->isGrantedOr403($configuration, ResourceActions::INDEX);
// $gridProvider = $this->container->get('sylius.grid.provider');
// $grid = $gridProvider->get('sylius_admin_order');
// // 1. Récupérer tous les paramètres de la requête UNE SEULE FOIS
// $parameters = $request->query->all();
// // 2. Appliquer la limite par défaut SI elle n'est pas déjà dans l'URL
// if (!isset($parameters['limit'])) {
// $parameters['limit'] = 50;
// }
// // 3. Appliquer le filtre de date par défaut SI aucun filtre de date n'est déjà appliqué
// $criteria = $parameters['criteria'] ?? [];
// $hasUserDate = (!empty($criteria['createdAt']['from'])) || (!empty($criteria['createdAt']['to']));
// if (!$hasUserDate) {
// // On s'assure que le tableau imbriqué existe avant d'assigner
// $parameters['criteria']['createdAt']['from'] = (new \DateTime('-2 months'))->format('Y-m-d');
// }
// // 4. (optionnel) Ajouter le filtre client depuis la route
// $route = $request->get('_route');
// $fromCustomerId = $route === 'sylius_admin_customer_order_index' ? (int) $request->get('id') : null;
// if ($fromCustomerId) {
// // Cela va écraser un éventuel filtre client venant de l'URL, ce qui est le comportement attendu ici
// $parameters['criteria']['customer'] = ['value' => $fromCustomerId];
// }
// // 5. Créer l'objet Parameters une seule fois avec tous les bons paramètres
// $finalParams = new Parameters($parameters);
// /** @var ResourceGridViewFactoryInterface $factory */
// $factory = $this->container->get('sylius.grid.resource_view_factory');
// $resourceGridView = $factory->create($grid, $finalParams, $this->metadata, $configuration);
// if ($configuration->isHtmlRequest()) {
// return $this->render($configuration->getTemplate(ResourceActions::INDEX . '.html'), [
// 'configuration' => $configuration,
// 'metadata' => $this->metadata,
// 'resources' => $resourceGridView,
// $this->metadata->getPluralName() => $resourceGridView,
// ]);
// }
// return $this->createRestView($configuration, iterator_to_array($resourceGridView->getData()));
// error_log('indexAction called');
// $configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
// $this->isGrantedOr403($configuration, ResourceActions::INDEX);
// // Get order service from container
// $this->orderService = $this->container->get(OrderService::class);
// $route = $request->get('_route');
// $fromCustomerId = $route == 'sylius_admin_customer_order_index' ? $request->get('id') : 0;
// // Use the service to get paginated orders
// $result = $this->orderService->getPaginatedOrders($request, $fromCustomerId);
// $orders = $result['orders'];
// $totalHits = $result['totalHits'];
// $totalPages = $result['totalPages'];
// // Create query builder for Pagerfanta
// $filters = $request->query->get('criteria', []);
// $qb = $this->orderService->createFilteredOrderQueryBuilder($filters, $fromCustomerId);
// // Apply sorting
// $sorting = $request->query->get('sorting', ['createdAt' => 'desc']);
// foreach ($sorting as $field => $direction) {
// $qb->addOrderBy('o.' . $field, $direction);
// }
// // Create Pagerfanta object for pagination
// $page = $request->query->get('page', 1);
// $limit = $request->query->get('limit', 50);
// $adapter = new DoctrineORMAdapter($qb, false, false);
// $pagerfanta = new Pagerfanta($adapter);
// $pagerfanta->setMaxPerPage($limit);
// $pagerfanta->setCurrentPage($page);
// $pagerfanta->setMaxNbPages((int)$totalPages);
// // Get grid definition from the configuration
// $gridDefinition = $this->container->get('sylius.grid.provider')->get('sylius_admin_order');
// // Create ResourceGridView object
// $resourceGridView = new ResourceGridView(
// $pagerfanta,
// $gridDefinition,
// new Parameters($request->query->all()),
// $this->metadata,
// $configuration
// );
// $this->eventDispatcher->dispatchMultiple(ResourceActions::INDEX, $configuration, $orders);
// error_log('totalHits: ' . $totalHits);
// error_log('totalPages: ' . $totalPages);
// if ($configuration->isHtmlRequest()) {
// return $this->render($configuration->getTemplate(ResourceActions::INDEX . '.html'), [
// 'configuration' => $configuration,
// 'metadata' => $this->metadata,
// 'resources' => $resourceGridView,
// $this->metadata->getPluralName() => $resourceGridView,
// 'totalHits' => $totalHits,
// 'totalPages' => $totalPages,
// ]);
}
private function initializeServices(): void
{
// Pré-charger les services
$this->orderService = $this->container->get(OrderService::class);
$this->gridProvider = $this->container->get('sylius.grid.provider');
}
public function indexActionWithCache(Request $request): Response
{
error_log('indexAction called');
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::INDEX);
$this->orderService = $this->orderService ?? $this->container->get(OrderService::class);
$route = $request->get('_route');
$fromCustomerId = ($route === 'sylius_admin_customer_order_index') ? (int)$request->get('id') : 0;
$filters = $request->query->get('criteria', []);
if (empty($filters['createdAt']) && empty($fromCustomerId)) {
$filters['createdAt'] = [
'from' => (new \DateTimeImmutable('-90 days'))->format('Y-m-d')
];
}
// Création d'une clé de cache unique basée sur les paramètres
$cacheKey = md5(serialize([
'filters' => $filters,
'customer' => $fromCustomerId,
'sorting' => $request->query->get('sorting', ['createdAt' => 'desc']),
'page' => $request->query->get('page', 1),
'limit' => $request->query->get('limit', 50)
]));
$qb = $this->orderService->createFilteredOrderQBuilder($filters, $fromCustomerId);
// Active le cache de requête Doctrine (60 secondes)
$qb->getQuery()
->useResultCache(true, 60, 'orders_' . $cacheKey)
->useQueryCache(true);
$sorting = $request->query->get('sorting', ['createdAt' => 'desc']);
array_walk($sorting, function($direction, $field) use ($qb) {
$qb->addOrderBy('o.' . $field, $direction);
});
$page = (int)$request->query->get('page', 1);
$limit = (int)$request->query->get('limit', 50);
// Utilisation de l'adapter optimisé avec hydratation partielle si possible
$adapter = new DoctrineORMAdapter($qb, true, true);
$pagerfanta = new Pagerfanta($adapter);
$pagerfanta->setMaxPerPage($limit);
try {
$pagerfanta->setCurrentPage($page);
} catch (\OutOfRangeException $e) {
$pagerfanta->setCurrentPage(1);
}
$orders = $pagerfanta->getCurrentPageResults();
$totalHits = $pagerfanta->getNbResults();
$totalPages = $pagerfanta->getNbPages();
$gridProvider = $this->gridProvider ?? $this->container->get('sylius.grid.provider');
$gridDefinition = $gridProvider->get('sylius_admin_order');
$resourceGridView = new ResourceGridView(
$pagerfanta,
$gridDefinition,
new Parameters($request->query->all()),
$this->metadata,
$configuration
);
if ($this->eventDispatcher) {
$this->eventDispatcher->dispatchMultiple(ResourceActions::INDEX, $configuration, $orders);
}
error_log('totalHits: ' . $totalHits);
error_log('totalPages: ' . $totalPages);
if ($configuration->isHtmlRequest()) {
return $this->render($configuration->getTemplate(ResourceActions::INDEX . '.html'), [
'configuration' => $configuration,
'metadata' => $this->metadata,
'resources' => $resourceGridView,
$this->metadata->getPluralName() => $resourceGridView,
'totalHits' => $totalHits,
'totalPages' => $totalPages,
]);
}
return $this->createRestView($configuration, $orders);
}
// @TODO: indexActionForAlgolia Will be removed later
public function indexActionForAlgolia(Request $request): Response
{
error_log('indexAction called');
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::INDEX);
// Collect all criteria from filters
$filters = $request->query->get('criteria', []);
// error_log(print_r($filters, true)); // Log filters for debugging
// Initialize search query
$searchConditions = [];
// Ensure filters is an array and construct the search query
if (is_array($filters)) {
foreach ($filters as $field => $criteria) {
if (is_array($criteria)) {
if (isset($criteria['value']) && !empty($criteria['value'])) {
if($field === "customer"){
$searchConditions[] = '('.$field . '.companyName:"' . $criteria['value'] . '" OR ' .$field . '.code:"' . $criteria['value'] . '")';
}elseif($field === "postCode"){
$searchConditions[] = 'orderAddress.' . $field . ':"' . $criteria['value'] . '"';
}else{
$searchConditions[] = $field . ':"' . $criteria['value'] . '"';
}
} elseif ($field === 'date') {
// Initialize variables for 'from' and 'to' timestamps
$fromDateTime = null;
$toDateTime = null;
// Handle the 'from' part
if (!empty($criteria['from']['date']) && !empty($criteria['from']['time'])) {
// Both date and time provided
$fromDateTime = $criteria['from']['date'] . ' ' . $criteria['from']['time'] . '.000000';
} elseif (!empty($criteria['from']['date'])) {
// Only date provided (set time to start of the day)
$fromDateTime = $criteria['from']['date'] . ' 00:00:00.000000';
} elseif (!empty($criteria['from']['time'])) {
// Only time provided (use current date with provided time)
$fromDateTime = date('Y-m-d') . ' ' . $criteria['from']['time'] . '.000000';
}
// Handle the 'to' part
if (!empty($criteria['to']['date']) && !empty($criteria['to']['time'])) {
// Both date and time provided
$toDateTime = $criteria['to']['date'] . ' ' . $criteria['to']['time'] . '.000000';
} elseif (!empty($criteria['to']['date'])) {
// Only date provided (set time to end of the day)
$toDateTime = $criteria['to']['date'] . ' 23:59:59.000000';
} elseif (!empty($criteria['to']['time'])) {
// Only time provided (use current date with provided time)
$toDateTime = date('Y-m-d') . ' ' . $criteria['to']['time'] . '.000000';
}
// Convert the 'from' and 'to' date-time strings to Unix timestamps
$fromTimestamp = !empty($fromDateTime) ? strtotime($fromDateTime) : null;
$toTimestamp = !empty($toDateTime) ? strtotime($toDateTime) : null;
// Construct the search condition if both timestamps are valid
if ($fromTimestamp && $toTimestamp) {
$searchConditions[] = 'createdAt.date: ' . $fromTimestamp . ' TO ' . $toTimestamp;
}
}elseif ($field === 'amountExcludingTax' || $field === 'totalOrder') {
if($field === 'totalOrder'){
$field = "netToPayAmount";
}
if (!empty($criteria['greaterThan'])) {
$searchConditions[] = $field . ' > ' . (float)$criteria['greaterThan']*100;
}
if (!empty($criteria['lessThan'])) {
$searchConditions[] = $field . ' < ' . (float)$criteria['lessThan']*100;
}
if (!empty($criteria['currency'])) {
$searchConditions[] = 'currencyCode:' . $criteria['currency'];
}
}elseif (!empty($criteria) && ($field == "orderType" || $field == "orderNature" || $field == "orderState" || $field == "shippingMethod" || $field == "city" )) {
// Combine array values with logical OR using the correct format
$conditions = [];
foreach ($criteria as $value) {
$conditions[] = $field . '.id:' . $value;
}
// Join the conditions with 'OR' and wrap them in parentheses
$searchConditions[] = '(' . implode(' OR ', $conditions) . ')';
}
}else {
if (!empty($criteria) && ($field == "orderType" || $field == "orderNature" || $field == "orderState" || $field == "shippingMethod" || $field == "city" )) {
$searchConditions[] = $field . '.id:"' . $criteria . '"';
}
}
}
}
// Concatenate search queries with AND operator
$searchQuery = implode(' AND ', $searchConditions);
// dd($searchQuery);
// Get search service from container
$searchService = $this->container->get('search.client');
// Initialize Algolia index
$algoliaIndex = $searchService->initIndex('orders_index');
$algoliaIndex->setSettings([
'attributesForFaceting' => [
"searchable(number)",
"searchable(object)",
"searchable(orderAddress)",
"searchable(depot)",
"searchable(entryDepot)",
"searchable(customer1)",
"searchable(customer2)",
"searchable(billingCustomer)",
"searchable(shippingCustomer)",
"searchable(shippingMethodCustomer)",
"searchable(orderType)",
"searchable(orderNature)",
"searchable(orderState)",
"searchable(customerPaymentMethod)",
"searchable(customerRepresentative)",
"searchable(shippingMethod)",
"searchable(shippingTaxRate)",
"searchable(taxRateGroup)",
"searchable(customer)",
"searchable(channel)",
"searchable(paymentDueDate)",
"searchable(text)",
"searchable(city)",
"searchable(amountExcludingTax)",
"searchable(amountExcludingDTax)",
"searchable(paidAmount)",
"searchable(taxAmount)",
"searchable(netToPayAmount)",
"searchable(commercialNetAmount)",
"searchable(financialNetAmount)",
"searchable(state)",
"searchable(createdAt)",
"searchable(updatedAt)",
"searchable(currencyCode)",
]
]);
$initialSearchResults = $algoliaIndex->search('', [
'filters' => $searchQuery,
'hitsPerPage' => 0, // Only fetch the count, no actual results needed
]);
$totalAlgoliaHits = $initialSearchResults['nbHits'];
error_log('Total Hits: ' . $totalAlgoliaHits);
$algoliaIndex->setSettings([
'paginationLimitedTo' => $totalAlgoliaHits
]);
// Perform search with pagination and filters
$page = $request->query->get('page', 1);
$limit = $request->query->get('limit', 50);
$hitsPerPage = $limit; // Define the number of results per page
// Set $limitPages based on $page
$coef = (int) ceil(999 / $hitsPerPage);
if ($page < $coef) {
$limitPages = 0;
} else {
$limitPages = floor($page / $coef);
}
// Fetch results for pages 0, 1, and 2
$allResults = [];
for ($i = 0; $i <= $limitPages; $i++) {
$searchResults = $algoliaIndex->search('', [
'filters' => $searchQuery,
'page' => $i, // Fetching up to the current page
'hitsPerPage' => 999,
]);
$allResults = array_merge($allResults, $searchResults['hits']);
}
// Capture total hits for proper pagination
$totalHits = count($allResults);
$searchResults['hits'] = $allResults;
// Convert search results to array of Order entities
$orders = [];
foreach ($searchResults['hits'] as $hit) {
$order = new Order();
$order->setId((int)$hit['id']); // Convert string to integer
$order->setNumber($hit['number']);
if (isset($hit['depot']) && $hit['depot'] !== null) {
$order->setDepot($hit['depot']);
}
if (isset($hit['object']) && $hit['object'] !== null) {
$order->setObject($hit['object']);
}
if (isset($hit['orderAddress']) && $hit['orderAddress'] !== null) {
$order->setOrderAddress($hit['orderAddress']);
}
if (isset($hit['entryDepot']) && $hit['entryDepot'] !== null) {
$order->setEntryDepot($hit['entryDepot']);
}
if (isset($hit['customer']) && $hit['customer'] !== null) {
// Assuming Customer is your implementation of CustomerInterface
$customer = new Customer(); // or any class that implements CustomerInterface
// Set the fields on the customer object
$customer->setId((int)$hit['customer']['id']);
$customer->setCompanyName($hit['customer']['companyName']);
$customer->setCode($hit['customer']['code']);
// Now set the customer object on the order
$order->setCustomer($customer);
}
if (isset($hit['customer1']) && $hit['customer1'] !== null) {
$order->setCustomer1($hit['customer1']);
}
if (isset($hit['customer2']) && $hit['customer2'] !== null) {
$order->setCustomer2($hit['customer2']);
}
if (isset($hit['billingCustomer']) && $hit['billingCustomer'] !== null) {
$order->setBillingCustomer($hit['billingCustomer']);
}
if (isset($hit['shippingCustomer']) && $hit['shippingCustomer'] !== null) {
$order->setShippingCustomer($hit['shippingCustomer']);
}
if (isset($hit['shippingMethodCustomer']) && $hit['shippingMethodCustomer'] !== null) {
$order->setShippingMethodCustomer($hit['shippingMethodCustomer']);
}
if (isset($hit['orderNature']) && $hit['orderNature'] !== null) {
$order->setOrderNature($hit['orderNature']);
}
if (isset($hit['orderType']) && $hit['orderType'] !== null) {
$order->setOrderType($hit['orderType']);
}
if (isset($hit['customerPaymentMethod']) && $hit['customerPaymentMethod'] !== null) {
$order->setCustomerPaymentMethod($hit['customerPaymentMethod']);
}
if (isset($hit['city']) && $hit['city'] !== null) {
$order->setCity($hit['city']);
}
if (isset($hit['paymentMethod']) && $hit['paymentMethod'] !== null) {
$order->setPaymentMethod($hit['paymentMethod']);
}
if (isset($hit['customerRepresentative']) && $hit['customerRepresentative'] !== null) {
$order->setCustomerRepresentative($hit['customerRepresentative']);
}
if (isset($hit['text']) && $hit['text'] !== null) {
$order->setText($hit['text']);
}
if (isset($hit['shippingMethod']) && $hit['shippingMethod'] !== null) {
$order->setShippingMethod($hit['shippingMethod']);
}
if (isset($hit['shippingTaxRate']) && $hit['shippingTaxRate'] !== null) {
$order->setShippingTaxRate((float) $hit['shippingTaxRate']); // Cast to float if necessary
}
if (isset($hit['taxApplied']) && $hit['taxApplied'] !== null) {
$order->setTaxApplied((bool) $hit['taxApplied']); // Cast to boolean
}
if (isset($hit['status']) && $hit['status'] !== null) {
$order->setStatus($hit['status']);
}
if (isset($hit['object']) && $hit['object'] !== null) {
$order->setObject($hit['object']);
}
if (isset($hit['weight']) && $hit['weight'] !== null) {
$order->setWeight((float) $hit['weight']);
}
if (isset($hit['orderState']) && $hit['orderState'] !== null) {
$order->setOrderState($hit['orderState']);
}
if (isset($hit['attentionOf']) && $hit['attentionOf'] !== null) {
$order->setAttentionOf($hit['attentionOf']);
}
if (isset($hit['loyaltyCheck']) && $hit['loyaltyCheck'] !== null) {
$order->setLoyaltyCheck((bool) $hit['loyaltyCheck']);
}
if (isset($hit['mailingCode']) && $hit['mailingCode'] !== null) {
$order->setMailingCode($hit['mailingCode']);
}
if (isset($hit['currencyCode']) && $hit['currencyCode'] !== null) {
$order->setCurrencyCode($hit['currencyCode']);
}
if (isset($hit['amountExcludingTax']) && $hit['amountExcludingTax'] !== null) {
$order->setAmountExcludingTax($hit['amountExcludingTax']/100);
}
if (isset($hit['netToPayAmount']) && $hit['netToPayAmount'] !== null) {
$order->setNetToPayAmount($hit['netToPayAmount']/100);
}
if (isset($hit['createdAt']) && $hit['createdAt'] !== null) {
$createdAt = (new \DateTime())->setTimestamp($hit['createdAt']['date']);
$order->setCreatedAt($createdAt);
}
$orders[] = $order;
}
// Create Pagerfanta object for pagination
$adapter = new ArrayAdapter($orders);
$pagerfanta = new Pagerfanta($adapter);
$pagerfanta->setMaxPerPage($hitsPerPage); // Set items per page
$pagerfanta->setCurrentPage($page); // Handle page query param
// Calculate total pages
$totalPages = ceil($totalHits / $hitsPerPage);
if($searchResults['hits'] !== []){
$pagerfanta->setMaxNbPages((int)$totalPages);
}
// Get grid definition from the configuration
$gridDefinition = $this->container->get('sylius.grid.provider')->get('sylius_admin_order');
// Create ResourceGridView object
$resourceGridView = new ResourceGridView(
$pagerfanta,
$gridDefinition,
new Parameters($request->query->all()),
$this->metadata,
$configuration
);
$this->eventDispatcher->dispatchMultiple(ResourceActions::INDEX, $configuration, $orders);
error_log('totalHits: '.$totalHits);
error_log('totalPages: '.$totalPages);
if ($configuration->isHtmlRequest()) {
return $this->render($configuration->getTemplate(ResourceActions::INDEX . '.html'), [
'configuration' => $configuration,
'metadata' => $this->metadata,
'resources' => $resourceGridView,
'searchResults' => $searchResults,
$this->metadata->getPluralName() => $resourceGridView,
'totalHits' => $totalHits, // Include total hits for reference
'totalPages' => $totalPages, // Total pages for pagination
]);
}
return $this->createRestView($configuration, $orders);
}
public function showAction(Request $request): Response
{
$isPaymentMethodAvailable = [];
$orderItemStates = [];
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::SHOW);
/** @var Order $resource */
$resource = $this->findOr404($configuration);
$this->eventDispatcher->dispatch(ResourceActions::SHOW, $configuration, $resource);
foreach ($resource->getPayments() as $payment) {
$isPaymentMethodAvailable[] = [
'paymentId' => $payment->getId(),
'isAvailable' => $this->repository->ifOrderHasPaymentMethod($resource->getLastPayment()->getId())
];
}
// Load order items from FTP if applicable
// if ($resource->getLoadsFromFtp()) {
if (2 == 1) {
$this->ftpLogService = $this->container->get('app.service.ftp_log_service');
$orderFtp = $this->ftpLogService->getOrderLogs('flash_stock', $resource->getId());
if(count($orderFtp)==0){
$orderFtp = $this->ftpLogService->getOrderLogs('mvt_stock', $resource->getId());
}
if (!empty($orderFtp[0]['content'][0]['data'])) {
$dataOrder = $orderFtp[0]['content'][0]['data'];
$entityManager = $this->container->get('doctrine')->getManager();
// Optional: Clear existing items
foreach ($resource->getItems() as $item) {
$resource->removeItem($item);
}
// Populate items
foreach ($dataOrder["items"] as $itemData) {
// create object orderItem and add it to $resource items without using function
$orderItem = new OrderItem();
if (!empty($itemData['product_id'])) {
$variant = $entityManager->getRepository(ProductVariantInterface::class)
->find($itemData['product_id']);
if ($variant) {
if($variant->getProduct()->getBarcode() == 0){
continue;
}
$orderItem->setVariant($variant);
}
}
$orderItem->setQuantity((int)($itemData['new_stock'] ?? 1));
$orderItem->setDesignation($itemData['designation'] ?? null);
$orderItem->setReference($itemData['reference'] ?? null);
$orderItem->setChecked((bool)($itemData['checked'] ?? false));
$orderItem->setAccountingCode($itemData['accounting_code'] ?? null);
$orderItem->setAnalyticalAccountingCode($itemData['analytical_accounting_code'] ?? null);
$orderItem->setSupplyCoefficient($itemData['supply_coefficient'] ?? null);
$orderItem->setCom((bool)($itemData['com'] ?? false));
$orderItem->setComment($itemData['comment'] ?? null);
$orderItem->setIsBold((bool)($itemData['is_bold'] ?? false));
$orderItem->setIsItalic((bool)($itemData['is_italic'] ?? false));
$orderItem->setMargin($itemData['margin'] ?? null);
$orderItem->setMask((bool)($itemData['mask'] ?? false));
$orderItem->setGrossAmount($itemData['ht_price'] ? $itemData['ht_price'] * (int)($itemData['new_stock']) : null);
$orderItem->setNetPrice($itemData['ttc_price'] ?? null);
$orderItem->setPrice($itemData['unit_price'] ?? null);
$orderItem->setReturnPrice($itemData['return_price'] ?? null);
$orderItem->setNumber($itemData['number'] ?? null);
$orderItem->setWeight($itemData['weight'] ?? null);
$orderItem->setPackagingQuantity($itemData['packaging_quantity'] ?? null);
$orderItem->setPrintingQuantity($itemData['printing_quantity'] ?? null);
$orderItem->setDiscountRate($itemData['discount_rate'] ?? null);
$orderItem->setSecondDiscountRate($itemData['second_discount_rate'] ?? null);
$orderItem->setSubItem((bool)($itemData['sub_item'] ?? false));
$orderItem->setLockValue($itemData['lock_value'] ?? null);
$orderItem->setState($itemData['state'] ?? null);
$orderItem->setAvailabilityPercentage($itemData['availability_percentage'] ?? null);
if (!empty($itemData['created_at'])) {
$orderItem->setCreatedAt(new \DateTime($itemData['created_at']));
}
if (!empty($itemData['updated_at'])) {
$orderItem->setUpdatedAt(new \DateTime($itemData['updated_at']));
}
if (!empty($itemData['taxRate_id'])) {
$taxRate = $entityManager
->getRepository(TaxRate::class)
->findOneBy(['id' => $itemData['taxRate_id']]);
if ($taxRate) {
$orderItem->setTaxRate($taxRate);
}
}
// Add item to order
$resource->addItem($orderItem);
}
// Optionally persist if you want to save it in DB (maybe not in a showAction?)
//$this->entityManager->flush();
// Debug output
// dd('Load items from FTP');
}
}
foreach ($resource->getItems() as $item) {
$itemState = $this->repository->fetchOrderItemState($item->getId());
$orderItemStates [] = [
'id' => $item->getId(),
'state' => $itemState
];
}
if ($configuration->isHtmlRequest()) {
return $this->render($configuration->getTemplate(ResourceActions::SHOW . '.html'), [
'configuration' => $configuration,
'metadata' => $this->metadata,
'resource' => $resource,
$this->metadata->getName() => $resource,
'isPaymentMethodAvailable' => $isPaymentMethodAvailable,
'orderItemStates' => $orderItemStates,
'dates' => [
'createdAt' => $this->repository->getOrderDateByState($resource->getId(), "En cours"),
'preparedAt' => $this->repository->getOrderDateByState($resource->getId(), "En préparation"),
'sentAt' => $this->repository->getOrderDateByState($resource->getId(), "expédiée"),
'validatedAt' => $this->repository->getOrderDateByState($resource->getId(), "comptabilisée"),
]
]);
}
return $this->createRestView($configuration, $resource);
}
public function getTreeAction(Request $request): Response
{
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::INDEX);
$resources = $this->resourcesCollectionProvider->get($configuration, $this->repository);
$this->eventDispatcher->dispatchMultiple(ResourceActions::INDEX, $configuration, $resources);
if ($configuration->isHtmlRequest()) {
return $this->render($configuration->getTemplate(ResourceActions::INDEX . '.html'), [
'configuration' => $configuration,
'metadata' => $this->metadata,
'resources' => $resources,
$this->metadata->getPluralName() => $resources,
]);
}
return $this->createRestView($configuration, $resources);
}
public function editAction(Request $request, $id, IriConverterInterface $iriConverter): Response
{
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::SHOW);
/** @var Order $order */
$order = $this->findOr404($configuration);
// Adjust prices for order items only if the form is not submitted
if (!$request->isMethod('POST')) {
foreach ($order->getItems() as $item) {
if ($item->getPrice() > 0 && $item->getNetPrice() > 0) {
$item->setPrice($item->getPrice() / 10000);
$item->setNetPrice($item->getNetPrice() / 10000);
}
}
}
$form = $this->createForm(TypeOrder::class, $order);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if (!$form->isValid()) {
// More detailed error handling
$errors = [];
foreach ($form->getErrors(true) as $error) {
$errors[] = $error->getMessage();
}
// Return form with errors
return $this->render('@SyliusAdmin/Order/Crud/edit.html.twig', [
'order' => $order,
'form' => $form->createView(),
'form_errors' => $errors
]);
}
try {
if ($form->isSubmitted() && $form->isValid()) {
$data = $form->getData();
//dd($data);
}
$entityManager = $this->container->get('doctrine')->getManager();
error_log('[DEBUG ORDER EDIT] Start processing order ' . $order->getId() . ' at ' . date('H:i:s'));
$this->orderService = $this->container->get(OrderService::class);
error_log('[DEBUG ORDER EDIT] Before handleOrderItemsUpdate at ' . date('H:i:s'));
$this->orderService->handleOrderItemsUpdate($order);
error_log('[DEBUG ORDER EDIT] After handleOrderItemsUpdate at ' . date('H:i:s'));
error_log('[DEBUG ORDER EDIT] Before fixItemsPrice at ' . date('H:i:s'));
$this->orderService->fixItemsPrice($order);
error_log('[DEBUG ORDER EDIT] After fixItemsPrice at ' . date('H:i:s'));
// Persist the existing order with its updated data
error_log('[DEBUG ORDER EDIT] Before persist/flush at ' . date('H:i:s'));
$entityManager->persist($order);
$entityManager->flush();
error_log('[DEBUG ORDER EDIT] After flush at ' . date('H:i:s'));
$this->addFlash('success', 'Commande modifié avec succès');
return $this->redirectToRoute('app_admin_order_edit', ['id' => $order->getId()]);
} catch (\Exception $e) {
error_log('[DEBUG ORDER EDIT] Exception: ' . $e->getMessage());
$this->addFlash('error', 'Erreur lors de la modification de la commande: ' . $e->getMessage());
}
}
return $this->render('@SyliusAdmin/Order/Crud/edit.html.twig', [
'order' => $order,
'form' => $form->createView(),
]);
}
public function editNFAction(Request $request, $id, IriConverterInterface $iriConverter): Response
{
$orderItemStates = [];
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::SHOW);
/** @var Order $order */
$order = $this->findOr404($configuration);
if($order instanceof Order) {
foreach ($order->getItems() as $item) {
if($item->getVariant()->getCode() != "Article_DEFAULT") {
$itemState = $this->repository->fetchOrderItemState($item->getId(), true);
$orderItemStates [] = [
'id' => $item->getId(),
'label' => $itemState['label'],
'value' => $itemState['value']
];
}
}
}
// Adjust prices for order items only if the form is not submitted
if (!$request->isMethod('POST')) {
foreach ($order->getItems() as $item) {
if ($item->getPrice() > 0 && $item->getNetPrice() > 0) {
$item->setPrice($item->getPrice() / 10000);
$item->setNetPrice($item->getNetPrice() / 10000);
}
}
}
$form = $this->createForm(TypeOrder::class, $order, [
/*'attr' => [
'order_item_states' => json_encode($orderItemStates), // Pass as JSON
],*/
]);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if (!$form->isValid()) {
// More detailed error handling
$errors = [];
foreach ($form->getErrors(true) as $error) {
$errors[] = $error->getMessage();
}
// Return form with errors
return $this->render('@SyliusAdmin/Order/Crud/edit_nf.html.twig', [
'order' => $order,
'orderItemStates' => $orderItemStates,
'form' => $form->createView(),
'form_errors' => $errors
]);
}
$this->orderService = $this->container->get(OrderService::class);
try {
if ($form->isSubmitted() && $form->isValid()) {
$order = $form->getData();
}
$entityManager = $this->container->get('doctrine')->getManager();
//TODO: handle the change of items state
foreach ($order->getItems() as $item) {
$this->handleItemStatus($item);
}
$this->orderService->fixItemsPrice($order);
// Persist the existing order with its updated data
$entityManager->persist($order);
$entityManager->flush();
$this->addFlash('success', 'Commande modifiée avec succès');
return $this->redirectToRoute('app_admin_nf_order_edit', ['id' => $order->getId()]);
} catch (\Exception $e) {
$this->addFlash('error', 'Erreur lors de la modification de la commande: ' . $e->getMessage());
}
}
return $this->render('@SyliusAdmin/Order/Crud/edit_nf.html.twig', [
'order' => $order,
'orderItemStates' => $orderItemStates,
'form' => $form->createView(),
]);
}
public function handleItemStatus(OrderItem $item) {
$oldStatus = $this->repository->fetchOrderItemState($item, true)['value'];
$this->removeOldState($item->getId(), $oldStatus);
$newItem = null;
switch ($item->getState()) {
case 1:
$newItem = new OrderItemRequirement();
break;
case 2:
$newItem = new OrderItemReservation();
break;
case -1:
$newItem = new OrderItemCancellation();
break;
}
if($newItem) {
$this->createNewItemStatus($item, $newItem);
}
$this->manager->flush();
}
public function createNewItemStatus(OrderItem $item, $newItem) {
$newItem->setOrderItem($item);
$newItem->setQuantity($item->getQuantity());
if($newItem instanceof OrderItemRequirement) {
$newItem->setRequiredAt(new \DateTime());
$newItem->setUpdatedAt(new \DateTime());
}
if($newItem instanceof OrderItemReservation) {
$newItem->setReservedAt(new \DateTime());
}
if($newItem instanceof OrderItemCancellation) {
$newItem->setCancelledAt(new \DateTime());
}
$this->manager->persist($newItem);
}
public function removeOldState($itemId, $oldStatus) {
$itemToRemove = null;
switch ($oldStatus) {
case 1:
$itemToRemove = $this->manager->getRepository(OrderItemRequirement::class)->findBy(['orderItem' => $itemId]);
break;
case 2:
$itemToRemove = $this->manager->getRepository(OrderItemReservation::class)->findBy(['orderItem' => $itemId]);
break;
case -1:
$itemToRemove = $this->manager->getRepository(OrderItemCancellation::class)->findBy(['orderItem' => $itemId]);
break;
}
if($itemToRemove) {
foreach ($itemToRemove as $item) {
$this->manager->remove($item);
}
}
}
public function addAction(Request $request): Response
{
// Create a new Order instance
$order = new Order();
$defaultDepot = $this->container->get('doctrine')
->getRepository(Depot::class)
->find(1);
$defaultOrderType = $this->container->get('doctrine')
->getRepository(OrderType::class)
->find(3);
$order->setDepot($defaultDepot);
$order->setOrderType($defaultOrderType);
// Create the form for the new order
$form = $this->createForm(TypeOrder::class, $order);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if (!$form->isValid()) {
// Gather errors if form validation fails
$errors = [];
foreach ($form->getErrors(true) as $error) {
$errors[] = $error->getMessage();
}
// Return the form with errors for user feedback
return $this->render('@SyliusAdmin/Order/Crud/add.html.twig', [
'order' => $order,
'form' => $form->createView(),
'form_errors' => $errors
]);
}
try {
//TODO: update text generation code
$entityManager = $this->container->get('doctrine')->getManager();
// Generating the order's number TODO: update text generation code
/*$orderType = $order->getOrderType();
$lastInvoiceNumber = $orderType->getCounter();
$newInvoiceNumber = $lastInvoiceNumber + 1;
$order->setText($newInvoiceNumber);
$orderType->setCounter($newInvoiceNumber);*/
$order->setCurrencyCode(("EUR"));
$order->setLocaleCode("fr_FR");
$order->setState("new");
$this->orderService = $this->container->get(OrderService::class);
$this->orderService->generateInvoiceNumber($order);
if($order->getOrderNature() && $order->getOrderNature()->getId() == 83) {
$this->orderService->generateExOrder($order);
} else {
$this->orderService->handleMultiVat($order);
}
if($order->getOrderType() && $order->getOrderType()->getId() == 23) {
$order->setWasProforma(true);
}
$this->orderService->fixItemsPrice($order);
// Persist the new order and orderType after update
$entityManager->persist($order);
//$entityManager->persist($orderType);
$entityManager->flush();
// Add a success flash message
$this->addFlash('success', 'Nouvelle commande ajoutée avec succès');
return $this->redirectToRoute('app_admin_order_edit', ['id' => $order->getId()]);
} catch (\Exception $e) {
/*$requestData = $request->request->all();
dd([
'error' => $e->getMessage(),
'items_data' => $requestData['order']['items'] ?? null,
'items_count' => count($requestData['order']['items'] ?? []),
'first_item' => isset($requestData['order']['items'][0]) ? $requestData['order']['items'][0] : null,
]);*/
$this->addFlash('error', 'Erreur lors de la modification de la commande: ' . $e->getMessage());
}
}
// Render the form for adding a new order
return $this->render('@SyliusAdmin/Order/Crud/add.html.twig', [
'order' => $order,
'form' => $form->createView(),
]);
}
public function deleteOrderAction(Request $request, $id): Response
{
$configuration = $this->requestConfigurationFactory->create($this->metadata, $request);
$this->isGrantedOr403($configuration, ResourceActions::DELETE);
/** @var Order $order */
$order = $this->findOr404($configuration);
try {
$entityManager = $this->container->get('doctrine')->getManager();
// Remove the order
$entityManager->remove($order);
$entityManager->flush();
// Add a success flash message
$this->addFlash('success', 'Commande supprimée avec succès');
} catch (\Exception $e) {
// Add an error flash message if something goes wrong
$this->addFlash('error', 'Erreur lors de la suppression de la commande: ' . $e->getMessage());
}
// Redirect back to the order list or another appropriate page
return $this->redirectToRoute('app_admin_order_index');
}
public function processOrderFeedbackAction(Request $request) {
//TODO: verify first if there is a file
$this->orderService = $this->container->get(OrderService::class);
$ifFileExists = $this->orderService->verifyOrderFeedbackFiles();
/*if(!$ifFileExists) {
$this->addFlash('error', "Aucun nouveau CR trouvé");
return $this->redirectToRoute('sylius_admin_order_index');
}*/
$kernel = $this->container->get('kernel');
$command = sprintf('php %s/bin/console %s', $kernel->getProjectDir(), 'app:process-orders-launch-feedback');
exec("$command > /dev/null 2>&1 &");
$this->addFlash('success', "Le processus récupération de préparation des commandes a été lancé avec succès");
return $this->redirectToRoute('sylius_admin_order_index');
}
public function getNatureByOrderType(int $id): JsonResponse {
$natures = $this->container->get('doctrine')->getRepository(OrderNature::class)->findBy(['orderType' => $id]);
if(!$natures){
$natures = $this->container->get('doctrine')->getRepository(OrderNature::class)->findBy(['orderType' => 3]);
}
$naturesArray = [];
foreach ($natures as $nature) {
$naturesArray [] = ['id' => $nature->getId(), 'name' => $nature->getName(), 'code' => $nature->getCode()];
}
return new JsonResponse($naturesArray, Response::HTTP_OK);
}
public function getStateByOrderType(int $id): JsonResponse {
$states = $this->container->get('doctrine')->getRepository(OrderState::class)->findBy(['orderType' => $id]);
$statesArray = [];
foreach ($states as $state) {
$statesArray [] = ['id' => $state->getId(), 'name' => $state->getName()];
}
return new JsonResponse($statesArray, Response::HTTP_OK);
}
public function getStatusByOrderType(int $id): JsonResponse {
$statusList = $this->container->get('doctrine')->getRepository(Stat::class)->findBy(['orderType' => $id]);
$statesArray = [];
foreach ($statusList as $status) {
$statesArray [] = ['id' => $status->getId(), 'name' => $status->getName()];
}
return new JsonResponse($statesArray, Response::HTTP_OK);
}
public function getDueDateByCustomerPaymentMethod(int $id): JsonResponse {
$this->orderService = $this->container->get(OrderService::class);
$dueDate = $this->orderService->calculateDueDateByCustomerPaymentMethod($id);
return new JsonResponse(['dueDate' => $dueDate], Response::HTTP_OK);
}
public function createFinancialInvoice(Request $request) {
/*$this->orderService = $this->container->get(OrderService::class);
$response = $this->orderService->createFinancialInvoice($request->files->get('csv_file'));
$this->addFlash($response['type'], $response['message']);
return $this->redirectToRoute('sylius_admin_order_index', ['id' => $response['id']]);*/
/** @var UploadedFile|null $file */
$file = $request->files->get('csv_file');
if (!$file) {
$this->addFlash('error', 'No CSV file uploaded.');
return $this->redirectToRoute('sylius_admin_order_index');
}
$kernel = $this->container->get('kernel');
$tempPath = sys_get_temp_dir() . '/' . uniqid('invoice_') . '.csv';
$file->move(dirname($tempPath), basename($tempPath));
$commandName = sprintf(
'app:create-financial-invoices --file=%s',
escapeshellarg($tempPath)
);
$command = sprintf('php %s/bin/console %s', $kernel->getProjectDir(), $commandName);
exec("$command > /dev/null 2>&1 &");
$this->addFlash('success', 'Import CSV lancé en arrière-plan.');
return $this->redirectToRoute('sylius_admin_order_index');
}
public function createAmazonInvoices(Request $request) {
/** @var UploadedFile|null $file */
$file = $request->files->get('csv_file');
$customerId = $request->get('customer_id');
$orderTypeId = $request->get('order_type_id');
if (!$file) {
$this->addFlash('error', 'No CSV file uploaded.');
return $this->redirectToRoute('sylius_admin_order_index');
}
$kernel = $this->container->get('kernel');
$tempPath = sys_get_temp_dir() . '/' . uniqid('invoice_') . '.csv';
$file->move(dirname($tempPath), basename($tempPath));
$commandName = sprintf(
'app:create-amazon-invoices --file=%s --customerId=%d --orderTypeId=%d',
escapeshellarg($tempPath),
(int) $customerId,
(int) $orderTypeId
);
$command = sprintf('php %s/bin/console %s', $kernel->getProjectDir(), $commandName);
exec("$command > /dev/null 2>&1 &");
$this->addFlash('success', 'Import CSV lancé en arrière-plan.');
return $this->redirectToRoute('sylius_admin_order_index');
}
public function analyseAmazonFile(Request $request) {
/** @var UploadedFile|null $file */
$file = $request->files->get('csv_file');
$customerId = $request->get('customer_id');
if (!$file) {
$this->addFlash('error', 'No file uploaded.');
return $this->redirectToRoute('sylius_admin_order_index');
}
$kernel = $this->container->get('kernel');
$extension = $file->getClientOriginalExtension() ?: 'tmp';
$filename = uniqid('amazon_file_') . '.' . $extension;
$tempPath = '/var/www/erpdodcie/erpdodcie_api/var/tmp/' . $filename;
$file->move(dirname($tempPath), basename($tempPath));
$commandName = sprintf(
'app:analyse-amazon-file --file=%s --customerId=%d',
escapeshellarg($tempPath),
(int) $customerId
);
$command = sprintf('php %s/bin/console %s', $kernel->getProjectDir(), $commandName);
exec("$command > /dev/null 2>&1 &");
$this->addFlash('success', 'Import Amazon est lancé en arrière-plan');
return $this->redirectToRoute('sylius_admin_order_index');
}
public function handlePriceChange(Request $request) {
$kernel = $this->container->get('kernel');
$orderItems = json_decode($request->request->get('ids'), true);
//$barcode = $request->request->get('barcode');
$commandName = sprintf(
'app:handle-price-change --orderItems=%s',
escapeshellarg(json_encode($orderItems))
);
$command = sprintf('php %s/bin/console %s', $kernel->getProjectDir(), $commandName);
exec("$command > /dev/null 2>&1 &");
$this->addFlash('success', "Le processus de changement du prix est lancé");
return new JsonResponse([
'status' => 'success',
'clearStorage' => true,
]);
}
public function duplicateInvoice(int $id) {
$this->orderService = $this->container->get(OrderService::class);
$newInvoiceId = $this->orderService->duplicateInvoice($id);
$this->addFlash('success', "La facture a été dupliquée avec succès");
return $this->redirectToRoute('app_admin_order_edit', ['id' => $newInvoiceId]);
}
public function recalculateOrderAmount(int $id) {
$this->orderService = $this->container->get(OrderService::class);
$this->orderService->recalculateOrderAmount($id);
return new JsonResponse('SUCCESS', Response::HTTP_OK);
}
/*public function recalculateOrdersDataByDate(Request $request) {
$this->orderService = $this->container->get(OrderService::class);
$message = $this->orderService->recalculateOrdersDataByDate($request->request->all());
return new JsonResponse($message['message'], $message['type'] == 1 ? Response::HTTP_OK : Response::HTTP_BAD_REQUEST);
}*/
public function generateAssetNumber(int $id) {
$this->orderService = $this->container->get(OrderService::class);
$generateAssetNumber = $this->orderService->generateAssetNumber($id);
$this->addFlash($generateAssetNumber['type'], $generateAssetNumber['message']);
return $this->redirectToRoute('app_admin_order_edit', ['id' => $id]);
}
public function deleteAvoir(int $id) {
$em = $this->getDoctrine()->getManager();
$order = $em->getRepository(Order::class)->find($id);
if (!$order) {
throw $this->createNotFoundException("Order $id not found");
}
$orderType = $em->getRepository(OrderType::class)->find(22);
if (!$orderType) {
throw $this->createNotFoundException("OrderType 22 not found");
}
$order->setOrderType($orderType);
$em->flush();
$kernel = $this->container->get('kernel');
$projectDir = $kernel->getProjectDir();
$cmd = sprintf(
'nohup php %s/bin/console app:cleanup-returned-quantities %s --no-ansi --no-interaction >> %s/var/log/cleanup_%d.log 2>&1 & echo $!',
escapeshellarg($projectDir),
escapeshellarg((string)$id),
escapeshellarg($projectDir),
$id
);
$pid = trim(shell_exec($cmd));
if (!ctype_digit($pid)) {
$this->addFlash('danger', "Le lancement du cleanup a échoué pour #$id.");
} else {
$this->addFlash('success', "Avoir(#$id), supprimé !");
return $this->redirectToRoute("sylius_admin_order_index");
}
}
public function reversePurchaseTrace(Request $request) {
$this->orderService = $this->container->get(OrderService::class);
$this->orderService->reversePurchaseTrace();
return new JsonResponse('success', Response::HTTP_OK);
}
public function cancelItem(Request $request) {
/** @var OrderService orderService */
$this->orderService = $this->container->get(OrderService::class);
$message = $this->orderService->cancelItem($request->request->all());
return new JsonResponse($message['message'], $message['code']);
}
public function getParentObjects(int $id){
/** @var OrderService orderService */
$this->orderService = $this->container->get(OrderService::class);
return new JsonResponse($this->orderService->getParentObjects($id), Response::HTTP_OK);
}
}