namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\Debug; | |||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\models\Order ; | use common\models\Order ; | ||||
use common\models\Product ; | use common\models\Product ; | ||||
} | } | ||||
$productsArray = $productsQuery->asArray()->orderBy('order ASC')->all() ; | $productsArray = $productsQuery->asArray()->orderBy('order ASC')->all() ; | ||||
/*Debug::dump($productsArray);*/ | |||||
foreach($productsArray as &$theProduct) { | foreach($productsArray as &$theProduct) { | ||||
$theProduct['unit_save'] = $theProduct['unit'] ; | |||||
/*$theProduct['unit_save'] = $theProduct['unit'] ; | |||||
$theProduct['units'] = [] ; | $theProduct['units'] = [] ; | ||||
$theProduct['units'][] = [ | $theProduct['units'][] = [ | ||||
'unit' => $theProduct['unit'], | 'unit' => $theProduct['unit'], | ||||
'wording_unit' => Product::strUnit($theProduct['unit'], 'wording_short'), | |||||
'step' => $theProduct['step'], | 'step' => $theProduct['step'], | ||||
'price' => $theProduct['price'] | 'price' => $theProduct['price'] | ||||
] ; | |||||
] ;*/ | |||||
$theProduct['wording_unit'] = Product::strUnit($theProduct['unit'], 'wording_short'); | |||||
if(isset($theProduct['productSubscription'][0])) { | if(isset($theProduct['productSubscription'][0])) { | ||||
if($theProduct['productSubscription'][0]['unit'] != $theProduct['unit']) { | |||||
/*if($theProduct['productSubscription'][0]['unit'] != $theProduct['unit']) { | |||||
$theProduct['units'][] = [ | $theProduct['units'][] = [ | ||||
'unit' => $theProduct['productSubscription'][0]['unit'], | 'unit' => $theProduct['productSubscription'][0]['unit'], | ||||
'wording_unit' => Product::strUnit($theProduct['productSubscription'][0]['unit'], 'wording_short'), | 'wording_unit' => Product::strUnit($theProduct['productSubscription'][0]['unit'], 'wording_short'), | ||||
$theProduct['unit'] = $theProduct['productSubscription'][0]['unit'] ; | $theProduct['unit'] = $theProduct['productSubscription'][0]['unit'] ; | ||||
$theProduct['step'] = $theProduct['productSubscription'][0]['step'] ; | $theProduct['step'] = $theProduct['productSubscription'][0]['step'] ; | ||||
$theProduct['price'] = $theProduct['productSubscription'][0]['price'] ; | $theProduct['price'] = $theProduct['productSubscription'][0]['price'] ; | ||||
} | |||||
}*/ | |||||
$theProduct['quantity'] = $theProduct['productSubscription'][0]['quantity'] * Product::$unitsArray[$theProduct['unit']]['coefficient'] ; | $theProduct['quantity'] = $theProduct['productSubscription'][0]['quantity'] * Product::$unitsArray[$theProduct['unit']]['coefficient'] ; | ||||
} | } | ||||
else { | else { |
</span> | </span> | ||||
<input v-model="product.quantity" :name="'SubscriptionForm[products][product_'+product.id+']'" class="form-control input-quantity" /> | <input v-model="product.quantity" :name="'SubscriptionForm[products][product_'+product.id+']'" class="form-control input-quantity" /> | ||||
<div class="input-group-addon"> | <div class="input-group-addon"> | ||||
<select class="form-control select-unit" :name="'product_unit_'+product.id" v-model="product.unit" v-if="product.units.length > 1" @change="changeUnitProductSubscription" :data-id-product="product.id"> | |||||
<option v-for="unit in product.units" :value="unit.unit">{{ unit.wording_unit }}</option> | |||||
</select> | |||||
<span v-else> | |||||
{{ product.units[0].wording_unit }} | |||||
<span> | |||||
{{ product.wording_unit }} | |||||
</span> | </span> | ||||
</div> | </div> | ||||
<span class="input-group-btn"> | <span class="input-group-btn"> | ||||
</span> | </span> | ||||
</div> | </div> | ||||
</td> | </td> | ||||
<td> | |||||
<span v-if="product.units.length > 1 && product.unit != product.unit_save" class="glyphicon glyphicon-warning-sign" title="Unité différente du produit"></span> | |||||
</td> | |||||
</tr> | </tr> | ||||
</table> | </table> | ||||
</div> | </div> |
$this->addButton(['label' => 'Nouvel abonnement <span class="glyphicon glyphicon-plus"></span>', 'url' => 'subscription/create', 'class' => 'btn btn-primary']) ; | $this->addButton(['label' => 'Nouvel abonnement <span class="glyphicon glyphicon-plus"></span>', 'url' => 'subscription/create', 'class' => 'btn btn-primary']) ; | ||||
$subscriptionsArray = Subscription::searchAll() ; | $subscriptionsArray = Subscription::searchAll() ; | ||||
$hasUnitsNotMatch = false ; | |||||
foreach($subscriptionsArray as $subscription) { | |||||
if($subscription->hasUnitsNotMatch()) { | |||||
$hasUnitsNotMatch = true ; | |||||
} | |||||
} | |||||
?> | ?> | ||||
<div class="subscription-index"> | <div class="subscription-index"> | ||||
<?php if($hasUnitsNotMatch) : ?> | |||||
<div class="alert alert-warning"> | |||||
<span class="glyphicon glyphicon-warning-sign"></span> Attention, des unités ne correspondent pas entre vos produits et vos abonnements.<br /> | |||||
Veuillez modifier vos abonnements et ajuster les unités / quantités pour régler le problème. | |||||
</div> | |||||
<?php endif; ?> | |||||
<?= GridView::widget([ | <?= GridView::widget([ | ||||
'filterModel' => $searchModel, | 'filterModel' => $searchModel, | ||||
foreach($model->productSubscription as $productSubscription) | foreach($model->productSubscription as $productSubscription) | ||||
{ | { | ||||
if(isset($productSubscription->product)) { | if(isset($productSubscription->product)) { | ||||
$html .= Html::encode($productSubscription->product->name).' ('.($productSubscription->quantity * Product::$unitsArray[$productSubscription->unit]['coefficient']).' '.Product::strUnit($productSubscription->unit, 'wording_short').')<br />' ; | |||||
$html .= Html::encode($productSubscription->product->name).' ('.($productSubscription->quantity * Product::$unitsArray[$productSubscription->product->unit]['coefficient']).' '.Product::strUnit($productSubscription->product->unit, 'wording_short').')<br />' ; | |||||
} | } | ||||
else { | else { | ||||
$html .= 'Produit non défini<br />' ; | $html .= 'Produit non défini<br />' ; | ||||
{ | { | ||||
$html .= '<span class="glyphicon glyphicon-warning-sign"></span> Aucun produit<br />' ; | $html .= '<span class="glyphicon glyphicon-warning-sign"></span> Aucun produit<br />' ; | ||||
} | } | ||||
// des unités ne correspondent pas | |||||
if($model->hasUnitsNotMatch()) { | |||||
$html .= '<span class="glyphicon glyphicon-warning-sign" title="Des unités ne correspondent pas"></span>' ; | |||||
} | |||||
return $html ; | return $html ; | ||||
} | } | ||||
], | ], |
data: { | data: { | ||||
showLoading: false, | showLoading: false, | ||||
loading: true, | loading: true, | ||||
products: [], | |||||
units: [] | |||||
products: [] | |||||
}, | }, | ||||
mounted: function() { | mounted: function() { | ||||
axios.get("ajax-infos",{params: {idSubscription: $('#subscriptionform-id').val()}}) | axios.get("ajax-infos",{params: {idSubscription: $('#subscriptionform-id').val()}}) | ||||
.then(function(response) { | .then(function(response) { | ||||
app.products = response.data.products ; | app.products = response.data.products ; | ||||
app.units = response.data.units ; | |||||
app.showLoading = false ; | app.showLoading = false ; | ||||
}) ; | }) ; | ||||
}, | }, | ||||
changeUnitProductSubscription: function(event) { | |||||
for(var i = 0; i < this.products.length ; i++) { | |||||
if(this.products[i].id == event.currentTarget.getAttribute('data-id-product')) { | |||||
this.products[i].quantity = '' ; | |||||
for(var j = 0; j < this.products[i].units.length ; j ++) { | |||||
if(this.products[i].unit == this.products[i].units[j].unit) { | |||||
this.products[i].step = this.products[i].units[j].step ; | |||||
this.products[i].price = this.products[i].units[j].price ; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
}, | |||||
changeQuantityProductSubscription: function(increase, product) { | changeQuantityProductSubscription: function(increase, product) { | ||||
var step = step ? parseFloat(product.step) : 1 ; | var step = step ? parseFloat(product.step) : 1 ; | ||||
if(!product.quantity) product.quantity = 0 ; | if(!product.quantity) product.quantity = 0 ; |
<?php | |||||
namespace common\models; | |||||
use common\components\ActiveRecordCommon; | |||||
use Yii; | |||||
/** | |||||
* This is the model class for table "order_order_status". | |||||
* | |||||
* @property integer $id | |||||
* @property integer $id_order | |||||
* @property integer $id_order_status | |||||
* @property string $date | |||||
*/ | |||||
class OrderOrderStatus extends ActiveRecordCommon | |||||
{ | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public static function tableName() | |||||
{ | |||||
return 'order_order_status'; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function rules() | |||||
{ | |||||
return [ | |||||
[['id_order', 'id_order_status'], 'integer'], | |||||
[['date'], 'safe'], | |||||
]; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function attributeLabels() | |||||
{ | |||||
return [ | |||||
'id' => 'ID', | |||||
'id_order' => 'Commande', | |||||
'id_order_status' => 'Statut', | |||||
'date' => 'Date', | |||||
]; | |||||
} | |||||
/* | |||||
* Relations | |||||
*/ | |||||
public function getOrder() | |||||
{ | |||||
return $this->hasOne(User::className(), ['id' => 'id_order']); | |||||
} | |||||
public function getOrderStatus() | |||||
{ | |||||
return $this->hasOne(OrderStatus::className(), ['id' => 'id_order_status']); | |||||
} | |||||
/** | |||||
* Retourne les options de base nécessaires à la fonction de recherche. | |||||
* | |||||
* @return array | |||||
*/ | |||||
public static function defaultOptionsSearch() { | |||||
return [ | |||||
'with' => [], | |||||
'join_with' => ['order', 'orderStatus'], | |||||
'orderby' => 'date ASC', | |||||
'attribute_id_producer' => '' | |||||
] ; | |||||
} | |||||
} |
namespace common\models; | namespace common\models; | ||||
use common\helpers\Debug; | |||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\helpers\Price; | |||||
use Yii; | use Yii; | ||||
use common\components\ActiveRecordCommon; | use common\components\ActiveRecordCommon; | ||||
]; | ]; | ||||
} | } | ||||
public function afterFind() { | |||||
if ($this->taxRate == null) { | |||||
$this->populateRelation('taxRate', GlobalParam::getCurrentProducer()->taxRate); | |||||
} | |||||
parent::afterFind(); | |||||
} | |||||
public function getProductDistribution() | public function getProductDistribution() | ||||
{ | { | ||||
return $this->hasMany(ProductDistribution::className(), ['id_product' => 'id']); | return $this->hasMany(ProductDistribution::className(), ['id_product' => 'id']); | ||||
public function getTaxRate() | public function getTaxRate() | ||||
{ | { | ||||
return $this->hasOne(TaxRate::className(), ['id' => 'id_tax_rate']); | return $this->hasOne(TaxRate::className(), ['id' => 'id_tax_rate']); | ||||
} | } | ||||
return $strUnit; | return $strUnit; | ||||
} | } | ||||
/** | |||||
* Retourne le prix du produit avec taxe | |||||
*/ | |||||
public function getPriceWithTax() | |||||
{ | |||||
return Price::getPriceWithTax($this->price, $this->taxRate->value); | |||||
} | |||||
} | } |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
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. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* 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. | |||||
*/ | |||||
namespace common\models; | namespace common\models; | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use Yii; | use Yii; | ||||
use common\components\ActiveRecordCommon ; | |||||
use common\components\ActiveRecordCommon; | |||||
use common\models\Producer; | use common\models\Producer; | ||||
use common\models\PointSale; | use common\models\PointSale; | ||||
use common\models\UserPointSale; | use common\models\UserPointSale; | ||||
use common\models\Order; | use common\models\Order; | ||||
use common\models\ProductOrder; | use common\models\ProductOrder; | ||||
use common\models\User ; | |||||
use common\models\User; | |||||
/** | /** | ||||
* This is the model class for table "commande_auto". | * This is the model class for table "commande_auto". | ||||
*/ | */ | ||||
class Subscription extends ActiveRecordCommon | class Subscription extends ActiveRecordCommon | ||||
{ | { | ||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public static function tableName() | |||||
{ | |||||
return 'subscription'; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function rules() | |||||
{ | |||||
return [ | |||||
[['id_producer', 'id_point_sale'], 'required'], | |||||
[['id_user', 'id_producer', 'id_point_sale', 'monday', 'tuesday', | |||||
'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'week_frequency'], 'integer'], | |||||
[['auto_payment'], 'boolean'], | |||||
[['date_begin', 'date_end', 'username','comment'], 'safe'], | |||||
]; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function attributeLabels() | |||||
{ | |||||
return [ | |||||
'id' => 'ID', | |||||
'id_user' => 'Utilisateur', | |||||
'id_producer' => 'Etablissement', | |||||
'id_point_sale' => 'Point de vente', | |||||
'date_begin' => 'Date de début', | |||||
'date_end' => 'Date de fin', | |||||
'monday' => 'Lundi', | |||||
'tuesday' => 'Mardi', | |||||
'wednesday' => 'Mercredi', | |||||
'thursday' => 'Jeudi', | |||||
'friday' => 'Vendredi', | |||||
'saturday' => 'Samedi', | |||||
'sunday' => 'Dimanche', | |||||
'week_frequency' => 'Périodicité', | |||||
'auto_payment' => 'Paiement automatique', | |||||
'comment' => 'Commentaire' | |||||
]; | |||||
} | |||||
/* | |||||
* Relations | |||||
*/ | |||||
public function getUser() | |||||
{ | |||||
return $this->hasOne(User::className(), ['id' => 'id_user']); | |||||
} | |||||
public function getProducer() | |||||
{ | |||||
return $this->hasOne( | |||||
Producer::className(), | |||||
['id' => 'id_producer'] | |||||
); | |||||
} | |||||
public function getPointSale() | |||||
{ | |||||
return $this->hasOne( | |||||
PointSale::className(), | |||||
['id' => 'id_point_sale'] | |||||
); | |||||
} | |||||
public function getProductSubscription() | |||||
{ | |||||
return $this->hasMany( | |||||
ProductSubscription::className(), | |||||
['id_subscription' => 'id'] | |||||
)->with('product'); | |||||
} | |||||
/** | |||||
* Retourne les options de base nécessaires à la fonction de recherche. | |||||
* | |||||
* @return array | |||||
*/ | |||||
public static function defaultOptionsSearch() | |||||
{ | |||||
return [ | |||||
'with' => ['producer'], | |||||
'join_with' => ['user', 'productSubscription', 'productSubscription.product', 'pointSale'], | |||||
'orderby' => 'user.name ASC', | |||||
'attribute_id_producer' => 'subscription.id_producer' | |||||
] ; | |||||
} | |||||
/** | |||||
* Ajoute la commande pour une date donnée. | |||||
* | |||||
* @param string $date | |||||
*/ | |||||
public function add($date) | |||||
{ | |||||
// distribution | |||||
$distribution = Distribution::searchOne([ | |||||
'distribution.date' => date('Y-m-d', strtotime($date)) | |||||
]) ; | |||||
if ($distribution && count($this->productSubscription)) { | |||||
// commande | |||||
$order = new Order; | |||||
if (strlen($this->username)) { | |||||
$order->username = $this->username; | |||||
$order->id_user = 0; | |||||
} | |||||
else { | |||||
$order->id_user = $this->id_user; | |||||
} | |||||
$order->date = date('Y-m-d H:i:s'); | |||||
$order->origin = Order::ORIGIN_AUTO; | |||||
$order->id_point_sale = $this->id_point_sale; | |||||
$order->id_distribution = $distribution->id; | |||||
$order->id_subscription = $this->id; | |||||
if(strlen($this->comment)) { | |||||
$order->comment = $this->comment ; | |||||
} | |||||
$pointSale = PointSale::findOne($this->id_point_sale) ; | |||||
$creditFunctioning = $pointSale->getCreditFunctioning() ; | |||||
$order->auto_payment = 0 ; | |||||
if($order->id_user && Producer::getConfig('credit') && $pointSale->credit) { | |||||
if($creditFunctioning == Producer::CREDIT_FUNCTIONING_OPTIONAL) { | |||||
$order->auto_payment = $this->auto_payment ; | |||||
} | |||||
elseif($creditFunctioning == Producer::CREDIT_FUNCTIONING_MANDATORY) { | |||||
$order->auto_payment = 1 ; | |||||
} | |||||
elseif($creditFunctioning == Producer::CREDIT_FUNCTIONING_USER) { | |||||
$user = User::findOne($order->id_user) ; | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_user' => $order->id_user, | |||||
'id_producer' => $distribution->id_producer | |||||
]) ; | |||||
if($userProducer) { | |||||
$order->auto_payment = $userProducer->credit_active ; | |||||
} | |||||
} | |||||
} | |||||
$userPointSale = UserPointSale::searchOne([ | |||||
'id_point_sale' => $this->id_point_sale, | |||||
'id_user' => $this->id_user | |||||
]) ; | |||||
if ($userPointSale && strlen($userPointSale->comment)) { | |||||
$order->comment_point_sale = $userPointSale->comment; | |||||
} | |||||
$order->save(); | |||||
// liaison utilisateur / point de vente | |||||
if($order->id_user) { | |||||
$pointSale = PointSale::findOne($this->id_point_sale) ; | |||||
$pointSale->linkUser($order->id_user) ; | |||||
} | |||||
// produits | |||||
$amountTotal = 0; | |||||
$productsAdd = false; | |||||
foreach ($this->productSubscription as $productSubscription) { | |||||
$productOrder = new ProductOrder; | |||||
$productOrder->id_order = $order->id; | |||||
$productOrder->id_product = $productSubscription->product->id; | |||||
$productOrder->quantity = $productSubscription->quantity; | |||||
$productOrder->price = $productSubscription->product->price; | |||||
$productOrder->unit = $productSubscription->unit; | |||||
$productOrder->step = $productSubscription->step; | |||||
$productOrder->save(); | |||||
$productsAdd = true; | |||||
} | |||||
if (!$productsAdd) { | |||||
$order->delete(); | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public static function tableName() | |||||
{ | |||||
return 'subscription'; | |||||
} | } | ||||
} | |||||
/** | |||||
* Ajoute les commandes pour une date donnée à partir des abonnements. | |||||
* | |||||
* @param string $date | |||||
* @param boolean $force | |||||
*/ | |||||
public static function addAll($date, $force = false) | |||||
{ | |||||
$distribution = Distribution::searchOne([ | |||||
'date' => date('Y-m-d', strtotime($date)), | |||||
'id_producer' => GlobalParam::getCurrentProducerId(), | |||||
]) ; | |||||
if ($distribution) { | |||||
$arrayOrdersDistribution = Order::searchAll([ | |||||
Order::tableName().'.id_distribution' => $distribution->id | |||||
]); | |||||
$arraySubscriptions = self::searchByDate($date); | |||||
foreach ($arraySubscriptions as $subscription) { | |||||
if(!$subscription->hasOrderAlreadyExist($arrayOrdersDistribution)) { | |||||
$subscription->add($date); | |||||
} | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function rules() | |||||
{ | |||||
return [ | |||||
[['id_producer', 'id_point_sale'], 'required'], | |||||
[['id_user', 'id_producer', 'id_point_sale', 'monday', 'tuesday', | |||||
'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'week_frequency'], 'integer'], | |||||
[['auto_payment'], 'boolean'], | |||||
[['date_begin', 'date_end', 'username', 'comment'], 'safe'], | |||||
]; | |||||
} | } | ||||
} | |||||
/** | |||||
* Informe s'il existe une commande correspond à l'abonnement courant. | |||||
* | |||||
* @param array $arrayOrders | |||||
* @return boolean | |||||
*/ | |||||
public function hasOrderAlreadyExist($arrayOrders) | |||||
{ | |||||
if(is_array($arrayOrders) && count($arrayOrders) > 0) { | |||||
foreach($arrayOrders as $order) { | |||||
if((($order->id_user > 0 && $order->id_user == $this->id_user) || | |||||
(!$order->id_user && $order->username == $this->username)) && | |||||
$order->id_point_sale == $this->id_point_sale) { | |||||
return true ; | |||||
} | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function attributeLabels() | |||||
{ | |||||
return [ | |||||
'id' => 'ID', | |||||
'id_user' => 'Utilisateur', | |||||
'id_producer' => 'Etablissement', | |||||
'id_point_sale' => 'Point de vente', | |||||
'date_begin' => 'Date de début', | |||||
'date_end' => 'Date de fin', | |||||
'monday' => 'Lundi', | |||||
'tuesday' => 'Mardi', | |||||
'wednesday' => 'Mercredi', | |||||
'thursday' => 'Jeudi', | |||||
'friday' => 'Vendredi', | |||||
'saturday' => 'Samedi', | |||||
'sunday' => 'Dimanche', | |||||
'week_frequency' => 'Périodicité', | |||||
'auto_payment' => 'Paiement automatique', | |||||
'comment' => 'Commentaire' | |||||
]; | |||||
} | } | ||||
return false ; | |||||
} | |||||
/** | |||||
* Retourne les abonnements pour une date donnée. | |||||
* | |||||
* @param string $date | |||||
* @return array | |||||
*/ | |||||
public static function searchByDate($date) | |||||
{ | |||||
$date = date('Y-m-d', strtotime($date)); | |||||
$subscriptions = Subscription::searchAll() ; | |||||
$arrSubscriptions = []; | |||||
foreach ($subscriptions as $s) { | |||||
if ($date >= $s->date_begin && | |||||
(!$s->date_end || $date <= $s->date_end) && | |||||
$s->matchWith($date)) | |||||
{ | |||||
$arrSubscriptions[] = $s; | |||||
} | |||||
/* | |||||
* Relations | |||||
*/ | |||||
public function getUser() | |||||
{ | |||||
return $this->hasOne(User::className(), ['id' => 'id_user']); | |||||
} | } | ||||
return $arrSubscriptions; | |||||
} | |||||
/** | |||||
* Valide le fait qu'un abonnement est bien compatible avec une date donnée. | |||||
* | |||||
* @param string $date | |||||
* @return boolean | |||||
*/ | |||||
public function matchWith($date) | |||||
{ | |||||
$arrayDays = [ | |||||
1 => 'monday', | |||||
2 => 'tuesday', | |||||
3 => 'wednesday', | |||||
4 => 'thursday', | |||||
5 => 'friday', | |||||
6 => 'saturday', | |||||
7 => 'sunday' | |||||
] ; | |||||
$nbDays = (strtotime($date) - strtotime($this->date_begin)) / (24 * 60 * 60); | |||||
if (round($nbDays) % ($this->week_frequency * 7) < 7) { | |||||
$numDay = date('N', strtotime($date)); | |||||
$day = $arrayDays[$numDay] ; | |||||
if ($this->$day) { | |||||
return true ; | |||||
} | |||||
public function getProducer() | |||||
{ | |||||
return $this->hasOne( | |||||
Producer::className(), | |||||
['id' => 'id_producer'] | |||||
); | |||||
} | } | ||||
return false ; | |||||
} | |||||
/** | |||||
* Recherche les distributions futures où l'abonnement peut s'appliquer. | |||||
* | |||||
* @return array | |||||
*/ | |||||
public function searchMatchedIncomingDistributions() | |||||
{ | |||||
$producer = GlobalParam::getCurrentProducer() ; | |||||
$params = [ | |||||
':date_earliest_order' => $producer->getEarliestDateOrder(), | |||||
':date_begin' => date('Y-m-d', strtotime($this->date_begin)), | |||||
':id_producer' => GlobalParam::getCurrentProducerId() | |||||
] ; | |||||
$incomingDistributions = Distribution::find() | |||||
->where('id_producer = :id_producer') | |||||
->andWhere('date >= :date_begin') | |||||
->andWhere('date >= :date_earliest_order') ; | |||||
if($this->date_end) { | |||||
$incomingDistributions->andWhere('date < :date_end') ; | |||||
$params[':date_end'] = date('Y-m-d', strtotime($this->date_end)) ; | |||||
public function getPointSale() | |||||
{ | |||||
return $this->hasOne( | |||||
PointSale::className(), | |||||
['id' => 'id_point_sale'] | |||||
); | |||||
} | } | ||||
$incomingDistributions->orderBy('date ASC') ; | |||||
$incomingDistributions->params($params) ; | |||||
$incomingDistributionsArray = $incomingDistributions->all() ; | |||||
$matchedIncomingDistributionsArray = [] ; | |||||
foreach($incomingDistributionsArray as $incomingDistribution) { | |||||
if($this->matchWith($incomingDistribution->date)) { | |||||
$matchedIncomingDistributionsArray[] = $incomingDistribution ; | |||||
} | |||||
public function getProductSubscription() | |||||
{ | |||||
return $this->hasMany( | |||||
ProductSubscription::className(), | |||||
['id_subscription' => 'id'] | |||||
)->with('product'); | |||||
} | } | ||||
return $matchedIncomingDistributionsArray ; | |||||
} | |||||
public function deleteOrdersIncomingDistributions() | |||||
{ | |||||
$params = [ | |||||
':id_producer' => GlobalParam::getCurrentProducerId(), | |||||
':date_today' => date('Y-m-d'), | |||||
':date_begin' => $this->date_begin, | |||||
':id_subscription' => $this->id | |||||
]; | |||||
$orderDeadline = Producer::getConfig('order_deadline') ; | |||||
$hour = date('G') ; | |||||
if($hour >= $orderDeadline) { | |||||
$conditionDistributionDate = 'distribution.date > :date_today' ; | |||||
/** | |||||
* Retourne les options de base nécessaires à la fonction de recherche. | |||||
* | |||||
* @return array | |||||
*/ | |||||
public static function defaultOptionsSearch() | |||||
{ | |||||
return [ | |||||
'with' => ['producer'], | |||||
'join_with' => ['user', 'productSubscription', 'productSubscription.product', 'pointSale'], | |||||
'orderby' => 'user.name ASC', | |||||
'attribute_id_producer' => 'subscription.id_producer' | |||||
]; | |||||
} | } | ||||
else { | |||||
$conditionDistributionDate = 'distribution.date >= :date_today' ; | |||||
/** | |||||
* Ajoute la commande pour une date donnée. | |||||
* | |||||
* @param string $date | |||||
*/ | |||||
public function add($date) | |||||
{ | |||||
// distribution | |||||
$distribution = Distribution::searchOne([ | |||||
'distribution.date' => date('Y-m-d', strtotime($date)) | |||||
]); | |||||
if ($distribution && count($this->productSubscription)) { | |||||
// commande | |||||
$order = new Order; | |||||
if (strlen($this->username)) { | |||||
$order->username = $this->username; | |||||
$order->id_user = 0; | |||||
} else { | |||||
$order->id_user = $this->id_user; | |||||
} | |||||
$order->date = date('Y-m-d H:i:s'); | |||||
$order->origin = Order::ORIGIN_AUTO; | |||||
$order->id_point_sale = $this->id_point_sale; | |||||
$order->id_distribution = $distribution->id; | |||||
$order->id_subscription = $this->id; | |||||
if (strlen($this->comment)) { | |||||
$order->comment = $this->comment; | |||||
} | |||||
$pointSale = PointSale::findOne($this->id_point_sale); | |||||
$creditFunctioning = $pointSale->getCreditFunctioning(); | |||||
$order->auto_payment = 0; | |||||
if ($order->id_user && Producer::getConfig('credit') && $pointSale->credit) { | |||||
if ($creditFunctioning == Producer::CREDIT_FUNCTIONING_OPTIONAL) { | |||||
$order->auto_payment = $this->auto_payment; | |||||
} elseif ($creditFunctioning == Producer::CREDIT_FUNCTIONING_MANDATORY) { | |||||
$order->auto_payment = 1; | |||||
} elseif ($creditFunctioning == Producer::CREDIT_FUNCTIONING_USER) { | |||||
$user = User::findOne($order->id_user); | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_user' => $order->id_user, | |||||
'id_producer' => $distribution->id_producer | |||||
]); | |||||
if ($userProducer) { | |||||
$order->auto_payment = $userProducer->credit_active; | |||||
} | |||||
} | |||||
} | |||||
$userPointSale = UserPointSale::searchOne([ | |||||
'id_point_sale' => $this->id_point_sale, | |||||
'id_user' => $this->id_user | |||||
]); | |||||
if ($userPointSale && strlen($userPointSale->comment)) { | |||||
$order->comment_point_sale = $userPointSale->comment; | |||||
} | |||||
$order->save(); | |||||
// liaison utilisateur / point de vente | |||||
if ($order->id_user) { | |||||
$pointSale = PointSale::findOne($this->id_point_sale); | |||||
$pointSale->linkUser($order->id_user); | |||||
} | |||||
// produits | |||||
$amountTotal = 0; | |||||
$productsAdd = false; | |||||
foreach ($this->productSubscription as $productSubscription) { | |||||
$productOrder = new ProductOrder; | |||||
$productOrder->id_order = $order->id; | |||||
$productOrder->id_product = $productSubscription->product->id; | |||||
$productOrder->quantity = $productSubscription->quantity; | |||||
$productOrder->price = $productSubscription->product->price; | |||||
$productOrder->unit = $productSubscription->unit; | |||||
$productOrder->step = $productSubscription->step; | |||||
$productOrder->save(); | |||||
$productsAdd = true; | |||||
} | |||||
if (!$productsAdd) { | |||||
$order->delete(); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Ajoute les commandes pour une date donnée à partir des abonnements. | |||||
* | |||||
* @param string $date | |||||
* @param boolean $force | |||||
*/ | |||||
public static function addAll($date, $force = false) | |||||
{ | |||||
$distribution = Distribution::searchOne([ | |||||
'date' => date('Y-m-d', strtotime($date)), | |||||
'id_producer' => GlobalParam::getCurrentProducerId(), | |||||
]); | |||||
if ($distribution) { | |||||
$arrayOrdersDistribution = Order::searchAll([ | |||||
Order::tableName() . '.id_distribution' => $distribution->id | |||||
]); | |||||
$arraySubscriptions = self::searchByDate($date); | |||||
foreach ($arraySubscriptions as $subscription) { | |||||
if (!$subscription->hasOrderAlreadyExist($arrayOrdersDistribution)) { | |||||
$subscription->add($date); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Informe s'il existe une commande correspond à l'abonnement courant. | |||||
* | |||||
* @param array $arrayOrders | |||||
* @return boolean | |||||
*/ | |||||
public function hasOrderAlreadyExist($arrayOrders) | |||||
{ | |||||
if (is_array($arrayOrders) && count($arrayOrders) > 0) { | |||||
foreach ($arrayOrders as $order) { | |||||
if ((($order->id_user > 0 && $order->id_user == $this->id_user) || | |||||
(!$order->id_user && $order->username == $this->username)) && | |||||
$order->id_point_sale == $this->id_point_sale) { | |||||
return true; | |||||
} | |||||
} | |||||
} | |||||
return false; | |||||
} | } | ||||
$orders = Order::find() | |||||
->joinWith('distribution') | |||||
->where('distribution.id_producer = :id_producer') | |||||
->andWhere($conditionDistributionDate) | |||||
->andWhere('distribution.date >= :date_begin') | |||||
->andWhere('order.id_subscription = :id_subscription') ; | |||||
if($this->date_end) { | |||||
$orders->andWhere('distribution.date <= :date_end') ; | |||||
$params[':date_end'] = $this->date_end ; | |||||
/** | |||||
* Retourne les abonnements pour une date donnée. | |||||
* | |||||
* @param string $date | |||||
* @return array | |||||
*/ | |||||
public static function searchByDate($date) | |||||
{ | |||||
$date = date('Y-m-d', strtotime($date)); | |||||
$subscriptions = Subscription::searchAll(); | |||||
$arrSubscriptions = []; | |||||
foreach ($subscriptions as $s) { | |||||
if ($date >= $s->date_begin && | |||||
(!$s->date_end || $date <= $s->date_end) && | |||||
$s->matchWith($date)) { | |||||
$arrSubscriptions[] = $s; | |||||
} | |||||
} | |||||
return $arrSubscriptions; | |||||
} | } | ||||
$orders->params($params) ; | |||||
$ordersArray = $orders->all() ; | |||||
$configCredit = Producer::getConfig('credit') ; | |||||
if($ordersArray && count($ordersArray)) { | |||||
foreach($ordersArray as $order) { | |||||
$theOrder = Order::searchOne(['id' => $order->id]) ; | |||||
// remboursement de la commande | |||||
if ($theOrder->id_user && $theOrder->getAmount(Order::AMOUNT_PAID) && $configCredit) { | |||||
$theOrder->saveCreditHistory( | |||||
CreditHistory::TYPE_REFUND, | |||||
$theOrder->getAmount(Order::AMOUNT_PAID), | |||||
$theOrder->distribution->id_producer, | |||||
$theOrder->id_user, | |||||
User::getCurrentId() | |||||
); | |||||
/** | |||||
* Valide le fait qu'un abonnement est bien compatible avec une date donnée. | |||||
* | |||||
* @param string $date | |||||
* @return boolean | |||||
*/ | |||||
public function matchWith($date) | |||||
{ | |||||
$arrayDays = [ | |||||
1 => 'monday', | |||||
2 => 'tuesday', | |||||
3 => 'wednesday', | |||||
4 => 'thursday', | |||||
5 => 'friday', | |||||
6 => 'saturday', | |||||
7 => 'sunday' | |||||
]; | |||||
$nbDays = (strtotime($date) - strtotime($this->date_begin)) / (24 * 60 * 60); | |||||
if (round($nbDays) % ($this->week_frequency * 7) < 7) { | |||||
$numDay = date('N', strtotime($date)); | |||||
$day = $arrayDays[$numDay]; | |||||
if ($this->$day) { | |||||
return true; | |||||
} | |||||
} | } | ||||
ProductOrder::deleteAll(['id_order' => $order->id]) ; | |||||
$order->delete() ; | |||||
} | |||||
return false; | |||||
} | } | ||||
} | |||||
public function updateIncomingDistributions($update = false) | |||||
{ | |||||
$matchedDistributionsArray = $this->searchMatchedIncomingDistributions() ; | |||||
if($update) { | |||||
$this->deleteOrdersIncomingDistributions() ; | |||||
/** | |||||
* Recherche les distributions futures où l'abonnement peut s'appliquer. | |||||
* | |||||
* @return array | |||||
*/ | |||||
public function searchMatchedIncomingDistributions() | |||||
{ | |||||
$producer = GlobalParam::getCurrentProducer(); | |||||
$params = [ | |||||
':date_earliest_order' => $producer->getEarliestDateOrder(), | |||||
':date_begin' => date('Y-m-d', strtotime($this->date_begin)), | |||||
':id_producer' => GlobalParam::getCurrentProducerId() | |||||
]; | |||||
$incomingDistributions = Distribution::find() | |||||
->where('id_producer = :id_producer') | |||||
->andWhere('date >= :date_begin') | |||||
->andWhere('date >= :date_earliest_order'); | |||||
if ($this->date_end) { | |||||
$incomingDistributions->andWhere('date < :date_end'); | |||||
$params[':date_end'] = date('Y-m-d', strtotime($this->date_end)); | |||||
} | |||||
$incomingDistributions->orderBy('date ASC'); | |||||
$incomingDistributions->params($params); | |||||
$incomingDistributionsArray = $incomingDistributions->all(); | |||||
$matchedIncomingDistributionsArray = []; | |||||
foreach ($incomingDistributionsArray as $incomingDistribution) { | |||||
if ($this->matchWith($incomingDistribution->date)) { | |||||
$matchedIncomingDistributionsArray[] = $incomingDistribution; | |||||
} | |||||
} | |||||
return $matchedIncomingDistributionsArray; | |||||
} | } | ||||
if(count($matchedDistributionsArray)) { | |||||
foreach($matchedDistributionsArray as $distribution) { | |||||
$this->add($distribution->date) ; | |||||
} | |||||
public function deleteOrdersIncomingDistributions() | |||||
{ | |||||
$params = [ | |||||
':id_producer' => GlobalParam::getCurrentProducerId(), | |||||
':date_today' => date('Y-m-d'), | |||||
':date_begin' => $this->date_begin, | |||||
':id_subscription' => $this->id | |||||
]; | |||||
$orderDeadline = Producer::getConfig('order_deadline'); | |||||
$hour = date('G'); | |||||
if ($hour >= $orderDeadline) { | |||||
$conditionDistributionDate = 'distribution.date > :date_today'; | |||||
} else { | |||||
$conditionDistributionDate = 'distribution.date >= :date_today'; | |||||
} | |||||
$orders = Order::find() | |||||
->joinWith('distribution') | |||||
->where('distribution.id_producer = :id_producer') | |||||
->andWhere($conditionDistributionDate) | |||||
->andWhere('distribution.date >= :date_begin') | |||||
->andWhere('order.id_subscription = :id_subscription'); | |||||
if ($this->date_end) { | |||||
$orders->andWhere('distribution.date <= :date_end'); | |||||
$params[':date_end'] = $this->date_end; | |||||
} | |||||
$orders->params($params); | |||||
$ordersArray = $orders->all(); | |||||
$configCredit = Producer::getConfig('credit'); | |||||
if ($ordersArray && count($ordersArray)) { | |||||
foreach ($ordersArray as $order) { | |||||
$theOrder = Order::searchOne(['id' => $order->id]); | |||||
// remboursement de la commande | |||||
if ($theOrder->id_user && $theOrder->getAmount(Order::AMOUNT_PAID) && $configCredit) { | |||||
$theOrder->saveCreditHistory( | |||||
CreditHistory::TYPE_REFUND, | |||||
$theOrder->getAmount(Order::AMOUNT_PAID), | |||||
$theOrder->distribution->id_producer, | |||||
$theOrder->id_user, | |||||
User::getCurrentId() | |||||
); | |||||
} | |||||
ProductOrder::deleteAll(['id_order' => $order->id]); | |||||
$order->delete(); | |||||
} | |||||
} | |||||
} | } | ||||
} | |||||
/** | |||||
* Retourne true si des unités des ProductSubscription ne correspondent pas | |||||
* aux Product. | |||||
* | |||||
* @return boolean | |||||
*/ | |||||
public function hasUnitsNotMatch() | |||||
{ | |||||
if(isset($this->productSubscription) && is_array($this->productSubscription)) { | |||||
foreach($this->productSubscription as $productSubscription) { | |||||
if(isset($productSubscription->product) && $productSubscription->unit != $productSubscription->product->unit) { | |||||
return true ; | |||||
public function updateIncomingDistributions($update = false) | |||||
{ | |||||
$matchedDistributionsArray = $this->searchMatchedIncomingDistributions(); | |||||
if ($update) { | |||||
$this->deleteOrdersIncomingDistributions(); | |||||
} | |||||
if (count($matchedDistributionsArray)) { | |||||
foreach ($matchedDistributionsArray as $distribution) { | |||||
$this->add($distribution->date); | |||||
} | |||||
} | } | ||||
} | |||||
} | } | ||||
return false ; | |||||
} | |||||
} | } |
$newProductSubscription = new ProductSubscription; | $newProductSubscription = new ProductSubscription; | ||||
$newProductSubscription->id_subscription = $subscription->id; | $newProductSubscription->id_subscription = $subscription->id; | ||||
$newProductSubscription->id_product = $idProduct; | $newProductSubscription->id_product = $idProduct; | ||||
if($this->isAdmin) { | |||||
$unit = (Yii::$app->getRequest()->post('product_unit_'.$idProduct)) ? Yii::$app->getRequest()->post('product_unit_'.$idProduct) : $product->unit ; | |||||
$newProductSubscription->unit = $unit; | |||||
$step = (Yii::$app->getRequest()->post('product_step_'.$idProduct)) ? Yii::$app->getRequest()->post('product_step_'.$idProduct) : $product->step ; | |||||
$newProductSubscription->step = $step; | |||||
$price = (Yii::$app->getRequest()->post('product_price_'.$idProduct)) ? Yii::$app->getRequest()->post('product_price_'.$idProduct) : $product->price ; | |||||
$newProductSubscription->price = $price; | |||||
} | |||||
else { | |||||
if(isset($productsSubscriptionsArray) && is_array($productsSubscriptionsArray)) { | |||||
foreach($productsSubscriptionsArray as $productSubscription) { | |||||
if($productSubscription->id_product == $idProduct) { | |||||
$newProductSubscription->unit = $productSubscription->unit ; | |||||
$newProductSubscription->step = $productSubscription->step ; | |||||
$newProductSubscription->price = $productSubscription->price ; | |||||
} | |||||
} | |||||
} | |||||
if(!$newProductSubscription->unit) { | |||||
$newProductSubscription->unit = $product->unit ; | |||||
} | |||||
if(!$newProductSubscription->step) { | |||||
$newProductSubscription->step = $product->step; | |||||
} | |||||
if(!$newProductSubscription->price) { | |||||
$newProductSubscription->price = $product->price; | |||||
} | |||||
} | |||||
$newProductSubscription->quantity = $quantity / Product::$unitsArray[$newProductSubscription->unit]['coefficient']; | |||||
$newProductSubscription->quantity = $quantity / Product::$unitsArray[$product->unit]['coefficient']; | |||||
$newProductSubscription->save(); | $newProductSubscription->save(); | ||||
} | } |
* Created by fab on 30/12/17. | * Created by fab on 30/12/17. | ||||
*/ | */ | ||||
/** | |||||
* Retourne un prix sans taxe sur base du prix avec tax | |||||
* | |||||
* @param priceWithTax | |||||
* @param taxRate | |||||
* @returns {string} | |||||
*/ | |||||
function getPrice(priceWithTax, taxRate) { | function getPrice(priceWithTax, taxRate) { | ||||
return parseFloat(parseFloat(priceWithTax) / (taxRate + 1)).toFixed(2); | return parseFloat(parseFloat(priceWithTax) / (taxRate + 1)).toFixed(2); | ||||
} | } | ||||
/** | |||||
* Retourne un prix avec taxe sur base du prix sans taxe | |||||
* | |||||
* @param priceWithoutTax | |||||
* @param taxRate | |||||
* @returns {string} | |||||
*/ | |||||
function getPriceWithTax(priceWithoutTax, taxRate) { | function getPriceWithTax(priceWithoutTax, taxRate) { | ||||
return parseFloat(parseFloat(priceWithoutTax) * (taxRate + 1)).toFixed(2); | return parseFloat(parseFloat(priceWithoutTax) * (taxRate + 1)).toFixed(2); | ||||
} | } | ||||
/** | |||||
* Formate un prix en l'arrondissant et en ajoutant le sigle de la monnaie | |||||
* | |||||
* @param price | |||||
* @returns {string} | |||||
*/ | |||||
function formatPrice(price) { | function formatPrice(price) { | ||||
return Number(price).toFixed(2).replace('.', ',') + ' €'; | return Number(price).toFixed(2).replace('.', ',') + ' €'; | ||||
} | } | ||||
/** | |||||
* Formate une date au format jj/mm/yyyy | |||||
* @param date | |||||
* @returns {*} | |||||
*/ | |||||
function formatDate(date) { | |||||
if (date) { | |||||
return ('0' + date.getDate()).slice(-2) + '/' + ('0' + (date.getMonth() + 1)).slice(-2) + '/' + date.getFullYear(); | |||||
} | |||||
return false; | |||||
} | |||||
/** | |||||
* Equivalent de console.log (ne déclenche pas d'erreur si la console est fermé) | |||||
* | |||||
* @param msg | |||||
*/ | |||||
function log(msg) { | function log(msg) { | ||||
try { | try { | ||||
console.log(msg); | console.log(msg); | ||||
} | } | ||||
} | } | ||||
//Convertit un formulaire ou un objet en JSON (utilisé pour l'envoie de donnée en ajax) | |||||
/** | |||||
* Convertit un formulaire ou un objet en JSON (utilisé pour l'envoie de donnée en ajax) | |||||
*/ | |||||
$.fn.serializeObject = function () { | $.fn.serializeObject = function () { | ||||
var o = {}; | var o = {}; | ||||
var a = this.serializeArray(); | var a = this.serializeArray(); |
<?php | |||||
use yii\db\Migration; | |||||
class m200108_145508_module_bl_devis_factures_suppression_price_unit_step_product_subscription extends Migration | |||||
{ | |||||
public function safeUp() | |||||
{ | |||||
$this->dropColumn('product_subscription', 'unit') ; | |||||
$this->dropColumn('product_subscription', 'step') ; | |||||
$this->dropColumn('product_subscription', 'price') ; | |||||
} | |||||
public function safeDown() | |||||
{ | |||||
echo "m200108_145508_module_bl_devis_factures_suppression_price_unit_step_product_subscription cannot be reverted.\n"; | |||||
return false; | |||||
} | |||||
/* | |||||
// Use up()/down() to run migration code without a transaction. | |||||
public function up() | |||||
{ | |||||
} | |||||
public function down() | |||||
{ | |||||
echo "m200108_145508_module_bl_devis_factures_suppression_price_unit_step_product_subscription cannot be reverted.\n"; | |||||
return false; | |||||
} | |||||
*/ | |||||
} |
namespace producer\controllers; | namespace producer\controllers; | ||||
use common\helpers\Debug; | |||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\models\ProductDistribution; | use common\models\ProductDistribution; | ||||
use common\models\User; | use common\models\User; | ||||
$query->andOnCondition('product_distribution.id_distribution = ' . $distribution->id); | $query->andOnCondition('product_distribution.id_distribution = ' . $distribution->id); | ||||
}]) | }]) | ||||
->orderBy('product_distribution.active DESC, order ASC') | ->orderBy('product_distribution.active DESC, order ASC') | ||||
->asArray() | |||||
->all(); | ->all(); | ||||
$indexProduct = 0; | $indexProduct = 0; | ||||
foreach ($productsArray as &$product) { | foreach ($productsArray as &$product) { | ||||
if (!isset($product['productDistribution'][0])) { | |||||
$product['productDistribution'][0] = $distribution->linkProduct($product); | |||||
} | |||||
$product = array_merge( | |||||
$product->getAttributes(), | |||||
[ | |||||
'price_with_tax' => $product->getPriceWithTax(), | |||||
'productDistribution' => $product['productDistribution'] | |||||
] | |||||
); | |||||
$coefficient_unit = Product::$unitsArray[$product['unit']]['coefficient']; | $coefficient_unit = Product::$unitsArray[$product['unit']]['coefficient']; | ||||
$product['wording_unit'] = Product::strUnit($product['unit'], 'wording_unit', true); | $product['wording_unit'] = Product::strUnit($product['unit'], 'wording_unit', true); | ||||
} | } | ||||
$product['coefficient_unit'] = $coefficient_unit; | $product['coefficient_unit'] = $coefficient_unit; | ||||
if ($product['quantity_remaining'] < 0) $product['quantity_remaining'] = 0; | if ($product['quantity_remaining'] < 0) $product['quantity_remaining'] = 0; | ||||
$product['index'] = $indexProduct++; | $product['index'] = $indexProduct++; | ||||
} | } |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
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. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* 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. | |||||
*/ | |||||
namespace producer\controllers; | namespace producer\controllers; | ||||
use common\helpers\Debug; | |||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\models\SubscriptionForm ; | |||||
use common\models\SubscriptionSearch ; | |||||
use common\models\Product ; | |||||
use common\models\SubscriptionForm; | |||||
use common\models\SubscriptionSearch; | |||||
use common\models\Product; | |||||
class SubscriptionController extends ProducerBaseController | |||||
class SubscriptionController extends ProducerBaseController | |||||
{ | { | ||||
var $enableCsrfValidation = false; | |||||
public function behaviors() | |||||
{ | |||||
return [ | |||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
] | |||||
], | |||||
], | |||||
]; | |||||
} | |||||
/** | |||||
* Liste les commandes récurrente du producteur. | |||||
* | |||||
* @return string | |||||
*/ | |||||
public function actionIndex() | |||||
{ | |||||
$searchModel = new SubscriptionSearch ; | |||||
$searchModel->id_user = User::getCurrentId() ; | |||||
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); | |||||
return $this->render('index', [ | |||||
'searchModel' => $searchModel, | |||||
'dataProvider' => $dataProvider | |||||
]); | |||||
} | |||||
public function actionAjaxProcess() | |||||
{ | |||||
// form | |||||
$model = new SubscriptionForm; | |||||
$model->id_producer = GlobalParam::getCurrentProducerId(); | |||||
$model->id_user = User::getCurrentId() ; | |||||
$posts = Yii::$app->request->post() ; | |||||
$idSubscription = (int) $posts['idSubscription'] ; | |||||
$isUpdate = false ; | |||||
if($idSubscription) { | |||||
$subscription = Subscription::findOne($idSubscription); | |||||
if ($subscription) { | |||||
$model->id = $idSubscription; | |||||
$isUpdate = true ; | |||||
} | |||||
} | |||||
if ($model->load($posts) && $model->validate() | |||||
&& $model->save()) | |||||
{ | |||||
$subscription = Subscription::searchOne([ | |||||
'id' => $model->id | |||||
]) ; | |||||
$subscription->updateIncomingDistributions($isUpdate) ; | |||||
if($isUpdate) { | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement modifié'); | |||||
} | |||||
else { | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement ajouté'); | |||||
} | |||||
var $enableCsrfValidation = false; | |||||
public function behaviors() | |||||
{ | |||||
return [ | |||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
] | |||||
], | |||||
], | |||||
]; | |||||
} | } | ||||
} | |||||
/** | |||||
* Crée une commande récurrente. | |||||
* | |||||
* @return string | |||||
*/ | |||||
public function actionForm($id = 0) | |||||
{ | |||||
return $this->render('form', [ | |||||
'idSubscription' => (int) $id | |||||
]); | |||||
} | |||||
/** | |||||
* Modifie une commande récurrente. | |||||
* | |||||
* @param integer $id | |||||
* @return string | |||||
* @throws NotFoundHttpException | |||||
*/ | |||||
public function actionUpdate($id) | |||||
{ | |||||
// form | |||||
$model = new SubscriptionForm; | |||||
$subscription = Subscription::findOne($id); | |||||
if ($subscription) { | |||||
$model->id = $id; | |||||
$model->id_producer = $subscription->id_producer; | |||||
$model->id_user = $subscription->id_user; | |||||
$model->username = $subscription->username; | |||||
$model->id_point_sale = $subscription->id_point_sale; | |||||
$model->date_begin = date('d/m/Y', strtotime($subscription->date_begin)); | |||||
if (strlen($subscription->date_end)) { | |||||
$model->date_end = date('d/m/Y', strtotime($subscription->date_end)); | |||||
} | |||||
$model->monday = $subscription->monday; | |||||
$model->tuesday = $subscription->tuesday; | |||||
$model->wednesday = $subscription->wednesday; | |||||
$model->thursday = $subscription->thursday; | |||||
$model->friday = $subscription->friday; | |||||
$model->saturday = $subscription->saturday; | |||||
$model->sunday = $subscription->sunday; | |||||
$model->auto_payment = $subscription->auto_payment; | |||||
$model->week_frequency = $subscription->week_frequency; | |||||
// produits | |||||
$arrayProductsSubscription = ProductSubscription::searchAll([ | |||||
'id_subscription' => $model->id | |||||
]) ; | |||||
foreach ($arrayProductsSubscription as $productSubscription) { | |||||
$model->products['product_' . $productSubscription->id_product] = $productSubscription->quantity; | |||||
} | |||||
} else { | |||||
throw new NotFoundHttpException('L\'abonnement est introuvable.', 404); | |||||
/** | |||||
* Liste les commandes récurrente du producteur. | |||||
* | |||||
* @return string | |||||
*/ | |||||
public function actionIndex() | |||||
{ | |||||
$searchModel = new SubscriptionSearch; | |||||
$searchModel->id_user = User::getCurrentId(); | |||||
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); | |||||
return $this->render('index', [ | |||||
'searchModel' => $searchModel, | |||||
'dataProvider' => $dataProvider | |||||
]); | |||||
} | } | ||||
// produits | |||||
$productsArray = Product::searchAll() ; | |||||
if ($model->load(Yii::$app->request->post()) && $model->validate()) { | |||||
if (!strlen($model->date_end)) { | |||||
$model->date_end = null; | |||||
} | |||||
if ($model->save()) { | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement modifié'); | |||||
$subscription = Subscription::findOne($model->id) ; | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions() ; | |||||
if(count($matchedDistributionsArray)) { | |||||
return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id,'update' => true]); | |||||
public function actionAjaxProcess() | |||||
{ | |||||
// form | |||||
$model = new SubscriptionForm; | |||||
$model->id_producer = GlobalParam::getCurrentProducerId(); | |||||
$model->id_user = User::getCurrentId(); | |||||
$posts = Yii::$app->request->post(); | |||||
$idSubscription = (int)$posts['idSubscription']; | |||||
$isUpdate = false; | |||||
if ($idSubscription) { | |||||
$subscription = Subscription::findOne($idSubscription); | |||||
if ($subscription) { | |||||
$model->id = $idSubscription; | |||||
$isUpdate = true; | |||||
} | |||||
} | } | ||||
else { | |||||
return $this->redirect(['subscription/index']); | |||||
if ($model->load($posts) && $model->validate() | |||||
&& $model->save()) { | |||||
$subscription = Subscription::searchOne([ | |||||
'id' => $model->id | |||||
]); | |||||
$subscription->updateIncomingDistributions($isUpdate); | |||||
if ($isUpdate) { | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement modifié'); | |||||
} else { | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement ajouté'); | |||||
} | |||||
} | } | ||||
} | |||||
} | } | ||||
return $this->render('update', [ | |||||
'model' => $model, | |||||
'productsArray' => $productsArray | |||||
]); | |||||
} | |||||
/** | |||||
* Supprime un abonnement | |||||
* | |||||
* @param integer $id | |||||
*/ | |||||
public function actionDelete($id) | |||||
{ | |||||
$subscription = Subscription::searchOne([ | |||||
'id' => $id | |||||
]) ; | |||||
ProductSubscription::deleteAll(['id_subscription' => $id]); | |||||
$subscription->deleteOrdersIncomingDistributions() ; | |||||
$subscription->delete(); | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement supprimé'); | |||||
return $this->redirect(['subscription/index']); | |||||
} | |||||
public function actionAjaxInfos($idSubscription = 0) | |||||
{ | |||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | |||||
$params = [] ; | |||||
if($idSubscription > 0) { | |||||
$arrayProductsSubscription = ProductSubscription::searchAll([ | |||||
'id_subscription' => $idSubscription | |||||
]) ; | |||||
/** | |||||
* Crée une commande récurrente. | |||||
* | |||||
* @return string | |||||
*/ | |||||
public function actionForm($id = 0) | |||||
{ | |||||
return $this->render('form', [ | |||||
'idSubscription' => (int)$id | |||||
]); | |||||
} | } | ||||
// Produits | |||||
$productsArray = Product::searchAll() ; | |||||
$indexProduct = 0 ; | |||||
foreach($productsArray as &$product) { | |||||
$quantity = 0 ; | |||||
$coefficientUnit = Product::$unitsArray[$product->unit]['coefficient'] ; | |||||
if(isset($arrayProductsSubscription) && count($arrayProductsSubscription)) { | |||||
foreach ($arrayProductsSubscription as $productSubscription) { | |||||
if($product->id == $productSubscription->id_product) { | |||||
$coefficientUnit = Product::$unitsArray[$productSubscription->unit]['coefficient'] ; | |||||
$quantity = $productSubscription->quantity * $coefficientUnit; | |||||
$product->step = $productSubscription->step; | |||||
$product->unit = $productSubscription->unit; | |||||
$product->price = $productSubscription->price; | |||||
} | |||||
/** | |||||
* Modifie une commande récurrente. | |||||
* | |||||
* @param integer $id | |||||
* @return string | |||||
* @throws NotFoundHttpException | |||||
*/ | |||||
public function actionUpdate($id) | |||||
{ | |||||
// form | |||||
$model = new SubscriptionForm; | |||||
$subscription = Subscription::findOne($id); | |||||
if ($subscription) { | |||||
$model->id = $id; | |||||
$model->id_producer = $subscription->id_producer; | |||||
$model->id_user = $subscription->id_user; | |||||
$model->username = $subscription->username; | |||||
$model->id_point_sale = $subscription->id_point_sale; | |||||
$model->date_begin = date('d/m/Y', strtotime($subscription->date_begin)); | |||||
if (strlen($subscription->date_end)) { | |||||
$model->date_end = date('d/m/Y', strtotime($subscription->date_end)); | |||||
} | |||||
$model->monday = $subscription->monday; | |||||
$model->tuesday = $subscription->tuesday; | |||||
$model->wednesday = $subscription->wednesday; | |||||
$model->thursday = $subscription->thursday; | |||||
$model->friday = $subscription->friday; | |||||
$model->saturday = $subscription->saturday; | |||||
$model->sunday = $subscription->sunday; | |||||
$model->auto_payment = $subscription->auto_payment; | |||||
$model->week_frequency = $subscription->week_frequency; | |||||
// produits | |||||
$arrayProductsSubscription = ProductSubscription::searchAll([ | |||||
'id_subscription' => $model->id | |||||
]); | |||||
foreach ($arrayProductsSubscription as $productSubscription) { | |||||
$model->products['product_' . $productSubscription->id_product] = $productSubscription->quantity; | |||||
} | |||||
} else { | |||||
throw new NotFoundHttpException('L\'abonnement est introuvable.', 404); | |||||
} | } | ||||
} | |||||
$product = array_merge( | |||||
$product->getAttributes(), | |||||
[ | |||||
'index' => $indexProduct ++, | |||||
'quantity_form' => $quantity, | |||||
'coefficient_unit' => $coefficientUnit, | |||||
'wording_unit' => Product::strUnit($product->unit, 'wording_unit', true), | |||||
'wording_short' => Product::strUnit($product->unit, 'wording_short'), | |||||
] | |||||
) ; | |||||
// produits | |||||
$productsArray = Product::searchAll(); | |||||
if ($model->load(Yii::$app->request->post()) && $model->validate()) { | |||||
if (!strlen($model->date_end)) { | |||||
$model->date_end = null; | |||||
} | |||||
if ($model->save()) { | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement modifié'); | |||||
$subscription = Subscription::findOne($model->id); | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions(); | |||||
if (count($matchedDistributionsArray)) { | |||||
return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id, 'update' => true]); | |||||
} else { | |||||
return $this->redirect(['subscription/index']); | |||||
} | |||||
} | |||||
} | |||||
return $this->render('update', [ | |||||
'model' => $model, | |||||
'productsArray' => $productsArray | |||||
]); | |||||
} | } | ||||
$params['products'] = $productsArray ; | |||||
$pointsSaleArray = PointSale::searchAll() ; | |||||
foreach($pointsSaleArray as &$pointSale) { | |||||
$pointSale = array_merge($pointSale->getAttributes(),[ | |||||
'userPointSale' => ($pointSale->userPointSale ? $pointSale->userPointSale[0] : '') | |||||
]) ; | |||||
if($pointSale['code'] && strlen($pointSale['code'])) { | |||||
$pointSale['code'] = '***' ; | |||||
} | |||||
/** | |||||
* Supprime un abonnement | |||||
* | |||||
* @param integer $id | |||||
*/ | |||||
public function actionDelete($id) | |||||
{ | |||||
$subscription = Subscription::searchOne([ | |||||
'id' => $id | |||||
]); | |||||
ProductSubscription::deleteAll(['id_subscription' => $id]); | |||||
$subscription->deleteOrdersIncomingDistributions(); | |||||
$subscription->delete(); | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement supprimé'); | |||||
return $this->redirect(['subscription/index']); | |||||
} | } | ||||
$params['points_sale'] = $pointsSaleArray ; | |||||
if($idSubscription > 0) { | |||||
$subscription = Subscription::searchOne([ | |||||
'id' => $idSubscription | |||||
]) ; | |||||
if(!$subscription || $subscription->id_user != User::getCurrentId()) { | |||||
throw new UserException('Abonnement introuvable') ; | |||||
} | |||||
else { | |||||
$params = array_merge($params, $subscription->getAttributes()) ; | |||||
} | |||||
public function actionAjaxInfos($idSubscription = 0) | |||||
{ | |||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | |||||
$params = []; | |||||
if ($idSubscription > 0) { | |||||
$arrayProductsSubscription = ProductSubscription::searchAll([ | |||||
'id_subscription' => $idSubscription | |||||
]); | |||||
} | |||||
// Produits | |||||
$productsArray = Product::searchAll(); | |||||
$indexProduct = 0; | |||||
foreach ($productsArray as &$product) { | |||||
$quantity = 0; | |||||
$coefficientUnit = Product::$unitsArray[$product->unit]['coefficient']; | |||||
if (isset($arrayProductsSubscription) && count($arrayProductsSubscription)) { | |||||
foreach ($arrayProductsSubscription as $productSubscription) { | |||||
if ($product->id == $productSubscription->id_product) { | |||||
$coefficientUnit = Product::$unitsArray[$productSubscription->product->unit]['coefficient']; | |||||
$quantity = $productSubscription->quantity * $coefficientUnit; | |||||
} | |||||
} | |||||
} | |||||
$product = array_merge( | |||||
$product->getAttributes(), | |||||
[ | |||||
'index' => $indexProduct++, | |||||
'quantity_form' => $quantity, | |||||
'coefficient_unit' => $coefficientUnit, | |||||
'wording_unit' => Product::strUnit($product->unit, 'wording_unit', true), | |||||
'wording_short' => Product::strUnit($product->unit, 'wording_short'), | |||||
'price_with_tax' => $product->getPriceWithTax(), | |||||
] | |||||
); | |||||
} | |||||
$params['products'] = $productsArray; | |||||
$pointsSaleArray = PointSale::searchAll(); | |||||
foreach ($pointsSaleArray as &$pointSale) { | |||||
$pointSale = array_merge($pointSale->getAttributes(), [ | |||||
'userPointSale' => ($pointSale->userPointSale ? $pointSale->userPointSale[0] : '') | |||||
]); | |||||
if ($pointSale['code'] && strlen($pointSale['code'])) { | |||||
$pointSale['code'] = '***'; | |||||
} | |||||
} | |||||
$params['points_sale'] = $pointsSaleArray; | |||||
if ($idSubscription > 0) { | |||||
$subscription = Subscription::searchOne([ | |||||
'id' => $idSubscription | |||||
]); | |||||
if (!$subscription || $subscription->id_user != User::getCurrentId()) { | |||||
throw new UserException('Abonnement introuvable'); | |||||
} else { | |||||
$params = array_merge($params, $subscription->getAttributes()); | |||||
} | |||||
} | |||||
return $params; | |||||
} | } | ||||
return $params ; | |||||
} | |||||
/** | |||||
* Vérifie le code saisi pour un point de vente. | |||||
* | |||||
* @param integer $idPointSale | |||||
* @param string $code | |||||
* @return boolean | |||||
*/ | |||||
public function actionAjaxValidateCodePointSale($idPointSale, $code) | |||||
{ | |||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | |||||
$pointSale = PointSale::findOne($idPointSale); | |||||
if ($pointSale) { | |||||
if ($pointSale->validateCode($code)) { | |||||
return 1; | |||||
} | |||||
/** | |||||
* Vérifie le code saisi pour un point de vente. | |||||
* | |||||
* @param integer $idPointSale | |||||
* @param string $code | |||||
* @return boolean | |||||
*/ | |||||
public function actionAjaxValidateCodePointSale($idPointSale, $code) | |||||
{ | |||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | |||||
$pointSale = PointSale::findOne($idPointSale); | |||||
if ($pointSale) { | |||||
if ($pointSale->validateCode($code)) { | |||||
return 1; | |||||
} | |||||
} | |||||
return 0; | |||||
} | } | ||||
return 0; | |||||
} | |||||
} | } |
<div class="recipe" v-if="product.recipe.length">{{ product.recipe }}</div> | <div class="recipe" v-if="product.recipe.length">{{ product.recipe }}</div> | ||||
</td> | </td> | ||||
<td class="price-unit"> | <td class="price-unit"> | ||||
{{ formatPrice(product.price) }}<br /><span class="unit">{{ product.wording_unit }}</span> | |||||
{{ formatPrice(product.price_with_tax) }}<br /><span class="unit">{{ product.wording_unit }}</span> | |||||
</td> | </td> | ||||
<td class="td-quantity"> | <td class="td-quantity"> | ||||
<div class="input-group"> | <div class="input-group"> | ||||
</div> | </div> | ||||
</td> | </td> | ||||
<td class="price-total"> | <td class="price-total"> | ||||
{{ formatPrice(product.price * (product.quantity_form / product.coefficient_unit )) }} | |||||
{{ formatPrice(product.price_with_tax * (product.quantity_form / product.coefficient_unit )) }} | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr class="total"> | <tr class="total"> |
<div class="recipe" v-if="product.recipe.length">{{ product.recipe }}</div> | <div class="recipe" v-if="product.recipe.length">{{ product.recipe }}</div> | ||||
</td> | </td> | ||||
<td class="price-unit"> | <td class="price-unit"> | ||||
{{ formatPrice(product.price) }}<br /><span class="unit">{{ product.wording_unit }}</span> | |||||
{{ formatPrice(product.price_with_tax) }}<br /><span class="unit">{{ product.wording_unit }}</span> | |||||
</td> | </td> | ||||
<td class="quantity"> | <td class="quantity"> | ||||
<div class="input-group"> | <div class="input-group"> | ||||
</div> | </div> | ||||
</td> | </td> | ||||
<td class="price-total"> | <td class="price-total"> | ||||
{{ formatPrice(product.price * (product.quantity_form / product.coefficient_unit )) }} | |||||
{{ formatPrice(product.price_with_tax * (product.quantity_form / product.coefficient_unit )) }} | |||||
</td> | </td> | ||||
</tr> | </tr> | ||||
<tr class="total"> | <tr class="total"> |
foreach($model->productSubscription as $productSubscription) | foreach($model->productSubscription as $productSubscription) | ||||
{ | { | ||||
if(isset($productSubscription->product)) { | if(isset($productSubscription->product)) { | ||||
$html .= Html::encode($productSubscription->product->name).' ('.($productSubscription->quantity * Product::$unitsArray[$productSubscription->unit]['coefficient']) . ' '.Product::strUnit($productSubscription->unit, 'wording_short').')<br />' ; | |||||
$html .= Html::encode($productSubscription->product->name).' ('.($productSubscription->quantity * Product::$unitsArray[$productSubscription->product->unit]['coefficient']) . ' '.Product::strUnit($productSubscription->product->unit, 'wording_short').')<br />' ; | |||||
} | } | ||||
else { | else { | ||||
$html .= 'Produit non défini<br />' ; | $html .= 'Produit non défini<br />' ; |
} | } | ||||
return false ; | return false ; | ||||
}, | }, | ||||
formatPrice: function(price) { | |||||
var isNumberRegExp = new RegExp(/^[-+]?[0-9]+(\.[0-9]+)*$/); | |||||
if(isNumberRegExp.test(price)) { | |||||
return Number(price).toFixed(2).replace('.',',')+' €' ; | |||||
} | |||||
return '0 €' ; | |||||
}, | |||||
formatPrice: formatPrice, | |||||
getPointSale: function(idPointSale) { | getPointSale: function(idPointSale) { | ||||
for(var key in this.pointsSale) { | for(var key in this.pointsSale) { | ||||
if(this.pointsSale[key].id == idPointSale) { | if(this.pointsSale[key].id == idPointSale) { | ||||
var price = 0 ; | var price = 0 ; | ||||
for(var key in this.products) { | for(var key in this.products) { | ||||
if(this.products[key].quantity_form > 0) { | if(this.products[key].quantity_form > 0) { | ||||
price += (this.products[key].quantity_form / this.products[key].coefficient_unit) * this.products[key].price ; | |||||
price += (this.products[key].quantity_form / this.products[key].coefficient_unit) * this.products[key].price_with_tax ; | |||||
} | } | ||||
} | } | ||||
if(format) { | if(format) { |
var app = new Vue({ | var app = new Vue({ | ||||
el: '#app-subscription-form', | el: '#app-subscription-form', | ||||
data: { | data: { | ||||
lastCountDays: 0, | lastCountDays: 0, | ||||
comment: '' | comment: '' | ||||
}, | }, | ||||
mounted: function() { | |||||
mounted: function () { | |||||
this.init(); | this.init(); | ||||
}, | }, | ||||
methods: { | methods: { | ||||
init: function() { | |||||
var app = this ; | |||||
if($('#subscription-id').val() != 0) { | |||||
this.idSubscription = $('#subscription-id').val() ; | |||||
log: log, | |||||
init: function () { | |||||
var app = this; | |||||
if ($('#subscription-id').val() != 0) { | |||||
this.idSubscription = $('#subscription-id').val(); | |||||
} | } | ||||
this.dateBegin = new Date() ; | |||||
axios.get("ajax-infos",{params: {idSubscription : this.idSubscription}}) | |||||
.then(function(response) { | |||||
app.products = response.data.products ; | |||||
app.pointsSale = response.data.points_sale ; | |||||
if(app.idSubscription > 0) { | |||||
app.validatePointSale(response.data.id_point_sale) ; | |||||
app.weekFrequency = response.data.week_frequency ; | |||||
app.autoPayment = response.data.auto_payment ; | |||||
var arrayDateBegin = response.data.date_begin.split('-') ; | |||||
app.dateBegin = new Date(arrayDateBegin[0], arrayDateBegin[1] - 1, arrayDateBegin[2]) ; | |||||
if(response.data.date_end && response.data.date_end.length > 0) { | |||||
var arrayDateEnd = response.data.date_begin.split('-') ; | |||||
app.dateEnd = new Date(arrayDateEnd[0], arrayDateEnd[1] - 1, arrayDateEnd[2]) ; | |||||
this.dateBegin = new Date(); | |||||
axios.get("ajax-infos", {params: {idSubscription: this.idSubscription}}) | |||||
.then(function (response) { | |||||
app.products = response.data.products; | |||||
app.pointsSale = response.data.points_sale; | |||||
if (app.idSubscription > 0) { | |||||
app.validatePointSale(response.data.id_point_sale); | |||||
app.weekFrequency = response.data.week_frequency; | |||||
app.autoPayment = response.data.auto_payment; | |||||
var arrayDateBegin = response.data.date_begin.split('-'); | |||||
app.dateBegin = new Date(arrayDateBegin[0], arrayDateBegin[1] - 1, arrayDateBegin[2]); | |||||
if (response.data.date_end && response.data.date_end.length > 0) { | |||||
var arrayDateEnd = response.data.date_begin.split('-'); | |||||
app.dateEnd = new Date(arrayDateEnd[0], arrayDateEnd[1] - 1, arrayDateEnd[2]); | |||||
} | } | ||||
app.monday = response.data.monday ; | |||||
app.tuesday = response.data.tuesday ; | |||||
app.wednesday = response.data.wednesday ; | |||||
app.thursday = response.data.thursday ; | |||||
app.friday = response.data.friday ; | |||||
app.saturday = response.data.saturday ; | |||||
app.sunday = response.data.sunday ; | |||||
app.comment = response.data.comment ; | |||||
app.monday = response.data.monday; | |||||
app.tuesday = response.data.tuesday; | |||||
app.wednesday = response.data.wednesday; | |||||
app.thursday = response.data.thursday; | |||||
app.friday = response.data.friday; | |||||
app.saturday = response.data.saturday; | |||||
app.sunday = response.data.sunday; | |||||
app.comment = response.data.comment; | |||||
} | } | ||||
app.loading = false ; | |||||
}); | |||||
}, | |||||
formatDate: function(date) { | |||||
if(date) { | |||||
return ('0' + date.getDate()).slice(-2) + '/' + ('0' + (date.getMonth() + 1)).slice(-2) + '/' + date.getFullYear() ; | |||||
} | |||||
return false ; | |||||
app.loading = false; | |||||
}); | |||||
}, | }, | ||||
pointSaleClick: function(event) { | |||||
var app = this ; | |||||
var idPointSale = event.currentTarget.getAttribute('data-id-point-sale') ; | |||||
var hasCode = event.currentTarget.getAttribute('data-code') ; | |||||
if(hasCode) { | |||||
axios.get('ajax-validate-code-point-sale',{params: { | |||||
idPointSale: idPointSale, | |||||
code: this.pointsSaleCodes[idPointSale] | |||||
}}).then(function(response) { | |||||
if(response.data) { | |||||
app.getPointSale(idPointSale).invalid_code = false ; | |||||
app.validatePointSale(idPointSale) ; | |||||
formatDate: formatDate, | |||||
pointSaleClick: function (event) { | |||||
var app = this; | |||||
var idPointSale = event.currentTarget.getAttribute('data-id-point-sale'); | |||||
var hasCode = event.currentTarget.getAttribute('data-code'); | |||||
if (hasCode) { | |||||
axios.get('ajax-validate-code-point-sale', { | |||||
params: { | |||||
idPointSale: idPointSale, | |||||
code: this.pointsSaleCodes[idPointSale] | |||||
} | } | ||||
else { | |||||
app.getPointSale(idPointSale).invalid_code = true ; | |||||
}).then(function (response) { | |||||
if (response.data) { | |||||
app.getPointSale(idPointSale).invalid_code = false; | |||||
app.validatePointSale(idPointSale); | |||||
} else { | |||||
app.getPointSale(idPointSale).invalid_code = true; | |||||
Vue.set(app.pointsSaleCodes, idPointSale, ''); | Vue.set(app.pointsSaleCodes, idPointSale, ''); | ||||
} | } | ||||
}) ; | |||||
} | |||||
else { | |||||
this.validatePointSale(idPointSale) ; | |||||
}); | |||||
} else { | |||||
this.validatePointSale(idPointSale); | |||||
} | } | ||||
}, | }, | ||||
validatePointSale: function(idPointSale) { | |||||
if(this.idPointSaleActive != idPointSale) { | |||||
this.monday = false ; | |||||
this.tuesday = false ; | |||||
this.wednesday = false ; | |||||
this.thursday = false ; | |||||
this.friday = false ; | |||||
this.saturday = false ; | |||||
this.sunday = false ; | |||||
validatePointSale: function (idPointSale) { | |||||
if (this.idPointSaleActive != idPointSale) { | |||||
this.monday = false; | |||||
this.tuesday = false; | |||||
this.wednesday = false; | |||||
this.thursday = false; | |||||
this.friday = false; | |||||
this.saturday = false; | |||||
this.sunday = false; | |||||
} | } | ||||
this.pointSaleActive = this.getPointSale(idPointSale) ; | |||||
this.idPointSaleActive = idPointSale ; | |||||
opendistrib_scroll('step-date') ; | |||||
this.pointSaleActive = this.getPointSale(idPointSale); | |||||
this.idPointSaleActive = idPointSale; | |||||
opendistrib_scroll('step-date'); | |||||
}, | }, | ||||
getPointSale: function(idPointSale) { | |||||
for(var key in this.pointsSale) { | |||||
if(this.pointsSale[key].id == idPointSale) { | |||||
return this.pointsSale[key] ; | |||||
getPointSale: function (idPointSale) { | |||||
for (var key in this.pointsSale) { | |||||
if (this.pointsSale[key].id == idPointSale) { | |||||
return this.pointsSale[key]; | |||||
} | } | ||||
} | } | ||||
}, | }, | ||||
dayChange: function() { | |||||
console.log(this.monday+' '+this.tuesday+' '+this.wednesday+' '+ | |||||
this.thursday+' '+this.friday+' '+this.saturday+' '+this.sunday) ; | |||||
dayChange: function () { | |||||
console.log(this.monday + ' ' + this.tuesday + ' ' + this.wednesday + ' ' + | |||||
this.thursday + ' ' + this.friday + ' ' + this.saturday + ' ' + this.sunday); | |||||
var count = Number(this.monday) + Number(this.tuesday) + Number(this.wednesday) | var count = Number(this.monday) + Number(this.tuesday) + Number(this.wednesday) | ||||
+ Number(this.thursday) + Number(this.friday) + Number(this.saturday) | |||||
+ Number(this.sunday) ; | |||||
if(count == 1 && this.lastCountDays == 0) { | |||||
this.lastCountDays = count ; | |||||
opendistrib_scroll('step-days') ; | |||||
+ Number(this.thursday) + Number(this.friday) + Number(this.saturday) | |||||
+ Number(this.sunday); | |||||
if (count == 1 && this.lastCountDays == 0) { | |||||
this.lastCountDays = count; | |||||
opendistrib_scroll('step-days'); | |||||
} | } | ||||
}, | }, | ||||
checkProductAvailable: function(product) { | |||||
checkProductAvailable: function (product) { | |||||
var available = product.active && | var available = product.active && | ||||
(!this.monday || (this.monday && product.monday)) && | |||||
(!this.tuesday || (this.tuesday && product.tuesday)) && | |||||
(!this.wednesday || (this.wednesday && product.wednesday)) && | |||||
(!this.thursday || (this.thursday && product.thursday)) && | |||||
(!this.friday || (this.friday && product.friday)) && | |||||
(!this.saturday || (this.saturday && product.saturday)) && | |||||
(!this.sunday || (this.sunday && product.sunday)) ; | |||||
if(!available) { | |||||
product.quantity_form = 0 ; | |||||
(!this.monday || (this.monday && product.monday)) && | |||||
(!this.tuesday || (this.tuesday && product.tuesday)) && | |||||
(!this.wednesday || (this.wednesday && product.wednesday)) && | |||||
(!this.thursday || (this.thursday && product.thursday)) && | |||||
(!this.friday || (this.friday && product.friday)) && | |||||
(!this.saturday || (this.saturday && product.saturday)) && | |||||
(!this.sunday || (this.sunday && product.sunday)); | |||||
if (!available) { | |||||
product.quantity_form = 0; | |||||
} | } | ||||
return available ; | |||||
return available; | |||||
}, | }, | ||||
checkOneProductAvailable: function() { | |||||
var count = 0 ; | |||||
for(key in this.products) { | |||||
if(this.checkProductAvailable(this.products[key])) { | |||||
count ++ ; | |||||
checkOneProductAvailable: function () { | |||||
var count = 0; | |||||
for (key in this.products) { | |||||
if (this.checkProductAvailable(this.products[key])) { | |||||
count++; | |||||
} | } | ||||
} | } | ||||
return count ; | |||||
return count; | |||||
}, | }, | ||||
productQuantityClick: function(product, quantity) { | |||||
if( this.products[product.index].quantity_form + quantity >= 0) { | |||||
this.products[product.index].quantity_form += quantity ; | |||||
productQuantityClick: function (product, quantity) { | |||||
if (this.products[product.index].quantity_form + quantity >= 0) { | |||||
this.products[product.index].quantity_form += quantity; | |||||
} | } | ||||
}, | }, | ||||
oneProductOrdered: function() { | |||||
for(var key in this.products) { | |||||
if(this.products[key].quantity_form > 0) { | |||||
return true ; | |||||
oneProductOrdered: function () { | |||||
for (var key in this.products) { | |||||
if (this.products[key].quantity_form > 0) { | |||||
return true; | |||||
} | } | ||||
} | |||||
return false ; | |||||
}, | |||||
formatPrice: function(price) { | |||||
var isNumberRegExp = new RegExp(/^[-+]?[0-9]+(\.[0-9]+)*$/); | |||||
if(isNumberRegExp.test(price) && price > 0) { | |||||
return Number(price).toFixed(2).replace('.',',')+' €' ; | |||||
} | } | ||||
return '--' ; | |||||
return false; | |||||
}, | }, | ||||
priceTotal: function(format) { | |||||
var price = 0 ; | |||||
for(var key in this.products) { | |||||
if(this.products[key].quantity_form > 0) { | |||||
price += (this.products[key].quantity_form / this.products[key].coefficient_unit) * this.products[key].price ; | |||||
formatPrice: formatPrice, | |||||
getPriceWithTax: getPriceWithTax, | |||||
priceTotal: function (format) { | |||||
var price = 0; | |||||
for (var key in this.products) { | |||||
if (this.products[key].quantity_form > 0) { | |||||
price += (this.products[key].quantity_form / this.products[key].coefficient_unit) * this.products[key].price_with_tax; | |||||
} | } | ||||
} | } | ||||
if(format) { | |||||
return this.formatPrice(price) ; | |||||
} | |||||
else { | |||||
return price ; | |||||
if (format) { | |||||
return this.formatPrice(price); | |||||
} else { | |||||
return price; | |||||
} | } | ||||
}, | }, | ||||
formSubmit: function() { | |||||
this.checkForm() ; | |||||
if(!this.errors.length && !this.disableSubmitButton) { | |||||
formSubmit: function () { | |||||
this.checkForm(); | |||||
if (!this.errors.length && !this.disableSubmitButton) { | |||||
this.disableSubmitButton = true ; | |||||
this.disableSubmitButton = true; | |||||
var productsArray = {} ; | |||||
for(var key in this.products) { | |||||
if( this.products[key].quantity_form != null && | |||||
var productsArray = {}; | |||||
for (var key in this.products) { | |||||
if (this.products[key].quantity_form != null && | |||||
this.products[key].quantity_form > 0) { | this.products[key].quantity_form > 0) { | ||||
productsArray['product_'+this.products[key].id] = this.products[key].quantity_form ; | |||||
productsArray['product_' + this.products[key].id] = this.products[key].quantity_form; | |||||
} | } | ||||
} | } | ||||
axios.post('ajax-process', { | axios.post('ajax-process', { | ||||
idSubscription: this.idSubscription, | idSubscription: this.idSubscription, | ||||
SubscriptionForm: { | SubscriptionForm: { | ||||
products: productsArray, | products: productsArray, | ||||
comment: this.comment | comment: this.comment | ||||
} | } | ||||
}).then(function(response) { | |||||
window.location.href = opendistrib_base_url(true)+'subscription/index' ; | |||||
}).then(function (response) { | |||||
window.location.href = opendistrib_base_url(true) + 'subscription/index'; | |||||
}); | }); | ||||
} | } | ||||
}, | }, | ||||
checkForm: function() { | |||||
var app = this ; | |||||
this.errors = [] ; | |||||
if(!this.idPointSaleActive) { | |||||
this.errors.push('Veuillez sélectionner un point de vente') ; | |||||
} | |||||
else { | |||||
if(this.pointSaleActive.code && this.pointSaleActive.code.length > 0) { | |||||
axios.get('ajax-validate-code-point-sale',{params: { | |||||
idPointSale: this.idPointSaleActive, | |||||
code: this.pointSaleActive.code | |||||
}}).then(function(response) { | |||||
if(response.data) { | |||||
app.pointsSale[idPointSale].invalid_code = false ; | |||||
checkForm: function () { | |||||
var app = this; | |||||
this.errors = []; | |||||
if (!this.idPointSaleActive) { | |||||
this.errors.push('Veuillez sélectionner un point de vente'); | |||||
} else { | |||||
if (this.pointSaleActive.code && this.pointSaleActive.code.length > 0) { | |||||
axios.get('ajax-validate-code-point-sale', { | |||||
params: { | |||||
idPointSale: this.idPointSaleActive, | |||||
code: this.pointSaleActive.code | |||||
} | } | ||||
else { | |||||
app.pointsSale[idPointSale].invalid_code = true ; | |||||
}).then(function (response) { | |||||
if (response.data) { | |||||
app.pointsSale[idPointSale].invalid_code = false; | |||||
} else { | |||||
app.pointsSale[idPointSale].invalid_code = true; | |||||
Vue.set(app.pointsSaleCodes, idPointSale, ''); | Vue.set(app.pointsSaleCodes, idPointSale, ''); | ||||
} | } | ||||
}) ; | |||||
}); | |||||
} | } | ||||
} | } | ||||
var regexDate = /^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/; | var regexDate = /^[0-9]{2}\/[0-9]{2}\/[0-9]{4}$/; | ||||
if(!this.dateBegin) { | |||||
this.errors.push('Veuillez sélectionner une date de début') ; | |||||
} | |||||
else { | |||||
if(!regexDate.test(this.formatDate(this.dateBegin))) { | |||||
this.errors.push('Mauvais format de date de début') ; | |||||
if (!this.dateBegin) { | |||||
this.errors.push('Veuillez sélectionner une date de début'); | |||||
} else { | |||||
if (!regexDate.test(this.formatDate(this.dateBegin))) { | |||||
this.errors.push('Mauvais format de date de début'); | |||||
} | } | ||||
} | } | ||||
if(this.dateEnd && this.dateEnd.length > 0 && !regexDate.test(this.formatDate(this.dateEnd))) { | |||||
this.errors.push('Mauvais format de date de fin') ; | |||||
if (this.dateEnd && this.dateEnd.length > 0 && !regexDate.test(this.formatDate(this.dateEnd))) { | |||||
this.errors.push('Mauvais format de date de fin'); | |||||
} | } | ||||
if(this.weekFrequency != 1 && this.weekFrequency != 2 && | |||||
if (this.weekFrequency != 1 && this.weekFrequency != 2 && | |||||
this.weekFrequency != 3 && this.weekFrequency != 4) { | this.weekFrequency != 3 && this.weekFrequency != 4) { | ||||
this.errors.push('Veuillez sélectionner une périodicité') ; | |||||
this.errors.push('Veuillez sélectionner une périodicité'); | |||||
} | } | ||||
if(!this.monday && !this.tuesday && !this.wednesday && !this.thursday && | |||||
if (!this.monday && !this.tuesday && !this.wednesday && !this.thursday && | |||||
!this.friday && !this.saturday) { | !this.friday && !this.saturday) { | ||||
this.errors.push('Veuillez sélectionner un jour de distribution') ; | |||||
this.errors.push('Veuillez sélectionner un jour de distribution'); | |||||
} | } | ||||
if(!this.oneProductOrdered()) { | |||||
this.errors.push('Veuillez choisir au moins un produit') ; | |||||
if (!this.oneProductOrdered()) { | |||||
this.errors.push('Veuillez choisir au moins un produit'); | |||||
} | } | ||||
if(this.errors.length) { | |||||
window.scroll(0, $('#page-title').position().top - 25) ; | |||||
if (this.errors.length) { | |||||
window.scroll(0, $('#page-title').position().top - 25); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
}); | |||||
}); | |||||