Bläddra i källkod

Merge branch 'feature/specific_prices' into dev

refactoring
Guillaume 3 år sedan
förälder
incheckning
e315a65ad7
34 ändrade filer med 1111 tillägg och 63 borttagningar
  1. +23
    -5
      backend/controllers/DistributionController.php
  2. +19
    -5
      backend/controllers/DocumentController.php
  3. +57
    -2
      backend/controllers/UserController.php
  4. +179
    -0
      backend/controllers/UserGroupController.php
  5. +2
    -2
      backend/views/delivery-note/index.php
  6. +18
    -2
      backend/views/document/_download_product_line.php
  7. +5
    -3
      backend/views/document/_form.php
  8. +11
    -4
      backend/views/document/download.php
  9. +1
    -1
      backend/views/invoice/index.php
  10. +10
    -1
      backend/views/layouts/left.php
  11. +2
    -2
      backend/views/point-sale/_form.php
  12. +2
    -1
      backend/views/product/update/prices/_form.php
  13. +24
    -10
      backend/views/product/update/prices/list.php
  14. +63
    -0
      backend/views/user-group/_form.php
  15. +52
    -0
      backend/views/user-group/create.php
  16. +75
    -0
      backend/views/user-group/index.php
  17. +52
    -0
      backend/views/user-group/update.php
  18. +10
    -2
      backend/views/user/_form.php
  19. +2
    -1
      backend/views/user/update.php
  20. +8
    -4
      backend/web/css/screen.css
  21. +15
    -0
      backend/web/js/vuejs/document-form.js
  22. +2
    -1
      backend/web/sass/user/_form.scss
  23. +8
    -1
      common/models/Document.php
  24. +38
    -2
      common/models/Order.php
  25. +23
    -4
      common/models/Product.php
  26. +8
    -2
      common/models/ProductOrder.php
  27. +17
    -5
      common/models/ProductPrice.php
  28. +29
    -3
      common/models/User.php
  29. +108
    -0
      common/models/UserGroup.php
  30. +84
    -0
      common/models/UserGroupSearch.php
  31. +100
    -0
      common/models/UserUserGroup.php
  32. +30
    -0
      console/migrations/m210303_081449_add_table_group_user.php
  33. +17
    -0
      console/migrations/m210303_090805_add_group_user_specific_prices.php
  34. +17
    -0
      console/migrations/m210303_095445_add_product_order_invoice_price.php

+ 23
- 5
backend/controllers/DistributionController.php Visa fil

@@ -1300,6 +1300,9 @@ class DistributionController extends BackendController

if($firstOrder->pointSale->id_user) {
$deliveryNote->id_user = $firstOrder->pointSale->id_user;
$user = User::searchOne([
'id' => $deliveryNote->id_user
]) ;
}
else {
$user = new User ;
@@ -1328,11 +1331,6 @@ class DistributionController extends BackendController
$deliveryNote->id_user = $user->id;
}

if(!isset($user)) {
$user = User::searchOne([
'id' => $deliveryNote->id_user
]) ;
}
$deliveryNote->address = $user->getFullAddress() ;
$deliveryNote->save();
}
@@ -1345,6 +1343,16 @@ class DistributionController extends BackendController
]) ;
}

if(!isset($user) || !$user) {
$user = User::searchOne([
'id' => $deliveryNote->id_user
]) ;
$userProducer = UserProducer::searchOne([
'id_user' => $deliveryNote->id_user,
'id_producer' => GlobalParam::getCurrentProducerId()
]) ;
}

// affectation du BL aux commandes
foreach ($idOrders as $idOrder) {
$order = Order::searchOne([
@@ -1354,6 +1362,16 @@ class DistributionController extends BackendController
$order->id_delivery_note = $deliveryNote->id;
$order->save();
}

// init invoice price
$order = Order::searchOne(['id' => $idOrder]) ;
if($order) {
$order->initInvoicePrices([
'user' => $user,
'user_producer' => $userProducer,
'point_sale' => $firstOrder->pointSale
]) ;
}
}

return [

+ 19
- 5
backend/controllers/DocumentController.php Visa fil

@@ -39,11 +39,13 @@
namespace backend\controllers;

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

@@ -249,7 +251,7 @@ class DocumentController extends BackendController
$json['delivery_notes'][] = array_merge(
$deliveryNote->getAttributes(),
[
'total' => $deliveryNote->getAmountWithTax()
'total' => $deliveryNote->getAmountWithTax(Order::INVOICE_AMOUNT_TOTAL)
]
) ;
}
@@ -347,6 +349,14 @@ class DocumentController extends BackendController
);
}

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

