</div> | </div> | ||||
<div class="panel panel-default"> | |||||
<div class="panel-heading"> | |||||
<h3 class="panel-title">Abonnements</h3> | |||||
</div> | |||||
<div class="panel-body"> | |||||
<?= $form->field($model, 'user_manage_subscription') | |||||
->dropDownList([ | |||||
0 => 'Non', | |||||
1 => 'Oui', | |||||
], []) ; ?> | |||||
</div> | |||||
</div> | |||||
<div class="panel panel-default"> | <div class="panel panel-default"> | ||||
<div class="panel-heading"> | <div class="panel-heading"> | ||||
<h3 class="panel-title">Crédit / paiement en ligne</h3> | <h3 class="panel-title">Crédit / paiement en ligne</h3> |
if (isset($options['attribute_id_producer']) && strlen($options['attribute_id_producer']) | if (isset($options['attribute_id_producer']) && strlen($options['attribute_id_producer']) | ||||
&& !isset($params[$options['attribute_id_producer']]) && !Yii::$app->user->isGuest) | && !isset($params[$options['attribute_id_producer']]) && !Yii::$app->user->isGuest) | ||||
{ | { | ||||
if(Yii::$app->controller->module->id == 'app-producer') { | |||||
$params[$options['attribute_id_producer']] = Yii::$app->controller->getProducer()->id ; | |||||
} | |||||
else { | |||||
$params[$options['attribute_id_producer']] = Producer::getId() ; | |||||
} | |||||
$params[$options['attribute_id_producer']] = Producer::getId() ; | |||||
} | } | ||||
if(!isset($options['type_search'])) { | if(!isset($options['type_search'])) { |
} | } | ||||
} | } | ||||
else { | else { | ||||
$html .= '<span class="label label-default">À régler sur place</span>'; | |||||
$html .= '<span class="label label-default">Non réglé</span>'; | |||||
} | } | ||||
return $html; | return $html; |
} | } | ||||
return $str ; | return $str ; | ||||
} | } | ||||
} | } |
} | } | ||||
}], | }], | ||||
[['description', 'order_infos','slug','secret_key_payplug'], 'string'], | [['description', 'order_infos','slug','secret_key_payplug'], 'string'], | ||||
[['negative_balance', 'credit', 'active','online_payment'], 'boolean'], | |||||
[['negative_balance', 'credit', 'active','online_payment','user_manage_subscription'], 'boolean'], | |||||
[['name', 'siret', 'logo', 'photo', 'postcode', 'city', 'code','type'], 'string', 'max' => 255], | [['name', 'siret', 'logo', 'photo', 'postcode', 'city', 'code','type'], 'string', 'max' => 255], | ||||
[['free_price', 'credit_limit_reminder'], 'double'], | [['free_price', 'credit_limit_reminder'], 'double'], | ||||
['free_price', 'compare', 'compareValue' => 0, 'operator' => '>=', 'type' => 'number', 'message' => 'Prix libre doit être supérieur ou égal à 0'], | ['free_price', 'compare', 'compareValue' => 0, 'operator' => '>=', 'type' => 'number', 'message' => 'Prix libre doit être supérieur ou égal à 0'], | ||||
'type' => 'Type de producteur', | 'type' => 'Type de producteur', | ||||
'credit_limit_reminder' => 'Seuil de crédit limite avant relance', | 'credit_limit_reminder' => 'Seuil de crédit limite avant relance', | ||||
'online_payment' => 'Activer le paiement en ligne', | 'online_payment' => 'Activer le paiement en ligne', | ||||
'secret_key_payplug' => 'Clé secrète Payplug' | |||||
'secret_key_payplug' => 'Clé secrète Payplug', | |||||
'user_manage_subscription' => 'Autoriser les utilisateurs à gérer leurs abonnements' | |||||
]; | ]; | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Retourne le producteur courant (le producteur auquel l'utilisateur | |||||
* connecté est rattaché). | |||||
* Retourne l'ID du producteur courant. | |||||
* | * | ||||
* @return integer|boolean | * @return integer|boolean | ||||
*/ | */ | ||||
public static function getId() | public static function getId() | ||||
{ | |||||
if(!Yii::$app->user->isGuest) { | |||||
return Yii::$app->user->identity->id_producer ; | |||||
{ | |||||
if(Yii::$app->controller->module->id == 'app-backend') { | |||||
if(!Yii::$app->user->isGuest) { | |||||
return Yii::$app->user->identity->id_producer ; | |||||
} | |||||
} | |||||
else { | |||||
return Yii::$app->controller->getProducer()->id ; ; | |||||
} | } | ||||
return false ; | return false ; |
$arrSubscriptions = []; | $arrSubscriptions = []; | ||||
foreach ($subscriptions as $s) { | foreach ($subscriptions as $s) { | ||||
// vérif dates | |||||
if ($date >= $s->date_begin && | if ($date >= $s->date_begin && | ||||
(!$s->date_end || $date <= $s->date_end)) | |||||
{ | |||||
// périodicite | |||||
$nbDays = (strtotime($date) - strtotime($s->date_begin)) / (24 * 60 * 60); | |||||
if ($nbDays % ($s->week_frequency * 7) < 7) { | |||||
// jour de la semaine | |||||
$day = date('N', strtotime($date)); | |||||
switch ($day) { | |||||
case 1 : $day = 'monday'; | |||||
break; | |||||
case 2 : $day = 'tuesday'; | |||||
break; | |||||
case 3 : $day = 'wednesday'; | |||||
break; | |||||
case 4 : $day = 'thursday'; | |||||
break; | |||||
case 5 : $day = 'friday'; | |||||
break; | |||||
case 6 : $day = 'saturday'; | |||||
break; | |||||
case 7 : $day = 'sunday'; | |||||
break; | |||||
} | |||||
if ($s->$day) { | |||||
$arrSubscriptions[] = $s; | |||||
} | |||||
} | |||||
(!$s->date_end || $date <= $s->date_end) && | |||||
$s->matchWith($date)) | |||||
{ | |||||
$arrSubscriptions[] = $s; | |||||
} | } | ||||
} | } | ||||
return $arrSubscriptions; | 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 ($nbDays % ($this->week_frequency * 7) < 7) { | |||||
$numDay = date('N', strtotime($date)); | |||||
$day = $arrayDays[$numDay] ; | |||||
if ($this->$day) { | |||||
return true ; | |||||
} | |||||
} | |||||
return false ; | |||||
} | |||||
/** | /** | ||||
* Recherche les distributions futures où l'abonnement peut s'appliquer. | * Recherche les distributions futures où l'abonnement peut s'appliquer. | ||||
* | * | ||||
* @return array | * @return array | ||||
*/ | */ | ||||
public function searchMatchedIncomingDistributions() | public function searchMatchedIncomingDistributions() | ||||
{ | |||||
{ | |||||
$producer = Producer::getCurrent() ; | |||||
$params = [ | $params = [ | ||||
':date_today' => date('Y-m-d'), | |||||
':date_earliest_order' => $producer->getEarliestDateOrder(), | |||||
':date_begin' => date('Y-m-d', strtotime($this->date_begin)), | ':date_begin' => date('Y-m-d', strtotime($this->date_begin)), | ||||
':id_producer' => Producer::getId() | ':id_producer' => Producer::getId() | ||||
] ; | ] ; | ||||
$incomingDistributions = Distribution::find() | $incomingDistributions = Distribution::find() | ||||
->where('id_producer = :id_producer') | ->where('id_producer = :id_producer') | ||||
->andWhere('date >= :date_begin') | ->andWhere('date >= :date_begin') | ||||
->andWhere('date >= :date_today') ; | |||||
->andWhere('date >= :date_earliest_order') ; | |||||
if($this->date_end) { | if($this->date_end) { | ||||
$incomingDistributions->andWhere('date < :date_end') ; | $incomingDistributions->andWhere('date < :date_end') ; | ||||
$incomingDistributionsArray = $incomingDistributions->all() ; | $incomingDistributionsArray = $incomingDistributions->all() ; | ||||
$matchedIncomingDistributionsArray = [] ; | $matchedIncomingDistributionsArray = [] ; | ||||
$arrayDays = [ | |||||
1 => 'monday', | |||||
2 => 'tuesday', | |||||
3 => 'wednesday', | |||||
4 => 'thursday', | |||||
5 => 'friday', | |||||
6 => 'saturday', | |||||
7 => 'sunday' | |||||
] ; | |||||
foreach($incomingDistributionsArray as $incomingDistribution) { | foreach($incomingDistributionsArray as $incomingDistribution) { | ||||
$numDay = date('N', strtotime($incomingDistribution->date)) ; | |||||
$day = $arrayDays[$numDay] ; | |||||
if($this->$day) { | |||||
if($this->matchWith($incomingDistribution->date)) { | |||||
$matchedIncomingDistributionsArray[] = $incomingDistribution ; | $matchedIncomingDistributionsArray[] = $incomingDistribution ; | ||||
} | } | ||||
} | } | ||||
return $matchedIncomingDistributionsArray ; | return $matchedIncomingDistributionsArray ; | ||||
} | |||||
} | |||||
public function deleteOrdersIncomingDistributions() | public function deleteOrdersIncomingDistributions() | ||||
{ | { | ||||
->andWhere('order.id_subscription = :id_subscription') ; | ->andWhere('order.id_subscription = :id_subscription') ; | ||||
if($this->date_end) { | if($this->date_end) { | ||||
$orders->andWhere('distribution.date =< :date_end') ; | |||||
$orders->andWhere('distribution.date <= :date_end') ; | |||||
$params[':date_end'] = $this->date_end ; | $params[':date_end'] = $this->date_end ; | ||||
} | } | ||||
if($ordersArray && count($ordersArray)) { | if($ordersArray && count($ordersArray)) { | ||||
foreach($ordersArray as $order) { | foreach($ordersArray as $order) { | ||||
ProductOrder::deleteAll(['id_order' => $order->id]) ; | |||||
$order->delete() ; | $order->delete() ; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
public function updateIncomingDistributions($update = false) | |||||
{ | |||||
$matchedDistributionsArray = $this->searchMatchedIncomingDistributions() ; | |||||
if($update) { | |||||
$this->deleteOrdersIncomingDistributions() ; | |||||
} | |||||
if(count($matchedDistributionsArray)) { | |||||
foreach($matchedDistributionsArray as $distribution) { | |||||
$this->add($distribution->date) ; | |||||
} | |||||
} | |||||
} | |||||
} | } |
if(!$this->id) { | if(!$this->id) { | ||||
$this->id = $subscription->id ; | $this->id = $subscription->id ; | ||||
} | } | ||||
} | } | ||||
return true; | return true; | ||||
} | } |
->where(['subscription.id_producer' => Producer::getId()]) | ->where(['subscription.id_producer' => Producer::getId()]) | ||||
; | ; | ||||
$dataProvider = new ActiveDataProvider([ | |||||
$dataProvider = new \yii\data\ActiveDataProvider([ | |||||
'query' => $query, | 'query' => $query, | ||||
'sort' => ['attributes' => ['username']], | 'sort' => ['attributes' => ['username']], | ||||
'pagination' => [ | 'pagination' => [ | ||||
return $dataProvider; | return $dataProvider; | ||||
} | } | ||||
if(isset($this->id_user) && is_numeric($this->id_user)) { | |||||
$query->andWhere([ | |||||
'subscription.id_user' => $this->id_user | |||||
]) ; | |||||
} | |||||
if(isset($this->id_point_sale) && is_numeric($this->id_point_sale)) { | if(isset($this->id_point_sale) && is_numeric($this->id_point_sale)) { | ||||
$query->andWhere([ | $query->andWhere([ | ||||
'subscription.id_point_sale' => $this->id_point_sale | 'subscription.id_point_sale' => $this->id_point_sale |
<?php | |||||
use yii\db\Migration; | |||||
use yii\db\mysql\Schema; | |||||
class m190121_101211_ajout_config_option_gestion_abonnement_par_l_utilisateur extends Migration { | |||||
public function up() { | |||||
$this->addColumn('producer', 'user_manage_subscription', Schema::TYPE_BOOLEAN) ; | |||||
} | |||||
public function down() { | |||||
$this->dropColumn('producer', 'user_manage_subscription') ; | |||||
} | |||||
} |
<?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. | |||||
*/ | |||||
namespace producer\assets; | |||||
use yii\web\AssetBundle; | |||||
use yii ; | |||||
/** | |||||
* @author Qiang Xue <qiang.xue@gmail.com> | |||||
* @since 2.0 | |||||
*/ | |||||
class VuejsSubscriptionFormAsset extends \common\components\MyAssetBundle | |||||
{ | |||||
public $basePath = '@webroot'; | |||||
public $baseUrl = '@web'; | |||||
public $css = []; | |||||
public $js = []; | |||||
public $depends = [ | |||||
'common\assets\CommonAsset' | |||||
]; | |||||
public function __construct() | |||||
{ | |||||
parent::__construct() ; | |||||
$this->addAsset('js','js/vuejs/subscription-form.js') ; | |||||
} | |||||
} |
->joinWith('distribution', 'distribution.producer') | ->joinWith('distribution', 'distribution.producer') | ||||
->where([ | ->where([ | ||||
'id_user' => Yii::$app->user->id, | 'id_user' => Yii::$app->user->id, | ||||
'distribution.id_producer' => $this->getProducer()->id | |||||
'distribution.id_producer' => Producer::getId() | |||||
]) | ]) | ||||
->orderBy('distribution.date DESC'), | ->orderBy('distribution.date DESC'), | ||||
'pagination' => [ | 'pagination' => [ | ||||
':date' => $dateMini | ':date' => $dateMini | ||||
] | ] | ||||
]); | ]); | ||||
foreach($ordersUserArray as &$order) { | |||||
$order = array_merge($order->getAttributes(), [ | |||||
'amount_total' => $order->getAmount(Order::AMOUNT_TOTAL), | |||||
'date_distribution' => $order->distribution->date, | |||||
'pointSale' => $order->pointSale->getAttributes() | |||||
]) ; | |||||
if(is_array($ordersUserArray) && count($ordersUserArray)) { | |||||
foreach($ordersUserArray as &$order) { | |||||
$order = array_merge($order->getAttributes(), [ | |||||
'amount_total' => $order->getAmount(Order::AMOUNT_TOTAL), | |||||
'date_distribution' => $order->distribution->date, | |||||
'pointSale' => $order->pointSale->getAttributes() | |||||
]) ; | |||||
} | |||||
$json['orders'] = $ordersUserArray; | |||||
} | } | ||||
$json['orders'] = $ordersUserArray; | |||||
// User | // User | ||||
$userProducer = UserProducer::searchOne([ | $userProducer = UserProducer::searchOne([ | ||||
], | ], | ||||
'userPointSale' => ($pointSale->userPointSale ? $pointSale->userPointSale[0] : '') | 'userPointSale' => ($pointSale->userPointSale ? $pointSale->userPointSale[0] : '') | ||||
]) ; | ]) ; | ||||
if($pointSale['code'] && strlen($pointSale['code'])) { | |||||
$pointSale['code'] = '***' ; | |||||
} | |||||
} | } | ||||
$json['points_sale'] = $pointsSaleArray; | $json['points_sale'] = $pointsSaleArray; |
<?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. | |||||
*/ | |||||
/** | |||||
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. | |||||
*/ | |||||
namespace producer\controllers; | |||||
use common\models\SubscriptionForm ; | |||||
use common\models\SubscriptionSearch ; | |||||
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 = Producer::getId(); | |||||
$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é'); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* 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); | |||||
} | |||||
// 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 | |||||
]); | |||||
} | |||||
/** | |||||
* 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) { | |||||
// Quantités produit de l'abonnement | |||||
$productQuantitiesArray = [] ; | |||||
$arrayProductsSubscription = ProductSubscription::searchAll([ | |||||
'id_subscription' => $idSubscription | |||||
]) ; | |||||
if(count($arrayProductsSubscription)) { | |||||
foreach ($arrayProductsSubscription as $productSubscription) { | |||||
$productQuantitiesArray[$productSubscription->id_product] = $productSubscription->quantity; | |||||
} | |||||
} | |||||
} | |||||
// Produits | |||||
$productsArray = Product::searchAll() ; | |||||
$indexProduct = 0 ; | |||||
foreach($productsArray as &$product) { | |||||
$quantity = 0 ; | |||||
if(isset($productQuantitiesArray) && count($productQuantitiesArray) && isset($productQuantitiesArray[$product->id])) { | |||||
$quantity = $productQuantitiesArray[$product->id] ; | |||||
} | |||||
$product = array_merge( | |||||
$product->getAttributes(), | |||||
[ | |||||
'index' => $indexProduct ++, | |||||
'quantity_form' => $quantity | |||||
] | |||||
) ; | |||||
} | |||||
$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 ; | |||||
} | |||||
/** | |||||
* 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; | |||||
} | |||||
} |
$this->setTitle('Crédit : <span id="credit-user">'.number_format($creditUser, 2).' €</span>'); | $this->setTitle('Crédit : <span id="credit-user">'.number_format($creditUser, 2).' €</span>'); | ||||
$this->setPageTitle('Crédit'); | $this->setPageTitle('Crédit'); | ||||
?> | |||||
if($this->context->getProducer()->online_payment) { | |||||
$this->addButton(['label' => '<span class="glyphicon glyphicon-credit-card"></span> Créditer mon compte', 'url' => 'credit/add', 'class' => 'btn btn-primary']) ; | |||||
} | |||||
<?php if($this->context->getProducer()->online_payment): ?> | |||||
<?= Html::a('<span class="glyphicon glyphicon-credit-card"></span> Créditer mon compte', ['credit/add'], ['class' => 'btn btn-primary']); ?><br /><br /> | |||||
<?php endif; ?> | |||||
?> | |||||
<?= GridView::widget([ | <?= GridView::widget([ | ||||
// 'filterModel' => $searchModel, | // 'filterModel' => $searchModel, |
use yii\widgets\Breadcrumbs; | use yii\widgets\Breadcrumbs; | ||||
use common\widgets\Alert; | use common\widgets\Alert; | ||||
use common\helpers\Url; | use common\helpers\Url; | ||||
use common\models\Producer; | |||||
\common\assets\CommonAsset::register($this); | \common\assets\CommonAsset::register($this); | ||||
\producer\assets\AppAsset::register($this); | \producer\assets\AppAsset::register($this); | ||||
'active' => $this->getControllerAction() == 'order/order', | 'active' => $this->getControllerAction() == 'order/order', | ||||
], | ], | ||||
[ | [ | ||||
'label' => '<span class="glyphicon glyphicon-folder-open"></span> Historique', | |||||
'label' => '<span class="glyphicon glyphicon-folder-open"></span> Mes commandes', | |||||
'url' => Yii::$app->urlManager->createUrl(['order/history']), | 'url' => Yii::$app->urlManager->createUrl(['order/history']), | ||||
'visible' => !Yii::$app->user->isGuest, | 'visible' => !Yii::$app->user->isGuest, | ||||
'active' => $this->getControllerAction() == 'order/history', | 'active' => $this->getControllerAction() == 'order/history', | ||||
], | ], | ||||
[ | |||||
'label' => '<span class="glyphicon glyphicon-repeat"></span> Abonnement', | |||||
'url' => Yii::$app->urlManager->createUrl(['subscription/index']), | |||||
'visible' => !Yii::$app->user->isGuest && $producer->user_manage_subscription, | |||||
'active' => $this->getControllerAction() == 'subscription/index', | |||||
], | |||||
[ | [ | ||||
'label' => '<span class="glyphicon glyphicon-euro"></span> Crédit', | 'label' => '<span class="glyphicon glyphicon-euro"></span> Crédit', | ||||
'url' => Yii::$app->urlManager->createUrl(['credit/history']), | 'url' => Yii::$app->urlManager->createUrl(['credit/history']), | ||||
'visible' => !Yii::$app->user->isGuest && Producer::getConfig('credit'), | |||||
'visible' => !Yii::$app->user->isGuest && $producer->credit, | |||||
'active' => $this->getControllerAction() == 'credit/history', | 'active' => $this->getControllerAction() == 'credit/history', | ||||
], | ], | ||||
[ | [ | ||||
</nav> | </nav> | ||||
<?php if(strlen($this->getTitle())): ?> | <?php if(strlen($this->getTitle())): ?> | ||||
<h2 id="page-title"><?= $this->getTitle(); ?></h2> | |||||
<h2 id="page-title"> | |||||
<?= $this->getTitle(); ?> | |||||
<?php | |||||
if(count($this->buttons)): ?> | |||||
<span id="buttons"> | |||||
<?php foreach($this->buttons as $button) { | |||||
echo '<a href="'.Yii::$app->urlManagerProducer->createUrl($button['url']).'" class="'.$button['class'].'">'.$button['label'].'</a>' ; | |||||
} | |||||
?> | |||||
</span> | |||||
<?php endif; ?> | |||||
</h2> | |||||
<?php endif; ?> | <?php endif; ?> | ||||
<section id="content"> | <section id="content"> | ||||
<?= Yii::$app->session->getFlash('success') ?> | <?= Yii::$app->session->getFlash('success') ?> | ||||
</div> | </div> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
<?= $content ?> | <?= $content ?> | ||||
</section> | </section> | ||||
</div> | </div> |
use yii\bootstrap\ActiveForm; | use yii\bootstrap\ActiveForm; | ||||
use common\models\Order ; | use common\models\Order ; | ||||
$this->setTitle('Historique de mes commandes') ; | |||||
$this->setTitle('Mes commandes') ; | |||||
?> | ?> | ||||
<?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; | |||||
use yii\widgets\ActiveForm; | |||||
use yii\helpers\ArrayHelper ; | |||||
use common\models\User ; | |||||
use common\models\PointSale ; | |||||
\producer\assets\VuejsSubscriptionFormAsset::register($this) ; | |||||
?> | |||||
<div class="subscription-form" id="app-subscription-form"> | |||||
<form @submit.prevent="formSubmit()" v-show="loading == false"> | |||||
<input type="hidden" id="subscription-id" value="<?= $idSubscription; ?>" /> | |||||
<div class="alert alert-danger" v-if="errors.length"> | |||||
<ul> | |||||
<li v-for="error in errors"> | |||||
{{ error }} | |||||
</li> | |||||
</ul> | |||||
</div> | |||||
<div class="points-sale"> | |||||
<h3><span>Point de vente</span></h3> | |||||
<table class="table table-bordered table-hovered" v-if="pointsSale.length"> | |||||
<thead> | |||||
<tr> | |||||
<th>Nom</th> | |||||
<th>Localité</th> | |||||
<th></th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr v-for="pointSale in pointsSale" v-if="pointSale" :class="(pointSaleActive && pointSale.id == pointSaleActive.id) ? 'selected' : ''"> | |||||
<td class="name"> | |||||
<span class="the-name">{{ pointSale.name }}</span> | |||||
<div class="comment" v-if="pointSale.userPointSale"> | |||||
{{ pointSale.userPointSale.comment }} | |||||
</div> | |||||
</td> | |||||
<td class="locality">{{ pointSale.locality }}</td> | |||||
<td class="actions"> | |||||
<div :class="'form-group' + (pointSale.invalid_code ? ' has-error' : '')"> | |||||
<div class="input-group" v-if="pointSale.code && pointSale.code.length > 0"> | |||||
<span class="input-group-addon"><span class="glyphicon glyphicon-lock"></span></span> | |||||
<input v-model="pointsSaleCodes[pointSale.id]" type="password" placeholder="Code" class="form-control input-code" /> | |||||
</div> | |||||
</div> | |||||
<button class="btn btn-primary" @click.prevent="pointSaleClick" :data-code="pointSale.code && pointSale.code.length > 0" :data-id-point-sale="pointSale.id"> | |||||
<span class="glyphicon glyphicon-map-marker"></span> | |||||
Choisir | |||||
</button> | |||||
</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
</div> | |||||
<h3 id="step-date"><span>Dates</span></h3> | |||||
<div class="col-md-4"> | |||||
<div class="form-group"> | |||||
<label>Date de début</label> | |||||
<v-date-picker | |||||
mode="single" | |||||
v-model="dateBegin" | |||||
:input-props='{class: "form-control", placeholder: "" }'> | |||||
</v-date-picker> | |||||
</div> | |||||
</div> | |||||
<div class="clr"></div> | |||||
<div class="col-md-4"> | |||||
<div class="form-group"> | |||||
<label>Date de fin</label> | |||||
<v-date-picker | |||||
mode="single" | |||||
v-model="dateEnd" | |||||
:min-date="dateBegin" | |||||
:input-props='{class: "form-control", placeholder: ""}'> | |||||
</v-date-picker> | |||||
<div class="hint-block">Laisser vide pour une durée indéterminée</div> | |||||
</div> | |||||
</div> | |||||
<div class="clr"></div> | |||||
<div class="col-md-4"> | |||||
<label for="subscriptionform-week_frequency">Périodicité</label> | |||||
<select id="subscriptionform-week_frequency" class="form-control" v-model="weekFrequency"> | |||||
<option value="1">Toutes les semaines</option> | |||||
<option value="2">Toutes les 2 semaines</option> | |||||
<option value="3">Toutes les 3 semaines</option> | |||||
<option value="4">Tous les mois</option> | |||||
</select> | |||||
</div> | |||||
<div class="clr"></div> | |||||
<h3><span>Paiement</span></h3> | |||||
<?php if(Producer::getConfig('credit')): ?> | |||||
<div class="form-group field-subscriptionform-auto_payment"> | |||||
<label><input type="checkbox" id="subscriptionform-auto_payment" name="SubscriptionForm[auto_payment]" v-model="autoPayment"> Paiement automatique</label> | |||||
<div class="hint-block">Cochez cette case si vous souhaitez que votre Crédit soit automatiquement débité.</div> | |||||
<div class="help-block"></div> | |||||
</div> | |||||
<?php endif; ?> | |||||
<div class="days" v-if="pointSaleActive"> | |||||
<h3 id="step-days"><span>Jours</span></h3> | |||||
<div v-if="pointSaleActive.delivery_monday == true"> | |||||
<div class="form-group field-subscriptionform-monday"> | |||||
<label><input type="checkbox" id="subscriptionform-monday" v-model="monday" @change="dayChange"> Lundi</label> | |||||
</div> | |||||
</div> | |||||
<div v-if="pointSaleActive.delivery_tuesday == true"> | |||||
<div class="form-group field-subscriptionform-monday"> | |||||
<label><input type="checkbox" id="subscriptionform-tuesday" v-model="tuesday" @change="dayChange"> Mardi</label> | |||||
</div> | |||||
</div> | |||||
<div v-if="pointSaleActive.delivery_wednesday == true"> | |||||
<div class="form-group field-subscriptionform-wednesday"> | |||||
<label><input type="checkbox" id="subscriptionform-wednesday" v-model="wednesday" @change="dayChange"> Mercredi</label> | |||||
</div> | |||||
</div> | |||||
<div v-if="pointSaleActive.delivery_thursday == true"> | |||||
<div class="form-group field-subscriptionform-thursday"> | |||||
<label><input type="checkbox" id="subscriptionform-thursday" v-model="thursday" @change="dayChange"> Jeudi</label> | |||||
</div> | |||||
</div> | |||||
<div v-if="pointSaleActive.delivery_friday == true"> | |||||
<div class="form-group field-subscriptionform-friday"> | |||||
<label><input type="checkbox" id="subscriptionform-friday" v-model="friday" @change="dayChange"> Vendredi</label> | |||||
</div> | |||||
</div> | |||||
<div v-if="pointSaleActive.delivery_saturday == true"> | |||||
<div class="form-group field-subscriptionform-saturday"> | |||||
<label><input type="checkbox" id="subscriptionform-saturday" v-model="saturday" @change="dayChange"> Samedi</label> | |||||
</div> | |||||
</div> | |||||
<div v-if="pointSaleActive.delivery_sunday == true"> | |||||
<div class="form-group field-subscriptionform-sunday"> | |||||
<label><input type="checkbox" id="subscriptionform-sunday" v-model="sunday" @change="dayChange"> Dimanche</label> | |||||
</div> | |||||
</div> | |||||
<div class="alert alert-warning" v-if="!pointSaleActive.delivery_monday && !pointSaleActive.delivery_tuesday && !pointSaleActive.delivery_wednesday && !pointSaleActive.delivery_thursday && !pointSaleActive.delivery_friday && !pointSaleActive.delivery_saturday && !pointSaleActive.delivery_sunday"> | |||||
Aucun jour de distribution disponible pour ce point de vente. | |||||
</div> | |||||
</div> | |||||
<div class="clr"></div> | |||||
<div class="products" v-if="(monday || tuesday || wednesday || thursday || friday || saturday || sunday) && checkOneProductAvailable()"> | |||||
<h3><span>Produits</span></h3> | |||||
<?php if(isset($model->errors['products']) && count($model->errors['products'])) | |||||
{ | |||||
echo '<div class="alert alert-danger">'.$model->errors['products'][0].'</div>' ; | |||||
} | |||||
?> | |||||
<table :class="'table table-bordered table-condensed table-hover' + (monday ? ' monday-active' : '') + (tuesday ? ' tuesday-active' : '') + (wednesday ? ' wednesday-active' : '') + (thursday ? ' thursday-active' : '') + (friday ? ' friday-active' : '') + (saturday ? ' saturday-active' : '') + (sunday ? ' sunday-active' : '')"> | |||||
<thead> | |||||
<tr> | |||||
<th>Nom</th> | |||||
<th>Prix unitaire</th> | |||||
<th>Quantité</th> | |||||
<th>Total</th> | |||||
</tr> | |||||
</thead> | |||||
<tbody> | |||||
<tr v-for="product in products" v-if="checkProductAvailable(product)"> | |||||
<td> | |||||
<span class="name">{{ product.name }}</span> | |||||
<span class="other"> | |||||
<span v-if="product.description.length">/</span> | |||||
<span class="description">{{ product.description }}</span> | |||||
<span v-if="product.weight">({{ product.weight }}g)</span> | |||||
</span> | |||||
<div class="recipe" v-if="product.recipe.length">{{ product.recipe }}</div> | |||||
</td> | |||||
<td class="price-unit"> | |||||
{{ formatPrice(product.price) }} | |||||
</td> | |||||
<td class="quantity"> | |||||
<div class="input-group"> | |||||
<span class="input-group-btn"> | |||||
<button class="btn btn-default" type="button" @click="productQuantityClick(product, -1)"><span class="glyphicon glyphicon-minus"></span></button> | |||||
</span> | |||||
<input type="text" v-model="product.quantity_form" :class="'form-control '+((product.quantity_form > 0) ? 'has-quantity' : '')"> | |||||
<span class="input-group-btn"> | |||||
<button class="btn btn-default" type="button" @click="productQuantityClick(product, 1)"><span class="glyphicon glyphicon-plus"></span></button> | |||||
</span> | |||||
</div> | |||||
</td> | |||||
<td class="price-total"> | |||||
{{ formatPrice(product.price * product.quantity_form) }} | |||||
</td> | |||||
</tr> | |||||
<tr class="total"> | |||||
<td colspan="3"></td> | |||||
<td class="price-total">{{ priceTotal(true) }}</td> | |||||
</tr> | |||||
</tbody> | |||||
</table> | |||||
<div v-if="!checkOneProductAvailable()" class="alert alert-warning"> | |||||
Aucun produit n'est disponible pour les jours de distribution sélectionnés. | |||||
</div> | |||||
</div> | |||||
<button class="btn btn-primary" disabled="disabled" v-if="disableSubmitButton">Enregistrer</button> | |||||
<button class="btn btn-primary" v-else>Enregistrer</button> | |||||
</form> | |||||
</div> |
<?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; | |||||
if($idSubscription > 0) { | |||||
$this->setTitle('Modifier un abonnement') ; | |||||
} | |||||
else { | |||||
$this->setTitle('Ajouter un abonnement') ; | |||||
} | |||||
?> | |||||
<div class="subscription-create"> | |||||
<?= $this->render('_form', [ | |||||
'idSubscription' => $idSubscription | |||||
]) ?> | |||||
</div> |
<?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; | |||||
use yii\grid\GridView; | |||||
$this->setTitle('Abonnements') ; | |||||
$this->addButton(['label' => '+ Ajouter', 'url' => 'subscription/form', 'class' => 'btn btn-primary']) ; | |||||
$columns = [ | |||||
[ | |||||
'attribute' => 'product_name', | |||||
'label' => 'Produits', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
$html = '' ; | |||||
foreach($model->productSubscription as $productSubscription) | |||||
{ | |||||
if(isset($productSubscription->product)) { | |||||
$html .= $productSubscription->quantity . ' x '.Html::encode($productSubscription->product->name).'<br />' ; | |||||
} | |||||
else { | |||||
$html .= 'Produit non défini<br />' ; | |||||
} | |||||
} | |||||
// aucun produit | |||||
if(!count($model->productSubscription)) | |||||
{ | |||||
$html .= '<span class="glyphicon glyphicon-warning-sign"></span> Aucun produit' ; | |||||
} | |||||
return $html ; | |||||
} | |||||
], | |||||
[ | |||||
'label' => 'Point de vente', | |||||
'format' => 'raw', | |||||
'filter' => ArrayHelper::map(PointSale::find()->where(['id_producer' => Producer::getId()])->asArray()->all(), 'id', 'name'), | |||||
'value' => function($model) { | |||||
return Html::encode($model->pointSale->name) ; | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'date_begin', | |||||
'label' => 'Date de début', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
$html = date('d/m/Y',strtotime($model->date_begin)) ; | |||||
return $html ; | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'day', | |||||
'label' => 'Jours', | |||||
'format' => 'raw', | |||||
'filter' => [ | |||||
'monday' => 'Lundi', | |||||
'tuesday' => 'Mardi', | |||||
'wednesday' => 'Mercredi', | |||||
'thursday' => 'Jeudi', | |||||
'friday' => 'Vendredi', | |||||
'saterday' => 'Samedi', | |||||
'sunday' => 'Dimanche', | |||||
], | |||||
'contentOptions' => ['class' => 'text-small'], | |||||
'value' => function($model) { | |||||
$html = '' ; | |||||
if($model->monday) { | |||||
$html .= 'lundi, ' ; | |||||
} | |||||
if($model->tuesday) { | |||||
$html .= 'mardi, ' ; | |||||
} | |||||
if($model->wednesday) { | |||||
$html .= 'mercredi, ' ; | |||||
} | |||||
if($model->thursday) { | |||||
$html .= 'jeudi, ' ; | |||||
} | |||||
if($model->friday) { | |||||
$html .= 'vendredi, ' ; | |||||
} | |||||
if($model->saturday) { | |||||
$html .= 'samedi, ' ; | |||||
} | |||||
if($model->sunday) { | |||||
$html .= 'dimanche, ' ; | |||||
} | |||||
if(strlen($html)) { | |||||
return substr ($html, 0, strlen($html) - 2) ; | |||||
} | |||||
else { | |||||
return '<span class="glyphicon glyphicon-warning-sign"></span> Aucun jour' ; | |||||
} | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'week_frequency', | |||||
'filter' => [ | |||||
1 => 'Toutes les semaines', | |||||
2 => 'Toutes les 2 semaines', | |||||
3 => 'Toutes les 3 semaines', | |||||
4 => 'Tous les mois'], | |||||
'value' => function($model) { | |||||
if($model->week_frequency == 1) { | |||||
return 'Toutes les semaines' ; | |||||
} | |||||
else { | |||||
return 'Toutes les '.$model->week_frequency.' semaines' ; | |||||
} | |||||
} | |||||
], | |||||
] ; | |||||
if(Producer::getConfig('credit')) { | |||||
$columns[] = [ | |||||
'format' => 'raw', | |||||
'label' => 'Paiement automatique', | |||||
'headerOptions' => ['class' => 'column-auto-payment'], | |||||
'contentOptions' => ['class' => 'column-auto-payment'], | |||||
'filter' => [0 => 'Non', 1 => 'Oui'], | |||||
'value' => function($model) { | |||||
if($model->auto_payment) { | |||||
return '<span class="label label-success">Oui</span>' ; | |||||
} | |||||
else { | |||||
return '<span class="label label-danger">Non</span>' ; | |||||
} | |||||
} | |||||
] ; | |||||
} | |||||
$columns[] = [ | |||||
'class' => 'yii\grid\ActionColumn', | |||||
'template' => '{form} {delete}', | |||||
'headerOptions' => ['class' => 'column-actions'], | |||||
'contentOptions' => ['class' => 'column-actions'], | |||||
'buttons' => [ | |||||
'form' => function ($url, $model) { | |||||
return Html::a('<span class="glyphicon glyphicon-pencil"></span>', $url, [ | |||||
'title' => Yii::t('app', 'Modifier'), 'class' => 'btn btn-default' | |||||
]); | |||||
}, | |||||
'delete' => function ($url, $model) { | |||||
return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [ | |||||
'title' => Yii::t('app', 'Supprimer'), 'class' => 'btn btn-default' | |||||
]); | |||||
} | |||||
], | |||||
] ; | |||||
?> | |||||
<div class="subscription-index"> | |||||
<?php if($dataProvider->getCount()): ?> | |||||
<?= GridView::widget([ | |||||
'dataProvider' => $dataProvider, | |||||
'columns' => $columns, | |||||
]); ?> | |||||
<?php else: ?> | |||||
<div class="alert alert-info"> | |||||
Vous n'avez encore aucun abonnement chez ce producteur. | |||||
</div> | |||||
<?php endif; ?> | |||||
</div> |
padding: 10px; | padding: 10px; | ||||
} | } | ||||
/* line 307, ../sass/_layout.scss */ | /* line 307, ../sass/_layout.scss */ | ||||
#main #page-title { | |||||
#main h2#page-title { | |||||
padding-left: 15px; | padding-left: 15px; | ||||
padding-right: 15px; | padding-right: 15px; | ||||
padding-bottom: 15px; | padding-bottom: 15px; | ||||
top: -10px; | top: -10px; | ||||
text-align: center; | text-align: center; | ||||
} | } | ||||
/* line 320, ../sass/_layout.scss */ | |||||
/* line 319, ../sass/_layout.scss */ | |||||
#main h2#page-title #buttons { | |||||
margin-bottom: 15px; | |||||
font-family: "Arial"; | |||||
} | |||||
/* line 326, ../sass/_layout.scss */ | |||||
#main .container { | #main .container { | ||||
padding: 0px; | padding: 0px; | ||||
background-color: white; | background-color: white; | ||||
border-left: solid 1px #e0e0e0; | border-left: solid 1px #e0e0e0; | ||||
border-right: solid 1px #e0e0e0; | border-right: solid 1px #e0e0e0; | ||||
} | } | ||||
/* line 328, ../sass/_layout.scss */ | |||||
/* line 334, ../sass/_layout.scss */ | |||||
#main #content { | #main #content { | ||||
padding-bottom: 20px; | padding-bottom: 20px; | ||||
padding: 0px 20px 20px 20px; | padding: 0px 20px 20px 20px; | ||||
} | } | ||||
/* line 332, ../sass/_layout.scss */ | |||||
/* line 338, ../sass/_layout.scss */ | |||||
#main #content h1, #main #content h2, #main #content h3, #main #content h4, #main #content h5, #main #content h6 { | #main #content h1, #main #content h2, #main #content h3, #main #content h4, #main #content h5, #main #content h6 { | ||||
font-family: "myriadpro-regular"; | font-family: "myriadpro-regular"; | ||||
margin-top: 30px; | margin-top: 30px; | ||||
margin-bottom: 20px; | margin-bottom: 20px; | ||||
} | } | ||||
/* line 337, ../sass/_layout.scss */ | |||||
/* line 343, ../sass/_layout.scss */ | |||||
#main #content h1.first, #main #content h2.first, #main #content h3.first, #main #content h4.first, #main #content h5.first, #main #content h6.first { | #main #content h1.first, #main #content h2.first, #main #content h3.first, #main #content h4.first, #main #content h5.first, #main #content h6.first { | ||||
margin-top: 0px; | margin-top: 0px; | ||||
} | } | ||||
/* line 342, ../sass/_layout.scss */ | |||||
/* line 348, ../sass/_layout.scss */ | |||||
#main #content h1 { | #main #content h1 { | ||||
font-size: 30px; | font-size: 30px; | ||||
} | } | ||||
/* line 346, ../sass/_layout.scss */ | |||||
/* line 352, ../sass/_layout.scss */ | |||||
#main #content h2 { | #main #content h2 { | ||||
font-size: 25px; | font-size: 25px; | ||||
} | } | ||||
/* line 351, ../sass/_layout.scss */ | |||||
/* line 357, ../sass/_layout.scss */ | |||||
#main #content h3 { | #main #content h3 { | ||||
font-family: "myriadpro-light"; | font-family: "myriadpro-light"; | ||||
text-transform: uppercase; | text-transform: uppercase; | ||||
font-size: 23px; | font-size: 23px; | ||||
padding: 10px 0px 10px 10px; | |||||
color: white; | |||||
text-align: center; | |||||
text-align: left; | |||||
margin-bottom: 30px; | |||||
margin-top: 45px; | |||||
} | } | ||||
/* line 358, ../sass/_layout.scss */ | |||||
/* line 365, ../sass/_layout.scss */ | |||||
#main #content h3 span { | #main #content h3 span { | ||||
background-color: #BB8757; | background-color: #BB8757; | ||||
padding: 10px 20px; | padding: 10px 20px; | ||||
color: #BB8757; | color: #BB8757; | ||||
border: dotted 1px #BB8757; | border: dotted 1px #BB8757; | ||||
} | } | ||||
/* line 369, ../sass/_layout.scss */ | |||||
/* line 376, ../sass/_layout.scss */ | |||||
#main #content h4 { | #main #content h4 { | ||||
font-size: 20px; | font-size: 20px; | ||||
} | } | ||||
/* line 373, ../sass/_layout.scss */ | |||||
/* line 380, ../sass/_layout.scss */ | |||||
#main #content h5 { | #main #content h5 { | ||||
font-size: 18px; | font-size: 18px; | ||||
} | } | ||||
/* line 377, ../sass/_layout.scss */ | |||||
/* line 384, ../sass/_layout.scss */ | |||||
#main #content h6 { | #main #content h6 { | ||||
font-size: 16px; | font-size: 16px; | ||||
} | } | ||||
/* line 390, ../sass/_layout.scss */ | |||||
#main #content form .form-group .hint-block { | |||||
color: gray; | |||||
} | |||||
/* line 383, ../sass/_layout.scss */ | |||||
/* line 398, ../sass/_layout.scss */ | |||||
#footer { | #footer { | ||||
background-color: #BB8757; | background-color: #BB8757; | ||||
height: 100px; | height: 100px; | ||||
} | } | ||||
/* line 387, ../sass/_layout.scss */ | |||||
/* line 402, ../sass/_layout.scss */ | |||||
#footer .container { | #footer .container { | ||||
padding: 0px; | padding: 0px; | ||||
} | } | ||||
/* line 389, ../sass/_layout.scss */ | |||||
/* line 404, ../sass/_layout.scss */ | |||||
#footer .container .overflow { | #footer .container .overflow { | ||||
height: 30px; | height: 30px; | ||||
background-color: white; | background-color: white; | ||||
border-right: solid 1px #e0e0e0; | border-right: solid 1px #e0e0e0; | ||||
border-bottom: solid 1px #e0e0e0; | border-bottom: solid 1px #e0e0e0; | ||||
} | } | ||||
/* line 397, ../sass/_layout.scss */ | |||||
/* line 412, ../sass/_layout.scss */ | |||||
#footer .container .content { | #footer .container .content { | ||||
padding-top: 20px; | padding-top: 20px; | ||||
color: white; | color: white; | ||||
} | } | ||||
/* line 401, ../sass/_layout.scss */ | |||||
/* line 416, ../sass/_layout.scss */ | |||||
#footer .container .content a { | #footer .container .content a { | ||||
color: white; | color: white; | ||||
text-decoration: underline; | text-decoration: underline; | ||||
margin-right: 10px; | margin-right: 10px; | ||||
} | } | ||||
/* line 409, ../sass/_layout.scss */ | |||||
/* line 424, ../sass/_layout.scss */ | |||||
#footer .container #code-source img { | #footer .container #code-source img { | ||||
height: 20px; | height: 20px; | ||||
} | } | ||||
color: gray; | color: gray; | ||||
} | } | ||||
/* line 7, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .points-sale .locality, | |||||
.subscription-update .subscription-form .points-sale .locality { | |||||
color: gray; | |||||
} | |||||
/* line 10, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .points-sale label, | |||||
.subscription-update .subscription-form .points-sale label { | |||||
cursor: pointer; | |||||
} | |||||
/* line 16, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .days .form-group, | |||||
.subscription-update .subscription-form .days .form-group { | |||||
float: left; | |||||
margin-right: 15px; | |||||
} | |||||
/* line 26, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .points-sale table tr.selected td, | |||||
.subscription-update .subscription-form .points-sale table tr.selected td { | |||||
background-color: #F8F1DD; | |||||
} | |||||
/* line 31, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .points-sale table .block-code, | |||||
.subscription-update .subscription-form .points-sale table .block-code { | |||||
width: 150px; | |||||
} | |||||
/* line 35, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .points-sale table .actions, | |||||
.subscription-update .subscription-form .points-sale table .actions { | |||||
width: 150px; | |||||
} | |||||
/* line 38, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .points-sale table .actions button, | |||||
.subscription-update .subscription-form .points-sale table .actions button { | |||||
width: 100%; | |||||
display: block; | |||||
} | |||||
/* line 47, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .products .monday, .subscription-create .subscription-form .products .tuesday, .subscription-create .subscription-form .products .wednesday, .subscription-create .subscription-form .products .thursday, | |||||
.subscription-create .subscription-form .products .friday, .subscription-create .subscription-form .products .saturday, .subscription-create .subscription-form .products .sunday, .subscription-create .subscription-form .products .no-day, | |||||
.subscription-update .subscription-form .products .monday, | |||||
.subscription-update .subscription-form .products .tuesday, | |||||
.subscription-update .subscription-form .products .wednesday, | |||||
.subscription-update .subscription-form .products .thursday, | |||||
.subscription-update .subscription-form .products .friday, | |||||
.subscription-update .subscription-form .products .saturday, | |||||
.subscription-update .subscription-form .products .sunday, | |||||
.subscription-update .subscription-form .products .no-day { | |||||
display: none; | |||||
} | |||||
/* line 52, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .products .monday-active .monday, | |||||
.subscription-create .subscription-form .products .tuesday-active .tuesday, | |||||
.subscription-create .subscription-form .products .wednesday-active .wednesday, | |||||
.subscription-create .subscription-form .products .thursday-active .thursday, | |||||
.subscription-create .subscription-form .products .friday-active .friday, | |||||
.subscription-create .subscription-form .products .saturday-active .saturday, | |||||
.subscription-create .subscription-form .products .sunday-active .sunday, | |||||
.subscription-update .subscription-form .products .monday-active .monday, | |||||
.subscription-update .subscription-form .products .tuesday-active .tuesday, | |||||
.subscription-update .subscription-form .products .wednesday-active .wednesday, | |||||
.subscription-update .subscription-form .products .thursday-active .thursday, | |||||
.subscription-update .subscription-form .products .friday-active .friday, | |||||
.subscription-update .subscription-form .products .saturday-active .saturday, | |||||
.subscription-update .subscription-form .products .sunday-active .sunday { | |||||
display: block; | |||||
} | |||||
/* line 62, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .products td.quantity, | |||||
.subscription-update .subscription-form .products td.quantity { | |||||
width: 150px; | |||||
} | |||||
/* line 65, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .products td.quantity input, | |||||
.subscription-update .subscription-form .products td.quantity input { | |||||
text-align: center; | |||||
} | |||||
/* line 68, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .products td.quantity input.has-quantity, | |||||
.subscription-update .subscription-form .products td.quantity input.has-quantity { | |||||
font-weight: bold; | |||||
} | |||||
/* line 74, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .products .name, | |||||
.subscription-update .subscription-form .products .name { | |||||
font-family: "comfortaalight"; | |||||
font-weight: bold; | |||||
text-transform: uppercase; | |||||
font-size: 18px; | |||||
} | |||||
/* line 81, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .products .description, | |||||
.subscription-update .subscription-form .products .description { | |||||
font-style: italic; | |||||
} | |||||
/* line 85, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .products .recipe, | |||||
.subscription-update .subscription-form .products .recipe { | |||||
font-size: 12px; | |||||
} | |||||
/* line 89, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .products .price-unit, .subscription-create .subscription-form .products .price-total, | |||||
.subscription-update .subscription-form .products .price-unit, | |||||
.subscription-update .subscription-form .products .price-total { | |||||
text-align: center; | |||||
width: 150px; | |||||
} | |||||
/* line 94, ../sass/subscription/_form.scss */ | |||||
.subscription-create .subscription-form .products tr.total .price-total, | |||||
.subscription-update .subscription-form .products tr.total .price-total { | |||||
text-align: center; | |||||
font-size: 20px; | |||||
} | |||||
/** | /** | ||||
Copyright La boîte à pain (2018) | Copyright La boîte à pain (2018) | ||||
chat_systeme_commande() ; | chat_systeme_commande() ; | ||||
chat_profil_user() ; | chat_profil_user() ; | ||||
$('.dropdown-toggle').dropdown() ; | $('.dropdown-toggle').dropdown() ; | ||||
chat_datepicker() ; | |||||
}) ; | }) ; | ||||
function chat_datepicker() { | |||||
$('input.datepicker').datepicker({dateFormat:'dd/mm/yy'}) ; | |||||
} | |||||
function chat_profil_user() { | function chat_profil_user() { | ||||
if($('#profil-user').size()) { | if($('#profil-user').size()) { | ||||
if($('#user-no_mail').is(':checked')) { | if($('#user-no_mail').is(':checked')) { |
}) ; | }) ; | ||||
} | } | ||||
} | } | ||||
var orders = [] ; | |||||
if(response.data.orders) { | |||||
orders = response.data.orders ; | |||||
} | |||||
var orders = response.data.orders ; | |||||
if(orders.length) { | if(orders.length) { | ||||
for(var i= 0; i < orders.length; i++) { | for(var i= 0; i < orders.length; i++) { | ||||
this.calendar.attrs.push({ | this.calendar.attrs.push({ | ||||
(this.products[product.index].quantity_form + quantity <= this.products[product.index].quantity_remaining || | (this.products[product.index].quantity_form + quantity <= this.products[product.index].quantity_remaining || | ||||
!this.products[product.index].quantity_max) | !this.products[product.index].quantity_max) | ||||
) { | ) { | ||||
this.products[product.index].quantity_form += quantity ; | this.products[product.index].quantity_form += quantity ; | ||||
} | } | ||||
}, | }, |
var app = new Vue({ | |||||
el: '#app-subscription-form', | |||||
data: { | |||||
loading: true, | |||||
idSubscription: 0, | |||||
pointsSale: [], | |||||
idPointSaleActive: 0, | |||||
pointSaleActive: null, | |||||
pointsSaleCodes: [], | |||||
dateBegin: null, | |||||
dateEnd: null, | |||||
weekFrequency: 1, | |||||
autoPayment: true, | |||||
monday: false, | |||||
tuesday: false, | |||||
wednesday: false, | |||||
thursday: false, | |||||
friday: false, | |||||
saturday: false, | |||||
sunday: false, | |||||
products: [], | |||||
errors: [], | |||||
disableSubmitButton: false, | |||||
lastCountDays: 0, | |||||
}, | |||||
mounted: function() { | |||||
this.init(); | |||||
}, | |||||
methods: { | |||||
init: function() { | |||||
if($('#subscription-id').val() != 0) { | |||||
this.idSubscription = $('#subscription-id').val() ; | |||||
} | |||||
this.dateBegin = new Date() ; | |||||
axios.get("ajax-infos",{params: {idSubscription : this.idSubscription}}) | |||||
.then(response => { | |||||
this.products = response.data.products ; | |||||
this.pointsSale = response.data.points_sale ; | |||||
if(this.idSubscription > 0) { | |||||
this.validatePointSale(response.data.id_point_sale) ; | |||||
this.weekFrequency = response.data.week_frequency ; | |||||
this.autoPayment = response.data.auto_payment ; | |||||
var arrayDateBegin = response.data.date_begin.split('-') ; | |||||
this.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('-') ; | |||||
this.dateEnd = new Date(arrayDateEnd[0], arrayDateEnd[1] - 1, arrayDateEnd[2]) ; | |||||
} | |||||
this.monday = response.data.monday ; | |||||
this.tuesday = response.data.tuesday ; | |||||
this.wednesday = response.data.wednesday ; | |||||
this.thursday = response.data.thursday ; | |||||
this.friday = response.data.friday ; | |||||
this.saturday = response.data.saturday ; | |||||
this.sunday = response.data.sunday ; | |||||
} | |||||
this.loading = false ; | |||||
}); | |||||
}, | |||||
formatDate: function(date) { | |||||
if(date) { | |||||
return ('0' + date.getDate()).slice(-2) + '/' + ('0' + (date.getMonth() + 1)).slice(-2) + '/' + date.getFullYear() ; | |||||
} | |||||
return false ; | |||||
}, | |||||
pointSaleClick: function(event) { | |||||
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(response => { | |||||
if(response.data) { | |||||
this.getPointSale(idPointSale).invalid_code = false ; | |||||
this.validatePointSale(idPointSale) ; | |||||
} | |||||
else { | |||||
this.getPointSale(idPointSale).invalid_code = true ; | |||||
Vue.set(this.pointsSaleCodes, 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 ; | |||||
} | |||||
this.pointSaleActive = this.getPointSale(idPointSale) ; | |||||
this.idPointSaleActive = idPointSale ; | |||||
boulange_scroll('step-date') ; | |||||
}, | |||||
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) ; | |||||
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 ; | |||||
boulange_scroll('step-days') ; | |||||
} | |||||
}, | |||||
checkProductAvailable: function(product) { | |||||
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 ; | |||||
} | |||||
return available ; | |||||
}, | |||||
checkOneProductAvailable: function() { | |||||
var count = 0 ; | |||||
for(key in this.products) { | |||||
if(this.checkProductAvailable(this.products[key])) { | |||||
count ++ ; | |||||
} | |||||
} | |||||
return count ; | |||||
}, | |||||
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 ; | |||||
} | |||||
} | |||||
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 '--' ; | |||||
}, | |||||
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].price ; | |||||
} | |||||
} | |||||
if(format) { | |||||
return this.formatPrice(price) ; | |||||
} | |||||
else { | |||||
return price ; | |||||
} | |||||
}, | |||||
formSubmit: function() { | |||||
this.checkForm() ; | |||||
if(!this.errors.length && !this.disableSubmitButton) { | |||||
this.disableSubmitButton = true ; | |||||
var productsArray = {} ; | |||||
for(var key in this.products) { | |||||
if( this.products[key].quantity_form != null && | |||||
this.products[key].quantity_form > 0) { | |||||
productsArray['product_'+this.products[key].id] = this.products[key].quantity_form ; | |||||
} | |||||
} | |||||
axios.post('ajax-process', { | |||||
idSubscription: this.idSubscription, | |||||
SubscriptionForm: { | |||||
id_point_sale: this.idPointSaleActive, | |||||
date_begin: this.dateBegin ? this.formatDate(this.dateBegin) : '', | |||||
date_end: this.dateEnd ? this.formatDate(this.dateEnd) : '', | |||||
week_frequency: this.weekFrequency, | |||||
auto_payment: this.autoPayment, | |||||
monday: this.monday == true ? 1 : 0, | |||||
tuesday: this.tuesday == true ? 1 : 0, | |||||
wednesday: this.wednesday == true ? 1 : 0, | |||||
thursday: this.thursday == true ? 1 : 0, | |||||
friday: this.friday == true ? 1 : 0, | |||||
saturday: this.saturday == true ? 1 : 0, | |||||
sunday: this.sunday == true ? 1 : 0, | |||||
products: productsArray | |||||
} | |||||
}).then(response => { | |||||
window.location.href = chat_base_url(true)+'subscription/index' ; | |||||
}); | |||||
} | |||||
}, | |||||
checkForm: function() { | |||||
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(response => { | |||||
if(response.data) { | |||||
this.pointsSale[idPointSale].invalid_code = false ; | |||||
} | |||||
else { | |||||
this.pointsSale[idPointSale].invalid_code = true ; | |||||
Vue.set(this.pointsSaleCodes, idPointSale, ''); | |||||
} | |||||
}) ; | |||||
} | |||||
} | |||||
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.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 && | |||||
this.weekFrequency != 3 && this.weekFrequency != 4) { | |||||
this.errors.push('Veuillez sélectionner une périodicité') ; | |||||
} | |||||
if(!this.monday && !this.tuesday && !this.wednesday && !this.thursday && | |||||
!this.friday && !this.saturday) { | |||||
this.errors.push('Veuillez sélectionner un jour de distribution') ; | |||||
} | |||||
if(!this.oneProductOrdered()) { | |||||
this.errors.push('Veuillez choisir au moins un produit') ; | |||||
} | |||||
if(this.errors.length) { | |||||
window.scroll(0, $('#page-title').position().top - 25) ; | |||||
} | |||||
} | |||||
} | |||||
}); | |||||
} | } | ||||
} | } | ||||
#page-title { | |||||
h2#page-title { | |||||
padding-left: 15px ; | padding-left: 15px ; | ||||
padding-right: 15px ; | padding-right: 15px ; | ||||
padding-bottom: 15px ; | padding-bottom: 15px ; | ||||
position: relative ; | position: relative ; | ||||
top: -10px ; | top: -10px ; | ||||
text-align: center ; | text-align: center ; | ||||
#buttons { | |||||
//float: right ; | |||||
margin-bottom: 15px ; | |||||
font-family: 'Arial' ; | |||||
} | |||||
} | } | ||||
.container { | .container { | ||||
font-family: 'myriadpro-light' ; | font-family: 'myriadpro-light' ; | ||||
text-transform: uppercase ; | text-transform: uppercase ; | ||||
font-size: 23px ; | font-size: 23px ; | ||||
padding: 10px 0px 10px 10px ; | |||||
color: white ; | |||||
text-align: center ; | |||||
text-align: left ; | |||||
margin-bottom: 30px ; | |||||
margin-top: 45px ; | |||||
span { | span { | ||||
background-color: $color1 ; | background-color: $color1 ; | ||||
padding: 10px 20px ; | padding: 10px 20px ; | ||||
h6 { | h6 { | ||||
font-size: 16px ; | font-size: 16px ; | ||||
} | } | ||||
form { | |||||
.form-group { | |||||
.hint-block { | |||||
color: gray ; | |||||
} | |||||
} | |||||
} | |||||
} | } | ||||
} | } | ||||
} | } | ||||
.ui-datepicker-title { | .ui-datepicker-title { | ||||
color: white | |||||
color: white ; | |||||
} | } | ||||
.ui-datepicker-prev, | .ui-datepicker-prev, |
@import "order/_history.scss"; | @import "order/_history.scss"; | ||||
@import "order/_order.scss"; | @import "order/_order.scss"; | ||||
@import "credit/_add.scss"; | @import "credit/_add.scss"; | ||||
@import "subscription/_form.scss"; | |||||
@import "_responsive.scss"; | @import "_responsive.scss"; |
.subscription-create, | |||||
.subscription-update { | |||||
.subscription-form { | |||||
.points-sale { | |||||
.locality { | |||||
color: gray ; | |||||
} | |||||
label { | |||||
cursor: pointer ; | |||||
} | |||||
} | |||||
.days { | |||||
.form-group { | |||||
float: left ; | |||||
margin-right: 15px ; | |||||
} | |||||
} | |||||
.points-sale { | |||||
table { | |||||
tr.selected { | |||||
td { | |||||
background-color: $color2 ; | |||||
} | |||||
} | |||||
.block-code { | |||||
width: 150px ; | |||||
} | |||||
.actions { | |||||
width: 150px ; | |||||
button { | |||||
width: 100% ; | |||||
display: block ; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
.products { | |||||
.monday, .tuesday, .wednesday, .thursday, | |||||
.friday, .saturday, .sunday, .no-day { | |||||
display: none ; | |||||
} | |||||
.monday-active .monday, | |||||
.tuesday-active .tuesday, | |||||
.wednesday-active .wednesday, | |||||
.thursday-active .thursday, | |||||
.friday-active .friday, | |||||
.saturday-active .saturday, | |||||
.sunday-active .sunday { | |||||
display: block ; | |||||
} | |||||
td.quantity { | |||||
width: 150px ; | |||||
input { | |||||
text-align: center ; | |||||
&.has-quantity { | |||||
font-weight: bold ; | |||||
} | |||||
} | |||||
} | |||||
.name { | |||||
font-family: "comfortaalight" ; | |||||
font-weight: bold ; | |||||
text-transform: uppercase ; | |||||
font-size: 18px ; | |||||
} | |||||
.description { | |||||
font-style: italic; | |||||
} | |||||
.recipe { | |||||
font-size: 12px ; | |||||
} | |||||
.price-unit, .price-total { | |||||
text-align: center ; | |||||
width: 150px ; | |||||
} | |||||
tr.total .price-total { | |||||
text-align: center ; | |||||
font-size: 20px ; | |||||
} | |||||
} | |||||
} | |||||
} |