'pointsSaleCount' => $this->getPointSaleModule()->getRepository()->countPointSales(), | 'pointsSaleCount' => $this->getPointSaleModule()->getRepository()->countPointSales(), | ||||
'distributionsArray' => $this->getDistributionModule()->getRepository()->findDistributionsDashboard(), | 'distributionsArray' => $this->getDistributionModule()->getRepository()->findDistributionsDashboard(), | ||||
'ordersArray' => $this->getOrderModule()->getRepository()->findOrdersDashboard(), | 'ordersArray' => $this->getOrderModule()->getRepository()->findOrdersDashboard(), | ||||
'subscriptionsLatestAddedArray' => $this->getSubscriptionModule()->getRepository()->findSubscriptionsLatestAdded() | |||||
'subscriptionsLatestAddedArray' => $this->getSubscriptionModule()->getRepository()->findSubscriptionsLatestAdded(), | |||||
'forumDiscussionsArray' => \Yii::$app->forumFlarumClient->getLastDiscussions() | |||||
]); | ]); | ||||
} | } | ||||
} | } |
'Code Classification vente', | 'Code Classification vente', | ||||
]; | ]; | ||||
foreach ($documentModule->getProductsOrders($document) as $productOrderArray) { | |||||
foreach ($documentModule->getProductsOrders($document, true) as $productOrderArray) { | |||||
foreach ($productOrderArray as $productOrder) { | foreach ($productOrderArray as $productOrder) { | ||||
$price = $productOrder->getPrice(); | $price = $productOrder->getPrice(); |
/** | /** | ||||
* Affiche le CA réalisé par mois sur une année donnée | * Affiche le CA réalisé par mois sur une année donnée | ||||
*/ | */ | ||||
public function actionIndex(int $year = null) | |||||
public function actionIndex(int $year = null, string $displayBy = 'month') | |||||
{ | { | ||||
$producerModule = $this->getProducerModule(); | |||||
$producerCurrent = $this->getProducerCurrent(); | $producerCurrent = $this->getProducerCurrent(); | ||||
if(!$year) { | if(!$year) { | ||||
$year = date('Y'); | $year = date('Y'); | ||||
} | } | ||||
$yearsWithTurnoverArray = $producerModule->getYearsWithTurnover($producerCurrent); | |||||
$dataChartTurnover = $producerModule->getDatasChartTurnoverStatistics($producerCurrent, $year); | |||||
$yearsWithTurnoverArray = $this->getProducerModule()->getRepository()->getYearsWithTurnover($producerCurrent); | |||||
$dataChartTurnover = $this->getProducerModule()->getRepository()->getDatasChartTurnoverStatistics($producerCurrent, $year, $displayBy); | |||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'displayBy' => $displayBy, | |||||
'yearCurrent' => $year, | 'yearCurrent' => $year, | ||||
'dataLabels' => $dataChartTurnover['labels'], | 'dataLabels' => $dataChartTurnover['labels'], | ||||
'data' => $dataChartTurnover['data'], | 'data' => $dataChartTurnover['data'], |
} | } | ||||
// Tests | // Tests | ||||
$usersArray = [ | |||||
/*$usersArray = [ | |||||
['email' => 'contact@guillaumebourgeois.fr', 'name' => '', 'lastname' => ''] | ['email' => 'contact@guillaumebourgeois.fr', 'name' => '', 'lastname' => ''] | ||||
]; | |||||
];*/ | |||||
foreach($usersArray as $user) { | foreach($usersArray as $user) { | ||||
$body['Messages'][] = [ | $body['Messages'][] = [ |
use common\logic\Order\Order\Model\Order; | use common\logic\Order\Order\Model\Order; | ||||
use common\logic\Order\Order\Module\OrderModule; | use common\logic\Order\Order\Module\OrderModule; | ||||
use common\logic\Producer\Producer\Module\ProducerModule; | use common\logic\Producer\Producer\Module\ProducerModule; | ||||
use common\logic\Setting\SettingModule; | |||||
use common\logic\Subscription\Subscription\Module\SubscriptionModule; | use common\logic\Subscription\Subscription\Module\SubscriptionModule; | ||||
use common\logic\User\User\Module\UserModule; | use common\logic\User\User\Module\UserModule; | ||||
use yii\helpers\Html ; | use yii\helpers\Html ; | ||||
$orderModule = OrderModule::getInstance(); | $orderModule = OrderModule::getInstance(); | ||||
$subscriptionModule = SubscriptionModule::getInstance(); | $subscriptionModule = SubscriptionModule::getInstance(); | ||||
$producerModule = ProducerModule::getInstance(); | $producerModule = ProducerModule::getInstance(); | ||||
$settingModule = SettingModule::getInstance(); | |||||
$adminSettingBag = $settingModule->getAdminSettingBag(); | |||||
$this->setTitle('Tableau de bord'); | $this->setTitle('Tableau de bord'); | ||||
?> | ?> | ||||
<div class="dashboard-index"> | <div class="dashboard-index"> | ||||
<?php if(Yii::$app->request->get('error_products_points_sale')): ?> | |||||
<div class="alert alert-warning"> | |||||
Vous devez ajouter <?php if(!$productsCount): ?> des produits<?php endif; ?> | |||||
<?php if(!$productsCount && !$pointsSaleCount): ?> et<?php endif; ?> | |||||
<?php if(!$pointsSaleCount): ?> un ou des points de vente <?php endif; ?> | |||||
avant d'effectuer cette action. | |||||
</div> | |||||
<?php endif; ?> | |||||
<div <?php if($adminSettingBag->get('forumFlarumUrl')): ?>class="col-md-8"<?php endif; ?>> | |||||
<?php if(Yii::$app->request->get('error_products_points_sale')): ?> | |||||
<div class="alert alert-warning"> | |||||
Vous devez ajouter <?php if(!$productsCount): ?> des produits<?php endif; ?> | |||||
<?php if(!$productsCount && !$pointsSaleCount): ?> et<?php endif; ?> | |||||
<?php if(!$pointsSaleCount): ?> un ou des points de vente <?php endif; ?> | |||||
avant d'effectuer cette action. | |||||
</div> | |||||
<?php endif; ?> | |||||
<?php if(!$productsCount): ?> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-clone"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"><br /><?= Html::a('Ajouter des produits', ['product/create'], ['class' => 'btn btn-default']); ?></span> | |||||
<?php if(!$productsCount): ?> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-clone"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"><br /><?= Html::a('Ajouter des produits', ['product/create'], ['class' => 'btn btn-default']); ?></span> | |||||
</div> | |||||
</div> | </div> | ||||
</div> | |||||
<?php endif; ?> | |||||
<?php endif; ?> | |||||
<?php if(!$pointsSaleCount): ?> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-map-marker"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"><br /><?= Html::a('Ajouter des points de vente', ['point-sale/create'], ['class' => 'btn btn-default']); ?></span> | |||||
<?php if(!$pointsSaleCount): ?> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-map-marker"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"><br /><?= Html::a('Ajouter des points de vente', ['point-sale/create'], ['class' => 'btn btn-default']); ?></span> | |||||
</div> | |||||
</div> | </div> | ||||
</div> | |||||
<?php endif; ?> | |||||
<?php endif; ?> | |||||
<?php if($productsCount && $pointsSaleCount && !count($distributionsArray)): ?> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-calendar"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"><br /><?= Html::a('Ajouter des jours de distribution', ['distribution/index'], ['class' => 'btn btn-default']); ?></span> | |||||
<?php if($productsCount && $pointsSaleCount && !count($distributionsArray)): ?> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-calendar"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"><br /><?= Html::a('Ajouter des jours de distribution', ['distribution/index'], ['class' => 'btn btn-default']); ?></span> | |||||
</div> | |||||
</div> | |||||
<?php endif; ?> | |||||
<?php if(count($distributionsArray)): ?> | |||||
<div id="distributions"> | |||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title"> | |||||
Prochaines distributions | |||||
</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<!-- distributions --> | |||||
<?php foreach($distributionsArray as $distribution): ?> | |||||
<div class="col-md-6 col-sm-12 col-xs-12"> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-green date"> | |||||
<span class="day"><?= strftime('%A', strtotime($distribution->date)) ?></span> | |||||
<span class="num"><?= date('d', strtotime($distribution->date)) ?></span> | |||||
<span class="month"><?= strftime('%B', strtotime($distribution->date)) ?></span> | |||||
</span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"> | |||||
<?php if(count($distribution->order)): ?> | |||||
<strong><?= count($distribution->order); ?></strong> COMMANDES | |||||
<?php else: ?> | |||||
AUCUNE COMMANDE | |||||
<?php endif; ?> | |||||
</span> | |||||
<span class="info-box-number"></span> | |||||
<div class="buttons"> | |||||
<?= Html::a('<span class="fa fa-eye"></span>', ['distribution/index', 'date' => $distribution->date], ['class' => 'btn btn-default']); ?> | |||||
<?php if(count($distribution->order)): ?> | |||||
<?php | |||||
$exportsEnabledArray = $distributionModule->getExportManager()->getAllEnabled(); | |||||
foreach($exportsEnabledArray as $name => $export) { | |||||
echo Html::a('<span class="fa fa-download"></span>', ['distribution/export', 'name' => $name, 'date' => $distribution->date], ['class' => 'btn btn-default', 'title' => $export[0]]).' '; | |||||
} | |||||
?> | |||||
<?php endif; ?> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<?php endforeach; ?> | |||||
</div> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
<?php endif; ?> | |||||
<?php endif; ?> | |||||
</div> | |||||
<?php if(count($distributionsArray)): ?> | |||||
<div id="distributions"> | |||||
<?php if($adminSettingBag->get('forumFlarumUrl')): ?> | |||||
<div class="col-md-4"> | |||||
<div class="panel panel-default"> | <div class="panel panel-default"> | ||||
<div class="panel-heading"> | <div class="panel-heading"> | ||||
<h3 class="panel-title"> | |||||
Prochaines distributions | |||||
</h3> | |||||
<h3 class="panel-title"> | |||||
Derniers sujets sur le forum | |||||
</h3> | |||||
</div> | </div> | ||||
<div class="panel-body"> | <div class="panel-body"> | ||||
<!-- distributions --> | |||||
<?php foreach($distributionsArray as $distribution): ?> | |||||
<div class="col-md-4 col-sm-12 col-xs-12"> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-green date"> | |||||
<span class="day"><?= strftime('%A', strtotime($distribution->date)) ?></span> | |||||
<span class="num"><?= date('d', strtotime($distribution->date)) ?></span> | |||||
<span class="month"><?= strftime('%B', strtotime($distribution->date)) ?></span> | |||||
</span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"> | |||||
<?php if(count($distribution->order)): ?> | |||||
<strong><?= count($distribution->order); ?></strong> COMMANDES | |||||
<?php else: ?> | |||||
AUCUNE COMMANDE | |||||
<?php endif; ?> | |||||
</span> | |||||
<span class="info-box-number"></span> | |||||
<div class="buttons"> | |||||
<?= Html::a('<span class="fa fa-eye"></span>', ['distribution/index', 'date' => $distribution->date], ['class' => 'btn btn-default']); ?> | |||||
<?php if(count($distribution->order)): ?> | |||||
<?php | |||||
$exportsEnabledArray = $distributionModule->getExportManager()->getAllEnabled(); | |||||
foreach($exportsEnabledArray as $name => $export) { | |||||
echo Html::a('<span class="fa fa-download"></span>', ['distribution/export', 'name' => $name, 'date' => $distribution->date], ['class' => 'btn btn-default', 'title' => $export[0]]).' '; | |||||
} | |||||
?> | |||||
<?php endif; ?> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<?php endforeach; ?> | |||||
<?php //echo print_r($forumDiscussionsArray); ?> | |||||
<?php if($forumDiscussionsArray && count($forumDiscussionsArray['data'])): ?> | |||||
<table class="table"> | |||||
<?php $forumDiscussionsLimitedArray = array_slice($forumDiscussionsArray['data'], 0, min(3, count($forumDiscussionsArray['data']))); ?> | |||||
<?php foreach($forumDiscussionsLimitedArray as $forumDiscussion): ?> | |||||
<tr> | |||||
<?php //echo print_r($forumDiscussion); ?> | |||||
<td><?= $forumDiscussion['attributes']['title']; ?></td> | |||||
<td><?= date('d/m à H:i', strtotime($forumDiscussion['attributes']['lastPostedAt'])); ?></td> | |||||
</tr> | |||||
<?php endforeach; ?> | |||||
</table> | |||||
<?php else: ?> | |||||
<p>Aucun sujet sur le forum.</p> | |||||
<?php endif; ?> | |||||
<p> | |||||
<a href="<?= $settingModule->getAdminSettingBag()->get('forumFlarumUrl'); ?>" class="btn btn-default"> | |||||
<span class="fa fa-comments"></span> | |||||
Consulter le forum | |||||
</a> | |||||
</p> | |||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<div class="panel panel-default"> | <div class="panel panel-default"> | ||||
<div class="panel-heading"> | <div class="panel-heading"> | ||||
<h3 class="panel-title"> | <h3 class="panel-title"> | ||||
Derniers abonnements créés | |||||
Derniers abonnements créés/modifiés | |||||
</h3> | </h3> | ||||
</div> | </div> | ||||
<div class="panel-body"> | <div class="panel-body"> | ||||
<tbody> | <tbody> | ||||
<?php foreach($subscriptionsLatestAddedArray as $subscription): ?> | <?php foreach($subscriptionsLatestAddedArray as $subscription): ?> | ||||
<tr> | <tr> | ||||
<td><?= date('d/m/Y à H:i', strtotime($subscription->created_at)); ?></td> | |||||
<td><?= date('d/m/Y à H:i', strtotime($subscription->updated_at ?: $subscription->created_at)); ?></td> | |||||
<td><?= $userModule->getUsername($subscription->user); ?></td> | <td><?= $userModule->getUsername($subscription->user); ?></td> | ||||
<td><?= Html::encode($subscription->pointSale->name); ?></td> | <td><?= Html::encode($subscription->pointSale->name); ?></td> | ||||
<td><?= $subscriptionModule->getProductsListAsHtml($subscription); ?></td> | <td><?= $subscriptionModule->getProductsListAsHtml($subscription); ?></td> |
<button id="btn-add-subscriptions" @click="addSubscriptions" class="btn btn-default btn-xs"><span class="glyphicon glyphicon-plus"></span> Importer les abonnements</button> | <button id="btn-add-subscriptions" @click="addSubscriptions" class="btn btn-default btn-xs"><span class="glyphicon glyphicon-plus"></span> Importer les abonnements</button> | ||||
<template v-if="producer && producer.tiller == true"> | <template v-if="producer && producer.tiller == true"> | ||||
<button v-if="tillerIsSynchro" id="btn-tiller" class="btn btn-success btn-xs" disabled><span class="glyphicon glyphicon-refresh"></span> Synchronisé avec Tiller</button> | <button v-if="tillerIsSynchro" id="btn-tiller" class="btn btn-success btn-xs" disabled><span class="glyphicon glyphicon-refresh"></span> Synchronisé avec Tiller</button> | ||||
<template v-else-if="!isDistributionToday()"> | |||||
<span data-toggle="tooltip" data-placement="top" data-original-title="Synchronisation possible uniquement le jour de la distribution"> | |||||
<button id="btn-tiller" class="btn btn-xs btn-default" disabled><span class="glyphicon glyphicon-refresh"></span> Synchroniser avec Tiller</button> | |||||
</span> | |||||
</template> | |||||
<button v-else id="btn-tiller" class="btn btn-xs btn-default" @click="synchroTiller"><span class="glyphicon glyphicon-refresh"></span> Synchroniser avec Tiller</button> | <button v-else id="btn-tiller" class="btn btn-xs btn-default" @click="synchroTiller"><span class="glyphicon glyphicon-refresh"></span> Synchroniser avec Tiller</button> | ||||
</template> | </template> | ||||
<button v-if="producer && producer.credit" id="btn-pay-orders" class="btn btn-default btn-xs" @click="payOrders"><span class="glyphicon glyphicon-euro"></span> Débiter les commandes</button> | <button v-if="producer && producer.credit" id="btn-pay-orders" class="btn btn-default btn-xs" @click="payOrders"><span class="glyphicon glyphicon-euro"></span> Débiter les commandes</button> | ||||
<a v-if="producer && producer.credit && order.id_user > 0 && user.id_user == order.id_user" class="btn btn-xs btn-primary btn-credit" :href="baseUrl+'/user/credit?id='+user.id_user" v-for="user in users">{{ parseFloat(user.credit).toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}</a> | <a v-if="producer && producer.credit && order.id_user > 0 && user.id_user == order.id_user" class="btn btn-xs btn-primary btn-credit" :href="baseUrl+'/user/credit?id='+user.id_user" v-for="user in users">{{ parseFloat(user.credit).toFixed(2).replace(/(\d)(?=(\d{3})+(?:\.\d+)?$)/g, "$1,")+' €' }}</a> | ||||
<label class="control-label" for="select-id-user"> | <label class="control-label" for="select-id-user"> | ||||
Utilisateur | Utilisateur | ||||
<a v-if="!order.id_user || order.id_user == 0" class="btn btn-default btn-xs" href="<?= Yii::$app->urlManager->createUrl('user/create'); ?>"> | |||||
<span class="glyphicon glyphicon-plus"></span> | |||||
Créer un utilisateur | |||||
</a> | |||||
</label> | </label> | ||||
<select class="form-control select2-order-form" v-model="order.id_user" @change="userChange"> | <select class="form-control select2-order-form" v-model="order.id_user" @change="userChange"> | ||||
<option value="0">--</option> | <option value="0">--</option> |
foreach($ordersArray as $key => $order) { | foreach($ordersArray as $key => $order) { | ||||
$index ++; | $index ++; | ||||
echo $distributionShoppingCartLabelsPdfGenerator->getShoppingCartLabelAsHtml($order, $index); | |||||
echo $distributionShoppingCartLabelsPdfGenerator->getShoppingCartLabelAsHtml($order, $index, $isSpecificFormat); | |||||
if($index == $shoppingCartLabelsPerColumn) { | if($index == $shoppingCartLabelsPerColumn) { | ||||
$index = 0; | $index = 0; |
<?php endforeach; ?> | <?php endforeach; ?> | ||||
<?php endforeach; ?> | <?php endforeach; ?> | ||||
<?php else: ?> | <?php else: ?> | ||||
<?php foreach ($documentModule->getProductsOrders($document) as $product): ?> | |||||
<?php foreach ($documentModule->getProductsOrders($document, true) as $product): ?> | |||||
<?php foreach ($product as $productOrder): ?> | <?php foreach ($product as $productOrder): ?> | ||||
<?= $this->render('_download_product_line', [ | <?= $this->render('_download_product_line', [ | ||||
'producer' => $producer, | 'producer' => $producer, |
?> | ?> | ||||
Affichage : | |||||
<?php | |||||
echo Html::a('Mois', | |||||
['stats/index', 'year' => $yearCurrent, 'displayBy' => 'month'], | |||||
['class' => 'btn btn-xs '.(($displayBy == 'month') ? 'btn-primary' : 'btn-default')]).' '; | |||||
echo Html::a('Semaine', | |||||
['stats/index', 'year' => $yearCurrent, 'displayBy' => 'week'], | |||||
['class' => 'btn btn-xs '.(($displayBy == 'week') ? 'btn-primary' : 'btn-default')]).' '; | |||||
?> | |||||
<br><br> | |||||
<?php | <?php | ||||
foreach($yearsWithTurnoverArray as $year) { | foreach($yearsWithTurnoverArray as $year) { | ||||
$classBtn = 'btn-default'; | $classBtn = 'btn-default'; | ||||
if($yearCurrent == $year) { | if($yearCurrent == $year) { | ||||
$classBtn = 'btn-primary'; | $classBtn = 'btn-primary'; | ||||
} | } | ||||
echo Html::a($year, ['stats/index', 'year' => $year], ['class' => 'btn '.$classBtn]).' '; | |||||
echo Html::a($year, ['stats/index', 'year' => $year, 'displayBy' => $displayBy], ['class' => 'btn '.$classBtn]).' '; | |||||
} | } | ||||
?> | ?> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
</div> | </div> | ||||
<?php if($adminSettingBag->get('forumFlarumUrl')): ?> | |||||
<div class="col-md-6 col-left"> | |||||
<div class="info-box"> | |||||
<span class="info-box-icon bg-yellow"><i class="fa fa-users"></i></span> | |||||
<div class="info-box-content"> | |||||
<span class="info-box-text"><br/><?= Html::a("Ouvrir une discussion sur le forum", $adminSettingBag->get('forumFlarumUrl'), ['class' => 'btn btn-sm btn-default', 'target' => '_blank']); ?></span> | |||||
</div> | |||||
</div> | |||||
</div> | |||||
<?php endif; ?> | |||||
</div> | </div> | ||||
<div class="clr"></div> | <div class="clr"></div> | ||||
<?php endif; ?> | <?php endif; ?> |
} | } | ||||
return false; | return false; | ||||
}, | }, | ||||
isDistributionToday: function() { | |||||
var today = new Date(); | |||||
return this.date | |||||
&& today.getFullYear() == this.date.getFullYear() | |||||
&& today.getMonth() == this.date.getMonth() | |||||
&& today.getDay() == this.date.getDay(); | |||||
}, | |||||
init: function (idActivePointSale) { | init: function (idActivePointSale) { | ||||
var app = this; | var app = this; | ||||
this.showLoading = true; | this.showLoading = true; |
var pricesArray = product.prices; | var pricesArray = product.prices; | ||||
var unitCoefficient = product.unit_coefficient; | var unitCoefficient = product.unit_coefficient; | ||||
if (theQuantity) { | |||||
theQuantity = theQuantity / unitCoefficient; | |||||
} | |||||
if(pricesArray && unitCoefficient) { | |||||
if (theQuantity) { | |||||
theQuantity = theQuantity / unitCoefficient; | |||||
} | |||||
for (var i = 0; i < pricesArray.length; i++) { | |||||
if(pricesArray[i]) { | |||||
var price = pricesArray[i].price; | |||||
var fromQuantity = pricesArray[i].from_quantity; | |||||
for (var i = 0; i < pricesArray.length; i++) { | |||||
if(pricesArray[i]) { | |||||
var price = pricesArray[i].price; | |||||
var fromQuantity = pricesArray[i].from_quantity; | |||||
if (price < thePrice && fromQuantity <= theQuantity) { | |||||
thePrice = price; | |||||
if (price < thePrice && fromQuantity <= theQuantity) { | |||||
thePrice = price; | |||||
} | |||||
} | } | ||||
} | } | ||||
} | } |
public string $url; | public string $url; | ||||
public array $auth; | public array $auth; | ||||
public function __construct(string $url, array $auth) | |||||
public function __construct(string $url, array $auth = []) | |||||
{ | { | ||||
$this->url = $url; | $this->url = $url; | ||||
$this->auth = $auth; | $this->auth = $auth; | ||||
private function getClient() | private function getClient() | ||||
{ | { | ||||
$curl = new Curl(); | $curl = new Curl(); | ||||
$curl->setHeader($this->auth[0], $this->auth[1]); | |||||
if(count($this->auth)) { | |||||
$curl->setHeader($this->auth[0], $this->auth[1]); | |||||
} | |||||
return $curl; | return $curl; | ||||
} | } | ||||
<?php | |||||
namespace common\components; | |||||
class ForumFlarumClient extends AbstractApi | |||||
{ | |||||
public function getLastDiscussions() | |||||
{ | |||||
return $this->get('discussions', ['offset' => 1]); | |||||
} | |||||
} |
use common\components\BusinessLogic; | use common\components\BusinessLogic; | ||||
use common\components\DolibarrApi; | use common\components\DolibarrApi; | ||||
use common\components\ForumFlarumClient; | |||||
use common\logic\Distribution\Distribution\Model\Distribution; | use common\logic\Distribution\Distribution\Model\Distribution; | ||||
use common\logic\Document\DeliveryNote\Model\DeliveryNote; | use common\logic\Document\DeliveryNote\Model\DeliveryNote; | ||||
use common\logic\Order\Order\Model\Order; | use common\logic\Order\Order\Model\Order; | ||||
'alwaysdataClient' => [ | 'alwaysdataClient' => [ | ||||
'class' => 'common\components\AlwaysdataClient' | 'class' => 'common\components\AlwaysdataClient' | ||||
], | ], | ||||
'forumFlarumClient' => function() { | |||||
return new ForumFlarumClient(Yii::$app->logic->getSettingModule()->getAdminSettingBag()->get('forumFlarumUrl').'api/'); | |||||
}, | |||||
'dolibarrApi' => function() { | |||||
return new DolibarrApi( | |||||
Yii::$app->parameterBag->get('dolibarrApiUrl'), | |||||
['DOLAPIKEY', \Yii::$app->parameterBag->get('dolibarrApiKey')] | |||||
); | |||||
}, | |||||
'assetManager' => [ | 'assetManager' => [ | ||||
'linkAssets' => YII_ENV == "dev" ? 'true' : false, | 'linkAssets' => YII_ENV == "dev" ? 'true' : false, | ||||
], | ], | ||||
'enableStrictParsing' => false, | 'enableStrictParsing' => false, | ||||
'rules' => [], | 'rules' => [], | ||||
], | ], | ||||
'dolibarrApi' => function() { | |||||
return new DolibarrApi( | |||||
Yii::$app->parameterBag->get('dolibarrApiUrl'), | |||||
['DOLAPIKEY', \Yii::$app->parameterBag->get('dolibarrApiKey')] | |||||
); | |||||
}, | |||||
'logic' => function () { | 'logic' => function () { | ||||
return new BusinessLogic(); | return new BusinessLogic(); | ||||
}, | }, |
*/ | */ | ||||
return [ | return [ | ||||
'version' => '23.12.B', | |||||
'version' => '23.12.C', | |||||
'maintenanceMode' => false, | 'maintenanceMode' => false, | ||||
'siteName' => 'Opendistrib', | 'siteName' => 'Opendistrib', | ||||
'adminEmail' => 'contact@opendistrib.net', | 'adminEmail' => 'contact@opendistrib.net', |
.payment-detail-remaining-surplus { | .payment-detail-remaining-surplus { | ||||
font-size: 10px; | font-size: 10px; | ||||
} | } | ||||
.td-order-amount.is-order-paid { | |||||
background-color: #ddd; | |||||
} | |||||
', | ', | ||||
'methods' => [ | 'methods' => [ | ||||
'SetHeader' => ['Commandes du ' . date('d/m/Y', strtotime($distribution->date))], | 'SetHeader' => ['Commandes du ' . date('d/m/Y', strtotime($distribution->date))], | ||||
public function columnOrderAmount(Order $order): string | public function columnOrderAmount(Order $order): string | ||||
{ | { | ||||
$html = '<td class="td-order-amount"><strong>'.number_format($order->amount_with_tax, 2) . ' €</strong>'; | |||||
$isOrderPaid = $this->orderRepository->isOrderPaid($order); | |||||
$html = '<td class="td-order-amount'.(($isOrderPaid) ? ' is-order-paid' : '').'"><strong>'.number_format($order->amount_with_tax, 2) . ' €</strong>'; | |||||
$paymentLabelPaid = $this->orderRepository->getPaymentLabelPaid($order); | $paymentLabelPaid = $this->orderRepository->getPaymentLabelPaid($order); | ||||
if($paymentLabelPaid && strlen($paymentLabelPaid)) { | if($paymentLabelPaid && strlen($paymentLabelPaid)) { |
use common\logic\Feature\Feature\FeatureManager; | use common\logic\Feature\Feature\FeatureManager; | ||||
use common\logic\Order\Order\Model\Order; | use common\logic\Order\Order\Model\Order; | ||||
use common\logic\Order\Order\Repository\OrderRepository; | use common\logic\Order\Order\Repository\OrderRepository; | ||||
use common\logic\Order\Order\Service\OrderBuilder; | |||||
use common\logic\Order\Order\Service\OrderSolver; | use common\logic\Order\Order\Service\OrderSolver; | ||||
use common\logic\Producer\Producer\Service\ProducerSolver; | use common\logic\Producer\Producer\Service\ProducerSolver; | ||||
use kartik\mpdf\Pdf; | use kartik\mpdf\Pdf; | ||||
protected OrderRepository $orderRepository; | protected OrderRepository $orderRepository; | ||||
protected OrderSolver $orderSolver; | protected OrderSolver $orderSolver; | ||||
protected FeatureChecker $featureChecker; | protected FeatureChecker $featureChecker; | ||||
protected OrderBuilder $orderBuilder; | |||||
public function loadDependencies(): void | public function loadDependencies(): void | ||||
{ | { | ||||
$this->orderRepository = $this->loadService(OrderRepository::class); | $this->orderRepository = $this->loadService(OrderRepository::class); | ||||
$this->orderSolver = $this->loadService(OrderSolver::class); | $this->orderSolver = $this->loadService(OrderSolver::class); | ||||
$this->featureChecker = $this->loadService(FeatureChecker::class); | $this->featureChecker = $this->loadService(FeatureChecker::class); | ||||
$this->orderBuilder = $this->loadService(OrderBuilder::class); | |||||
} | } | ||||
public function getSpecificFormatDetailsArray(): array | public function getSpecificFormatDetailsArray(): array | ||||
$ordersArray = $this->orderRepository->findOrdersByDistribution($distribution); | $ordersArray = $this->orderRepository->findOrdersByDistribution($distribution); | ||||
$ordersArray = $this->filterOrdersExcludedUsersAndPointSales($ordersArray); | $ordersArray = $this->filterOrdersExcludedUsersAndPointSales($ordersArray); | ||||
foreach($ordersArray as $order) { | |||||
$this->orderBuilder->initOrder($order); | |||||
} | |||||
$content = \Yii::$app->getView()->render('@backend/views/distribution/shopping-cart-labels.php', [ | $content = \Yii::$app->getView()->render('@backend/views/distribution/shopping-cart-labels.php', [ | ||||
'distribution' => $distribution, | 'distribution' => $distribution, | ||||
'ordersArray' => $ordersArray, | 'ordersArray' => $ordersArray, | ||||
height: '.$specificFormatHeight.'mm; | height: '.$specificFormatHeight.'mm; | ||||
display: block; | display: block; | ||||
float: left; | float: left; | ||||
} | |||||
.shopping-cart-label .amount-and-payment { | |||||
margin-top: 8px; | |||||
font-size: 10px; | |||||
/*border-top: dotted 1px gray;*/ | |||||
} | |||||
.shopping-cart-label .amount-and-payment .amount { | |||||
display: inline-block; | |||||
background-color: #e0e0e0; | |||||
color: #333; | |||||
font-weight: bold; | |||||
padding: 3px 8px; | |||||
border-radius: 8px; | |||||
}'; | }'; | ||||
} | } | ||||
else { | else { | ||||
return $css; | return $css; | ||||
} | } | ||||
public function getShoppingCartLabelAsHtml(Order $order, int $index): string | |||||
public function getShoppingCartLabelAsHtml(Order $order, int $index, bool $isSpecificFormat): string | |||||
{ | { | ||||
$amountAndPayment = ''; | |||||
if($isSpecificFormat) { | |||||
$amountAndPayment = '<div class="amount-and-payment">'; | |||||
$amountAndPayment .= '<span class="amount">'.$this->orderSolver->getOrderAmountWithTax($order, Order::AMOUNT_TOTAL, true).'</span>'; | |||||
$paymentLabelPaid = $this->orderRepository->getPaymentLabelPaid($order); | |||||
if($paymentLabelPaid && strlen($paymentLabelPaid)) { | |||||
$amountAndPayment .= ' / '.$paymentLabelPaid; | |||||
} | |||||
$amountAndPayment .= '</div>'; | |||||
} | |||||
return '<div class="shopping-cart-label shopping-cart-label-'.$index.'"> | return '<div class="shopping-cart-label shopping-cart-label-'.$index.'"> | ||||
<div class="inner"> | <div class="inner"> | ||||
<div class="username"> | <div class="username"> | ||||
<div class="products"> | <div class="products"> | ||||
'.$this->orderRepository->getCartSummary($order).' | '.$this->orderRepository->getCartSummary($order).' | ||||
</div> | </div> | ||||
'.$amountAndPayment.' | |||||
</div> | </div> | ||||
</div>'; | </div>'; | ||||
} | } |
return $this->isStatus($document, Document::STATUS_VALID); | return $this->isStatus($document, Document::STATUS_VALID); | ||||
} | } | ||||
public function getProductsOrders(DocumentInterface $document): array | |||||
public function getProductsOrders(DocumentInterface $document, bool $groupByInvoicePrice = false): array | |||||
{ | { | ||||
$productsOrdersArray = []; | $productsOrdersArray = []; | ||||
$ordersArray = $document->orders; | $ordersArray = $document->orders; | ||||
} else { | } else { | ||||
$productOrderMatch = false; | $productOrderMatch = false; | ||||
foreach ($productsOrdersArray[$indexProductOrder] as &$theProductOrder) { | foreach ($productsOrdersArray[$indexProductOrder] as &$theProductOrder) { | ||||
if ($theProductOrder->unit == $productOrder->unit | |||||
&& $theProductOrder->price == $productOrder->price | |||||
&& $theProductOrder->invoice_price == $productOrder->invoice_price) { | |||||
$theProductOrder->quantity += $productOrder->quantity; | |||||
$productOrderMatch = true; | |||||
if ($theProductOrder->unit == $productOrder->unit) { | |||||
if($groupByInvoicePrice && $theProductOrder->invoice_price == $productOrder->invoice_price) { | |||||
$theProductOrder->quantity += $productOrder->quantity; | |||||
$productOrderMatch = true; | |||||
} | |||||
elseif($theProductOrder->price == $productOrder->price | |||||
&& $theProductOrder->invoice_price == $productOrder->invoice_price) { | |||||
$theProductOrder->quantity += $productOrder->quantity; | |||||
$productOrderMatch = true; | |||||
} | |||||
} | } | ||||
} | } | ||||
if (!$productOrderMatch) { | if (!$productOrderMatch) { |
$period = date('Y-m'); | $period = date('Y-m'); | ||||
} | } | ||||
$dateStart = date('Y-m-31', strtotime("-1 month", strtotime($period))); | |||||
$dateEnd = date('Y-m-01', strtotime("+1 month", strtotime($period))); | |||||
return $this->getTurnoverByDateStartEnd($producer, $dateStart, $dateEnd, $format); | |||||
} | |||||
public function getTurnoverByWeek(Producer $producer, int $year, int $week, bool $format = false) | |||||
{ | |||||
$date = new \DateTime(); | |||||
$date->setISODate($year, $week); | |||||
$dateStart = $date->format('Y-m-d'); | |||||
$date->modify('+6 days'); | |||||
$dateEnd = $date->format('Y-m-d'); | |||||
return $this->getTurnoverByDateStartEnd($producer, $dateStart, $dateEnd, $format); | |||||
} | |||||
public function getTurnoverByDateStartEnd(Producer $producer, string $dateStart, string $dateEnd, bool $format = false) | |||||
{ | |||||
$connection = \Yii::$app->getDb(); | $connection = \Yii::$app->getDb(); | ||||
$command = $connection->createCommand( | $command = $connection->createCommand( | ||||
' | ' | ||||
WHERE `order`.id = product_order.id_order | WHERE `order`.id = product_order.id_order | ||||
AND distribution.id_producer = :id_producer | AND distribution.id_producer = :id_producer | ||||
AND `order`.id_distribution = distribution.id | AND `order`.id_distribution = distribution.id | ||||
AND distribution.date > :date_begin | |||||
AND distribution.date > :date_start | |||||
AND distribution.date < :date_end', | AND distribution.date < :date_end', | ||||
[ | [ | ||||
':date_begin' => date('Y-m-31', strtotime("-1 month", strtotime($period))), | |||||
':date_end' => date('Y-m-01', strtotime("+1 month", strtotime($period))), | |||||
':date_start' => $dateStart, | |||||
':date_end' => $dateEnd, | |||||
':id_producer' => $producer->id | ':id_producer' => $producer->id | ||||
] | ] | ||||
); | ); | ||||
return $this->producerPriceRangeRepository->getAmountToBeBilledByTurnover($turnover, $format); | return $this->producerPriceRangeRepository->getAmountToBeBilledByTurnover($turnover, $format); | ||||
} | } | ||||
public function getDatasChartTurnoverStatistics(Producer $producer, int $year) | |||||
public function getDatasChartTurnoverStatistics(Producer $producer, int $year, string $displayBy = 'month') | |||||
{ | { | ||||
$interval = new \DateInterval('P1M'); | |||||
$data = []; | |||||
$dataLabels = []; | |||||
$start = new \DateTime($year.'-01-01'); | $start = new \DateTime($year.'-01-01'); | ||||
if($year == date('Y')) { | if($year == date('Y')) { | ||||
$end = new \DateTime('last day of this month'); | $end = new \DateTime('last day of this month'); | ||||
else { | else { | ||||
$end = new \DateTime($year.'-12-31'); | $end = new \DateTime($year.'-12-31'); | ||||
} | } | ||||
$period = new \DatePeriod($start, $interval, $end); | |||||
$data = []; | |||||
$dataLabels = []; | |||||
$interval = new \DateInterval(($displayBy == 'week') ? 'P1W' : 'P1M'); | |||||
$period = new \DatePeriod($start, $interval, $end); | |||||
foreach ($period as $date) { | |||||
$month = $date->format('m/Y'); | |||||
$dataLabels[] = $month; | |||||
$turnover = $this->getTurnover($producer, $date->format('Y-m')); | |||||
$data[$month] = $turnover; | |||||
if($displayBy == 'week') { | |||||
foreach ($period as $date) { | |||||
$week = $date->format('W'); | |||||
$dataLabels[] = $week; | |||||
$turnover = $this->getTurnoverByWeek($producer, $year, $date->format('W')); | |||||
$data[$week] = $turnover; | |||||
} | |||||
} | |||||
else { | |||||
foreach ($period as $date) { | |||||
$month = $date->format('m/Y'); | |||||
$dataLabels[] = $month; | |||||
$turnover = $this->getTurnover($producer, $date->format('Y-m')); | |||||
$data[$month] = $turnover; | |||||
} | |||||
} | } | ||||
// création d'un tableau sans index car chart.js n'accepte pas les index | // création d'un tableau sans index car chart.js n'accepte pas les index |
use common\logic\AbstractService; | use common\logic\AbstractService; | ||||
use common\logic\Config\Unit\Service\UnitDefinition; | use common\logic\Config\Unit\Service\UnitDefinition; | ||||
use common\logic\Config\Unit\Service\UnitSolver; | use common\logic\Config\Unit\Service\UnitSolver; | ||||
use common\logic\Order\ProductOrder\Model\ProductOrder; | |||||
use common\logic\PointSale\PointSale\Model\PointSale; | use common\logic\PointSale\PointSale\Model\PointSale; | ||||
use common\logic\PointSale\PointSale\Service\PointSaleSolver; | use common\logic\PointSale\PointSale\Service\PointSaleSolver; | ||||
use common\logic\Product\Product\Model\Product; | use common\logic\Product\Product\Model\Product; | ||||
return $product->price; | return $product->price; | ||||
} | } | ||||
public function getPriceUnitReference(Product $product): ?float | |||||
{ | |||||
$productPrice = $product->price; | |||||
if($product->unit == 'piece') { | |||||
if($product->weight) { | |||||
$price = (1000 * $productPrice) / $product->weight; | |||||
} | |||||
else { | |||||
return null; | |||||
} | |||||
} | |||||
else { | |||||
$price = $product->price; | |||||
} | |||||
return $price; | |||||
} | |||||
/** | /** | ||||
* Retourne le prix du produit avec taxe | * Retourne le prix du produit avec taxe | ||||
*/ | */ | ||||
return $product->reference; | return $product->reference; | ||||
} | } | ||||
return $product->name; | |||||
$productName = $product->name; | |||||
// le caractère "<" crée un problème dans le récapitulatif PDF des commandes | |||||
$productName = str_replace('<', '', $productName); | |||||
return $productName; | |||||
} | } | ||||
public function isProductActiveByDay(Product $product, string $day): bool | public function isProductActiveByDay(Product $product, string $day): bool |
use common\logic\Setting\SettingDefinition; | use common\logic\Setting\SettingDefinition; | ||||
use common\logic\Setting\SettingDetails\Admin\General\AdministratorEmailAdminSetting; | use common\logic\Setting\SettingDetails\Admin\General\AdministratorEmailAdminSetting; | ||||
use common\logic\Setting\SettingDetails\Admin\General\AdministratorPhoneNumberAdminSetting; | use common\logic\Setting\SettingDetails\Admin\General\AdministratorPhoneNumberAdminSetting; | ||||
use common\logic\Setting\SettingDetails\Admin\General\ForumFlarumUrlAdminSetting; | |||||
class AdminSettingDefinition extends SettingDefinition | class AdminSettingDefinition extends SettingDefinition | ||||
{ | { | ||||
return [ | return [ | ||||
self::SECTION_GENERAL => [ | self::SECTION_GENERAL => [ | ||||
self::SUBSECTION_GENERAL => [ | self::SUBSECTION_GENERAL => [ | ||||
new AdministratorEmailAdminSetting, | |||||
new AdministratorPhoneNumberAdminSetting, | |||||
new AdministratorEmailAdminSetting(), | |||||
new AdministratorPhoneNumberAdminSetting(), | |||||
new ForumFlarumUrlAdminSetting(), | |||||
] | ] | ||||
], | ], | ||||
]; | ]; |
<?php | |||||
namespace common\logic\Setting\SettingDetails\Admin\General; | |||||
use common\logic\Setting\SettingDetails\AbstractSettingDetail; | |||||
class ForumFlarumUrlAdminSetting extends AbstractSettingDetail | |||||
{ | |||||
public function __construct() | |||||
{ | |||||
$this | |||||
->setName('forumFlarumUrl') | |||||
->setLabel("Url du forum Flarum") | |||||
->setTypeString() | |||||
->setFormTypeInput(); | |||||
} | |||||
} |
public function findSubscriptionsLatestAdded() | public function findSubscriptionsLatestAdded() | ||||
{ | { | ||||
return $this->createDefaultQuery() | return $this->createDefaultQuery() | ||||
->filterByCreatedDuringPastWeek() | |||||
->filterByCreatedByUser() | |||||
->filterByCreatedOrUpdatedByUserDuringPastWeek() | |||||
->find(); | ->find(); | ||||
} | } | ||||
} | } |
return $this; | return $this; | ||||
} | } | ||||
public function filterByCreatedDuringPastWeek(): self | |||||
public function filterByCreatedOrUpdatedByUserDuringPastWeek(): self | |||||
{ | { | ||||
$datePastWeek = new \DateTime('-7 days'); | $datePastWeek = new \DateTime('-7 days'); | ||||
$this->andWhere('subscription.created_at >= :created_at') | |||||
->addParams(['created_at' => $datePastWeek->format('Y-m-d H:i:s')]); | |||||
return $this; | |||||
} | |||||
public function filterByCreatedByUser(): self | |||||
{ | |||||
$this->andWhere('subscription.id_user = subscription.id_created_by'); | |||||
$this->andWhere('(subscription.id_user = subscription.id_created_by AND subscription.created_at >= :date_past_week) OR (subscription.id_user = subscription.id_updated_by AND subscription.updated_at >= :date_past_week)') | |||||
->addParams(['date_past_week' => $datePastWeek->format('Y-m-d H:i:s')]); | |||||
return $this; | return $this; | ||||
} | } | ||||
} | } |
public function getUsername(User $user, $withType = false): string | public function getUsername(User $user, $withType = false): string | ||||
{ | { | ||||
if (isset($user->name_legal_person) && strlen($user->name_legal_person)) { | |||||
if ($this->isTypeLegalPerson($user) | |||||
&& isset($user->name_legal_person) | |||||
&& strlen($user->name_legal_person)) { | |||||
$username = $user->name_legal_person; | $username = $user->name_legal_person; | ||||
} else { | } else { | ||||
$username = $user->lastname . ' ' . $user->name; | $username = $user->lastname . ' ' . $user->name; |
<?php | |||||
require_once dirname(__FILE__).'/_macros.php'; | |||||
version( | |||||
'18/12/2023', | |||||
[ | |||||
[ | |||||
"[Administration] Tableau de bord : affichage des abonnements modifiés récemment", | |||||
"[Administration] Export étiquettes PDF : ajout de l'information du paiement de la commande", | |||||
"[Administration] Export commandes PDF : cellule du montant grisée quand la commande est payée", | |||||
"[Administration] Statistiques > Chiffre d'affaires : vue semaine par semaine", | |||||
], | |||||
[ | |||||
"[Administration] Utilisateur : correctif affichage nom personne légale", | |||||
"[Administration] Distributions > Synchronisation Tiller : activation uniquement le jour des distribution", | |||||
"[Administration] Export commandes PDF : correctif problème caractère \"<\" dans le nom des produits", | |||||
] | |||||
], | |||||
[ | |||||
[ | |||||
], | |||||
[ | |||||
] | |||||
], | |||||
$userCurrent | |||||
); | |||||
?> |
<?php | |||||
require_once dirname(__FILE__).'/_macros.php'; | |||||
version( | |||||
'15/01/2024', | |||||
[ | |||||
[ | |||||
"[Administration] Export commandes PDF : cellule du montant en gris quand la commande est payée", | |||||
"[Administration] Distribution > Création commande : ajout lien pour créer un utilisateur", | |||||
"[Boutique] Commander : affichage du prix au kg pour les produits vendus à la pièce" | |||||
], | |||||
[ | |||||
] | |||||
], | |||||
[ | |||||
[ | |||||
], | |||||
[ | |||||
] | |||||
], | |||||
$userCurrent | |||||
); | |||||
?> |
*/ | */ | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\logic\Setting\SettingModule; | |||||
use common\logic\User\User\Module\UserModule; | use common\logic\User\User\Module\UserModule; | ||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use yii\bootstrap\Nav; | use yii\bootstrap\Nav; | ||||
if ($isUserCurrentGrantedAsProducer) { | if ($isUserCurrentGrantedAsProducer) { | ||||
$producer = Producer::searchOne(['id' => \Yii::$app->user->identity->id_producer]); | $producer = Producer::searchOne(['id' => \Yii::$app->user->identity->id_producer]); | ||||
} | } | ||||
$settingModule = SettingModule::getInstance(); | |||||
$adminSettingBag = $settingModule->getAdminSettingBag(); | |||||
?> | ?> | ||||
<?php $this->beginPage() ?> | <?php $this->beginPage() ?> | ||||
<div class="container"> | <div class="container"> | ||||
<a href="<?php echo $this->getUrlManager()->createUrl('site/service'); ?>">Fonctionnalités, services & tarifs</a> <span class="bull">•</span> | <a href="<?php echo $this->getUrlManager()->createUrl('site/service'); ?>">Fonctionnalités, services & tarifs</a> <span class="bull">•</span> | ||||
<a href="<?php echo $this->getUrlManager()->createUrl('site/opinion'); ?>">Avis & suggestions</a> <span class="bull">•</span> | <a href="<?php echo $this->getUrlManager()->createUrl('site/opinion'); ?>">Avis & suggestions</a> <span class="bull">•</span> | ||||
<?php if($adminSettingBag->get('forumFlarumUrl')): ?> | |||||
<!--<a href="<?php echo $adminSettingBag->get('forumFlarumUrl'); ?>">Forum</a> <span class="bull">•</span>--> | |||||
<?php endif; ?> | |||||
<a href="<?php echo $this->getUrlManager()->createUrl('site/mentions'); ?>">Mentions légales</a> <span class="bull">•</span> | <a href="<?php echo $this->getUrlManager()->createUrl('site/mentions'); ?>">Mentions légales</a> <span class="bull">•</span> | ||||
<a href="<?php echo $this->getUrlManager()->createUrl('site/cgv'); ?>">Conditions générales de service</a> <span class="bull">•</span> | <a href="<?php echo $this->getUrlManager()->createUrl('site/cgv'); ?>">Conditions générales de service</a> <span class="bull">•</span> | ||||
<a href="<?php echo $this->getUrlManager()->createUrl('site/source-code'); ?>">Code source</a> | <a href="<?php echo $this->getUrlManager()->createUrl('site/source-code'); ?>">Code source</a> |
$orderModule = $this->getOrderModule(); | $orderModule = $this->getOrderModule(); | ||||
$producerModule = $this->getProducerModule(); | $producerModule = $this->getProducerModule(); | ||||
$userModule = $this->getUserModule(); | $userModule = $this->getUserModule(); | ||||
$productOrderModule = $this->getProductOrderModule(); | |||||
$producer = $this->getProducerCurrent(); | $producer = $this->getProducerCurrent(); | ||||
$redirect = null; | $redirect = null; | ||||
true | true | ||||
) . ')', | ) . ')', | ||||
], | ], | ||||
'unit_amount' => $productOrder->price * 100 * $productOrder->quantity, | |||||
'unit_amount' => intval($productOrderModule->getSolver()->getPriceWithTax($productOrder) * 100 * $productOrder->quantity), | |||||
], | ], | ||||
'quantity' => 1, | 'quantity' => 1, | ||||
]; | ]; | ||||
[ | [ | ||||
'unit_coefficient' => Product::$unitsArray[$product->unit]['coefficient'], | 'unit_coefficient' => Product::$unitsArray[$product->unit]['coefficient'], | ||||
'prices' => $productModule->getPriceArray($product, $user, $pointSale), | 'prices' => $productModule->getPriceArray($product, $user, $pointSale), | ||||
'price_unit_ref' => $productModule->getSolver()->getPriceUnitReference($product), | |||||
'productDistribution' => $product['productDistribution'], | 'productDistribution' => $product['productDistribution'], | ||||
'productPointSale' => $product['productPointSale'], | 'productPointSale' => $product['productPointSale'], | ||||
] | ] |
<div> | <div> | ||||
{{ formatPrice(getBestProductPrice(product.id, | {{ formatPrice(getBestProductPrice(product.id, | ||||
product.quantity_form)) }}<br/> | product.quantity_form)) }}<br/> | ||||
<span class="unit">{{ product.wording_unit }}</span> | |||||
<span class="price-infos">{{ product.wording_unit }}</span> | |||||
<template v-if="product.unit == 'piece' && product.weight"> | |||||
<br /> | |||||
<span class="price-infos"> | |||||
{{ formatPrice(product.price_unit_ref) }} / kg | |||||
</span> | |||||
</template> | |||||
</div> | </div> | ||||
<div v-if="productHasPriceWithFromQuantity(product)" | <div v-if="productHasPriceWithFromQuantity(product)" | ||||
class="alert alert-info decreasing-prices"> | class="alert alert-info decreasing-prices"> |
text-align: center; | text-align: center; | ||||
} | } | ||||
/* line 309, ../sass/order/_order.scss */ | /* line 309, ../sass/order/_order.scss */ | ||||
.order-order #main #app-order-order table#products .price-unit .unit, .order-order #main #app-order-order table#products .price-total .unit { | |||||
.order-order #main #app-order-order table#products .price-unit .price-infos, .order-order #main #app-order-order table#products .price-total .price-infos { | |||||
color: gray; | color: gray; | ||||
font-size: 13px; | font-size: 13px; | ||||
line-height: 15px; | |||||
} | } | ||||
/* line 314, ../sass/order/_order.scss */ | |||||
/* line 315, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order table#products .td-quantity { | .order-order #main #app-order-order table#products .td-quantity { | ||||
width: 175px; | width: 175px; | ||||
} | } | ||||
/* line 316, ../sass/order/_order.scss */ | |||||
/* line 317, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order table#products .td-quantity input.quantity { | .order-order #main #app-order-order table#products .td-quantity input.quantity { | ||||
text-align: center; | text-align: center; | ||||
border-right: 0px none; | border-right: 0px none; | ||||
} | } | ||||
/* line 320, ../sass/order/_order.scss */ | |||||
/* line 321, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order table#products .td-quantity .input-group-addon { | .order-order #main #app-order-order table#products .td-quantity .input-group-addon { | ||||
padding: 5px; | padding: 5px; | ||||
padding-left: 0px; | padding-left: 0px; | ||||
border-left: 0px none; | border-left: 0px none; | ||||
border-right: 0px none; | border-right: 0px none; | ||||
} | } | ||||
/* line 331, ../sass/order/_order.scss */ | |||||
/* line 332, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order table#products tr.total .summary h3 { | .order-order #main #app-order-order table#products tr.total .summary h3 { | ||||
margin-top: 0px; | margin-top: 0px; | ||||
font-family: "capsuularegular"; | font-family: "capsuularegular"; | ||||
text-transform: none; | text-transform: none; | ||||
margin-bottom: 5px; | margin-bottom: 5px; | ||||
} | } | ||||
/* line 338, ../sass/order/_order.scss */ | |||||
/* line 339, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order table#products tr.total .summary ul { | .order-order #main #app-order-order table#products tr.total .summary ul { | ||||
margin-bottom: 15px; | margin-bottom: 15px; | ||||
padding-left: 20px; | padding-left: 20px; | ||||
font-size: 23px; | font-size: 23px; | ||||
} | } | ||||
/* line 345, ../sass/order/_order.scss */ | |||||
/* line 346, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order table#products tr.total .summary ul li .quantity { | .order-order #main #app-order-order table#products tr.total .summary ul li .quantity { | ||||
font-size: 18px; | font-size: 18px; | ||||
} | } | ||||
/* line 349, ../sass/order/_order.scss */ | |||||
/* line 350, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order table#products tr.total .summary ul li .name { | .order-order #main #app-order-order table#products tr.total .summary ul li .name { | ||||
font-family: "capsuularegular"; | font-family: "capsuularegular"; | ||||
font-size: 24px; | font-size: 24px; | ||||
} | } | ||||
/* line 353, ../sass/order/_order.scss */ | |||||
/* line 354, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order table#products tr.total .summary ul li .other { | .order-order #main #app-order-order table#products tr.total .summary ul li .other { | ||||
font-family: "capsuularegular"; | font-family: "capsuularegular"; | ||||
font-size: 18px; | font-size: 18px; | ||||
} | } | ||||
/* line 361, ../sass/order/_order.scss */ | |||||
/* line 362, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order table#products tr.total .price-total { | .order-order #main #app-order-order table#products tr.total .price-total { | ||||
font-size: 23px; | font-size: 23px; | ||||
} | } | ||||
/* line 369, ../sass/order/_order.scss */ | |||||
/* line 370, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order #content-step-payment .delivery { | .order-order #main #app-order-order #content-step-payment .delivery { | ||||
margin-bottom: 20px; | margin-bottom: 20px; | ||||
} | } | ||||
/* line 372, ../sass/order/_order.scss */ | |||||
/* line 373, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order #content-step-payment .delivery .delivery-home { | .order-order #main #app-order-order #content-step-payment .delivery .delivery-home { | ||||
margin-bottom: 20px; | margin-bottom: 20px; | ||||
} | } | ||||
/* line 381, ../sass/order/_order.scss */ | |||||
/* line 382, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order #content-step-payment .comment { | .order-order #main #app-order-order #content-step-payment .comment { | ||||
margin-bottom: 20px; | margin-bottom: 20px; | ||||
} | } | ||||
/* line 386, ../sass/order/_order.scss */ | |||||
/* line 387, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order #content-step-payment .credit .info { | .order-order #main #app-order-order #content-step-payment .credit .info { | ||||
margin-left: 20px; | margin-left: 20px; | ||||
color: gray; | color: gray; | ||||
} | } | ||||
/* line 393, ../sass/order/_order.scss */ | |||||
/* line 394, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order #specific-delays { | .order-order #main #app-order-order #specific-delays { | ||||
margin-top: 15px; | margin-top: 15px; | ||||
} | } | ||||
/* line 401, ../sass/order/_order.scss */ | |||||
/* line 402, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order #infos { | .order-order #main #app-order-order #infos { | ||||
margin-top: 30px; | margin-top: 30px; | ||||
} | } | ||||
/* line 403, ../sass/order/_order.scss */ | |||||
/* line 404, ../sass/order/_order.scss */ | |||||
.order-order #main #app-order-order #infos .panel-body { | .order-order #main #app-order-order #infos .panel-body { | ||||
padding-top: 0px; | padding-top: 0px; | ||||
white-space: pre-line; | white-space: pre-line; | ||||
} | } | ||||
/* line 413, ../sass/order/_order.scss */ | |||||
/* line 414, ../sass/order/_order.scss */ | |||||
#main #content .panel h3 { | #main #content .panel h3 { | ||||
font-family: "highvoltageregular"; | font-family: "highvoltageregular"; | ||||
margin: 0px; | margin: 0px; |
width: 135px ; | width: 135px ; | ||||
text-align: center ; | text-align: center ; | ||||
.unit { | |||||
.price-infos { | |||||
color: gray ; | color: gray ; | ||||
font-size: 13px ; | font-size: 13px ; | ||||
line-height: 15px; | |||||
} | } | ||||
} | } | ||||
.td-quantity { | .td-quantity { |