@@ -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 [ |
@@ -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), | |||
]; | |||
} | |||
} |
@@ -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([ |
@@ -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.'); | |||
} | |||
} | |||
} |
@@ -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) ; | |||
} | |||
], | |||
[ |
@@ -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> |
@@ -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)"> |
@@ -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; ?> |
@@ -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) ; | |||
} | |||
], | |||
[ |
@@ -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()], |
@@ -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"> |
@@ -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(); |
@@ -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> | |||
--> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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> |
@@ -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']) ?> |
@@ -48,6 +48,7 @@ $this->addBreadcrumb('Modifier') ; | |||
<div class="user-update"> | |||
<?= $this->render('_form', [ | |||
'model' => $model, | |||
'pointsSaleArray' => $pointsSaleArray | |||
'pointsSaleArray' => $pointsSaleArray, | |||
'userGroupsArray' => $userGroupsArray, | |||
]) ?> | |||
</div> |
@@ -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; |
@@ -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: { |
@@ -1,7 +1,8 @@ | |||
.user-create, | |||
.user-update { | |||
#user-points_sale { | |||
#user-points_sale, | |||
#user-user_groups { | |||
label { | |||
font-weight: normal ; | |||
margin-right: 10px ; |
@@ -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' ; | |||
} | |||
} |
@@ -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() ; | |||
} | |||
} | |||
} | |||
} |
@@ -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'] ; | |||
} |
@@ -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); | |||
} | |||
@@ -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( |
@@ -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 ; | |||
} | |||
} |
@@ -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 ; | |||
} | |||
} |
@@ -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; | |||
} | |||
} |
@@ -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' => '' | |||
] ; | |||
} | |||
} |
@@ -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'); | |||
} | |||
} |
@@ -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'); | |||
} | |||
} |
@@ -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') ; | |||
} | |||
} |