$assets->addWebpackEncoreEntry('carac-common'); | $assets->addWebpackEncoreEntry('carac-common'); | ||||
$assets->addWebpackEncoreEntry('carac-switch-merchant'); | $assets->addWebpackEncoreEntry('carac-switch-merchant'); | ||||
$assets->addWebpackEncoreEntry('carac-duplicate'); | $assets->addWebpackEncoreEntry('carac-duplicate'); | ||||
$assets->addWebpackEncoreEntry('carac-product'); | |||||
return $assets; | return $assets; | ||||
} | } |
[ | [ | ||||
FormField::addPanel('general'), | FormField::addPanel('general'), | ||||
TextField::new('title'), | TextField::new('title'), | ||||
NumberField::new('position')->hideOnForm(), | |||||
AssociationField::new('parent'), | AssociationField::new('parent'), | ||||
CKEditorField::new('description'), | CKEditorField::new('description'), | ||||
BooleanField::new('saleStatus'), | BooleanField::new('saleStatus'), |
namespace Lc\CaracoleBundle\Controller\Product; | namespace Lc\CaracoleBundle\Controller\Product; | ||||
use EasyCorp\Bundle\EasyAdminBundle\Context\AdminContext; | |||||
use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; | use EasyCorp\Bundle\EasyAdminBundle\Field\AssociationField; | ||||
use EasyCorp\Bundle\EasyAdminBundle\Field\FormField; | use EasyCorp\Bundle\EasyAdminBundle\Field\FormField; | ||||
use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField; | use EasyCorp\Bundle\EasyAdminBundle\Field\NumberField; | ||||
use EasyCorp\Bundle\EasyAdminBundle\Field\TextField; | use EasyCorp\Bundle\EasyAdminBundle\Field\TextField; | ||||
use Lc\CaracoleBundle\Container\Order\OrderShopContainer; | |||||
use Lc\CaracoleBundle\Controller\AdminControllerTrait; | use Lc\CaracoleBundle\Controller\AdminControllerTrait; | ||||
use Lc\CaracoleBundle\Field\Address\AddressField; | use Lc\CaracoleBundle\Field\Address\AddressField; | ||||
use Lc\CaracoleBundle\Resolver\SectionResolver; | |||||
use Lc\SovBundle\Controller\AbstractAdminController; | use Lc\SovBundle\Controller\AbstractAdminController; | ||||
use Lc\SovBundle\Field\BooleanField; | use Lc\SovBundle\Field\BooleanField; | ||||
use Lc\SovBundle\Field\CKEditorField; | use Lc\SovBundle\Field\CKEditorField; | ||||
use Lc\SovBundle\Field\StatusField; | use Lc\SovBundle\Field\StatusField; | ||||
use Symfony\Component\HttpFoundation\RequestStack; | |||||
use Symfony\Component\HttpFoundation\Response; | |||||
abstract class ProductFamilyAdminController extends AbstractAdminController | abstract class ProductFamilyAdminController extends AbstractAdminController | ||||
{ | { | ||||
use AdminControllerTrait; | use AdminControllerTrait; | ||||
public function showSalesStatistic(AdminContext $context) | |||||
{ | |||||
$productFamily = $context->getEntity()->getInstance(); | |||||
$currentSection = $this->get(SectionResolver::class)->getCurrent(); | |||||
$productsSalesStatistic = $this->get(OrderShopContainer::class)->getBuilder()->getProductsSalesStatistic($currentSection, $productFamily, 16); | |||||
$parameters = array( | |||||
'productFamily' => $productFamily, | |||||
'productsSalesStatistic' => $productsSalesStatistic | |||||
); | |||||
//TODO flashMessages ??? | |||||
$response['flashMessages'] = [];//$this->utils->getFlashMessages(); | |||||
$response['data'] = $this->render('@LcCaracole/admin/product/modal/show_products_sales_statistic.html.twig', $parameters)->getContent(); | |||||
$response['statistics'] = $productsSalesStatistic; | |||||
return new Response(json_encode($response)); | |||||
} | |||||
} | } |
return $this; | return $this; | ||||
} | } | ||||
public function setFilterIsOnline(): self | |||||
{ | |||||
$this->queryBuilderParameters['status'] = 1; | |||||
return $this; | |||||
} | |||||
public function initQueryBuilder(): self | public function initQueryBuilder(): self | ||||
{ | { | ||||
$param = $this->queryBuilderParameters; | $param = $this->queryBuilderParameters; | ||||
if (isset($param['section'])) { | if (isset($param['section'])) { | ||||
$qb->andWhereSection('e',$param['section']); | $qb->andWhereSection('e',$param['section']); | ||||
} | } | ||||
if (isset($param['merchant'])) { | if (isset($param['merchant'])) { | ||||
$qb->andWhereMerchant('e',$param['merchant']); | $qb->andWhereMerchant('e',$param['merchant']); | ||||
} | } | ||||
if (isset($param['status'])) { | |||||
$qb->andWhere('e.status = :status')->setParameter('status', $param['status']); | |||||
} | |||||
$qb->orderBy('e.position', 'ASC'); | |||||
/*if (isset($param['devAlias'])) { | /*if (isset($param['devAlias'])) { | ||||
$qb->andWhere('e.devAlias = :devAlias')->setParameter( | $qb->andWhere('e.devAlias = :devAlias')->setParameter( | ||||
'devAlias', | 'devAlias', |
use Doctrine\Common\Collections\Collection; | use Doctrine\Common\Collections\Collection; | ||||
use Lc\CaracoleBundle\Model\Section\SectionInterface; | use Lc\CaracoleBundle\Model\Section\SectionInterface; | ||||
/** | |||||
* @ORM\MappedSuperclass() | |||||
*/ | |||||
interface ProductCategoryInterface | interface ProductCategoryInterface | ||||
{ | { | ||||
public function getSection(): SectionInterface; | public function getSection(): SectionInterface; |
->selectSum() | ->selectSum() | ||||
->groupBy('.cycleNumber, product.id'); | ->groupBy('.cycleNumber, product.id'); | ||||
return $query->find(); | return $query->find(); | ||||
} | } | ||||
return $query; | return $query; | ||||
} | } | ||||
/* | |||||
public function getByProductFamily(ProductFamilyInterface $productFamily, $query = null) | public function getByProductFamily(ProductFamilyInterface $productFamily, $query = null) | ||||
{ | { | ||||
$query = $this->createDefaultQuery($query); | $query = $this->createDefaultQuery($query); | ||||
$query | $query | ||||
->filterProductFamily($productFamily) | |||||
->filterIsOnline(); | |||||
->filterProductFamily($productFamily); | |||||
return $query->findOne(); | return $query->findOne(); | ||||
} | } | ||||
*/ | |||||
} | |||||
} |
jQuery(document).ready(function () { | |||||
initBtnShowTotalOrderProduct(); | |||||
}); | |||||
function initBtnShowTotalOrderProduct(){ | |||||
$('.lc-show-products-sales-statistic').unbind('click').on('click', function (){ | |||||
$btn = $(this); | |||||
var url = $(this).data('url'); | |||||
$('#modal-products-sales-statistic').remove(); | |||||
$.ajax({ | |||||
url: url, | |||||
method: "POST", | |||||
dataType: "json", | |||||
success: function (response) { | |||||
$('body').append(response.data); | |||||
$('#modal-products-sales-statistic').modal('show'); | |||||
initModalProductsSalesStatistic(response.statistics); | |||||
} | |||||
}); | |||||
}); | |||||
} | |||||
function initModalProductsSalesStatistic(statistics) { | |||||
var chart = null; | |||||
$('.btn-products-sales-statistic').off('click'); | |||||
$('.btn-products-sales-statistic').on('click', function () { | |||||
$('.table-products-sales-statistic').hide(); | |||||
$('.btn-products-sales-statistic').addClass('btn-secondary').removeClass('btn-primary'); | |||||
$(this).removeClass('btn-secondary').addClass('btn-primary'); | |||||
$('#table-products-sales-statistic-'+$(this).data('property-name')).show() | |||||
if (chart) chart.destroy(); | |||||
$(this).removeClass('btn-secondary'); | |||||
chart = drawProductsSalesStatistic(statistics,$(this).data('property-name')) | |||||
}); | |||||
$('.btn-products-sales-statistic').first().click(); | |||||
} | |||||
function drawProductsSalesStatistic(statictics, propertyName) { | |||||
var options = { | |||||
bezierCurve : false, | |||||
tooltips: { | |||||
callbacks: { | |||||
label: (item) => item.yLabel , | |||||
}, | |||||
}, | |||||
}; | |||||
chart = new Chart(document.getElementById("chart"), { | |||||
"type": "line", | |||||
"data": { | |||||
"labels": Object.values(statictics.label), | |||||
"datasets": [{ | |||||
"label": "Vente de produits / semaine", | |||||
"data": Object.values(statictics.data[propertyName].data), | |||||
"fill": false, | |||||
"borderColor": "rgb(75, 192, 192)", | |||||
"lineTension": 0.1 | |||||
}] | |||||
}, | |||||
"options": options | |||||
}); | |||||
return chart; | |||||
} |
ProductCategory: | ProductCategory: | ||||
label: Catégorie | label: Catégorie | ||||
label_plurial: Catégories | label_plurial: Catégories | ||||
ProductFamily: | |||||
fields: | |||||
priceWithTax: Prix de vente | |||||
sales: Historique des ventes | |||||
form: | form: | ||||
user_merchant: | user_merchant: |
{{ price_solver.getPriceWithTax(entity.instance)|format_price|raw }} |
{% import '@LcCaracole/admin/product/macro/product_family_macro.html.twig' as pfm %} | |||||
{% set section_current = section_container.resolver.getCurrent() %} | |||||
{{ pfm.product_family_sales_statistic(order_shop_container.builder.getProductsSalesStatistic(section_current, entity.instance, 2), entity.instance) }} |
{% extends '@LcCaracole/admin/product/macro/product_family_macro.html.twig' %} | |||||
{% macro product_family_sales_statistic(productsSalesStatistic, productFamily) %} | |||||
{% if productsSalesStatistic %} | |||||
<button type="button" data-product-family="{{ productFamily.id }}" | |||||
class="lc-show-products-sales-statistic btn btn-sm" | |||||
data-toggle="tooltip" title="{{ 'action.product.statSales'|trans }}" | |||||
data-url="{{ ea_url({crudAction : 'showSalesStatistic', entityId: productFamily.id }) }}"> | |||||
{% for weekNumber, weekNumberQuantity in productsSalesStatistic['data']['total_sales']['data']|reverse(true) %} | |||||
<span class="text-success"><i class="fa fa-calendar"></i> {{ weekNumber }}</span> | |||||
<span class="text-info"><i class="fa fa-shopping-basket"></i> | |||||
<strong> | |||||
{{ weekNumberQuantity is null ? 0 : weekNumberQuantity }} | |||||
{% if productFamily and (productFamily.behaviorDisplaySale== constant('App\\Entity\\Product\\ProductFamily::BEHAVIOR_DISPLAY_SALE_BY_MEASURE')) %} | |||||
{{ productFamily.unit.unitReference }} | |||||
{% endif %} | |||||
</strong> | |||||
</span> | |||||
<br/> | |||||
{% endfor %} | |||||
</button> | |||||
{% endif %} | |||||
{% endmacro product_family_sales_statistic %} | |||||
{% macro autoresize_field(field) %} | |||||
<tr> | |||||
<td>{{ form_label(field) }}</td> | |||||
<td> | |||||
<div class="autoresize"> | |||||
{{ form_widget(field, {'attr' : {rows : '1'}}) }} | |||||
</div> | |||||
</td> | |||||
</tr> | |||||
{% endmacro autoresize_field %} |
{% embed "@LcSov/adminlte/embed/modal.twig" %} | |||||
{% import '@LcCaracole/admin/product/macro/product_family_macro.html.twig' as pfm %} | |||||
{% trans_default_domain 'lcshop' %} | |||||
{% block size %}modal-lg{% endblock %} | |||||
{% block id %}modal-products-sales-statistic{% endblock %} | |||||
{% block title %}Total ventes/semaines : {{ productFamily.title }}{% endblock %} | |||||
{% block body %} | |||||
<div class="row"> | |||||
<div class="col-10"> | |||||
{{ _self.btn_pss(productsSalesStatistic, productFamily, 'Global', 'total_sales') }} | |||||
{% if productFamily.activeProducts %} | |||||
{% for product in productFamily.products %} | |||||
{% if product.status >= 0 %} | |||||
{{ _self.btn_pss(productsSalesStatistic, productFamily, product.title , product.id ) }} | |||||
{% endif %} | |||||
{% endfor %} | |||||
{% endif %} | |||||
</div> | |||||
<!-- | |||||
<div class="col-2"> | |||||
<h5>Stock actuel</h5> | |||||
{#{% include '@LcShop/backend/default/field/product_family_available_quantity.html.twig' with {item:productFamily, value: productFamily.availableQuantity} %}#} | |||||
</div> | |||||
--> | |||||
<div class="col-12"> | |||||
{{ _self.table_pss(productsSalesStatistic, productFamily, 'total_sales') }} | |||||
{% for product in productFamily.products %} | |||||
{% if product.status >= 0 %} | |||||
{{ _self.table_pss(productsSalesStatistic, productFamily, product.id) }} | |||||
{% endif %} | |||||
{% endfor %} | |||||
</div> | |||||
<div class="col-12"> | |||||
<canvas id="chart"></canvas> | |||||
</div> | |||||
</div> | |||||
{% endblock %} | |||||
{% block footer %}{% endblock %} | |||||
{% macro btn_pss(productsSalesStatistic,productFamily, label, propertyName) %} | |||||
<button style="margin-bottom: 10px;" type="button" data-property-name="{{ propertyName }}" | |||||
class="btn btn-sm btn-primary btn-products-sales-statistic"> | |||||
{{ label }} <br/> | |||||
{{ productsSalesStatistic['data'][propertyName]['average_period'] }} | |||||
{% if propertyName== 'total_sales' and productFamily and (productFamily.behaviorDisplaySale== constant('Lc\\CaracoleBundle\\Model\\Product\\ProductFamilyModel::BEHAVIOR_DISPLAY_SALE_BY_MEASURE')) %} | |||||
{{ productFamily.unit.unitReference }} | |||||
{% endif %} | |||||
<br/> | |||||
<small>(en moyenne)</small> | |||||
</button> | |||||
{% endmacro btn_pss %} | |||||
{% macro table_pss(productsSalesStatistic, productFamily, propertyName) %} | |||||
<div style="margin:20px 0;" class="table-products-sales-statistic" id="table-products-sales-statistic-{{ propertyName }}"> | |||||
<table class="table table-bordered table-striped"> | |||||
<tbody> | |||||
<tr> | |||||
<th class="text-success"> | |||||
<i class="fa fa-calendar"></i> Semaine | |||||
</th> | |||||
{% for weekNumber, weekNumberQuantity in productsSalesStatistic['data'][propertyName]['data'] %} | |||||
<td class="text-success align-right"> | |||||
{{ weekNumber }} | |||||
</td> | |||||
{% endfor %} | |||||
</tr> | |||||
<tr> | |||||
<th class="text-info"> | |||||
<i class="fa fa-shopping-basket"></i> Commandés | |||||
</th> | |||||
{% for weekNumber, weekNumberQuantity in productsSalesStatistic['data'][propertyName]['data'] %} | |||||
<td class="text-info align-right"> | |||||
<strong> | |||||
{{ weekNumberQuantity is null ? 0 : weekNumberQuantity }} | |||||
{% if propertyName== 'total_sales' and productFamily and (productFamily.behaviorDisplaySale== constant('Lc\\CaracoleBundle\\Model\\Product\\ProductFamilyModel::BEHAVIOR_DISPLAY_SALE_BY_MEASURE')) %} | |||||
{{ productFamily.unit.unitReference }} | |||||
{% endif %} | |||||
</strong> | |||||
</td> | |||||
{% endfor %} | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
{% endmacro table_pss %} | |||||
{% endembed %} | |||||
namespace Lc\CaracoleBundle\Solver\Product; | namespace Lc\CaracoleBundle\Solver\Product; | ||||
use Doctrine\Common\Collections\ArrayCollection; | |||||
use Doctrine\Common\Collections\Collection; | |||||
use Lc\CaracoleBundle\Model\Product\ProductFamilyInterface; | use Lc\CaracoleBundle\Model\Product\ProductFamilyInterface; | ||||
use Lc\CaracoleBundle\Model\Product\ProductFamilyModel; | use Lc\CaracoleBundle\Model\Product\ProductFamilyModel; | ||||
use Lc\CaracoleBundle\Model\Product\ProductInterface; | |||||
use Lc\CaracoleBundle\Model\Reduction\ReductionCatalogInterface; | |||||
use Lc\CaracoleBundle\Solver\Price\PriceSolver; | use Lc\CaracoleBundle\Solver\Price\PriceSolver; | ||||
class ProductFamilySolver | class ProductFamilySolver | ||||
public function getCheapestProduct(ProductFamilyInterface $productFamily) | public function getCheapestProduct(ProductFamilyInterface $productFamily) | ||||
{ | { | ||||
$priceSolver = $this->priceSolver; | $priceSolver = $this->priceSolver; | ||||
return $this->getCheapestOrMostExpensiveProduct( | return $this->getCheapestOrMostExpensiveProduct( | ||||
$productFamily, | $productFamily, | ||||
function ($a, $b) use ($priceSolver) { | function ($a, $b) use ($priceSolver) { | ||||
public function getCheapestProductByRefUnit(ProductFamilyInterface $productFamily) | public function getCheapestProductByRefUnit(ProductFamilyInterface $productFamily) | ||||
{ | { | ||||
$priceSolver = $this->priceSolver; | $priceSolver = $this->priceSolver; | ||||
return $this->getCheapestOrMostExpensiveProduct( | return $this->getCheapestOrMostExpensiveProduct( | ||||
$productFamily, | $productFamily, | ||||
function ($a, $b) use ($priceSolver) { | function ($a, $b) use ($priceSolver) { | ||||
public function getMostExpensiveProductByRefUnit(ProductFamilyInterface $productFamily) | public function getMostExpensiveProductByRefUnit(ProductFamilyInterface $productFamily) | ||||
{ | { | ||||
$priceSolver = $this->priceSolver; | $priceSolver = $this->priceSolver; | ||||
return $this->getCheapestOrMostExpensiveProduct( | return $this->getCheapestOrMostExpensiveProduct( | ||||
$productFamily, | $productFamily, | ||||
function ($a, $b) use ($priceSolver) { | function ($a, $b) use ($priceSolver) { | ||||
$returnSelfIfNotActiveProducts | $returnSelfIfNotActiveProducts | ||||
) { | ) { | ||||
if ($productFamily->getActiveProducts()) { | if ($productFamily->getActiveProducts()) { | ||||
$products = $productFamily->getProductsOnline()->getValues(); | |||||
$products = $this->getProductsOnline($productFamily)->getValues(); | |||||
if (count($products) > 0) { | if (count($products) > 0) { | ||||
usort($products, $comparisonFunction); | usort($products, $comparisonFunction); | ||||
return $products[0]; | return $products[0]; | ||||
} | } | ||||
} else { | } else { | ||||
return $productFamily->getOriginProduct(); | |||||
return $this->getOriginProduct($returnSelfIfNotActiveProducts); | |||||
} | } | ||||
if ($returnSelfIfNotActiveProducts) { | if ($returnSelfIfNotActiveProducts) { | ||||
return $productFamily; | return $productFamily; | ||||
} | } | ||||
} | } | ||||
public function countProductFamiliesOrganizedByParentCategory(array $categories): int | |||||
public function getAvailableQuantityInherited(ProductFamilyInterface $productFamily) | |||||
{ | { | ||||
$count = 0; | |||||
foreach ($categories as $category) { | |||||
$count += count($category['products']); | |||||
$availableQuantity = 0; | |||||
switch ($productFamily->getBehaviorCountStock()) { | |||||
case ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_MEASURE : | |||||
case ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT_FAMILY : | |||||
$availableQuantity = $productFamily->getAvailableQuantity(); | |||||
break; | |||||
case ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT : | |||||
foreach ($this->getProductsOnline($productFamily) as $product) { | |||||
$availableQuantity += $product->getAvailableQuantityInherited(); | |||||
} | |||||
break; | |||||
case ProductFamilyModel::BEHAVIOR_COUNT_STOCK_UNLIMITED : | |||||
$availableQuantity = false; | |||||
break; | |||||
} | |||||
return $availableQuantity; | |||||
} | |||||
public function getTaxRateInherited(ProductFamilyInterface $productFamily) | |||||
{ | |||||
if ($productFamily->getTaxRate()) { | |||||
return $productFamily->getTaxRate(); | |||||
} else { | |||||
return $productFamily->getSection()->getMerchant()->getTaxRate(); | |||||
} | |||||
} | |||||
public function getProductsOnline(ProductFamilyInterface $productFamily): Collection | |||||
{ | |||||
$products = $productFamily->getProducts(); | |||||
$productsOnlineArray = new ArrayCollection(); | |||||
foreach ($products as $product) { | |||||
if ($product->getStatus() == 1 && $product->getOriginProduct() != true) { | |||||
$productsOnlineArray[] = $product; | |||||
} | |||||
} | |||||
return $productsOnlineArray; | |||||
} | |||||
public function getReductionCatalogInherited(ProductFamilyInterface $productFamily): ?ReductionCatalogInterface | |||||
{ | |||||
return $productFamily->getReductionCatalog(); | |||||
} | |||||
public function getProductCategoryParent(ProductFamilyInterface $productFamily) | |||||
{ | |||||
$productCategories = $productFamily->getProductCategories(); | |||||
if (count($productCategories) > 0) { | |||||
return $productCategories[0]->getParent(); | |||||
} | } | ||||
return false; | |||||
} | |||||
public function getProductCategoryChild(ProductFamilyInterface $productFamily) | |||||
{ | |||||
$productCategories = $productFamily->getProductCategories(); | |||||
foreach ($productCategories as $productCategory) { | |||||
if ($productCategory->getParent()) { | |||||
return $productCategory; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
public function isPropertyNoveltyOnline(ProductFamilyInterface $productFamily): ?bool | |||||
{ | |||||
if ($productFamily->getPropertyNoveltyExpirationDate()) { | |||||
$now = new \DateTime(); | |||||
if ($now <= $productFamily->getPropertyNoveltyExpirationDate()) { | |||||
return true; | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
public function countProperties(ProductFamilyInterface $productFamily): bool | |||||
{ | |||||
$count = 0; | |||||
$count += (int)strlen($productFamily->getPropertyOrganicLabel()) > 0; | |||||
$count += (int)strlen($productFamily->getPropertyWeight()) > 0; | |||||
$count += (int)strlen($productFamily->getPropertyFragrances()) > 0; | |||||
$count += (int)strlen($productFamily->getPropertyComposition()) > 0; | |||||
$count += (int)strlen($productFamily->getPropertyAllergens()) > 0; | |||||
$count += (int)strlen($productFamily->getPropertyAlcoholLevel()) > 0; | |||||
$count += (int)strlen($productFamily->getPropertyCharacteristics()) > 0; | |||||
$count += (int)strlen($productFamily->getPropertyFeature()) > 0; | |||||
$count += (int)strlen($productFamily->getPropertyPackaging()) > 0; | |||||
$count += (int)strlen($productFamily->getPropertyQuantity()) > 0; | |||||
$count += (int)strlen($productFamily->getPropertyVariety()) > 0; | |||||
$count += (int)($productFamily->getPropertyExpirationDate() != null); | |||||
return $count; | return $count; | ||||
} | } | ||||
} | |||||
public function hasProductsWithVariousWeight(ProductFamilyInterface $productFamily) | |||||
{ | |||||
if ($productFamily->getActiveProducts()) { | |||||
$arrayCountProducts = []; | |||||
$products = $this->getProductsOnline($productFamily); | |||||
foreach ($products as $product) { | |||||
$titleProduct = $product->getTitleInherited(); | |||||
if (!isset($arrayCountProducts[$titleProduct])) { | |||||
$arrayCountProducts[$titleProduct] = []; | |||||
} | |||||
if (!in_array($product->getQuantityLabelInherited(), $arrayCountProducts[$titleProduct])) { | |||||
$arrayCountProducts[$titleProduct][] = $product->getQuantityLabelInherited(); | |||||
} | |||||
if (count($arrayCountProducts[$titleProduct]) > 1) { | |||||
return true; | |||||
} | |||||
} | |||||
} | |||||
return false; | |||||
} | |||||
public function getProductsGroupByTitle(ProductFamilyInterface $productFamily): array | |||||
{ | |||||
$arrayProductsGroupByTitle = []; | |||||
$products = $this->getProductsOnline($productFamily); | |||||
foreach ($products as $product) { | |||||
if ($product->getStatus() == 1) { | |||||
$titleProduct = $product->getTitleInherited(); | |||||
if (!isset($arrayProductsGroupByTitle[$titleProduct])) { | |||||
$arrayProductsGroupByTitle[$titleProduct] = []; | |||||
} | |||||
$arrayProductsGroupByTitle[$titleProduct][] = $product; | |||||
} | |||||
} | |||||
return $arrayProductsGroupByTitle; | |||||
} | |||||
public function getOriginProduct(ProductFamilyInterface $productFamily): ProductInterface | |||||
{ | |||||
$products = $productFamily->getProducts(); | |||||
foreach ($products as $product) { | |||||
if ($product->getOriginProduct()) { | |||||
return $product; | |||||
} | |||||
} | |||||
} | |||||
public function getOriginProductOnline(ProductFamilyInterface $productFamily): ?ProductInterface | |||||
{ | |||||
$originProduct = $this->getOriginProduct($productFamily); | |||||
if ($originProduct->getStatus() == 1) { | |||||
return $originProduct; | |||||
} else { | |||||
return null; | |||||
} | |||||
} | |||||
public function hasOneProductOnline(ProductFamilyInterface $productFamily) | |||||
{ | |||||
if (($productFamily->getActiveProducts() && count($this->getProductsOnline($productFamily)) > 0) | |||||
|| (!$productFamily->getActiveProducts() && $this->getOriginProduct($productFamily))) { | |||||
return true; | |||||
} | |||||
return false; | |||||
} | |||||
public function getFieldBuyingPrice(ProductFamilyInterface $productFamily): string | |||||
{ | |||||
if ($productFamily->getBehaviorPrice() === ProductFamilyModel::BEHAVIOR_PRICE_BY_PIECE) { | |||||
return 'buyingPrice'; | |||||
} elseif ($productFamily->getBehaviorPrice() === ProductFamilyModel::BEHAVIOR_PRICE_BY_REFERENCE_UNIT) { | |||||
return 'buyingPriceByRefUnit'; | |||||
} | |||||
} | |||||
public function getFieldPrice(ProductFamilyInterface $productFamily): string | |||||
{ | |||||
if ($productFamily->getBehaviorPrice() === ProductFamilyModel::BEHAVIOR_PRICE_BY_PIECE) { | |||||
return 'price'; | |||||
} elseif ($productFamily->getBehaviorPrice() === ProductFamilyModel::BEHAVIOR_PRICE_BY_REFERENCE_UNIT) { | |||||
return 'priceByRefUnit'; | |||||
} | |||||
} | |||||
public function getBehaviorPriceInherited(ProductFamilyInterface $productFamily) :string | |||||
{ | |||||
return $productFamily->getBehaviorPrice(); | |||||
} | |||||
public function getBehaviorCountStockChoices(): array | |||||
{ | |||||
return [ | |||||
ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_MEASURE, | |||||
ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT, | |||||
ProductFamilyModel::BEHAVIOR_COUNT_STOCK_BY_PRODUCT_FAMILY, | |||||
ProductFamilyModel::BEHAVIOR_COUNT_STOCK_UNLIMITED, | |||||
]; | |||||
} | |||||
public function getBehaviorDisplaySaleChoices(): array | |||||
{ | |||||
return [ | |||||
ProductFamilyModel::BEHAVIOR_DISPLAY_SALE_BY_MEASURE, | |||||
ProductFamilyModel::BEHAVIOR_DISPLAY_SALE_BY_QUANTITY, | |||||
]; | |||||
} | |||||
public function getBehaviorStockCycleChoices(): array | |||||
{ | |||||
return [ | |||||
ProductFamilyModel::BEHAVIOR_STOCK_CYCLE_NON_RENEWABLE, | |||||
ProductFamilyModel::BEHAVIOR_STOCK_CYCLE_RENEWABLE, | |||||
ProductFamilyModel::BEHAVIOR_STOCK_CYCLE_RENEWABLE_VALIDATION, | |||||
]; | |||||
} | |||||
public function getWaringMessageTypeChoices(): array | |||||
{ | |||||
return [ | |||||
ProductFamilyModel::WARNING_MESSAGE_TYPE_ERROR, | |||||
ProductFamilyModel::WARNING_MESSAGE_TYPE_INFO, | |||||
ProductFamilyModel::WARNING_MESSAGE_TYPE_SUCCESS, | |||||
ProductFamilyModel::WARNING_MESSAGE_TYPE_WARNING, | |||||
]; | |||||
} | |||||
public function getBehaviorAddToCartChoices(): array | |||||
{ | |||||
return [ | |||||
ProductFamilyModel::BEHAVIOR_ADD_TO_CART_MULTIPLE, | |||||
ProductFamilyModel::BEHAVIOR_ADD_TO_CART_SIMPLE, | |||||
]; | |||||
} | |||||
public function getBehaviorPriceChoices(): array | |||||
{ | |||||
return [ | |||||
ProductFamilyModel::BEHAVIOR_PRICE_BY_PIECE, | |||||
ProductFamilyModel::BEHAVIOR_PRICE_BY_REFERENCE_UNIT, | |||||
]; | |||||
} | |||||
public function getPropertyOrganicLabelChoices(): array | |||||
{ | |||||
return [ | |||||
ProductFamilyModel::PROPERTY_ORGANIC_LABEL_AB, | |||||
ProductFamilyModel::PROPERTY_ORGANIC_LABEL_NP, | |||||
ProductFamilyModel::PROPERTY_ORGANIC_LABEL_HVE, | |||||
ProductFamilyModel::PROPERTY_ORGANIC_LABEL_TVVR, | |||||
]; | |||||
} | |||||
public function getTypeExpirationDateChoices(): array | |||||
{ | |||||
return [ | |||||
ProductFamilyModel::TYPE_EXPIRATION_DATE_DLC, | |||||
ProductFamilyModel::TYPE_EXPIRATION_DATE_DDM, | |||||
ProductFamilyModel::TYPE_EXPIRATION_DATE_DLUO, | |||||
]; | |||||
} | |||||
public function getBehaviorExpirationDateChoices(): array | |||||
{ | |||||
return [ | |||||
ProductFamilyModel::BEHAVIOR_EXPIRATION_DATE_BY_PRODUCT_FAMILY, | |||||
ProductFamilyModel::BEHAVIOR_EXPIRATION_DATE_BY_PRODUCT, | |||||
]; | |||||
} | |||||
} | |||||
// Initialise les valeurs des données pour chaque Interval de date | // Initialise les valeurs des données pour chaque Interval de date | ||||
public function init(SectionInterface $section, OrderShopSolver $orderShopSolver, OpeningResolver $openingResolver) | public function init(SectionInterface $section, OrderShopSolver $orderShopSolver, OpeningResolver $openingResolver) | ||||
{ | { | ||||
$currentCycleNumber = $orderShopSolver->getCycleNumberCurrentOrder(); | |||||
$currentCycleNumber = $orderShopSolver->getCycleNumberCurrentOrder($section); | |||||
if ($openingResolver->isOpenSale($section, null,OpeningResolver::OPENING_CONTEXT_BACKEND) == false && date('w') > 2) { | if ($openingResolver->isOpenSale($section, null,OpeningResolver::OPENING_CONTEXT_BACKEND) == false && date('w') > 2) { | ||||
$currentCycleNumber = $currentCycleNumber - 1; | $currentCycleNumber = $currentCycleNumber - 1; | ||||
} | } |