src/WebBundle/Repository/ArticleRepository.php line 2476

Open in your IDE?
  1. <?php
  2. namespace WebBundle\Repository;
  3. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  4. use Doctrine\DBAL\DBALException;
  5. use Doctrine\ORM\NonUniqueResultException;
  6. use Doctrine\ORM\NoResultException;
  7. use Doctrine\ORM\Query\Expr;
  8. use Doctrine\ORM\Query\ResultSetMapping;
  9. use Doctrine\ORM\QueryBuilder;
  10. use Doctrine\Persistence\ManagerRegistry;
  11. use Exception;
  12. use FlexApp\Constant\TimeConstant;
  13. use Import1CBundle\Helper\v3\BiConst;
  14. use Import1CBundle\Helper\v3\TranslitNameHelper;
  15. use WebBundle\Constant\CookieKeysConstant;
  16. use WebBundle\Entity\Article;
  17. use WebBundle\Entity\Collection;
  18. use WebBundle\Entity\Interior;
  19. use WebBundle\Entity\SampleEntity;
  20. use WebBundle\Helper\App;
  21. use WebBundle\Helper\ArticleSettingsHelper;
  22. use WebBundle\Helper\ChineseFixHelper;
  23. use WebBundle\Helper\ConversionHelper;
  24. use WebBundle\Helper\CookieHelper;
  25. use WebBundle\Helper\CurrencyRateHelper;
  26. use WebBundle\Helper\HideFactoryCountriesHelper;
  27. use WebBundle\Helper\LocaleHelper;
  28. use WebBundle\Helper\StrHelper;
  29. use WebBundle\Traits\RepoTrait;
  30. /**
  31.  * @method Article|null find($id, $lockMode = null, $lockVersion = null)
  32.  * @method Article|null findOneBy(array $criteria, ?array $orderBy = null)
  33.  */
  34. class ArticleRepository extends ServiceEntityRepository
  35. {
  36.     use RepoTrait;
  37.     private const ARTICLE_QUERY_FILTER_MAPPING = [
  38.         'categoryPrice' => ['alias' => 'a''field' => 'priceUSD'],
  39.         'color' => ['join' => ['path' => 'a.colors'], 'alias' => 'color''field' => 'id'],
  40.         'effect' => ['join' => ['path' => 'a.textures'], 'alias' => 'texture''field' => 'id'],
  41.         'edgeType' => ['alias' => 'a''field' => 'edgeType'],
  42.         'material' => ['alias' => 'a''field' => 'material'],
  43.         'motiv' => ['join' => ['path' => 'a.motivs'], 'alias' => 'motiv''field' => 'id'],
  44.         'length' => ['alias' => 'a''field' => 'sizeGbX'],
  45.         'sample' => ['join' => ['path' => SampleEntity::class], 'alias' => 'sample''field' => 'id'],
  46.         'shape' => ['alias' => 'a''field' => 'shape'],
  47.         'style' => ['alias' => 'a''field' => 'style'],
  48.         'surface' => ['alias' => 'a''field' => 'surface'],
  49.         'thickness' => ['alias' => 'a''field' => 'thick'],
  50.         'type' => ['alias' => 'a''field' => 'type'],
  51.         'using' => ['alias' => 'a''field' => 'using'],
  52.         'width' => ['alias' => 'a''field' => 'sizeGbY'],
  53.     ];
  54.     public function __construct(ManagerRegistry $registry)
  55.     {
  56.         parent::__construct($registryArticle::class);
  57.     }
  58.     /**
  59.      * @return mixed|null
  60.      */
  61.     public function getArticleSale()
  62.     {
  63.         $q $this->createQueryBuilder('a');
  64.         $q->select('a,c,f')
  65.             ->leftJoin('a.collection''c')
  66.             ->leftJoin('c.factory''f')
  67.             ->leftJoin('a.PRStatus ''PRStatus')
  68.             ->andWhere('PRStatus.id IN (6,7) AND c.status IN (:status)')
  69.             ->setParameter('status'BiConst::STATE_NOT_PUBLISHED);
  70.         $r $q->getQuery()
  71.             ->useQueryCache(true);
  72.         return $r->getResult();
  73.     }
  74.     /**
  75.      * @param $id
  76.      * @return int|mixed|string|null
  77.      */
  78.     public function getItemUrlById($id)
  79.     {
  80.         $q $this->createQueryBuilder('a')
  81.             ->select('a.url')
  82.             ->andWhere('a.id = :id')
  83.             ->setParameter('id'$id)
  84.             ->setMaxResults(1);
  85.         $r $q->getQuery()->enableResultCache(3600);
  86.         try {
  87.             return $r->getSingleResult();
  88.         } catch (NoResultException NonUniqueResultException $e) {
  89.             return null;
  90.         }
  91.     }
  92.     /**
  93.      * НЕ ИЗМЕНЯТЬ специальный запрос для API
  94.      *
  95.      * @param ?int $collectionId
  96.      * @param ?bool $lc
  97.      * @return ?array
  98.      */
  99.     public function getArticleArrayAPI(?int $collectionId null, ?bool $lc false): ?array
  100.     {
  101.         $rsm = new ResultSetMapping();
  102.         $rsm->addEntityResult('WebBundle\Entity\Article''a');
  103.         $rsm->addFieldResult('a''id''id');
  104.         $rsm->addFieldResult('a''code''code');
  105.         $rsm->addFieldResult('a''name''name');
  106.         $rsm->addFieldResult('a''alternate_name''alternateName');
  107.         $rsm->addFieldResult('a''size_x''sizeX');
  108.         $rsm->addFieldResult('a''size_y''sizeY');
  109.         $rsm->addFieldResult('a''price_euro''priceEuro');
  110.         $rsm->addFieldResult('a''price_mq_euro''priceMqEuro');
  111.         $rsm->addFieldResult('a''price_euro_de''priceEuroDe');
  112.         $rsm->addFieldResult('a''price_euro_at''priceEuroAt');
  113.         $rsm->addFieldResult('a''price_euro_fi''priceEuroFi');
  114.         $rsm->addFieldResult('a''price_euro_fr''priceEuroFr');
  115.         $rsm->addFieldResult('a''price_euro_it''priceEuroIt');
  116.         $rsm->addFieldResult('a''price_euro_be''priceEuroBe');
  117.         $rsm->addFieldResult('a''price_euro_ie''priceEuroIe');
  118.         $rsm->addFieldResult('a''price_euro_nl''priceEuroNl');
  119.         $rsm->addFieldResult('a''price_euro_es''priceEuroEs');
  120.         $rsm->addFieldResult('a''price_mq_euro_de''priceMqEuroDe');
  121.         $rsm->addFieldResult('a''price_mq_euro_at''priceMqEuroAt');
  122.         $rsm->addFieldResult('a''price_mq_euro_fr''priceMqEuroFr');
  123.         $rsm->addFieldResult('a''price_mq_euro_it''priceMqEuroIt');
  124.         $rsm->addFieldResult('a''price_mq_euro_be''priceMqEuroBe');
  125.         $rsm->addFieldResult('a''price_mq_euro_ie''priceMqEuroIe');
  126.         $rsm->addFieldResult('a''price_mq_euro_nl''priceMqEuroNl');
  127.         $rsm->addFieldResult('a''price_mq_euro_es''priceMqEuroEs');
  128.         $rsm->addFieldResult('a''price_rub''priceRUB');
  129.         $rsm->addFieldResult('a''price_rue''priceRUE');
  130.         $rsm->addFieldResult('a''price_mq_rub''priceMqRUB');
  131.         $rsm->addFieldResult('a''price_mq_rue''priceMqRUE');
  132.         $rsm->addFieldResult('a''price_gbp''priceGBP');
  133.         $rsm->addFieldResult('a''price_gbe''priceGBE');
  134.         $rsm->addFieldResult('a''price_mq_gbp''priceMqGBP');
  135.         $rsm->addFieldResult('a''price_mq_gbe''priceMqGBE');
  136.         $rsm->addFieldResult('a''price_usd''priceUSD');
  137.         $rsm->addFieldResult('a''price_use''priceUSE');
  138.         $rsm->addFieldResult('a''price_fq_usd''priceFqUSD');
  139.         $rsm->addFieldResult('a''price_fq_use''priceFqUSE');
  140.         $rsm->addFieldResult('a''price_mq_use''priceMqUSE');
  141.         $rsm->addFieldResult('a''price_cad''priceCAD');
  142.         $rsm->addFieldResult('a''price_cae''priceCAE');
  143.         $rsm->addFieldResult('a''price_fq_cad''priceFqCAD');
  144.         $rsm->addFieldResult('a''price_fq_cae''priceFqCAE');
  145.         $rsm->addFieldResult('a''price_mq_cae''priceMqCAE');
  146.         $rsm->addFieldResult('a''price_chf''priceCHF');
  147.         $rsm->addFieldResult('a''price_che''priceCHE');
  148.         $rsm->addFieldResult('a''price_mq_chf''priceMqCHF');
  149.         $rsm->addFieldResult('a''price_mq_che''priceMqCHE');
  150.         $rsm->addFieldResult('a''price_sek''priceSEK');
  151.         $rsm->addFieldResult('a''price_see''priceSEE');
  152.         $rsm->addFieldResult('a''price_mq_sek''priceMqSEK');
  153.         $rsm->addFieldResult('a''price_mq_see''priceMqSEE');
  154.         $rsm->addFieldResult('a''price_dkk''priceDKK');
  155.         $rsm->addFieldResult('a''price_dke''priceDKE');
  156.         $rsm->addFieldResult('a''price_mq_dkk''priceMqDKK');
  157.         $rsm->addFieldResult('a''price_mq_dke''priceMqDKE');
  158.         $rsm->addFieldResult('a''price_nok''priceNOK');
  159.         $rsm->addFieldResult('a''price_noe''priceNOE');
  160.         $rsm->addFieldResult('a''price_mq_nok''priceMqNOK');
  161.         $rsm->addFieldResult('a''price_mq_noe''priceMqNOE');
  162.         $rsm->addFieldResult('a''price_pln''pricePLN');
  163.         $rsm->addFieldResult('a''price_ple''pricePLE');
  164.         $rsm->addFieldResult('a''price_mq_pln''priceMqPLN');
  165.         $rsm->addFieldResult('a''price_mq_ple''priceMqPLE');
  166.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListDelivery''ld''a''delivery');
  167.         $rsm->addFieldResult('ld''ld_id''id');
  168.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasure''lms''a''measure');
  169.         $rsm->addFieldResult('lms''lms_id''id');
  170.         $rsm->addJoinedEntityResult('WebBundle\Entity\ArticlePriceDiscount''apd''a''priceDiscounts');
  171.         $rsm->addFieldResult('apd''apd_id''id');
  172.         $rsm->addFieldResult('apd''apd_amount''amount');
  173.         $rsm->addFieldResult('apd''apd_amount_ft''amountFt');
  174.         $rsm->addFieldResult('apd''apd_fold''fold');
  175.         $rsm->addFieldResult('apd''apd_price''price');
  176.         $rsm->addFieldResult('apd''apd_price_euro''priceEuro');
  177.         $rsm->addFieldResult('apd''apd_price_euro_de''priceEuroDe');
  178.         $rsm->addFieldResult('apd''apd_price_euro_at''priceEuroAt');
  179.         $rsm->addFieldResult('apd''apd_price_euro_fi''priceEuroFi');
  180.         $rsm->addFieldResult('apd''apd_price_euro_fr''priceEuroFr');
  181.         $rsm->addFieldResult('apd''apd_price_euro_it''priceEuroIt');
  182.         $rsm->addFieldResult('apd''apd_price_euro_be''priceEuroBe');
  183.         $rsm->addFieldResult('apd''apd_price_euro_ie''priceEuroIe');
  184.         $rsm->addFieldResult('apd''apd_price_euro_nl''priceEuroNl');
  185.         $rsm->addFieldResult('apd''apd_price_euro_es''priceEuroEs');
  186.         $rsm->addFieldResult('apd''apd_price_rub''priceRUB');
  187.         $rsm->addFieldResult('apd''apd_price_rue''priceRUE');
  188.         $rsm->addFieldResult('apd''apd_price_gbp''priceGBP');
  189.         $rsm->addFieldResult('apd''apd_price_gbe''priceGBE');
  190.         $rsm->addFieldResult('apd''apd_price_usd''priceUSD');
  191.         $rsm->addFieldResult('apd''apd_price_use''priceUSE');
  192.         $rsm->addFieldResult('apd''apd_price_fq_usd''priceFqUSD');
  193.         $rsm->addFieldResult('apd''apd_price_fq_use''priceFqUSE');
  194.         $rsm->addFieldResult('apd''apd_price_chf''priceCHF');
  195.         $rsm->addFieldResult('apd''apd_price_che''priceCHE');
  196.         $rsm->addFieldResult('apd''apd_price_sek''priceSEK');
  197.         $rsm->addFieldResult('apd''apd_price_see''priceSEE');
  198.         $rsm->addFieldResult('apd''apd_price_dkk''priceDKK');
  199.         $rsm->addFieldResult('apd''apd_price_dke''priceDKE');
  200.         $rsm->addFieldResult('apd''apd_price_nok''priceNOK');
  201.         $rsm->addFieldResult('apd''apd_price_noe''priceNOE');
  202.         $rsm->addFieldResult('apd''apd_price_pln''pricePLN');
  203.         $rsm->addFieldResult('apd''apd_price_ple''pricePLE');
  204.         $rsm->addFieldResult('apd''apd_price_cad''priceCAD');
  205.         $rsm->addFieldResult('apd''apd_price_cae''priceCAE');
  206.         $rsm->addFieldResult('apd''apd_price_fq_cad''priceCAD');
  207.         $rsm->addFieldResult('apd''apd_price_fq_cae''priceCAE');
  208.         if ($lc) {
  209.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListDelivery''ld''a''delivery');
  210.             $rsm->addFieldResult('ld''ld_id''id');
  211.             $rsm->addFieldResult('ld''ld_alias''alias');
  212.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListEdgeType''let''a''edgeType');
  213.             $rsm->addFieldResult('let''let_id''id');
  214.             $rsm->addFieldResult('let''let_alias''alias');
  215.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasure''lms''a''measure');
  216.             $rsm->addFieldResult('lms''lms_id''id');
  217.             $rsm->addFieldResult('lms''lms_alias''alias');
  218.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListMaterial''lmt''a''material');
  219.             $rsm->addFieldResult('lmt''lmt_id''id');
  220.             $rsm->addFieldResult('lmt''lmt_alias''alias');
  221.             $rsm->addFieldResult('lmt''lmt_hide''hide');
  222.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListOffShade''los''a''offShade');
  223.             $rsm->addFieldResult('los''los_id''id');
  224.             $rsm->addFieldResult('los''los_alias''alias');
  225.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListSliding''lsl''a''sliding');
  226.             $rsm->addFieldResult('lsl''lsl_id''id');
  227.             $rsm->addFieldResult('lsl''lsl_alias''alias');
  228.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListStyle''lst''a''style');
  229.             $rsm->addFieldResult('lst''lst_id''id');
  230.             $rsm->addFieldResult('lst''lst_alias''alias');
  231.             $rsm->addFieldResult('lst''lst_hide''hide');
  232.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListSurface''lsf''a''surface');
  233.             $rsm->addFieldResult('lsf''lsf_id''id');
  234.             $rsm->addFieldResult('lsf''lsf_alias''alias');
  235.             $rsm->addFieldResult('lsf''lsf_hide''hide');
  236.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListType''ltp''a''type');
  237.             $rsm->addFieldResult('ltp''ltp_id''id');
  238.             $rsm->addFieldResult('ltp''ltp_alias''alias');
  239.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListUsing''lu''a''using');
  240.             $rsm->addFieldResult('lu''lu_id''id');
  241.             $rsm->addFieldResult('lu''lu_alias''alias');
  242.             $rsm->addFieldResult('lu''lu_hide''hide');
  243.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListTexture''ltx''a''textures');
  244.             $rsm->addFieldResult('ltx''ltx_id''id');
  245.             $rsm->addFieldResult('ltx''ltx_alias''alias');
  246.             $rsm->addFieldResult('ltx''ltx_hide''hide');
  247.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListShape''lsh''a''shape');
  248.             $rsm->addFieldResult('lsh''lsh_id''id');
  249.             $rsm->addFieldResult('lsh''lsh_alias''alias');
  250.             $rsm->addFieldResult('lsh''lsh_hide''hide');
  251.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListMotiv''llm''a''motivs');
  252.             $rsm->addFieldResult('llm''llm_id''id');
  253.             $rsm->addFieldResult('llm''llm_alias''alias');
  254.             $rsm->addFieldResult('llm''llm_hide''hide');
  255.             // todo fix ltp - unable to resolve symbol ltp
  256.             $query $this->_em->createNativeQuery(
  257.                 'SELECT
  258.                 a.id,
  259.                 a.code,
  260.                 a.name,
  261.                 a.alternate_name,
  262.                 a.size_x,
  263.                 a.size_y,
  264.                 a.price_euro,
  265.                 a.price_mq_euro,
  266.                 a.price_euro_de,
  267.                 a.price_euro_at,
  268.                 a.price_euro_fi,
  269.                 a.price_euro_fr,
  270.                 a.price_euro_it,
  271.                 a.price_euro_be,
  272.                 a.price_euro_ie,
  273.                 a.price_euro_nl,
  274.                 a.price_euro_es,
  275.                 a.price_mq_euro_de,
  276.                 a.price_mq_euro_at,
  277.                 a.price_mq_euro_fr,
  278.                 a.price_mq_euro_it,
  279.                 a.price_mq_euro_be,
  280.                 a.price_mq_euro_ie,
  281.                 a.price_mq_euro_nl,
  282.                 a.price_mq_euro_es,
  283.                 a.price_rub,
  284.                 a.price_rue,
  285.                 a.price_mq_rub,
  286.                 a.price_mq_rue,
  287.                 a.price_gbp,
  288.                 a.price_gbe,
  289.                 a.price_mq_gbp,
  290.                 a.price_mq_gbe,
  291.                 a.price_usd,
  292.                 a.price_use,
  293.                 a.price_fq_usd,
  294.                 a.price_fq_use,
  295.                 a.price_mq_use,
  296.                 a.price_chf,
  297.                 a.price_che,
  298.                 a.price_mq_chf,
  299.                 a.price_mq_che,
  300.                 a.price_sek,
  301.                 a.price_see,
  302.                 a.price_mq_sek,
  303.                 a.price_mq_see,
  304.                 a.price_dkk,
  305.                 a.price_dke,
  306.                 a.price_mq_dkk,
  307.                 a.price_mq_dke,
  308.                 a.price_nok,
  309.                 a.price_noe,
  310.                 a.price_mq_nok,
  311.                 a.price_mq_noe,
  312.                 a.price_pln,
  313.                 a.price_ple,
  314.                 a.price_mq_pln,
  315.                 a.price_mq_ple,
  316.                 a.price_cad,
  317.                 a.price_cae,
  318.                 a.price_fq_cad,
  319.                 a.price_fq_cae,
  320.                 a.price_mq_cae,
  321.                 lms.id as lms_id,
  322.                 ld.id as ld_id,
  323.                 ld.alias as ld_alias,
  324.                 let.id as let_id,
  325.                 let.alias as let_alias,
  326.                 lmt.id as lmt_id,
  327.                 lmt.alias as lmt_alias,
  328.                 lmt.hide as lmt_hide,
  329.                 lms.id as lms_id,
  330.                 lms.alias as lms_alias,
  331.                 los.id as los_id,
  332.                 los.alias as los_alias,
  333.                 lsl.id as lsl_id,
  334.                 lsl.alias as lsl_alias,
  335.                 lst.id as lst_id,
  336.                 lst.alias as lst_alias,
  337.                 lst.hide as lst_hide,
  338.                 lsf.id as lsf_id,
  339.                 lsf.alias as lsf_alias,
  340.                 lsf.hide as lsf_hide,
  341.                 ltp.id as ltp_id,
  342.                 ltp.alias as ltp_alias,
  343.                 lu.id as lu_id,
  344.                 lu.alias as lu_alias,
  345.                 lu.hide as lu_hide,
  346.                 ltx.id as ltx_id,
  347.                 ltx.alias as ltx_alias,
  348.                 ltx.hide as ltx_hide,
  349.                 llm.id as llm_id,
  350.                 llm.alias as llm_alias,
  351.                 llm.hide as llm_hide,
  352.                 lsh.id as lsh_id,
  353.                 lsh.alias as lsh_alias,
  354.                 lsh.hide as lsh_hide,
  355.                 apd.id as apd_id,
  356.                 apd.amount as apd_amount,
  357.                 apd.amount_ft as apd_amount_ft,
  358.                 apd.fold as apd_fold,
  359.                 apd.price as apd_price,
  360.                 apd.price_euro as apd_price_euro,
  361.                 apd.price_euro_de as apd_price_euro_de,
  362.                 apd.price_euro_at as apd_price_euro_at,
  363.                 apd.price_euro_fi as apd_price_euro_fi,
  364.                 apd.price_euro_fr as apd_price_euro_fr,
  365.                 apd.price_euro_it as apd_price_euro_it,
  366.                 apd.price_euro_be as apd_price_euro_be,
  367.                 apd.price_euro_ie as apd_price_euro_ie,
  368.                 apd.price_euro_nl as apd_price_euro_nl,
  369.                 apd.price_euro_es as apd_price_euro_es,
  370.                 apd.price_rub as apd_price_rub,
  371.                 apd.price_rue as apd_price_rue,
  372.                 apd.price_gbp as apd_price_gbp,
  373.                 apd.price_gbe as apd_price_gbe,
  374.                 apd.price_usd as apd_price_usd,
  375.                 apd.price_use as apd_price_use,
  376.                 apd.price_fq_usd as apd_price_fq_usd,
  377.                 apd.price_fq_use as apd_price_fq_use,
  378.                 apd.price_chf as apd_price_chf,
  379.                 apd.price_che as apd_price_che,
  380.                 apd.price_sek as apd_price_sek,
  381.                 apd.price_see as apd_price_see,
  382.                 apd.price_dkk as apd_price_dkk,
  383.                 apd.price_dke as apd_price_dke,
  384.                 apd.price_nok as apd_price_nok,
  385.                 apd.price_noe as apd_price_noe,
  386.                 apd.price_pln as apd_price_pln,
  387.                 apd.price_ple as apd_price_ple,
  388.                 apd.price_cad as apd_price_cad,
  389.                 apd.price_cae as apd_price_cae,
  390.                 apd.price_fq_cad as apd_price_fq_cad,
  391.                 apd.price_fq_cae as apd_price_fq_cae
  392.             FROM article a
  393.             LEFT JOIN list_delivery ld ON a.delivery = ld.id
  394.             LEFT JOIN list_edge_type let ON a.edge_type = let.id
  395.             LEFT JOIN list_material lmt ON a.material = lmt.id
  396.             LEFT JOIN list_measure lms ON a.measure = lms.id
  397.             LEFT JOIN list_off_shade los ON a.off_shade = los.id
  398.             LEFT JOIN list_sliding lsl ON a.sliding = lsl.id
  399.             LEFT JOIN list_style lst ON a.style = lst.id
  400.             LEFT JOIN list_surface lsf ON a.surface = lsf.id
  401.             LEFT JOIN list_using lu ON a.using = lu.id
  402.             LEFT JOIN article_texture at ON a.id = at.article_id
  403.             LEFT JOIN list_texture ltx ON ltx.id = at.texture_id
  404.             LEFT JOIN article_color ac ON a.id = ac.article_id
  405.             LEFT JOIN list_color lc ON lc.id = ac.color_id
  406.             LEFT JOIN list_shape lsh ON lsh.id = a.shape
  407.             LEFT JOIN article_motiv alm ON a.id = alm.article_id
  408.             LEFT JOIN list_motiv llm ON llm.id = alm.motiv_id
  409.             LEFT JOIN article_price_discount apd ON a.id = apd.article AND apd.price' '_euro' '
  410.             WHERE a.collection = ?
  411.             ORDER BY apd.amount DESC',
  412.                 $rsm
  413.             );
  414.         } else {
  415.             $query $this->_em->createNativeQuery(
  416.                 'SELECT
  417.                 a.id,
  418.                 a.code,
  419.                 a.name,
  420.                 a.alternate_name,
  421.                 a.size_x,
  422.                 a.size_y,
  423.                 a.price_euro,
  424.                 a.price_mq_euro,
  425.                 a.price_euro_de,
  426.                 a.price_euro_at,
  427.                 a.price_euro_fi,
  428.                 a.price_euro_fr,
  429.                 a.price_euro_it,
  430.                 a.price_euro_be,
  431.                 a.price_euro_ie,
  432.                 a.price_euro_nl,
  433.                 a.price_euro_es,
  434.                 a.price_mq_euro_de,
  435.                 a.price_mq_euro_at,
  436.                 a.price_mq_euro_fr,
  437.                 a.price_mq_euro_it,
  438.                 a.price_mq_euro_be,
  439.                 a.price_mq_euro_ie,
  440.                 a.price_mq_euro_nl,
  441.                 a.price_mq_euro_es,
  442.                 a.price_rub,
  443.                 a.price_rue,
  444.                 a.price_mq_rub,
  445.                 a.price_mq_rue,
  446.                 a.price_gbp,
  447.                 a.price_gbe,
  448.                 a.price_mq_gbp,
  449.                 a.price_mq_gbe,
  450.                 a.price_usd,
  451.                 a.price_use,
  452.                 a.price_fq_usd,
  453.                 a.price_fq_use,
  454.                 a.price_mq_use,
  455.                 a.price_chf,
  456.                 a.price_che,
  457.                 a.price_mq_chf,
  458.                 a.price_mq_che,
  459.                 a.price_sek,
  460.                 a.price_see,
  461.                 a.price_mq_sek,
  462.                 a.price_mq_see,
  463.                 a.price_dkk,
  464.                 a.price_dke,
  465.                 a.price_mq_dkk,
  466.                 a.price_mq_dke,
  467.                 a.price_nok,
  468.                 a.price_noe,
  469.                 a.price_mq_nok,
  470.                 a.price_mq_noe,
  471.                 a.price_pln,
  472.                 a.price_ple,
  473.                 a.price_mq_pln,
  474.                 a.price_mq_ple,
  475.                 a.price_fq_cad,
  476.                 a.price_fq_cae,
  477.                 a.price_mq_cae,
  478.                 ld.id as ld_id,
  479.                 lms.id as lms_id,
  480.                 apd.id as apd_id,
  481.                 apd.amount as apd_amount,
  482.                 apd.amount_ft as apd_amount_ft,
  483.                 apd.fold as apd_fold,
  484.                 apd.price as apd_price,
  485.                 apd.price_euro as apd_price_euro,
  486.                 apd.price_euro_de as apd_price_euro_de,
  487.                 apd.price_euro_at as apd_price_euro_at,
  488.                 apd.price_euro_fi as apd_price_euro_fi,
  489.                 apd.price_euro_fr as apd_price_euro_fr,
  490.                 apd.price_euro_it as apd_price_euro_it,
  491.                 apd.price_euro_be as apd_price_euro_be,
  492.                 apd.price_euro_ie as apd_price_euro_ie,
  493.                 apd.price_euro_nl as apd_price_euro_nl,
  494.                 apd.price_euro_es as apd_price_euro_es,
  495.                 apd.price_rub as apd_price_rub,
  496.                 apd.price_rue as apd_price_rue,
  497.                 apd.price_gbp as apd_price_gbp,
  498.                 apd.price_gbe as apd_price_gbe,
  499.                 apd.price_usd as apd_price_usd,
  500.                 apd.price_use as apd_price_use,
  501.                 apd.price_fq_usd as apd_price_fq_usd,
  502.                 apd.price_fq_use as apd_price_fq_use,
  503.                 apd.price_chf as apd_price_chf,
  504.                 apd.price_che as apd_price_che,
  505.                 apd.price_sek as apd_price_sek,
  506.                 apd.price_see as apd_price_see,
  507.                 apd.price_dkk as apd_price_dkk,
  508.                 apd.price_dke as apd_price_dke,
  509.                 apd.price_nok as apd_price_nok,
  510.                 apd.price_noe as apd_price_noe,
  511.                 apd.price_pln as apd_price_pln,
  512.                 apd.price_ple as apd_price_ple,
  513.                 apd.price_cad as apd_price_cad,
  514.                 apd.price_cae as apd_price_cae,
  515.                 apd.price_fq_cad as apd_price_fq_cad,
  516.                 apd.price_fq_cae as apd_price_fq_cae
  517.             FROM article a
  518.             LEFT JOIN list_delivery ld ON a.delivery = ld.id
  519.             LEFT JOIN list_measure lms ON a.measure = lms.id
  520.             LEFT JOIN article_price_discount apd ON a.id = apd.article AND apd.price' '_euro' '
  521.             WHERE a.collection = ?
  522.             ORDER BY apd.amount DESC',
  523.                 $rsm
  524.             );
  525.         }
  526.         $query->setParameter(1$collectionId);
  527.         return $query->getArrayResult();
  528.     }
  529.     /**
  530.      * @param $code
  531.      * @return mixed|null
  532.      * @throws NonUniqueResultException
  533.      */
  534.     public function getArticleForPathByCode($code)
  535.     {
  536.         $q $this->createQueryBuilder('a');
  537.         $q->select('a,c,f')
  538.             ->leftJoin('a.details''ad')
  539.             ->leftJoin('a.collection''c')
  540.             ->leftJoin('c.factory''f')
  541.             ->andWhere('a.code = :code')
  542.             ->andWhere('ad.file IS NOT NULL')
  543.             ->setParameter('code'$code);
  544.         $r $q->getQuery()
  545.             ->setMaxResults(1)
  546.             ->useQueryCache(true);
  547.         try {
  548.             $items $r->getSingleResult();
  549.         } catch (NoResultException $e) {
  550.             return null;
  551.         }
  552.         return $items;
  553.     }
  554.     public function getArticleForSetting(int $id$locale null): ?array
  555.     {
  556.         $locale = ($locale === null) ? App::getCurLocale() : $locale;
  557.         $locale StrHelper::ucFirst($locale);
  558.         $locale ChineseFixHelper::checkAndFixLocale($locale);
  559.         $q $this->createQueryBuilder('a');
  560.         // ad.typePainting,
  561.         $q->select(
  562.             '
  563.                 m.alias measure,
  564.                 m.id measure_id,
  565.                 dr.name draw,
  566.                 t.id type_id,
  567.                 t.alias type,
  568.                 a.overflowSink,
  569.                 a.drainSizeSink,
  570.                 its.alias installationTypeSink,
  571.                 a.faucetHoleSink,
  572.                 ml.alias methLaying,
  573.                 a.swimmingPool swimmingPool,
  574.                 u.alias using,
  575.                 u.id using_id,
  576.                 mt.alias material,
  577.                 mt.id material_id,
  578.                 a.dyedInMass,
  579.                 a.durabilityClass,
  580.                 sh.alias shape,
  581.                 sh.id shape_id,
  582.                 \'\' tShape,
  583.                 a.mosaicEffect mosaicEffect,
  584.                 a.square square,
  585.                 a.sizeTessera sizeTessera,
  586.                 a.tesseraSizeX tesseraSizeX,
  587.                 a.tesseraSizeY tesseraSizeY,
  588.                 a.tesseraSizeZ tesseraSizeZ,
  589.                 mms.alias measurementSize_alias,
  590.                 mms.id measurementSize_id,
  591.                 a.thick thick,
  592.                 \'\' surface,
  593.                 \'\' texture,
  594.                 \'\' style,
  595.                 \'\' motive,
  596.                 a.module,
  597.                 a.scheme,
  598.                 a.repeatNumber repeatNumber,
  599.                 a.glazedGranite glazedGranite,
  600.                 a.thinGranite thinGranite,
  601.                 et.alias edgeType,
  602.                 rd.id repeatDrawId,
  603.                 rd.alias repeatDraw,
  604.                 os.id offShade_id,
  605.                 os.alias offShade,
  606.                 \'\' color,
  607.                 a.pei pei,
  608.                 a.weight weight,
  609.                 d.alias delivery,
  610.                 ad.description' $locale ' description,
  611.                 ad.descriptionEn descriptionEn,
  612.                 a.packagingCount packagingCount,
  613.                 a.packagingCountFt packagingCountFt,
  614.                 a.packagingCountPC packagingCountPC,
  615.                 c.publishDate
  616.             '
  617.         )
  618.             ->leftJoin('a.collection''c')
  619.             ->leftJoin('a.details''ad')
  620.             ->leftJoin('a.measure''m')
  621.             ->leftJoin('a.draw''dr')
  622.             ->leftJoin('a.measurementSize''mms')
  623.             ->leftJoin('a.type''t')
  624.             ->leftJoin('a.delivery''d')
  625.             ->leftJoin('a.edgeType''et')
  626.             ->leftJoin('a.shape''sh')
  627.             ->leftJoin('a.offShade''os')
  628.             ->leftJoin('a.installationTypeSink''its')
  629.             ->leftJoin('a.methLaying''ml')
  630.             ->leftJoin('a.factoryColors''fc')
  631. // не показываем наш цвет в свойствах артикула https://te.remote.team/#/discus/1B85346D-2DDE-356D-20F6-C70153702F0D/
  632. //            ->leftJoin('a.colors', 'cc')
  633.             ->leftJoin('a.material''mt')
  634.             ->leftJoin('a.using''u')
  635.             ->leftJoin('a.repeatDraw''rd')
  636.             ->andWhere('a.id = :id')
  637.             ->setParameter('id'$id)
  638.             ->groupBy('a.id');
  639.         $items $q->getQuery()
  640.             ->useQueryCache(true)
  641.             ->getArrayResult();
  642.         return empty($items[0]) ? [] : $items[0];
  643.     }
  644.     /**
  645.      * @param $id
  646.      * @return mixed|null
  647.      * @throws NonUniqueResultException
  648.      */
  649.     public function getArticle($id): ?Article
  650.     {
  651.         $q $this->createQueryBuilder('a');
  652.         $q->select('a, c, f, priceDiscount')
  653.             ->leftJoin('a.collection''c')
  654.             ->leftJoin('c.factory''f')
  655.             ->leftJoin(
  656.                 'a.priceDiscounts',
  657.                 'priceDiscount',
  658.                 Expr\Join::WITH,
  659.                 $q->expr()->andX(
  660.                     $q->expr()->neq('priceDiscount.priceEuro'0)
  661.                 )
  662.             )
  663.             ->where('a.id = :id')
  664.             ->setMaxResults(1)
  665.             ->setParameter('id'$id);
  666.         $r $q->getQuery()
  667.             ->useQueryCache(true);
  668.         try {
  669.             return $r->getSingleResult();
  670.         } catch (NoResultException $e) {
  671.             // если нет результата по id ищем по коду
  672.             $q->resetDQLPart('where')
  673.                 ->where('a.code = :id')
  674.                 ->setParameter('id'$id);
  675.             $r $q->getQuery()
  676.                 ->useQueryCache(true);
  677.             try {
  678.                 return $r->getSingleResult();
  679.             } catch (NoResultException $e) {
  680.                 $q->resetDQLPart('where')
  681.                     ->where('a.url = :id')
  682.                     ->setParameter('id'$id);
  683.                 $r $q->getQuery()
  684.                     ->useQueryCache(true);
  685.                 try {
  686.                     return $r->getSingleResult();
  687.                 } catch (NoResultException $e) {
  688.                     $q->resetDQLPart('where')
  689.                         ->where('a.name = :id')
  690.                         ->setParameter('id'$id);
  691.                     $r $q->getQuery()
  692.                         ->useQueryCache(true);
  693.                     try {
  694.                         return $r->getSingleResult();
  695.                     } catch (NoResultException $e) {
  696.                         return null;
  697.                     }
  698.                 }
  699.             }
  700.         }
  701.     }
  702.     /**
  703.      * Возвращает возможные варианты размеров
  704.      * @param string $size
  705.      * @return array
  706.      */
  707.     public function getSizeValues($size)
  708.     {
  709.         $q $this
  710.             ->createQueryBuilder('a')
  711.             ->select('a.id, a.thick, a.sizeX, a.sizeY, a.sizeGbX, a.sizeGbY')
  712.             ->leftJoin('a.collection''c')
  713.             ->leftJoin('c.factory''f')
  714.             ->leftJoin('a.details''ad')
  715.             ->andWhere('a.' $size ' != 0')
  716.             ->andWhere('a.delivery != 6')// кроме снятого с производства
  717.             ->andWhere('a.material != 25')// кроме материала Строительные смеси
  718.             ->andWhere('a.scheme = 0')// проверка на scheme
  719.             ->andWhere('a.priceEuro > 0')// обязательная цена
  720.             ->andWhere('ad.file IS NOT NULL')// проверка на file
  721.             ->andWhere('f.status = 1')// проверка статуса фабрики todo добавить проверку скрытости
  722.             ->andWhere('c.status = :c_status AND c.archive = :a_status')
  723.             ->setParameter('a_status'BiConst::STATE_NOT_PUBLISHED)
  724.             ->setParameter('c_status'BiConst::STATE_PUBLISHED)
  725.             ->addOrderBy('a.' $size)
  726.             ->groupBy('a.' $size)
  727.             ->getQuery()
  728.             ->useQueryCache(true)
  729.             ->enableResultCache(3600 8);
  730.         $items $q->getArrayResult();
  731.         $items array_column($items$size);
  732.         $items array_map(function ($num) {
  733.             $n round($num0PHP_ROUND_HALF_DOWN);
  734.             return $n ?: $num;
  735.         }, $items);
  736.         return array_unique($items);
  737.     }
  738.     /**
  739.      * Возвращает ID доступных артикулов коллекции
  740.      *
  741.      * @param int $collectionId
  742.      * @param ?bool $file
  743.      * @return ?array
  744.      * @throws Exception
  745.      */
  746.     public function getArticlesIdColl(int $collectionId, ?bool $file true): ?array
  747.     {
  748.         $q $this->createQueryBuilder('a')
  749.             ->select('a.id as id')
  750.             ->leftJoin('a.details''ad')
  751.             ->andWhere('a.delivery != 6')
  752.             ->andWhere('a.collection = :collection')
  753.             ->andWhere('a.priceEuro > 0')
  754.             ->setParameter('collection'$collectionId);
  755.         if ($file) {
  756.             $q->andWhere('ad.file is not null');
  757.         } else {
  758.             $q->andWhere('ad.file IS NULL');
  759.         }
  760.         $r $q->getQuery()
  761.             ->enableResultCache(TimeConstant::HOUR);
  762.         $items $r->getArrayResult();
  763.         return array_column($items'id');
  764.     }
  765.     /**
  766.      * Метод для слайдера - больше ничего вроде и не надо из базы тащить - ускорение в 2-10 раз
  767.      * @param int $collectionId
  768.      * @return ?array
  769.      */
  770.     public function getAllArticlesByCollectionId(int $collectionId): ?array
  771.     {
  772.         $q $this->createQueryBuilder('a')
  773.             ->select('a, c, delivery, measure')
  774.             ->innerJoin('a.collection''c')
  775.             ->innerJoin('a.delivery''delivery')
  776.             ->innerJoin('a.measure''measure');
  777.         $r $q
  778.             ->andWhere('c.id = :collection')
  779.             ->setParameter('collection'$collectionId)
  780.             ->getQuery()
  781.             ->enableResultCache(TimeConstant::HOUR);
  782.         return $r->getArrayResult();
  783.     }
  784.     /**
  785.      * @param $collection
  786.      * @param ?bool $full
  787.      * @return ?array
  788.      * @throws Exception
  789.      */
  790.     public function getArticleByCollection($collection, ?bool $full true): ?array
  791.     {
  792.         $q $this->createQueryBuilder('a');
  793.         if ($full) {
  794.             $q->select(
  795.                 '
  796.                 a,c,f,measure,type,texture,color,priceDiscount,
  797.                 material,using,edgeType,offShade,sliding,style,styles,surface,delivery,
  798.                 shape,factoryColors,details'
  799.             )
  800.                 ->leftJoin('a.collection''c')
  801.                 ->leftJoin('c.factory''f')
  802.                 ->leftJoin('a.measure''measure')
  803.                 ->leftJoin('a.type''type')
  804.                 ->leftJoin('a.delivery''delivery')
  805.                 ->leftJoin('a.edgeType''edgeType')
  806.                 ->leftJoin('a.offShade''offShade')
  807.                 ->leftJoin('a.sliding''sliding')
  808.                 ->leftJoin('a.style''style')
  809.                 ->leftJoin('a.styles''styles')
  810.                 ->leftJoin('a.surface''surface')
  811.                 ->leftJoin('a.textures''texture')
  812.                 ->leftJoin('a.motivs''motiv')
  813.                 ->leftJoin('a.colors''color')
  814.                 ->leftJoin('a.material''material')
  815.                 ->leftJoin('a.using''using')
  816.                 ->leftJoin('a.shape''shape')
  817.                 ->leftJoin('a.factoryColors''factoryColors')
  818.                 ->leftJoin(
  819.                     'a.priceDiscounts',
  820.                     'priceDiscount',
  821.                     Expr\Join::WITH,
  822.                     $q->expr()->andX(
  823.                         $q->expr()->neq('priceDiscount.priceEuro'0)
  824.                     )
  825.                 )
  826.                 ->leftJoin('a.details''details')
  827.                 ->andWhere('details.id is not null')
  828.                 ->andWhere('delivery.id != :_delivery')
  829.                 ->setParameter('_delivery'6)
  830.                 ->orderBy('type.sort, a.scheme ASC, color.id, a.measure, a.sizeX DESC, a.sizeY DESC, a.thick''DESC');
  831.         } else {
  832.             $q->select('a, type')
  833.                 ->leftJoin('a.collection''c')
  834.                 ->leftJoin('a.type''type');
  835.         }
  836.         $r $q
  837.             ->andWhere('c.id = :collection')
  838.             ->setParameter('collection'$collection)
  839.             ->getQuery()
  840.             ->useQueryCache(true);
  841.         return $this->orderArticlesOpt($r->getArrayResult(), 0true);
  842.     }
  843.     /**
  844.      * Сортировка артикулов
  845.      *
  846.      * @param ?array $articles
  847.      * @param ?int $offset
  848.      * @param ?bool $full
  849.      * @return array
  850.      * @throws Exception
  851.      */
  852.     public function orderArticlesOpt(?array $articles, ?int $offset 0, ?bool $full false): array
  853.     {
  854.         $resultOfArticles = [];
  855.         foreach ($articles as $key => $article) {
  856.             //todo временно
  857.             if (!empty($article['collection']['process'])) {
  858.                 $article['file'] = preg_replace('#\.jpg#i''.webp'$article['file']);
  859.                 // добавил проверку
  860.                 if (isset($article['details']['file'])) {
  861.                     $article['details']['file'] = preg_replace('#\.jpg#i''.webp'$article['details']['file']);
  862.                 }
  863.                 $article['collection']['a_version'] = true;
  864.             } else {
  865.                 $article['collection']['a_version'] = false;
  866.             }
  867.             $articleAltNew join(' ', [
  868.                 empty($article['alternateName']) ? $article['name'] : $article['alternateName'],
  869.                 !empty($article['collection']['factory']['name']) ? $article['collection']['factory']['name'] : '',
  870.                 !empty($article['collection']['name']) ? $article['collection']['name'] : ''
  871.             ]);
  872.             $article['alt'] = $articleAltNew;
  873.             // рассчитываем размер в inch-ах
  874.             $article['sizeGbX'] = ConversionHelper::convertInch((float)$article['sizeX'], ConversionHelper::CM);
  875.             $article['sizeGbY'] = ConversionHelper::convertInch((float)$article['sizeY'], ConversionHelper::CM);
  876.             $article['sizeGbZ'] = ConversionHelper::convertInch((float)$article['sizeZ'], ConversionHelper::CM);
  877.             foreach ($article['colors'] ?? [] as &$color) {
  878.                 $color['name'] = $this->getTranslateWithCheckToNull($color);
  879.                 unset($color['alias']);
  880.             }
  881.             foreach ($article['textures'] ?? [] as &$texture) {
  882.                 $texture['name'] = $this->getTranslateWithCheckToNull($texture);
  883.             }
  884.             foreach (($article['motivs'] ?? []) as &$motiv) {
  885.                 $motiv['name'] = $this->getTranslateWithCheckToNull($motiv);
  886.             }
  887.             $article['material']['name'] = $this->getTranslateWithCheckToNull($article['material']);
  888.             $article['surface']['name'] = $this->getTranslateWithCheckToNull($article['surface']);
  889.             $article['measure']['name'] = $this->getTranslateWithCheckToNull($article['measure']);
  890.             $article['type']['name'] = $this->getTranslateWithCheckToNull($article['type']);
  891.             if ($article['shape'] ?? null) {
  892.                 $article['shape']['name'] = $this->getTranslateWithCheckToNull($article['shape']);
  893.             }
  894.             // для того чтобы фейковая цена считалась под футы
  895.             if (LocaleHelper::measureGb() && in_array($article['measure']['id'], [13])) {
  896.                 $article['pricePrx'] = $article['pricePrx'] / 10.7;
  897.             }
  898.             $article['url'] = $article['url'] ?: $article['name'];
  899.             if (!empty($article['pricePrx']) && LocaleHelper::getCur()) {
  900.                 $article['pricePrx'] = CurrencyRateHelper::convertPrice(
  901.                     LocaleHelper::getCur(),
  902.                     $article['pricePrx']
  903.                 );
  904.             }
  905.             $article['importantInfo'] = null;
  906.             $lc StrHelper::ucFirst(LocaleHelper::getCurLocale());
  907.             $lc ChineseFixHelper::checkAndFixLocale($lc);
  908.             if (!empty($article['descriptionEn']) || !empty($article['description' $lc])) {
  909.                 $article['importantInfo'] = str_replace(
  910.                     '¶',
  911.                     ' ',
  912.                     $article['description' $lc] ?? $article['descriptionEn']
  913.                 );
  914.                 $article['importantInfo'] = ArticleSettingsHelper::replaceLinkToReal($article['importantInfo'], $this);
  915.             }
  916.             unset($article['description' $lc]);
  917.             unset($article['descriptionEn']);
  918.             if ($full) {
  919.                 $collection = !empty($article['collection']) ? $article['collection'] : null;
  920.                 if ($collection) {
  921.                     $_collection['id'] = !empty($collection['id']) ? $collection['id'] : null;
  922.                     $_collection['url'] = !empty($collection['url']) ? $collection['url'] : null;
  923.                     $_collection['name'] = !empty($collection['name']) ? TranslitNameHelper::replacePrime(
  924.                         $collection['name'],
  925.                         false
  926.                     ) : null;
  927.                     $_collection['alternateName'] = !empty($collection['alternateName']) ? TranslitNameHelper::replacePrime(
  928.                         $collection['alternateName'],
  929.                         false
  930.                     ) : null;
  931.                     $_collection['status'] = !empty($collection['status']) ? $collection['status'] : null;
  932.                     $_collection['factory'] = !empty($collection['factory']) ? $collection['factory'] : null;
  933.                     unset($article['collection']);
  934.                     $article['collection'] = $_collection;
  935.                 }
  936.                 $interiors = !empty($article['interiors']) ? $article['interiors'] : [];
  937.                 if ($interiors) {
  938.                     $_interiors = [];
  939.                     foreach ($interiors as $interior) {
  940.                         $collection $interior['collection'];
  941.                         $status $interior['status'];
  942.                         if ($collection and $collection['status'] != BiConst::STATE_NOT_PUBLISHED && $collection['status'] != BiConst::STATE_DISCONTINUED and $status != BiConst::STATE_DISCONTINUED) {
  943.                             $_interiors[] = $interior;
  944.                         }
  945.                     }
  946.                     unset($article['interiors']);
  947.                     $article['interiors'] = $_interiors;
  948.                 }
  949.             }
  950.             // $offset используем чтобы правильно выставить индекс элемента для порции
  951.             // так как иначе появляются ошибки перемешивания артикулов
  952.             $resultOfArticles[$key $offset] = $article;
  953.         }
  954.         return $resultOfArticles;
  955.     }
  956.     /**
  957.      * @param string $name
  958.      * @return mixed|null
  959.      */
  960.     public function getItemUrl(string $name): ?Article
  961.     {
  962.         $q $this->createQueryBuilder('a')
  963.             ->select('a')
  964.             ->andWhere('a.name LIKE :name OR a.alternateName LIKE :name ')
  965.             ->setParameter('name'$name)
  966.             ->setMaxResults(1);
  967.         $r $q->getQuery()->enableResultCache(3600);
  968.         try {
  969.             return $r->getSingleResult();
  970.         } catch (NoResultException NonUniqueResultException $e) {
  971.             return null;
  972.         }
  973.     }
  974.     /**
  975.      * @param Interior $interior
  976.      * @return ?array
  977.      */
  978.     public function getArticlesFromInteriorForDataImport(Interior $interior): ?array
  979.     {
  980.         $q $this->createQueryBuilder('a')
  981.             ->leftJoin('a.interiors''i')
  982.             ->leftJoin('a.delivery''d')
  983.             //->andWhere('a.delivery is null or d.id != :_delivery')
  984.             //->setParameter('_delivery', 6)
  985.             ->andWhere('i.id = :interior')
  986.             ->setParameter('interior'$interior);
  987.         $r $q
  988.             ->getQuery()
  989.             ->useQueryCache(true);
  990.         return $r->getResult();
  991.     }
  992.     /**
  993.      * @return ?array
  994.      */
  995.     public function getList(): ?array
  996.     {
  997.         $q $this
  998.             ->createQueryBuilder('a')
  999.             ->select('a.id, a.code')
  1000.             ->getQuery();
  1001.         return $q->getArrayResult();
  1002.     }
  1003.     /**
  1004.      * @param $ides
  1005.      * @return ?array
  1006.      */
  1007.     public function getArticlesForCheckList($ides): ?array
  1008.     {
  1009.         $IDES explode(','$ides);
  1010.         $q $this->createQueryBuilder('a')
  1011.             ->andWhere('a.id in (:where)')
  1012.             ->setParameter('where'$IDES);
  1013.         $r $q
  1014.             ->orderBy('a.name')
  1015.             ->getQuery();
  1016.         return $r->getResult();
  1017.     }
  1018.     public function getArticlesCheckList(Collection $collection)
  1019.     {
  1020.         $q $this->createQueryBuilder('a')
  1021.             ->leftJoin('a.collection''c')
  1022.             ->leftJoin('a.delivery''delivery')
  1023.             ->andWhere('delivery.id != :_delivery')
  1024.             ->setParameter('_delivery'6)
  1025.             ->andWhere('c.id = :collection')
  1026.             ->setParameter('collection'$collection)
  1027.             ->getQuery()
  1028.             ->useQueryCache(true);
  1029.         return $q->getResult();
  1030.     }
  1031.     public function getArticlesForCodes(array $codes): array
  1032.     {
  1033.         $q $this
  1034.             ->createQueryBuilder('a')
  1035.             ->where('a.code IN (:codes)')
  1036.             ->setParameter('codes'$codes)
  1037.             ->getQuery();
  1038.         $items $q->getResult();
  1039.         $out = [];
  1040.         /** @var Article $item */
  1041.         foreach ($items as $item) {
  1042.             if ($item->getCode()) {
  1043.                 $out[$item->getCode()] = $item;
  1044.             }
  1045.         }
  1046.         return $out;
  1047.     }
  1048.     /**
  1049.      * Получить артикулы для переименования названия и файла
  1050.      * @param array $params
  1051.      * @return array|null
  1052.      */
  1053.     public function getArticleForRename(array $params)
  1054.     {
  1055.         $id $params['scope'];
  1056.         $q $this->createQueryBuilder('a')
  1057.             ->leftJoin('a.collection''c')
  1058.             ->leftJoin('c.factory''f')
  1059.             ->andWhere('c.status != :status')
  1060.             ->setParameter('status'BiConst::STATE_DISCONTINUED);
  1061.         if ($id != 'all') {
  1062.             $q
  1063.                 ->andWhere('c.id = :id')
  1064.                 ->setParameter('id'$id);
  1065.         }
  1066.         $r $q->getQuery();
  1067.         return $r->getResult();
  1068.     }
  1069.     /**
  1070.      * Получение артикулов для вкладки распродажа
  1071.      * @param $ides
  1072.      * @return ?array
  1073.      */
  1074.     public function getArticlesForSale($ides): ?array
  1075.     {
  1076.         $IDES explode(','$ides);
  1077.         $q $this->createQueryBuilder('a')
  1078.             ->leftJoin('a.collection''c')
  1079.             ->leftJoin('c.factory''f')
  1080.             ->andWhere('a.id in (:where)')
  1081.             ->setParameter('where'$IDES);
  1082.         $r $q
  1083.             ->orderBy('f.name, c.name')
  1084.             ->getQuery();
  1085.         return $r->getResult();
  1086.     }
  1087.     /**
  1088.      * Получаем логин пользователя по коду артикула
  1089.      *
  1090.      * @param $code
  1091.      * @return bool|mixed
  1092.      * @throws NoResultException
  1093.      * @throws NonUniqueResultException
  1094.      */
  1095.     public function getUserByArticleCode($code)
  1096.     {
  1097.         $q $this->createQueryBuilder('a')
  1098.             ->select('u.username')
  1099.             ->innerJoin('a.collection''c')
  1100.             ->innerJoin('c.factory''f')
  1101.             ->innerJoin('f.user''u')
  1102.             ->andWhere('a.code = :code')
  1103.             ->setParameter('code'$code)
  1104.             ->setMaxResults(1)
  1105.             ->getQuery();
  1106.         return $q->getSingleScalarResult();
  1107.     }
  1108.     /**
  1109.      * @param $params
  1110.      * @param ?bool $file
  1111.      * @param ?bool $full
  1112.      * @return array
  1113.      * @throws DBALException
  1114.      * @throws Exception|\Doctrine\DBAL\Driver\Exception
  1115.      */
  1116.     public function getArticleNativeOpt($params, ?bool $file true, ?bool $full false): array
  1117.     {
  1118.         $articles $this->getArticleNativeOptBase($params$file$full);
  1119.         return $this->orderArticlesOpt($articles$params['offset'] ?? 0);
  1120.     }
  1121.     /**
  1122.      * @param $params
  1123.      * @param ?bool $file
  1124.      * @param ?bool $full
  1125.      * @return ?array
  1126.      * @throws DBALException
  1127.      * @throws Exception
  1128.      * @throws \Doctrine\DBAL\Driver\Exception
  1129.      */
  1130.     private function getArticleNativeOptBase($params, ?bool $file true, ?bool $full false): ?array
  1131.     {
  1132.         $locale LocaleHelper::getCurLocale();
  1133.         $locale ChineseFixHelper::checkAndFixLocale($locale);
  1134.         $status = (!empty($params['status'])) ? $params['status'] : null;
  1135.         $isInterior = (!empty($params['interior'])) ? $params['interior'] : null;
  1136.         $oneSlide = (!empty($params['oneSlide'])) ? $params['oneSlide'] : null;
  1137.         $rsm = new ResultSetMapping();
  1138.         $rsm->addEntityResult('WebBundle\Entity\Article''a');
  1139.         $rsm->addFieldResult('a''id''id');
  1140.         $rsm->addFieldResult('a''code''code');
  1141.         $rsm->addFieldResult('a''name''name');
  1142.         $rsm->addFieldResult('a''alternate_name''alternateName');
  1143.         $rsm->addFieldResult('a''file''file');
  1144.         $rsm->addFieldResult('a''not_sample''notSample');
  1145.         $rsm->addFieldResult('a''express_sample''expressSample');
  1146.         $rsm->addFieldResult('a''variant_image''variantImage');
  1147.         $rsm->addFieldResult('a''file_w''fileW');
  1148.         $rsm->addFieldResult('a''file_h''fileH');
  1149.         $rsm->addFieldResult('a''file_w4000''fileW4000');
  1150.         $rsm->addFieldResult('a''file_h4000''fileH4000');
  1151.         $rsm->addFieldResult('a''scheme''scheme');
  1152.         $rsm->addFieldResult('a''rotate''rotate');
  1153.         $rsm->addFieldResult('a''file_rotation''fileRotation');
  1154.         $rsm->addFieldResult('a''size_x''sizeX');
  1155.         $rsm->addFieldResult('a''size_y''sizeY');
  1156.         $rsm->addFieldResult('a''size_z''sizeZ');
  1157.         $rsm->addFieldResult('a''file_size2_x''fileSize2X');
  1158.         $rsm->addFieldResult('a''file_size2_y''fileSize2Y');
  1159.         $rsm->addFieldResult('a''file_size3_x''fileSize3X');
  1160.         $rsm->addFieldResult('a''file_size3_y''fileSize3Y');
  1161.         $rsm->addFieldResult('a''file_size8_x''fileSize8X');
  1162.         $rsm->addFieldResult('a''file_size8_y''fileSize8Y');
  1163.         $rsm->addFieldResult('a''type_constraint''typeConstraint');
  1164.         $rsm->addFieldResult('a''packaging_count''packagingCount');
  1165.         $rsm->addFieldResult('a''packaging_count_ft''packagingCountFt');
  1166.         $rsm->addFieldResult('a''packaging_count_pc''packagingCountPC');
  1167.         $rsm->addFieldResult('a''reserve''reserve');
  1168.         $rsm->addFieldResult('a''price_prx''pricePrx');
  1169.         $rsm->addFieldResult('a''pallet''pallet');
  1170.         $rsm->addFieldResult('a''pallet_ft''palletFt');
  1171.         $rsm->addFieldResult('a''min_order''minOrder');
  1172.         $rsm->addFieldResult('a''m2one_ps''m2OnePs');
  1173.         $rsm->addFieldResult('a''multiple_pallet''multiplePallet');
  1174.         $rsm->addFieldResult('a''urla''url');
  1175.         $rsm->addFieldResult('a''background_white''backgroundWhite');
  1176.         $rsm->addFieldResult('a''border_grey''borderGrey');
  1177.         $rsm->addFieldResult('a''image_setting''imageSetting');
  1178.         $rsm->addFieldResult('a''file_edit''fileEdit');
  1179.         $rsm->addFieldResult('a''comment_scheme_image''commentSchemeImage');
  1180. //        $rsm->addFieldResult(
  1181. //            'a',
  1182. //            'description_' . $locale,
  1183. //            'description' . StrHelper::ucFirst($locale)
  1184. //        );
  1185. //        if ($locale != 'en') {
  1186. //            $rsm->addFieldResult('a', 'description_en', 'descriptionEn');
  1187. //        }
  1188. //        $rsm->addScalarResult('description_ru', 'descriptionRu');
  1189.         $rsm->addJoinedEntityResult('FlexApp\Entity\Article\ArticleDescriptionEntity''descrip''a''descriptions');
  1190.         $rsm->addFieldResult('descrip''descrip_id''id');
  1191.         $rsm->addFieldResult('descrip''descrip_description''description');
  1192.         $rsm->addJoinedEntityResult('FlexApp\Entity\LocaleEntity''loc''descrip''locale');
  1193.         $rsm->addFieldResult('loc''locale_id''id');              // 🔴 обязательно!
  1194.         $rsm->addFieldResult('loc''locale_code''code');
  1195.         $rsm->addJoinedEntityResult('WebBundle\Entity\ArticleDetail''ad''a''details');
  1196.         $rsm->addFieldResult('ad''ad_id''id');
  1197.         $rsm->addFieldResult('ad''ad_file''file');
  1198. //        $rsm->addFieldResult('ad', 'ad_picture_in_title', 'pictureInTitle');
  1199.         $rsm->addFieldResult('ad''ad_gtin''gtin');
  1200.         $rsm->addFieldResult('ad''ad_file_size1_x''fileSize1X');
  1201.         $rsm->addFieldResult('ad''ad_file_size1_y''fileSize1Y');
  1202.         $rsm->addFieldResult('ad''ad_file_size2_x''fileSize2X');
  1203.         $rsm->addFieldResult('ad''ad_file_size2_y''fileSize2Y');
  1204.         $rsm->addFieldResult('ad''ad_file_size3_x''fileSize3X');
  1205.         $rsm->addFieldResult('ad''ad_file_size3_y''fileSize3Y');
  1206.         $rsm->addFieldResult('ad''ad_file_size8_x''fileSize8X');
  1207.         $rsm->addFieldResult('ad''ad_file_size8_y''fileSize8Y');
  1208.         $rsm->addFieldResult('ad''ad_file_size500_x''fileSize500X');
  1209.         $rsm->addFieldResult('ad''ad_file_size500_y''fileSize500Y');
  1210.         $rsm->addFieldResult('ad''ad_file_size740_x''fileSize740X');
  1211.         $rsm->addFieldResult('ad''ad_file_size740_y''fileSize740Y');
  1212.         $rsm->addFieldResult('ad''ad_file_size1_x''fileSize1X');
  1213.         $rsm->addFieldResult('ad''ad_file_size1_y''fileSize1Y');
  1214.         $rsm->addFieldResult(
  1215.             'ad',
  1216.             'ad_description_' $locale,
  1217.             'description' StrHelper::ucFirst($locale)
  1218.         );
  1219.         if ($locale != 'en') {
  1220.             $rsm->addFieldResult('ad''ad_description_en''descriptionEn');
  1221.         }
  1222.         $rsm->addFieldResult('ad''ad_comment''comment');
  1223.         $rsm->addFieldResult('ad''ad_file_edit''fileEdit');
  1224.         $rsm->addFieldResult('ad''ad_image_setting''imageSetting');
  1225.         $rsm->addFieldResult('ad''ad_file_w''fileW');
  1226.         $rsm->addFieldResult('ad''ad_file_h''fileH');
  1227.         $rsm->addFieldResult('ad''ad_file_w4000''fileW4000');
  1228.         $rsm->addFieldResult('ad''ad_file_h4000''fileH4000');
  1229.         $rsm->addFieldResult('ad''ad_comment_scheme_image''commentSchemeImage');
  1230.         $rsm->addFieldResult('ad''ad_variant_image''variantImage');
  1231.         $rsm->addFieldResult('ad''ad_file_rotation''fileRotation');
  1232.         $rsm->addFieldResult('ad''ad_rotate''rotate');
  1233.        // $rsm->addFieldResult('ad', 'ad_type_painting', 'typePainting');
  1234.         $rsm->addFieldResult('ad''ad_big_size_scheme''bigSizeScheme');
  1235.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListDelivery''ld''a''delivery');
  1236.         $rsm->addFieldResult('ld''ld_id''id');
  1237.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasure''lms''a''measure');
  1238.         $rsm->addFieldResult('lms''lms_id''id');
  1239.         $rsm->addFieldResult('lms''lms_alias''alias');
  1240.         $rsm->addFieldResult('lms''lms_name''name');
  1241.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListMaterial''lmt''a''material');
  1242.         $rsm->addFieldResult('lmt''lmt_id''id');
  1243.         $rsm->addFieldResult('lmt''lmt_name''name');
  1244.         $rsm->addFieldResult('lmt''lmt_alias''alias');
  1245.         $rsm->addJoinedEntityResult('WebBundle\Entity\ArticlePriceDiscount''apd''a''priceDiscounts');
  1246.         $rsm->addFieldResult('apd''apd_id''id');
  1247.         $rsm->addFieldResult('apd''apd_amount''amount');
  1248.         $rsm->addFieldResult('apd''apd_amount_ft''amountFt');
  1249.         $rsm->addFieldResult('apd''apd_fold''fold');
  1250.         $rsm->addJoinedEntityResult('WebBundle\Entity\Collection''acl''a''collection');
  1251.         $rsm->addFieldResult('acl''acl_id''id');
  1252.         $rsm->addFieldResult('acl''acl_url''url');
  1253.         $rsm->addFieldResult('acl''acl_name''name');
  1254.         $rsm->addFieldResult('acl''acl_aname''alternateName');
  1255.         $rsm->addFieldResult('acl''acl_status''status');
  1256.         $rsm->addFieldResult('acl''acl_process''process');
  1257.         $rsm->addFieldResult('acl''acl_settings''settings');
  1258.         $rsm->addJoinedEntityResult('WebBundle\Entity\Factory''acf''acl''factory');
  1259.         $rsm->addFieldResult('acf''acf_id''id');
  1260.         $rsm->addFieldResult('acf''acf_url''url');
  1261.         $rsm->addFieldResult('acf''acf_name''name');
  1262.         $rsm->addFieldResult('acf''acf_aname''alternateName');
  1263.         $rsm->addFieldResult('acf''acf_suspended''suspended');
  1264.         $rsm->addFieldResult('acf''acf_status''status');
  1265.         $rsm->addFieldResult('acf''acf_stated_at''statedAt');
  1266.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListCountry''lcnt''acf''country');
  1267.         $rsm->addFieldResult('lcnt''lcnt_id''id');
  1268.         $rsm->addFieldResult('lcnt''lcnt_code''code');
  1269.         $rsm->addFieldResult('lcnt''lcnt_alias''alias');
  1270.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListFactoryColor''lfc''a''factoryColors');
  1271.         $rsm->addFieldResult('lfc''lfc_id''id');
  1272.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListTexture''ltx''a''textures');
  1273.         $rsm->addFieldResult('ltx''ltx_id''id');
  1274.         $rsm->addFieldResult('ltx''ltx_alias''alias');
  1275.         $rsm->addFieldResult('ltx''ltx_name''name');
  1276.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListStyle''ls''a''styles');
  1277.         $rsm->addFieldResult('ls''ls_id''id');
  1278.         $rsm->addFieldResult('ls''ls_alias''alias');
  1279.         $rsm->addFieldResult('ls''ls_name''name');
  1280.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListSurface''lsf''a''surface');
  1281.         $rsm->addFieldResult('lsf''lsf_id''id');
  1282.         $rsm->addFieldResult('lsf''lsf_alias''alias');
  1283.         $rsm->addFieldResult('lsf''lsf_name''name');
  1284.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListType''lt''a''type');
  1285.         $rsm->addFieldResult('lt''lt_id''id');
  1286.         $rsm->addFieldResult('lt''lt_alias''alias');
  1287.         $rsm->addFieldResult('lt''lt_name''name');
  1288.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListMotiv''llm''a''motivs');
  1289.         $rsm->addFieldResult('llm''llm_id''id');
  1290.         $rsm->addFieldResult('llm''llm_alias''alias');
  1291.         $rsm->addFieldResult('llm''llm_name''name');
  1292.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListShape''lsh''a''shape');
  1293.         $rsm->addFieldResult('lsh''lsh_id''id');
  1294.         $rsm->addFieldResult('lsh''lsh_alias''alias');
  1295.         $rsm->addFieldResult('lsh''lsh_name''name');
  1296.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasureSize''lmss''a''measurementSize');
  1297.         $rsm->addFieldResult('lmss''lmss_id''id');
  1298.         $rsm->addFieldResult('lmss''lmss_alias''alias');
  1299.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListColor''lc''a''colors');
  1300.         $rsm->addFieldResult('lc''lc_id''id');
  1301.         $rsm->addFieldResult('lc''lc_alias''alias');
  1302.         $rsm->addFieldResult('lc''lc_name''name');
  1303.         $queryFields '';
  1304.         $queryJoin '';
  1305.         if ($isInterior) {
  1306.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListType''lt''a''type');
  1307.             $rsm->addFieldResult('lt''lt_id''id');
  1308.             $rsm->addJoinedEntityResult('WebBundle\Entity\Interior''aii''a''interiors');
  1309.             $rsm->addFieldResult('aii''aii_id''id');
  1310.             $rsm->addFieldResult('aii''aii_file''file');
  1311.             $rsm->addFieldResult('aii''aii_name''name');
  1312.             $rsm->addFieldResult('aii''aii_status''status');
  1313.             $rsm->addFieldResult('aii''aii_url''url');
  1314.             $rsm->addFieldResult('aii''aii_file_size_x''fileSizeX');
  1315.             $rsm->addFieldResult('aii''aii_file_size_y''fileSizeY');
  1316.             $rsm->addFieldResult('aii''ideaCount''ideasCount');
  1317.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListStyle''aii_istls''aii''styles');
  1318.             $rsm->addFieldResult('aii_istls''aii_istls_id''id');
  1319.             $rsm->addFieldResult('aii_istls''aii_istls_alias''alias');
  1320.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListTexture''aii_istlt''aii''textures');
  1321.             $rsm->addFieldResult('aii_istlt''aii_istlt_id''id');
  1322.             $rsm->addFieldResult('aii_istlt''aii_istlt_alias''alias');
  1323.             $rsm->addJoinedEntityResult('WebBundle\Entity\Collection''iacl''aii''collection');
  1324.             $rsm->addFieldResult('iacl''iacl_id''id');
  1325.             $rsm->addFieldResult('iacl''iacl_url''url');
  1326.             $rsm->addFieldResult('iacl''iacl_name''name');
  1327.             $rsm->addFieldResult('iacl''iacl_aname''alternateName');
  1328.             $rsm->addFieldResult('iacl''iacl_status''status');
  1329.             $rsm->addFieldResult('iacl''iacl_process''process');
  1330.             $rsm->addFieldResult('iacl''iacl_rating''rating');
  1331.             $rsm->addFieldResult('iacl''iacl_settings''settings');
  1332.             $rsm->addFieldResult('iacl''iacl_accessible''accessible');
  1333.             $rsm->addJoinedEntityResult('WebBundle\Entity\Factory''iacf''iacl''factory');
  1334.             $rsm->addFieldResult('iacf''iacf_id''id');
  1335.             $rsm->addFieldResult('iacf''iacf_url''url');
  1336.             $rsm->addFieldResult('iacf''iacf_name''name');
  1337.             $rsm->addFieldResult('iacf''iacf_aname''alternateName');
  1338.             $rsm->addFieldResult('iacf''iacf_suspended''suspended');
  1339.             $rsm->addFieldResult('iacf''iacf_status''status');
  1340.             $rsm->addFieldResult('iacf''iacf_stated_at''statedAt');
  1341.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListCountry''iacflc''iacf''country');
  1342.             $rsm->addFieldResult('iacflc''iacflc_id''id');
  1343.             $rsm->addFieldResult('iacflc''iacflc_code''code');
  1344.             $rsm->addFieldResult('iacflc''iacflc_alias''alias');
  1345.             $rsm->addFieldResult('iacflc''iacflc_name''name');
  1346.             $queryFields '
  1347.                 lt.id as lt_id,
  1348.                 aii.id as aii_id,
  1349.                 aii.file as aii_file,
  1350.                 aii.name as aii_name,
  1351.                 aii.status as aii_status,
  1352.                 aii.url as aii_url,
  1353.                 aii.file_size_x as aii_file_size_x,
  1354.                 aii.file_size_y as aii_file_size_y,
  1355.                 (SELECT COUNT(ii.idea_id) FROM `idea_interior` ii WHERE `ii`.`interior_id` = `aii`.id) as ideaCount,
  1356.                 aii_istls.id as aii_istls_id,
  1357.                 aii_istls.alias as aii_istls_alias,
  1358.                 aii_istlt.id as aii_istlt_id,
  1359.                 aii_istlt.alias as aii_istlt_alias,
  1360.                 iacl.id as iacl_id,
  1361.                 iacl.url as iacl_url,
  1362.                 iacl.name as iacl_name,
  1363.                 iacl.alternate_name as iacl_aname,
  1364.                 iacl.status as iacl_status,
  1365.                 iacl.process as iacl_process,
  1366.                 iacl.rating as iacl_rating,
  1367.                 iacl.settings as iacl_settings,
  1368.                 iacl.accessible as iacl_accessible,
  1369.                 iacf.id as iacf_id,
  1370.                 iacf.url as iacf_url,
  1371.                 iacf.name as iacf_name,
  1372.                 iacf.alternate_name  as iacf_aname,
  1373.                 iacf.suspended as iacf_suspended,
  1374.                 iacf.status as iacf_status,
  1375.                 iacf.stated_at as iacf_stated_at,
  1376.                 iacflc.id as iacflc_id,
  1377.                 iacflc.code as iacflc_code,
  1378.                 iacflc.alias as iacflc_alias,
  1379.                 iacflc.name as iacflc_name,
  1380.             ';
  1381.             $queryJoin '
  1382.             LEFT JOIN interior_article iarts ON iarts.article_id = a.id AND a.delivery <> 6
  1383.             LEFT JOIN interior aii ON aii.id = iarts.interior_id AND a.delivery <> 6 AND aii.collection IS NOT NULL and a.collection=aii.collection
  1384.             LEFT JOIN collection iacl ON iacl.id = aii.collection
  1385.             LEFT JOIN factory iacf ON iacf.id = iacl.factory
  1386.             LEFT JOIN list_country iacflc ON iacflc.id = iacf.country
  1387.             LEFT JOIN interior_style ist ON ist.interior_id = aii.id
  1388.             LEFT JOIN list_style aii_istls ON aii_istls.id = ist.style_id
  1389.             LEFT JOIN interior_texture istt ON istt.interior_id = aii.id
  1390.             LEFT JOIN list_texture aii_istlt ON aii_istlt.id = istt.texture_id
  1391.             ';
  1392.         }
  1393.         // Собираем необходимые поля цен
  1394.         switch (LocaleHelper::getCurCountry()) {
  1395.             case 'de':
  1396.                 $priceList = [
  1397.                     'price' => 'price_euro_de',
  1398.                     'price_mq' => 'price_mq_euro_de',
  1399.                     'price_ue' => null,
  1400.                     'price_mq_ue' => null,
  1401.                     'apd_price' => 'price_euro_de',
  1402.                     'apd_price_ue' => null,
  1403.                     'prMin' => 'pr_min_euro_de',
  1404.                     'prMinUe' => null,
  1405.                     'prMinF' => null,
  1406.                     'prMinUeF' => null,
  1407.                 ];
  1408.                 break;
  1409.             case 'at':
  1410.                 $priceList = [
  1411.                     'price' => 'price_euro_at',
  1412.                     'price_mq' => 'price_mq_euro_at',
  1413.                     'price_ue' => null,
  1414.                     'price_mq_ue' => null,
  1415.                     'apd_price' => 'price_euro_at',
  1416.                     'apd_price_ue' => null,
  1417.                     'prMin' => 'pr_min_euro_at',
  1418.                     'prMinUe' => null,
  1419.                     'prMinF' => null,
  1420.                     'prMinUeF' => null,
  1421.                 ];
  1422.                 break;
  1423.             case 'fi':
  1424.                 $priceList = [
  1425.                     'price' => 'price_euro_fi',
  1426.                     'price_mq' => 'price_mq_euro_fi',
  1427.                     'price_ue' => null,
  1428.                     'price_mq_ue' => null,
  1429.                     'apd_price' => 'price_euro_fi',
  1430.                     'apd_price_ue' => null,
  1431.                     'prMin' => 'pr_min_euro_fi',
  1432.                     'prMinUe' => null,
  1433.                     'prMinF' => null,
  1434.                     'prMinUeF' => null,
  1435.                 ];
  1436.                 break;
  1437.             case 'fr':
  1438.                 $priceList = [
  1439.                     'price' => 'price_euro_fr',
  1440.                     'price_mq' => 'price_mq_euro_fr',
  1441.                     'price_ue' => null,
  1442.                     'price_mq_ue' => null,
  1443.                     'apd_price' => 'price_euro_fr',
  1444.                     'apd_price_ue' => null,
  1445.                     'prMin' => 'pr_min_euro_fr',
  1446.                     'prMinUe' => null,
  1447.                     'prMinF' => null,
  1448.                     'prMinUeF' => null,
  1449.                 ];
  1450.                 break;
  1451.             case 'it':
  1452.                 $priceList = [
  1453.                     'price' => 'price_euro_it',
  1454.                     'price_mq' => 'price_mq_euro_it',
  1455.                     'price_ue' => null,
  1456.                     'price_mq_ue' => null,
  1457.                     'apd_price' => 'price_euro_it',
  1458.                     'apd_price_ue' => null,
  1459.                     'prMin' => 'pr_min_euro_it',
  1460.                     'prMinUe' => null,
  1461.                     'prMinF' => null,
  1462.                     'prMinUeF' => null,
  1463.                 ];
  1464.                 break;
  1465.             case 'be':
  1466.                 $priceList = [
  1467.                     'price' => 'price_euro_be',
  1468.                     'price_mq' => 'price_mq_euro_be',
  1469.                     'price_ue' => null,
  1470.                     'price_mq_ue' => null,
  1471.                     'apd_price' => 'price_euro_be',
  1472.                     'apd_price_ue' => null,
  1473.                     'prMin' => 'pr_min_euro_be',
  1474.                     'prMinUe' => null,
  1475.                     'prMinF' => null,
  1476.                     'prMinUeF' => null,
  1477.                 ];
  1478.                 break;
  1479.             case 'ie':
  1480.                 $priceList = [
  1481.                     'price' => 'price_euro_ie',
  1482.                     'price_mq' => 'price_mq_euro_ie',
  1483.                     'price_ue' => null,
  1484.                     'price_mq_ue' => null,
  1485.                     'apd_price' => 'price_euro_ie',
  1486.                     'apd_price_ue' => null,
  1487.                     'prMin' => 'pr_min_euro_ie',
  1488.                     'prMinUe' => null,
  1489.                     'prMinF' => null,
  1490.                     'prMinUeF' => null,
  1491.                 ];
  1492.                 break;
  1493.             case 'nl':
  1494.                 $priceList = [
  1495.                     'price' => 'price_euro_nl',
  1496.                     'price_mq' => 'price_mq_euro_nl',
  1497.                     'price_ue' => null,
  1498.                     'price_mq_ue' => null,
  1499.                     'apd_price' => 'price_euro_nl',
  1500.                     'apd_price_ue' => null,
  1501.                     'prMin' => 'pr_min_euro_nl',
  1502.                     'prMinUe' => null,
  1503.                     'prMinF' => null,
  1504.                     'prMinUeF' => null,
  1505.                 ];
  1506.                 break;
  1507.             case 'es':
  1508.                 $priceList = [
  1509.                     'price' => 'price_euro_es',
  1510.                     'price_mq' => 'price_mq_euro_es',
  1511.                     'price_ue' => null,
  1512.                     'price_mq_ue' => null,
  1513.                     'apd_price' => 'price_euro_es',
  1514.                     'apd_price_ue' => null,
  1515.                     'prMin' => 'pr_min_euro_es',
  1516.                     'prMinUe' => null,
  1517.                     'prMinF' => null,
  1518.                     'prMinUeF' => null,
  1519.                 ];
  1520.                 break;
  1521.             case 'gb':
  1522.                 $priceList = [
  1523.                     'price' => 'price_GBP',
  1524.                     'price_mq' => 'price_mq_GBP',
  1525.                     'price_ue' => 'price_GBE',
  1526.                     'price_mq_ue' => 'price_mq_GBE',
  1527.                     'apd_price' => 'price_GBP',
  1528.                     'apd_price_ue' => 'price_GBE',
  1529.                     'prMin' => 'pr_min_GBP',
  1530.                     'prMinUe' => 'pr_min_GBE',
  1531.                     'prMinF' => null,
  1532.                     'prMinUeF' => null,
  1533.                 ];
  1534.                 break;
  1535.             case 'us':
  1536.                 $priceList = [
  1537.                     'price' => 'price_USD',
  1538.                     'price_mq' => 'price_mq_USD',
  1539.                     'price_fq' => 'price_fq_USD',
  1540.                     'price_ue' => 'price_USE',
  1541.                     'price_mq_ue' => 'price_mq_USE',
  1542.                     'price_fq_ue' => 'price_fq_USD',
  1543.                     'apd_price' => 'price_USD',
  1544.                     'apd_price_fq' => 'price_fq_USD',
  1545.                     'apd_price_ue' => 'price_USE',
  1546.                     'apd_price_fq_ue' => 'price_fq_USE',
  1547.                     'prMin' => 'pr_min_USD',
  1548.                     'prMinUe' => 'pr_min_USE',
  1549.                     'prMinF' => 'pr_min_f_USD',
  1550.                     'prMinUeF' => 'pr_min_f_USE',
  1551.                 ];
  1552.                 break;
  1553.             case 'ca':
  1554.                 $priceList = [
  1555.                     'price' => 'price_CAD',
  1556.                     'price_mq' => 'price_mq_CAD',
  1557.                     'price_fq' => 'price_fq_CAD',
  1558.                     'price_ue' => 'price_CAE',
  1559.                     'price_mq_ue' => 'price_mq_CAE',
  1560.                     'price_fq_ue' => 'price_fq_CAE',
  1561.                     'apd_price' => 'price_CAD',
  1562.                     'apd_price_fq' => 'price_fq_CAD',
  1563.                     'apd_price_ue' => 'price_CAE',
  1564.                     'apd_price_fq_ue' => 'price_fq_CAE',
  1565.                     'prMin' => 'pr_min_CAD',
  1566.                     'prMinUe' => 'pr_min_CAE',
  1567.                     'prMinF' => 'pr_min_f_USD',
  1568.                     'prMinUeF' => 'pr_min_f_USE',
  1569.                 ];
  1570.                 break;
  1571.             case 'ch':
  1572.                 $priceList = [
  1573.                     'price' => 'price_CHF',
  1574.                     'price_mq' => 'price_mq_CHF',
  1575.                     'price_ue' => 'price_CHE',
  1576.                     'price_mq_ue' => 'price_mq_CHE',
  1577.                     'apd_price' => 'price_CHF',
  1578.                     'apd_price_ue' => 'price_CHE',
  1579.                     'prMin' => 'pr_min_CHF',
  1580.                     'prMinUe' => 'pr_min_CHE',
  1581.                     'prMinF' => null,
  1582.                     'prMinUeF' => null,
  1583.                 ];
  1584.                 break;
  1585.             case 'se':
  1586.                 $priceList = [
  1587.                     'price' => 'price_SEK',
  1588.                     'price_mq' => 'price_mq_SEK',
  1589.                     'price_ue' => 'price_SEE',
  1590.                     'price_mq_ue' => 'price_mq_SEE',
  1591.                     'apd_price' => 'price_SEK',
  1592.                     'apd_price_ue' => 'price_SEE',
  1593.                     'prMin' => 'pr_min_SEK',
  1594.                     'prMinUe' => 'pr_min_SEE',
  1595.                     'prMinF' => null,
  1596.                     'prMinUeF' => null,
  1597.                 ];
  1598.                 break;
  1599.             case 'dk':
  1600.                 $priceList = [
  1601.                     'price' => 'price_DKK',
  1602.                     'price_mq' => 'price_mq_DKK',
  1603.                     'price_ue' => 'price_DKE',
  1604.                     'price_mq_ue' => 'price_mq_DKE',
  1605.                     'apd_price' => 'price_DKK',
  1606.                     'apd_price_ue' => 'price_DKE',
  1607.                     'prMin' => 'pr_min_DKK',
  1608.                     'prMinUe' => 'pr_min_DKE',
  1609.                     'prMinF' => null,
  1610.                     'prMinUeF' => null,
  1611.                 ];
  1612.                 break;
  1613.             case 'no':
  1614.                 $priceList = [
  1615.                     'price' => 'price_NOK',
  1616.                     'price_mq' => 'price_mq_NOK',
  1617.                     'price_ue' => 'price_NOE',
  1618.                     'price_mq_ue' => 'price_mq_NOE',
  1619.                     'apd_price' => 'price_NOK',
  1620.                     'apd_price_ue' => 'price_NOE',
  1621.                     'prMin' => 'pr_min_NOK',
  1622.                     'prMinUe' => 'pr_min_NOE',
  1623.                     'prMinF' => null,
  1624.                     'prMinUeF' => null,
  1625.                 ];
  1626.                 break;
  1627.             case 'pl':
  1628.                 $priceList = [
  1629.                     'price' => 'price_PLN',
  1630.                     'price_mq' => 'price_mq_PLN',
  1631.                     'price_ue' => 'price_PLE',
  1632.                     'price_mq_ue' => 'price_mq_PLE',
  1633.                     'apd_price' => 'price_PLN',
  1634.                     'apd_price_ue' => 'price_PLE',
  1635.                     'prMin' => 'pr_min_PLN',
  1636.                     'prMinUe' => 'pr_min_PLE',
  1637.                     'prMinF' => null,
  1638.                     'prMinUeF' => null,
  1639.                 ];
  1640.                 break;
  1641.             default:
  1642.                 $priceList = [
  1643.                     'price' => 'price_euro',
  1644.                     'price_mq' => 'price_mq_euro',
  1645.                     'price_ue' => null,
  1646.                     'price_mq_ue' => null,
  1647.                     'apd_price' => 'price_euro',
  1648.                     'apd_price_ue' => null,
  1649.                     'prMin' => 'pr_min_euro',
  1650.                     'prMinUe' => null,
  1651.                     'prMinF' => null,
  1652.                     'prMinUeF' => null,
  1653.                 ];
  1654.         }
  1655.         $priceSQL '';
  1656.         // Формируем выборку цен
  1657.         foreach ($priceList as $key => $price) {
  1658.             if (!$price) {
  1659.                 continue;
  1660.             }
  1661.             $columnName lcfirst(
  1662.                 str_replace(' '''ucwords(str_replace('_'' '$price)))
  1663.             );
  1664.             $price strtolower($price);
  1665.             if (in_array($key, ['apd_price''apd_price_ue''apd_price_fq''apd_price_fq_ue'])) {
  1666.                 $alias 'apd';
  1667.                 $priceSQL .= 'apd.' $price ' as apd_' $price ', ';
  1668.             } elseif (in_array($key, ['prMin''prMinUe''prMinF''prMinUeF'])) {
  1669.                 $alias 'acl';
  1670.                 $priceSQL .= 'acl.' $price ' as acl_' $price ', ';
  1671.                 if ($isInterior) {
  1672.                     $queryFields .= ' iacl.' $price ' as iacl_' $price ', ';
  1673.                     $rsm->addFieldResult('iacl''iacl_' $price$columnName);
  1674.                 }
  1675.             } else {
  1676.                 $alias 'a';
  1677.                 $priceSQL .= 'a.' $price ' as a_' $price ', ';
  1678.             }
  1679.             $rsm->addFieldResult($alias$alias '_' $price$columnName);
  1680.         }
  1681.         if (empty($params['isFreezed'])) {
  1682.             if (is_numeric($full)) {
  1683.                 $where ' AND (ld.id <> 6 OR a.id = ' $full ')';
  1684.             } elseif ($full) {
  1685.                 $where ' AND (ld.id <> 6 OR a.urla = "' $full '")';
  1686.             } else {
  1687.                 $where ' AND ld.id <> 6';
  1688.             }
  1689.         } else {
  1690.             $where '';
  1691.         }
  1692.         if ($status == BiConst::STATE_DISCONTINUED) {
  1693.             $where '';
  1694.         }
  1695.         if ($file) {
  1696.             $where .= ' AND ad.file IS NOT NULL ';
  1697.         } else {
  1698.             $where .= ' AND (ad.file IS NULL) ';
  1699.         }
  1700.         if (!empty($params['collection'])) {
  1701.             $where .= ' AND a.collection = \'' $params['collection'] . '\'';
  1702.         }
  1703.         if (!empty($params['items'])) {
  1704.             $where .= ' AND a.id IN (\'' join('\',\''$params['items']) . '\')';
  1705.         }
  1706.         if (!empty($params['notItems'])) {
  1707.             $where .= ' AND a.id NOT IN (\'' join('\',\''$params['notItems']) . '\')';
  1708.         }
  1709.         if (!empty($params['cStatus'])) {
  1710.             $where .= ' AND acl.status IN (\'' join('\',\''$params['cStatus']) . '\')';
  1711.         }
  1712.         if (!empty($params['fStatus'])) {
  1713.             $where .= ' AND acf.status IN (\'' join('\',\''$params['fStatus']) . '\')';
  1714.         }
  1715.         $country $params['country'] ?? App::getCurCountry();
  1716.         $cur '_euro';
  1717.         if (
  1718.             CookieHelper::get(CookieKeysConstant::CURRENCY)
  1719.             && CookieHelper::get(CookieKeysConstant::CURRENCY) != 'EUR'
  1720.             && CookieHelper::get(CookieKeysConstant::CURRENCY) != 'HKD'
  1721.             && CookieHelper::get(CookieKeysConstant::CURRENCY) != 'SGD'
  1722.             && CookieHelper::get(CookieKeysConstant::CURRENCY) != 'USD'
  1723.         ) {
  1724.             $cur '_' StrHelper::toLower(CookieHelper::get(CookieKeysConstant::CURRENCY));
  1725.         } elseif ($country == 'de') {
  1726.             $cur '_euro_de';
  1727.         } elseif ($country == 'at') {
  1728.             $cur '_euro_at';
  1729.         } elseif ($country == 'fi') {
  1730.             $cur '_euro_fi';
  1731.         } elseif ($country == 'fr') {
  1732.             $cur '_euro_fr';
  1733.         } elseif ($country == 'it') {
  1734.             $cur '_euro_it';
  1735.         } elseif ($country == 'be') {
  1736.             $cur '_euro_be';
  1737.         } elseif ($country == 'ie') {
  1738.             $cur '_euro_ie';
  1739.         } elseif ($country == 'nl') {
  1740.             $cur '_euro_nl';
  1741.         } elseif ($country == 'es') {
  1742.             $cur '_euro_es';
  1743.         }
  1744.         if ($oneSlide) {
  1745.             $oneSlideLimit ' limit 1 ';
  1746.         } else {
  1747.             $oneSlideLimit ' ';
  1748.         }
  1749.         if (isset($params['limit']) && isset($params['offset'])) {
  1750.             $portion ' LIMIT ' $params['limit'] . ' OFFSET ' $params['offset'];
  1751.             $sSqlCount 'SELECT a.id FROM article a
  1752.             LEFT JOIN list_type lt ON a.type = lt.id
  1753.             LEFT JOIN list_delivery ld ON a.delivery = ld.id
  1754.             LEFT JOIN list_measure lms ON a.measure = lms.id
  1755.             LEFT JOIN list_material lmt ON a.material = lmt.id
  1756.             LEFT JOIN list_surface lsf ON a.surface = lsf.id
  1757.             LEFT JOIN article_price_discount apd ON a.id = apd.article AND apd.price' $cur ' > 0
  1758.             LEFT JOIN article_color ac ON a.id = ac.article_id
  1759.             LEFT JOIN article_factory_color afc ON a.id = afc.article_id
  1760.             LEFT JOIN list_factory_color lfc ON lfc.id = afc.factory_color_id
  1761.             LEFT JOIN article_texture at ON a.id = at.article_id
  1762.             LEFT JOIN list_texture ltx ON ltx.id = at.texture_id
  1763.             LEFT JOIN list_style ls ON a.style = ls.id
  1764.             LEFT JOIN list_color lc ON lc.id = ac.color_id
  1765.             LEFT JOIN collection acl ON acl.id = a.collection
  1766.             LEFT JOIN factory acf ON acf.id = acl.factory
  1767.             LEFT JOIN list_country lcnt ON lcnt.id = acf.country
  1768.             LEFT JOIN article_motiv alm ON a.id = alm.article_id
  1769.             LEFT JOIN list_motiv llm ON llm.id = alm.motiv_id
  1770.             LEFT JOIN list_shape lsh ON lsh.id = a.shape
  1771.             LEFT JOIN article_detail ad         ON ad.article_id = a.id
  1772.             WHERE a.collection IS NOT NULL AND (a.price_euro > 0 OR ld.id = 6)' $where ' GROUP BY a.id
  1773.             ORDER BY lfc.name ASC, a.surface ASC, lt.sort DESC, a.size_x DESC, a.size_y DESC, apd.price_euro DESC, apd.amount DESC,
  1774.             CASE WHEN ad.picture_in_title = 1 THEN ad.file ELSE NULL END ASC,
  1775.             a.scheme ASC, lc.id, lms.id, a.thick, a.id DESC' $portion;
  1776. #todo ************************************************************************************************************************************
  1777.             $res App::em()->getConnection()
  1778.                 ->executeQuery(preg_replace('#[\s]+#'' '$sSqlCount))
  1779.                 ->fetchAllAssociative();
  1780.             if ($res && count($res) > 0) {
  1781.                 $ides array_unique(array_column($res'id'));
  1782.                 $where .= ' AND a.id IN (\'' join('\',\''$ides) . '\')';
  1783.             } else {
  1784.                 return [];
  1785.             }
  1786.         }
  1787.         LocaleHelper::getCurCountry();
  1788.         $sSql '
  1789.             SELECT
  1790.                 a.id,
  1791.                 a.code,
  1792.                 a.name,
  1793.                 a.not_sample,
  1794.                 a.alternate_name,
  1795.                 REPLACE(a.file, "~q~", "\'") AS file,
  1796.                 a.express_sample,
  1797.                 a.variant_image,
  1798.                 a.size_x,
  1799.                 a.size_y,
  1800.                 a.size_z,
  1801.                 a.file_size2_x,
  1802.                 a.file_size2_y,
  1803.                 a.file_size3_x,
  1804.                 a.file_size3_y,
  1805.                 a.file_size8_x,
  1806.                 a.file_size8_y,
  1807.                 a.type_constraint,
  1808.                 a.packaging_count,
  1809.                 a.packaging_count_ft,
  1810.                 a.packaging_count_pc,
  1811.                 a.price_prx,
  1812.                 a.pallet,
  1813.                 a.pallet_ft,
  1814.                 a.min_order,
  1815.                 a.m2one_ps,
  1816.                 a.multiple_pallet,
  1817.                 a.urla,
  1818.                 a.background_white,
  1819.                 a.border_grey,
  1820.                 a.image_setting,
  1821.                 a.file_w,
  1822.                 a.file_h,
  1823.                 a.file_w4000,
  1824.                 a.file_h4000,
  1825.                 a.scheme,
  1826.                 a.rotate,
  1827.                 a.file_rotation,
  1828.                 a.file_edit,
  1829.                 a.comment_scheme_image,
  1830.                         d.id AS descrip_id,
  1831.                         d.description AS descrip_description,
  1832.                          d.locale_id AS descrip_locale_id,
  1833.                          loc.id AS locale_id,
  1834.                          loc.code AS locale_code,
  1835.                 ad.id as ad_id,
  1836.                 ad.file as ad_file,
  1837.                 ad.picture_in_title as ad_picture_in_title,
  1838.                 ad.gtin as ad_gtin,
  1839.                 ad.file_size1_x as ad_file_size1_x,
  1840.                 ad.file_size1_y as ad_file_size1_y,
  1841.                 ad.file_size2_x as ad_file_size2_x,
  1842.                 ad.file_size2_y as ad_file_size2_y,
  1843.                 ad.file_size3_x as ad_file_size3_x,
  1844.                 ad.file_size3_y as ad_file_size3_y,
  1845.                 ad.file_size8_x as ad_file_size8_x,
  1846.                 ad.file_size8_y as ad_file_size8_y,
  1847.                 ad.file_size500_x as ad_file_size500_x,
  1848.                 ad.file_size500_y as ad_file_size500_y,
  1849.                 ad.file_size740_x as ad_file_size740_x,
  1850.                 ad.file_size740_y as ad_file_size740_y,
  1851.                 ad.file_size1_x as ad_file_size1_x,
  1852.                 ad.file_size1_y as ad_file_size1_y,
  1853.                 ad.description_' $locale ' as ad_description_' $locale ',
  1854.                 ' . ($locale != 'en' 'ad.description_en as ad_description_en,' '') . '
  1855.                 ad.comment as ad_comment,
  1856.                 ad.file_edit as ad_file_edit,
  1857.                 ad.image_setting as ad_image_setting,
  1858.                 ad.file_w as ad_file_w,
  1859.                 ad.file_h as ad_file_h,
  1860.                 ad.file_w4000 as ad_file_w4000,
  1861.                 ad.file_h4000 as ad_file_h4000,
  1862.                 ad.comment_scheme_image as ad_comment_scheme_image,
  1863.                 ad.variant_image as ad_variant_image,
  1864.                 ad.file_rotation as ad_file_rotation,
  1865.                 ad.rotate as ad_rotate,
  1866.                 ad.type_painting as ad_type_painting,
  1867.                 ad.big_size_scheme as ad_big_size_scheme,
  1868.                 ld.id as ld_id,
  1869.                 lt.id as lt_id,
  1870.                 lt.alias as lt_alias,
  1871.                 lt.name as lt_name,
  1872.                 lms.id as lms_id,
  1873.                 lms.alias as lms_alias,
  1874.                 lms.name as lms_name,
  1875.                 lmt.id as lmt_id,
  1876.                 lmt.alias as lmt_alias,
  1877.                 lmt.name as lmt_name,
  1878.                 lsf.id as lsf_id,
  1879.                 lsf.alias as lsf_alias,
  1880.                 lsf.name as lsf_name,
  1881.                 lfc.id as lfc_id,
  1882.                 ltx.id as ltx_id,
  1883.                 ltx.alias as ltx_alias,
  1884.                 ltx.name as ltx_name,
  1885.                 ls.id as ls_id,
  1886.                 ls.alias as ls_alias,
  1887.                 ls.name as ls_name,
  1888.                 lsh.id as lsh_id,
  1889.                 lsh.alias as lsh_alias,
  1890.                 lsh.name as lsh_name,
  1891.                 llm.id as llm_id,
  1892.                 llm.alias as llm_alias,
  1893.                 llm.name as llm_name,
  1894.                 lmss.id as lmss_id,
  1895.                 lmss.alias as lmss_alias,
  1896.                 apd.id as apd_id,
  1897.                 apd.amount as apd_amount,
  1898.                 apd.amount_ft as apd_amount_ft,
  1899.                 apd.fold as apd_fold,
  1900.                 acl.id as acl_id,
  1901.                 acl.url as acl_url,
  1902.                 acl.name as acl_name,
  1903.                 acl.alternate_name as acl_aname,
  1904.                 acl.status as acl_status,
  1905.                 acl.process as acl_process,
  1906.                 acl.settings as acl_settings,
  1907.                 acf.id as acf_id,
  1908.                 acf.url as acf_url,
  1909.                 acf.name as acf_name,
  1910.                 acf.alternate_name as acf_aname,
  1911.                 acf.status as acf_status,
  1912.                 acf.suspended as acf_suspended,
  1913.                 acf.stated_at as acf_stated_at,
  1914.                 ' $priceSQL '
  1915.                 ' $queryFields '
  1916.                 lcnt.id as lcnt_id,
  1917.                 lcnt.code as lcnt_code,
  1918.                 lcnt.alias as lcnt_alias,
  1919.                 lc.id as lc_id,
  1920.                 lc.name as lc_name,
  1921.                 lc.alias as lc_alias
  1922.             FROM
  1923.                 article a
  1924.             LEFT JOIN list_type lt ON a.type = lt.id
  1925.             LEFT JOIN list_delivery ld ON a.delivery = ld.id
  1926.             LEFT JOIN list_measure lms ON a.measure = lms.id
  1927.             LEFT JOIN list_material lmt ON a.material = lmt.id
  1928.             LEFT JOIN list_surface lsf ON a.surface = lsf.id
  1929.             LEFT JOIN article_price_discount apd ON a.id = apd.article AND apd.price' $cur ' > 0
  1930.             LEFT JOIN article_color ac ON a.id = ac.article_id
  1931.             LEFT JOIN list_color lc ON lc.id = ac.color_id
  1932.             LEFT JOIN article_factory_color afc ON a.id = afc.article_id
  1933.             LEFT JOIN list_factory_color lfc ON lfc.id = afc.factory_color_id
  1934.             LEFT JOIN article_texture at ON a.id = at.article_id
  1935.             LEFT JOIN list_texture ltx ON ltx.id = at.texture_id
  1936.             LEFT JOIN list_style ls ON a.style = ls.id
  1937.             LEFT JOIN collection acl ON acl.id = a.collection
  1938.             LEFT JOIN factory acf ON acf.id = acl.factory
  1939.             LEFT JOIN list_country lcnt ON lcnt.id = acf.country
  1940.             LEFT JOIN article_motiv alm ON a.id = alm.article_id
  1941.             LEFT JOIN list_motiv llm ON llm.id = alm.motiv_id
  1942.             LEFT JOIN list_shape lsh ON lsh.id = a.shape
  1943.             LEFT JOIN list_measure_size lmss ON a.measurement_size = lmss.id
  1944.             LEFT JOIN article_detail ad         ON ad.article_id = a.id
  1945. LEFT JOIN ng_article_description d ON d.article_id = a.id
  1946. LEFT JOIN ng_locale loc ON loc.id = d.locale_id
  1947.             ' $queryJoin '
  1948.             WHERE a.collection IS NOT NULL AND (a.price_euro > 0 OR a.delivery = 6)' $where .
  1949.             ' ORDER BY lfc.name ASC,  CASE WHEN ad.picture_in_title = 1 THEN ad.file ELSE NULL END ASC, ' .
  1950.             'a.surface ASC, lt.sort DESC, a.size_x DESC, a.size_y DESC, apd.price_euro DESC,' .
  1951.             ' apd.amount DESC, a.scheme ASC, lc.id, lms.id, a.thick, a.id DESC ' $oneSlideLimit;
  1952.         $query $this->_em->createNativeQuery($sSql$rsm);
  1953.         $result $query->getArrayResult();
  1954.         /**
  1955.          * Пробовал тут разные варианты сортировки, чтобы порядок записей был как в $sSqlCount,
  1956.          * например ORDER BY FIELD(a.id, ....), и все равно местами результат отличается.
  1957.          * Пришел к решению просто пересобрать массив в соответствии с порядком в $sSqlCount.
  1958.          * Это все для того, чтобы порядок артикулов был такой же, как и порядковый номер, когда открывается
  1959.          * страница с артикулом.
  1960.          */
  1961.         $finalResult = [];
  1962.         foreach ($result as $row) {
  1963.             // Клонируем все, что есть
  1964.             $item $row;
  1965.             // Добавляем поля descriptionXX
  1966.             if (!empty($row['descriptions']) && is_array($row['descriptions'])) {
  1967.                 foreach ($row['descriptions'] as $desc) {
  1968.                     if (!isset($desc['locale']['code']) || !isset($desc['description'])) {
  1969.                         continue;
  1970.                     }
  1971.                     $code strtolower($desc['locale']['code']); // например, 'ru'
  1972.                     $key 'description' ucfirst($code);        // descriptionRu
  1973.                     $item[$key] = $desc['description'];
  1974.                 }
  1975.                 unset($row['descriptions']);
  1976.             }
  1977.             // По желанию — гарантированное наличие английского
  1978.             if (!isset($item['descriptionEn'])) {
  1979.                 $item['descriptionEn'] = '';
  1980.             }
  1981.             $finalResult[] = $item;
  1982.         }
  1983.         // При загрузке конкретного артикула, эти переменные не присваиваются.
  1984.         if (isset($res) && isset($ides)) {
  1985.             usort($finalResult, function ($a$b) use ($ides) {
  1986.                 $posA array_search($a['id'], $ides);
  1987.                 $posB array_search($b['id'], $ides);
  1988.                 return $posA $posB;
  1989.             });
  1990.         }
  1991.         return $finalResult;
  1992.     }
  1993.     /**
  1994.      * @param string $name
  1995.      * @param ?int $limit
  1996.      * @param ?string $s
  1997.      * @return ?array
  1998.      */
  1999.     public function getIdByName(string $name, ?int $limit 3, ?string $s '%'): ?array
  2000.     {
  2001.         $q $this->createQueryBuilder('a')
  2002.             ->select('a.id')
  2003.             ->innerJoin('a.collection''c')
  2004.             ->innerJoin('c.factory''f')
  2005.             ->leftJoin('a.details''ad')
  2006.             ->where('a.name LIKE :name OR a.alternateName LIKE :name')
  2007.             ->andWhere('a.priceEuro > 0')
  2008.             ->andWhere('a.delivery <> 6')
  2009.             ->andWhere('f.id <>398789')
  2010.             ->andWhere('ad.file IS NOT NULL')
  2011.             ->andWhere('c.status = 1')
  2012.             ->setParameter('name'$s $name $s)
  2013.             ->setMaxResults($limit)
  2014.             ->getQuery();
  2015.         $res $q->getArrayResult();
  2016.         if (count($res) > 0) {
  2017.             return $res;
  2018.         }
  2019.         return [];
  2020.     }
  2021.     /**
  2022.      * @param $name
  2023.      * @return mixed
  2024.      * @throws NonUniqueResultException
  2025.      */
  2026.     public function getArticlesForSearch($name)
  2027.     {
  2028.         $q $this->createQueryBuilder('a')
  2029.             ->select('a, c, f')
  2030.             ->innerJoin('a.collection''c')
  2031.             ->innerJoin('c.factory''f')
  2032.             ->leftJoin('a.details''ad')
  2033.             ->where('a.name LIKE :name')
  2034.             ->andWhere('a.delivery <> 6')
  2035.             ->andWhere('a.priceEuro > 0')
  2036.             ->andWhere('ad.file IS NOT NULL')
  2037.             ->andWhere('c.status = 1')
  2038.             ->andWhere('f.status = 1');
  2039.         if (HideFactoryCountriesHelper::length() > 0) {
  2040.             $q->andWhere('f.id not in (' implode(','HideFactoryCountriesHelper::codes()) . ')');
  2041.         }
  2042.         $q->setParameter('name''%' $name '%')
  2043.             ->setMaxResults(3);
  2044.         return $q->getQuery()->getResult();
  2045.     }
  2046.     /**
  2047.      * @param $article
  2048.      * @return ?array
  2049.      * @throws Exception
  2050.      */
  2051.     public function getArticlePriceDiscounts($article): ?array
  2052.     {
  2053.         $ARTICLE null;
  2054.         // добавляем объект цены для js
  2055.         $price LocaleHelper::getPrice($article);
  2056.         $woVATPrice LocaleHelper::isWithoutVATPrice($price);
  2057.         if ($woVATPrice) {
  2058.             $ARTICLE[] = [
  2059.                 'price' => $price,
  2060.                 'startAmount' => 0,
  2061.                 'woVATPrice' => $woVATPrice,
  2062.                 'multiplicity' => 0,
  2063.                 'fold' => 0
  2064.             ];
  2065.         } else {
  2066.             $ARTICLE[] = [
  2067.                 'price' => $price,
  2068.                 'startAmount' => 0,
  2069.                 'woVATPrice' => $price,
  2070.                 'multiplicity' => 0,
  2071.                 'fold' => 0
  2072.             ];
  2073.         }
  2074.         if (!empty($article['priceDiscounts'])) {
  2075.             foreach ($article['priceDiscounts'] as $k => $row) {
  2076.                 if ($row == null) {
  2077.                     continue;
  2078.                 }
  2079.                 $priceDiscount LocaleHelper::getPriceDiscount($row, [
  2080.                     'measureId' => $article['measure']['id']
  2081.                 ]);
  2082.                 if (
  2083.                     $k == && $article['multiplePallet'] == &&
  2084.                     $article['packagingCount'] >= $priceDiscount['amount']
  2085.                 ) {
  2086.                     $ARTICLE = [];
  2087.                 } else {
  2088.                     $ARTICLE[count($ARTICLE) - 1]['endAmount'] = $priceDiscount['amount'];
  2089.                 }
  2090.                 $woVATPrice LocaleHelper::isWithoutVATPrice($priceDiscount['price']);
  2091.                 if ($woVATPrice) {
  2092.                     $ARTICLE[] = [
  2093.                         'price' => $priceDiscount['price'],
  2094.                         'startAmount' => $priceDiscount['amount'],
  2095.                         'woVATPrice' => $woVATPrice,
  2096.                         'fold' => $row['fold']
  2097.                     ];
  2098.                 } else {
  2099.                     $ARTICLE[] = [
  2100.                         'price' => $priceDiscount['price'],
  2101.                         'startAmount' => $priceDiscount['amount'],
  2102.                         'woVATPrice' => $priceDiscount['price'],
  2103.                         'fold' => $row['fold']
  2104.                     ];
  2105.                 }
  2106.             }
  2107.         }
  2108.         return $ARTICLE;
  2109.     }
  2110.     /**
  2111.      * Возвращает количество доступных артикулов коллекции
  2112.      *
  2113.      * @param int $collectionId
  2114.      * @param ?bool $full - если истина, то покажет и артикулы без картинок
  2115.      * @param ?bool $all - если истина, то покажет и снятые с производства артикулы
  2116.      * @param ?bool $noImg
  2117.      * @return array|null
  2118.      * @throws NoResultException
  2119.      * @throws NonUniqueResultException
  2120.      */
  2121.     public function countArticlesColl(int $collectionId, ?bool $full false, ?bool $all false, ?bool $noImg false)
  2122.     {
  2123.         $q $this->createQueryBuilder('a')
  2124.             ->select('count(a.id)')
  2125.             ->leftJoin('a.details''ad')
  2126.             ->andWhere('a.collection = :collection')
  2127.             ->andWhere('a.priceEuro > 0')
  2128.             ->setParameter('collection'$collectionId);
  2129.         if (!$all) {
  2130.             $q->andWhere('a.delivery != 6');
  2131.         }
  2132.         if (!$full && !$noImg) {
  2133.             $q->andWhere('ad.file is not null');
  2134.         }
  2135.         if ($noImg) {
  2136.             $q->andWhere('(ad.file IS NULL)');
  2137.         }
  2138.         $r $q->getQuery()
  2139.             ->enableResultCache(TimeConstant::HOUR);
  2140.         return $r->getSingleScalarResult();
  2141.     }
  2142.     /**
  2143.      * Получаем минимальные цены из артов по одной коллекции
  2144.      * @param int $collectionId
  2145.      * @param bool $withOutMeasureMq
  2146.      * @return string|null
  2147.      * @throws Exception
  2148.      */
  2149.     public function getArticleMinPriceByCollectionId(int $collectionIdbool $withOutMeasureMq true): ?string
  2150.     {
  2151.         $q $this->createQueryBuilder('a')
  2152.             ->select(
  2153.                 'm.id m_id, m.name m_name, m.alias m_alias, a.id,
  2154.                 a.priceEuro, a.priceMqEuro,
  2155.                 a.priceEuroDe, a.priceMqEuroDe,
  2156.                 a.priceEuroAt, a.priceMqEuroAt,
  2157.                 a.priceEuroFi, a.priceMqEuroFi,
  2158.                 a.priceEuroFr, a.priceMqEuroFr,
  2159.                 a.priceEuroIt, a.priceMqEuroIt,
  2160.                 a.priceEuroBe, a.priceMqEuroBe,
  2161.                 a.priceEuroIe, a.priceMqEuroIe,
  2162.                 a.priceEuroNl, a.priceMqEuroNl,
  2163.                 a.priceEuroEs, a.priceMqEuroEs,
  2164.                 a.priceRUB, a.priceRUE, a.priceMqRUB, a.priceMqRUE,
  2165.                 a.priceGBP, a.priceGBE, a.priceMqGBP, a.priceMqGBE,
  2166.                 a.priceUSD, a.priceUSE, a.priceFqUSD, a.priceFqUSE, a.priceMqUSD, a.priceMqUSE,
  2167.                 a.priceCHF, a.priceCHE, a.priceMqCHF, a.priceMqCHE,
  2168.                 a.priceSEK, a.priceSEE, a.priceMqSEK, a.priceMqSEE,
  2169.                 a.priceDKK, a.priceDKE, a.priceMqDKK, a.priceMqDKE,
  2170.                 a.priceNOK, a.priceNOE, a.priceMqNOK, a.priceMqNOE,
  2171.                 a.pricePLN, a.pricePLE, a.priceMqPLN, a.priceMqPLE,
  2172.                 a.priceCAD, a.priceCAE, a.priceFqCAD, a.priceFqCAE, a.priceMqCAD, a.priceMqCAE'
  2173.             )
  2174.             ->leftJoin('a.details''ad')
  2175.             ->leftJoin('a.measure''m')
  2176.             ->andWhere('a.collection = :collId')
  2177.             ->setParameter('collId'$collectionId)
  2178.             ->andWhere('a.priceEuro > 0')
  2179.             ->andWhere('a.delivery != 6')
  2180.             ->andWhere('ad.file is not null')
  2181.             ->orderBy('a.priceEuro''ASC')
  2182.             ->setMaxResults(1);
  2183.         if ($withOutMeasureMq) {
  2184.             $q->andWhere('m.alias = :measure')->setParameter('measure''measure_mq');
  2185.         }
  2186.         $cc LocaleHelper::getCurCountry();
  2187.         switch ($cc) {
  2188.             case 'de':
  2189.                 $q->andWhere('a.priceEuroDe > 0');
  2190.                 break;
  2191.             case 'at':
  2192.                 $q->andWhere('a.priceEuroAt > 0');
  2193.                 break;
  2194.             case 'fi':
  2195.                 $q->andWhere('a.priceEuroFi > 0');
  2196.                 break;
  2197.             case 'fr':
  2198.                 $q->andWhere('a.priceEuroFr > 0');
  2199.                 break;
  2200.             case 'it':
  2201.                 $q->andWhere('a.priceEuroIt > 0');
  2202.                 break;
  2203.             case 'be':
  2204.                 $q->andWhere('a.priceEuroBe > 0');
  2205.                 break;
  2206.             case 'ie':
  2207.                 $q->andWhere('a.priceEuroIe > 0');
  2208.                 break;
  2209.             case 'nl':
  2210.                 $q->andWhere('a.priceEuroNl > 0');
  2211.                 break;
  2212.             case 'es':
  2213.                 $q->andWhere('a.priceEuroEs > 0');
  2214.                 break;
  2215.             case 'ru':
  2216.                 $q->andWhere('a.priceRUB > 0');
  2217.                 break;
  2218.         }
  2219.         $r $q->getQuery()
  2220.             ->enableResultCache(TimeConstant::DAY)
  2221.             ->getArrayResult();
  2222.         $r $r $r[0] : null;
  2223.         $minPrice null;
  2224.         if ($r) {
  2225.             $m = [
  2226.                 'id' => $r['m_id'],
  2227.                 'name' => $r['m_name'],
  2228.                 'alias' => $r['m_alias'],
  2229.             ];
  2230.             unset($r['m_id']);
  2231.             unset($r['m_name']);
  2232.             unset($r['m_alias']);
  2233.             $r['measure'] = $m;
  2234.             $minPrice LocaleHelper::getMinPriceStrForTitle($r);
  2235.         } elseif ($withOutMeasureMq) {
  2236.             $minPrice $this->getArticleMinPriceByCollectionId($collectionIdfalse);
  2237.         }
  2238.         return $minPrice;
  2239.     }
  2240.     /**
  2241.      * Получаем цену арта
  2242.      * @param int $articleId
  2243.      * @param ?bool $withOutMeasureMq
  2244.      * @return string|null
  2245.      * @throws Exception
  2246.      */
  2247.     public function getArticleMinPriceById(int $articleId, ?bool $withOutMeasureMq true): ?string
  2248.     {
  2249.         $q $this->createQueryBuilder('a')
  2250.             ->select(
  2251.                 'm.id m_id, m.name m_name, m.alias m_alias, a.id,
  2252.             a.priceEuro, a.priceMqEuro,
  2253.             a.priceEuroDe, a.priceMqEuroDe,
  2254.             a.priceEuroAt, a.priceMqEuroAt,
  2255.             a.priceEuroFi, a.priceMqEuroFi,
  2256.             a.priceEuroFr, a.priceMqEuroFr,
  2257.             a.priceEuroIt, a.priceMqEuroIt,
  2258.             a.priceEuroBe, a.priceMqEuroBe,
  2259.             a.priceEuroIe, a.priceMqEuroIe,
  2260.             a.priceEuroNl, a.priceMqEuroNl,
  2261.             a.priceEuroEs, a.priceMqEuroEs,
  2262.             a.priceRUB, a.priceRUE, a.priceMqRUB, a.priceMqRUE,
  2263.             a.priceGBP, a.priceGBE, a.priceMqGBP, a.priceMqGBE,
  2264.             a.priceUSD, a.priceUSE, a.priceFqUSD, a.priceFqUSE, a.priceMqUSD, a.priceMqUSE,
  2265.             a.priceCHF, a.priceCHE, a.priceMqCHF, a.priceMqCHE,
  2266.             a.priceSEK, a.priceSEE, a.priceMqSEK, a.priceMqSEE,
  2267.             a.priceDKK, a.priceDKE, a.priceMqDKK, a.priceMqDKE,
  2268.             a.priceNOK, a.priceNOE, a.priceMqNOK, a.priceMqNOE,
  2269.             a.pricePLN, a.pricePLE, a.priceMqPLN, a.priceMqPLE,
  2270.             a.priceCAD, a.priceCAE, a.priceFqCAD, a.priceFqCAE, a.priceMqCAD, a.priceMqCAE'
  2271.             )
  2272.             ->leftJoin('a.measure''m')
  2273.             ->andWhere('a.id = :id')
  2274.             ->setParameter('id'$articleId)
  2275.             ->setMaxResults(1);
  2276.         if ($withOutMeasureMq) {
  2277.             $q->andWhere('m.alias = :measure')->setParameter('measure''measure_mq');
  2278.         }
  2279.         $r $q->getQuery()
  2280.             ->enableResultCache(TimeConstant::DAY)
  2281.             ->getArrayResult();
  2282.         $r $r $r[0] : null;
  2283.         $minPrice null;
  2284.         if ($r) {
  2285.             $m = [
  2286.                 'id' => $r['m_id'],
  2287.                 'name' => $r['m_name'],
  2288.                 'alias' => $r['m_alias'],
  2289.             ];
  2290.             unset($r['m_id']);
  2291.             unset($r['m_name']);
  2292.             unset($r['m_alias']);
  2293.             $r['measure'] = $m;
  2294.             $minPrice LocaleHelper::getMinPriceStrForTitle($r);
  2295.         } elseif ($withOutMeasureMq) {
  2296.             $minPrice $this->getArticleMinPriceById($articleIdfalse);
  2297.         }
  2298.         return $minPrice;
  2299.     }
  2300.     /**
  2301.      * @param $collectionId
  2302.      * @param ?bool $full - если истина, то покажет и артикулы без картинок
  2303.      * @param ?bool $all - если истина, то покажет и снятые с производства артикулы
  2304.      * @param ?bool $noImg
  2305.      * @return ?array
  2306.      * @throws Exception
  2307.      */
  2308.     public function idesArticlesColl(
  2309.         $collectionId,
  2310.         ?bool $full false,
  2311.         ?bool $all false,
  2312.         ?bool $noImg false
  2313.     ): ?array {
  2314.         $rsm = new ResultSetMapping();
  2315.         $rsm->addEntityResult('WebBundle\Entity\Article''a');
  2316.         $rsm->addFieldResult('a''id''id');
  2317.         $rsm->addFieldResult('a''urla''url');
  2318.         $rsm->addJoinedEntityResult('WebBundle\Entity\ArticlePriceDiscount''apd''a''priceDiscounts');
  2319.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasure''lms''a''measure');
  2320.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListFactoryColor''lfc''a''factoryColors');
  2321.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListColor''lc''a''colors');
  2322.         $rsm->addJoinedEntityResult('WebBundle\Entity\ArticleDetail''ad''a''details');
  2323.         $where = ['a.collection = ' $collectionId];
  2324.         if (!$all) {
  2325.             $where[] = 'a.delivery != 6';
  2326.         }
  2327.         if (!$full && !$noImg) {
  2328.             $where[] = 'ad.file is not null';
  2329.         }
  2330.         if ($noImg) {
  2331.             $where '(ad.file IS NULL)';
  2332.         }
  2333.         $sSql '
  2334.             SELECT
  2335.                 a.id, a.urla
  2336.             FROM
  2337.                 article a
  2338.             LEFT JOIN list_measure lms ON a.measure = lms.id
  2339.             LEFT JOIN article_price_discount apd ON a.id = apd.article
  2340.             LEFT JOIN article_factory_color afc ON a.id = afc.article_id
  2341.             LEFT JOIN list_factory_color lfc ON lfc.id = afc.factory_color_id
  2342.             LEFT JOIN article_color ac ON a.id = ac.article_id
  2343.             LEFT JOIN list_color lc ON lc.id = ac.color_id
  2344.             LEFT JOIN list_type lt ON a.type = lt.id
  2345.             LEFT JOIN article_detail ad ON a.id = ad.article_id
  2346.             WHERE ' join(' AND '$where) .
  2347.             // убрал группировку иначе не все интерьеры попадают в выборку
  2348.             ' ORDER BY lfc.name ASC, lt.sort DESC, a.size_x DESC, a.size_y DESC, apd.price_euro DESC,
  2349.             apd.amount DESC, a.scheme ASC, lc.id, lms.id, a.thick, a.id DESC';
  2350.         $query $this->_em->createNativeQuery($sSql$rsm);//->enableResultCache(3600);
  2351.         $res $query->getArrayResult();
  2352.         if (count($res)) {
  2353.             return array_combine(
  2354.                 array_column($query->getArrayResult(), 'id'),
  2355.                 array_column($query->getArrayResult(), 'url')
  2356.             );
  2357.         }
  2358.         return [];
  2359.     }
  2360.     /**
  2361.      * @param $key
  2362.      * @param $elementIdes
  2363.      * @return mixed|null
  2364.      */
  2365.     public function articleId($key$elementIdes)
  2366.     {
  2367.         $rsm = new ResultSetMapping();
  2368.         $rsm->addEntityResult('WebBundle\Entity\Article''a');
  2369.         $rsm->addFieldResult('a''id''id');
  2370.         $sSql sprintf(
  2371.             '
  2372.             SELECT a.id FROM article a
  2373.             left JOIN article_detail ad ON ad.article_id=a.id
  2374.             WHERE (a.id = \'%s\' OR a.urla = \'%s\') AND a.id IN (%s) AND ad.file IS NOT NULL LIMIT %d',
  2375.             $key,
  2376.             $key,
  2377.             join(','$elementIdes),
  2378.             1
  2379.         );
  2380.         $query $this->_em->createNativeQuery($sSql$rsm)
  2381.             ->enableResultCache(3600);
  2382.         try {
  2383.             return $query->getSingleScalarResult();
  2384.         } catch (Exception $e) {
  2385.             return null;
  2386.         }
  2387.     }
  2388.     /**
  2389.      * @param $params
  2390.      * @param ?bool $file
  2391.      * @param ?bool $full
  2392.      * @return array
  2393.      * @throws Exception|\Doctrine\DBAL\Driver\Exception
  2394.      */
  2395.     public function getArticleNativeOptSlider($params, ?bool $file true, ?bool $full false): array
  2396.     {
  2397.         $articles $this->getArticleNativeOptBase($params$file$full);
  2398.         $out = [];
  2399.         foreach ($articles as $article) {
  2400.             $out[$article['id']] = $article;
  2401.         }
  2402.         return $out;
  2403.     }
  2404.     /**
  2405.      * Получение статистики по всем артикулам.
  2406.      *
  2407.      * @param string $searchString - ID или имя фабрики, ищет любое что подходит
  2408.      * @return array
  2409.      */
  2410.     public function getStatisticByArticleOfOrders(string $searchString): array
  2411.     {
  2412.         $q $this->createQueryBuilder('a')
  2413.             /* WARNING ! Обязательно указать интересующие столбцы, т.к. оч много данных, может подвиснуть! */
  2414.             ->select(
  2415.                 '
  2416.             a.id,
  2417.             a.code,
  2418.             a.name,
  2419.             c.name collection,
  2420.             c.views collViews,
  2421.             f.name factory,
  2422.             cc.code country,
  2423.             a.priceRUB priceRUB,
  2424.             a.priceEuro priceEUR,
  2425.             a.addedToCart added2Cart,
  2426.             a.soldOut soldOut,
  2427.             a.soldOutVol soldOutVol'
  2428.             )
  2429.             ->leftJoin('a.collection''c')
  2430.             ->leftJoin('c.factory''f')
  2431.             ->leftJoin('f.country''cc')
  2432.             ->leftJoin('a.delivery''d')
  2433.             ->andWhere('d.id != 6')
  2434.             ->andWhere('a.priceEuro > 0')
  2435.             ->andWhere('f.unid = :search OR a.code = :search OR f.url = :search OR f.name = :search')
  2436.             ->setParameter('search'str_replace('\'''&prime;'$searchString));
  2437.         $all $q->getQuery()->getArrayResult();
  2438.         return [
  2439.             'all' => $all,
  2440.             'count' => count($all)
  2441.         ];
  2442.     }
  2443.     public function getArticlesByIds($ids = [])
  2444.     {
  2445.         if ($ids) {
  2446.             $q $this->createQueryBuilder('a');
  2447.             $q->select('a, c, f, priceDiscount')
  2448.                 ->leftJoin('a.collection''c')
  2449.                 ->leftJoin('c.factory''f')
  2450.                 ->leftJoin(
  2451.                     'a.priceDiscounts',
  2452.                     'priceDiscount',
  2453.                     Expr\Join::WITH,
  2454.                     $q->expr()->andX(
  2455.                         $q->expr()->neq('priceDiscount.priceEuro'0)
  2456.                     )
  2457.                 )
  2458.                 ->andWhere('a.id IN (:ids) OR a.code IN (:ids)')
  2459.                 ->setParameters(['ids' => $ids]);
  2460.             $r $q->getQuery()->setMaxResults(100);
  2461.             $items $r->getResult();
  2462.         }
  2463.         return $items ?? false;
  2464.     }
  2465.     /**
  2466.      * @param $cId
  2467.      * @return ?Article
  2468.      * @throws Exception
  2469.      */
  2470.     public function getItemForSearch($cId): ?Article
  2471.     {
  2472.         $q $this->createQueryBuilder('a')
  2473.             ->select('a')
  2474.             ->innerJoin('a.collection''c')
  2475.             ->innerJoin('c.factory''f')
  2476.             ->leftJoin('a.details''ad')
  2477.             ->where('a.collection = :id')
  2478.             ->andWhere('c.status = 1')
  2479.             ->andWhere('f.status = 1')
  2480.             ->andWhere('ad.file IS NOT NULL')
  2481.             ->andWhere('a.type IN (:type)')
  2482.             ->setParameters([
  2483.                 'id' => $cId,
  2484.                 'type' => [113241]
  2485.             ])
  2486.             ->setMaxResults(1)
  2487.             ->getQuery();
  2488.         try {
  2489.             return $q->getSingleResult();
  2490.         } catch (NoResultException NonUniqueResultException $e) {
  2491.             return null;
  2492.         }
  2493.     }
  2494.     /**
  2495.      * Получение артикулов для выгрузки в Google Recommendations AI
  2496.      *
  2497.      * @param array $params
  2498.      * @param ?int $limit
  2499.      * @param ?int $offset
  2500.      * @return ?array
  2501.      */
  2502.     public function getArticleForGoogleRecommendationAi(array $params = [], ?int $limit 10, ?int $offset 0): ?array
  2503.     {
  2504.         $builder $this->createQueryBuilder('a');
  2505.         $builder->leftJoin('a.type''t')
  2506.             ->leftJoin('a.edgeType''edgeType')
  2507.             ->leftJoin('a.shape''shape')
  2508.             ->leftJoin('a.material''material')
  2509.             ->leftJoin('a.sliding''sliding')
  2510.             ->leftJoin('a.offShade''offShade')
  2511.             ->leftJoin('a.using''u')
  2512.             ->leftJoin('a.collection''coll')
  2513.             ->leftJoin('a.categoryPrice''categoryPrice')
  2514.             ->leftJoin('a.delivery''delivery')
  2515.             ->leftJoin('a.details''ad')
  2516.             ->leftJoin('coll.factory''factory')
  2517.             ->leftJoin('factory.country''country');
  2518.         $builder->select(
  2519.             'a.id',
  2520.             'a.code',
  2521.             'a.alternateName',
  2522.             'a.url',
  2523.             'ad.file',
  2524.             'a.priceEuro',
  2525.             'a.priceUSD',
  2526.             'a.pricePrx',
  2527.             'a.sizeX',
  2528.             'a.sizeY',
  2529.             'a.sizeGbX',
  2530.             'a.sizeGbY',
  2531.             'a.thick',
  2532.             'a.weight',
  2533.             'ad.fileSize2X',
  2534.             'ad.fileSize2Y',
  2535.             't.alias AS list_type_name',
  2536.             'edgeType.alias AS egde_type_name',
  2537.             'shape.alias AS shape_name',
  2538.             'material.alias AS material_name',
  2539.             'sliding.alias AS sliding_name',
  2540.             'offShade.alias AS off_shade_name',  // разнотон
  2541.             'coll.code AS collection_code',
  2542.             'coll.name AS collection_name',
  2543.             'coll.alternateName AS collection_alternate_name',
  2544.             'coll.url AS collectionUrl',
  2545.             'factory.name AS factory_name',
  2546.             'factory.url AS factoryUrl',
  2547.             'u.alias AS using_name',
  2548.             'country.alias AS country_name',
  2549.             'categoryPrice.alias AS category_price_alias'
  2550.         );
  2551.         // $builder->andWhere('a.id = 38511'); // с несколькими текстурами П000000143
  2552.         // $builder->andWhere('a.id = 24928'); // с несколькими поверхностями
  2553.         // $builder->andWhere('a.id = 2592'); // с несколькими цветами
  2554.         // $builder->andWhere('a.id = 180897094'); // с несколькими стилями
  2555.         // $builder->andWhere('a.id = 2913'); // с несколькими мотивами
  2556.         // $builder->andWhere('a.id = 713140'); // с несколькими применениями
  2557.         // $builder->andWhere('a.id = 405562037'); // с выставкой
  2558.         // $builder->andWhere('a.id = 259547853'); // с наградой
  2559.         // $builder->andWhere('a.id = 1996'); // с отзывом
  2560.         $builder->andWhere('coll IS NOT NULL')
  2561.             ->andWhere('delivery.id <> 6')
  2562.             ->andWhere('a.priceEuro > 0')
  2563.             ->andWhere('coll.status IN (1,2,3,4,7)')
  2564.             ->andWhere('coll.url IS NOT NULL AND coll.url <> \'\'')
  2565.             ->andWhere('factory.status = 1')
  2566.             ->andWhere('ad.file IS NOT NULL');
  2567.         $builder->setMaxResults($limit);
  2568.         $builder->setFirstResult($offset);
  2569.         if (array_key_exists('ids'$params) && is_array($params['ids'])) {
  2570.             $builder->andWhere('a.id IN (:ids)')
  2571.                 ->setParameter('ids'$params['ids']);
  2572.             $builder->setMaxResults(null);
  2573.             $builder->setFirstResult(null);
  2574.         }
  2575.         $query $builder->getQuery();
  2576.         $rows $query->getResult();
  2577.         if (empty($rows)) {
  2578.             return [];
  2579.         }
  2580.         // Собираем полученные ID
  2581.         $rowIds array_map(function ($row) {
  2582.             return $row['id'];
  2583.         }, $rows);
  2584.         // Ищем эффекты артикулов
  2585.         $textureBuilder $this->createQueryBuilder('a')
  2586.             ->innerJoin('a.textures''textures')
  2587.             ->select('a.id''textures.alias')
  2588.             ->andWhere('a.id IN (:p_ids)')
  2589.             ->setParameter('p_ids'$rowIds);
  2590.         $textureRows $textureBuilder->getQuery()->getArrayResult();
  2591.         $textureResult = [];
  2592.         foreach ($textureRows as $textureRow) {
  2593.             $textureResult[$textureRow['id']][] = $textureRow['alias'];
  2594.         }
  2595.         // Ищем поверхности артикулов
  2596.         $surfaceBuilder $this->createQueryBuilder('a')
  2597.             ->innerJoin('a.surfaces''surfaces')
  2598.             ->select('a.id''surfaces.alias')
  2599.             ->andWhere('a.id IN (:p_ids)')
  2600.             ->setParameter('p_ids'$rowIds);
  2601.         $surfaceRows $surfaceBuilder->getQuery()->getArrayResult();
  2602.         $surfaceResult = [];
  2603.         foreach ($surfaceRows as $surfaceRow) {
  2604.             $surfaceResult[$surfaceRow['id']][] = $surfaceRow['alias'];
  2605.         }
  2606.         // Ищем цвета артикулов
  2607.         $colorsBuilder $this->createQueryBuilder('a')
  2608.             ->innerJoin('a.colors''colors')
  2609.             ->select('a.id''colors.alias')
  2610.             ->andWhere('a.id IN (:p_ids)')
  2611.             ->setParameter('p_ids'$rowIds);
  2612.         $colorsRows $colorsBuilder->getQuery()->getArrayResult();
  2613.         $colorsResult = [];
  2614.         foreach ($colorsRows as $colorsRow) {
  2615.             $colorsResult[$colorsRow['id']][] = $colorsRow['alias'];
  2616.         }
  2617.         // Ищем стили артикулов
  2618.         $stylesBuilder $this->createQueryBuilder('a')
  2619.             ->innerJoin('a.styles''styles')
  2620.             ->select('a.id''styles.alias')
  2621.             ->andWhere('a.id IN (:p_ids)')
  2622.             ->setParameter('p_ids'$rowIds);
  2623.         $stylesRows $stylesBuilder->getQuery()->getArrayResult();
  2624.         $stylesResult = [];
  2625.         foreach ($stylesRows as $stylesRow) {
  2626.             $stylesResult[$stylesRow['id']][] = $stylesRow['alias'];
  2627.         }
  2628.         // Ищем мотивы рисунков
  2629.         $motivsBuilder $this->createQueryBuilder('a')
  2630.             ->innerJoin('a.motivs''motivs')
  2631.             ->select('a.id''motivs.alias')
  2632.             ->andWhere('a.id IN (:p_ids)')
  2633.             ->setParameter('p_ids'$rowIds);
  2634.         $motivsRows $motivsBuilder->getQuery()->getArrayResult();
  2635.         $motivsResult = [];
  2636.         foreach ($motivsRows as $motivsRow) {
  2637.             $motivsResult[$motivsRow['id']][] = $motivsRow['alias'];
  2638.         }
  2639.         // Ищем применения
  2640.         $applyBuilder $this->createQueryBuilder('a')
  2641.             ->leftJoin('a.interiors''interiors')
  2642.             ->innerJoin('interiors.applies''applies')
  2643.             ->select('a.id''applies.alias')
  2644.             ->andWhere('a.id IN (:p_ids)')
  2645.             ->setParameter('p_ids'$rowIds)
  2646.             ->distinct();
  2647.         $applyRows $applyBuilder->getQuery()->getArrayResult();
  2648.         $applyResult = [];
  2649.         foreach ($applyRows as $applyRow) {
  2650.             $applyResult[$applyRow['id']][] = $applyRow['alias'];
  2651.         }
  2652.         // Ищем выставки
  2653.         $exhibitionBuilder $this->createQueryBuilder('a');
  2654.         $exhibitionBuilder->select('a.id''filters.name')
  2655.             ->leftJoin('a.collection''collection')
  2656.             ->leftJoin('collection.filters''filters')
  2657.             ->innerJoin(
  2658.                 'filters.groups',
  2659.                 'groups',
  2660.                 Expr\Join::WITH,
  2661.                 $exhibitionBuilder->expr()->andX('groups.id = 420')
  2662.             )
  2663.             ->andWhere('a.id IN (:p_ids)')
  2664.             ->setParameter('p_ids'$rowIds);
  2665.         $exhibitionRows $exhibitionBuilder->getQuery()->getArrayResult();
  2666.         $exhibitionResult = [];
  2667.         foreach ($exhibitionRows as $exhibitionRow) {
  2668.             $exhibitionResult[$exhibitionRow['id']][] = $exhibitionRow['name'];
  2669.         }
  2670.         // Ищем награды
  2671.         $awardsBuilder $this->createQueryBuilder('a');
  2672.         $awardsBuilder->select('a.id''filters.name')
  2673.             ->leftJoin('a.collection''collection')
  2674.             ->leftJoin('collection.filters''filters')
  2675.             ->innerJoin(
  2676.                 'filters.groups',
  2677.                 'groups',
  2678.                 Expr\Join::WITH,
  2679.                 $awardsBuilder->expr()->andX('groups.id = 417 AND filters.id <> 10546')
  2680.             ) // убираем фильтр 10546 где название "Премированые"
  2681.             ->andWhere('a.id IN (:p_ids)')
  2682.             ->setParameter('p_ids'$rowIds);
  2683.         $awardsRows $awardsBuilder->getQuery()->getArrayResult();
  2684.         $awardsResult = [];
  2685.         foreach ($awardsRows as $awardsRow) {
  2686.             $awardsResult[$awardsRow['id']][] = $awardsRow['name'];
  2687.         }
  2688.         // Ищем отзывы
  2689.         $reviewBuilder $this->createQueryBuilder('a');
  2690.         $reviewBuilder->select(
  2691.             'a.id',
  2692.             'filter_page.nameSingleEn',
  2693.             'filter_page.nameSingleIt',
  2694.             'filter_page.nameSingleEs',
  2695.             'filter_page.nameSingleFr',
  2696.             'filter_page.nameSingleDe',
  2697.             'filter_page.nameSinglePl',
  2698.             'filter_page.nameSingleUa',
  2699.             'filter_page.nameSingleRu',
  2700.             'filter_page.nameSingleSv',
  2701.             'filter_page.nameSingleDa'
  2702.         )
  2703.             ->leftJoin('a.collection''collection')
  2704.             ->leftJoin('collection.filters''filters')
  2705.             ->leftJoin('filters.page''filter_page')
  2706.             ->innerJoin('filters.groups''groups'Expr\Join::WITH$reviewBuilder->expr()->andX('groups.id = 419'))
  2707.             ->andWhere('a.id IN (:p_ids)')
  2708.             ->setParameter('p_ids'$rowIds);
  2709.         $reviewsRows $reviewBuilder->getQuery()->getArrayResult();
  2710.         $reviewsResult = [];
  2711.         foreach ($reviewsRows as $reviewsRow) {
  2712.             $reviewsResult[$reviewsRow['id']]['nameSingleEn'] = $reviewsRow['nameSingleEn'];
  2713.             $reviewsResult[$reviewsRow['id']]['nameSingleIt'] = $reviewsRow['nameSingleIt'];
  2714.             $reviewsResult[$reviewsRow['id']]['nameSingleEs'] = $reviewsRow['nameSingleEs'];
  2715.             $reviewsResult[$reviewsRow['id']]['nameSingleFr'] = $reviewsRow['nameSingleFr'];
  2716.             $reviewsResult[$reviewsRow['id']]['nameSingleDe'] = $reviewsRow['nameSingleDe'];
  2717.             $reviewsResult[$reviewsRow['id']]['nameSinglePl'] = $reviewsRow['nameSinglePl'];
  2718.             $reviewsResult[$reviewsRow['id']]['nameSingleUa'] = $reviewsRow['nameSingleUa'];
  2719.             $reviewsResult[$reviewsRow['id']]['nameSingleRu'] = $reviewsRow['nameSingleRu'];
  2720.             $reviewsResult[$reviewsRow['id']]['nameSingleSv'] = $reviewsRow['nameSingleSv'];
  2721.             $reviewsResult[$reviewsRow['id']]['nameSingleDa'] = $reviewsRow['nameSingleDa'];
  2722.         }
  2723.         // Совмещаем полученные много-ко-многим эффекты с артикулами
  2724.         foreach ($rows as &$row) {
  2725.             $row['textures'] = array_key_exists($row['id'], $textureResult) ? $textureResult[$row['id']] : [];
  2726.             $row['surfaces'] = array_key_exists($row['id'], $surfaceResult) ? $surfaceResult[$row['id']] : [];
  2727.             $row['colors'] = array_key_exists($row['id'], $colorsResult) ? $colorsResult[$row['id']] : [];
  2728.             $row['styles'] = array_key_exists($row['id'], $stylesResult) ? $stylesResult[$row['id']] : [];
  2729.             $row['motivs'] = array_key_exists($row['id'], $motivsResult) ? $motivsResult[$row['id']] : [];
  2730.             $row['applies'] = array_key_exists($row['id'], $applyResult) ? $applyResult[$row['id']] : [];
  2731.             $row['exhibitions'] = array_key_exists($row['id'], $exhibitionResult) ? $exhibitionResult[$row['id']] : [];
  2732.             $row['rewards'] = array_key_exists($row['id'], $awardsResult) ? $awardsResult[$row['id']] : [];
  2733.             $row['reviews'] = array_key_exists($row['id'], $reviewsResult) ? $reviewsResult[$row['id']] : [];
  2734.         }
  2735.         return $rows;
  2736.     }
  2737.     /**
  2738.      * @return ?array
  2739.      */
  2740.     public function getArticleForParseDesigner(): ?array
  2741.     {
  2742.         $q $this
  2743.             ->createQueryBuilder('a')
  2744.             ->select('a')
  2745.             ->andWhere('a.designerId IS NOT NULL');
  2746.         return $q->getQuery()->getResult();
  2747.     }
  2748.     private function getTranslateWithCheckToNull($field): string
  2749.     {
  2750.         if ($field['alias'] ?? null) {
  2751.             return App::trans($field['alias']);
  2752.         }
  2753.         return $field['name'] ?? '';
  2754.     }
  2755.     /**
  2756.      * Получение текстур для артикула
  2757.      */
  2758.     public function getTexturesForArticle(int $id): array
  2759.     {
  2760.         $q1 $this->createQueryBuilder('a')
  2761.             ->select(
  2762.                 '
  2763.                 t.id id,
  2764.                 t.alias texture'
  2765.             )
  2766.             ->leftJoin('a.textures''t')
  2767.             ->groupBy('t.id')
  2768.             ->andWhere('a.id = :id')
  2769.             ->andWhere('t.id IS NOT NULL')
  2770.             ->setParameter('id'$id);
  2771.         return $q1->getQuery()->useQueryCache(true)->getArrayResult();
  2772.     }
  2773.     /**
  2774.      * Получение текстур камня для артикула
  2775.      */
  2776.     public function getStoneTexturesForArticle(int $id): array
  2777.     {
  2778.         $qSub $this->createQueryBuilder('a')
  2779.             ->select(
  2780.                 '
  2781.                         st.id id,
  2782.                         st.alias texture'
  2783.             )
  2784.             ->leftJoin('a.stoneTextures''st')
  2785.             ->groupBy('st.id')
  2786.             ->andWhere('a.id = :id')
  2787.             ->andWhere('st.id IS NOT NULL')
  2788.             ->setParameter('id'$id);
  2789.         return $qSub->getQuery()->useQueryCache(true)->getArrayResult();
  2790.     }
  2791.     /**
  2792.      * Получение типа поверхности для артикула
  2793.      */
  2794.     public function getSurfaceForArticle(int $id): array
  2795.     {
  2796.         $q2 $this->createQueryBuilder('a')
  2797.             ->select(
  2798.                 '
  2799.                 sr.id surface_id,
  2800.                 sr.alias surface,
  2801.                 sl.id sliding_id,
  2802.                 sl.alias sliding'
  2803.             )
  2804.             ->leftJoin('a.surfaces''sr')
  2805.             ->leftJoin('a.sliding''sl')
  2806.             ->groupBy('sr.id')
  2807.             ->andWhere('a.id = :id')
  2808.             ->andWhere('sr.id IS NOT NULL')
  2809.             ->setParameter('id'$id);
  2810.         return $q2->getQuery()->useQueryCache(true)->getArrayResult();
  2811.     }
  2812.     /**
  2813.      * Получение типа поверхности для артикула для fids коллекции
  2814.      */
  2815.     public function getSurfaceForArticleFromColl(int $id): array
  2816.     {
  2817.         $q2 $this->createQueryBuilder('a')
  2818.             ->select(
  2819.                 '
  2820.                 sr.id id,
  2821.                 sr.alias alias,
  2822.                 sr.alias name'
  2823.             )
  2824.             ->leftJoin('a.surfaces''sr')
  2825.             ->leftJoin('a.sliding''sl')
  2826.             ->groupBy('sr.id')
  2827.             ->andWhere('a.id = :id')
  2828.             ->andWhere('sr.id IS NOT NULL')
  2829.             ->setParameter('id'$id);
  2830.         return $q2->getQuery()->useQueryCache(true)->getArrayResult();
  2831.     }
  2832.     /**
  2833.      * Получение мотивов для артикула
  2834.      */
  2835.     public function getMotivesForArticle(int $id): array
  2836.     {
  2837.         $q3 $this->createQueryBuilder('a')
  2838.             ->select('m.id id, m.alias motive')
  2839.             ->leftJoin('a.motivs''m')
  2840.             ->groupBy('m.id')
  2841.             ->andWhere('a.id = :id')
  2842.             ->andWhere('m.id IS NOT NULL')
  2843.             ->andWhere('m.hide =0')
  2844.             ->setParameter('id'$id);
  2845.         return $q3->getQuery()->useQueryCache(true)->getArrayResult();
  2846.     }
  2847.     /**
  2848.      * Получение стиля для артикула
  2849.      */
  2850.     public function getStyleForArticle(int $id): array
  2851.     {
  2852.         $q4 $this->createQueryBuilder('a')
  2853.             ->select('s.id id, s.alias style')
  2854.             ->leftJoin('a.styles''s')
  2855.             ->groupBy('s.id')
  2856.             ->andWhere('a.id = :id')
  2857.             ->andWhere('s.id IS NOT NULL')
  2858.             ->setParameter('id'$id);
  2859.         return $q4->getQuery()->useQueryCache(true)->getArrayResult();
  2860.     }
  2861.     /**
  2862.      * Получение цветов фабрики для артикула
  2863.      */
  2864.     public function getColorsForArticle(int $id): array
  2865.     {
  2866.         $q5 $this->createQueryBuilder('a')
  2867.             ->select('fc.name name')
  2868.             ->leftJoin('a.factoryColors''fc')
  2869.             ->groupBy('fc.id')
  2870.             ->andWhere('a.id = :id')
  2871.             ->setParameter('id'$id);
  2872.         return $q5->getQuery()->useQueryCache(true)->getArrayResult();
  2873.     }
  2874.     /**
  2875.      * Получение Материала фабрики для артикула
  2876.      */
  2877.     public function getMaterialForArticle(int $id): array
  2878.     {
  2879.         $q5 $this->createQueryBuilder('a')
  2880.             ->select('fc.alias alias')
  2881.             ->leftJoin('a.materials''fc')
  2882.             ->groupBy('fc.id')
  2883.             ->andWhere('a.id = :id')
  2884.             ->setParameter('id'$id);
  2885.         return $q5->getQuery()->useQueryCache(true)->getArrayResult();
  2886.     }
  2887.     /**
  2888.      * Получение формы чипа для артикула
  2889.      */
  2890.     public function getShapesForArticle(int $id): array
  2891.     {
  2892.         $q6 $this->createQueryBuilder('a')
  2893.             ->select('tsh.alias alias')
  2894.             ->leftJoin('a.tesseraShapes''tsh')
  2895.             ->where('tsh.alias IS NOT NULL')
  2896.             ->andWhere('a.id = :id')
  2897.             ->andWhere('tsh.hide =0')
  2898.             ->setParameter('id'$id);
  2899.         return $q6->getQuery()->useQueryCache(true)->getArrayResult();
  2900.     }
  2901.     /**
  2902.      * Получение типа края для артикула
  2903.      */
  2904.     public function getEdgeTypeForArticle(int $id): array
  2905.     {
  2906.         $q7 $this->createQueryBuilder('a')
  2907.             ->select('ets.id id, ets.alias alias')
  2908.             ->leftJoin('a.edgeTypes''ets')
  2909.             ->andWhere('ets.id IS NOT NULL')
  2910.             ->andWhere('a.id = :id')
  2911.             ->setParameter('id'$id);
  2912.         return $q7->getQuery()->useQueryCache(true)->getArrayResult();
  2913.     }
  2914.     /**
  2915.      * Получаем список статей (артикулов) для генерации sitemap.
  2916.      */
  2917.     public function findArticlesForSitemap(): array
  2918.     {
  2919.         return $this->createQueryBuilder('a')
  2920.             ->select('a, c, f')
  2921.             ->leftJoin('a.collection''c')
  2922.             ->leftJoin('c.factory''f')
  2923.             ->andWhere('f.url != :factoryTesting')
  2924.             ->setParameter('factoryTesting''testing-factory')
  2925.             ->andWhere('a.file IS NOT NULL')
  2926.             ->andWhere('c.status = 1')
  2927.             ->andWhere('f.status = 1')
  2928.             ->andWhere('a.priceEuro > 0')
  2929.             ->andWhere('a.delivery != 6')
  2930.             ->getQuery()
  2931.             ->getResult();
  2932.     }
  2933.     public function getArticleFromCompare($params, ?bool $file true, ?bool $full false): ?array
  2934.     {
  2935.         $articles $this->getArticleCompare($params$file$full);
  2936.         return $this->orderArticlesOpt($articles$params['offset'] ?? 0);
  2937.     }
  2938.     private function getArticleCompare($params, ?bool $file true, ?bool $full false): ?array
  2939.     {
  2940.         $status = (!empty($params['status'])) ? $params['status'] : null;
  2941.         $isInterior = (!empty($params['interior'])) ? $params['interior'] : null;
  2942.         $oneSlide = (!empty($params['oneSlide'])) ? $params['oneSlide'] : null;
  2943.         $rsm = new ResultSetMapping();
  2944.         $rsm->addEntityResult('WebBundle\Entity\Article''a');
  2945.         $rsm->addFieldResult('a''id''id');
  2946.         $rsm->addFieldResult('a''code''code');
  2947.         $rsm->addFieldResult('a''name''name');
  2948.         $rsm->addFieldResult('a''alternate_name''alternateName');
  2949.         $rsm->addFieldResult('a''file''file');
  2950.         $rsm->addFieldResult('a''not_sample''notSample');
  2951.         $rsm->addFieldResult('a''scheme''scheme');
  2952.         $rsm->addFieldResult('a''size_x''sizeX');
  2953.         $rsm->addFieldResult('a''size_y''sizeY');
  2954.         $rsm->addFieldResult('a''size_z''sizeZ');
  2955.         $rsm->addFieldResult('a''file_size3_x''fileSize3X');
  2956.         $rsm->addFieldResult('a''file_size3_y''fileSize3Y');
  2957.         $rsm->addFieldResult('a''file_size8_x''fileSize8X');
  2958.         $rsm->addFieldResult('a''file_size8_y''fileSize8Y');
  2959.         $rsm->addFieldResult('a''type_constraint''typeConstraint');
  2960.         $rsm->addFieldResult('a''packaging_count''packagingCount');
  2961.         $rsm->addFieldResult('a''packaging_count_ft''packagingCountFt');
  2962.         $rsm->addFieldResult('a''packaging_count_pc''packagingCountPC');
  2963.         $rsm->addFieldResult('a''reserve''reserve');
  2964.         $rsm->addFieldResult('a''price_prx''pricePrx');
  2965.         $rsm->addFieldResult('a''pallet''pallet');
  2966.         $rsm->addFieldResult('a''pallet_ft''palletFt');
  2967.         $rsm->addFieldResult('a''min_order''minOrder');
  2968.         $rsm->addFieldResult('a''m2one_ps''m2OnePs');
  2969.         $rsm->addFieldResult('a''multiple_pallet''multiplePallet');
  2970.         $rsm->addFieldResult('a''urla''url');
  2971.         $rsm->addFieldResult('a''background_white''backgroundWhite');
  2972.         $rsm->addFieldResult('a''image_setting''imageSetting');
  2973.         $rsm->addFieldResult('a''file_edit''fileEdit');
  2974.         $rsm->addFieldResult('a''comment_scheme_image''commentSchemeImage');
  2975. //        $rsm->addFieldResult(
  2976. //            'a',
  2977. //            'description_' . LocaleHelper::getCurLocale(),
  2978. //            'description' . StrHelper::ucFirst(LocaleHelper::getCurLocale())
  2979. //        );
  2980. //        if (LocaleHelper::getCurLocale() != 'en') {
  2981. //            $rsm->addFieldResult('a', 'description_en', 'descriptionEn');
  2982. //        }
  2983.         $rsm->addJoinedEntityResult('FlexApp\Entity\Article\ArticleDescriptionEntity''descrip''a''descriptions');
  2984.         $rsm->addFieldResult('descrip''descrip_id''id');
  2985.         $rsm->addFieldResult('descrip''descrip_description''description');
  2986.         $rsm->addJoinedEntityResult('FlexApp\Entity\LocaleEntity''loc''descrip''locale');
  2987.         $rsm->addFieldResult('loc''locale_id''id');              // 🔴 обязательно!
  2988.         $rsm->addFieldResult('loc''locale_code''code');
  2989.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListDelivery''ld''a''delivery');
  2990.         $rsm->addFieldResult('ld''ld_id''id');
  2991.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasure''lms''a''measure');
  2992.         $rsm->addFieldResult('lms''lms_id''id');
  2993.         $rsm->addFieldResult('lms''lms_alias''alias');
  2994.         $rsm->addFieldResult('lms''lms_name''name');
  2995.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListMaterial''lmt''a''material');
  2996.         $rsm->addFieldResult('lmt''lmt_id''id');
  2997.         $rsm->addFieldResult('lmt''lmt_name''name');
  2998.         $rsm->addFieldResult('lmt''lmt_alias''alias');
  2999.         $rsm->addJoinedEntityResult('WebBundle\Entity\ArticlePriceDiscount''apd''a''priceDiscounts');
  3000.         $rsm->addFieldResult('apd''apd_id''id');
  3001.         $rsm->addFieldResult('apd''apd_amount''amount');
  3002.         $rsm->addFieldResult('apd''apd_amount_ft''amountFt');
  3003.         $rsm->addFieldResult('apd''apd_fold''fold');
  3004.         $rsm->addJoinedEntityResult('WebBundle\Entity\Collection''acl''a''collection');
  3005.         $rsm->addFieldResult('acl''acl_id''id');
  3006.         $rsm->addFieldResult('acl''acl_url''url');
  3007.         $rsm->addFieldResult('acl''acl_name''name');
  3008.         $rsm->addFieldResult('acl''acl_aname''alternateName');
  3009.         $rsm->addFieldResult('acl''acl_status''status');
  3010.         $rsm->addFieldResult('acl''acl_process''process');
  3011.         $rsm->addFieldResult('acl''acl_settings''settings');
  3012.         $rsm->addJoinedEntityResult('WebBundle\Entity\Factory''acf''acl''factory');
  3013.         $rsm->addFieldResult('acf''acf_id''id');
  3014.         $rsm->addFieldResult('acf''acf_url''url');
  3015.         $rsm->addFieldResult('acf''acf_name''name');
  3016.         $rsm->addFieldResult('acf''acf_aname''alternateName');
  3017.         $rsm->addFieldResult('acf''acf_suspended''suspended');
  3018.         $rsm->addFieldResult('acf''acf_status''status');
  3019.         $rsm->addFieldResult('acf''acf_stated_at''statedAt');
  3020.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListCountry''lcnt''acf''country');
  3021.         $rsm->addFieldResult('lcnt''lcnt_id''id');
  3022.         $rsm->addFieldResult('lcnt''lcnt_code''code');
  3023.         $rsm->addFieldResult('lcnt''lcnt_alias''alias');
  3024.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListFactoryColor''lfc''a''factoryColors');
  3025.         $rsm->addFieldResult('lfc''lfc_id''id');
  3026.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListTexture''ltx''a''textures');
  3027.         $rsm->addFieldResult('ltx''ltx_id''id');
  3028.         $rsm->addFieldResult('ltx''ltx_alias''alias');
  3029.         $rsm->addFieldResult('ltx''ltx_name''name');
  3030.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListStyle''ls''a''styles');
  3031.         $rsm->addFieldResult('ls''ls_id''id');
  3032.         $rsm->addFieldResult('ls''ls_alias''alias');
  3033.         $rsm->addFieldResult('ls''ls_name''name');
  3034.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListSurface''lsf''a''surface');
  3035.         $rsm->addFieldResult('lsf''lsf_id''id');
  3036.         $rsm->addFieldResult('lsf''lsf_alias''alias');
  3037.         $rsm->addFieldResult('lsf''lsf_name''name');
  3038.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListType''lt''a''type');
  3039.         $rsm->addFieldResult('lt''lt_id''id');
  3040.         $rsm->addFieldResult('lt''lt_alias''alias');
  3041.         $rsm->addFieldResult('lt''lt_name''name');
  3042.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListMotiv''llm''a''motivs');
  3043.         $rsm->addFieldResult('llm''llm_id''id');
  3044.         $rsm->addFieldResult('llm''llm_alias''alias');
  3045.         $rsm->addFieldResult('llm''llm_name''name');
  3046.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListShape''lsh''a''shape');
  3047.         $rsm->addFieldResult('lsh''lsh_id''id');
  3048.         $rsm->addFieldResult('lsh''lsh_alias''alias');
  3049.         $rsm->addFieldResult('lsh''lsh_name''name');
  3050.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListMeasureSize''lmss''a''measurementSize');
  3051.         $rsm->addFieldResult('lmss''lmss_id''id');
  3052.         $rsm->addFieldResult('lmss''lmss_alias''alias');
  3053.         $rsm->addJoinedEntityResult('WebBundle\Entity\ListColor''lc''a''colors');
  3054.         $rsm->addFieldResult('lc''lc_id''id');
  3055.         $rsm->addFieldResult('lc''lc_alias''alias');
  3056.         $rsm->addFieldResult('lc''lc_name''name');
  3057.         $queryFields '';
  3058.         $queryJoin '';
  3059.         if ($isInterior) {
  3060.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListType''lt''a''type');
  3061.             $rsm->addFieldResult('lt''lt_id''id');
  3062.             $rsm->addJoinedEntityResult('WebBundle\Entity\Interior''aii''a''interiors');
  3063.             $rsm->addFieldResult('aii''aii_id''id');
  3064.             $rsm->addFieldResult('aii''aii_file''file');
  3065.             $rsm->addFieldResult('aii''aii_name''name');
  3066.             $rsm->addFieldResult('aii''aii_status''status');
  3067.             $rsm->addFieldResult('aii''aii_url''url');
  3068.             $rsm->addFieldResult('aii''aii_file_size_x''fileSizeX');
  3069.             $rsm->addFieldResult('aii''aii_file_size_y''fileSizeY');
  3070.             $rsm->addFieldResult('aii''ideaCount''ideasCount');
  3071.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListStyle''aii_istls''aii''styles');
  3072.             $rsm->addFieldResult('aii_istls''aii_istls_id''id');
  3073.             $rsm->addFieldResult('aii_istls''aii_istls_alias''alias');
  3074.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListTexture''aii_istlt''aii''textures');
  3075.             $rsm->addFieldResult('aii_istlt''aii_istlt_id''id');
  3076.             $rsm->addFieldResult('aii_istlt''aii_istlt_alias''alias');
  3077.             $rsm->addJoinedEntityResult('WebBundle\Entity\Collection''iacl''aii''collection');
  3078.             $rsm->addFieldResult('iacl''iacl_id''id');
  3079.             $rsm->addFieldResult('iacl''iacl_url''url');
  3080.             $rsm->addFieldResult('iacl''iacl_name''name');
  3081.             $rsm->addFieldResult('iacl''iacl_aname''alternateName');
  3082.             $rsm->addFieldResult('iacl''iacl_status''status');
  3083.             $rsm->addFieldResult('iacl''iacl_process''process');
  3084.             $rsm->addFieldResult('iacl''iacl_rating''rating');
  3085.             $rsm->addFieldResult('iacl''iacl_settings''settings');
  3086.             $rsm->addFieldResult('iacl''iacl_accessible''accessible');
  3087.             $rsm->addJoinedEntityResult('WebBundle\Entity\Factory''iacf''iacl''factory');
  3088.             $rsm->addFieldResult('iacf''iacf_id''id');
  3089.             $rsm->addFieldResult('iacf''iacf_url''url');
  3090.             $rsm->addFieldResult('iacf''iacf_name''name');
  3091.             $rsm->addFieldResult('iacf''iacf_aname''alternateName');
  3092.             $rsm->addFieldResult('iacf''iacf_suspended''suspended');
  3093.             $rsm->addFieldResult('iacf''iacf_status''status');
  3094.             $rsm->addFieldResult('iacf''iacf_stated_at''statedAt');
  3095.             $rsm->addJoinedEntityResult('WebBundle\Entity\ListCountry''iacflc''iacf''country');
  3096.             $rsm->addFieldResult('iacflc''iacflc_id''id');
  3097.             $rsm->addFieldResult('iacflc''iacflc_code''code');
  3098.             $rsm->addFieldResult('iacflc''iacflc_alias''alias');
  3099.             $rsm->addFieldResult('iacflc''iacflc_name''name');
  3100.             $queryFields '
  3101.                 lt.id as lt_id,
  3102.                 aii.id as aii_id,
  3103.                 aii.file as aii_file,
  3104.                 aii.name as aii_name,
  3105.                 aii.status as aii_status,
  3106.                 aii.url as aii_url,
  3107.                 aii.file_size_x as aii_file_size_x,
  3108.                 aii.file_size_y as aii_file_size_y,
  3109.                 (SELECT COUNT(ii.idea_id) FROM `idea_interior` ii WHERE `ii`.`interior_id` = `aii`.id) as ideaCount,
  3110.                 aii_istls.id as aii_istls_id,
  3111.                 aii_istls.alias as aii_istls_alias,
  3112.                 aii_istlt.id as aii_istlt_id,
  3113.                 aii_istlt.alias as aii_istlt_alias,
  3114.                 iacl.id as iacl_id,
  3115.                 iacl.url as iacl_url,
  3116.                 iacl.name as iacl_name,
  3117.                 iacl.alternate_name as iacl_aname,
  3118.                 iacl.status as iacl_status,
  3119.                 iacl.process as iacl_process,
  3120.                 iacl.rating as iacl_rating,
  3121.                 iacl.settings as iacl_settings,
  3122.                 iacl.accessible as iacl_accessible,
  3123.                 iacf.id as iacf_id,
  3124.                 iacf.url as iacf_url,
  3125.                 iacf.name as iacf_name,
  3126.                 iacf.alternate_name  as iacf_aname,
  3127.                 iacf.suspended as iacf_suspended,
  3128.                 iacf.status as iacf_status,
  3129.                 iacf.stated_at as iacf_stated_at,
  3130.                 iacflc.id as iacflc_id,
  3131.                 iacflc.code as iacflc_code,
  3132.                 iacflc.alias as iacflc_alias,
  3133.                 iacflc.name as iacflc_name,
  3134.             ';
  3135.             $queryJoin '
  3136.             LEFT JOIN interior_article iarts ON iarts.article_id = a.id AND a.delivery <> 6
  3137.             LEFT JOIN interior aii ON aii.id = iarts.interior_id AND a.delivery <> 6 AND aii.collection IS NOT NULL and a.collection=aii.collection            LEFT JOIN interior aii ON aii.id = iarts.interior_id AND a.delivery <> 6 AND aii.collection IS NOT NULL
  3138.             LEFT JOIN collection iacl ON iacl.id = aii.collection
  3139.             LEFT JOIN factory iacf ON iacf.id = iacl.factory
  3140.             LEFT JOIN list_country iacflc ON iacflc.id = iacf.country
  3141.             LEFT JOIN interior_style ist ON ist.interior_id = aii.id
  3142.             LEFT JOIN list_style aii_istls ON aii_istls.id = ist.style_id
  3143.             LEFT JOIN interior_texture istt ON istt.interior_id = aii.id
  3144.             LEFT JOIN list_texture aii_istlt ON aii_istlt.id = istt.texture_id
  3145.             ';
  3146.         }
  3147.         // Собираем необходимые поля цен
  3148.         switch (LocaleHelper::getCurCountry()) {
  3149.             case 'de':
  3150.                 $priceList = [
  3151.                     'price' => 'price_euro_de',
  3152.                     'price_mq' => 'price_mq_euro_de',
  3153.                     'price_ue' => null,
  3154.                     'price_mq_ue' => null,
  3155.                     'apd_price' => 'price_euro_de',
  3156.                     'apd_price_ue' => null,
  3157.                     'prMin' => 'pr_min_euro_de',
  3158.                     'prMinUe' => null,
  3159.                     'prMinF' => null,
  3160.                     'prMinUeF' => null
  3161.                 ];
  3162.                 break;
  3163.             case 'at':
  3164.                 $priceList = [
  3165.                     'price' => 'price_euro_at',
  3166.                     'price_mq' => 'price_mq_euro_at',
  3167.                     'price_ue' => null,
  3168.                     'price_mq_ue' => null,
  3169.                     'apd_price' => 'price_euro_at',
  3170.                     'apd_price_ue' => null,
  3171.                     'prMin' => 'pr_min_euro_at',
  3172.                     'prMinUe' => null,
  3173.                     'prMinF' => null,
  3174.                     'prMinUeF' => null
  3175.                 ];
  3176.                 break;
  3177.             case 'fi':
  3178.                 $priceList = [
  3179.                     'price' => 'price_euro_fi',
  3180.                     'price_mq' => 'price_mq_euro_fi',
  3181.                     'price_ue' => null,
  3182.                     'price_mq_ue' => null,
  3183.                     'apd_price' => 'price_euro_fi',
  3184.                     'apd_price_ue' => null,
  3185.                     'prMin' => 'pr_min_euro_fi',
  3186.                     'prMinUe' => null,
  3187.                     'prMinF' => null,
  3188.                     'prMinUeF' => null
  3189.                 ];
  3190.                 break;
  3191.             case 'fr':
  3192.                 $priceList = [
  3193.                     'price' => 'price_euro_fr',
  3194.                     'price_mq' => 'price_mq_euro_fr',
  3195.                     'price_ue' => null,
  3196.                     'price_mq_ue' => null,
  3197.                     'apd_price' => 'price_euro_fr',
  3198.                     'apd_price_ue' => null,
  3199.                     'prMin' => 'pr_min_euro_fr',
  3200.                     'prMinUe' => null,
  3201.                     'prMinF' => null,
  3202.                     'prMinUeF' => null
  3203.                 ];
  3204.                 break;
  3205.             case 'it':
  3206.                 $priceList = [
  3207.                     'price' => 'price_euro_it',
  3208.                     'price_mq' => 'price_mq_euro_it',
  3209.                     'price_ue' => null,
  3210.                     'price_mq_ue' => null,
  3211.                     'apd_price' => 'price_euro_it',
  3212.                     'apd_price_ue' => null,
  3213.                     'prMin' => 'pr_min_euro_it',
  3214.                     'prMinUe' => null,
  3215.                     'prMinF' => null,
  3216.                     'prMinUeF' => null
  3217.                 ];
  3218.                 break;
  3219.             case 'be':
  3220.                 $priceList = [
  3221.                     'price' => 'price_euro_be',
  3222.                     'price_mq' => 'price_mq_euro_be',
  3223.                     'price_ue' => null,
  3224.                     'price_mq_ue' => null,
  3225.                     'apd_price' => 'price_euro_be',
  3226.                     'apd_price_ue' => null,
  3227.                     'prMin' => 'pr_min_euro_be',
  3228.                     'prMinUe' => null,
  3229.                     'prMinF' => null,
  3230.                     'prMinUeF' => null
  3231.                 ];
  3232.                 break;
  3233.             case 'ie':
  3234.                 $priceList = [
  3235.                     'price' => 'price_euro_ie',
  3236.                     'price_mq' => 'price_mq_euro_ie',
  3237.                     'price_ue' => null,
  3238.                     'price_mq_ue' => null,
  3239.                     'apd_price' => 'price_euro_ie',
  3240.                     'apd_price_ue' => null,
  3241.                     'prMin' => 'pr_min_euro_ie',
  3242.                     'prMinUe' => null,
  3243.                     'prMinF' => null,
  3244.                     'prMinUeF' => null
  3245.                 ];
  3246.                 break;
  3247.             case 'nl':
  3248.                 $priceList = [
  3249.                     'price' => 'price_euro_nl',
  3250.                     'price_mq' => 'price_mq_euro_nl',
  3251.                     'price_ue' => null,
  3252.                     'price_mq_ue' => null,
  3253.                     'apd_price' => 'price_euro_nl',
  3254.                     'apd_price_ue' => null,
  3255.                     'prMin' => 'pr_min_euro_nl',
  3256.                     'prMinUe' => null,
  3257.                     'prMinF' => null,
  3258.                     'prMinUeF' => null
  3259.                 ];
  3260.                 break;
  3261.             case 'es':
  3262.                 $priceList = [
  3263.                     'price' => 'price_euro_es',
  3264.                     'price_mq' => 'price_mq_euro_es',
  3265.                     'price_ue' => null,
  3266.                     'price_mq_ue' => null,
  3267.                     'apd_price' => 'price_euro_es',
  3268.                     'apd_price_ue' => null,
  3269.                     'prMin' => 'pr_min_euro_es',
  3270.                     'prMinUe' => null,
  3271.                     'prMinF' => null,
  3272.                     'prMinUeF' => null
  3273.                 ];
  3274.                 break;
  3275.             case 'gb':
  3276.                 $priceList = [
  3277.                     'price' => 'price_GBP',
  3278.                     'price_mq' => 'price_mq_GBP',
  3279.                     'price_ue' => 'price_GBE',
  3280.                     'price_mq_ue' => 'price_mq_GBE',
  3281.                     'apd_price' => 'price_GBP',
  3282.                     'apd_price_ue' => 'price_GBE',
  3283.                     'prMin' => 'pr_min_GBP',
  3284.                     'prMinUe' => 'pr_min_GBE',
  3285.                     'prMinF' => null,
  3286.                     'prMinUeF' => null
  3287.                 ];
  3288.                 break;
  3289.             case 'us':
  3290.                 $priceList = [
  3291.                     'price' => 'price_USD',
  3292.                     'price_mq' => 'price_mq_USD',
  3293.                     'price_fq' => 'price_fq_USD',
  3294.                     'price_ue' => 'price_USE',
  3295.                     'price_mq_ue' => 'price_mq_USE',
  3296.                     'price_fq_ue' => 'price_fq_USD',
  3297.                     'apd_price' => 'price_USD',
  3298.                     'apd_price_fq' => 'price_fq_USD',
  3299.                     'apd_price_ue' => 'price_USE',
  3300.                     'apd_price_fq_ue' => 'price_fq_USE',
  3301.                     'prMin' => 'pr_min_USD',
  3302.                     'prMinUe' => 'pr_min_USE',
  3303.                     'prMinF' => 'pr_min_f_USD',
  3304.                     'prMinUeF' => 'pr_min_f_USE',
  3305.                 ];
  3306.                 break;
  3307.             case 'ca':
  3308.                 $priceList = [
  3309.                     'price' => 'price_CAD',
  3310.                     'price_mq' => 'price_mq_CAD',
  3311.                     'price_fq' => 'price_fq_CAD',
  3312.                     'price_ue' => 'price_CAE',
  3313.                     'price_mq_ue' => 'price_mq_CAE',
  3314.                     'price_fq_ue' => 'price_fq_CAE',
  3315.                     'apd_price' => 'price_CAD',
  3316.                     'apd_price_fq' => 'price_fq_CAD',
  3317.                     'apd_price_ue' => 'price_CAE',
  3318.                     'apd_price_fq_ue' => 'price_fq_CAE',
  3319.                     'prMin' => 'pr_min_CAD',
  3320.                     'prMinUe' => 'pr_min_CAE',
  3321.                     'prMinF' => 'pr_min_f_USD',
  3322.                     'prMinUeF' => 'pr_min_f_USE'
  3323.                 ];
  3324.                 break;
  3325.             case 'ch':
  3326.                 $priceList = [
  3327.                     'price' => 'price_CHF',
  3328.                     'price_mq' => 'price_mq_CHF',
  3329.                     'price_ue' => 'price_CHE',
  3330.                     'price_mq_ue' => 'price_mq_CHE',
  3331.                     'apd_price' => 'price_CHF',
  3332.                     'apd_price_ue' => 'price_CHE',
  3333.                     'prMin' => 'pr_min_CHF',
  3334.                     'prMinUe' => 'pr_min_CHE',
  3335.                     'prMinF' => null,
  3336.                     'prMinUeF' => null
  3337.                 ];
  3338.                 break;
  3339.             case 'se':
  3340.                 $priceList = [
  3341.                     'price' => 'price_SEK',
  3342.                     'price_mq' => 'price_mq_SEK',
  3343.                     'price_ue' => 'price_SEE',
  3344.                     'price_mq_ue' => 'price_mq_SEE',
  3345.                     'apd_price' => 'price_SEK',
  3346.                     'apd_price_ue' => 'price_SEE',
  3347.                     'prMin' => 'pr_min_SEK',
  3348.                     'prMinUe' => 'pr_min_SEE',
  3349.                     'prMinF' => null,
  3350.                     'prMinUeF' => null
  3351.                 ];
  3352.                 break;
  3353.             case 'dk':
  3354.                 $priceList = [
  3355.                     'price' => 'price_DKK',
  3356.                     'price_mq' => 'price_mq_DKK',
  3357.                     'price_ue' => 'price_DKE',
  3358.                     'price_mq_ue' => 'price_mq_DKE',
  3359.                     'apd_price' => 'price_DKK',
  3360.                     'apd_price_ue' => 'price_DKE',
  3361.                     'prMin' => 'pr_min_DKK',
  3362.                     'prMinUe' => 'pr_min_DKE',
  3363.                     'prMinF' => null,
  3364.                     'prMinUeF' => null
  3365.                 ];
  3366.                 break;
  3367.             case 'no':
  3368.                 $priceList = [
  3369.                     'price' => 'price_NOK',
  3370.                     'price_mq' => 'price_mq_NOK',
  3371.                     'price_ue' => 'price_NOE',
  3372.                     'price_mq_ue' => 'price_mq_NOE',
  3373.                     'apd_price' => 'price_NOK',
  3374.                     'apd_price_ue' => 'price_NOE',
  3375.                     'prMin' => 'pr_min_NOK',
  3376.                     'prMinUe' => 'pr_min_NOE',
  3377.                     'prMinF' => null,
  3378.                     'prMinUeF' => null
  3379.                 ];
  3380.                 break;
  3381.             case 'pl':
  3382.                 $priceList = [
  3383.                     'price' => 'price_PLN',
  3384.                     'price_mq' => 'price_mq_PLN',
  3385.                     'price_ue' => 'price_PLE',
  3386.                     'price_mq_ue' => 'price_mq_PLE',
  3387.                     'apd_price' => 'price_PLN',
  3388.                     'apd_price_ue' => 'price_PLE',
  3389.                     'prMin' => 'pr_min_PLN',
  3390.                     'prMinUe' => 'pr_min_PLE',
  3391.                     'prMinF' => null,
  3392.                     'prMinUeF' => null
  3393.                 ];
  3394.                 break;
  3395.             default:
  3396.                 $priceList = [
  3397.                     'price' => 'price_euro',
  3398.                     'price_mq' => 'price_mq_euro',
  3399.                     'price_ue' => null,
  3400.                     'price_mq_ue' => null,
  3401.                     'apd_price' => 'price_euro',
  3402.                     'apd_price_ue' => null,
  3403.                     'prMin' => 'pr_min_euro',
  3404.                     'prMinUe' => null,
  3405.                     'prMinF' => null,
  3406.                     'prMinUeF' => null
  3407.                 ];
  3408.         }
  3409.         $priceSQL '';
  3410.         // Формируем выборку цен
  3411.         foreach ($priceList as $key => $price) {
  3412.             if (!$price) {
  3413.                 continue;
  3414.             }
  3415.             $columnName lcfirst(
  3416.                 str_replace(' '''ucwords(str_replace('_'' '$price)))
  3417.             );
  3418.             $price strtolower($price);
  3419.             if (in_array($key, ['apd_price''apd_price_ue''apd_price_fq''apd_price_fq_ue'])) {
  3420.                 $alias 'apd';
  3421.                 $priceSQL .= 'apd.' $price ' as apd_' $price ', ';
  3422.             } elseif (in_array($key, ['prMin''prMinUe''prMinF''prMinUeF'])) {
  3423.                 $alias 'acl';
  3424.                 $priceSQL .= 'acl.' $price ' as acl_' $price ', ';
  3425.                 if ($isInterior) {
  3426.                     $queryFields .= ' iacl.' $price ' as iacl_' $price ', ';
  3427.                     $rsm->addFieldResult('iacl''iacl_' $price$columnName);
  3428.                 }
  3429.             } else {
  3430.                 $alias 'a';
  3431.                 $priceSQL .= 'a.' $price ' as a_' $price ', ';
  3432.             }
  3433.             $rsm->addFieldResult($alias$alias '_' $price$columnName);
  3434.         }
  3435.         if (empty($params['isFreezed'])) {
  3436.             if (is_numeric($full)) {
  3437.                 $where ' AND (ld.id <> 6 OR a.id = ' $full ')';
  3438.             } elseif ($full) {
  3439.                 $where ' AND (ld.id <> 6 OR a.urla = "' $full '")';
  3440.             } else {
  3441.                 $where ' AND ld.id <> 6';
  3442.             }
  3443.         } else {
  3444.             $where '';
  3445.         }
  3446.         if ($status == BiConst::STATE_DISCONTINUED) {
  3447.             $where '';
  3448.         }
  3449.         if (!empty($params['collection'])) {
  3450.             $where .= ' AND a.collection = \'' $params['collection'] . '\'';
  3451.         }
  3452.         if (!empty($params['items'])) {
  3453.             $where .= ' AND a.id IN (\'' join('\',\''$params['items']) . '\')';
  3454.         }
  3455.         if (!empty($params['notItems'])) {
  3456.             $where .= ' AND a.id NOT IN (\'' join('\',\''$params['notItems']) . '\')';
  3457.         }
  3458.         if (!empty($params['cStatus'])) {
  3459.             $where .= ' AND acl.status IN (\'' join('\',\''$params['cStatus']) . '\')';
  3460.         }
  3461.         if (!empty($params['fStatus'])) {
  3462.             $where .= ' AND acf.status IN (\'' join('\',\''$params['fStatus']) . '\')';
  3463.         }
  3464.         $country $params['country'] ?? App::getCurCountry();
  3465.         $cur '_euro';
  3466.         if (
  3467.             CookieHelper::get(CookieKeysConstant::CURRENCY)
  3468.             && CookieHelper::get(CookieKeysConstant::CURRENCY) != 'EUR'
  3469.             && CookieHelper::get(CookieKeysConstant::CURRENCY) != 'HKD'
  3470.             && CookieHelper::get(CookieKeysConstant::CURRENCY) != 'SGD'
  3471.         ) {
  3472.             $cur '_' StrHelper::toLower(CookieHelper::get(CookieKeysConstant::CURRENCY));
  3473.         } elseif ($country == 'de') {
  3474.             $cur '_euro_de';
  3475.         } elseif ($country == 'at') {
  3476.             $cur '_euro_at';
  3477.         } elseif ($country == 'fi') {
  3478.             $cur '_euro_fi';
  3479.         } elseif ($country == 'fr') {
  3480.             $cur '_euro_fr';
  3481.         } elseif ($country == 'it') {
  3482.             $cur '_euro_it';
  3483.         } elseif ($country == 'be') {
  3484.             $cur '_euro_be';
  3485.         } elseif ($country == 'ie') {
  3486.             $cur '_euro_ie';
  3487.         } elseif ($country == 'nl') {
  3488.             $cur '_euro_nl';
  3489.         } elseif ($country == 'es') {
  3490.             $cur '_euro_es';
  3491.         }
  3492.         if ($oneSlide) {
  3493.             $oneSlideLimit ' limit 1 ';
  3494.         } else {
  3495.             $oneSlideLimit ' ';
  3496.         }
  3497.         if (isset($params['limit']) && isset($params['offset'])) {
  3498.             $portion ' LIMIT ' $params['limit'] . ' OFFSET ' $params['offset'];
  3499.             $sSqlCount 'SELECT a.id FROM article a
  3500.             LEFT JOIN list_type lt ON a.type = lt.id
  3501.             LEFT JOIN list_delivery ld ON a.delivery = ld.id
  3502.             LEFT JOIN list_measure lms ON a.measure = lms.id
  3503.             LEFT JOIN list_material lmt ON a.material = lmt.id
  3504.             LEFT JOIN list_surface lsf ON a.surface = lsf.id
  3505.             LEFT JOIN article_price_discount apd ON a.id = apd.article AND apd.price' $cur ' > 0
  3506.             LEFT JOIN article_color ac ON a.id = ac.article_id
  3507.             LEFT JOIN article_factory_color afc ON a.id = afc.article_id
  3508.             LEFT JOIN list_factory_color lfc ON lfc.id = afc.factory_color_id
  3509.             LEFT JOIN article_texture at ON a.id = at.article_id
  3510.             LEFT JOIN list_texture ltx ON ltx.id = at.texture_id
  3511.             LEFT JOIN list_style ls ON a.style = ls.id
  3512.             LEFT JOIN list_color lc ON lc.id = ac.color_id
  3513.             LEFT JOIN collection acl ON acl.id = a.collection
  3514.             LEFT JOIN factory acf ON acf.id = acl.factory
  3515.             LEFT JOIN list_country lcnt ON lcnt.id = acf.country
  3516.             LEFT JOIN article_motiv alm ON a.id = alm.article_id
  3517.             LEFT JOIN list_motiv llm ON llm.id = alm.motiv_id
  3518.             LEFT JOIN list_shape lsh ON lsh.id = a.shape
  3519.             LEFT JOIN article_detail ad         ON ad.article_id = a.id
  3520.             WHERE a.collection IS NOT NULL AND (a.price_euro > 0 OR ld.id = 6)' $where ' GROUP BY a.id
  3521.             ORDER BY lfc.name ASC, lt.sort DESC, a.size_x DESC, a.size_y DESC, apd.price_euro DESC, apd.amount DESC,
  3522.             a.scheme ASC, lc.id, lms.id, a.thick, a.id DESC' $portion;
  3523.             #todo ************************************************************************************************************************************
  3524.             $res App::em()->getConnection()
  3525.                 ->executeQuery(preg_replace('#[\s]+#'' '$sSqlCount))
  3526.                 ->fetchAllAssociative();
  3527.             if ($res && count($res) > 0) {
  3528.                 $ides array_unique(array_column($res'id'));
  3529.                 $where .= ' AND a.id IN (\'' join('\',\''$ides) . '\')';
  3530.             } else {
  3531.                 return [];
  3532.             }
  3533.         }
  3534.         LocaleHelper::getCurCountry();
  3535.         $sSql '
  3536.             SELECT
  3537.                 a.id,
  3538.                 a.code,
  3539.                 a.name,
  3540.                 a.not_sample,
  3541.                 a.alternate_name,
  3542.                 REPLACE(a.file, "~q~", "\'") AS file,
  3543.                 a.express_sample,
  3544.                 a.variant_image,
  3545.                 a.size_x,
  3546.                 a.size_y,
  3547.                 a.size_z,
  3548.                 a.file_size2_x,
  3549.                 a.file_size2_y,
  3550.                 a.file_size3_x,
  3551.                 a.file_size3_y,
  3552.                 a.file_size8_x,
  3553.                 a.file_size8_y,
  3554.                 a.type_constraint,
  3555.                 a.packaging_count,
  3556.                 a.packaging_count_ft,
  3557.                 a.packaging_count_pc,
  3558.                 a.price_prx,
  3559.                 a.pallet,
  3560.                 a.pallet_ft,
  3561.                 a.min_order,
  3562.                 a.m2one_ps,
  3563.                 a.multiple_pallet,
  3564.                 a.urla,
  3565.                 a.background_white,
  3566.                 a.border_grey,
  3567.                 a.image_setting,
  3568.                 a.file_w,
  3569.                 a.file_h,
  3570.                 a.file_w4000,
  3571.                 a.file_h4000,
  3572.                 a.scheme,
  3573.                 a.rotate,
  3574.                 a.file_rotation,
  3575.                 a.file_edit,
  3576.                 a.comment_scheme_image,
  3577.                         d.id AS descrip_id,
  3578.                         d.description AS descrip_description,
  3579.                          d.locale_id AS descrip_locale_id,
  3580.                          loc.id AS locale_id,
  3581.                          loc.code AS locale_code,
  3582.                 ad.id as ad_id,
  3583.                 ad.file as ad_file,
  3584.                 ad.picture_in_title as ad_picture_in_title,
  3585.                 ad.gtin as ad_gtin,
  3586.                 ad.file_size1_x as ad_file_size1_x,
  3587.                 ad.file_size1_y as ad_file_size1_y,
  3588.                 ad.file_size2_x as ad_file_size2_x,
  3589.                 ad.file_size2_y as ad_file_size2_y,
  3590.                 ad.file_size3_x as ad_file_size3_x,
  3591.                 ad.file_size3_y as ad_file_size3_y,
  3592.                 ad.file_size8_x as ad_file_size8_x,
  3593.                 ad.file_size8_y as ad_file_size8_y,
  3594.                 ad.file_size500_x as ad_file_size500_x,
  3595.                 ad.file_size500_y as ad_file_size500_y,
  3596.                 ad.file_size740_x as ad_file_size740_x,
  3597.                 ad.file_size740_y as ad_file_size740_y,
  3598.                 ad.file_size1_x as ad_file_size1_x,
  3599.                 ad.file_size1_y as ad_file_size1_y,
  3600.                 ad.description_' LocaleHelper::getCurLocale() . ' as ad_description_' LocaleHelper::getCurLocale() . ',
  3601.                 ' . (LocaleHelper::getCurLocale() != 'en' 'ad.description_en as ad_description_en,' '') . '
  3602.                 ad.comment as ad_comment,
  3603.                 ad.file_edit as ad_file_edit,
  3604.                 ad.image_setting as ad_image_setting,
  3605.                 ad.file_w as ad_file_w,
  3606.                 ad.file_h as ad_file_h,
  3607.                 ad.file_w4000 as ad_file_w4000,
  3608.                 ad.file_h4000 as ad_file_h4000,
  3609.                 ad.comment_scheme_image as ad_comment_scheme_image,
  3610.                 ad.variant_image as ad_variant_image,
  3611.                 ad.file_rotation as ad_file_rotation,
  3612.                 ad.rotate as ad_rotate,
  3613.                 ad.type_painting as ad_type_painting,
  3614.                 ad.big_size_scheme as ad_big_size_scheme,
  3615.                 ld.id as ld_id,
  3616.                 lt.id as lt_id,
  3617.                 lt.alias as lt_alias,
  3618.                 lt.name as lt_name,
  3619.                 lms.id as lms_id,
  3620.                 lms.alias as lms_alias,
  3621.                 lms.name as lms_name,
  3622.                 lmt.id as lmt_id,
  3623.                 lmt.alias as lmt_alias,
  3624.                 lmt.name as lmt_name,
  3625.                 lsf.id as lsf_id,
  3626.                 lsf.alias as lsf_alias,
  3627.                 lsf.name as lsf_name,
  3628.                 lfc.id as lfc_id,
  3629.                 ltx.id as ltx_id,
  3630.                 ltx.alias as ltx_alias,
  3631.                 ltx.name as ltx_name,
  3632.                 ls.id as ls_id,
  3633.                 ls.alias as ls_alias,
  3634.                 ls.name as ls_name,
  3635.                 lsh.id as lsh_id,
  3636.                 lsh.alias as lsh_alias,
  3637.                 lsh.name as lsh_name,
  3638.                 llm.id as llm_id,
  3639.                 llm.alias as llm_alias,
  3640.                 llm.name as llm_name,
  3641.                 lmss.id as lmss_id,
  3642.                 lmss.alias as lmss_alias,
  3643.                 apd.id as apd_id,
  3644.                 apd.amount as apd_amount,
  3645.                 apd.amount_ft as apd_amount_ft,
  3646.                 apd.fold as apd_fold,
  3647.                 acl.id as acl_id,
  3648.                 acl.url as acl_url,
  3649.                 acl.name as acl_name,
  3650.                 acl.alternate_name as acl_aname,
  3651.                 acl.status as acl_status,
  3652.                 acl.process as acl_process,
  3653.                 acl.settings as acl_settings,
  3654.                 acf.id as acf_id,
  3655.                 acf.url as acf_url,
  3656.                 acf.name as acf_name,
  3657.                 acf.alternate_name as acf_aname,
  3658.                 acf.status as acf_status,
  3659.                 acf.suspended as acf_suspended,
  3660.                 acf.stated_at as acf_stated_at,
  3661.                 ' $priceSQL '
  3662.                 ' $queryFields '
  3663.                 lcnt.id as lcnt_id,
  3664.                 lcnt.code as lcnt_code,
  3665.                 lcnt.alias as lcnt_alias,
  3666.                 lc.id as lc_id,
  3667.                 lc.name as lc_name,
  3668.                 lc.alias as lc_alias
  3669.             FROM
  3670.                 article a
  3671.             LEFT JOIN list_type lt ON a.type = lt.id
  3672.             LEFT JOIN list_delivery ld ON a.delivery = ld.id
  3673.             LEFT JOIN list_measure lms ON a.measure = lms.id
  3674.             LEFT JOIN list_material lmt ON a.material = lmt.id
  3675.             LEFT JOIN list_surface lsf ON a.surface = lsf.id
  3676.             LEFT JOIN article_price_discount apd ON a.id = apd.article AND apd.price' $cur ' > 0
  3677.             LEFT JOIN article_color ac ON a.id = ac.article_id
  3678.             LEFT JOIN list_color lc ON lc.id = ac.color_id
  3679.             LEFT JOIN article_factory_color afc ON a.id = afc.article_id
  3680.             LEFT JOIN list_factory_color lfc ON lfc.id = afc.factory_color_id
  3681.             LEFT JOIN article_texture at ON a.id = at.article_id
  3682.             LEFT JOIN list_texture ltx ON ltx.id = at.texture_id
  3683.             LEFT JOIN list_style ls ON a.style = ls.id
  3684.             LEFT JOIN collection acl ON acl.id = a.collection
  3685.             LEFT JOIN factory acf ON acf.id = acl.factory
  3686.             LEFT JOIN list_country lcnt ON lcnt.id = acf.country
  3687.             LEFT JOIN article_motiv alm ON a.id = alm.article_id
  3688.             LEFT JOIN list_motiv llm ON llm.id = alm.motiv_id
  3689.             LEFT JOIN list_shape lsh ON lsh.id = a.shape
  3690.             LEFT JOIN list_measure_size lmss ON a.measurement_size = lmss.id
  3691.             LEFT JOIN article_detail ad         ON ad.article_id = a.id
  3692. LEFT JOIN ng_article_description d ON d.article_id = a.id
  3693. LEFT JOIN ng_locale loc ON loc.id = d.locale_id
  3694.             ' $queryJoin '
  3695.             WHERE a.collection IS NOT NULL AND (a.price_euro > 0 OR a.delivery = 6)' $where .
  3696.             ' ORDER BY lfc.name ASC, lt.sort DESC, a.size_x DESC, a.size_y DESC, apd.price_euro DESC,' .
  3697.             ' apd.amount DESC, a.scheme ASC, lc.id, lms.id, a.thick, a.id DESC ' $oneSlideLimit;
  3698.         $query $this->_em->createNativeQuery($sSql$rsm);
  3699.         $result $query->getArrayResult();
  3700.         /**
  3701.          * Пробовал тут разные варианты сортировки, чтобы порядок записей был как в $sSqlCount,
  3702.          * например ORDER BY FIELD(a.id, ....), и все равно местами результат отличается.
  3703.          * Пришел к решению просто пересобрать массив в соответствии с порядком в $sSqlCount.
  3704.          * Это все для того, чтобы порядок артикулов был такой же, как и порядковый номер, когда открывается
  3705.          * страница с артикулом.
  3706.          */
  3707.         $finalResult = [];
  3708.         foreach ($result as $row) {
  3709.             // Клонируем все, что есть
  3710.             $item $row;
  3711.             // Добавляем поля descriptionXX
  3712.             if (!empty($row['descriptions']) && is_array($row['descriptions'])) {
  3713.                 foreach ($row['descriptions'] as $desc) {
  3714.                     if (!isset($desc['locale']['code']) || !isset($desc['description'])) {
  3715.                         continue;
  3716.                     }
  3717.                     $code strtolower($desc['locale']['code']); // например, 'ru'
  3718.                     $key 'description' ucfirst($code);        // descriptionRu
  3719.                     $item[$key] = $desc['description'];
  3720.                 }
  3721.                 unset($row['descriptions']);
  3722.             }
  3723.             // По желанию — гарантированное наличие английского
  3724.             if (!isset($item['descriptionEn'])) {
  3725.                 $item['descriptionEn'] = '';
  3726.             }
  3727.             $finalResult[] = $item;
  3728.         }
  3729.         //App::debugExit($finalResult);
  3730.         $result $finalResult;
  3731.         // При загрузке конкретного артикула, эти переменные не присваиваются.
  3732.         if (isset($res) && isset($ides)) {
  3733.             usort($result, function ($a$b) use ($ides) {
  3734.                 $posA array_search($a['id'], $ides);
  3735.                 $posB array_search($b['id'], $ides);
  3736.                 return $posA $posB;
  3737.             });
  3738.             return $result;
  3739.         }
  3740.         return $result;
  3741.     }
  3742.     public function getFilteredArticleIds(array $params): array
  3743.     {
  3744.         $qb $this->getEntityManager()->createQueryBuilder();
  3745.         $qb->select('a.id')
  3746.             ->from(Article::class, 'a')
  3747.             ->distinct();
  3748.         foreach ($params as $key => $value) {
  3749.             $this->buildQueryFromConfig($qb$key$value);
  3750.         }
  3751.         return $qb->getQuery()->getResult();
  3752.     }
  3753.     private function buildQueryFromConfig(QueryBuilder $qb$key, array $value): void
  3754.     {
  3755.         if (!isset(self::ARTICLE_QUERY_FILTER_MAPPING[$key])) {
  3756.             return;
  3757.         }
  3758.         $config self::ARTICLE_QUERY_FILTER_MAPPING[$key];
  3759.         $alias $config['alias'];
  3760.         $field $config['field'];
  3761.         if (in_array($key, ['width''length''thickness'])) {
  3762.             $this->addDimensions($qb$value$config);
  3763.             return;
  3764.         }
  3765.         if ($key === 'categoryPrice') {
  3766.             $this->addCategoryPrice($qb$value$config);
  3767.             return;
  3768.         }
  3769.         if ($key === 'edgeType') {
  3770.             if ($value === 'size_big') {
  3771.                 $qb->andWhere($qb->expr()->in("$alias.sizeBig"'1'));
  3772.                 return;
  3773.             }
  3774.             if ($value === 'thin_granite') {
  3775.                 $qb->andWhere($qb->expr()->in("$alias.thinGranite"'1'));
  3776.                 return;
  3777.             }
  3778.             if ($value === 'thick_granite') {
  3779.                 // Пропускаем, мы его отбираем через другие параметры "material IN (6, 23, 24) AND thick >= 17".
  3780.                 return;
  3781.             }
  3782.         }
  3783.         if (isset($config['join'])) {
  3784.             $path $config['join']['path'];
  3785.             if ($key === 'sample') {
  3786.                 $qb->innerJoin($path's''WITH''s.item = a.id');
  3787.                 $qb->andWhere($qb->expr()->isNotNull('s.item'));
  3788.                 return;
  3789.             }
  3790.             $qb->innerJoin($path$alias);
  3791.         }
  3792.         $qb->andWhere($qb->expr()->in("$alias.$field"":$key"))->setParameter($key$value);
  3793.     }
  3794.     private function addDimensions(QueryBuilder $qb, array $value, array $config): void
  3795.     {
  3796.         $alias $config['alias'];
  3797.         $field $config['field'];
  3798.         $from = (isset($value[0]) && is_numeric($value[0])) ? (float)$value[0] : 0.0;
  3799.         $to = (isset($value[1]) && is_numeric($value[1])) ? (float)$value[1] : 1000.0;
  3800.         $qb->andWhere($qb->expr()->between("$alias.$field"':from'':to'))
  3801.             ->setParameter('from'$from)
  3802.             ->setParameter('to'$to);
  3803.     }
  3804.     private function addCategoryPrice(QueryBuilder $qb, array $value, array $config): void
  3805.     {
  3806.         $alias $config['alias'];
  3807.         $field $config['field'];
  3808.         $rangeIndex 0// Ensure unique parameter names
  3809.         $orX $qb->expr()->orX();
  3810.         foreach ($value as $part) {
  3811.             $range explode('-'$part);
  3812.             if (isset($range[0]) && is_numeric($range[0]) && isset($range[1]) && is_numeric($range[1])) {
  3813.                 $fromParam ":from{$rangeIndex}";
  3814.                 $toParam ":to{$rangeIndex}";
  3815.                 // Add the BETWEEN condition for each range to the OR expression
  3816.                 $orX->add($qb->expr()->andX(
  3817.                     $qb->expr()->gte("$alias.$field"$fromParam),
  3818.                     $qb->expr()->lt("$alias.$field"$toParam)
  3819.                 ));
  3820.                 // Set the parameters for the range
  3821.                 $qb->setParameter($fromParam$range[0])
  3822.                     ->setParameter($toParam$range[1]);
  3823.                 $rangeIndex++;
  3824.             }
  3825.         }
  3826.         if ($orX->count() > 0) {
  3827.             $qb->andWhere($orX);
  3828.         }
  3829.     }
  3830.     /**
  3831.      * Retrieves articles data for Google Feed based on a list of article IDs.
  3832.      *
  3833.      * @param array $articleIds List of article IDs to fetch the relevant data.
  3834.      * @return array Returns an array of articles and their attributes.
  3835.      * @throws \Doctrine\DBAL\Driver\Exception|\Exception
  3836.      */
  3837.     public function getArticlesForGoogleFeed(array $articleIds): array
  3838.     {
  3839.         $qb $this->getEntityManager()->createQueryBuilder();
  3840.         $qb->select(
  3841.             'partial a.{ id, name, code, url, file } AS article',
  3842.             'articleType.alias AS type',
  3843.             'articleSurface.alias AS surface',
  3844.             'articleEdgeType.alias AS edgeType',
  3845.             'country.code AS countryCode',
  3846.             'm.alias AS material',
  3847.             'collection.url AS collectionUrl',
  3848.             'factory.name AS brand',
  3849.             'factoryColors.name AS color',
  3850.             'factory.url AS factoryUrl',
  3851.         )
  3852.             ->from(Article::class, 'a')
  3853.             ->innerJoin('a.material''m')
  3854.             ->innerJoin('a.surface''articleSurface')
  3855.             ->innerJoin('a.type''articleType')
  3856.             ->innerJoin('a.edgeType''articleEdgeType')
  3857.             ->innerJoin('a.factoryColors''factoryColors')
  3858.             ->innerJoin('a.collection''collection')
  3859.             ->innerJoin('collection.factory''factory')
  3860.             ->innerJoin('factory.country''country')
  3861.             ->where($qb->expr()->in('a.id'':ids'))
  3862.             ->setParameter('ids'$articleIds);
  3863.         return $qb->getQuery()->getArrayResult();
  3864.     }
  3865. }