Browse Source

Adaptations prix spécifiques

refactoring
Guillaume 3 years ago
parent
commit
87680db88a
29 changed files with 1056 additions and 49 deletions
  1. +43
    -5
      backend/controllers/DocumentController.php
  2. +57
    -2
      backend/controllers/UserController.php
  3. +179
    -0
      backend/controllers/UserGroupController.php
  4. +2
    -2
      backend/views/delivery-note/index.php
  5. +13
    -1
      backend/views/document/_form.php
  6. +10
    -1
      backend/views/layouts/left.php
  7. +2
    -2
      backend/views/point-sale/_form.php
  8. +2
    -1
      backend/views/product/update/prices/_form.php
  9. +24
    -10
      backend/views/product/update/prices/list.php
  10. +63
    -0
      backend/views/user-group/_form.php
  11. +52
    -0
      backend/views/user-group/create.php
  12. +75
    -0
      backend/views/user-group/index.php
  13. +52
    -0
      backend/views/user-group/update.php
  14. +10
    -2
      backend/views/user/_form.php
  15. +2
    -1
      backend/views/user/update.php
  16. +8
    -4
      backend/web/css/screen.css
  17. +2
    -1
      backend/web/sass/user/_form.scss
  18. +3
    -1
      common/models/Document.php
  19. +24
    -2
      common/models/Order.php
  20. +23
    -4
      common/models/Product.php
  21. +8
    -2
      common/models/ProductOrder.php
  22. +17
    -5
      common/models/ProductPrice.php
  23. +29
    -3
      common/models/User.php
  24. +108
    -0
      common/models/UserGroup.php
  25. +84
    -0
      common/models/UserGroupSearch.php
  26. +100
    -0
      common/models/UserUserGroup.php
  27. +30
    -0
      console/migrations/m210303_081449_add_table_group_user.php
  28. +17
    -0
      console/migrations/m210303_090805_add_group_user_specific_prices.php
  29. +17
    -0
      console/migrations/m210303_095445_add_product_order_invoice_price.php

+ 43
- 5
backend/controllers/DocumentController.php View File

namespace backend\controllers; namespace backend\controllers;


use common\models\DeliveryNote; use common\models\DeliveryNote;
use common\models\PointSale;
use common\models\Product; use common\models\Product;
use common\models\User; use common\models\User;
use common\models\Document; use common\models\Document;
use common\helpers\GlobalParam; use common\helpers\GlobalParam;
use common\models\Order; use common\models\Order;
use common\models\UserProducer;
use yii\base\UserException; use yii\base\UserException;
use yii; use yii;


], [ ], [
'id_delivery_note' => $idDeliveryNote 'id_delivery_note' => $idDeliveryNote
]) ; ]) ;

// mise à jour des prix facturés
$ordersArray = Order::searchAll([
'id_invoice' => $model->id
], [
'join_with' => ['distribution', 'user', 'user.userUserGroup', 'user.userProducer', 'pointSale', 'productOrder', 'productOrder.product', 'productOrder.product.productPrice']
]) ;

foreach($ordersArray as $order) {
$userProducer = UserProducer::searchOne([
'id_user' => $model->id_user,
'id_producer' => $order->distribution->id_producer,
]) ;
foreach($order->productOrder as $productOrder) {
if($productOrder->product) {
$productOrder->invoice_price = $productOrder->product->getPrice([
'user' => $model->user,
'user_producer' => $userProducer,
'point_sale' => $order->pointSale
]) ;
$productOrder->save() ;
}
}
}
} }
} }
} }
$json['delivery_notes'][] = array_merge( $json['delivery_notes'][] = array_merge(
$deliveryNote->getAttributes(), $deliveryNote->getAttributes(),
[ [
'total' => $deliveryNote->getAmountWithTax()
'total' => $deliveryNote->getAmountWithTax(Order::INVOICE_AMOUNT_TOTAL)
] ]
) ; ) ;
} }
); );
} }


$userProducer = UserProducer::searchOne([
'id_user' => $document->user->id,
'id_producer' => GlobalParam::getCurrentProducerId()
]) ;
$pointSale = PointSale::searchOne([
'id_user' => $document->user->id
]) ;

return [ return [
'return' => 'success', 'return' => 'success',
'tax_rate_producer' => GlobalParam::getCurrentProducer()->taxRate->value, 'tax_rate_producer' => GlobalParam::getCurrentProducer()->taxRate->value,
'class' => $document->getClass() 'class' => $document->getClass()
]), ]),
'id_user' => $document->user->id, 'id_user' => $document->user->id,
'products' => ArrayHelper::map($productsArray, 'id', function ($product) {
'products' => ArrayHelper::map($productsArray, 'id', function ($product) use ($document, $userProducer, $pointSale) {
return array_merge($product->getAttributes(), [ return array_merge($product->getAttributes(), [
'price_with_tax' => $product->price_with_tax,
'price_with_tax' => $product->getPriceWithTax([
'user' => $document->user,
'user_producer' => $userProducer,
'point_sale' => $pointSale,
]),
'wording_unit' => $product->wording_unit, 'wording_unit' => $product->wording_unit,
'tax_rate' => $product->taxRate->value 'tax_rate' => $product->taxRate->value
]); ]);
}), }),
'orders' => $ordersArray, 'orders' => $ordersArray,
'total' => $document->getAmount(Order::AMOUNT_TOTAL),
'total_with_tax' => $document->getAmountWithTax(Order::AMOUNT_TOTAL),
'total' => ($document->getClass() == 'Invoice' || $document->getClass() == 'DeliveryNote') ? $document->getAmount(Order::INVOICE_AMOUNT_TOTAL) : $document->getAmount(Order::AMOUNT_TOTAL),
'total_with_tax' => ($document->getClass() == 'Invoice' || $document->getClass() == 'DeliveryNote') ? $document->getAmountWithTax(Order::INVOICE_AMOUNT_TOTAL) : $document->getAmountWithTax(Order::AMOUNT_TOTAL),
]; ];
} }
} }