return [
'return' => 'success',
'tax_rate_producer' => GlobalParam::getCurrentProducer()->taxRate->value,
@@ -355,16 +365,20 @@ class DocumentController extends BackendController
'class' => $document->getClass()
]),
'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(), [
'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,
'tax_rate' => $product->taxRate->value
]);
}),
'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 Visa fil

@@ -43,9 +43,11 @@ use common\models\User;
use common\models\Producer;
use common\models\Distribution;
use backend\models\MailForm;
use common\models\UserGroup;
use common\models\UserProducer;
use common\models\UserPointSale;
use common\models\PointSale;
use common\models\UserUserGroup;

/**
* UserController implements the CRUD actions for User model.
@@ -117,8 +119,9 @@ class UserController extends BackendController

public function initForm($model)
{
// init points de vente sélectionnés
if ($model->id) {
// init points de vente sélectionnés
$userPointSaleArray = UserPointSale::searchAll([
'id_user' => $model->id
]);
@@ -128,6 +131,17 @@ class UserController extends BackendController
}
}

// 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([
'id_producer' => GlobalParam::getCurrentProducerId(),
'id_user' => $model->id
@@ -147,8 +161,16 @@ class UserController extends BackendController
}])
->all();

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

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

@@ -173,6 +195,7 @@ class UserController extends BackendController
if ($userExist) {
Producer::addUser($userExist->id, GlobalParam::getCurrentProducerId()) ;
$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.");
}
else {
@@ -199,6 +222,7 @@ class UserController extends BackendController

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

Yii::$app->getSession()->setFlash('success', 'Utilisateur créé.');
@@ -237,6 +261,7 @@ class UserController extends BackendController
$model->sendMailWelcome($password);
}
$this->processLinkPointSale($model);
$this->processLinkUserGroup($model);
$this->processProductPricePercent($model) ;
Yii::$app->getSession()->setFlash('success', 'Utilisateur modifié.');
}
@@ -296,6 +321,36 @@ class UserController extends BackendController
}
}

/**
* 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)
{
$userProducer = UserProducer::searchOne([

+ 179
- 0
backend/controllers/UserGroupController.php Visa fil

@@ -0,0 +1,179 @@
<?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 Visa fil

@@ -104,8 +104,8 @@ $this->addButton(['label' => 'Nouveau bon de livraison <span class="glyphicon gl
[
'attribute' => 'amount',
'header' => 'Montant',
'value' => function($invoice) {
return $invoice->getAmountWithTax(Order::AMOUNT_TOTAL, true) ;
'value' => function($deliveryNote) {
return $deliveryNote->getAmountWithTax(Order::INVOICE_AMOUNT_TOTAL, true) ;
}
],
[

+ 18
- 2
backend/views/document/_download_product_line.php Visa fil

@@ -8,8 +8,18 @@
<br /><small><?= Html::encode($productOrder->product->description) ?></small>
<?php endif; ?>
</td>

<?php
$price = $productOrder->getPrice() ;
if($document->isInvoicePrice() && $productOrder->getInvoicePrice()) {
$price = $productOrder->getInvoicePrice() ;
}
?>

<?php if($displayPrices): ?>
<td class="align-center"><?= Price::format($productOrder->getPrice()) ?></td>
<td class="align-center">
<?= Price::format($price) ?>
</td>
<?php endif; ?>
<td class="align-center"><?= $productOrder->quantity * Product::$unitsArray[$productOrder->unit]['coefficient'] ?></td>
<td class="align-center"><?= Product::strUnit($productOrder->unit, 'wording') ?></td>
@@ -17,6 +27,12 @@
<?php if(GlobalParam::getCurrentProducer()->taxRate->value != 0): ?>
<td class="align-center"><?= $productOrder->taxRate->value * 100 ?> %</td>
<?php endif; ?>
<td class="align-center"><?= Price::format($productOrder->getPrice() * $productOrder->quantity) ?></td>
<td class="align-center">
<?php if($document->getClass() == ''): ?>
<?= Price::format($price * $productOrder->quantity) ?>
<?php else: ?>
<?= Price::format($price * $productOrder->quantity) ?>
<?php endif; ?>
</td>
<?php endif; ?>
</tr>

+ 5
- 3
backend/views/document/_form.php Visa fil

@@ -245,7 +245,7 @@ use common\models\Producer;
<th>Prix (unité)</th>
<th>Quantité</th>
<th v-if="taxRateProducer != 0">TVA</th>
<th v-if="taxRateProducer != 0">Total TTC</th>
<th v-if="taxRateProducer != 0">Total HT</th>
<th v-else>Total</th>
<th>Supprimer</th>
</tr>
@@ -261,13 +261,15 @@ use common\models\Producer;
<li v-if="order.point_sale_name">{{ order.point_sale_name }}</li>
</ul>
</td>
<td class="col-md-2">{{ formatPrice(productOrder.price) }}</td>
<td class="col-md-2">
{{ formatPrice(getProductOrderPrice(productOrder)) }}
</td>
<td class="col-md-2">{{ productOrder.quantity }}</td>
<td class="col-md-1" v-if="taxRateProducer != 0">
{{ productsArray[productOrder.id_product].tax_rate * 100 }} %
</td>
<td class="col-md-2">
{{ formatPrice(productOrder.quantity * productOrder.price) }}
{{ formatPrice(productOrder.quantity * getProductOrderPrice(productOrder)) }}
</td>
<td class="col-md-1">
<a class="btn btn-default" @click="deleteProductOrder(productOrder.id)">

+ 11
- 4
backend/views/document/download.php Visa fil

@@ -85,6 +85,7 @@ $displayPrices = Yii::$app->controller->getClass() != 'DeliveryNote' || (Yii::$a
</tr>
<?php foreach($order->productOrder as $productOrder): ?>
<?= $this->render('_download_product_line', [
'document' => $document,
'productOrder' => $productOrder,
'displayOrders' => true,
'displayPrices' => $displayPrices
@@ -95,6 +96,7 @@ $displayPrices = Yii::$app->controller->getClass() != 'DeliveryNote' || (Yii::$a
<?php foreach($document->getProductsOrders() as $product): ?>
<?php foreach($product as $productOrder): ?>
<?= $this->render('_download_product_line', [
'document' => $document,
'productOrder' => $productOrder,
'displayPrices' => $displayPrices
]) ?>
@@ -103,17 +105,22 @@ $displayPrices = Yii::$app->controller->getClass() != 'DeliveryNote' || (Yii::$a
<?php endif; ?>
<?php if($displayPrices): ?>
<?php if(GlobalParam::getCurrentProducer()->taxRate->value != 0): ?>

<?php $typeAmount = $document->isInvoicePrice() ? Order::INVOICE_AMOUNT_TOTAL : Order::AMOUNT_TOTAL ; ?>

<tr>
<td class="align-right" colspan="5"><strong>Total HT</strong></td>
<td class="align-center"><?= Price::format($document->getAmount()) ?></td>
<td class="align-center">
<?= Price::format($document->getAmount($typeAmount)); ?>
</td>
</tr>
<tr>
<td class="align-right" colspan="5"><strong>TVA</strong></td>
<td class="align-center"><?= Price::format($document->getAmountWithTax() - $document->getAmount()) ?></td>
<td class="align-center"><?= Price::format($document->getAmountWithTax($typeAmount) - $document->getAmount($typeAmount)) ?></td>
</tr>
<tr>
<td class="align-right" colspan="5"><strong>Total TTC</strong></td>
<td class="align-center"><?= Price::format($document->getAmountWithTax()) ?></td>
<td class="align-center"><?= Price::format($document->getAmountWithTax($typeAmount)) ?></td>
</tr>
<?php else: ?>
<tr>
@@ -121,7 +128,7 @@ $displayPrices = Yii::$app->controller->getClass() != 'DeliveryNote' || (Yii::$a
<strong>Total</strong><br />
TVA non applicable
</td>
<td class="align-center"><?= Price::format($document->getAmount()) ?></td>
<td class="align-center"><?= Price::format($document->getAmount($typeAmount)) ?></td>
</tr>
<?php endif; ?>
<?php endif; ?>

+ 1
- 1
backend/views/invoice/index.php Visa fil

@@ -96,7 +96,7 @@ $this->addButton(['label' => 'Nouvelle facture <span class="glyphicon glyphicon-
'attribute' => 'amount',
'header' => 'Montant',
'value' => function($invoice) {
return $invoice->getAmountWithTax(Order::AMOUNT_TOTAL, true) ;
return $invoice->getAmountWithTax(Order::INVOICE_AMOUNT_TOTAL, true) ;
}
],
[

+ 10
- 1
backend/views/layouts/left.php Visa fil

@@ -50,7 +50,16 @@ termes.
['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' => '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' => 'Paramètres','icon' => 'cog','url' => ['/producer/update'], 'visible' => User::isCurrentProducer()],
['label' => 'Communiquer','icon' => 'bullhorn','url' => ['/communicate/index'], 'visible' => User::isCurrentProducer()],

+ 2
- 2
backend/views/point-sale/_form.php Visa fil

@@ -93,8 +93,8 @@ use common\models\ProductPrice ;
Producer::CREDIT_FUNCTIONING_USER => Producer::$creditFunctioningArray[Producer::CREDIT_FUNCTIONING_USER],
], [])->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">

+ 2
- 1
backend/views/product/update/prices/_form.php Visa fil

@@ -28,7 +28,8 @@ use common\models\User ;
]); ?>

<?= $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
$producer = GlobalParam::getCurrentProducer();

+ 24
- 10
backend/views/product/update/prices/list.php Visa fil

@@ -53,7 +53,7 @@ $this->addBreadcrumb('Modifier');
]) ;
?>

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

<div class="panel panel-default">
<div class="panel-heading">
@@ -73,21 +73,31 @@ $this->addBreadcrumb('Modifier');
'dataProvider' => $dataProvider,
'columns' => [
[
'attribute' => 'id_point_sale',
'attribute' => 'id_user',
'format' => 'raw',
'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>' ;
}
],
[
'attribute' => 'id_user',
'attribute' => 'id_user_group',
'format' => 'raw',
'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>' ;
}
@@ -130,6 +140,7 @@ $this->addBreadcrumb('Modifier');
</div>
</div>

<!--
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Pourcentage global / Utilisateurs</h3>
@@ -195,10 +206,10 @@ $this->addBreadcrumb('Modifier');
</table>
</div>
</div>
-->
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Prix de base</h3>
<h3 class="panel-title">Rappel du prix de base</h3>
</div>
<div class="panel-body">
<p>Prix de base : <strong><?= Price::format($model->getPrice()); ?> HT</strong> / <strong><?= Price::format($model->getPriceWithTax()); ?> TTC</strong><br /></p>
@@ -206,7 +217,9 @@ $this->addBreadcrumb('Modifier');
</div>
</div>

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

<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">Priorités de résolution</h3>
@@ -224,4 +237,5 @@ $this->addBreadcrumb('Modifier');
</p>
</div>
</div>
</div>
</div>
-->

+ 63
- 0
backend/views/user-group/_form.php Visa fil

@@ -0,0 +1,63 @@
<?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 Visa fil

@@ -0,0 +1,52 @@
<?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 Visa fil

@@ -0,0 +1,75 @@
<?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 Visa fil

@@ -0,0 +1,52 @@
<?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 Visa fil

@@ -77,8 +77,16 @@ use common\models\ProductPrice ;
]);
?>

<?= $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">
<?= Html::submitButton($model->isNewRecord ? 'Ajouter' : 'Modifier', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>

+ 2
- 1
backend/views/user/update.php Visa fil

@@ -48,6 +48,7 @@ $this->addBreadcrumb('Modifier') ;
<div class="user-update">
<?= $this->render('_form', [
'model' => $model,
'pointsSaleArray' => $pointsSaleArray
'pointsSaleArray' => $pointsSaleArray,
'userGroupsArray' => $userGroupsArray,
]) ?>
</div>

+ 8
- 4
backend/web/css/screen.css Visa fil

@@ -2217,9 +2217,11 @@ termes.
float: right;
}

/* line 5, ../sass/user/_form.scss */
/* line 6, ../sass/user/_form.scss */
.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;
margin-right: 10px;
cursor: pointer;
@@ -2227,9 +2229,11 @@ termes.
padding: 5px 10px;
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-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;
width: 200px;
margin-left: 15px;

