@@ -26,5 +26,7 @@ phpunit.phar | |||
# local phpunit config | |||
/phpunit.xml | |||
*/.git | |||
vendor/* | |||
*/.git | |||
common/config/bootstrap.php |
@@ -110,6 +110,8 @@ class ProductController extends BackendController | |||
$model->active = 1; | |||
$model->id_producer = Producer::getId(); | |||
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() ; |
@@ -38,6 +38,7 @@ termes. | |||
namespace backend\controllers; | |||
use common\models\TaxRate; | |||
use Yii; | |||
use common\models\User; | |||
use yii\web\NotFoundHttpException; | |||
@@ -49,7 +50,7 @@ use yii\data\ActiveDataProvider; | |||
use common\models\Invoice; | |||
/** | |||
* UserController implements the CRUD actions for User model. | |||
* TaxRateAdminController implements the CRUD actions for TaxRate model. | |||
*/ | |||
class TaxRateAdminController extends BackendController | |||
{ | |||
@@ -85,17 +86,12 @@ class TaxRateAdminController extends BackendController | |||
*/ | |||
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', [ | |||
'dataProviderProducer' => $dataProviderProducer, | |||
'dataProviderTaxRate' => $dataProviderTaxRate, | |||
]); | |||
} | |||
@@ -106,10 +102,10 @@ class TaxRateAdminController extends BackendController | |||
*/ | |||
public function actionCreate() | |||
{ | |||
$model = new Producer(); | |||
$model = new TaxRate(); | |||
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']); | |||
} else { | |||
return $this->render('create', [ | |||
@@ -118,78 +114,4 @@ class TaxRateAdminController extends BackendController | |||
} | |||
} | |||
/** | |||
* 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.'); | |||
} | |||
} | |||
} |
@@ -70,6 +70,8 @@ termes. | |||
['label' => 'Administration', 'options' => ['class' => 'header'], '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' => 'Outils', 'options' => ['class' => 'header'], 'visible' => User::isCurrentAdmin()], |
@@ -40,7 +40,7 @@ use yii\helpers\Html; | |||
use yii\bootstrap\ActiveForm; | |||
use common\models\Product; | |||
use yii\helpers\ArrayHelper ; | |||
use common\models\TaxRate; | |||
/* @var $this yii\web\View */ | |||
/* @var $model app\models\Produit */ | |||
/* @var $form yii\widgets\ActiveForm */ | |||
@@ -69,6 +69,7 @@ use yii\helpers\ArrayHelper ; | |||
<?= $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, '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') | |||
->hint('Renseignez ce champs si vous souhaitez limiter la quantité commandable pour une distribution.') | |||
->textInput() ?> |
@@ -1,128 +1,138 @@ | |||
<?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\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> | |||
<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> |
@@ -41,19 +41,16 @@ use yii\widgets\ActiveForm; | |||
use yii\helpers\ArrayHelper ; | |||
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') ; | |||
?> | |||
<div class="producer-create"> | |||
<div class="tax-create"> | |||
<?php $form = ActiveForm::begin(); ?> | |||
<?= $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"> | |||
<?= Html::submitButton('Ajouter', ['class' => 'btn btn-success']) ?> | |||
</div> |
@@ -42,128 +42,21 @@ use common\models\User ; | |||
use common\models\Producer ; | |||
use common\models\Distribution ; | |||
$this->setTitle('Producteurs') ; | |||
$this->setTitle('Taxes') ; | |||
$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([ | |||
'dataProvider' => $dataProviderProducer, | |||
'dataProvider' => $dataProviderTaxRate, | |||
'columns' => [ | |||
'name', | |||
[ | |||
'attribute' => 'date_creation', | |||
'format' => 'raw', | |||
'attribute' => 'pourcent', | |||
'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']) ; | |||
} | |||
], | |||
] | |||
], | |||
]); ?> |
@@ -49,11 +49,12 @@ if($serverName == 'localhost') { | |||
$domainName = 'localhost' ; | |||
} | |||
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('@baseUrl', ($serverName == 'localhost') ? '/distrib/' : '/'); | |||
Yii::setAlias('@baseUrl', ($serverName == 'localhost') ? '/www/projets/distrib/' : '/'); | |||
Yii::setAlias('@baseUrlFrontend', (($serverName == 'localhost') ? '/frontend/web' : '')); | |||
Yii::setAlias('@baseUrlBackend', (($serverName == 'localhost') ? '/backend/web' : '')); | |||
Yii::setAlias('@baseUrlProducer', (($serverName == 'localhost') ? '/producer/web' : '')); |
@@ -1,45 +1,45 @@ | |||
<?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; | |||
use Yii; | |||
use common\components\ActiveRecordCommon ; | |||
use common\components\ActiveRecordCommon; | |||
/** | |||
* This is the model class for table "product". | |||
@@ -57,240 +57,247 @@ use common\components\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 ; | |||
} | |||
} |