src/WebBundle/Serializer/Normalizer/OrderNormalizer.php line 64

Open in your IDE?
  1. <?php
  2. namespace WebBundle\Serializer\Normalizer;
  3. use DateTime;
  4. use Doctrine\Common\Collections\Collection;
  5. use Doctrine\ORM\NonUniqueResultException;
  6. use Doctrine\ORM\ORMException;
  7. use Exception;
  8. use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
  9. use Symfony\Component\Serializer\SerializerAwareTrait;
  10. use WebBundle\Constant\CookieKeysConstant;
  11. use WebBundle\Entity\BuyOrder;
  12. use WebBundle\Entity\BuyOrderArticle;
  13. use WebBundle\Entity\OrderHistory;
  14. use WebBundle\Entity\OrderPayment;
  15. use WebBundle\Enum\BuyOrderStatusEnum;
  16. use WebBundle\Helper\App;
  17. use WebBundle\Helper\ConversionHelper;
  18. use WebBundle\Helper\CookieHelper;
  19. use WebBundle\Helper\DateHelper;
  20. use WebBundle\Helper\LocaleHelper;
  21. use WebBundle\Helper\OrderHelper;
  22. use WebBundle\Helper\RequestHelper;
  23. use WebBundle\Helper\StrHelper;
  24. use WebBundle\Helper\TwigTe;
  25. use WebBundle\Helper\UserHelper;
  26. use WebBundle\Service\LocationService;
  27. use WebBundle\Service\OrderPaymentService;
  28. /**
  29.  * Class BuyOrderNormalizer
  30.  * @package WebBundle\Serializer\Normalizer
  31.  */
  32. class OrderNormalizer implements NormalizerInterface
  33. {
  34.     use SerializerAwareTrait;
  35.     /** @required */
  36.     public LocationService $locationService;
  37.     /** @required */
  38.     public OrderPaymentService $orderPaymentService;
  39.     /** @required */
  40.     public DateTimeNormalizer $dateTimeNormalizer;
  41.     /** @required */
  42.     public WarehouseNormalizer $warehouseNormalizer;
  43.     /** @required */
  44.     public OrderAddressNormalizer $orderAddressNormalizer;
  45.     /** @required */
  46.     public OrderItemNormalizer $orderItemNormalizer;
  47.     /** @required */
  48.     public OrderHistoryNormalizer $orderHistoryNormalizer;
  49.     /** @required */
  50.     public OrderPaymentNormalizer $orderPaymentNormalizer;
  51.     /**
  52.      * @param BuyOrder $order
  53.      * @param string|null $format
  54.      * @param array $context
  55.      * @return array|bool|float|int|string
  56.      * @throws NonUniqueResultException
  57.      * @throws ORMException
  58.      */
  59.     public function normalize($order, ?string $format null, array $context = [])
  60.     {
  61.         $subtotal = [
  62.             'items' => 0,
  63.             'boxes' => 0,
  64.             'weight' => 0,
  65.             'pallets' => 0,
  66.             'sum' => 0,
  67.         ];
  68.         $ip App::getIp();
  69.         $record $this->locationService->getCityRecord($ip);
  70.         $ipCountry StrHelper::toLower($record->country->isoCode);
  71.         foreach ($order->getArticles() as $item) {
  72.             if ($item->getArticle()->getDelivery()->getId() == 6) {
  73.                 continue;
  74.             }
  75.             $subtotal['items']++;
  76.             $subtotal['boxes'] += ceil($item->getAmount() / $item->getPackagingCount());
  77.             $subtotal['weight'] += $item->getAmount() / $item->getPackagingCount() * $item->getWeight();
  78.             $subtotal['pallets'] += ($item->getPallet() ? ceil($item->getAmount() / $item->getPallet()) : 1);
  79.             $subtotal['sum'] += $item->getAmount() * $item->getPrice();
  80.         }
  81.         $subtotal['weight'] = round($subtotal['weight']);
  82.         $subtotal['sum'] = round($subtotal['sum'], 2);
  83.         $weight round($order->getWeightGross()
  84.             ?: ($order->getMeasure() == 'm'
  85.                 OrderHelper::totalWeight($order)
  86.                 : ConversionHelper::convertKgLb((float) OrderHelper::totalWeight($order))
  87.             ), 2);
  88.         $dueSum $this->orderPaymentService->getAmount($order);
  89.         $itemsByCollection $this->mapItem($order->getArticles(), $format$context);
  90.         uasort(
  91.             $itemsByCollection,
  92.             function ($a$b) {
  93.                 return $a['id'] < $b['id'] ? : -1;
  94.             }
  95.         );
  96.         $context['order'] = $order;
  97.         $baseData = [
  98.             'step' => $order->getStep(),
  99.             'hash' => $order->getHash(),
  100.             'number' => $order->getNumber(),
  101.             'title' => OrderHelper::header($order),
  102.             'header' => TwigTe::headerBO($order),
  103.             'status' => [
  104.                 'id'   => $order->getStatus(),
  105.                 'name' => App::trans(BuyOrderStatusEnum::from($order->getStatus())->getAlias()),
  106.                 'type' => App::trans($order->getStatus() < BuyOrderStatusEnum::PARTIALLY_PAID 'order.status.draft' 'buyOrder.title'),
  107.             ],
  108.             'createDate' => empty($context['history'])
  109.                 ? StrHelper::ucFirst(DateHelper::localizedDate($order->getCreateDate(), 'long''none'))
  110.                 : $order->getCreateDate()->getTimestamp(),
  111.             'createDateForHistory' => $order->getCreateDate()->getTimestamp(),
  112.             'updateDate' => empty($context['history'])
  113.                 ? StrHelper::ucFirst(DateHelper::localizedDate($order->getUpdateDate(), 'long''none'))
  114.                 : $order->getUpdateDate()->getTimestamp(),
  115.             'updateDateForHistory' => $order->getUpdateDate()->getTimestamp(),
  116.             'country' => $order->getAddressRecipient() && $order->getAddressRecipient()->getCountry()
  117.                 ? StrHelper::toLower($order->getAddressRecipient()->getCountry()->getCode())
  118.                 : CookieHelper::get(CookieKeysConstant::COUNTRY),
  119.             'discount' => $order->getDiscount(),
  120.             'delivery' => [
  121.                 'type' => $order->getDeliveryType() == 0,
  122.                 'price' => $order->getDelivery()
  123.                     ?: (
  124.                     $order->getStatus() == BuyOrderStatusEnum::AWAITING_CALCULATION
  125.                         App::trans('order.status.awaiting_calculation')
  126.                         : App::trans('buyOrder.info.request_calculation')
  127.                     ),
  128.                 'lift' => $order->getLift(),
  129.                 'timeType' => $order->getDeliveryTimeType(),
  130.                 'timePeriod' => DateHelper::getTimePeriod(
  131.                     $order->getDeliveryTimeMin(),
  132.                     $order->getDeliveryTimeMax(),
  133.                     $order->getStatus()
  134.                 ),
  135.                 'timeFastPayPeriod' => $order->getDeliveryTimeFastPayMin() ? DateHelper::getTimePeriod(
  136.                     $order->getDeliveryTimeFastPayMin(),
  137.                     $order->getDeliveryTimeFastPayMax(),
  138.                     $order->getStatus()
  139.                 ) : null,
  140.                 'timeConfirmPeriod' => $order->getDeliveryTimeConfirmMin()
  141.                     ? DateHelper::getTimePeriod(
  142.                         $order->getDeliveryTimeConfirmMin(),
  143.                         $order->getDeliveryTimeConfirmMax(),
  144.                         $order->getStatus()
  145.                     )
  146.                     : null,
  147.                 'timePeriodStatusMarker' => $order->getDeliveryTimeConfirmMin()
  148.                     ? DateHelper::getTimePeriodStatusMarker(
  149.                         $order->getDeliveryTimeConfirmMin(),
  150.                         $order->getStatus()
  151.                     )
  152.                     : DateHelper::getTimePeriodStatusMarker(
  153.                         $order->getDeliveryTimeMin(),
  154.                         $order->getStatus()
  155.                     ),
  156.                 'daysFast' => $order->getDeliveryTimeFastPayMin() && $order->getDeliveryTimeMin()
  157.                     ? ceil(
  158.                         ($order->getDeliveryTimeMin()->getTimestamp() - $order->getDeliveryTimeFastPayMin()->getTimestamp()) / 86400
  159.                     )
  160.                     : null,
  161.                 'freeSampleDelivery' => App::trans(
  162.                     'order.free_delivery_sample',
  163.                     App::getCurLocale(),
  164.                     [
  165.                         '%sum%'      => $order->getDeliveryCountry()->getFreeSampleDelivery(),
  166.                         '%currency%' => $order->getCurrency(),
  167.                     ]
  168.                 ),
  169.                 'onlySamplesAndNotEmptyBasketOfOrder' => OrderHelper::onlySamplesAndNotEmptyBasketOfOrder($order),
  170.                 'calculationType' => $order->getDeliveryCalculateType(),
  171.             ],
  172.             'payment' => [
  173.                 'type' => $order->getPayType(),
  174.                 'feePercents' => [
  175.                     // в таком порядке отображаем на странице заказа
  176.                     '1' => OrderHelper::paymentPercent($order1),
  177.                     '2' => OrderHelper::paymentPercent($order2),
  178.                     '3' => OrderHelper::paymentPercent($order3),
  179.                     '4' => OrderHelper::paymentPercent($order4),
  180.                     '5' => OrderHelper::paymentPercent($order5),
  181.                     '6' => OrderHelper::paymentPercent($order6),
  182.                 ],
  183.                 'feeAmount' => [
  184.                     '1' => OrderHelper::percent($dueSumOrderHelper::paymentPercent($order1), false),
  185.                     '2' => OrderHelper::percent($dueSumOrderHelper::paymentPercent($order2), false),
  186.                     '3' => OrderHelper::percent($dueSumOrderHelper::paymentPercent($order3), false),
  187.                     '4' => OrderHelper::percent($dueSumOrderHelper::paymentPercent($order4), false),
  188.                     '5' => OrderHelper::percent($dueSumOrderHelper::paymentPercent($order5), false),
  189.                     '6' => OrderHelper::percent($dueSumOrderHelper::paymentPercent($order6), false),
  190.                 ],
  191.                 'showRuCC' => App::getContainer()->hasParameter('card_ru_url'),
  192.                 'dueSum' => round($dueSum2),
  193.                 'total'       => OrderHelper::totalSum($order),
  194.             ],
  195.             'payments' => $this->mapPayment($order->getPayments(), $format$context),
  196.             'payDateExecution' => $this->dateTimeNormalizer
  197.                 ->normalize($order->getPayDateExecution(), $format$context),
  198.             'payDateExecutionISO' => $order->getPayDateExecution() && $order->getPayDateExecution()->getTimestamp(
  199.             ) > (new DateTime())->getTimestamp()
  200.                 ? $order->getPayDateExecution()->getTimestamp()
  201.                 : null,
  202.             'offset' => OrderHelper::offsetReason($order),
  203.             'holiday' => OrderHelper::isHoliday($order) ? App::trans('buyOrder.longTime') : null,
  204.             'proposedDate' => $order->getProposedDate() ? $order->getProposedDate()->format('Y-m-d') : null,
  205.             'shipDate' => $order->getShipDate(),
  206.             'factDate' => $order->getFactDate()
  207.                 ? $order->getFactDate()->format(
  208.                     LocaleHelper::dateMask(1App::getCountryCode())
  209.                 )
  210.                 : '',
  211.             'cancelDate' => $order->getCancelDate()
  212.                 ? $order->getCancelDate()->format(
  213.                     LocaleHelper::dateMask(1App::getCountryCode())
  214.                 )
  215.                 : '',
  216.             'trackingNumber' => $order->getTrackingNumber(),
  217.             'carrier' => [
  218.                 'name' => $order->getCarrierName(),
  219.                 'phone' => $order->getCarrierContactData(),// @deprecated
  220.                 'contactDate' => $order->getCarrierContactData(),
  221.             ],
  222.             'customsPayment' => $order->getCustomsPayment(),
  223.             'weight' => [
  224.                 'measure' => App::trans('measure_' . ($order->getMeasure() == 'm' 'kgs' 'lb')),
  225.                 'measures' => App::trans('measure_' . ($order->getMeasure() == 'm' 'kgs' 'lbs')),
  226.                 'limit' => ($order->getWeightLimit() ?? 0)
  227.                     ? App::trans('order.status.more_weight'null, ['%d%' => $order->getWeightLimit()])
  228.                     : null,
  229.                 'report' => $order->getWeightReport() ? App::trans(
  230.                     'buyOrder.info.weightReport',
  231.                     App::getCurLocale(),
  232.                     [
  233.                         '%d%' => App::trans(LocaleHelper::weightLabel($order->getWeightReport())),
  234.                     ]
  235.                 ) : null,
  236.                 'smallWeight' => $weight <= 300 && !OrderHelper::onlySamples($order)
  237.                     ? [
  238.                         'text' => App::trans('order.low_weight'),
  239.                         'help' => App::trans('order.low_weight_help'App::getCurLocale(), [
  240.                             '%weight%' => LocaleHelper::weightLabel(300.0true$order->getMeasure()),
  241.                         ]),
  242.                     ]
  243.                     : null,
  244.                 'total'  => $weight,
  245.             ],
  246.             'manager' => [
  247.                 'name' => $order->getManagerName(),
  248.                 'email' => $order->getManagerEmail(),
  249.                 'phone' => $order->getManagerPhone(),
  250.             ],
  251.             'locale' => $order->getLocale(),
  252.             'curRate' => $order->getCurRate(),
  253.             'currency' => [
  254.                 'sign' => LocaleHelper::getCurrency($order->getCurrency()),
  255.                 'code' => $order->getCurrency(),
  256.             ],
  257.             'measure' => $order->getMeasure(),
  258.             'emailSend' => $order->getEmailSend(),
  259.             'remember' => $order->getRemember(),
  260.             'markerTest' => (
  261.                 $order->getMarkerTest() == true
  262.                 || UserHelper::isEmployee($order->getEmail())
  263.             ),
  264.             'name' => OrderHelper::humanName($order->getName(), $order->getStatus(), $order->getBankTransferRequested()),
  265.             'description' => $order->getDescription(),
  266.             'subtotal' => $subtotal,
  267.             'totalSum' => OrderHelper::totalSum($order), // общая сумма заказа
  268.             'warehouse' => $this->warehouseNormalizer->normalize($order->getWarehouse(), $format$context),
  269.             'recipient' => $this->orderAddressNormalizer->normalize($order->getAddressRecipient(), $format$context),
  270.             'payer' => $this->orderAddressNormalizer->normalize($order->getAddressPayer(), $format$context),
  271.             'addressEqual' => !!$order->getAddressEqual(),
  272.             'items' => array_values($itemsByCollection),
  273.             'personalDataAgree' => !!$order->getPersonalDataAgree(),
  274.             'updating' => false,
  275.             'updatingDetails' => [
  276.                 'items' => [],
  277.             ],
  278.             'vatIncludes' => $vatIncludes OrderHelper::vatIncludes($order),
  279.             'vatPercent' => $vatIncludes $order->getVatPercent() : 0,
  280.             'pdf' => App::getRequest()->get('share') == 'pdf',
  281.             'EORIRequired' => OrderHelper::EORIRequired($order),
  282.             'captcha' => ($ipCountry != 'cn' && empty($_SESSION['captcha-order'])),
  283.             'authRedirect' => (App::getCurUser() == null
  284.                 App::generateUrl(
  285.                     'app_login',
  286.                     [
  287.                         'redirect_url' => App::generateUrl(
  288.                             'app_buy_order',
  289.                             [
  290.                                 'orderId' => $order->getHash(),
  291.                             ],
  292.                             0
  293.                         ),
  294.                     ]
  295.                 )
  296.                 : null),
  297.         ];
  298.         $baseData['history'] = $this->mapHistory($order->getHistories(), $format$context);
  299.         if (empty($context['master'])) {
  300.             return $baseData;
  301.         }
  302.         $additionData = [
  303.             'email' => $order->getEmail()
  304.         ];
  305.         $payment $order->getCustomsPayment() ?? 0.00;
  306.         $currency $order->getCurrency();
  307.         $customsPayment App::getCurLocale() === 'en'
  308.             "$currency $payment"
  309.             "$payment $currency";
  310.         $additionData['customsPaymentMessage'] = App::trans(
  311.             'customs_payments.notInclud',
  312.             App::getCurLocale(),
  313.             [
  314.                 'USD100' => $customsPayment,
  315.             ]
  316.         );
  317.         return array_merge($baseData$additionData);
  318.     }
  319.     /**
  320.      * @param BuyOrder $data
  321.      * @param null $format
  322.      * @return bool
  323.      */
  324.     public function supportsNormalization($data$format null)
  325.     {
  326.         return $data instanceof BuyOrder;
  327.     }
  328.     /**
  329.      * @param Collection<BuyOrderArticle> $buyOrderArticlesCollection
  330.      * @param string|null $format
  331.      * @param array $context
  332.      * @return array
  333.      * @throws Exception
  334.      */
  335.     public function mapItem(Collection $buyOrderArticlesCollection, ?string $format null, array $context = []): array
  336.     {
  337.         $orders = [];
  338.         foreach ($buyOrderArticlesCollection->toArray() as $order) {
  339.             $orders[] = $this->orderItemNormalizer->normalize($order$format$context);
  340.         }
  341.         return $orders;
  342.     }
  343.     /**
  344.      * @param OrderHistory[] $arr
  345.      * @param string $format
  346.      * @param array $context
  347.      * @return array
  348.      * @throws Exception
  349.      */
  350.     public function mapHistory($arr$format$context): array
  351.     {
  352.         $orders = [];
  353.         foreach ($arr as $row) {
  354.             $orders[] = $this->orderHistoryNormalizer->normalize($row$format$context);
  355.         }
  356.         return $orders;
  357.     }
  358.     /**
  359.      * @param OrderPayment[] $arr
  360.      * @param string $format
  361.      * @param array $context
  362.      * @return array
  363.      * @throws Exception
  364.      */
  365.     public function mapPayment($arr$format$context): array
  366.     {
  367.         $orders = [];
  368.         foreach ($arr as $row) {
  369.             // Добавляем только успешные и подвешанные оплаты
  370.             if (in_array($row->getStatus(), [134])) {
  371.                 $orders[] = $this->orderPaymentNormalizer->normalize($row$format$context);
  372.             }
  373.         }
  374.         return $orders;
  375.     }
  376. }