+ 15
- 0
backend/web/js/vuejs/document-form.js Visa fil

@@ -90,6 +90,21 @@ var app = new Vue({
var documentClass = $('#app-document-form').attr('data-class-document') ;
return documentClass ;
},
getProductOrderPrice: function(productOrder) {
var documentClass = this.getDocumentClass() ;
var price = 0 ;
if(documentClass == 'DeliveryNote' || documentClass == 'Invoice') {
price = productOrder.invoice_price ;
if(!price) {
price = productOrder.price ;
}
}
else {
price = productOrder.price ;
}

return price ;
},
changeUser: function() {
var app = this ;
axios.get(UrlManager.getBaseUrlAbsolute()+"document/ajax-user-infos",{params: {

+ 2
- 1
backend/web/sass/user/_form.scss Visa fil

@@ -1,7 +1,8 @@

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

+ 8
- 1
common/models/Document.php Visa fil

@@ -124,9 +124,11 @@ class Document extends ActiveRecordCommon

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

if ($withTax) {
$amount += $order->getAmountWithTax($type);
} else {
}
else {
$amount += $order->getAmount($type);
}
}
@@ -376,4 +378,9 @@ class Document extends ActiveRecordCommon
return Yii::getAlias('@app/web/pdf/'.$this->getType().'-' . $this->reference. '.pdf') ;
}

public function isInvoicePrice()
{
return $this->getClass() == 'Invoice' || $this->getClass() == 'DeliveryNote' ;
}

}

+ 38
- 2
common/models/Order.php Visa fil

@@ -63,6 +63,8 @@ class Order extends ActiveRecordCommon
{
var $amount = 0;
var $amount_with_tax = 0;
var $invoice_amount = 0;
var $invoice_amount_with_tax = 0;
var $paid_amount = 0;
var $weight = 0;

@@ -74,6 +76,7 @@ class Order extends ActiveRecordCommon
const PAYMENT_UNPAID = 'unpaid';
const PAYMENT_SURPLUS = 'surplus';

const INVOICE_AMOUNT_TOTAL = 'invoice-total' ;
const AMOUNT_TOTAL = 'total';
const AMOUNT_PAID = 'paid';
const AMOUNT_REMAINING = 'remaining';
@@ -214,12 +217,20 @@ class Order extends ActiveRecordCommon
{
$this->amount = 0;
$this->amount_with_tax = 0;
$this->invoice_amount = 0;
$this->invoice_amount_with_tax = 0;
$this->weight = 0;

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

$this->amount += $productOrder->price * $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 (isset($productOrder->product)) {
$this->weight += ($productOrder->quantity * $productOrder->product->weight) / 1000;
@@ -384,18 +395,29 @@ class Order extends ActiveRecordCommon

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)
{
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)
{
switch ($type) {
case self::AMOUNT_TOTAL :
case self::INVOICE_AMOUNT_TOTAL :
$amount = $amountOrder;
break;
case self::AMOUNT_PAID :
@@ -929,4 +951,18 @@ class Order extends ActiveRecordCommon
return $username ;
}

public function initInvoicePrices($params = [])
{
foreach($this->productOrder as $productOrder) {
if($productOrder->product) {
$productOrder->invoice_price = $productOrder->product->getPrice([
'user' => isset($params['user']) ? $params['user'] : null,
'user_producer' => isset($params['user_producer']) ? $params['user_producer'] : null,
'point_sale' => isset($params['point_sale']) ? $params['point_sale'] : null
]) ;
$productOrder->save() ;
}
}
}

}

+ 23
- 4
common/models/Product.php Visa fil

@@ -147,6 +147,7 @@ class Product extends ActiveRecordCommon
'active' => 'Actif',
'photo' => 'Photo',
'price' => 'Prix (€) TTC',
'price' => 'Prix (€) TTC',
'weight' => 'Poids',
'recipe' => 'Recette',
'monday' => 'Lundi',
@@ -348,25 +349,40 @@ class Product extends ActiveRecordCommon
'user' => false,
'pointsale' => false,
'user_pointsale' => false,
'usergroup' => false,
] ;

foreach($specificPrices as $specificPrice) {
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) {

$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
&& $specificPrice->id_point_sale && !$specificPrice->id_user
&& $specificPrice->id_point_sale
&& !$specificPrice->id_user
&& !$specificPrice->id_user_group
&& $specificPrice->id_point_sale == $pointSale->id) {

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

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 ;
}
@@ -378,6 +394,9 @@ class Product extends ActiveRecordCommon
elseif($specificPricesArray['user']) {
return $specificPricesArray['user'] ;
}
elseif($specificPricesArray['usergroup']) {
return $specificPricesArray['usergroup'] ;
}
elseif($specificPricesArray['pointsale']) {
return $specificPricesArray['pointsale'] ;
}

+ 8
- 2
common/models/ProductOrder.php Visa fil

@@ -87,6 +87,7 @@ class ProductOrder extends ActiveRecordCommon
[['id_order', 'id_product', 'id_tax_rate'], 'integer'],
[['unit'], 'string', 'max' => 255],
[['quantity'], 'number', 'min' => 0],
[['price', 'invoice_price'], 'double'],
[['description'], 'safe']
];
}
@@ -103,7 +104,9 @@ class ProductOrder extends ActiveRecordCommon
'quantity' => 'Quantité',
'unit' => 'Unité',
'id_tax_rate' => 'Taxe',
'description' => 'Description'
'description' => 'Description',
'price' => 'Prix',
'invoice_price' => 'Prix facturé',
];
}

