&& $model->save()) | && $model->save()) | ||||
{ | { | ||||
Yii::$app->getSession()->setFlash('success', 'Abonnement ajouté'); | Yii::$app->getSession()->setFlash('success', 'Abonnement ajouté'); | ||||
return $this->redirect(['subscription/index']); | |||||
$subscription = Subscription::findOne($model->id) ; | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions() ; | |||||
if(count($matchedDistributionsArray)) { | |||||
return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id]); | |||||
} | |||||
else { | |||||
return $this->redirect(['subscription/index']); | |||||
} | |||||
} | } | ||||
return $this->render('create', [ | return $this->render('create', [ | ||||
} | } | ||||
if ($model->save()) { | if ($model->save()) { | ||||
Yii::$app->getSession()->setFlash('success', 'Abonnement modifié'); | Yii::$app->getSession()->setFlash('success', 'Abonnement modifié'); | ||||
return $this->redirect(['subscription/index']); | |||||
$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->redirect(['subscription/index']); | return $this->redirect(['subscription/index']); | ||||
} | } | ||||
public function actionUpdateDistributions($idSubscription, $generate = false, $update = false) | |||||
{ | |||||
$subscription = Subscription::findOne($idSubscription) ; | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions() ; | |||||
if($generate) { | |||||
if($update) { | |||||
$subscription->deleteOrdersIncomingDistributions() ; | |||||
} | |||||
foreach($matchedDistributionsArray as $distribution) { | |||||
$subscription->add($distribution->date) ; | |||||
} | |||||
Yii::$app->getSession()->setFlash('success', 'Commandes '.($update ? 're-' : '').'générées dans les distributions futures.'); | |||||
return $this->redirect(['subscription/index']) ; | |||||
} | |||||
return $this->render('update_distributions',[ | |||||
'matchedDistributionsArray' => $matchedDistributionsArray, | |||||
'idSubscription' => $idSubscription, | |||||
'update' => $update | |||||
]) ; | |||||
} | |||||
} | } |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.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. | |||||
*/ | |||||
use yii\helpers\Html; | |||||
$this->setTitle('Mise à jour des distributions') ; | |||||
$this->addBreadcrumb(['label' => 'Abonnements', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | |||||
?> | |||||
<p> | |||||
Souhaitez-vous <?php if($update): ?>re-<?php endif; ?>générer les commandes de cet abonnement pour les distributions futures ? | |||||
</p> | |||||
<div class="alert alert-warning">Attention, les éventuelles commandes futures modifiées par l'utilisateur seront supprimées pour être re-générées.</div> | |||||
<p> | |||||
<?php | |||||
$cpt = 0 ; | |||||
foreach($matchedDistributionsArray as $distribution) { | |||||
$cpt ++ ; | |||||
echo date('d/m/Y',strtotime($distribution->date)) ; | |||||
if($cpt < count($matchedDistributionsArray)) { | |||||
echo ', ' ; | |||||
} | |||||
} | |||||
?> | |||||
</p> | |||||
<?= Html::a('Non', ['subscription/index'], ['class' => 'btn btn-default']) ?> | |||||
<?= Html::a('Oui, '.($update ? 're-' : '').'générer les commandes', ['subscription/update-distributions', 'idSubscription' => $idSubscription, 'generate' => true, 'update' => $update], ['class' => 'btn btn-primary']) ?> |
* @property integer $id_point_sale | * @property integer $id_point_sale | ||||
* @property integer $id_distribution | * @property integer $id_distribution | ||||
* @property boolean $auto_payment | * @property boolean $auto_payment | ||||
* @property integer $id_subscription | |||||
*/ | */ | ||||
class Order extends ActiveRecordCommon | class Order extends ActiveRecordCommon | ||||
{ | { | ||||
{ | { | ||||
return [ | return [ | ||||
[['id_user', 'date', 'id_point_sale', 'id_distribution'], 'required', 'message' => ''], | [['id_user', 'date', 'id_point_sale', 'id_distribution'], 'required', 'message' => ''], | ||||
[['id_user', 'id_point_sale', 'id_distribution'], 'integer'], | |||||
[['id_user', 'id_point_sale', 'id_distribution','id_subscription'], 'integer'], | |||||
[['auto_payment'], 'boolean'], | [['auto_payment'], 'boolean'], | ||||
[['date', 'date_update', 'comment', 'comment_point_sale'], 'safe'] | [['date', 'date_update', 'comment', 'comment_point_sale'], 'safe'] | ||||
]; | ]; | ||||
'date_update' => 'Date de modification', | 'date_update' => 'Date de modification', | ||||
'id_point_sale' => 'Point de vente', | 'id_point_sale' => 'Point de vente', | ||||
'id_distribution' => 'Date de distribution', | 'id_distribution' => 'Date de distribution', | ||||
'id_subscription' => 'Abonnement', | |||||
]; | ]; | ||||
} | } | ||||
{ | { | ||||
return $this->hasMany(CreditHistory::className(), ['id_order' => 'id']); | return $this->hasMany(CreditHistory::className(), ['id_order' => 'id']); | ||||
} | } | ||||
public function getSubscription() | |||||
{ | |||||
return $this->hasOne(Subscription::className(), ['id' => 'id_subscription']) | |||||
->with('productSubscription'); | |||||
} | |||||
/** | /** | ||||
* Retourne les options de base nécessaires à la fonction de recherche. | * Retourne les options de base nécessaires à la fonction de recherche. |
$order->origin = Order::ORIGIN_AUTO; | $order->origin = Order::ORIGIN_AUTO; | ||||
$order->id_point_sale = $this->id_point_sale; | $order->id_point_sale = $this->id_point_sale; | ||||
$order->id_distribution = $distribution->id; | $order->id_distribution = $distribution->id; | ||||
$order->id_subscription = $this->id; | |||||
$order->auto_payment = $this->auto_payment ; | $order->auto_payment = $this->auto_payment ; | ||||
$userPointSale = UserPointSale::searchOne([ | $userPointSale = UserPointSale::searchOne([ | ||||
return $arrSubscriptions; | return $arrSubscriptions; | ||||
} | } | ||||
/** | |||||
* Recherche les distributions futures où l'abonnement peut s'appliquer. | |||||
* | |||||
* @return array | |||||
*/ | |||||
public function searchMatchedIncomingDistributions() | |||||
{ | |||||
$params = [ | |||||
':date_today' => date('Y-m-d'), | |||||
':date_begin' => date('Y-m-d', strtotime($this->date_begin)), | |||||
':id_producer' => Producer::getId() | |||||
] ; | |||||
$incomingDistributions = Distribution::find() | |||||
->where('id_producer = :id_producer') | |||||
->andWhere('date >= :date_begin') | |||||
->andWhere('date >= :date_today') ; | |||||
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 = [] ; | |||||
$arrayDays = [ | |||||
1 => 'monday', | |||||
2 => 'tuesday', | |||||
3 => 'wednesday', | |||||
4 => 'thursday', | |||||
5 => 'friday', | |||||
6 => 'saturday', | |||||
7 => 'sunday' | |||||
] ; | |||||
foreach($incomingDistributionsArray as $incomingDistribution) { | |||||
$numDay = date('N', strtotime($incomingDistribution->date)) ; | |||||
$day = $arrayDays[$numDay] ; | |||||
if($this->$day) { | |||||
$matchedIncomingDistributionsArray[] = $incomingDistribution ; | |||||
} | |||||
} | |||||
return $matchedIncomingDistributionsArray ; | |||||
} | |||||
public function deleteOrdersIncomingDistributions() | |||||
{ | |||||
$params = [ | |||||
':id_producer' => Producer::getId(), | |||||
':date_today' => date('Y-m-d'), | |||||
':date_begin' => $this->date_begin, | |||||
':id_subscription' => $this->id | |||||
]; | |||||
$orders = Order::find() | |||||
->joinWith('distribution') | |||||
->where('distribution.id_producer = :id_producer') | |||||
->andWhere('distribution.date >= :date_today') | |||||
->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() ; | |||||
if($ordersArray && count($ordersArray)) { | |||||
foreach($ordersArray as $order) { | |||||
$order->delete() ; | |||||
} | |||||
} | |||||
} | |||||
} | } |
public function rules() | public function rules() | ||||
{ | { | ||||
return [ | return [ | ||||
[['id_producer', 'week_frequency', 'id_point_sale'], 'integer'], | |||||
[['id_producer', 'week_frequency', 'id_point_sale','id'], 'integer'], | |||||
[['date_begin', 'date_end'], 'date', 'format' => 'php:d/m/Y'], | [['date_begin', 'date_end'], 'date', 'format' => 'php:d/m/Y'], | ||||
[['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'auto_payment'], 'boolean'], | [['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'auto_payment'], 'boolean'], | ||||
[['id_point_sale', 'id_producer', 'date_begin'], 'required', 'message' => 'Champs obligatoire'], | [['id_point_sale', 'id_producer', 'date_begin'], 'required', 'message' => 'Champs obligatoire'], | ||||
$subscriptionProduct->save(); | $subscriptionProduct->save(); | ||||
} | } | ||||
} | } | ||||
if(!$this->id) { | |||||
$this->id = $subscription->id ; | |||||
} | |||||
} | } | ||||
return true; | return true; | ||||
} | } |
<?php | |||||
use yii\db\Migration; | |||||
class m190109_080828_add_field_subscription_order extends Migration { | |||||
public function up() { | |||||
$this->addColumn('order', 'id_subscription', Schema::TYPE_INTEGER) ; | |||||
} | |||||
public function down() { | |||||
$this->dropColumn('order', 'id_subscription') ; | |||||
} | |||||
} |