+ 57
- 2
backend/controllers/UserController.php View File

use common\models\Producer; use common\models\Producer;
use common\models\Distribution; use common\models\Distribution;
use backend\models\MailForm; use backend\models\MailForm;
use common\models\UserGroup;
use common\models\UserProducer; use common\models\UserProducer;
use common\models\UserPointSale; use common\models\UserPointSale;
use common\models\PointSale; use common\models\PointSale;
use common\models\UserUserGroup;


/** /**
* UserController implements the CRUD actions for User model. * UserController implements the CRUD actions for User model.


public function initForm($model) public function initForm($model)
{ {
// init points de vente sélectionnés
if ($model->id) { if ($model->id) {
// init points de vente sélectionnés
$userPointSaleArray = UserPointSale::searchAll([ $userPointSaleArray = UserPointSale::searchAll([
'id_user' => $model->id 'id_user' => $model->id
]); ]);
} }
} }


// init groupes d'utilisateurs sélectionnés
$userUserGroupsArray = UserUserGroup::searchAll([
'id_user' => $model->id
]);
if ($userUserGroupsArray && count($userUserGroupsArray) > 0) {
foreach ($userUserGroupsArray as $userUserGroup) {
$model->user_groups[] = $userUserGroup->id_user_group;
}
}

// product price percent
$userProducer = UserProducer::searchOne([ $userProducer = UserProducer::searchOne([
'id_producer' => GlobalParam::getCurrentProducerId(), 'id_producer' => GlobalParam::getCurrentProducerId(),
'id_user' => $model->id 'id_user' => $model->id
}]) }])
->all(); ->all();


// groupes d'utilisateurs
$userGroupsArray = UserGroup::find()
->where([
'id_producer' => GlobalParam::getCurrentProducerId(),
])
->all();

return [ return [
'pointsSaleArray' => $pointsSaleArray
'pointsSaleArray' => $pointsSaleArray,
'userGroupsArray' => $userGroupsArray,
]; ];
} }


if ($userExist) { if ($userExist) {
Producer::addUser($userExist->id, GlobalParam::getCurrentProducerId()) ; Producer::addUser($userExist->id, GlobalParam::getCurrentProducerId()) ;
$this->processLinkPointSale($userExist); $this->processLinkPointSale($userExist);
$this->processLinkUserGroup($userExist);
Yii::$app->getSession()->setFlash('success', "L'utilisateur que vous souhaitez créer possède déjà un compte sur la plateforme. Il vient d'être lié à votre établissement."); Yii::$app->getSession()->setFlash('success', "L'utilisateur que vous souhaitez créer possède déjà un compte sur la plateforme. Il vient d'être lié à votre établissement.");
} }
else { else {


$model->sendMailWelcome($password); $model->sendMailWelcome($password);
$this->processLinkPointSale($model); $this->processLinkPointSale($model);
$this->processLinkUserGroup($model);
$this->processProductPricePercent($model) ; $this->processProductPricePercent($model) ;


Yii::$app->getSession()->setFlash('success', 'Utilisateur créé.'); Yii::$app->getSession()->setFlash('success', 'Utilisateur créé.');
$model->sendMailWelcome($password); $model->sendMailWelcome($password);
} }
$this->processLinkPointSale($model); $this->processLinkPointSale($model);
$this->processLinkUserGroup($model);
$this->processProductPricePercent($model) ; $this->processProductPricePercent($model) ;
Yii::$app->getSession()->setFlash('success', 'Utilisateur modifié.'); Yii::$app->getSession()->setFlash('success', 'Utilisateur modifié.');
} }
} }
} }


/**
* Lie un utilisateur aux groupes d'utilisateurs sélectionnés.
*
* @param User $modelUser
*/
public function processLinkUserGroup($modelUser)
{
$posts = Yii::$app->request->post();
UserUserGroup::deleteAll([
'id_user' => $modelUser->id
]);

if (is_array($modelUser->user_groups) && count($modelUser->user_groups) > 0) {
foreach ($modelUser->user_groups as $userGroupId) {

$userUserGroup = UserUserGroup::searchOne([
'id_user' => $modelUser->id,
'id_user_group' => $userGroupId
]);

if (!$userUserGroup) {
$userUserGroup = new UserUserGroup();
$userUserGroup->id_user = $modelUser->id;
$userUserGroup->id_user_group = $userGroupId;
$userUserGroup->save();
}
}
}
}

