$json['tiller_is_synchro'] = $this->buildAjaxInfosResponseTiller($producer, $date); | $json['tiller_is_synchro'] = $this->buildAjaxInfosResponseTiller($producer, $date); | ||||
$json['tiller_is_authenticated'] = $this->getOrderModule()->getTillerManager()->isAuthenticated(); | $json['tiller_is_authenticated'] = $this->getOrderModule()->getTillerManager()->isAuthenticated(); | ||||
$json['tiller_url_authorize_code'] = $this->getOrderModule()->getTillerManager()->getUrlAuthorizeCode(); | $json['tiller_url_authorize_code'] = $this->getOrderModule()->getTillerManager()->getUrlAuthorizeCode(); | ||||
$json['tiller_total_amount_orders'] = $this->getOrderModule()->getTillerManager()->getTotalAmountOrdersByDate($date, true); | |||||
$json['missing_subscriptions'] = $this->buildAjaxInfosResponseMissingSubscriptions($date, $distribution, $ordersArrayObject); | $json['missing_subscriptions'] = $this->buildAjaxInfosResponseMissingSubscriptions($date, $distribution, $ordersArrayObject); | ||||
} | } | ||||
$searchModel = new OrderSearch(); | $searchModel = new OrderSearch(); | ||||
$dataProvider = $searchModel->search([ | $dataProvider = $searchModel->search([ | ||||
'order_by' => 'IF(ISNULL(date_update), `order`.`date`, `order`.`date_update`) DESC' | 'order_by' => 'IF(ISNULL(date_update), `order`.`date`, `order`.`date_update`) DESC' | ||||
], [ | |||||
'ignore_id_producer' => true, | |||||
]); | ]); | ||||
return $this->render('index', [ | return $this->render('index', [ |
<button id="btn-tiller" class="btn btn-xs btn-default" disabled><span class="glyphicon glyphicon-refresh"></span> Synchroniser avec Tiller</button> | <button id="btn-tiller" class="btn btn-xs btn-default" disabled><span class="glyphicon glyphicon-refresh"></span> Synchroniser avec Tiller</button> | ||||
</span> | </span> | ||||
</template> | </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> | ||||
<template v-else> | <template v-else> | ||||
<a :href="tillerUrlAuthorizeCode" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-refresh"></span> Connexion Tiller</a> | <a :href="tillerUrlAuthorizeCode" class="btn btn-xs btn-default"><span class="glyphicon glyphicon-refresh"></span> Connexion Tiller</a> | ||||
</span> | </span> | ||||
</div> | </div> | ||||
<div class="alert alert-info" v-if="producer && producer.tiller == true && orders.length > 0 && tillerTotalAmountOrders"> | |||||
Montant total commandes Tiller : {{ tillerTotalAmountOrders }} | |||||
</div> | |||||
<div class="alert alert-danger" v-if="distribution && !distribution.active && orders && orders.length > 0"> | <div class="alert alert-danger" v-if="distribution && !distribution.active && orders && orders.length > 0"> | ||||
Attention, ce jour de distribution n'est pas activé et vous avez quand même des commandes enregistrées. | Attention, ce jour de distribution n'est pas activé et vous avez quand même des commandes enregistrées. | ||||
</div> | </div> |
tillerIsAuthenticated: false, | tillerIsAuthenticated: false, | ||||
tillerUrlAuthorizeCode: '#', | tillerUrlAuthorizeCode: '#', | ||||
tillerIsSynchro: false, | tillerIsSynchro: false, | ||||
tillerTotalAmountOrders: false, | |||||
checkboxSelectAllOrders: false, | checkboxSelectAllOrders: false, | ||||
messageGenerateDeliveryNoteDisplayed: false, | messageGenerateDeliveryNoteDisplayed: false, | ||||
missingSubscriptions: false, | missingSubscriptions: false, | ||||
app.tillerUrlAuthorizeCode = response.data.tiller_url_authorize_code; | app.tillerUrlAuthorizeCode = response.data.tiller_url_authorize_code; | ||||
app.tillerIsAuthenticated = response.data.tiller_is_authenticated; | app.tillerIsAuthenticated = response.data.tiller_is_authenticated; | ||||
app.tillerIsSynchro = response.data.tiller_is_synchro; | app.tillerIsSynchro = response.data.tiller_is_synchro; | ||||
app.tillerTotalAmountOrders = response.data.tiller_total_amount_orders; | |||||
app.calendar.attrs = []; | app.calendar.attrs = []; | ||||
var distributions = response.data.distributions; | var distributions = response.data.distributions; |
*/ | */ | ||||
return [ | return [ | ||||
'version' => '24.10.A', | |||||
'version' => '24.10.B', | |||||
'maintenanceMode' => false, | 'maintenanceMode' => false, | ||||
'siteName' => 'Souke', | 'siteName' => 'Souke', | ||||
'tinyMcePlugins' => 'preview searchreplace autolink autosave save directionality code visualblocks visualchars fullscreen image link lists wordcount help', | 'tinyMcePlugins' => 'preview searchreplace autolink autosave save directionality code visualblocks visualchars fullscreen image link lists wordcount help', |
<?php | |||||
/** | |||||
* Copyright Guillaume Bourgeois (2018) | |||||
* | |||||
* contact@souke.fr | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
require_once dirname(__FILE__).'/_macros.php'; | |||||
version( | |||||
'27/10/2024', | |||||
[ | |||||
[ | |||||
"[Administration] Distributions > Tiller : affichage du montant total des commandes à synchroniser", | |||||
], | |||||
[ | |||||
"[Administration] Utilisateurs > Commandes : ajout filtre par producteur", | |||||
"Communication > Emails : modification du lien de désinscription à l'infolettre pour qu'il pointe vers la page de gestion de l'inscription aux deux types d'emails (actualités et prises de commandes) sans désinscrire directement l'utilisateur", | |||||
"[Boutique] Commander : correctif bug affichage distributions sur le calendrier quand une distribution est activée sur une période de congés" | |||||
] | |||||
], | |||||
[ | |||||
[ | |||||
], | |||||
[ | |||||
] | |||||
], | |||||
$userCurrent | |||||
); | |||||
?> |
$fromEmail = $this->producerSolver->getProducerEmailPlatform($producer) ; | $fromEmail = $this->producerSolver->getProducerEmailPlatform($producer) ; | ||||
$fromName = $producer->name ; | $fromName = $producer->name ; | ||||
$linkUnsubscribe = $linkProducer.'/newsletter/unsubscribe'; | |||||
$linkUnsubscribe = $linkProducer.'/newsletter/index'; | |||||
// Message inscription newsletter | // Message inscription newsletter | ||||
$messageAutoText .= " | $messageAutoText .= " | ||||
-- | -- | ||||
Boutique : ".$linkProducer." | |||||
Me désinscrire : ".$linkUnsubscribe; | |||||
Aller sur la boutique : ".$linkProducer." | |||||
Se désinscrire de l'infolettre : ".$linkUnsubscribe; | |||||
$messageAutoHtml .= "<br /><br />--<br>"; | $messageAutoHtml .= "<br /><br />--<br>"; | ||||
$messageAutoHtml .= "Boutique : <a href=\"".$linkProducer."\">".$linkProducer."</a><br>"; | |||||
$messageAutoHtml .= "Me désinscrire : <a href=\"".$linkUnsubscribe."\">".$linkUnsubscribe."</a>"; | |||||
$messageAutoHtml .= "Aller sur la boutique : <a href=\"".$linkProducer."\">".$linkProducer."</a><br>"; | |||||
$messageAutoHtml .= "Se désinscrire de l'infolettre : <a href=\"".$linkUnsubscribe."\">".$linkUnsubscribe."</a>"; | |||||
} | } | ||||
else { | else { | ||||
$fromEmail = 'contact@souke.fr' ; | $fromEmail = 'contact@souke.fr' ; |
class OrderSearch extends Order | class OrderSearch extends Order | ||||
{ | { | ||||
public function search($params) | |||||
public function search($params, $options = []) | |||||
{ | { | ||||
$paramsSearch = []; | $paramsSearch = []; | ||||
if(isset($params['id_user'])) { | if(isset($params['id_user'])) { | ||||
$paramsSearch['id_user'] = $params['id_user']; | $paramsSearch['id_user'] = $params['id_user']; | ||||
} | } | ||||
$query = Order::searchQuery($paramsSearch, [ | |||||
'ignore_id_producer' => true, | |||||
'orderby' => isset($params['order_by']) ? $params['order_by'] : 'distribution.date DESC' | |||||
]); | |||||
$optionsArray = [ | |||||
'orderby' => isset($params['order_by']) ? $params['order_by'] : 'distribution.date DESC', | |||||
]; | |||||
if(isset($options['ignore_id_producer']) && $options['ignore_id_producer']) { | |||||
$optionsArray['ignore_id_producer'] = true; | |||||
} | |||||
$query = Order::searchQuery($paramsSearch, $optionsArray); | |||||
$dataProvider = new ActiveDataProvider([ | $dataProvider = new ActiveDataProvider([ | ||||
'query' => $query, | 'query' => $query, |
use common\components\Tiller\TillerClientV2; | use common\components\Tiller\TillerClientV2; | ||||
use common\components\Tiller\TillerClientV3; | use common\components\Tiller\TillerClientV3; | ||||
use common\helpers\MeanPayment; | use common\helpers\MeanPayment; | ||||
use common\helpers\Price; | |||||
use domain\Order\OrderStatus\OrderStatus; | use domain\Order\OrderStatus\OrderStatus; | ||||
use domain\Order\ProductOrder\ProductOrderSolver; | use domain\Order\ProductOrder\ProductOrderSolver; | ||||
use domain\Producer\Producer\ProducerSolver; | use domain\Producer\Producer\ProducerSolver; | ||||
return false; | return false; | ||||
} | } | ||||
public function getTotalAmountOrdersByDate(string $date, bool $format = false) | |||||
{ | |||||
$totalAmount = 0; | |||||
$ordersArray = Order::searchAll([ | |||||
'distribution.date' => $date, | |||||
'order.tiller_synchronization' => 1, | |||||
], [ | |||||
'conditions' => OrderRepositoryQuery::getSqlFilterIsValid() | |||||
]); | |||||
foreach($ordersArray as $order) { | |||||
$this->orderBuilder->initOrder($order); | |||||
$totalAmount += $this->orderSolver->getOrderAmountWithTax($order); | |||||
} | |||||
if($format) { | |||||
return Price::format($totalAmount); | |||||
} | |||||
return $totalAmount; | |||||
} | |||||
} | } |
// Filtre par point de vente | // Filtre par point de vente | ||||
if ($pointSaleCurrent && $producer->option_order_entry_point == Producer::ORDER_ENTRY_POINT_POINT_SALE) { | if ($pointSaleCurrent && $producer->option_order_entry_point == Producer::ORDER_ENTRY_POINT_POINT_SALE) { | ||||
$distributionsArrayFilterPointSale = []; | $distributionsArrayFilterPointSale = []; | ||||
for ($i = 0; $i < count($distributionsArray); $i++) { | |||||
$distribution = $distributionsArray[$i]; | |||||
foreach($distributionsArray as $distribution) { | |||||
if ($distribution && $distributionModule->isPointSaleActive($distribution, $pointSaleCurrent)) { | if ($distribution && $distributionModule->isPointSaleActive($distribution, $pointSaleCurrent)) { | ||||
$countOrders = Order::searchCount([ | $countOrders = Order::searchCount([ | ||||
'id_distribution' => $distribution->id, | 'id_distribution' => $distribution->id, | ||||
'id_point_sale' => $pointSaleCurrent->id | 'id_point_sale' => $pointSaleCurrent->id | ||||
]); | ]); | ||||
$orderUserPointSale = $this->getOrderUser($distribution->date, $pointSaleCurrent); | $orderUserPointSale = $this->getOrderUser($distribution->date, $pointSaleCurrent); | ||||
if (!$pointSaleCurrent->maximum_number_orders | if (!$pointSaleCurrent->maximum_number_orders | ||||
|| ($orderUserPointSale && $orderUserPointSale->id_point_sale == $pointSaleCurrent->id) | || ($orderUserPointSale && $orderUserPointSale->id_point_sale == $pointSaleCurrent->id) | ||||
|| ($pointSaleCurrent->maximum_number_orders && | || ($pointSaleCurrent->maximum_number_orders && |
[ | [ | ||||
'options' => [ | 'options' => [ | ||||
'data-id' => $user->id, | 'data-id' => $user->id, | ||||
'data-on' => 'Activé', | |||||
'data-off' => 'Désactivé' | |||||
'data-on' => 'Activée', | |||||
'data-off' => 'Désactivée' | |||||
], | ], | ||||
]) | ]) | ||||
->label('Actualités'); | ->label('Actualités'); |