<?php
namespace App\Controller;
use App\Entity\Customer;
use App\Entity\Office;
use App\Entity\Order;
use App\Entity\OrderItem;
use App\Entity\Product;
use App\Entity\User;
use App\Repository\Customer as CustomerRepository;
use App\Repository\Order as OrderRepository;
use App\Service\TempFileUploader;
use Doctrine\ORM\EntityManagerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\ResponseHeaderBag;
use Symfony\Component\HttpKernel\KernelInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Contracts\Translation\TranslatorInterface;
class OrderController extends AbstractController
{
#[
Route(
name: 'api_order_sums',
path: '/api/orders-sums',
methods: ['GET'],
defaults: [
'_api_resource_class' => Order::class,
'_api_collection_operation_name' => 'getSums',
]
)
]
public function sumsAction(?array $data): ?array
{
return $data;
}
#[
Route(
name: 'api_order_post',
path: '/api/orders',
methods: ['POST'],
defaults: [
'_api_resource_class' => Order::class,
'_api_collection_operation_name' => 'post',
]
)
]
public function postAction(Order $data, LoggerInterface $logger, TranslatorInterface $translator): Order
{
$logger->info($translator->trans('New order saved.', [], 'logger'), ['data' => $data]);
return $data;
}
#[
Route(
name: 'api_order_put',
path: '/api/orders/{id}',
requirements: ['id' => "\d+"],
methods: ['PUT'],
defaults: [
'_api_resource_class' => Order::class,
'_api_item_operation_name' => 'put',
]
)
]
public function putAction(Order $data, LoggerInterface $logger, TranslatorInterface $translator): Order
{
$logger->info($translator->trans('Order updated.', [], 'logger'), ['data' => $data]);
return $data;
}
#[
Route(
name: 'api_order_delete',
path: '/api/orders/{id}',
requirements: ['id' => "\d+"],
methods: ['DELETE'],
defaults: [
'_api_resource_class' => Order::class,
'_api_item_operation_name' => 'delete',
]
)
]
public function deleteAction(Order $data, LoggerInterface $logger, TranslatorInterface $translator): void
{
$logger->info($translator->trans('Order deleted', [], 'logger'), ['data' => $data]);
}
#[
Route(
name: 'order_import',
path: '/api-helper/orders/import',
methods: ['POST']
)
]
public function importAction(
Request $request,
TempFileUploader $uploader
): JsonResponse {
$file = $request->files->get('files');
$workFile = $uploader->getTargetDirectory().'/'.$uploader->upload($file);
file_put_contents($workFile, $this->convert(file_get_contents($workFile)));
$cols = [];
$rows = [];
if (false !== ($handle = fopen($workFile, 'r'))) {
$iter = 0;
while (false !== ($row = fgetcsv($handle, 1000, ';'))) {
if (0 === $iter) {
$cols = array_flip($row);
} else {
$rows[] = [
'invoiceId' => preg_replace("/\s/i", '', $row[$cols['SZLASORSZ']]),
'invoiceType' => $row[$cols['SZTNEV']],
'customerName' => $row[$cols['PARTNEV']],
'invoiceDate' => str_replace('.', '-', $row[$cols['SZLADATUM']]),
'fulfillmentDeadline' => str_replace('.', '-', $row[$cols['TELJDATUM']]),
'paymentDeadline' => str_replace('.', '-', $row[$cols['FIZHDATUM']]),
'paymentMethodName' => $row[$cols['FMNEV']],
'paymentMethodId' => intval($row[$cols['FMAZON']]),
'net' => floatval($row[$cols['SUMNETTO']]),
'tax' => floatval($row[$cols['SUMAFA']]),
'gross' => floatval($row[$cols['SUMBRUTTO']]),
'currency' => $row[$cols['DVZNEM']],
'invoiceBookId' => intval($row[$cols['SZTAZON']]),
'originalInvoiceId' => preg_replace("/\s/i", '', $row[$cols['ESZLASORSZ']]),
'notice' => $row[$cols['MEGJEGYZES']],
'cashInvoice' => 'IGAZ' === $row[$cols['KPSZAMLA']],
'partazon' => intval($row[$cols['PARTAZON']]),
];
}
++$iter;
}
file_put_contents($uploader->getTargetDirectory().'/order-rows-tmp.json', json_encode($rows));
}
$uploader->unlink();
return $this->json([
'success' => true,
'count' => count($rows),
'remaining' => count($rows),
]);
}
#[
Route(
name: 'order_import_iteration',
path: '/api-helper/orders/import-iteration',
methods: ['GET']
)
]
public function importIterationAction(
Request $request,
TempFileUploader $uploader,
EntityManagerInterface $em
): JsonResponse {
$ordersTmpFile = $uploader->getTargetDirectory().'/order-rows-tmp.json';
$rows = json_decode(file_get_contents($ordersTmpFile), true);
$batch = 60;
$iter = 0;
$orderRepo = $em->getRepository(Order::class);
$customerRepo = $em->getRepository(Customer::class);
$userRepo = $em->getRepository(User::class);
$selectedOfficeid = $request->get('office');
$defaultOffice = $em
->getRepository(Office::class)
->find($selectedOfficeid);
/** @var User $authUser */
if (!$defaultOffice && ($authUser = $this->getUser())) {
$defaultOffice = $authUser->getOffice();
}
while ($batch > 0 && !empty($rows)) {
++$iter;
--$batch;
$row = array_shift($rows);
$user = false;
$userMatches = [];
if (1 === preg_match('~^([0-9]+)([H|T|B|I])\s([\-0-9]+)~', $row['notice'], $userMatches)) {
$user = $userRepo->find($userMatches[1]);
}
$office = $defaultOffice;
if ($user) {
$office = $user->getOffice();
}
$finder = ['office' => $office->getId()];
$order = false;
if ($row['invoiceId']) {
// we can find exact order
$order = $orderRepo->findOneBy($finder + ['invoiceId' => $row['invoiceId']]);
if ($order) {
// order exists, skip
continue;
}
}
$order = new Order();
if ($user) {
$order->setUser($user);
}
if (!empty($userMatches)) {
$order->setSaleType($userMatches[2]);
}
/** @var Customer $customer */
$customer = false;
if ($row['partazon']) {
// we have partazon, maybe we can find exact customer
$customer = $customerRepo->findOneBy($finder + ['partazon' => $row['partazon']]);
}
if (!isset($customer) || !$customer) {
// try to find by name
$customer = $customerRepo->findOneBy($finder + ['name' => $row['customerName']]);
}
if ($customer) {
$order->setCustomer($customer);
if (isset($userMatches[3])) {
$customer->setLoyaltyPoints($customer->getLoyaltyPoints() + intval($userMatches[3]));
$em->persist($customer);
}
}
if (!empty($row['originalInvoiceId'])) {
$order->setOriginalInvoiceId($row['originalInvoiceId']); // ESZLASORSZ
$qb = $em->createQueryBuilder();
$query = $qb->select('o')
->from(Order::class, 'o')
->where(
$qb->expr()->andX(
$qb->expr()->eq('o.office', $office->getId()),
$qb->expr()->like('o.invoiceId', $qb->expr()->literal($row['originalInvoiceId']))
)
)
->getQuery();
$originalOrder = $query->getSingleResult();
if ($originalOrder) {
$order->setOriginalOrder($originalOrder);
}
}
$order
->setOffice($office)
->setInvoiceId($row['invoiceId']) // SZLASORSZ
->setInvoiceType($row['invoiceType']) // SZTNEV
->setCustomerName($row['customerName']) // PARTNEV
->setInvoiceDate(new \DateTime($row['invoiceDate'])) // SZLADATUM
->setFulfillmentDeadline(new \DateTime($row['fulfillmentDeadline'])) // TELJDATUM
->setPaymentDeadline(new \DateTime($row['paymentDeadline'])) // FIZHDATUM
->setPaymentMethodName($row['paymentMethodName']) // FMNEV
->setPaymentMethodId($row['paymentMethodId']) // FMAZON
->setNet($row['net']) // SUMNETTO
->setTax($row['tax']) // SUMAFA
->setGross($row['gross']) // SUMBRUTTO
->setCurrency($row['currency']) // DVZNEM
->setInvoiceBookId($row['invoiceBookId']) // SZTAZON
->setNotice($row['notice']) // MEGJEGYZES
->setCashInvoice($row['cashInvoice']) // KPSZAMLA
;
$em->persist($order);
$em->flush();
}
if (!empty($rows)) {
file_put_contents($ordersTmpFile, json_encode($rows));
} else {
unlink($ordersTmpFile);
}
return $this->json([
'success' => true,
'processed' => $iter,
'remaining' => count($rows),
]);
}
#[
Route(
name: 'order_import_all',
path: '/api-helper/orders/import-all',
methods: ['POST']
)
]
public function importAllAction(
Request $request,
TempFileUploader $uploader
): JsonResponse {
$files = $request->files->get('files');
$workFileNames = $uploader->upload($files);
$ordersFile = '';
$itemsFile = '';
foreach ($workFileNames as $fileName) {
$workFile = $uploader->getTargetDirectory().'/'.$fileName;
file_put_contents($workFile, $this->convert(file_get_contents($workFile)));
if (false !== ($handle = fopen($workFile, 'r'))) {
if (false !== ($row = fgetcsv($handle, 1000, ';'))) {
$cols = array_flip($row);
if (isset($cols['CIKKAZON'])) {
$itemsFile = $workFile;
} else {
$ordersFile = $workFile;
}
}
fclose($handle);
}
}
$cols = [];
$rows = [];
if (false !== ($handle = fopen($ordersFile, 'r'))) {
$iter = 0;
while (false !== ($row = fgetcsv($handle, 1000, ';'))) {
if (0 === $iter) {
$cols = array_flip($row);
} else {
$rows[preg_replace("/\s/i", '', $row[$cols['SZLASORSZ']])] = [
'invoiceId' => preg_replace("/\s/i", '', $row[$cols['SZLASORSZ']]),
'invoiceType' => $row[$cols['SZTNEV']],
'customerName' => $row[$cols['PARTNEV']],
'invoiceDate' => str_replace('.', '-', $row[$cols['SZLADATUM']]),
'fulfillmentDeadline' => str_replace('.', '-', $row[$cols['TELJDATUM']]),
'paymentDeadline' => str_replace('.', '-', $row[$cols['FIZHDATUM']]),
'paymentMethodName' => $row[$cols['FMNEV']],
'paymentMethodId' => intval($row[$cols['FMAZON']]),
'net' => floatval($row[$cols['SUMNETTO']]),
'tax' => floatval($row[$cols['SUMAFA']]),
'gross' => floatval($row[$cols['SUMBRUTTO']]),
'currency' => $row[$cols['DVZNEM']],
'invoiceBookId' => intval($row[$cols['SZTAZON']]),
'originalInvoiceId' => preg_replace("/\s/i", '', $row[$cols['ESZLASORSZ']]),
'notice' => $row[$cols['MEGJEGYZES']],
'cashInvoice' => 'IGAZ' === $row[$cols['KPSZAMLA']],
'partazon' => intval($row[$cols['PARTAZON']]),
];
}
++$iter;
}
fclose($handle);
}
if (!empty($rows) && false !== ($handle = fopen($itemsFile, 'r'))) {
$iter = 0;
while (false !== ($row = fgetcsv($handle, 1000, ';'))) {
if (0 === $iter) {
$cols = array_flip($row);
} else {
$invoiceId = preg_replace("/\s/i", '', $row[$cols['SZLASORSZ']]);
if (isset($rows[$invoiceId])) {
if (!isset($rows[$invoiceId]['items'])) {
$rows[$invoiceId]['items'] = [];
}
$rows[$invoiceId]['items'][] = [
'sku' => $row[$cols['SZTETCSZAM']],
'cikkazon' => $row[$cols['CIKKAZON']],
'name' => $row[$cols['SZTETNEV']],
'quantity' => intval($row[$cols['MENNY']]),
'unit' => $row[$cols['MEEGYSEG']],
'unitPrice' => $row[$cols['EGYSEGAR']],
'price' => intval($row[$cols['NEAR']]),
'grossPrice' => intval($row[$cols['BRAR']]),
'currency' => $row[$cols['DVZNEM']],
'taxRate' => intval($row[$cols['AFASZLK']]),
'orderItemId' => intval($row[$cols['SZTETAZON']]),
];
}
}
++$iter;
}
}
if (!empty($rows)) {
file_put_contents($uploader->getTargetDirectory().'/order-rows-tmp.json', json_encode($rows));
}
$uploader->unlink();
return $this->json([
'success' => true,
'count' => count($rows),
'remaining' => count($rows),
]);
}
#[
Route(
name: 'order_import_all_iteration',
path: '/api-helper/orders/import-all-iteration',
methods: ['GET']
)
]
public function importAllIterationAction(
Request $request,
TempFileUploader $uploader,
EntityManagerInterface $em
): JsonResponse {
$ordersTmpFile = $uploader->getTargetDirectory().'/order-rows-tmp.json';
$rows = json_decode(file_get_contents($ordersTmpFile), true);
$batch = count($rows) < 20 ? count($rows) : 20;
$iter = 0;
$orderRepo = $em->getRepository(Order::class);
/** @var CustomerRepository $customerRepo */
$customerRepo = $em->getRepository(Customer::class);
$userRepo = $em->getRepository(User::class);
$orderItemRepo = $em->getRepository(OrderItem::class);
$productRepo = $em->getRepository(Product::class);
$selectedOfficeid = $request->get('office');
$defaultOffice = $em
->getRepository(Office::class)
->find($selectedOfficeid);
/** @var User $authUser */
if (!$defaultOffice && ($authUser = $this->getUser())) {
$defaultOffice = $authUser->getOffice();
}
$missingCustomers = [];
while ($batch > 0 && !empty($rows)) {
++$iter;
--$batch;
$row = array_shift($rows);
$user = false;
$userMatches = [];
if (1 === preg_match('~([0-9]+)[\s]*([H|T|B|I])[\s]*([\-0-9]+)?~', $row['notice'], $userMatches)) {
$user = $userRepo->find(intval($userMatches[1]));
}
$office = $defaultOffice;
if ($user) {
$office = $user->getOffice() ?? $defaultOffice;
}
$finder = ['office' => $office->getId()];
$order = false;
if ($row['invoiceId']) {
// we can find exact order
$order = $orderRepo->findOneBy($finder + ['invoiceId' => $row['invoiceId']]);
if ($order) {
// order exists, skip
continue;
}
}
$order = new Order();
if ($user) {
$order->setUser($user);
}
if (!empty($userMatches)) {
$order->setSaleType($userMatches[2]);
}
$customer = false;
if ($row['partazon']) {
// we have partazon, maybe we can find exact customer
$customer = $customerRepo->findOneBy($finder + ['partazon' => $row['partazon']]);
}
if (!$customer && 1 !== $office->getId()) {
// if not in office #1, look for customer in all office
$customer = $customerRepo->findNotInFirstOffice($row['partazon']);
}
// if (!isset($customer) || !$customer) {
// // try to find by name
// $customer = $customerRepo->findOneBy($finder + ['name' => $row['customerName']]);
// }
// if (!$customer && $office->getId() > 2) {
// // try to small offices' customers in office with id 2
// $customer = $customerRepo->findOneBy(['office' => 2, 'partazon' => $row['partazon']]);
// if (!$customer) {
// // try to find by name
// $customer = $customerRepo->findOneBy(['office' => 2, 'name' => $row['customerName']]);
// }
// }
if (!$customer) {
// if there's no customer, who is ordered? :)
$missingCustomers[] = [
'invoiceId' => $row['invoiceId'],
'partazon' => $row['partazon'] ?? '',
'name' => $row['customerName'],
];
continue;
}
if (isset($userMatches[3])) {
$customer->setLoyaltyPoints($customer->getLoyaltyPoints() + intval($userMatches[3]));
$em->persist($customer);
}
if ($customer->getOffice()->getId() !== $office->getId()) {
$customer->setOffice($office);
$em->persist($customer);
}
if ($user && $customer) {
$customer->setUser($user);
$em->persist($customer);
}
if ($customer) {
$order->setCustomer($customer);
}
if (!empty($row['originalInvoiceId'])) {
$order->setOriginalInvoiceId($row['originalInvoiceId']); // ESZLASORSZ
$qb = $em->createQueryBuilder();
$query = $qb->select('o')
->from(Order::class, 'o')
->where(
$qb->expr()->andX(
$qb->expr()->eq('o.office', $office->getId()),
$qb->expr()->like('o.invoiceId', $qb->expr()->literal($row['originalInvoiceId']))
)
)
->getQuery();
$originalOrder = $query->getOneOrNullResult();
if ($originalOrder) {
$order->setOriginalOrder($originalOrder);
}
}
$order
->setOffice($office)
->setInvoiceId($row['invoiceId']) // SZLASORSZ
->setInvoiceType($row['invoiceType']) // SZTNEV
->setCustomerName($row['customerName']) // PARTNEV
->setInvoiceDate(new \DateTime($row['invoiceDate'])) // SZLADATUM
->setFulfillmentDeadline(new \DateTime($row['fulfillmentDeadline'])) // TELJDATUM
->setPaymentDeadline(new \DateTime($row['paymentDeadline'])) // FIZHDATUM
->setPaymentMethodName($row['paymentMethodName']) // FMNEV
->setPaymentMethodId($row['paymentMethodId']) // FMAZON
->setNet($row['net']) // SUMNETTO
->setTax($row['tax']) // SUMAFA
->setGross($row['gross']) // SUMBRUTTO
->setCurrency($row['currency']) // DVZNEM
->setInvoiceBookId($row['invoiceBookId']) // SZTAZON
->setNotice($row['notice']) // MEGJEGYZES
->setCashInvoice($row['cashInvoice']) // KPSZAMLA
;
$em->persist($order);
// ITEMS ITERATION
$loyaltyPoints = 0;
foreach ($row['items'] as $item) {
$orderItem = $orderItemRepo->findOneBy([
'orderItemId' => $item['orderItemId'],
'order' => $order,
]);
if ($orderItem) {
// item already processed
continue;
}
$orderItem = new OrderItem();
$orderItem
->setOrder($order)
->setSku($item['sku'])
->setCikkazon($item['cikkazon'])
->setName($item['name'])
->setQuantity($item['quantity'])
->setUnit($item['unit'])
->setUnitPrice($item['unitPrice'])
->setPrice($item['price'])
->setGrossPrice($item['grossPrice'])
->setCurrency($item['currency'])
->setTaxRate($item['taxRate'])
->setOrderItemId($item['orderItemId'])
;
$em->persist($orderItem);
// calculate loyalty points
$loyaltySkuExcludes = [
// '123-284', // catalogue
'002-1', // shipping
'001-8', // shipping
'123-20', // shipping
];
if (!in_array($orderItem->getSku(), $loyaltySkuExcludes)) {
$loyaltyPoints += 0.005 * $orderItem->getGrossPrice();
}
// have to substract quantity from product stock
$product = $productRepo->findOneBy(['sku' => $item['sku']]);
if ($product) {
$product->setStock($product->getStock() - $item['quantity']);
$em->persist($product);
}
}
if (0 != $loyaltyPoints) {
$sign = intval($loyaltyPoints / abs($loyaltyPoints));
} else {
$sign = 1;
}
$loyaltyPoints = $sign * intval(ceil(abs($loyaltyPoints))) + $customer->getLoyaltyPoints();
$customer->setLoyaltyPoints($loyaltyPoints < 0 ? 0 : $loyaltyPoints);
$em->persist($customer);
if (0 === $iter % 10) {
$em->flush();
}
}
$em->flush();
if (!empty($rows)) {
file_put_contents($ordersTmpFile, json_encode($rows));
} else {
unlink($ordersTmpFile);
}
return $this->json([
'success' => true,
'processed' => $iter,
'remaining' => count($rows),
'missingCustomers' => $missingCustomers,
]);
}
protected function convert(array|string $str, string $to = 'UTF-8', string|array|null $from = 'ISO-8859-2'): array|string|false
{
return mb_convert_encoding($str, $to, $from);
}
#[
Route(
name: 'order_get_income',
path: '/api-helper/orders/get-income',
methods: ['GET']
)
]
public function getIncome(
Request $request,
EntityManagerInterface $em,
AuthorizationCheckerInterface $authChecker
): JsonResponse {
/** @var OrderRepository $orderRepo */
$orderRepo = $em->getRepository(Order::class);
/** @var User $user */
$user = $this->getUser();
if (!$authChecker->isGranted('ROLE_CLERK')) {
$userId = $user->getId();
} else {
$userId = $request->get('user_id', '');
}
$iDateParam = $request->get('invoiceDate', []);
return $this->json($orderRepo->findIncome(
$request->get('office_id', $user->getOffice()->getId()),
isset($iDateParam['after']) ? $iDateParam['after'] : '',
isset($iDateParam['before']) ? $iDateParam['before'] : '',
$userId,
$request->get('customer_id', ''),
$request->get('saleType', '')
));
}
#[
Route(
name: 'order_get_income_by_users',
path: '/api-helper/orders/get-income-by-users',
methods: ['GET']
)
]
public function getIncomeByUsers(
Request $request,
EntityManagerInterface $em,
AuthorizationCheckerInterface $authChecker
): JsonResponse {
/** @var OrderRepository $orderRepo */
$orderRepo = $em->getRepository(Order::class);
/** @var User $user */
$user = $this->getUser();
if (!$authChecker->isGranted('ROLE_CLERK')) {
$userId = $user->getId();
} else {
$userId = $request->get('user_id', '');
}
$iDateParam = $request->get('invoiceDate', []);
return $this->json($orderRepo->findIncomeByUsers(
$request->get('office_id', $user->getOffice()->getId()),
isset($iDateParam['after']) ? $iDateParam['after'] : '',
isset($iDateParam['before']) ? $iDateParam['before'] : '',
$userId,
$request->get('customer_id', ''),
$request->get('saleType', '')
));
}
#[
Route(
name: 'order_get_income_by_customers',
path: '/api-helper/orders/get-income-by-customers',
methods: ['GET']
)
]
public function getIncomeByCustomers(
Request $request,
EntityManagerInterface $em,
AuthorizationCheckerInterface $authChecker,
SerializerInterface $serializer
): JsonResponse {
/** @var OrderRepository $orderRepo */
$orderRepo = $em->getRepository(Order::class);
/** @var User $user */
$user = $this->getUser();
if (!$authChecker->isGranted('ROLE_CLERK')) {
$userId = $user->getId();
} else {
$userId = $request->get('user_id', '');
}
$iDateParam = $request->get('invoiceDate', []);
$page = $request->get('page', 1);
$itemsPerPage = $request->get('itemsPerPage', 40);
$ordering = $request->get('order', []);
$data = $serializer->serialize($orderRepo->findIncomeByCustomers(
$request->get('office_id', $user->getOffice()->getId()),
isset($iDateParam['after']) ? $iDateParam['after'] : '',
isset($iDateParam['before']) ? $iDateParam['before'] : '',
$userId,
$request->get('customer_id', ''),
$request->get('saleType', ''),
$page,
$itemsPerPage,
$ordering
), 'json', ['groups' => ['order:getIncomeByCustomers']]);
return new JsonResponse($data, 200, [], true);
}
#[
Route(
name: 'order_income_by_customers_export_iterate',
path: '/api/orders/income-by-customers-export-iterate',
methods: ['GET']
)
]
public function incomeByCustomersExportIterateAction(
Request $request,
KernelInterface $kernel,
EntityManagerInterface $em,
AuthorizationCheckerInterface $authChecker
): JsonResponse {
ini_set('max_execution_time', 300); // 5 minutes
$tmpFileDir = $kernel->getProjectDir().'/var/tmp-files/';
if (!is_dir($tmpFileDir)) {
mkdir($tmpFileDir, 0777, true);
}
/** @var User $user */
$user = $this->getUser();
if (!$authChecker->isGranted('ROLE_CLERK')) {
$userId = $user->getId();
} else {
$userId = $request->get('user_id', '');
}
$iDateParam = $request->get('invoiceDate', []);
$ordering = $request->get('order', []);
$page = $request->get('page', 1);
$itemsPerPage = intval($request->get('itemsPerPage', 500));
$officeId = $request->get('office_id', $user->getOffice()->getId());
$fileName = $request->get('fileName', md5(uniqid().json_encode([
$officeId,
isset($iDateParam['after']) ? $iDateParam['after'] : '',
isset($iDateParam['before']) ? $iDateParam['before'] : '',
$userId,
$request->get('customer_id', ''),
$request->get('saleType', ''),
$page,
$itemsPerPage,
$ordering,
])));
$tmpFile = "{$tmpFileDir}/{$fileName}.csv";
if (!file_exists($tmpFile)) {
file_put_contents(
$tmpFile,
$this->buildRow(['id', 'partazon', 'name', 'phone', 'isActive', 'zip', 'city', 'address', 'sellerId', 'sellerName', 'ordersCount', 'cartNetValue', 'giftNetValue', 'totalNetValue', 'cartGrossValue', 'giftGrossValue', 'totalGrossValue'])
);
}
/** @var OrderRepository $orderRepo */
$orderRepo = $em->getRepository(Order::class);
$data = $orderRepo->findIncomeByCustomers(
$officeId,
isset($iDateParam['after']) ? $iDateParam['after'] : '',
isset($iDateParam['before']) ? $iDateParam['before'] : '',
$userId,
$request->get('customer_id', ''),
$request->get('saleType', ''),
$page,
$itemsPerPage,
$ordering
);
/** @var Customer $item */
foreach ($data['items'] as $item) {
file_put_contents(
$tmpFile,
$this->buildRow([
$item['id'],
$item['customer']->getPartazon(),
$item['customer']->getName(),
$item['customer']->getPhone(),
$item['customer']->getIsActive() ? '1' : '0',
$item['customer']->getZip(),
$item['customer']->getCity(),
$item['customer']->getAddress(),
$item['customer']->getUser() ? $item['customer']->getUser()->getId() : '',
$item['customer']->getUser() ? $item['customer']->getUser()->getName() : '',
$item['ordersCount'],
$item['sumNet'] + ($item['giftNet'] ?? 0),
($item['giftNet'] ?? 0),
$item['sumNet'],
$item['sumGross'] + ($item['giftGross'] ?? 0),
($item['giftGross'] ?? 0),
$item['sumGross'],
]),
FILE_APPEND
);
}
return $this->json([
'page' => ($page + 1),
'itemsPerPage' => $itemsPerPage,
'fileName' => $fileName,
'remaining' => max($data['totalItems'] - $page * $itemsPerPage /*- count($data['items'])*/, 0),
]);
}
#[
Route(
name: 'order_income_by_customers_export',
path: '/api/orders/income-by-customers-export',
methods: ['GET']
)
]
public function incomeByCustomersExportAction(
Request $request,
KernelInterface $kernel
): BinaryFileResponse {
$tmpFileDir = $kernel->getProjectDir().'/var/tmp-files/';
$fileName = $request->get('fileName');
$tmpFile = "{$tmpFileDir}/{$fileName}.csv";
$response = new BinaryFileResponse($tmpFile);
$response->headers->set('Content-Type', 'text/csv');
$response->setContentDisposition(ResponseHeaderBag::DISPOSITION_ATTACHMENT, 'orders-income-by-customers.csv')
->deleteFileAfterSend();
return $response;
}
protected function buildRow(array $row, string $delimiter = ',', string $enclosure = '"'): string|false
{
// output up to 5MB is kept in memory, if it becomes bigger
// it will automatically be written to a temporary file
$csv = fopen('php://temp/maxmemory:'.(5 * 1024 * 1024), 'r+');
fputcsv($csv, $row, $delimiter, $enclosure);
rewind($csv);
return stream_get_contents($csv);
}
}