public function processProductPricePercent($model) public function processProductPricePercent($model)
{ {
$userProducer = UserProducer::searchOne([ $userProducer = UserProducer::searchOne([

+ 179
- 0
backend/controllers/UserGroupController.php View File

<?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.
*/

namespace backend\controllers;

use common\helpers\GlobalParam;
use common\models\UserGroup;
use common\models\UserUserGroup;
use Yii;
use yii\filters\AccessControl;
use common\models\PointSale;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;
use common\models\User;
use common\models\UserPointSale;
use common\models\Order;
use common\models\Producer;
use common\models\Distribution;
use yii\helpers\Html;

/**
* PointVenteController implements the CRUD actions for PointVente model.
*/
class UserGroupController extends BackendController
{

public function behaviors()
{
return [
'verbs' => [
'class' => VerbFilter::className(),
'actions' => [
],
],
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'allow' => true,
'roles' => ['@'],
'matchCallback' => function ($rule, $action) {
return User::hasAccessBackend();
}
],
],
],
];
}

/**
* Liste les points de vente.
*
* @return mixed
*/
public function actionIndex()
{
$searchModel = new UserGroupSearch();
$dataProvider = $searchModel->search(Yii::$app->request->queryParams);

return $this->render('index', [
'searchModel' => $searchModel,
'dataProvider' => $dataProvider,
]);
}

/**
* Crée un groupe d'utilisateur.
*
* @return mixed
*/
public function actionCreate()
{
$model = new UserGroup();

$model->id_producer = GlobalParam::getCurrentProducerId() ;

if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->getSession()->setFlash('success', "Groupe d'utilisateur ajouté.");
return $this->redirect(['index']);
}
else {
return $this->render('create', [
'model' => $model,
]);
}
}

/**
* Modifie un groupe d'utilisateur.
*
* @param integer $id
* @return mixed
*/
public function actionUpdate($id)
{
$model = $this->findModel($id);

if ($model->load(Yii::$app->request->post()) && $model->save()) {
Yii::$app->getSession()->setFlash('success', "Groupe d'utilisateur modifié.");
return $this->redirect(['index']);
}
else {
return $this->render('update', [
'model' => $model,
]);
}
}

/**
* Supprime un groupe d'utilisateur.
*
* @param integer $id
* @return mixed
*/
public function actionDelete($id)
{
$userGroup = $this->findModel($id);

$userGroup->delete();
UserUserGroup::deleteAll(['id_user_group' => $id]);
Yii::$app->getSession()->setFlash('success', 'Groupe d\'utilisateur <strong>' . Html::encode($userGroup->name) . '</strong> supprimé.');

return $this->redirect(['index']);
}

/**
* Recherche un groupe d'utilisateur en fonction de son ID.
*
* @param integer $id
* @return UserGroup
* @throws NotFoundHttpException si le modèle n'est pas trouvé
*/
protected function findModel($id)
{
if (($model = UserGroup::findOne($id)) !== null) {
return $model;
} else {
throw new NotFoundHttpException('The requested page does not exist.');
}
}

}

+ 2
- 2
backend/views/delivery-note/index.php View File

[ [
'attribute' => 'amount', 'attribute' => 'amount',
'header' => 'Montant', 'header' => 'Montant',
'value' => function($invoice) {
return $invoice->getAmountWithTax(Order::AMOUNT_TOTAL, true) ;
'value' => function($deliveryNote) {
return $deliveryNote->getAmountWithTax(Order::INVOICE_AMOUNT_TOTAL, true) ;
} }
], ],
[ [

+ 13
- 1
backend/views/document/_form.php View File

<li v-if="order.point_sale_name">{{ order.point_sale_name }}</li> <li v-if="order.point_sale_name">{{ order.point_sale_name }}</li>
</ul> </ul>
</td> </td>
<td class="col-md-2">{{ formatPrice(productOrder.price) }}</td>
<td class="col-md-2">
<span v-if="(document.class == 'Invoice' || document.class == 'DeliveryNote') && productOrder.invoice_price">
{{ formatPrice(productOrder.invoice_price) }}
</span>
<span v-else>
{{ formatPrice(productOrder.price) }}
</span>
</td>
<td class="col-md-2">{{ productOrder.quantity }}</td> <td class="col-md-2">{{ productOrder.quantity }}</td>
<td class="col-md-1" v-if="taxRateProducer != 0"> <td class="col-md-1" v-if="taxRateProducer != 0">
{{ productsArray[productOrder.id_product].tax_rate * 100 }} % {{ productsArray[productOrder.id_product].tax_rate * 100 }} %
</td> </td>
<td class="col-md-2"> <td class="col-md-2">
<span v-if="(document.class == 'Invoice' || document.class == 'DeliveryNote') && productOrder.invoice_price">
{{ formatPrice(productOrder.quantity * productOrder.invoice_price) }}
</span>
<span v-else-if="document.class == 'Quotation'">
{{ formatPrice(productOrder.quantity * productOrder.price) }} {{ formatPrice(productOrder.quantity * productOrder.price) }}
</span>
</td> </td>
<td class="col-md-1"> <td class="col-md-1">
<a class="btn btn-default" @click="deleteProductOrder(productOrder.id)"> <a class="btn btn-default" @click="deleteProductOrder(productOrder.id)">

+ 10
- 1
backend/views/layouts/left.php View File

['label' => 'Distributions','icon' => 'calendar','url' => ['/distribution/index'], 'visible' => User::isCurrentProducer()], ['label' => 'Distributions','icon' => 'calendar','url' => ['/distribution/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Produits','icon' => 'clone','url' => ['/product/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'product'], ['label' => 'Produits','icon' => 'clone','url' => ['/product/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'product'],
['label' => 'Points de vente','icon' => 'map-marker','url' => ['/point-sale/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'point-sale'], ['label' => 'Points de vente','icon' => 'map-marker','url' => ['/point-sale/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'point-sale'],
['label' => 'Utilisateurs','icon' => 'users','url' => ['/user/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'user'],
//['label' => 'Utilisateurs','icon' => 'users','url' => ['/user/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'user'],
[
'label' => 'Utilisateurs',
'icon' => 'users',
'url' => '#',
'items' => [
['label' => 'Liste','icon' => 'th-list','url' => ['/user/index'], 'visible' => User::isCurrentProducer()],
['label' => 'Groupes','icon' => 'users','url' => ['/user-group/index'], 'visible' => User::isCurrentProducer()],
],
],
['label' => 'Abonnements','icon' => 'repeat','url' => ['/subscription/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'subscription'], ['label' => 'Abonnements','icon' => 'repeat','url' => ['/subscription/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'subscription'],
['label' => 'Paramètres','icon' => 'cog','url' => ['/producer/update'], 'visible' => User::isCurrentProducer()], ['label' => 'Paramètres','icon' => 'cog','url' => ['/producer/update'], 'visible' => User::isCurrentProducer()],
['label' => 'Communiquer','icon' => 'bullhorn','url' => ['/communicate/index'], 'visible' => User::isCurrentProducer()], ['label' => 'Communiquer','icon' => 'bullhorn','url' => ['/communicate/index'], 'visible' => User::isCurrentProducer()],

+ 2
- 2
backend/views/point-sale/_form.php View File

Producer::CREDIT_FUNCTIONING_USER => Producer::$creditFunctioningArray[Producer::CREDIT_FUNCTIONING_USER], Producer::CREDIT_FUNCTIONING_USER => Producer::$creditFunctioningArray[Producer::CREDIT_FUNCTIONING_USER],
], [])->hint(Producer::HINT_CREDIT_FUNCTIONING); ?> ], [])->hint(Producer::HINT_CREDIT_FUNCTIONING); ?>


<?= $form->field($model, 'product_price_percent')
->dropDownList(ProductPrice::percentValues(), [])->hint('Pourcentage appliqué aux prix de chaque produit dans ce point de vente.'); ?>
<?php /*$form->field($model, 'product_price_percent')
->dropDownList(ProductPrice::percentValues(), [])->hint('Pourcentage appliqué aux prix de chaque produit dans ce point de vente.');*/ ?>




<div id="delivery-days"> <div id="delivery-days">

+ 2
- 1
backend/views/product/update/prices/_form.php View File

]); ?> ]); ?>


<?= $form->field($model, 'id_user')->dropDownList(User::populateDropdownList()); ?> <?= $form->field($model, 'id_user')->dropDownList(User::populateDropdownList()); ?>
<?= $form->field($model, 'id_point_sale')->dropDownList(PointSale::populateDropdownList()) ?>
<?= $form->field($model, 'id_user_group')->dropDownList(UserGroup::populateDropdownList()); ?>
<?= $form->field($model, 'id_point_sale')->dropDownList(PointSale::populateDropdownList()); ?>


<?php <?php
$producer = GlobalParam::getCurrentProducer(); $producer = GlobalParam::getCurrentProducer();

+ 24
- 10
backend/views/product/update/prices/list.php View File

]) ; ]) ;
?> ?>


