src/Service/Bus/Publisher/ProductPublisher.php line 137

Open in your IDE?
  1. <?php
  2. namespace App\Service\Bus\Publisher;
  3. use App\Message\AVOMessage;
  4. use App\Service\Bus\Publisher\Exception\AnalogueNotPublished;
  5. use App\Service\Bus\Publisher\Exception\BrandNotPublished;
  6. use App\Service\Bus\Publisher\Exception\BundleNotPublished;
  7. use App\Service\Bus\Publisher\Exception\CategoryNotPublished;
  8. use App\Service\Bus\Publisher\Exception\CollectionNotPublished;
  9. use App\Service\Bus\Publisher\Exception\LabelNotPublished;
  10. use App\Service\Enum\LanguageEnum;
  11. use Carbon\Carbon;
  12. use Exception;
  13. use Pimcore\Model\DataObject\Category;
  14. use Pimcore\Model\DataObject\Product;
  15. use Pimcore\Model\DataObject\PropertyDescriptor;
  16. use Pimcore\Tool;
  17. use Symfony\Component\Messenger\Bridge\Amqp\Transport\AmqpStamp;
  18. class ProductPublisher extends BasePublisher
  19. {
  20. /**
  21. * @param object $object
  22. * @return void
  23. * @throws Exception
  24. */
  25. public function create(object $object): void
  26. {
  27. $this->update($object);
  28. }
  29. public function update(object $object): void
  30. {
  31. /**
  32. * @var Product $product
  33. */
  34. /**
  35. * Нам надо находить RP чтобы понимать служебное оно или нет
  36. */
  37. $product = $object;
  38. $this->checkPublicity($product);
  39. $avo = new AVOMessage([
  40. 'action' => 'create',
  41. 'data' => [
  42. 'timestamp' => ($product->getReleaseDate() ?? (new Carbon())->addDay())->getTimestamp(),
  43. 'product_guid' => (string) $product->getGuid(),
  44. 'vendor_code' => (string) $product->getArticle(),
  45. //'same_product_guid'=> (string) $product->getSame()?->
  46. 'barcode' => (string) $product->getBarCode(),
  47. 'name'=> array_filter(array_map(function ($lang) use ($product) {
  48. return ['text'=>$product->getName($lang), 'lang'=>$lang];
  49. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  50. return !is_null($item['text']);
  51. }),
  52. 'is_available'=> array_map(function ($lang) use ($product) {
  53. return ['value'=>$product->getIsAviable($lang)??false, 'lang'=>$lang];
  54. }, array_map(fn($case) => $case->value, LanguageEnum::cases())),
  55. 'brand_name'=> $product->getBrand()->getName(),
  56. 'brand_guid'=> $product->getBrand()->getGuid(),
  57. 'collection_name'=> $product->getCollection()?->getName(),
  58. 'collection_guid'=> $product->getCollection()?->getGuid(),
  59. 'categories' => array_map(function ($cat){
  60. return [
  61. 'name'=>$cat->getName('en'),
  62. 'guid'=>$cat->getGuid()
  63. ];
  64. }, $product->getCategories()),
  65. 'awards'=>array_map(function ($award){
  66. return [
  67. 'guid' => $award->getGuid(),
  68. 'name'=> $award->getName('en')
  69. ];
  70. }, $product->getAwards()),
  71. 'marketing'=>[
  72. 'first_preview'=> $product->getPreviewOne()?Tool::getHostUrl().$product->getPreviewOne()?->getFullPath():null,
  73. 'second_preview'=> $product->getPreviewTwo()?Tool::getHostUrl().$product->getPreviewTwo()?->getFullPath():null,
  74. 'international_gallery'=>array_filter(array_map(function ($image){
  75. return ['url'=> !is_null($image)?Tool::getHostUrl().$image->getImage()?->getFullPath():''];
  76. }, $product->getInternationalGallery()->getItems()), function ($item){
  77. return is_array($item) && $item['url']!=0;
  78. }),
  79. 'gallery'=>array_filter(array_map(function ($lang) use ($product) {
  80. return [
  81. 'lang'=>$lang,
  82. 'items'=> array_map(function ($image) use ($lang){
  83. return ['url'=> Tool::getHostUrl().$image?->getImage()?->getFullPath()];
  84. }, $product->getGallery($lang)?->getItems()??[])
  85. ];
  86. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  87. return is_array($item) && count($item['items'])>0;
  88. }),
  89. 'highlights' => array_filter(array_map(function ($lang) use ($product) {
  90. return [
  91. 'lang'=>$lang,
  92. 'items'=> array_map(function ($highlight){
  93. return $highlight['highlight']?->getData()??'';
  94. }, $product->getHighlights($lang)??[])
  95. ];
  96. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  97. return is_array($item) && count($item['items'])>0;
  98. }),
  99. 'description' => array_filter(array_map(function ($lang) use ($product) {
  100. return ['text'=>$product->getDescription($lang), 'lang'=>$lang];
  101. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  102. return !is_null($item['text']);
  103. }),
  104. 'video' => array_filter(array_map(function ($lang) use ($product) {
  105. return [
  106. 'url'=>$product->getVideo($lang)?Tool::getHostUrl().$product->getVideo($lang)->getData()?->getFullPath():'',
  107. 'lang'=>$lang
  108. ];
  109. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  110. return $item['url']!='';
  111. }),
  112. ],
  113. 'parameters'=>[
  114. 'warranty'=>$product->getWarranty(),
  115. 'dimensions'=>[
  116. 'width'=>$product->getWidth(),
  117. 'height'=>$product->getHeight(),
  118. 'depth'=>$product->getDepth(),
  119. 'packageWidth'=>$product->getPackageWidth(),
  120. 'packageHeight'=>$product->getPackageHeight(),
  121. 'packageDepth'=>$product->getPackageDepth(),
  122. 'weight'=>$product->getWeight(),
  123. ],
  124. ],
  125. 'categoryParameters'=>array_map(function ($item){
  126. return [
  127. 'code'=>$item->getFieldDefinition()->getName(),
  128. 'title'=>array_map(function ($lang) use ($item){
  129. $pd = new PropertyDescriptor\Listing();
  130. $pd->setCondition('classificationStoreField=?', [$item->getConfiguration()->getName()]);
  131. $pd->setLimit(1);
  132. if (array_key_exists(0,$pd->getData())) {
  133. $propertyDescriptor = $pd->getData()[0];
  134. return ['lang'=>$lang, 'text'=>$propertyDescriptor->getTitle($lang)];
  135. }
  136. return ['lang'=>$lang, 'text'=>$item->getFieldDefinition()->getTitle()];
  137. }, array_map(fn($case) => $case->value, LanguageEnum::cases())),
  138. 'text'=>$item->getValue(),
  139. ];
  140. }, current($product->getCategoryParameters()->getGroups())?current($product->getCategoryParameters()->getGroups())->getKeys():[]),
  141. 'properties'=>[
  142. 'brandCountry'=>array_values(array_filter(array_map(function ($lang) use ($product) {
  143. return ['text'=>$product->getBrandCountry($lang), 'lang'=>$lang];
  144. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  145. return !is_null($item['text']);
  146. })),
  147. 'manufacturerCountry'=>array_values(array_filter(array_map(function ($lang) use ($product) {
  148. return ['text'=>$product->getManufacturerCountry($lang), 'lang'=>$lang];
  149. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  150. return !is_null($item['text']);
  151. })),
  152. 'material'=>array_values(array_filter(array_map(function ($lang) use ($product) {
  153. return ['text'=>$product->getMaterial($lang), 'lang'=>$lang];
  154. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  155. return !is_null($item['text']);
  156. })),
  157. 'complectation'=>array_values(array_filter(array_map(function ($lang) use ($product) {
  158. return ['text'=>$product->getComplectation($lang), 'lang'=>$lang];
  159. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  160. return !is_null($item['text']);
  161. })),
  162. 'colour'=>array_values(array_filter(array_map(function ($lang) use ($product) {
  163. return ['text'=>$product->getColour($lang), 'lang'=>$lang];
  164. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  165. return !is_null($item['text']);
  166. })),
  167. 'style'=>array_values(array_filter(array_map(function ($lang) use ($product) {
  168. return ['text'=>$product->getStyle($lang), 'lang'=>$lang];
  169. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  170. return !is_null($item['text']);
  171. })),
  172. ],
  173. 'categoryProperties'=>array_values(array_filter(array_map(function ($lang) use ($product){
  174. return [
  175. 'lang'=>$lang,
  176. 'items'=>array_filter(array_map(function ($item) use ($lang){
  177. return [
  178. 'code'=>$item->getFieldDefinition()->getName(),
  179. 'title'=>array_map(function ($lang) use ($item){
  180. $pd = new PropertyDescriptor\Listing();
  181. $pd->setCondition('classificationStoreField=?', [$item->getConfiguration()->getName()]);
  182. $pd->setLimit(1);
  183. if (array_key_exists(0,$pd->getData())) {
  184. $propertyDescriptor = $pd->getData()[0];
  185. return ['lang'=>$lang, 'text'=>$propertyDescriptor->getTitle($lang)];
  186. }
  187. return ['lang'=>$lang, 'text'=>$item->getFieldDefinition()->getTitle()];
  188. }, array_map(fn($case) => $case->value, LanguageEnum::cases())),
  189. 'text'=>$item->getValue($lang),
  190. ];
  191. }, current($product->getCategoryParameters()->getGroups())?current($product->getCategoryParameters()->getGroups())->getKeys():[]), function ($item){
  192. return !is_null($item['text']);
  193. })
  194. ];
  195. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  196. return is_array($item) && count($item['items'])>0;
  197. })),
  198. 'technical'=>[
  199. 'manuals'=>array_map(function ($asset){
  200. return ['url'=> Tool::getHostUrl().$asset->getFullPath()];
  201. }, $product->getManuals()),
  202. 'schemes'=>array_map(function ($image){
  203. return ['url'=> Tool::getHostUrl().$image?->getImage()->getFullPath()];
  204. }, $product->getSchemes()->getItems()),
  205. 'stickers'=>array_filter(array_map(function ($lang) use ($product) {
  206. return [
  207. 'lang'=>$lang,
  208. 'items'=> array_map(function ($image) use ($lang){
  209. return ['url'=> Tool::getHostUrl().$image?->getImage()->getFullPath()];
  210. }, $product->getStickers($lang)?->getItems()??[])
  211. ];
  212. }, array_map(fn($case) => $case->value, LanguageEnum::cases())), function ($item){
  213. return is_array($item) && count($item['items'])>0;
  214. }),
  215. ]
  216. ],
  217. 'model' => 'EuProductRelease',
  218. 'timestamp' => $product->getModificationDate(),
  219. ]);
  220. if (count($product->getSame())>0) {
  221. /**
  222. * @var Product $sp
  223. */
  224. $sp = $product->getSame()[0];
  225. $avo->data['same_product_guid'] = $sp->getGuid();
  226. }
  227. $this->bus->dispatch(
  228. $avo->getDataModel(),
  229. [
  230. new AmqpStamp('release.product')
  231. ]
  232. );
  233. }
  234. /**
  235. * @param Product $product
  236. * @return void
  237. * @throws AnalogueNotPublished
  238. * @throws BrandNotPublished
  239. * @throws BundleNotPublished
  240. * @throws CategoryNotPublished
  241. * @throws CollectionNotPublished
  242. * @throws LabelNotPublished
  243. */
  244. protected function checkPublicity(Product $product)
  245. {
  246. $notPublished = [];
  247. $brand = $product->getBrand();
  248. if (is_null($brand))
  249. throw new BrandNotPublished("Бренд не заполнен");
  250. if (!$brand->isPublished())
  251. throw new BrandNotPublished("Бренд {$brand->getGuid()} не опубликован");
  252. $collection = $product->getCollection();
  253. /**
  254. * @warning Коллекция у нас необязательна для товара, но если есть, то она должна быть опубликована;
  255. */
  256. if ( !is_null($collection) && !$collection->isPublished() )
  257. throw new CollectionNotPublished("Коллекция {$collection->getGuid()}\n не опубликована");
  258. $categories = $product->getCategories();
  259. if (count($categories) < 2)
  260. throw new CategoryNotPublished('Не заполнены категории');
  261. $secondLevelNotExist = true;
  262. foreach ($categories as $category){
  263. if ($category->getParent() instanceof Category)
  264. $secondLevelNotExist = false;
  265. if (!$category->isPublished())
  266. $notPublished[] = "Категория {$category->getGuid()} не опубликована\n";
  267. }
  268. if (count($notPublished) > 0)
  269. throw new CategoryNotPublished( implode(', ', $notPublished) );
  270. if ($secondLevelNotExist)
  271. throw new CategoryNotPublished('Отсутствует категория второго уровня');
  272. }
  273. }