@@ -133,7 +133,15 @@ class SubscriptionController extends BackendController | |||
&& $model->save()) | |||
{ | |||
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', [ | |||
@@ -197,7 +205,15 @@ class SubscriptionController extends BackendController | |||
} | |||
if ($model->save()) { | |||
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']); | |||
} | |||
} | |||
} | |||
@@ -220,4 +236,28 @@ class SubscriptionController extends BackendController | |||
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 | |||
]) ; | |||
} | |||
} |
@@ -0,0 +1,69 @@ | |||
<?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']) ?> |
@@ -53,6 +53,7 @@ use common\components\ActiveRecordCommon ; | |||
* @property integer $id_point_sale | |||
* @property integer $id_distribution | |||
* @property boolean $auto_payment | |||
* @property integer $id_subscription | |||
*/ | |||
class Order extends ActiveRecordCommon | |||
{ | |||
@@ -92,7 +93,7 @@ class Order extends ActiveRecordCommon | |||
{ | |||
return [ | |||
[['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'], | |||
[['date', 'date_update', 'comment', 'comment_point_sale'], 'safe'] | |||
]; | |||
@@ -110,6 +111,7 @@ class Order extends ActiveRecordCommon | |||
'date_update' => 'Date de modification', | |||
'id_point_sale' => 'Point de vente', | |||
'id_distribution' => 'Date de distribution', | |||
'id_subscription' => 'Abonnement', | |||
]; | |||
} | |||
@@ -144,6 +146,12 @@ class Order extends ActiveRecordCommon | |||
{ | |||
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. |
@@ -188,6 +188,7 @@ class Subscription extends ActiveRecordCommon | |||
$order->origin = Order::ORIGIN_AUTO; | |||
$order->id_point_sale = $this->id_point_sale; | |||
$order->id_distribution = $distribution->id; | |||
$order->id_subscription = $this->id; | |||
$order->auto_payment = $this->auto_payment ; | |||
$userPointSale = UserPointSale::searchOne([ | |||
@@ -296,4 +297,85 @@ class Subscription extends ActiveRecordCommon | |||
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() ; | |||
} | |||
} | |||
} | |||
} |
@@ -73,7 +73,7 @@ class SubscriptionForm extends Model | |||
public function rules() | |||
{ | |||
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'], | |||
[['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'auto_payment'], 'boolean'], | |||
[['id_point_sale', 'id_producer', 'date_begin'], 'required', 'message' => 'Champs obligatoire'], | |||
@@ -164,6 +164,10 @@ class SubscriptionForm extends Model | |||
$subscriptionProduct->save(); | |||
} | |||
} | |||
if(!$this->id) { | |||
$this->id = $subscription->id ; | |||
} | |||
} | |||
return true; | |||
} |
@@ -0,0 +1,14 @@ | |||
<?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') ; | |||
} | |||
} |