<div class="col-md-8">
<div class="col-md-12">


<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
'dataProvider' => $dataProvider, 'dataProvider' => $dataProvider,
'columns' => [ 'columns' => [
[ [
'attribute' => 'id_point_sale',
'attribute' => 'id_user',
'format' => 'raw', 'format' => 'raw',
'value' => function ($model) { 'value' => function ($model) {
if($model->pointSale) {
return $model->pointSale->name ;
if($model->user) {
return $model->user->getUsername() ;
} }
return '<span class="label label-success">Tous</span>' ; return '<span class="label label-success">Tous</span>' ;
} }
], ],
[ [
'attribute' => 'id_user',
'attribute' => 'id_user_group',
'format' => 'raw', 'format' => 'raw',
'value' => function ($model) { 'value' => function ($model) {
if($model->user) {
return $model->user->getUsername() ;
if($model->userGroup) {
return $model->userGroup->name ;
}
return '<span class="label label-success">Tous</span>' ;
}
],
[
'attribute' => 'id_point_sale',
'format' => 'raw',
'value' => function ($model) {
if($model->pointSale) {
return $model->pointSale->name ;
} }
return '<span class="label label-success">Tous</span>' ; return '<span class="label label-success">Tous</span>' ;
} }
</div> </div>
</div> </div>


<!--
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">Pourcentage global / Utilisateurs</h3> <h3 class="panel-title">Pourcentage global / Utilisateurs</h3>
</table> </table>
</div> </div>
</div> </div>
-->
<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">Prix de base</h3>
<h3 class="panel-title">Rappel du prix de base</h3>
</div> </div>
<div class="panel-body"> <div class="panel-body">
<p>Prix de base : <strong><?= Price::format($model->getPrice()); ?> HT</strong> / <strong><?= Price::format($model->getPriceWithTax()); ?> TTC</strong><br /></p> <p>Prix de base : <strong><?= Price::format($model->getPrice()); ?> HT</strong> / <strong><?= Price::format($model->getPriceWithTax()); ?> TTC</strong><br /></p>
</div> </div>
</div> </div>


<!--
<div class="col-md-4"> <div class="col-md-4">

<div class="panel panel-default"> <div class="panel panel-default">
<div class="panel-heading"> <div class="panel-heading">
<h3 class="panel-title">Priorités de résolution</h3> <h3 class="panel-title">Priorités de résolution</h3>
</p> </p>
</div> </div>
</div> </div>
</div>
</div>
-->

+ 63
- 0
backend/views/user-group/_form.php View File

<?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.
*/

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper;
use common\models\Producer;
use common\models\ProductPrice ;

/* @var $this yii\web\View */
/* @var $model backend\models\PointVente */
/* @var $form yii\widgets\ActiveForm */
?>

<div class="point-sale-form">

<?php $form = ActiveForm::begin(); ?>
<div class="col-md-8">
<?= $form->field($model, 'name')->textInput(['maxlength' => 255]) ?>
</div>
<div class="clr"></div>
<div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
</div>

<?php ActiveForm::end(); ?>

</div>

+ 52
- 0
backend/views/user-group/create.php View File

<?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.
*/

use yii\helpers\Html;


$this->setTitle("Ajouter un groupe d'utilisateur") ;
$this->addBreadcrumb(['label' => "Groupes d'utilisateurs", 'url' => ['index']]) ;
$this->addBreadcrumb('Ajouter') ;

?>

<div class="user-group-create">
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>

+ 75
- 0
backend/views/user-group/index.php View File

<?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.
*/

use yii\helpers\Html;
use yii\grid\GridView;
use common\models\PointVenteUser ;

$this->setTitle('Groupes d\'utilisateurs') ;
$this->addBreadcrumb($this->getTitle()) ;
$this->addButton(['label' => 'Nouveau groupe d\'utilisateur <span class="glyphicon glyphicon-plus"></span>', 'url' => 'user-group/create', 'class' => 'btn btn-primary']) ;

?>

<div class="point-sale-index">
<?= GridView::widget([
'filterModel' => $searchModel,
'dataProvider' => $dataProvider,
'columns' => [
'name',
[
'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>

+ 52
- 0
backend/views/user-group/update.php View File

<?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.
*/

use yii\helpers\Html;

$this->setTitle("Modifier un groupe d'utilisateur") ;
$this->addBreadcrumb(['label' => "Groupes d'utilisateurs", 'url' => ['index']]) ;
$this->addBreadcrumb(['label' => Html::encode($model->name), 'url' => ['update', 'id' => $model->id]]) ;
$this->addBreadcrumb('Modifier') ;

?>

<div class="user-group-update">
<?= $this->render('_form', [
'model' => $model,
]) ?>
</div>

+ 10
- 2
backend/views/user/_form.php View File

]); ]);
?> ?>


<?= $form->field($model, 'product_price_percent')
->dropDownList(ProductPrice::percentValues(), [])->hint('Pourcentage appliqué aux prix de chaque produit pour cet utilisateur.'); ?>
<?= $form->field($model, 'user_groups')->checkboxlist(
ArrayHelper::map($userGroupsArray, 'id', function ($userGroup) use ($model) {
return Html::encode($userGroup->name);
}), [
'encode' => false
]);
?>

<?php /* $form->field($model, 'product_price_percent')
->dropDownList(ProductPrice::percentValues(), [])->hint('Pourcentage appliqué aux prix de chaque produit pour cet utilisateur.');*/ ?>


<div class="form-group"> <div class="form-group">
<?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> <?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

+ 2
- 1
backend/views/user/update.php View File

<div class="user-update"> <div class="user-update">
<?= $this->render('_form', [ <?= $this->render('_form', [
'model' => $model, 'model' => $model,
'pointsSaleArray' => $pointsSaleArray
'pointsSaleArray' => $pointsSaleArray,
'userGroupsArray' => $userGroupsArray,
]) ?> ]) ?>
</div> </div>

+ 8
- 4
backend/web/css/screen.css View File

float: right; float: right;
} }


/* line 5, ../sass/user/_form.scss */
/* line 6, ../sass/user/_form.scss */
.user-create #user-points_sale label, .user-create #user-points_sale label,
.user-update #user-points_sale label {
.user-create #user-user_groups label,
.user-update #user-points_sale label,
.user-update #user-user_groups label {
font-weight: normal; font-weight: normal;
margin-right: 10px; margin-right: 10px;
cursor: pointer; cursor: pointer;
padding: 5px 10px; padding: 5px 10px;
border: solid 1px #e0e0e0; border: solid 1px #e0e0e0;
} }
/* line 13, ../sass/user/_form.scss */
/* line 14, ../sass/user/_form.scss */
.user-create #user-points_sale label .form-control, .user-create #user-points_sale label .form-control,
.user-update #user-points_sale label .form-control {
.user-create #user-user_groups label .form-control,
.user-update #user-points_sale label .form-control,
.user-update #user-user_groups label .form-control {
display: inline; display: inline;
width: 200px; width: 200px;
margin-left: 15px; margin-left: 15px;