@@ -134,12 +137,15 @@ class ProductOrder extends ActiveRecordCommon
return $this->price ;
}

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

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

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


+ 17
- 5
common/models/ProductPrice.php Visa fil

@@ -68,13 +68,16 @@ class ProductPrice extends ActiveRecordCommon
{
return [
['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) {
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', 'id_user', 'id_point_sale', 'percent'], 'integer'],
[['id_product', 'id_user', 'id_point_sale', 'id_user_group', 'percent'], 'integer'],
[['price'], 'double'],
];
}
@@ -89,6 +92,7 @@ class ProductPrice extends ActiveRecordCommon
'id_product' => 'Produit',
'id_user' => 'Utilisateur',
'id_point_sale' => 'Point de vente',
'id_user_group' => "Groupe d'utilisateur",
'price' => 'Prix (HT)',
'percent' => 'Pourcentage',
];
@@ -114,6 +118,14 @@ class ProductPrice extends ActiveRecordCommon
);
}

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

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

+ 29
- 3
common/models/User.php Visa fil

@@ -75,6 +75,7 @@ class User extends ActiveRecordCommon implements IdentityInterface
var $password_new;
var $password_new_confirm;
var $points_sale = [];
var $user_groups = [];
var $one_name ;
var $product_price_percent ;

