No puede seleccionar más de 25 temas Los temas deben comenzar con una letra o número, pueden incluir guiones ('-') y pueden tener hasta 35 caracteres de largo.

ProductFamilySolver.php 14KB

hace 3 años
hace 3 años
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. <?php
  2. namespace Lc\CaracoleBundle\Solver\Product;
  3. use Doctrine\Common\Collections\ArrayCollection;
  4. use Doctrine\Common\Collections\Collection;
  5. use Lc\CaracoleBundle\Doctrine\Extension\ProductPropertyInterface;
  6. use Lc\CaracoleBundle\Model\Product\ProductFamilyInterface;
  7. use Lc\CaracoleBundle\Model\Product\ProductFamilyModel;
  8. use Lc\CaracoleBundle\Model\Product\ProductInterface;
  9. use Lc\CaracoleBundle\Model\Reduction\ReductionCatalogInterface;
  10. use Lc\CaracoleBundle\Model\Section\SectionInterface;
  11. class ProductFamilySolver
  12. {
  13. protected ProductSolver $productSolver;
  14. public function __construct(ProductSolver $productSolver)
  15. {
  16. $this->productSolver = $productSolver;
  17. }
  18. public function getBehaviorCountStockChoices(): array
  19. {
  20. return [
  21. ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_MEASURE,
  22. ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT,
  23. ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT_FAMILY,
  24. ];
  25. }
  26. public function getWaringMessageTypeChoices(): array
  27. {
  28. return [
  29. ProductFamilyModel::WARNING_MESSAGE_TYPE_ERROR,
  30. ProductFamilyModel::WARNING_MESSAGE_TYPE_INFO,
  31. ProductFamilyModel::WARNING_MESSAGE_TYPE_SUCCESS,
  32. ProductFamilyModel::WARNING_MESSAGE_TYPE_WARNING,
  33. ];
  34. }
  35. public function getBehaviorAddToCartChoices(): array
  36. {
  37. return [
  38. ProductFamilyModel::BEHAVIOR_ADD_TO_CART_MULTIPLE,
  39. ProductFamilyModel::BEHAVIOR_ADD_TO_CART_SIMPLE,
  40. ];
  41. }
  42. public function getBehaviorPriceChoices(): array
  43. {
  44. return [
  45. ProductFamilyModel::BEHAVIOR_PRICE_BY_PIECE,
  46. ProductFamilyModel::BEHAVIOR_PRICE_BY_REFERENCE_UNIT,
  47. ];
  48. }
  49. public function getTypeExpirationDateChoices(): array
  50. {
  51. return [
  52. ProductFamilyModel::TYPE_EXPIRATION_DATE_DLC,
  53. ProductFamilyModel::TYPE_EXPIRATION_DATE_DDM,
  54. ProductFamilyModel::TYPE_EXPIRATION_DATE_DLUO,
  55. ];
  56. }
  57. public function getBehaviorExpirationDateChoices(): array
  58. {
  59. return [
  60. ProductFamilyModel::BEHAVIOR_EXPIRATION_DATE_BY_PRODUCT_FAMILY,
  61. ProductFamilyModel::BEHAVIOR_EXPIRATION_DATE_BY_PRODUCT,
  62. ];
  63. }
  64. public function getBehaviorDisplaySaleChoices(): array
  65. {
  66. return [
  67. ProductFamilyModel::BEHAVIOR_DISPLAY_SALE_BY_MEASURE,
  68. ProductFamilyModel::BEHAVIOR_DISPLAY_SALE_BY_QUANTITY,
  69. ];
  70. }
  71. public function countProductFamiliesOrganizedByParentCategory(array $categories): int
  72. {
  73. $count = 0;
  74. foreach ($categories as $category) {
  75. $count += count($category['products']);
  76. }
  77. return $count;
  78. }
  79. public function getAvailableQuantityInherited(ProductFamilyInterface $productFamily)
  80. {
  81. $availableQuantity = 0;
  82. switch ($productFamily->getBehaviorCountStock()) {
  83. case ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_MEASURE :
  84. case ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT_FAMILY :
  85. $availableQuantity = $productFamily->getAvailableQuantity();
  86. break;
  87. case ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT :
  88. foreach ($this->getProductsOnline($productFamily) as $product) {
  89. $availableQuantity += $this->productSolver->getAvailableQuantityInherited($product);
  90. }
  91. break;
  92. }
  93. return $availableQuantity;
  94. }
  95. public function getAvailableQuantitySupplierInherited(ProductFamilyInterface $productFamily)
  96. {
  97. $availableQuantity = 0;
  98. switch ($productFamily->getBehaviorCountStock()) {
  99. case ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_MEASURE :
  100. case ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT_FAMILY :
  101. $availableQuantity = $productFamily->getAvailableQuantitySupplier();
  102. break;
  103. case ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT :
  104. foreach ($this->getProductsOnline($productFamily) as $product) {
  105. $availableQuantity += $this->productSolver->getAvailableQuantitySupplierInherited($product);
  106. }
  107. break;
  108. }
  109. return $availableQuantity;
  110. }
  111. public function getTaxRateInherited(ProductPropertyInterface $productFamily)
  112. {
  113. if($productFamily instanceof ProductInterface) {
  114. $productFamily = $productFamily->getProductFamily();
  115. }
  116. if ($productFamily->getTaxRate()) {
  117. return $productFamily->getTaxRate();
  118. } else {
  119. return $productFamily->getProductFamilySectionProperties()[0]->getSection()->getMerchant()->getTaxRate();
  120. }
  121. }
  122. public function getProductsOnline(ProductFamilyInterface $productFamily): Collection
  123. {
  124. $products = $productFamily->getProducts();
  125. $productsOnlineArray = new ArrayCollection();
  126. foreach ($products as $product) {
  127. if ($product->getStatus() == 1 && $product->getOriginProduct() != true) {
  128. $productsOnlineArray[] = $product;
  129. }
  130. }
  131. return $productsOnlineArray;
  132. }
  133. public function getReductionCatalogInherited(ProductFamilyInterface $productFamily): ?ReductionCatalogInterface
  134. {
  135. return $productFamily->getReductionCatalog();
  136. }
  137. public function getProductCategoryParent(ProductFamilyInterface $productFamily)
  138. {
  139. $productCategories = $productFamily->getProductCategories();
  140. if (count($productCategories) > 0) {
  141. return $productCategories[0]->getParent();
  142. }
  143. return false;
  144. }
  145. public function getProductCategoryChild(ProductFamilyInterface $productFamily)
  146. {
  147. $productCategories = $productFamily->getProductCategories();
  148. foreach ($productCategories as $productCategory) {
  149. if ($productCategory->getParent()) {
  150. return $productCategory;
  151. }
  152. }
  153. return false;
  154. }
  155. public function isPropertyNoveltyOnline(ProductFamilyInterface $productFamily): ?bool
  156. {
  157. if ($productFamily->getPropertyNoveltyExpirationDate()) {
  158. $now = new \DateTime();
  159. if ($now <= $productFamily->getPropertyNoveltyExpirationDate()) {
  160. return true;
  161. }
  162. }
  163. return false;
  164. }
  165. public function countProperties(ProductFamilyInterface $productFamily): bool
  166. {
  167. $count = 0;
  168. $count += (int)strlen($productFamily->getPropertyOrganicLabel()) > 0;
  169. $count += (int)strlen($productFamily->getPropertyWeight()) > 0;
  170. $count += (int)strlen($productFamily->getPropertyFragrances()) > 0;
  171. $count += (int)strlen($productFamily->getPropertyComposition()) > 0;
  172. $count += (int)strlen($productFamily->getPropertyAllergens()) > 0;
  173. $count += (int)strlen($productFamily->getPropertyAlcoholLevel()) > 0;
  174. $count += (int)strlen($productFamily->getPropertyCharacteristics()) > 0;
  175. $count += (int)strlen($productFamily->getPropertyFeature()) > 0;
  176. $count += (int)strlen($productFamily->getPropertyPackaging()) > 0;
  177. $count += (int)strlen($productFamily->getPropertyQuantity()) > 0;
  178. $count += (int)strlen($productFamily->getPropertyVariety()) > 0;
  179. $count += (int)($productFamily->getPropertyExpirationDate() != null);
  180. return $count;
  181. }
  182. public function hasProductsWithVariousWeight(ProductFamilyInterface $productFamily)
  183. {
  184. if ($productFamily->getActiveProducts()) {
  185. $arrayCountProducts = [];
  186. $products = $this->getProductsOnline($productFamily);
  187. foreach ($products as $product) {
  188. $titleProduct = $this->productSolver->getTitleInherited($product);
  189. if (!isset($arrayCountProducts[$titleProduct])) {
  190. $arrayCountProducts[$titleProduct] = [];
  191. }
  192. if (!in_array($this->productSolver->getQuantityLabelInherited($product), $arrayCountProducts[$titleProduct])) {
  193. $arrayCountProducts[$titleProduct][] = $this->productSolver->getQuantityLabelInherited($product);
  194. }
  195. if (count($arrayCountProducts[$titleProduct]) > 1) {
  196. return true;
  197. }
  198. }
  199. }
  200. return false;
  201. }
  202. public function getProductsGroupByTitle(ProductFamilyInterface $productFamily): array
  203. {
  204. $arrayProductsGroupByTitle = [];
  205. $products = $this->getProductsOnline($productFamily);
  206. foreach ($products as $product) {
  207. if ($product->getStatus() == 1) {
  208. $titleProduct = $this->productSolver->getTitleInherited($product);
  209. if (!isset($arrayProductsGroupByTitle[$titleProduct])) {
  210. $arrayProductsGroupByTitle[$titleProduct] = [];
  211. }
  212. $arrayProductsGroupByTitle[$titleProduct][] = $product;
  213. }
  214. }
  215. return $arrayProductsGroupByTitle;
  216. }
  217. public function getQuantityTitle(ProductFamilyInterface $productFamily, ProductInterface $product)
  218. {
  219. $title = $this->productSolver->getQuantityLabelInherited($product);
  220. if ($this->hasProductsWithVariousWeight($productFamily)) {
  221. $title .= ', ' . $this->productSolver->getTitleInherited($product);
  222. }
  223. return $title;
  224. }
  225. public function getOriginProduct(ProductFamilyInterface $productFamily): ?ProductInterface
  226. {
  227. $products = $productFamily->getProducts();
  228. foreach ($products as $product) {
  229. if ($product->getOriginProduct()) {
  230. return $product;
  231. }
  232. }
  233. return null;
  234. }
  235. public function getOriginProductOnline(ProductFamilyInterface $productFamily): ?ProductInterface
  236. {
  237. $originProduct = $this->getOriginProduct($productFamily);
  238. if ($originProduct->getStatus() == 1) {
  239. return $originProduct;
  240. } else {
  241. return null;
  242. }
  243. }
  244. public function hasOneProductOnline(ProductFamilyInterface $productFamily)
  245. {
  246. if (($productFamily->getActiveProducts() && count($this->getProductsOnline($productFamily)) > 0)
  247. || (!$productFamily->getActiveProducts() && $this->getOriginProduct($productFamily))) {
  248. return true;
  249. }
  250. return false;
  251. }
  252. public function getFieldBuyingPrice(ProductFamilyInterface $productFamily): string
  253. {
  254. if ($productFamily->getBehaviorPrice() === ProductFamilyModel::BEHAVIOR_PRICE_BY_PIECE) {
  255. return 'buyingPrice';
  256. } elseif ($productFamily->getBehaviorPrice() === ProductFamilyModel::BEHAVIOR_PRICE_BY_REFERENCE_UNIT) {
  257. return 'buyingPriceByRefUnit';
  258. }
  259. }
  260. public function getFieldPrice(ProductFamilyInterface $productFamily): string
  261. {
  262. if ($productFamily->getBehaviorPrice() === ProductFamilyModel::BEHAVIOR_PRICE_BY_PIECE) {
  263. return 'price';
  264. } elseif ($productFamily->getBehaviorPrice() === ProductFamilyModel::BEHAVIOR_PRICE_BY_REFERENCE_UNIT) {
  265. return 'priceByRefUnit';
  266. }
  267. }
  268. public function getBehaviorPriceInherited(ProductFamilyInterface $productFamily) :string
  269. {
  270. return $productFamily->getBehaviorPrice();
  271. }
  272. public function getBuyingPriceByRefUnitInherited(ProductFamilyInterface $productFamily): ?float
  273. {
  274. return $productFamily->getBuyingPriceByRefUnit();
  275. }
  276. public function getBuyingPriceInherited(ProductFamilyInterface $productFamily): ?float
  277. {
  278. return $productFamily->getBuyingPrice();
  279. }
  280. public function getPriceByRefUnitInherited(ProductFamilyInterface $productFamily): ?float
  281. {
  282. return $productFamily->getPriceByRefUnit();
  283. }
  284. public function getQuantityInherited(ProductFamilyInterface $productFamily): ?float
  285. {
  286. return $productFamily->getQuantity();
  287. }
  288. public function getUnitInherited(ProductFamilyInterface $productFamily)
  289. {
  290. return $productFamily->getUnit();
  291. }
  292. public function getPriceInherited(ProductFamilyInterface $productFamily)
  293. {
  294. return $productFamily->getPrice();
  295. }
  296. public function getOrganicLabel(ProductFamilyInterface $productFamily)
  297. {
  298. return $this->getQualityLabelByArray($productFamily, ProductFamilyModel::$organicLabels);
  299. }
  300. public function getGeographicLabel(ProductFamilyInterface $productFamily)
  301. {
  302. return $this->getQualityLabelByArray($productFamily, ProductFamilyModel::$geographicLabels);
  303. }
  304. public function getQualityLabelByArray(ProductFamilyInterface $productFamily, array $labelArray)
  305. {
  306. $qualityLabelArray = $productFamily->getQualityLabels();
  307. foreach($qualityLabelArray as $qualityLabel) {
  308. if(in_array($qualityLabel->getDevAlias(), $labelArray)) {
  309. return $qualityLabel;
  310. }
  311. }
  312. return false;
  313. }
  314. public function hasOrganicLabel(ProductFamilyInterface $productFamily)
  315. {
  316. return $this->hasQualityLabelByArray($productFamily, ProductFamilyModel::$organicLabels);
  317. }
  318. public function hasGeographicLabel(ProductFamilyInterface $productFamily)
  319. {
  320. return $this->hasQualityLabelByArray($productFamily, ProductFamilyModel::$geographicLabels);
  321. }
  322. public function hasQualityLabelByArray(ProductFamilyInterface $productFamily, array $labelArray)
  323. {
  324. $qualityLabelArray = $productFamily->getQualityLabels();
  325. foreach($qualityLabelArray as $qualityLabel) {
  326. if(in_array($qualityLabel->getDevAlias(), $labelArray)) {
  327. return true;
  328. }
  329. }
  330. return false;
  331. }
  332. public function getSection(ProductFamilyInterface $productFamily): ?SectionInterface
  333. {
  334. foreach($productFamily->getProductFamilySectionProperties() as $productFamilySectionProperty) {
  335. if($productFamilySectionProperty->getStatus()) {
  336. return $productFamilySectionProperty->getSection();
  337. }
  338. }
  339. return null;
  340. }
  341. }