+ 2
- 1
backend/web/sass/user/_form.scss View File



.user-create, .user-create,
.user-update { .user-update {
#user-points_sale {
#user-points_sale,
#user-user_groups {
label { label {
font-weight: normal ; font-weight: normal ;
margin-right: 10px ; margin-right: 10px ;

+ 3
- 1
common/models/Document.php View File



foreach ($ordersArray as $order) { foreach ($ordersArray as $order) {
$order->init(); $order->init();

if ($withTax) { if ($withTax) {
$amount += $order->getAmountWithTax($type); $amount += $order->getAmountWithTax($type);
} else {
}
else {
$amount += $order->getAmount($type); $amount += $order->getAmount($type);
} }
} }

+ 24
- 2
common/models/Order.php View File

{ {
var $amount = 0; var $amount = 0;
var $amount_with_tax = 0; var $amount_with_tax = 0;
var $invoice_amount = 0;
var $invoice_amount_with_tax = 0;
var $paid_amount = 0; var $paid_amount = 0;
var $weight = 0; var $weight = 0;


const PAYMENT_UNPAID = 'unpaid'; const PAYMENT_UNPAID = 'unpaid';
const PAYMENT_SURPLUS = 'surplus'; const PAYMENT_SURPLUS = 'surplus';


const INVOICE_AMOUNT_TOTAL = 'invoice-total' ;
const AMOUNT_TOTAL = 'total'; const AMOUNT_TOTAL = 'total';
const AMOUNT_PAID = 'paid'; const AMOUNT_PAID = 'paid';
const AMOUNT_REMAINING = 'remaining'; const AMOUNT_REMAINING = 'remaining';
{ {
$this->amount = 0; $this->amount = 0;
$this->amount_with_tax = 0; $this->amount_with_tax = 0;
$this->invoice_amount = 0;
$this->invoice_amount_with_tax = 0;
$this->weight = 0; $this->weight = 0;


if (isset($this->productOrder)) { if (isset($this->productOrder)) {
foreach ($this->productOrder as $productOrder) { foreach ($this->productOrder as $productOrder) {

$this->amount += $productOrder->price * $productOrder->quantity; $this->amount += $productOrder->price * $productOrder->quantity;
$this->amount_with_tax += Price::getPriceWithTax($productOrder->price, $productOrder->taxRate->value) * $productOrder->quantity; $this->amount_with_tax += Price::getPriceWithTax($productOrder->price, $productOrder->taxRate->value) * $productOrder->quantity;

$invoicePrice = $productOrder->invoice_price ? $productOrder->invoice_price : $productOrder->price ;
$this->invoice_amount += $invoicePrice * $productOrder->quantity;
$this->invoice_amount_with_tax += Price::getPriceWithTax($invoicePrice, $productOrder->taxRate->value) * $productOrder->quantity;

if ($productOrder->unit == 'piece') { if ($productOrder->unit == 'piece') {
if (isset($productOrder->product)) { if (isset($productOrder->product)) {
$this->weight += ($productOrder->quantity * $productOrder->product->weight) / 1000; $this->weight += ($productOrder->quantity * $productOrder->product->weight) / 1000;


public function getAmount($type = self::AMOUNT_TOTAL, $format = false) public function getAmount($type = self::AMOUNT_TOTAL, $format = false)
{ {
return $this->_getAmountGeneric($type, $this->amount, $format) ;
$amount = $this->amount ;
if($type == self::INVOICE_AMOUNT_TOTAL) {
$amount = $this->invoice_amount ;
}

return $this->_getAmountGeneric($type, $amount, $format) ;
} }


public function getAmountWithTax($type = self::AMOUNT_TOTAL, $format = false) public function getAmountWithTax($type = self::AMOUNT_TOTAL, $format = false)
{ {
return $this->_getAmountGeneric($type, $this->amount_with_tax, $format) ;
$amount = $this->amount_with_tax ;
if($type == self::INVOICE_AMOUNT_TOTAL) {
$amount = $this->invoice_amount_with_tax ;
}

return $this->_getAmountGeneric($type, $amount, $format) ;
} }


protected function _getAmountGeneric($type, $amountOrder, $format) protected function _getAmountGeneric($type, $amountOrder, $format)
{ {
switch ($type) { switch ($type) {
case self::AMOUNT_TOTAL : case self::AMOUNT_TOTAL :
case self::INVOICE_AMOUNT_TOTAL :
$amount = $amountOrder; $amount = $amountOrder;
break; break;
case self::AMOUNT_PAID : case self::AMOUNT_PAID :

+ 23
- 4
common/models/Product.php View File

'active' => 'Actif', 'active' => 'Actif',
'photo' => 'Photo', 'photo' => 'Photo',
'price' => 'Prix (€) TTC', 'price' => 'Prix (€) TTC',
'price' => 'Prix (€) TTC',
'weight' => 'Poids', 'weight' => 'Poids',
'recipe' => 'Recette', 'recipe' => 'Recette',
'monday' => 'Lundi', 'monday' => 'Lundi',
'user' => false, 'user' => false,
'pointsale' => false, 'pointsale' => false,
'user_pointsale' => false, 'user_pointsale' => false,
'usergroup' => false,
] ; ] ;


foreach($specificPrices as $specificPrice) { foreach($specificPrices as $specificPrice) {
if($user if($user
&& $specificPrice->id_user && !$specificPrice->id_point_sale
&& $specificPrice->id_user
&& !$specificPrice->id_point_sale
&& !$specificPrice->id_user_group
&& $specificPrice->id_user == $user->id) { && $specificPrice->id_user == $user->id) {


$specificPricesArray['user'] = $specificPrice->price ; $specificPricesArray['user'] = $specificPrice->price ;
} }
if($user
&& $specificPrice->id_user_group
&& !$specificPrice->id_point_sale
&& !$specificPrice->id_user
&& $user->belongsToUserGroup($specificPrice->id_user_group)) {

$specificPricesArray['usergroup'] = $specificPrice->price ;
}
if($pointSale if($pointSale
&& $specificPrice->id_point_sale && !$specificPrice->id_user
&& $specificPrice->id_point_sale
&& !$specificPrice->id_user
&& !$specificPrice->id_user_group
&& $specificPrice->id_point_sale == $pointSale->id) { && $specificPrice->id_point_sale == $pointSale->id) {


$specificPricesArray['pointsale'] = $specificPrice->price ; $specificPricesArray['pointsale'] = $specificPrice->price ;
} }


if($pointSale && $user if($pointSale && $user
&& $specificPrice->id_point_sale && $specificPrice->id_user
&& $specificPrice->id_point_sale == $pointSale->id && $specificPrice->id_user == $user->id) {
&& $specificPrice->id_point_sale
&& $specificPrice->id_user
&& $specificPrice->id_point_sale == $pointSale->id
&& $specificPrice->id_user == $user->id) {


$specificPricesArray['user_pointsale'] = $specificPrice->price ; $specificPricesArray['user_pointsale'] = $specificPrice->price ;
} }
elseif($specificPricesArray['user']) { elseif($specificPricesArray['user']) {
return $specificPricesArray['user'] ; return $specificPricesArray['user'] ;
} }
elseif($specificPricesArray['usergroup']) {
return $specificPricesArray['usergroup'] ;
}
elseif($specificPricesArray['pointsale']) { elseif($specificPricesArray['pointsale']) {
return $specificPricesArray['pointsale'] ; return $specificPricesArray['pointsale'] ;
} }

+ 8
- 2
common/models/ProductOrder.php View File

[['id_order', 'id_product', 'id_tax_rate'], 'integer'], [['id_order', 'id_product', 'id_tax_rate'], 'integer'],
[['unit'], 'string', 'max' => 255], [['unit'], 'string', 'max' => 255],
[['quantity'], 'number', 'min' => 0], [['quantity'], 'number', 'min' => 0],
[['price', 'invoice_price'], 'double'],
[['description'], 'safe'] [['description'], 'safe']
]; ];
} }
'quantity' => 'Quantité', 'quantity' => 'Quantité',
'unit' => 'Unité', 'unit' => 'Unité',
'id_tax_rate' => 'Taxe', 'id_tax_rate' => 'Taxe',
'description' => 'Description'
'description' => 'Description',
'price' => 'Prix',
'invoice_price' => 'Prix facturé',
]; ];
} }


return $this->price ; return $this->price ;
} }


public function getInvoicePrice() {
return $this->invoice_price ;
}

/** /**
* Retourne le prix du produit avec taxe * Retourne le prix du produit avec taxe
*/ */
public function getPriceWithTax() public function getPriceWithTax()
{ {

return Price::getPriceWithTax($this->price, $this->taxRate->value); return Price::getPriceWithTax($this->price, $this->taxRate->value);
} }



+ 17
- 5
common/models/ProductPrice.php View File

{ {
return [ return [
['id_user', 'required', 'when' => function($model) { ['id_user', 'required', 'when' => function($model) {
return !$model->id_point_sale ;
}, 'message' => 'Vous devez renseigner un utilisateur et/ou un point de vente'],
return !$model->id_point_sale && !$model->id_user_group ;
}, 'message' => 'Vous devez renseigner au moins un utilisateur, un point de vente ou un groupe d\'utilisateur'],
['id_point_sale', 'required', 'when' => function($model) { ['id_point_sale', 'required', 'when' => function($model) {
return !$model->id_user ;
}, 'message' => 'Vous devez renseigner un utilisateur et/ou un point de vente'],
return !$model->id_user && !$model->id_user_group ;
}, 'message' => 'Vous devez renseigner au moins un utilisateur, un point de vente ou un groupe d\'utilisateur'],
['id_user_group', 'required', 'when' => function($model) {
return !$model->id_user && !$model->id_point_sale ;
}, 'message' => 'Vous devez renseigner au moins un utilisateur, un point de vente ou un groupe d\'utilisateur'],
[['id_product', 'price'], 'required'], [['id_product', 'price'], 'required'],
[['id_product', 'id_user', 'id_point_sale', 'percent'], 'integer'],
[['id_product', 'id_user', 'id_point_sale', 'id_user_group', 'percent'], 'integer'],
[['price'], 'double'], [['price'], 'double'],
]; ];
} }
'id_product' => 'Produit', 'id_product' => 'Produit',
'id_user' => 'Utilisateur', 'id_user' => 'Utilisateur',
'id_point_sale' => 'Point de vente', 'id_point_sale' => 'Point de vente',
'id_user_group' => "Groupe d'utilisateur",
'price' => 'Prix (HT)', 'price' => 'Prix (HT)',
'percent' => 'Pourcentage', 'percent' => 'Pourcentage',
]; ];
); );
} }


public function getUserGroup()
{
return $this->hasOne(
UserGroup::className(),
['id' => 'id_user_group']
);
}

public function getUser() public function getUser()
{ {
return $this->hasOne( return $this->hasOne(

+ 29
- 3
common/models/User.php View File

var $password_new; var $password_new;
var $password_new_confirm; var $password_new_confirm;
var $points_sale = []; var $points_sale = [];
var $user_groups = [];
var $one_name ; var $one_name ;
var $product_price_percent ; var $product_price_percent ;


['password_old', 'verifyPasswordOld'], ['password_old', 'verifyPasswordOld'],
['password_new', 'verifyPasswordNew'], ['password_new', 'verifyPasswordNew'],
['password_new_confirm', 'verifyPasswordNewConfirm'], ['password_new_confirm', 'verifyPasswordNewConfirm'],
[['date_last_connection', 'password_old', 'password_new', 'password_new_confirm', 'password_hash', 'points_sale', 'product_price_percent'], 'safe'],
[['date_last_connection', 'password_old', 'password_new', 'password_new_confirm', 'password_hash', 'points_sale', 'product_price_percent', 'user_groups'], 'safe'],
]; ];
} }


'type' => 'Type', 'type' => 'Type',
'name_legal_person' => 'Libellé', 'name_legal_person' => 'Libellé',
'is_main_contact' => 'Contact principal', 'is_main_contact' => 'Contact principal',
'product_price_percent' => 'Prix produits : pourcentage'
'product_price_percent' => 'Prix produits : pourcentage',
'user_groups' => "Groupes d'utilisateurs"
]; ];
} }