@@ -112,7 +113,7 @@ class User extends ActiveRecordCommon implements IdentityInterface
['password_old', 'verifyPasswordOld'],
['password_new', 'verifyPasswordNew'],
['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'],
];
}

@@ -142,7 +143,8 @@ class User extends ActiveRecordCommon implements IdentityInterface
'type' => 'Type',
'name_legal_person' => 'Libellé',
'is_main_contact' => 'Contact principal',
'product_price_percent' => 'Prix produits : pourcentage'
'product_price_percent' => 'Prix produits : pourcentage',
'user_groups' => "Groupes d'utilisateurs"
];
}

@@ -155,7 +157,7 @@ class User extends ActiveRecordCommon implements IdentityInterface
{
return [
'with' => [],
'join_with' => ['userProducer'],
'join_with' => ['userProducer', 'userUserGroup'],
'orderby' => 'user.name ASC, user.lastname ASC',
'attribute_id_producer' => ''
];
@@ -257,6 +259,11 @@ class User extends ActiveRecordCommon implements IdentityInterface
return $this->hasMany(UserProducer::className(), ['id_user' => 'id']);
}

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

public function getOrder()
{
return $this->hasMany(Order::className(), ['id_user' => 'id']);
@@ -775,5 +782,24 @@ class User extends ActiveRecordCommon implements IdentityInterface
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 Visa fil

@@ -0,0 +1,108 @@
<?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 Visa fil

@@ -0,0 +1,84 @@
<?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 Visa fil

@@ -0,0 +1,100 @@
<?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 Visa fil

@@ -0,0 +1,30 @@
<?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 Visa fil

@@ -0,0 +1,17 @@
<?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 Visa fil

@@ -0,0 +1,17 @@
<?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') ;
}
}

Laddar…
Avbryt
Spara