src/WebBundle/Repository/ArticleRepository.php line 2324

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