{ {
return [ return [
'with' => [], 'with' => [],
'join_with' => ['userProducer'],
'join_with' => ['userProducer', 'userUserGroup'],
'orderby' => 'user.name ASC, user.lastname ASC', 'orderby' => 'user.name ASC, user.lastname ASC',
'attribute_id_producer' => '' 'attribute_id_producer' => ''
]; ];
return $this->hasMany(UserProducer::className(), ['id_user' => 'id']); return $this->hasMany(UserProducer::className(), ['id_user' => 'id']);
} }


public function getUserUserGroup()
{
return $this->hasMany(UserUserGroup::className(), ['id_user' => 'id']);
}

public function getOrder() public function getOrder()
{ {
return $this->hasMany(Order::className(), ['id_user' => 'id']); return $this->hasMany(Order::className(), ['id_user' => 'id']);
return User::getCurrentStatus() == USER::STATUS_ADMIN || User::getCurrentStatus() == USER::STATUS_PRODUCER; return User::getCurrentStatus() == USER::STATUS_ADMIN || User::getCurrentStatus() == USER::STATUS_PRODUCER;
} }


public function belongsToUserGroup($userGroupId)
{
if(!$this->userUserGroup) {
$this->userUserGroup = UserUserGroup::searchAll([
'id_user' => $this->id
]) ;
}

if($this->userUserGroup) {
foreach($this->userUserGroup as $userUserGroup) {
if($userUserGroup->id_user_group == $userGroupId) {
return true ;
}
}
}

return false ;
}



} }

