@@ -38,6 +38,7 @@ | |||
namespace backend\controllers; | |||
use domain\Feature\Feature\Feature; | |||
use domain\Product\Accessory\Accessory; | |||
use yii\base\Response; | |||
use yii\db\StaleObjectException; | |||
@@ -58,7 +59,10 @@ class AccessoryController extends BackendController | |||
'matchCallback' => function ($rule, $action) { | |||
return $this->getUserModule() | |||
->getAuthorizationChecker() | |||
->isGrantedAsProducer($this->getUserCurrent()); | |||
->isGrantedAsProducer($this->getUserCurrent()) | |||
&& $this->getFeatureModule()->getChecker() | |||
->isEnabled(Feature::ALIAS_PRODUCT_ACCESSORY); | |||
} | |||
] | |||
], |
@@ -0,0 +1,227 @@ | |||
<?php | |||
/** | |||
* Copyright Souke (2018) | |||
* | |||
* contact@souke.fr | |||
* | |||
* 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 domain\Feature\Feature\Feature; | |||
use domain\Product\Rotating\Rotating; | |||
use yii\filters\AccessControl; | |||
use yii\web\NotFoundHttpException; | |||
use yii\web\Response; | |||
class RotatingController extends BackendController | |||
{ | |||
public function behaviors() | |||
{ | |||
return [ | |||
'access' => [ | |||
'class' => AccessControl::class, | |||
'rules' => [ | |||
[ | |||
'allow' => true, | |||
'roles' => ['@'], | |||
'matchCallback' => function ($rule, $action) { | |||
return $this->getUserModule() | |||
->getAuthorizationChecker() | |||
->isGrantedAsProducer($this->getUserCurrent()) | |||
&& $this->getFeatureModule()->getChecker() | |||
->isEnabled(Feature::ALIAS_ROTATING_PRODUCT); | |||
} | |||
] | |||
], | |||
], | |||
]; | |||
} | |||
public function actionIndex() | |||
{ | |||
return $this->render('index', [ | |||
'dataProvider' => $this->getRotatingModule()->getRepository() | |||
->queryRotatings()->getDataProvider(20), | |||
]); | |||
} | |||
public function actionCreate() | |||
{ | |||
$rotatingModule = $this->getRotatingModule(); | |||
$rotatingModel = $rotatingModule->getBuilder()->instanciateRotating($this->getProducerCurrent()); | |||
if ($rotatingModel->load(\Yii::$app->request->post()) && $rotatingModel->validate()) { | |||
$rotating = $rotatingModule->getManager()->createRotating( | |||
$this->getProducerCurrent(), | |||
$rotatingModel->getName(), | |||
$rotatingModel->getDay(), | |||
$rotatingModel->getSelectedProductsIds() | |||
); | |||
$this->setFlash('success', "Produit tournant ajouté"); | |||
return $this->redirectAfterSave('rotating', $rotating->getId()); | |||
} | |||
return $this->render('create', [ | |||
'rotating' => $this->initFormModel($rotatingModel), | |||
'productsArray' => $this->findProducts() | |||
]); | |||
} | |||
public function actionUpdate(int $id) | |||
{ | |||
$rotating = $this->findRotating($id); | |||
if ($rotating->load(\Yii::$app->request->post()) && $rotating->validate() && $rotating->save()) { | |||
$this->getRotatingModule()->getManager()->manageRotatingProducts( | |||
$rotating, | |||
$rotating->getSelectedProductsIds() | |||
); | |||
return $this->redirectAfterSave('rotating', $rotating->getId()); | |||
} | |||
return $this->render('update', [ | |||
'rotating' => $this->initFormModel($rotating), | |||
'productsArray' => $this->findProducts() | |||
]); | |||
} | |||
public function actionDelete(int $id): Response | |||
{ | |||
$rotatingModule = $this->getRotatingModule(); | |||
$rotating = $this->findRotating($id); | |||
if($rotatingModule->getManager()->deleteRotating($rotating)) { | |||
$this->setFlash('success', "Produit tournant supprimé"); | |||
} | |||
return $this->redirect('index'); | |||
} | |||
protected function findRotating($id): Rotating | |||
{ | |||
if (($rotating = $this->getRotatingModule()->getRepository()->findOneRotatingById($id)) !== null) { | |||
return $rotating; | |||
} else { | |||
throw new NotFoundHttpException("Le produit tournant n'a pas été trouvé."); | |||
} | |||
} | |||
public function findProducts(): array | |||
{ | |||
return $this->getProductModule()->getRepository()->findProducts(true); | |||
} | |||
public function initFormModel(Rotating $rotating) | |||
{ | |||
$this->getRotatingModule()->getBuilder()->initSelectedProductsIds($rotating); | |||
return $rotating; | |||
} | |||
/*public function actionCreate() | |||
{ | |||
$accessoryModule = $this->getAccessoryModule(); | |||
$accessoryModel = $accessoryModule->getBuilder()->instanciateAccessory($this->getProducerCurrent()); | |||
if ($accessoryModel->load(\Yii::$app->request->post()) && $accessoryModel->validate()) { | |||
$accessory = $accessoryModule->getManager()->createAccessory( | |||
$this->getProducerCurrent(), | |||
$accessoryModel->getName(), | |||
$accessoryModel->getQuantity() | |||
); | |||
$this->afterSave($accessory, $accessoryModel->getSelectedProductsIds()); | |||
$this->setFlash('success', "Accessoire ajouté"); | |||
return $this->redirectAfterSave('accessory', $accessory->getId()); | |||
} | |||
return $this->render('create', [ | |||
'accessory' => $this->initFormModel($accessoryModel), | |||
'productsArray' => $this->findProducts() | |||
]); | |||
} | |||
public function actionUpdate(int $id) | |||
{ | |||
$accessory = $this->findAccessory($id); | |||
if ($accessory->load(\Yii::$app->request->post()) && $accessory->validate() && $accessory->save()) { | |||
$this->afterSave($accessory, $accessory->getSelectedProductsIds()); | |||
return $this->redirectAfterSave('accessory', $accessory->getId()); | |||
} | |||
return $this->render('update', [ | |||
'accessory' => $this->initFormModel($accessory), | |||
'productsArray' => $this->findProducts() | |||
]); | |||
} | |||
public function actionDelete(int $id): Response | |||
{ | |||
$accessory = $this->findAccessory($id); | |||
if($accessory->delete()) { | |||
$this->setFlash('success', "Accessoire supprimé"); | |||
} | |||
return $this->redirect('index'); | |||
} | |||
public function afterSave(Accessory $accessory, $selectedProductsIdsArray): void | |||
{ | |||
if(!is_array($selectedProductsIdsArray)) { | |||
$selectedProductsIdsArray = []; | |||
} | |||
$this->getAccessoryModule()->getManager()->manageProducts($accessory, $selectedProductsIdsArray); | |||
} | |||
public function findProducts(): array | |||
{ | |||
return $this->getProductModule()->getRepository()->findProducts(true); | |||
} | |||
protected function findAccessory($id): Accessory | |||
{ | |||
if (($accessory = $this->getAccessoryModule()->getRepository()->findOneAccessoryById($id)) !== null) { | |||
return $accessory; | |||
} else { | |||
throw new NotFoundHttpException("L'accessoire n'a pas été trouvé."); | |||
} | |||
} | |||
public function initFormModel(Accessory $accessoryModel) | |||
{ | |||
$this->getAccessoryModule()->getBuilder()->initSelectedProductsIds($accessoryModel); | |||
return $accessoryModel; | |||
} | |||
*/ | |||
} |
@@ -212,10 +212,11 @@ $isUserCurrentGrantedAsProducer = $userModule->getAuthorizationChecker()->isGran | |||
'icon' => 'clone', | |||
'url' => ['/product/index'], | |||
'visible' => $isUserCurrentGrantedAsProducer, | |||
'active' => Yii::$app->controller->id == 'product' || Yii::$app->controller->id == 'product-category' || Yii::$app->controller->id == 'accessory', | |||
'active' => in_array(Yii::$app->controller->id, ['product', 'product-category', 'accessory', 'rotating']), | |||
'items' => [ | |||
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/product/index'], 'visible' => $isUserCurrentGrantedAsProducer], | |||
['label' => 'Catégories', 'icon' => 'book', 'url' => ['/product-category/index'], 'visible' => $isUserCurrentGrantedAsProducer], | |||
['label' => 'Produits tournants', 'icon' => 'random', 'url' => ['/rotating/index'], 'visible' => $isUserCurrentGrantedAsProducer && $featureChecker->isEnabled(Feature::ALIAS_ROTATING_PRODUCT)], | |||
['label' => 'Accessoires', 'icon' => 'cutlery', 'url' => ['/accessory/index'], 'visible' => $isUserCurrentGrantedAsProducer && $featureChecker->isEnabled(Feature::ALIAS_PRODUCT_ACCESSORY)], | |||
['label' => 'Import prix', 'icon' => 'upload', 'url' => ['/product/price-import'], 'visible' => $isUserCurrentGrantedAsProducer && $featureChecker->isEnabled(Feature::ALIAS_PRODUCT_PRICE_IMPORT)], | |||
] |
@@ -0,0 +1,89 @@ | |||
<?php | |||
/** | |||
* Copyright Souke (2018) | |||
* | |||
* contact@souke.fr | |||
* | |||
* 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 common\components\Date; | |||
use lo\widgets\Toggle; | |||
use yii\helpers\ArrayHelper; | |||
use yii\helpers\Html; | |||
use yii\widgets\ActiveForm; | |||
?> | |||
<div class="rotating-form"> | |||
<?php $form = ActiveForm::begin(['enableClientValidation' => false]); ?> | |||
<div class="col-md-8"> | |||
<div class="panel panel-default"> | |||
<div class="panel-heading"> | |||
<h3 class="panel-title"> | |||
<i class="fa fa-th-list"></i> | |||
Général | |||
</h3> | |||
</div> | |||
<div class="panel-body"> | |||
<?= $form->field($rotating, 'status')->widget(Toggle::class, | |||
[ | |||
'options' => [ | |||
'data-id' => $rotating->getId(), | |||
'data-on' => 'Activé', | |||
'data-off' => 'Désactivé' | |||
], | |||
]); | |||
?> | |||
<?= $form->field($rotating, 'name')->textInput() ?> | |||
<?= $form->field($rotating, 'day')->dropDownList(Date::getDaysOfWeekArray()) ?> | |||
</div> | |||
</div> | |||
<div class="panel panel-default" id="panel-products"> | |||
<div class="panel-heading"> | |||
<h3 class="panel-title"> | |||
<i class="fa fa-clone"></i> | |||
Produits | |||
</h3> | |||
</div> | |||
<div class="panel-body"> | |||
<?= Html::activeCheckboxList($rotating, 'selected_products_ids', ArrayHelper::map($productsArray, 'id', function ($product, $defaultValue) { | |||
return Html::encode($product->name); | |||
}), ['encode' => false, 'class' => '']) ?> | |||
</div> | |||
</div> | |||
</div> | |||
<?= $this->render('@backend/views/_include/form_actions.php',[ | |||
'model' => $rotating, | |||
]); ?> | |||
<?php ActiveForm::end(); ?> | |||
</div> |
@@ -0,0 +1,50 @@ | |||
<?php | |||
/** | |||
Copyright Souke (2018) | |||
contact@souke.fr | |||
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. | |||
*/ | |||
$this->setTitle("Ajouter un produit tournant") ; | |||
$this->addBreadcrumb(['label' => "Produit tournant", 'url' => ['index']]) ; | |||
$this->addBreadcrumb('Ajouter') ; | |||
?> | |||
<div class="rotating-create"> | |||
<?= $this->render('_form', [ | |||
'rotating' => $rotating, | |||
'productsArray' => $productsArray | |||
]) ?> | |||
</div> |
@@ -0,0 +1,94 @@ | |||
<?php | |||
/** | |||
* Copyright Souke (2018) | |||
* | |||
* contact@souke.fr | |||
* | |||
* 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 common\components\View; | |||
use domain\Product\Rotating\Rotating; | |||
use yii\helpers\Html; | |||
use yii\grid\GridView; | |||
/** | |||
* @var View $this | |||
*/ | |||
$this->setTitle('Produits tournans'); | |||
$this->addBreadcrumb($this->getTitle()); | |||
$this->addButton(['label' => 'Nouveau produit tournant <span class="glyphicon glyphicon-plus"></span>', 'url' => 'rotating/create', 'class' => 'btn btn-primary']); | |||
?> | |||
<div class="accessory-index"> | |||
<?= GridView::widget([ | |||
'dataProvider' => $dataProvider, | |||
'columns' => [ | |||
'name', | |||
[ | |||
'attribute' => 'day', | |||
'value' => function(Rotating $rotating) { | |||
return $rotating->getDayAsString(); | |||
} | |||
], | |||
[ | |||
'label' => 'Produits', | |||
'format' => 'raw', | |||
'value' => function(Rotating $rotating) { | |||
return implode(' ', array_map(function($rotatingProduct) { | |||
return '<span class="label label-default">'.$rotatingProduct->getProduct()->name.'</span>'; | |||
}, $rotating->getRotatingProducts())); | |||
} | |||
], | |||
[ | |||
'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' => 'Modifier', 'class' => 'btn btn-default' | |||
]); | |||
}, | |||
'delete' => function ($url, $model) { | |||
return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, [ | |||
'title' => 'Supprimer', 'class' => 'btn btn-default' | |||
]); | |||
} | |||
], | |||
], | |||
], | |||
]); ?> | |||
</div> |
@@ -0,0 +1,53 @@ | |||
<?php | |||
/** | |||
Copyright Souke (2018) | |||
contact@souke.fr | |||
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 produit tournant") ; | |||
$this->addBreadcrumb(['label' => "Produits tournants", 'url' => ['index']]) ; | |||
$this->addBreadcrumb(['label' => Html::encode($rotating->getName()), 'url' => ['update', 'id' => $rotating->getId()]]) ; | |||
$this->addBreadcrumb('Modifier') ; | |||
?> | |||
<div class="rotating-update"> | |||
<?= $this->render('_form', [ | |||
'rotating' => $rotating, | |||
'productsArray' => $productsArray | |||
]) ?> | |||
</div> |
@@ -3350,6 +3350,16 @@ termes. | |||
margin-bottom: 5px; | |||
} | |||
/* line 3, ../sass/rotating/_form.scss */ | |||
.rotating-form form label { | |||
display: block; | |||
} | |||
/* line 9, ../sass/rotating/_form.scss */ | |||
.rotating-form #panel-products .panel-body label { | |||
display: block; | |||
font-weight: normal; | |||
} | |||
/** | |||
Copyright Souke (2018) | |||
@@ -0,0 +1,15 @@ | |||
.rotating-form { | |||
form label { | |||
display: block; | |||
} | |||
#panel-products { | |||
.panel-body { | |||
label { | |||
display: block; | |||
font-weight: normal; | |||
} | |||
} | |||
} | |||
} |
@@ -1557,4 +1557,5 @@ a.btn, button.btn { | |||
@import "dashboard-admin/_index.scss" ; | |||
@import "automatic-email/_form.scss" ; | |||
@import "communication/_email.scss" ; | |||
@import "rotating/_form.scss" ; | |||
@import "_responsive.scss" ; |
@@ -9,7 +9,7 @@ use yii\db\ActiveQuery; | |||
class Accessory extends ActiveRecordCommon | |||
{ | |||
// Produits sélectionnés dans le formulaire d'édition | |||
// Produits sélectionnés dans le formulaire | |||
public $selected_products_ids; | |||
public static function tableName() |
@@ -3,11 +3,16 @@ | |||
namespace domain\Product\Rotating; | |||
use common\components\ActiveRecordCommon; | |||
use common\components\Date; | |||
use domain\Producer\Producer\Producer; | |||
use domain\Product\RotatingProduct\RotatingProduct; | |||
use yii\db\ActiveQuery; | |||
class Rotating extends ActiveRecordCommon | |||
{ | |||
// Produits sélectionnés dans le formulaire | |||
public $selected_products_ids; | |||
public static function tableName() | |||
{ | |||
return 'rotating'; | |||
@@ -19,6 +24,7 @@ class Rotating extends ActiveRecordCommon | |||
[['id_producer', 'name', 'day'], 'required'], | |||
[['name'], 'string', 'max' => 255], | |||
[['id_producer', 'day', 'status'], 'integer'], | |||
[['selected_products_ids'], 'safe'], | |||
]; | |||
} | |||
@@ -84,10 +90,38 @@ class Rotating extends ActiveRecordCommon | |||
return $this; | |||
} | |||
public function getSelectedProductsIds() | |||
{ | |||
return $this->selected_products_ids; | |||
} | |||
public function setSelectedProductsIds(array $selectedProductsIdsArray): self | |||
{ | |||
$this->selected_products_ids = $selectedProductsIdsArray; | |||
return $this; | |||
} | |||
public function getRotatingProducts(): array | |||
{ | |||
return $this->rotatingProductsRelation; | |||
} | |||
/* Relations */ | |||
public function getProducerRelation(): ActiveQuery | |||
{ | |||
return $this->hasOne(Producer::class, ['id' => 'id_producer']); | |||
} | |||
public function getRotatingProductsRelation() | |||
{ | |||
return $this->hasMany(RotatingProduct::class, ['id_rotating' => 'id']); | |||
} | |||
/* Méthodes */ | |||
public function getDayAsString(): string | |||
{ | |||
return Date::getDayOfWeekStringByNumber($this->getDay()); | |||
} | |||
} |
@@ -5,9 +5,17 @@ namespace domain\Product\Rotating; | |||
use domain\_\AbstractBuilder; | |||
use domain\_\StatusInterface; | |||
use domain\Producer\Producer\Producer; | |||
use domain\Product\RotatingProduct\RotatingProductRepository; | |||
class RotatingBuilder extends AbstractBuilder | |||
{ | |||
protected RotatingProductRepository $rotatingProductRepository; | |||
public function loadDependencies(): void | |||
{ | |||
$this->rotatingProductRepository = $this->loadService(RotatingProductRepository::class); | |||
} | |||
public function instanciateRotating(Producer $producer): Rotating | |||
{ | |||
$rotating = new Rotating(); | |||
@@ -16,4 +24,14 @@ class RotatingBuilder extends AbstractBuilder | |||
return $rotating; | |||
} | |||
public function initSelectedProductsIds(Rotating $rotating): void | |||
{ | |||
$selectedProductsIdsArray = []; | |||
$rotatingProductsArray = $this->rotatingProductRepository->findRotatingProductsByRotating($rotating); | |||
foreach($rotatingProductsArray as $rotatingProduct) { | |||
$selectedProductsIdsArray[] = $rotatingProduct->getProduct()->id; | |||
} | |||
$rotating->setSelectedProductsIds($selectedProductsIdsArray); | |||
} | |||
} |
@@ -4,21 +4,56 @@ namespace domain\Product\Rotating; | |||
use domain\_\AbstractManager; | |||
use domain\Producer\Producer\Producer; | |||
use domain\Product\Product\ProductRepository; | |||
use domain\Product\RotatingProduct\RotatingProductManager; | |||
class RotatingManager extends AbstractManager | |||
{ | |||
protected RotatingBuilder $rotatingBuilder; | |||
protected ProductRepository $productRepository; | |||
protected RotatingProductManager $rotatingProductManager; | |||
public function loadDependencies(): void | |||
{ | |||
$this->rotatingBuilder = $this->loadService(RotatingBuilder::class); | |||
$this->productRepository = $this->loadService(ProductRepository::class); | |||
$this->rotatingProductManager = $this->loadService(RotatingProductManager::class); | |||
} | |||
public function createRotating(Producer $producer, string $name, int $day): Rotating | |||
public function createRotating(Producer $producer, string $name, int $day, array $productsIdsArray): Rotating | |||
{ | |||
$rotating = $this->rotatingBuilder->instanciateRotating($producer, $name, $day); | |||
$rotating = $this->rotatingBuilder->instanciateRotating($producer); | |||
$rotating->setName($name); | |||
$rotating->setDay($day); | |||
$rotating->save(); | |||
$this->manageRotatingProducts($rotating, $productsIdsArray); | |||
return $rotating; | |||
} | |||
public function manageRotatingProducts(Rotating $rotating, array $productsIdsArray = []): void | |||
{ | |||
$this->deleteAllRotatingProducts($rotating); | |||
foreach($productsIdsArray as $productId) { | |||
$product = $this->productRepository->findOneProductById($productId); | |||
if($product) { | |||
$this->rotatingProductManager->createRotatingProduct($rotating, $product); | |||
} | |||
} | |||
} | |||
public function deleteRotating(Rotating $rotating): bool | |||
{ | |||
$this->deleteAllRotatingProducts($rotating); | |||
return $rotating->delete(); | |||
} | |||
public function deleteAllRotatingProducts(Rotating $rotating): void | |||
{ | |||
foreach($rotating->getRotatingProducts() as $rotatingProduct) { | |||
$rotatingProduct->delete(); | |||
} | |||
} | |||
} |
@@ -19,7 +19,7 @@ class RotatingRepository extends AbstractRepository | |||
return [ | |||
self::WITH => [], | |||
self::JOIN_WITH => [], | |||
self::ORDER_BY => 'rotating.name ASC', | |||
self::ORDER_BY => 'rotating.day ASC', | |||
self::ATTRIBUTE_ID_PRODUCER => 'rotating.id_producer' | |||
]; | |||
} |
@@ -28,7 +28,13 @@ class RotatingProductBuilder extends AbstractBuilder | |||
public function initRotatingProductPosition(RotatingProduct $rotatingProduct): RotatingProduct | |||
{ | |||
$lastRotatingProduct = $this->rotatingProductRepository->findOneLastRotatingProduct($rotatingProduct->getRotating()); | |||
$rotatingProduct->setPosition($lastRotatingProduct->getPosition() + 1); | |||
if($lastRotatingProduct) { | |||
$rotatingProduct->setPosition($lastRotatingProduct->getPosition() + 1); | |||
} | |||
else { | |||
$rotatingProduct->setPosition(1); | |||
} | |||
return $rotatingProduct; | |||
} | |||
} |
@@ -24,6 +24,13 @@ class RotatingProductRepository extends AbstractRepository | |||
]; | |||
} | |||
public function findRotatingProductsByRotating(Rotating $rotating) | |||
{ | |||
return $this->createQuery() | |||
->filterByRotating($rotating) | |||
->find(); | |||
} | |||
public function findOneLastRotatingProduct(Rotating $rotating): ?RotatingProduct | |||
{ | |||
return $this->createQuery() |