# local phpunit config | # local phpunit config | ||||
/phpunit.xml | /phpunit.xml | ||||
*/.git | |||||
vendor/* | vendor/* | ||||
*/.git | |||||
common/config/bootstrap.php |
$model->active = 1; | $model->active = 1; | ||||
$model->id_producer = Producer::getId(); | $model->id_producer = Producer::getId(); | ||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||||
$lastProductOrder = Product::find()->where('id_producer = :id_producer')->params([':id_producer' => Producer::getId()])->orderBy('order DESC')->one() ; | $lastProductOrder = Product::find()->where('id_producer = :id_producer')->params([':id_producer' => Producer::getId()])->orderBy('order DESC')->one() ; |
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\models\TaxRate; | |||||
use Yii; | use Yii; | ||||
use common\models\User; | use common\models\User; | ||||
use yii\web\NotFoundHttpException; | use yii\web\NotFoundHttpException; | ||||
use common\models\Invoice; | use common\models\Invoice; | ||||
/** | /** | ||||
* UserController implements the CRUD actions for User model. | |||||
* TaxRateAdminController implements the CRUD actions for TaxRate model. | |||||
*/ | */ | ||||
class TaxRateAdminController extends BackendController | class TaxRateAdminController extends BackendController | ||||
{ | { | ||||
*/ | */ | ||||
public function actionIndex() | public function actionIndex() | ||||
{ | { | ||||
$dataProviderProducer = new ActiveDataProvider([ | |||||
'query' => Producer::find() | |||||
->with('userProducer', 'user') | |||||
->orderBy('date_creation DESC'), | |||||
'pagination' => [ | |||||
'pageSize' => 1000, | |||||
], | |||||
$dataProviderTaxRate = new ActiveDataProvider([ | |||||
'query' => TaxRate::find() | |||||
]); | ]); | ||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'dataProviderProducer' => $dataProviderProducer, | |||||
'dataProviderTaxRate' => $dataProviderTaxRate, | |||||
]); | ]); | ||||
} | } | ||||
*/ | */ | ||||
public function actionCreate() | public function actionCreate() | ||||
{ | { | ||||
$model = new Producer(); | |||||
$model = new TaxRate(); | |||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||||
Yii::$app->getSession()->setFlash('success', 'Producteur créé.'); | |||||
Yii::$app->getSession()->setFlash('success', 'Taxe créé.'); | |||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} else { | } else { | ||||
return $this->render('create', [ | return $this->render('create', [ | ||||
} | } | ||||
} | } | ||||
/** | |||||
* Génère la facture mensuelle d'un producteur. | |||||
* | |||||
* @param integer $idProducer | |||||
*/ | |||||
public function actionBill($idProducer) | |||||
{ | |||||
$producer = Producer::findOne($idProducer); | |||||
if ($producer) { | |||||
$period = date('Y-m', strtotime('-1 month')); | |||||
$last_invoice = Invoice::getLastInvoice() ; | |||||
if (!$last_invoice) { | |||||
$reference = 'BAP000001'; | |||||
} else { | |||||
$reference = str_replace('BAP', '', $last_invoice->reference); | |||||
$reference ++; | |||||
$reference = 'BAP' . $reference; | |||||
} | |||||
$invoice = new Invoice; | |||||
$invoice->id_producer = $idProducer; | |||||
$invoice->date = date('Y-m-d H:i:s'); | |||||
$invoice->reference = $reference; | |||||
$invoice->turnover = $producer->getTurnover($period); | |||||
$invoice->amount_ht = $producer->getFreePrice() ; | |||||
$invoice->wording = 'Facture ' . date('m/Y', strtotime('-1 month')); | |||||
$invoice->text = 'Utilisation de la plateforme <strong>distrib</strong> pour le mois : ' . date('m/Y', strtotime('-1 month')) . '<br />' | |||||
. 'Chiffre d\'affaire réalisé sur la plateforme : <strong>' . number_format($facture->ca, 2) . ' €</strong> commissionné à <strong>1%</strong>.'; | |||||
$invoice->paid = 0; | |||||
$invoice->period = $period; | |||||
$invoice->save(); | |||||
} | |||||
$this->redirect(['producer-admin/index']); | |||||
} | |||||
/** | |||||
* Liste les factures des producteurs. | |||||
* | |||||
* @return mxied | |||||
*/ | |||||
public function actionBilling() | |||||
{ | |||||
$dataProviderInvoice = new ActiveDataProvider([ | |||||
'query' => Invoice::find() | |||||
->with('producer') | |||||
->orderBy('reference DESC'), | |||||
'pagination' => [ | |||||
'pageSize' => 1000, | |||||
], | |||||
]); | |||||
return $this->render('billing', [ | |||||
'dataProviderInvoice' => $dataProviderInvoice, | |||||
]); | |||||
} | |||||
/** | |||||
* Recherche un établissement. | |||||
* | |||||
* @param integer $id | |||||
* @return Etablissement | |||||
* @throws NotFoundHttpException | |||||
*/ | |||||
protected function findModel($id) { | |||||
if (($model = Producer::findOne($id)) !== null) { | |||||
return $model; | |||||
} else { | |||||
throw new NotFoundHttpException('The requested page does not exist.'); | |||||
} | |||||
} | |||||
} | } |
['label' => 'Administration', 'options' => ['class' => 'header'], 'visible' => User::isCurrentAdmin()], | ['label' => 'Administration', 'options' => ['class' => 'header'], 'visible' => User::isCurrentAdmin()], | ||||
['label' => 'Producteurs','icon' => 'th-list','url' => ['/producer-admin/index'], 'visible' => User::isCurrentAdmin()], | ['label' => 'Producteurs','icon' => 'th-list','url' => ['/producer-admin/index'], 'visible' => User::isCurrentAdmin()], | ||||
['label' => 'Taxes','icon' => 'eur','url' => ['/tax-rate-admin/index'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Statuts commande','icon' => 'tags','url' => ['/order-status-admin/index'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Communiquer','icon' => 'bullhorn','url' => ['/communicate-admin/index'], 'visible' => User::isCurrentAdmin()], | ['label' => 'Communiquer','icon' => 'bullhorn','url' => ['/communicate-admin/index'], 'visible' => User::isCurrentAdmin()], | ||||
['label' => 'Outils', 'options' => ['class' => 'header'], 'visible' => User::isCurrentAdmin()], | ['label' => 'Outils', 'options' => ['class' => 'header'], 'visible' => User::isCurrentAdmin()], |
use yii\bootstrap\ActiveForm; | use yii\bootstrap\ActiveForm; | ||||
use common\models\Product; | use common\models\Product; | ||||
use yii\helpers\ArrayHelper ; | use yii\helpers\ArrayHelper ; | ||||
use common\models\TaxRate; | |||||
/* @var $this yii\web\View */ | /* @var $this yii\web\View */ | ||||
/* @var $model app\models\Produit */ | /* @var $model app\models\Produit */ | ||||
/* @var $form yii\widgets\ActiveForm */ | /* @var $form yii\widgets\ActiveForm */ | ||||
<?= $form->field($model, 'step')->textInput()->hint('Définit ce qui est ajouté ou enlevé lors des changements de quantité.') ?> | <?= $form->field($model, 'step')->textInput()->hint('Définit ce qui est ajouté ou enlevé lors des changements de quantité.') ?> | ||||
<?= $form->field($model, 'weight')->textInput()->label('Poids (g)') ?> | <?= $form->field($model, 'weight')->textInput()->label('Poids (g)') ?> | ||||
<?= $form->field($model, 'id_tax_rate')->dropDownList(array_merge(array(0=> 'Tva par défaut'),ArrayHelper::map(TaxRate::find()->all(), 'id', function($model) { return $model->name; })))->label('Taxe'); ?> | |||||
<?= $form->field($model, 'quantity_max') | <?= $form->field($model, 'quantity_max') | ||||
->hint('Renseignez ce champs si vous souhaitez limiter la quantité commandable pour une distribution.') | ->hint('Renseignez ce champs si vous souhaitez limiter la quantité commandable pour une distribution.') | ||||
->textInput() ?> | ->textInput() ?> |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use yii\grid\GridView; | use yii\grid\GridView; | ||||
use common\helpers\Url ; | |||||
use common\models\Product ; | |||||
use common\helpers\Url; | |||||
use common\models\Product; | |||||
$this->setTitle('Produits') ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | |||||
$this->addButton(['label' => 'Nouveau produit <span class="glyphicon glyphicon-plus"></span>', 'url' => 'product/create', 'class' => 'btn btn-primary']) ; | |||||
$this->setTitle('Produits'); | |||||
$this->addBreadcrumb($this->getTitle()); | |||||
$this->addButton(['label' => 'Nouveau produit <span class="glyphicon glyphicon-plus"></span>', 'url' => 'product/create', 'class' => 'btn btn-primary']); | |||||
?> | ?> | ||||
<span style="display: none;" id="page-size"><?= $dataProvider->pagination->pageSize; ?></span> | <span style="display: none;" id="page-size"><?= $dataProvider->pagination->pageSize; ?></span> | ||||
<div class="product-index"> | <div class="product-index"> | ||||
<?= GridView::widget([ | |||||
'filterModel' => $searchModel, | |||||
'dataProvider' => $dataProvider, | |||||
'columns' => [ | |||||
[ | |||||
'attribute' => 'order', | |||||
'headerOptions' => ['class' => 'order'], | |||||
'format' => 'raw', | |||||
'filter' => '', | |||||
'value' => function($model) { | |||||
return '<a class="btn-order btn btn-default" href="javascript:void(0);"><span class="glyphicon glyphicon-resize-vertical"></span></a>' ; | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'photo', | |||||
'format' => 'raw', | |||||
'headerOptions' => ['class' => 'td-photo'], | |||||
'filter' => '', | |||||
'value' => function($model) { | |||||
if(strlen($model->photo)) { | |||||
$url = Yii::$app->urlManagerProducer->getHostInfo().'/'.Yii::$app->urlManagerProducer->baseUrl ; | |||||
return '<img class="photo-product" src="'.$url.'/uploads/'.$model->photo.'" />' ; | |||||
} | |||||
return '' ; | |||||
} | |||||
], | |||||
'name', | |||||
'description', | |||||
[ | |||||
'attribute' => 'price', | |||||
'value' => function($model) { | |||||
$return = '' ; | |||||
if($model->price) { | |||||
$return = Price::format($model->price).' ('.Product::strUnit($model->unit, 'wording_unit', true).')' ; | |||||
} | |||||
return $return ; | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'active', | |||||
'headerOptions' => ['class' => 'active'], | |||||
'contentOptions' => ['class' => 'center'], | |||||
'format' => 'raw', | |||||
'filter' => [0 => 'Non', 1 => 'Oui'], | |||||
'value' => function($model) { | |||||
if($model->active) | |||||
{ | |||||
return '<span class="label label-success">oui</span>' ; | |||||
} | |||||
else { | |||||
return '<span class="label label-danger">non</span>' ; | |||||
} | |||||
} | |||||
], | |||||
[ | |||||
'class' => 'yii\grid\ActionColumn', | |||||
'template' => '{update} {delete}', | |||||
'headerOptions' => ['class' => 'column-actions'], | |||||
'contentOptions' => ['class' => 'column-actions'], | |||||
'buttons' => [ | |||||
'update' => 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' | |||||
]); | |||||
} | |||||
<?= GridView::widget([ | |||||
'filterModel' => $searchModel, | |||||
'dataProvider' => $dataProvider, | |||||
'columns' => [ | |||||
[ | |||||
'attribute' => 'order', | |||||
'headerOptions' => ['class' => 'order'], | |||||
'format' => 'raw', | |||||
'filter' => '', | |||||
'value' => function ($model) { | |||||
return '<a class="btn-order btn btn-default" href="javascript:void(0);"><span class="glyphicon glyphicon-resize-vertical"></span></a>'; | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'photo', | |||||
'format' => 'raw', | |||||
'headerOptions' => ['class' => 'td-photo'], | |||||
'filter' => '', | |||||
'value' => function ($model) { | |||||
if (strlen($model->photo)) { | |||||
$url = Yii::$app->urlManagerProducer->getHostInfo() . '/' . Yii::$app->urlManagerProducer->baseUrl; | |||||
return '<img class="photo-product" src="' . $url . '/uploads/' . $model->photo . '" />'; | |||||
} | |||||
return ''; | |||||
} | |||||
], | |||||
'name', | |||||
'description', | |||||
[ | |||||
'attribute' => 'id_tax_rate', | |||||
'value' => function ($model) { | |||||
if ($model->id_tax_rate == 0 || $model->id_tax_rate == null) { | |||||
$return = "TVA par défaut"; | |||||
} else { | |||||
$return = $model->taxRate->name; | |||||
} | |||||
return $return; | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'price', | |||||
'value' => function ($model) { | |||||
$return = ''; | |||||
if ($model->price) { | |||||
$return = Price::format($model->price) . ' (' . Product::strUnit($model->unit, 'wording_unit', true) . ')'; | |||||
} | |||||
return $return; | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'active', | |||||
'headerOptions' => ['class' => 'active'], | |||||
'contentOptions' => ['class' => 'center'], | |||||
'format' => 'raw', | |||||
'filter' => [0 => 'Non', 1 => 'Oui'], | |||||
'value' => function ($model) { | |||||
if ($model->active) { | |||||
return '<span class="label label-success">oui</span>'; | |||||
} else { | |||||
return '<span class="label label-danger">non</span>'; | |||||
} | |||||
} | |||||
], | |||||
[ | |||||
'class' => 'yii\grid\ActionColumn', | |||||
'template' => '{update} {delete}', | |||||
'headerOptions' => ['class' => 'column-actions'], | |||||
'contentOptions' => ['class' => 'column-actions'], | |||||
'buttons' => [ | |||||
'update' => 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> | </div> |
use yii\helpers\ArrayHelper ; | use yii\helpers\ArrayHelper ; | ||||
use common\models\Producer ; | use common\models\Producer ; | ||||
$this->setTitle('Ajouter producteur') ; | |||||
$this->addBreadcrumb(['label' => 'Producteurs', 'url' => ['index']]) ; | |||||
$this->setTitle('Ajouter une taxe') ; | |||||
$this->addBreadcrumb(['label' => 'taxe', 'url' => ['index']]) ; | |||||
$this->addBreadcrumb('Ajouter') ; | $this->addBreadcrumb('Ajouter') ; | ||||
?> | ?> | ||||
<div class="producer-create"> | |||||
<div class="tax-create"> | |||||
<?php $form = ActiveForm::begin(); ?> | <?php $form = ActiveForm::begin(); ?> | ||||
<?= $form->field($model, 'name') ?> | <?= $form->field($model, 'name') ?> | ||||
<?= $form->field($model, 'type')->textInput(['placeholder' => 'Boulangerie, brasserie, ferme ...']); ?> | |||||
<?= $form->field($model, 'postcode') ?> | |||||
<?= $form->field($model, 'city') ?> | |||||
<?= $form->field($model, 'code')->label('Code d\'accès') ?> | |||||
<?= $form->field($model, 'pourcent') ?> | |||||
<div class="form-group"> | <div class="form-group"> | ||||
<?= Html::submitButton('Ajouter', ['class' => 'btn btn-success']) ?> | <?= Html::submitButton('Ajouter', ['class' => 'btn btn-success']) ?> | ||||
</div> | </div> |
use common\models\Producer ; | use common\models\Producer ; | ||||
use common\models\Distribution ; | use common\models\Distribution ; | ||||
$this->setTitle('Producteurs') ; | |||||
$this->setTitle('Taxes') ; | |||||
$this->addBreadcrumb($this->getTitle()) ; | $this->addBreadcrumb($this->getTitle()) ; | ||||
$this->addButton(['label' => 'Nouveau producteur <span class="glyphicon glyphicon-plus"></span>', 'url' => 'producer-admin/create', 'class' => 'btn btn-primary']) ; | |||||
$this->addButton(['label' => 'Nouvelle taxe <span class="glyphicon glyphicon-plus"></span>', 'url' => 'tax-rate-admin/create', 'class' => 'btn btn-primary']) ; | |||||
?> | ?> | ||||
<?= GridView::widget([ | <?= GridView::widget([ | ||||
'dataProvider' => $dataProviderProducer, | |||||
'dataProvider' => $dataProviderTaxRate, | |||||
'columns' => [ | 'columns' => [ | ||||
'name', | 'name', | ||||
[ | [ | ||||
'attribute' => 'date_creation', | |||||
'format' => 'raw', | |||||
'attribute' => 'pourcent', | |||||
'value' => function($model) { | 'value' => function($model) { | ||||
return date('d/m/Y', strtotime($model->date_creation)) ; | |||||
return $model->pourcent . '%'; | |||||
} | } | ||||
], | |||||
[ | |||||
'attribute' => 'Lieu', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
return Html::encode($model->city.' ('.$model->postcode.')') ; | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'Utilisateurs', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
if(!$model->userProducer || !count($model->userProducer)) | |||||
{ | |||||
return 'Aucun utilisateur' ; | |||||
} | |||||
else { | |||||
$users = count($model->userProducer).' client' ; | |||||
if(count($model->userProducer) > 1) { | |||||
$users .= 's' ; | |||||
} | |||||
return $users ; | |||||
} | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'Contact', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
if(!isset($model->user) || (isset($model->user) && count($model->user) == 0)) | |||||
{ | |||||
return 'Aucun contact' ; | |||||
} | |||||
else { | |||||
foreach($model->user as $u) | |||||
{ | |||||
if($u->status == User::STATUS_PRODUCER) | |||||
{ | |||||
return Html::encode($u->lastname.' '.$u->name) | |||||
.'<br />'.Html::encode($u->email) | |||||
.'<br />'.Html::encode($u->phone) ; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'active', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
$html = '' ; | |||||
if($model->active) { | |||||
$html .= '<span class="label label-success">En ligne</span>' ; | |||||
} | |||||
else { | |||||
$html .= '<span class="label label-danger">Hors-ligne</span>' ; | |||||
} | |||||
if(strlen($model->code)) | |||||
{ | |||||
$html .= ' <span class="glyphicon glyphicon-lock" data-toggle="tooltip" data-placement="bottom" data-original-title="'.Html::encode($model->code).'"></span>' ; | |||||
} | |||||
return $html ; | |||||
} | |||||
], | |||||
[ | |||||
'attribute' => 'Prix libre', | |||||
'label' => 'Prix libre', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
if(is_null($model->free_price)) { | |||||
return '' ; | |||||
} | |||||
else { | |||||
return $model->getFreePrice() ; | |||||
} | |||||
} | |||||
], | |||||
[ | |||||
'label' => 'Dons (mois précédent)', | |||||
'format' => 'raw', | |||||
'value' => function($model) { | |||||
$productGift = Product::getProductGift() ; | |||||
$res = Yii::$app->db->createCommand("SELECT SUM(product_order.price * product_order.quantity) AS total | |||||
FROM `order`, product_order, distribution | |||||
WHERE distribution.id_producer = :id_producer | |||||
AND `order`.id_distribution = distribution.id | |||||
AND `order`.id = product_order.id_order | |||||
AND distribution.date >= :date_start | |||||
AND distribution.date <= :date_end | |||||
AND product_order.id_product = :id_product_gift | |||||
") | |||||
->bindValue(':id_producer', $model->id) | |||||
->bindValue(':date_start', date('Y-m-01', strtotime("-1 month"))) | |||||
->bindValue(':date_end', date('Y-m-31', strtotime("-1 month"))) | |||||
->bindValue(':id_product_gift', $productGift->id) | |||||
->queryOne(); | |||||
return Price::format($res['total']) ; | |||||
} | |||||
], | |||||
] | |||||
], | ], | ||||
]); ?> | ]); ?> |
$domainName = 'localhost' ; | $domainName = 'localhost' ; | ||||
} | } | ||||
else { | else { | ||||
$domainName = (YII_ENV === 'dev' || YII_ENV === 'demo') ? 'opendistrib-'.YII_ENV.'.net' : 'opendistrib.net' ; | |||||
$domainName = (YII_ENV === 'dev' || YII_ENV === 'demo') ? 'opendistrib.local' : 'opendistrib.net' ; | |||||
} | } | ||||
Yii::setAlias('@domainName', $domainName); | Yii::setAlias('@domainName', $domainName); | ||||
Yii::setAlias('@baseUrl', ($serverName == 'localhost') ? '/distrib/' : '/'); | |||||
Yii::setAlias('@baseUrl', ($serverName == 'localhost') ? '/www/projets/distrib/' : '/'); | |||||
Yii::setAlias('@baseUrlFrontend', (($serverName == 'localhost') ? '/frontend/web' : '')); | Yii::setAlias('@baseUrlFrontend', (($serverName == 'localhost') ? '/frontend/web' : '')); | ||||
Yii::setAlias('@baseUrlBackend', (($serverName == 'localhost') ? '/backend/web' : '')); | Yii::setAlias('@baseUrlBackend', (($serverName == 'localhost') ? '/backend/web' : '')); | ||||
Yii::setAlias('@baseUrlProducer', (($serverName == 'localhost') ? '/producer/web' : '')); | Yii::setAlias('@baseUrlProducer', (($serverName == 'localhost') ? '/producer/web' : '')); |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
namespace common\models; | namespace common\models; | ||||
use Yii; | use Yii; | ||||
use common\components\ActiveRecordCommon ; | |||||
use common\components\ActiveRecordCommon; | |||||
/** | /** | ||||
* This is the model class for table "product". | * This is the model class for table "product". | ||||
*/ | */ | ||||
class Product extends ActiveRecordCommon | class Product extends ActiveRecordCommon | ||||
{ | { | ||||
var $total = 0; | |||||
var $apply_distributions = true ; | |||||
public static $unitsArray = [ | |||||
'piece' => [ | |||||
'unit' => 'piece', | |||||
'wording_unit' => 'la pièce', | |||||
'wording' => 'pièce(s)', | |||||
'wording_short' => 'p.', | |||||
'coefficient' => 1 | |||||
], | |||||
'g' => [ | |||||
'unit' => 'g', | |||||
'wording_unit' => 'le g', | |||||
'wording' => 'g', | |||||
'wording_short' => 'g', | |||||
'coefficient' => 1000 | |||||
], | |||||
'kg' => [ | |||||
'unit' => 'kg', | |||||
'wording_unit' => 'le kg', | |||||
'wording' => 'kg', | |||||
'wording_short' => 'kg', | |||||
'coefficient' => 1 | |||||
], | |||||
'mL' => [ | |||||
'unit' => 'mL', | |||||
'wording_unit' => 'le mL', | |||||
'wording' => 'mL', | |||||
'wording_short' => 'mL', | |||||
'coefficient' => 1000 | |||||
], | |||||
'L' => [ | |||||
'unit' => 'L', | |||||
'wording_unit' => 'le litre', | |||||
'wording' => 'L', | |||||
'wording_short' => 'L', | |||||
'coefficient' => 1 | |||||
], | |||||
]; | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public static function tableName() | |||||
{ | |||||
return 'product'; | |||||
} | |||||
var $total = 0; | |||||
var $apply_distributions = true; | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function rules() | |||||
{ | |||||
return [ | |||||
[['name', 'id_producer'], 'required'], | |||||
[['active', 'order', 'quantity_max', 'id_producer'], 'integer'], | |||||
[['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'unavailable','apply_distributions'], 'boolean'], | |||||
[['price', 'weight', 'step'], 'number'], | |||||
[[ 'photo'], 'file'], | |||||
[['name', 'description', 'photo', 'unit'], 'string', 'max' => 255], | |||||
[['recipe'], 'string', 'max' => 1000], | |||||
['step', 'required', 'message' => 'Champs obligatoire', 'when' => function($model) { | |||||
if($model->unit != 'piece') { | |||||
return true ; | |||||
} | |||||
return false ; | |||||
}], | |||||
public static $unitsArray = [ | |||||
'piece' => [ | |||||
'unit' => 'piece', | |||||
'wording_unit' => 'la pièce', | |||||
'wording' => 'pièce(s)', | |||||
'wording_short' => 'p.', | |||||
'coefficient' => 1 | |||||
], | |||||
'g' => [ | |||||
'unit' => 'g', | |||||
'wording_unit' => 'le g', | |||||
'wording' => 'g', | |||||
'wording_short' => 'g', | |||||
'coefficient' => 1000 | |||||
], | |||||
'kg' => [ | |||||
'unit' => 'kg', | |||||
'wording_unit' => 'le kg', | |||||
'wording' => 'kg', | |||||
'wording_short' => 'kg', | |||||
'coefficient' => 1 | |||||
], | |||||
'mL' => [ | |||||
'unit' => 'mL', | |||||
'wording_unit' => 'le mL', | |||||
'wording' => 'mL', | |||||
'wording_short' => 'mL', | |||||
'coefficient' => 1000 | |||||
], | |||||
'L' => [ | |||||
'unit' => 'L', | |||||
'wording_unit' => 'le litre', | |||||
'wording' => 'L', | |||||
'wording_short' => 'L', | |||||
'coefficient' => 1 | |||||
], | |||||
]; | ]; | ||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function attributeLabels() | |||||
{ | |||||
return [ | |||||
'id' => 'ID', | |||||
'name' => 'Nom', | |||||
'description' => 'Description', | |||||
'active' => 'Actif', | |||||
'photo' => 'Photo', | |||||
'price' => 'Prix (€)', | |||||
'weight' => 'Poids', | |||||
'recipe' => 'Recette', | |||||
'monday' => 'Lundi', | |||||
'tuesday' => 'Mardi', | |||||
'wednesday' => 'Mercredi', | |||||
'thursday' => 'Jeudi', | |||||
'friday' => 'Vendredi', | |||||
'saturday' => 'Samedi', | |||||
'sunday' => 'Dimanche', | |||||
'order' => 'Ordre', | |||||
'quantity_max' => 'Quantité max par défaut', | |||||
'unavailable' => 'Épuisé', | |||||
'apply_distributions' => 'Appliquer ces modifications dans les distributions futures', | |||||
'unit' => 'Unité', | |||||
'step' => 'Pas' | |||||
]; | |||||
} | |||||
public function getProductDistribution() | |||||
{ | |||||
return $this->hasMany(ProductDistribution::className(), ['id_product' => 'id']); | |||||
} | |||||
public function getProductSubscription() | |||||
{ | |||||
return $this->hasMany(ProductSubscription::className(), ['id_product' => 'id']); | |||||
} | |||||
/** | |||||
* Retourne les options de base nécessaires à la fonction de recherche. | |||||
* | |||||
* @return array | |||||
*/ | |||||
public static function defaultOptionsSearch() { | |||||
return [ | |||||
'with' => [], | |||||
'join_with' => [], | |||||
'orderby' => 'order ASC', | |||||
'attribute_id_producer' => 'product.id_producer' | |||||
] ; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public static function tableName() | |||||
{ | |||||
return 'product'; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function rules() | |||||
{ | |||||
return [ | |||||
[['name', 'id_producer', 'id_tax_rate'], 'required'], | |||||
[['active', 'order', 'quantity_max', 'id_producer', 'id_tax_rate'], 'integer'], | |||||
[['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday', 'unavailable', 'apply_distributions'], 'boolean'], | |||||
[['price', 'weight', 'step'], 'number'], | |||||
[['photo'], 'file'], | |||||
[['name', 'description', 'photo', 'unit'], 'string', 'max' => 255], | |||||
[['recipe'], 'string', 'max' => 1000], | |||||
['step', 'required', 'message' => 'Champs obligatoire', 'when' => function ($model) { | |||||
if ($model->unit != 'piece') { | |||||
return true; | |||||
} | |||||
return false; | |||||
}], | |||||
]; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function attributeLabels() | |||||
{ | |||||
return [ | |||||
'id' => 'ID', | |||||
'name' => 'Nom', | |||||
'description' => 'Description', | |||||
'active' => 'Actif', | |||||
'photo' => 'Photo', | |||||
'price' => 'Prix (€)', | |||||
'weight' => 'Poids', | |||||
'recipe' => 'Recette', | |||||
'monday' => 'Lundi', | |||||
'tuesday' => 'Mardi', | |||||
'wednesday' => 'Mercredi', | |||||
'thursday' => 'Jeudi', | |||||
'friday' => 'Vendredi', | |||||
'saturday' => 'Samedi', | |||||
'sunday' => 'Dimanche', | |||||
'order' => 'Ordre', | |||||
'quantity_max' => 'Quantité max par défaut', | |||||
'unavailable' => 'Épuisé', | |||||
'apply_distributions' => 'Appliquer ces modifications dans les distributions futures', | |||||
'unit' => 'Unité', | |||||
'step' => 'Pas', | |||||
'id_tax_rate' => 'TVA' | |||||
]; | |||||
} | |||||
/** | |||||
* Retourne la description du produit. | |||||
* | |||||
* @return string | |||||
*/ | |||||
public function getDescription() | |||||
{ | |||||
$description = $this->description; | |||||
if (isset($this->weight) && is_numeric($this->weight) && $this->weight > 0) { | |||||
if ($this->weight >= 1000) { | |||||
$description .= ' (' . ($this->weight / 1000) . 'kg)'; | |||||
} else { | |||||
$description .= ' (' . $this->weight . 'g)'; | |||||
} | |||||
public function getProductDistribution() | |||||
{ | |||||
return $this->hasMany(ProductDistribution::className(), ['id_product' => 'id']); | |||||
} | } | ||||
return $description; | |||||
} | |||||
/** | |||||
* Retourne le libellé (admin) du produit. | |||||
* @return type | |||||
*/ | |||||
public function getStrWordingAdmin() | |||||
{ | |||||
return $this->name; | |||||
} | |||||
public function getProductSubscription() | |||||
{ | |||||
return $this->hasMany(ProductSubscription::className(), ['id_product' => 'id']); | |||||
} | |||||
public function getTaxRate() | |||||
{ | |||||
return $this->hasOne(TaxRate::className(), ['id' => 'id_tax_rate']); | |||||
} | |||||
/** | |||||
* Enregistre le produit. | |||||
* | |||||
* @param boolean $runValidation | |||||
* @param array $attributeNames | |||||
* @return boolean | |||||
*/ | |||||
public function save($runValidation = true, $attributeNames = NULL) | |||||
{ | |||||
$this->id_producer = Producer::getId(); | |||||
return parent::save($runValidation, $attributeNames); | |||||
} | |||||
/** | |||||
* Retourne les options de base nécessaires à la fonction de recherche. | |||||
* | |||||
* @return array | |||||
*/ | |||||
public static function defaultOptionsSearch() | |||||
{ | |||||
return [ | |||||
'with' => ['taxRate'], | |||||
'join_with' => [], | |||||
'orderby' => 'order ASC', | |||||
'attribute_id_producer' => 'product.id_producer' | |||||
]; | |||||
} | |||||
/** | |||||
* Retourne les produits d'une production donnée. | |||||
* | |||||
* @param integer $idDistribution | |||||
* @return array | |||||
*/ | |||||
public static function searchByDistribution($idDistribution) | |||||
{ | |||||
return Product::find() | |||||
->leftJoin('product_distribution', 'product.id = product_distribution.id_product') | |||||
->where([ | |||||
'id_producer' => Producer::getId(), | |||||
'product_distribution.id_distribution' => $idDistribution | |||||
]) | |||||
->orderBy('product_distribution.active DESC, product.order ASC') | |||||
->all(); | |||||
} | |||||
/** | |||||
* Retourne la description du produit. | |||||
* | |||||
* @return string | |||||
*/ | |||||
public function getDescription() | |||||
{ | |||||
$description = $this->description; | |||||
if (isset($this->weight) && is_numeric($this->weight) && $this->weight > 0) { | |||||
if ($this->weight >= 1000) { | |||||
$description .= ' (' . ($this->weight / 1000) . 'kg)'; | |||||
} else { | |||||
$description .= ' (' . $this->weight . 'g)'; | |||||
} | |||||
} | |||||
return $description; | |||||
} | |||||
/** | |||||
* Retourne le nombre de produits du producteur courant. | |||||
* | |||||
* @return integer | |||||
*/ | |||||
public static function count() | |||||
{ | |||||
return self::searchCount() ; | |||||
} | |||||
/** | |||||
* Retourne le produit "Don". | |||||
* | |||||
* @return Product | |||||
*/ | |||||
public static function getProductGift() | |||||
{ | |||||
$productGift = Product::find() | |||||
->where([ | |||||
'product.id_producer' => 0 | |||||
]) | |||||
->andFilterWhere(['like','product.name','Don']) | |||||
->one() ; | |||||
return $productGift ; | |||||
} | |||||
/** | |||||
* Retourne le libellé d'une unité. | |||||
* | |||||
* @param $format wording_unit, wording, short | |||||
* @param $unitInDb Unité stockée en base de données (ex: si g > kg, si mL > L) | |||||
* @return $string Libellé de l'unité | |||||
*/ | |||||
public static function strUnit($unit, $format = 'wording_short', $unitInDb = false) | |||||
{ | |||||
$strUnit = '' ; | |||||
if($unitInDb) { | |||||
if($unit == 'g') { | |||||
$unit = 'kg' ; | |||||
} | |||||
if($unit == 'mL') { | |||||
$unit = 'L' ; | |||||
} | |||||
/** | |||||
* Retourne le libellé (admin) du produit. | |||||
* @return type | |||||
*/ | |||||
public function getStrWordingAdmin() | |||||
{ | |||||
return $this->name; | |||||
} | } | ||||
if(isset(self::$unitsArray[$unit]) && isset(self::$unitsArray[$unit][$format])) { | |||||
$strUnit = self::$unitsArray[$unit][$format] ; | |||||
/** | |||||
* Enregistre le produit. | |||||
* | |||||
* @param boolean $runValidation | |||||
* @param array $attributeNames | |||||
* @return boolean | |||||
*/ | |||||
public function save($runValidation = true, $attributeNames = NULL) | |||||
{ | |||||
$this->id_producer = Producer::getId(); | |||||
return parent::save($runValidation, $attributeNames); | |||||
} | |||||
/** | |||||
* Retourne les produits d'une production donnée. | |||||
* | |||||
* @param integer $idDistribution | |||||
* @return array | |||||
*/ | |||||
public static function searchByDistribution($idDistribution) | |||||
{ | |||||
return Product::find() | |||||
->leftJoin('product_distribution', 'product.id = product_distribution.id_product') | |||||
->where([ | |||||
'id_producer' => Producer::getId(), | |||||
'product_distribution.id_distribution' => $idDistribution | |||||
]) | |||||
->orderBy('product_distribution.active DESC, product.order ASC') | |||||
->all(); | |||||
} | |||||
/** | |||||
* Retourne le nombre de produits du producteur courant. | |||||
* | |||||
* @return integer | |||||
*/ | |||||
public static function count() | |||||
{ | |||||
return self::searchCount(); | |||||
} | |||||
/** | |||||
* Retourne le produit "Don". | |||||
* | |||||
* @return Product | |||||
*/ | |||||
public static function getProductGift() | |||||
{ | |||||
$productGift = Product::find() | |||||
->where([ | |||||
'product.id_producer' => 0 | |||||
]) | |||||
->andFilterWhere(['like', 'product.name', 'Don']) | |||||
->one(); | |||||
return $productGift; | |||||
} | |||||
/** | |||||
* Retourne le libellé d'une unité. | |||||
* | |||||
* @param $format wording_unit, wording, short | |||||
* @param $unitInDb Unité stockée en base de données (ex: si g > kg, si mL > L) | |||||
* @return $string Libellé de l'unité | |||||
*/ | |||||
public static function strUnit($unit, $format = 'wording_short', $unitInDb = false) | |||||
{ | |||||
$strUnit = ''; | |||||
if ($unitInDb) { | |||||
if ($unit == 'g') { | |||||
$unit = 'kg'; | |||||
} | |||||
if ($unit == 'mL') { | |||||
$unit = 'L'; | |||||
} | |||||
} | |||||
if (isset(self::$unitsArray[$unit]) && isset(self::$unitsArray[$unit][$format])) { | |||||
$strUnit = self::$unitsArray[$unit][$format]; | |||||
} | |||||
return $strUnit; | |||||
} | } | ||||
return $strUnit ; | |||||
} | |||||
} | } |