+ 108
- 0
common/models/UserGroup.php View File

<?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.
*/

namespace common\models;

use common\helpers\GlobalParam;
use Yii;
use common\components\ActiveRecordCommon ;

/**
* This is the model class for table "user_group".
*
*/
class UserGroup extends ActiveRecordCommon
{

/**
* @inheritdoc
*/
public static function tableName()
{
return 'user_group';
}

/**
* @inheritdoc
*/
public function rules()
{
return [
[['name', 'id_producer'], 'required'],
[['name'], 'string'],
[['id_producer'], 'integer'],
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'name' => 'Nom',
];
}
/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch() {
return [
'with' => [],
'join_with' => [],
'orderby' => '',
'attribute_id_producer' => ''
] ;
}

public static function populateDropdownList()
{
$userGroupsArrayDropdown = ['' => '--'] ;
$userGroupsArray = UserGroup::find()->where('id_producer = ' . GlobalParam::getCurrentProducerId())->all() ;

foreach($userGroupsArray as $userGroup) {
$userGroupsArrayDropdown[$userGroup['id']] = $userGroup['name'] ;
}

return $userGroupsArrayDropdown ;
}

}

+ 84
- 0
common/models/UserGroupSearch.php View File

<?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.
*/

namespace common\models ;

use common\helpers\GlobalParam;
use common\models\UserGroup ;

class UserGroupSearch extends UserGroup
{
public function rules()
{
return [
[['name'], 'string'],
[['name'], 'string', 'max' => 255],
['id_producer', 'integer'],
];
}
public function search($params)
{
$optionsSearch = self::defaultOptionsSearch() ;
$query = UserGroup::find()
->with($optionsSearch['with'])
->innerJoinWith($optionsSearch['join_with'], true)
->where(['user_group.id_producer' => GlobalParam::getCurrentProducerId()])
;
$dataProvider = new ActiveDataProvider([
'query' => $query,
'sort' => ['attributes' => ['name']],
'pagination' => [
'pageSize' => 20,
],
]);
$this->load($params);
if (!$this->validate()) {
return $dataProvider;
}

$query->andFilterWhere(['like', 'user_group.name', $this->name]) ;
return $dataProvider;
}
}

+ 100
- 0
common/models/UserUserGroup.php View File

<?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.
*/

namespace common\models;

use Yii;
use common\components\ActiveRecordCommon ;

/**
* This is the model class for table "user_user_group".
*
*/
class UserUserGroup extends ActiveRecordCommon
{

/**
* @inheritdoc
*/
public static function tableName()
{
return 'user_user_group';
}

/**
* @inheritdoc
*/
public function rules()
{
return [
[['id_user', 'id_user_group'], 'required'],
[['id_user', 'id_user_group'], 'integer'],
];
}

/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id_user' => 'Utilisateur',
'id_user_group' => 'Groupe'
];
}
public function getPointSale()
{
return $this->hasOne(PointSale::className(), ['id' => 'id_point_sale']);
}
/**
* Retourne les options de base nécessaires à la fonction de recherche.
*
* @return array
*/
public static function defaultOptionsSearch() {
return [
'with' => [],
'join_with' => [],
'orderby' => '',
'attribute_id_producer' => ''
] ;
}

}

+ 30
- 0
console/migrations/m210303_081449_add_table_group_user.php View File

<?php

use yii\db\Migration;
use yii\db\Schema;

class m210303_081449_add_table_group_user extends Migration
{
public function up()
{
$this->createTable('user_group', [
'id' => 'pk',
'id_producer' => Schema::TYPE_INTEGER. ' NOT NULL',
'name' => Schema::TYPE_STRING . ' NOT NULL',
]);

$this->createTable('user_user_group', [
'id' => 'pk',
'id_user' => Schema::TYPE_INTEGER. ' NOT NULL',
'id_user_group' => Schema::TYPE_INTEGER. ' NOT NULL',
]);

}

public function down()
{
$this->dropTable('user_group');
$this->dropTable('user_user_group');
}

}

+ 17
- 0
console/migrations/m210303_090805_add_group_user_specific_prices.php View File

<?php

use yii\db\Migration;

class m210303_090805_add_group_user_specific_prices extends Migration
{
public function safeUp()
{
$this->addColumn('product_price', 'id_user_group', Schema::TYPE_INTEGER);
}

public function safeDown()
{
$this->dropColumn('product_price', 'id_user_group');
}

}

+ 17
- 0
console/migrations/m210303_095445_add_product_order_invoice_price.php View File

<?php

use yii\db\Migration;
use yii\db\Schema;

class m210303_095445_add_product_order_invoice_price extends Migration
{
public function safeUp()
{
$this->addColumn('product_order', 'invoice_price', Schema::TYPE_FLOAT. ' DEFAULT NULL') ;
}

public function safeDown()
{
$this->dropColumn('product_order', 'invoice_price') ;
}
}

Loading…
Cancel
Save