<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
namespace backend\controllers; | namespace backend\controllers; | ||||
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use backend\models\MailForm ; | |||||
use yii\web\NotFoundHttpException ; | |||||
use common\models\ User ; | |||||
use backend\models\MailForm; | |||||
use yii\web\NotFoundHttpException; | |||||
use common\models\ User; | |||||
/** | /** | ||||
* UserController implements the CRUD actions for User model. | * UserController implements the CRUD actions for User model. | ||||
*/ | */ | ||||
class CommunicateAdminController extends BackendController | |||||
class CommunicateAdminController extends BackendController | |||||
{ | { | ||||
public function behaviors() | |||||
public function behaviors() | |||||
{ | { | ||||
return [ | return [ | ||||
'verbs' => [ | 'verbs' => [ | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return User::getCurrentStatus() == User::STATUS_ADMIN; | |||||
return User::getCurrentStatus() == User::STATUS_ADMIN; | |||||
} | } | ||||
] | ] | ||||
], | ], | ||||
} | } | ||||
/** | /** | ||||
* | |||||
* | |||||
* | |||||
* | |||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionIndex($section = 'producers') | |||||
public function actionIndex($section = 'producers') | |||||
{ | { | ||||
if($section == 'producers') { | |||||
$producers = Producer::find()->where(['producer.active' => 1])->with(['contact'])->all() ; | |||||
if ($section == 'producers') { | |||||
$producers = Producer::find()->where(['producer.active' => 1])->with(['contact'])->all(); | |||||
$usersArray = []; | $usersArray = []; | ||||
$users = [] ; | |||||
$users = []; | |||||
foreach ($producers as $producer) { | foreach ($producers as $producer) { | ||||
if (isset($producer->contact) && is_array($producer->contact)) { | if (isset($producer->contact) && is_array($producer->contact)) { | ||||
foreach($producer->contact as $contact) { | |||||
$usersArray[] = $contact->email ; | |||||
foreach ($producer->contact as $contact) { | |||||
$usersArray[] = $contact->email; | |||||
$users[] = [ | $users[] = [ | ||||
'email' => $contact->email, | 'email' => $contact->email, | ||||
'name' => $contact->name, | 'name' => $contact->name, | ||||
'lastname' => $contact->lastname, | 'lastname' => $contact->lastname, | ||||
] ; | |||||
]; | |||||
} | } | ||||
} | } | ||||
} | } | ||||
} | |||||
elseif($section == 'users') { | |||||
$users = User::find() | |||||
} elseif ($section == 'users') { | |||||
$users = User::find() | |||||
->where([ | ->where([ | ||||
'user.status' => User::STATUS_ACTIVE | |||||
'user.status' => User::STATUS_ACTIVE | |||||
]) | ]) | ||||
->all() ; | |||||
->all(); | |||||
$usersArray = []; | $usersArray = []; | ||||
foreach ($users as $user) { | foreach ($users as $user) { | ||||
if (isset($user['email']) && strlen($user['email'])) { | if (isset($user['email']) && strlen($user['email'])) { | ||||
$usersArray[] = $user['email']; | $usersArray[] = $user['email']; | ||||
} | } | ||||
} | } | ||||
} | |||||
else { | |||||
} else { | |||||
throw new NotFoundHttpException('Requête incorrecte.'); | throw new NotFoundHttpException('Requête incorrecte.'); | ||||
} | } | ||||
$mailForm = new MailForm() ; | |||||
$mailForm = new MailForm(); | |||||
if ($mailForm->load(Yii::$app->request->post()) && $mailForm->validate()) { | if ($mailForm->load(Yii::$app->request->post()) && $mailForm->validate()) { | ||||
$resultSendEmail = $mailForm->sendEmail($users, false) ; | |||||
if($resultSendEmail) { | |||||
$resultSendEmail = $mailForm->sendEmail($users, false); | |||||
if ($resultSendEmail) { | |||||
Yii::$app->getSession()->setFlash('success', 'Votre email a bien été envoyé.'); | Yii::$app->getSession()->setFlash('success', 'Votre email a bien été envoyé.'); | ||||
} | |||||
else { | |||||
} else { | |||||
Yii::$app->getSession()->setFlash('error', 'Un problème est survenu lors de l\'envoi de votre email.'); | Yii::$app->getSession()->setFlash('error', 'Un problème est survenu lors de l\'envoi de votre email.'); | ||||
} | } | ||||
$mailForm->subject = '' ; | |||||
$mailForm->message = '' ; | |||||
$mailForm->subject = ''; | |||||
$mailForm->message = ''; | |||||
} | } | ||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'section' => $section, | 'section' => $section, | ||||
'usersArray' => $usersArray, | 'usersArray' => $usersArray, |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
namespace backend\controllers; | namespace backend\controllers; | ||||
/** | /** | ||||
* UserController implements the CRUD actions for User model. | * UserController implements the CRUD actions for User model. | ||||
*/ | */ | ||||
class CommunicateController extends BackendController | |||||
class CommunicateController extends BackendController | |||||
{ | { | ||||
public function behaviors() { | |||||
public function behaviors() | |||||
{ | |||||
return [ | return [ | ||||
'verbs' => [ | 'verbs' => [ | ||||
'class' => VerbFilter::className(), | 'class' => VerbFilter::className(), | ||||
/** | /** | ||||
* Affiche la page d'accueil de la section avec un aperçu du mpde d'emploi | * Affiche la page d'accueil de la section avec un aperçu du mpde d'emploi | ||||
* à imprimer. | * à imprimer. | ||||
* | |||||
* | |||||
* @return string | * @return string | ||||
*/ | */ | ||||
public function actionIndex() | |||||
public function actionIndex() | |||||
{ | { | ||||
$producer = Producer::searchOne() ; | |||||
$pointsSaleArray = PointSale::searchAll() ; | |||||
$producer = Producer::searchOne(); | |||||
$pointsSaleArray = PointSale::searchAll(); | |||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'producer' => $producer, | 'producer' => $producer, | ||||
'pointsSaleArray' => $pointsSaleArray, | 'pointsSaleArray' => $pointsSaleArray, | ||||
/** | /** | ||||
* Génére un PDF contenant le mode d'emploi d'utilisation de la plateforme | * Génére un PDF contenant le mode d'emploi d'utilisation de la plateforme | ||||
* à destination des clients des producteurs. | * à destination des clients des producteurs. | ||||
* | |||||
* | |||||
* @return string | * @return string | ||||
*/ | */ | ||||
public function actionInstructions() | |||||
public function actionInstructions() | |||||
{ | { | ||||
$producer = Producer::searchOne() ; | |||||
$producer = Producer::searchOne(); | |||||
// get your HTML raw content without any layouts or scripts | // get your HTML raw content without any layouts or scripts | ||||
$content = $this->renderPartial('instructions_multi', [ | $content = $this->renderPartial('instructions_multi', [ | ||||
// enhanced bootstrap css built by Krajee for mPDF formatting | // enhanced bootstrap css built by Krajee for mPDF formatting | ||||
//'cssFile' => '@vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css', | //'cssFile' => '@vendor/kartik-v/yii2-mpdf/assets/kv-mpdf-bootstrap.min.css', | ||||
'cssFile' => '@app/web/css/screen.css', | 'cssFile' => '@app/web/css/screen.css', | ||||
// any css to be embedded if required | |||||
//'cssInline' => '.kv-heading-1{font-size:18px}', | |||||
// set mPDF properties on the fly | |||||
//'options' => ['title' => 'Krajee Report Title'], | |||||
// call mPDF methods on the fly | |||||
/* 'methods' => [ | |||||
'SetHeader'=>['Commandes du '.$date_str], | |||||
'SetFooter'=>['{PAGENO}'], | |||||
] */ | |||||
// any css to be embedded if required | |||||
//'cssInline' => '.kv-heading-1{font-size:18px}', | |||||
// set mPDF properties on the fly | |||||
//'options' => ['title' => 'Krajee Report Title'], | |||||
// call mPDF methods on the fly | |||||
/* 'methods' => [ | |||||
'SetHeader'=>['Commandes du '.$date_str], | |||||
'SetFooter'=>['{PAGENO}'], | |||||
] */ | |||||
]); | ]); | ||||
// return the pdf output as per the destination setting | // return the pdf output as per the destination setting |
public function behaviors() | public function behaviors() | ||||
{ | { | ||||
return [ | return [ | ||||
'verbs' => [ | |||||
'class' => VerbFilter::className(), | |||||
'actions' => [ | |||||
'delete' => ['post'], | |||||
], | |||||
'verbs' => [ | |||||
'class' => VerbFilter::className(), | |||||
'actions' => [ | |||||
'delete' => ['post'], | |||||
], | ], | ||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'allow' => true, | |||||
'roles' => ['?'], | |||||
], | |||||
[ | |||||
'actions' => ['pay-orders'], | |||||
'allow' => true, | |||||
'roles' => ['@'] | |||||
], | |||||
], | |||||
], | |||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'allow' => true, | |||||
'roles' => ['?'], | |||||
], | |||||
[ | |||||
'actions' => ['pay-orders'], | |||||
'allow' => true, | |||||
'roles' => ['@'] | |||||
], | |||||
], | ], | ||||
], | |||||
]; | ]; | ||||
} | } | ||||
} | } | ||||
return [ | return [ | ||||
'return' => 'success', | |||||
'alert' => [ | |||||
'type' => 'success', | |||||
'message' => 'Commandes payées.' | |||||
] | |||||
'return' => 'success', | |||||
'alert' => [ | |||||
'type' => 'success', | |||||
'message' => 'Commandes payées.' | |||||
] | |||||
]; | ]; | ||||
} | } | ||||
$mailOrdersSend = false; | $mailOrdersSend = false; | ||||
$distribution = DistributionModel::findOne([ | $distribution = DistributionModel::findOne([ | ||||
'date' => $date, | |||||
'active' => 1, | |||||
'id_producer' => $producer->id, | |||||
]); | |||||
'date' => $date, | |||||
'active' => 1, | |||||
'id_producer' => $producer->id, | |||||
]); | |||||
if ($distribution) { | if ($distribution) { | ||||
if ($hour == $producer->order_deadline || strlen($forceDate)) { | if ($hour == $producer->order_deadline || strlen($forceDate)) { | ||||
*/ | */ | ||||
$arrayOrders = Order::searchAll([ | $arrayOrders = Order::searchAll([ | ||||
'distribution.date' => $date, | |||||
'distribution.id_producer' => $producer->id | |||||
], [ | |||||
'conditions' => 'date_delete IS NULL' | |||||
]); | |||||
'distribution.date' => $date, | |||||
'distribution.id_producer' => $producer->id | |||||
], [ | |||||
'conditions' => 'date_delete IS NULL' | |||||
]); | |||||
$configCredit = Producer::getConfig('credit', $producer->id); | $configCredit = Producer::getConfig('credit', $producer->id); | ||||
if ($order->auto_payment && $configCredit) { | if ($order->auto_payment && $configCredit) { | ||||
if ($order->getAmount(Order::AMOUNT_REMAINING) > 0) { | if ($order->getAmount(Order::AMOUNT_REMAINING) > 0) { | ||||
$order->saveCreditHistory( | $order->saveCreditHistory( | ||||
CreditHistory::TYPE_PAYMENT, | |||||
$order->getAmount(Order::AMOUNT_REMAINING), | |||||
$order->distribution->id_producer, | |||||
$order->id_user, | |||||
User::ID_USER_SYSTEM | |||||
CreditHistory::TYPE_PAYMENT, | |||||
$order->getAmount(Order::AMOUNT_REMAINING), | |||||
$order->distribution->id_producer, | |||||
$order->id_user, | |||||
User::ID_USER_SYSTEM | |||||
); | ); | ||||
$countOrders++; | $countOrders++; | ||||
} | } | ||||
if (!strlen($forceDate) && Producer::getConfig('option_notify_producer_order_summary', $producer->id)) { | if (!strlen($forceDate) && Producer::getConfig('option_notify_producer_order_summary', $producer->id)) { | ||||
$arrayOrders = Order::searchAll([ | $arrayOrders = Order::searchAll([ | ||||
'distribution.date' => $date, | |||||
'distribution.id_producer' => $producer->id | |||||
], [ | |||||
'conditions' => 'date_delete IS NULL' | |||||
]); | |||||
'distribution.date' => $date, | |||||
'distribution.id_producer' => $producer->id | |||||
], [ | |||||
'conditions' => 'date_delete IS NULL' | |||||
]); | |||||
$mail = Yii::$app->mailer->compose( | $mail = Yii::$app->mailer->compose( | ||||
[ | |||||
'html' => 'cronOrdersSummary-html', | |||||
'text' => 'cronOrdersSummary-text', | |||||
], [ | |||||
'date' => $date, | |||||
'orders' => $arrayOrders | |||||
] | |||||
[ | |||||
'html' => 'cronOrdersSummary-html', | |||||
'text' => 'cronOrdersSummary-text', | |||||
], [ | |||||
'date' => $date, | |||||
'orders' => $arrayOrders | |||||
] | |||||
) | ) | ||||
->setFrom([Yii::$app->params['adminEmail'] => 'distrib']); | ->setFrom([Yii::$app->params['adminEmail'] => 'distrib']); | ||||
// génération du pdf de commande | // génération du pdf de commande | ||||
Yii::$app->runAction('distribution/report-cron', [ | Yii::$app->runAction('distribution/report-cron', [ | ||||
'date' => $date, | |||||
'save' => true, | |||||
'idProducer' => $producer->id, | |||||
'key' => '64ac0bdab7e9f5e48c4d991ec5201d57' | |||||
'date' => $date, | |||||
'save' => true, | |||||
'idProducer' => $producer->id, | |||||
'key' => '64ac0bdab7e9f5e48c4d991ec5201d57' | |||||
]); | ]); | ||||
$mail->attach( | $mail->attach( | ||||
Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $producer->id . '.pdf') | |||||
Yii::getAlias('@app/web/pdf/Commandes-' . $date . '-' . $producer->id . '.pdf') | |||||
); | ); | ||||
} else { | } else { | ||||
$subject = '[distrib] Aucune commande'; | $subject = '[distrib] Aucune commande'; | ||||
$mail->setSubject($subject); | $mail->setSubject($subject); | ||||
// envoi des emails à tous les comptes users (statut producer) associés à ce producteur | // envoi des emails à tous les comptes users (statut producer) associés à ce producteur | ||||
$userArray = User::searchAll([ | |||||
'id_producer' => $producer->id, | |||||
'status' => User::STATUS_PRODUCER | |||||
]); | |||||
$userArray = User::searchAll([ | |||||
'id_producer' => $producer->id, | |||||
'status' => User::STATUS_PRODUCER | |||||
]); | |||||
foreach ($userArray as $user) { | foreach ($userArray as $user) { | ||||
$mail->setTo($user->email)->send(); | $mail->setTo($user->email)->send(); |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use Yii; | use Yii; | ||||
class DeliveryNoteController extends DocumentController | |||||
class DeliveryNoteController extends DocumentController | |||||
{ | { | ||||
public function behaviors() | |||||
public function behaviors() | |||||
{ | { | ||||
return [ | return [ | ||||
'verbs' => [ | 'verbs' => [ | ||||
/** | /** | ||||
* Liste les modèles Invoice. | * Liste les modèles Invoice. | ||||
* | |||||
* | |||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionIndex() | |||||
public function actionIndex() | |||||
{ | { | ||||
$searchModel = new DeliveryNoteSearch() ; | |||||
$searchModel = new DeliveryNoteSearch(); | |||||
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); | $dataProvider = $searchModel->search(Yii::$app->request->queryParams); | ||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'searchModel' => $searchModel, | 'searchModel' => $searchModel, | ||||
'dataProvider' => $dataProvider, | 'dataProvider' => $dataProvider, |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
namespace backend\controllers; | namespace backend\controllers; | ||||
/** | /** | ||||
* DeveloppementController implements the CRUD actions for Developpement model. | * DeveloppementController implements the CRUD actions for Developpement model. | ||||
*/ | */ | ||||
class DevelopmentController extends Controller | |||||
class DevelopmentController extends Controller | |||||
{ | { | ||||
/** | /** | ||||
* @inheritdoc | * @inheritdoc | ||||
*/ | */ | ||||
public function behaviors() { | |||||
public function behaviors() | |||||
{ | |||||
return [ | return [ | ||||
'access' => [ | 'access' => [ | ||||
'class' => AccessControl::className(), | 'class' => AccessControl::className(), | ||||
/** | /** | ||||
* Liste les développements. | * Liste les développements. | ||||
* | |||||
* | |||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionIndex() | public function actionIndex() | ||||
{ | { | ||||
$versionsArray = Opendistrib::getVersions(); | $versionsArray = Opendistrib::getVersions(); | ||||
$versionsRenderArray = []; | $versionsRenderArray = []; | ||||
foreach($versionsArray as $version) { | |||||
foreach ($versionsArray as $version) { | |||||
$versionsRenderArray[$version] = [ | $versionsRenderArray[$version] = [ | ||||
'version' => $version, | 'version' => $version, | ||||
'content' => $this->renderFile('@common/versions/'.$version.'.php') | |||||
'content' => $this->renderFile('@common/versions/' . $version . '.php') | |||||
]; | ]; | ||||
} | } | ||||
* If creation is successful, the browser will be redirected to the 'view' page. | * If creation is successful, the browser will be redirected to the 'view' page. | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionCreate() | |||||
public function actionCreate() | |||||
{ | { | ||||
$model = new Development(); | $model = new Development(); | ||||
/** | /** | ||||
* Updates an existing Developpement model. | * Updates an existing Developpement model. | ||||
* If update is successful, the browser will be redirected to the 'view' page. | * If update is successful, the browser will be redirected to the 'view' page. | ||||
* | |||||
* | |||||
* @param integer $id | * @param integer $id | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionUpdate($id) | |||||
public function actionUpdate($id) | |||||
{ | { | ||||
$model = $this->findModel($id); | $model = $this->findModel($id); | ||||
* @param integer $id | * @param integer $id | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionDelete($id) | |||||
public function actionDelete($id) | |||||
{ | { | ||||
$this->findModel($id)->delete(); | $this->findModel($id)->delete(); | ||||
Yii::$app->getSession()->setFlash('success', 'Développement supprimé'); | Yii::$app->getSession()->setFlash('success', 'Développement supprimé'); | ||||
/** | /** | ||||
* Définit une priorité pour un développement. | * Définit une priorité pour un développement. | ||||
* | |||||
* | |||||
* @param integer $idDevelopment | * @param integer $idDevelopment | ||||
* @param string $priorite | * @param string $priorite | ||||
*/ | */ | ||||
public function actionPriority($idDevelopment, $priority = null) | |||||
public function actionPriority($idDevelopment, $priority = null) | |||||
{ | { | ||||
$develpmentPriority = DevelopmentPriorityModel::searchOne([ | $develpmentPriority = DevelopmentPriorityModel::searchOne([ | ||||
'id_development' => $idDevelopment, | 'id_development' => $idDevelopment, | ||||
]) ; | |||||
]); | |||||
if (in_array($priority, [DevelopmentPriorityModel::PRIORITY_HIGH, | if (in_array($priority, [DevelopmentPriorityModel::PRIORITY_HIGH, | ||||
DevelopmentPriorityModel::PRIORITY_NORMAL, | |||||
DevelopmentPriorityModel::PRIORITY_LOW])) { | |||||
DevelopmentPriorityModel::PRIORITY_NORMAL, | |||||
DevelopmentPriorityModel::PRIORITY_LOW])) { | |||||
if ($develpmentPriority) { | if ($develpmentPriority) { | ||||
$develpmentPriority->priority = $priority; | $develpmentPriority->priority = $priority; | ||||
* @return Developpement the loaded model | * @return Developpement the loaded model | ||||
* @throws NotFoundHttpException if the model cannot be found | * @throws NotFoundHttpException if the model cannot be found | ||||
*/ | */ | ||||
protected function findModel($id) | |||||
protected function findModel($id) | |||||
{ | { | ||||
if (($model = DevelopmentModel::findOne($id)) !== null) { | if (($model = DevelopmentModel::findOne($id)) !== null) { | ||||
return $model; | return $model; |
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\helpers\MeanPayment; | |||||
use common\helpers\Price; | use common\helpers\Price; | ||||
use common\logic\Distribution\Distribution\Distribution; | |||||
use DateTime; | use DateTime; | ||||
use yii\filters\AccessControl; | |||||
class DistributionController extends BackendController | class DistributionController extends BackendController | ||||
{ | { | ||||
{ | { | ||||
return [ | return [ | ||||
'access' => [ | 'access' => [ | ||||
'class' => AccessControl::className(), | |||||
'class' => AccessControl::class, | |||||
'rules' => [ | 'rules' => [ | ||||
[ | [ | ||||
'actions' => ['report-cron', 'report-terredepains'], | 'actions' => ['report-cron', 'report-terredepains'], | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return User::getCurrentStatus() == User::STATUS_ADMIN | |||||
|| User::getCurrentStatus() == User::STATUS_PRODUCER; | |||||
return $this->getUserManager()->getCurrentStatus() == User::STATUS_ADMIN | |||||
|| $this->getUserManager()->getCurrentStatus() == User::STATUS_PRODUCER; | |||||
} | } | ||||
] | ] | ||||
], | ], | ||||
{ | { | ||||
$this->checkProductsPointsSale(); | $this->checkProductsPointsSale(); | ||||
$orderManager = $this->getOrderManager(); | |||||
$format = 'Y-m-d'; | $format = 'Y-m-d'; | ||||
$theDate = ''; | $theDate = ''; | ||||
$dateObject = DateTime::createFromFormat($format, $date); | $dateObject = DateTime::createFromFormat($format, $date); | ||||
$orderUpdate = null; | $orderUpdate = null; | ||||
if ($idOrderUpdate) { | if ($idOrderUpdate) { | ||||
$orderUpdate = Order::searchOne(['id' => $idOrderUpdate]); | |||||
$orderUpdate = $orderManager->findOneOrderById($idOrderUpdate); | |||||
} | } | ||||
return $this->render('index', [ | return $this->render('index', [ | ||||
$json['means_payment'] = MeanPayment::getAll(); | $json['means_payment'] = MeanPayment::getAll(); | ||||
$distributionsArray = DistributionModel::searchAll([ | |||||
$distributionsArray = Distribution::searchAll([ | |||||
'active' => 1 | 'active' => 1 | ||||
], [ | ], [ | ||||
'conditions' => [ | 'conditions' => [ | ||||
$json['distribution'] = [ | $json['distribution'] = [ | ||||
'id' => $distribution->id, | 'id' => $distribution->id, | ||||
'active' => $distribution->active, | 'active' => $distribution->active, | ||||
'url_report' => Yii::$app->urlManagerBackend->createUrl( | |||||
'url_report' => $this->getUrlManagerBackend()->createUrl( | |||||
['distribution/report', 'date' => $distribution->date] | ['distribution/report', 'date' => $distribution->date] | ||||
), | ), | ||||
'url_report_grid' => Yii::$app->urlManagerBackend->createUrl( | |||||
'url_report_grid' => $this->getUrlManagerBackend()->createUrl( | |||||
['distribution/report-grid', 'date' => $distribution->date] | ['distribution/report-grid', 'date' => $distribution->date] | ||||
), | ), | ||||
]; | ]; | ||||
$json['distribution']['weight'] = number_format($weight, 2); | $json['distribution']['weight'] = number_format($weight, 2); | ||||
// products | // products | ||||
$productsQuery = Product::find() | |||||
$productsQuery = Product::find() | |||||
->orWhere(['id_producer' => GlobalParam::getCurrentProducerId(),]) | ->orWhere(['id_producer' => GlobalParam::getCurrentProducerId(),]) | ||||
->joinWith([ | ->joinWith([ | ||||
'taxRate', | 'taxRate', | ||||
$productOrderArray = []; | $productOrderArray = []; | ||||
foreach ($order->productOrder as $productOrder) { | foreach ($order->productOrder as $productOrder) { | ||||
$productOrderArray[$productOrder->id_product] = [ | $productOrderArray[$productOrder->id_product] = [ | ||||
'quantity' => $productOrder->quantity * Product::$unitsArray[$productOrder->unit]['coefficient'], | |||||
'quantity' => $productOrder->quantity * Product::$unitsArray[$productOrder->unit]['coefficient'], | |||||
'unit' => $productOrder->unit, | 'unit' => $productOrder->unit, | ||||
'price' => number_format($productOrder->price, 3), | 'price' => number_format($productOrder->price, 3), | ||||
'invoice_price' => number_format($productOrder->invoice_price, 2), | 'invoice_price' => number_format($productOrder->invoice_price, 2), | ||||
]; | ]; | ||||
// utilisateurs | // utilisateurs | ||||
$usersArray = User::findBy()->all(); | |||||
$usersArray = User::findBy()->all(); | |||||
$json['users'] = $usersArray; | $json['users'] = $usersArray; | ||||
} | } | ||||
// abonnements manquants | // abonnements manquants | ||||
$arraySubscriptions = Subscription::searchByDate($date); | |||||
$arraySubscriptions = Subscription::searchByDate($date); | |||||
$json['missing_subscriptions'] = []; | $json['missing_subscriptions'] = []; | ||||
if ($distribution->active) { | if ($distribution->active) { | ||||
foreach ($arraySubscriptions as $subscription) { | foreach ($arraySubscriptions as $subscription) { | ||||
{ | { | ||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||||
$user = User::findOne(['id' => $idUser]); | |||||
$user = User::findOne(['id' => $idUser]); | |||||
$favoritePointSale = $user->getFavoritePointSale(); | $favoritePointSale = $user->getFavoritePointSale(); | ||||
$idFavoritePointSale = 0; | $idFavoritePointSale = 0; | ||||
if ($favoritePointSale) { | if ($favoritePointSale) { | ||||
$order = Order::searchOne(['id' => $idOrder]); | $order = Order::searchOne(['id' => $idOrder]); | ||||
$distribution = DistributionModel::findOne($idDistribution); | $distribution = DistributionModel::findOne($idDistribution); | ||||
$user = User::findOne($idUser); | |||||
$user = User::findOne($idUser); | |||||
$pointSale = PointSale::findOne($idPointSale); | $pointSale = PointSale::findOne($idPointSale); | ||||
$productsArray = Product::find() | |||||
$productsArray = Product::find() | |||||
->where([ | ->where([ | ||||
'id_producer' => GlobalParam::getCurrentProducerId(), | 'id_producer' => GlobalParam::getCurrentProducerId(), | ||||
])->joinWith([ | ])->joinWith([ | ||||
$quantity = 0; | $quantity = 0; | ||||
$invoicePrice = null; | $invoicePrice = null; | ||||
if(isset($order->productOrder)) { | |||||
if (isset($order->productOrder)) { | |||||
foreach ($order->productOrder as $productOrder) { | foreach ($order->productOrder as $productOrder) { | ||||
if ($productOrder->id_product == $product['id']) { | if ($productOrder->id_product == $product['id']) { | ||||
if ($productOrder->invoice_price) { | if ($productOrder->invoice_price) { | ||||
$productOrderArray[$product['id']] = [ | $productOrderArray[$product['id']] = [ | ||||
'quantity' => $quantity, | 'quantity' => $quantity, | ||||
'unit' => $product->unit, | 'unit' => $product->unit, | ||||
'unit_coefficient' => Product::$unitsArray[$product->unit]['coefficient'], | |||||
'unit_coefficient' => Product::$unitsArray[$product->unit]['coefficient'], | |||||
'prices' => $priceArray, | 'prices' => $priceArray, | ||||
'active' => $product->productDistribution[0]->active | 'active' => $product->productDistribution[0]->active | ||||
&& (!$pointSale || $product->isAvailableOnPointSale($pointSale)), | && (!$pointSale || $product->isAvailableOnPointSale($pointSale)), | ||||
if ($order && $order->distribution->id_producer == GlobalParam::getCurrentProducerId()) { | if ($order && $order->distribution->id_producer == GlobalParam::getCurrentProducerId()) { | ||||
$userProducer = null; | $userProducer = null; | ||||
if ($order->id_user) { | if ($order->id_user) { | ||||
$userProducer = UserProducer::searchOne([ | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_user' => $order->id_user, | 'id_user' => $order->id_user, | ||||
'id_producer' => GlobalParam::getCurrentProducerId() | 'id_producer' => GlobalParam::getCurrentProducerId() | ||||
]); | ]); | ||||
if ($invoicePrice != $productOrder->price) { | if ($invoicePrice != $productOrder->price) { | ||||
$productOrder->invoice_price = $invoicePrice; | $productOrder->invoice_price = $invoicePrice; | ||||
} | |||||
else { | |||||
} else { | |||||
$productOrder->invoice_price = null; | $productOrder->invoice_price = null; | ||||
} | } | ||||
$productOrder->save(); | $productOrder->save(); | ||||
} | } | ||||
// produits | // produits | ||||
$productsArray = Product::find() | |||||
$productsArray = Product::find() | |||||
->joinWith([ | ->joinWith([ | ||||
'productDistribution' => function ($q) use ($distribution) { | 'productDistribution' => function ($q) use ($distribution) { | ||||
$q->where(['id_distribution' => $distribution->id]); | $q->where(['id_distribution' => $distribution->id]); | ||||
$cpt = 2; | $cpt = 2; | ||||
foreach ($productsArray as $product) { | foreach ($productsArray as $product) { | ||||
$productsHasQuantity[$product->id] = 0; | $productsHasQuantity[$product->id] = 0; | ||||
foreach ( Product::$unitsArray as $unit => $dataUnit) { | |||||
foreach (Product::$unitsArray as $unit => $dataUnit) { | |||||
$quantity = Order::getProductQuantity($product->id, $ordersArray, true, $unit); | $quantity = Order::getProductQuantity($product->id, $ordersArray, true, $unit); | ||||
if ($quantity) { | if ($quantity) { | ||||
$productsHasQuantity[$product->id] += $quantity; | $productsHasQuantity[$product->id] += $quantity; | ||||
$productUnit = $product->unit; | $productUnit = $product->unit; | ||||
} | } | ||||
$productName .= ' (' . Product::strUnit($productUnit, 'wording_short', true) . ')'; | |||||
$productName .= ' (' . Product::strUnit($productUnit, 'wording_short', true) . ')'; | |||||
$productsNameArray[] = $productName; | $productsNameArray[] = $productName; | ||||
$productsIndexArray[$product->id] = $cpt++; | $productsIndexArray[$product->id] = $cpt++; | ||||
} | } | ||||
$orderLine[$productsIndexArray[$productOrder->id_product]] .= $productOrder->quantity; | $orderLine[$productsIndexArray[$productOrder->id_product]] .= $productOrder->quantity; | ||||
if ($productOrder->product->unit != $productOrder->unit) { | if ($productOrder->product->unit != $productOrder->unit) { | ||||
$orderLine[$productsIndexArray[$productOrder->id_product]] .= Product::strUnit( | |||||
$orderLine[$productsIndexArray[$productOrder->id_product]] .= Product::strUnit( | |||||
$productOrder->unit, | $productOrder->unit, | ||||
'wording_short', | 'wording_short', | ||||
true | true | ||||
} | } | ||||
// catégories | // catégories | ||||
$categoriesArray = ProductCategory::searchAll( | |||||
$categoriesArray = ProductCategory::searchAll( | |||||
['id_producer' => $idProducer], | ['id_producer' => $idProducer], | ||||
['orderby' => 'product_category.position ASC'] | ['orderby' => 'product_category.position ASC'] | ||||
); | ); | ||||
array_unshift($categoriesArray, null); | array_unshift($categoriesArray, null); | ||||
// produits | // produits | ||||
$productsArray = Product::find() | |||||
$productsArray = Product::find() | |||||
->joinWith([ | ->joinWith([ | ||||
'productDistribution' => function ($q) use ($distribution) { | 'productDistribution' => function ($q) use ($distribution) { | ||||
$q->where(['id_distribution' => $distribution->id]); | $q->where(['id_distribution' => $distribution->id]); | ||||
} | } | ||||
// produits | // produits | ||||
$productsArray = Product::find() | |||||
$productsArray = Product::find() | |||||
->joinWith([ | ->joinWith([ | ||||
'productDistribution' => function ($q) use ($distribution) { | 'productDistribution' => function ($q) use ($distribution) { | ||||
$q->where(['id_distribution' => $distribution->id]); | $q->where(['id_distribution' => $distribution->id]); | ||||
$productsHasQuantity = []; | $productsHasQuantity = []; | ||||
$cpt = 1; | $cpt = 1; | ||||
foreach ($productsArray as $product) { | foreach ($productsArray as $product) { | ||||
$theUnit = Product::strUnit($product->unit, 'wording_short', true); | |||||
$theUnit = Product::strUnit($product->unit, 'wording_short', true); | |||||
$theUnit = ($theUnit == 'p.') ? '' : ' (' . $theUnit . ')'; | $theUnit = ($theUnit == 'p.') ? '' : ' (' . $theUnit . ')'; | ||||
$productsNameArray[] = $product->name . $theUnit; | $productsNameArray[] = $product->name . $theUnit; | ||||
$productsIndexArray[$product->id] = $cpt++; | $productsIndexArray[$product->id] = $cpt++; | ||||
{ | { | ||||
$totalsPointSaleArray = [$label]; | $totalsPointSaleArray = [$label]; | ||||
foreach ($productsArray as $product) { | foreach ($productsArray as $product) { | ||||
foreach ( Product::$unitsArray as $unit => $dataUnit) { | |||||
foreach (Product::$unitsArray as $unit => $dataUnit) { | |||||
$quantity = Order::getProductQuantity($product->id, $ordersArray, false, $unit); | $quantity = Order::getProductQuantity($product->id, $ordersArray, false, $unit); | ||||
if ($quantity) { | if ($quantity) { | ||||
$index = $productsIndexArray[$product->id]; | $index = $productsIndexArray[$product->id]; | ||||
$totalsPointSaleArray[$index] .= $quantity; | $totalsPointSaleArray[$index] .= $quantity; | ||||
if ($product->unit != $unit) { | if ($product->unit != $unit) { | ||||
$totalsPointSaleArray[$index] .= '' . Product::strUnit($unit, 'wording_short', true); | |||||
$totalsPointSaleArray[$index] .= '' . Product::strUnit($unit, 'wording_short', true); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
foreach ($productsArray as $product) { | foreach ($productsArray as $product) { | ||||
$quantity = 0; | $quantity = 0; | ||||
foreach ( Product::$unitsArray as $unit => $dataUnit) { | |||||
foreach (Product::$unitsArray as $unit => $dataUnit) { | |||||
$quantityProduct = Order::getProductQuantity($product->id, $ordersArray, false, $unit); | $quantityProduct = Order::getProductQuantity($product->id, $ordersArray, false, $unit); | ||||
if ($unit == 'piece') { | if ($unit == 'piece') { | ||||
public function actionAjaxProcessAddSubscriptions($date) | public function actionAjaxProcessAddSubscriptions($date) | ||||
{ | { | ||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||||
Subscription::addAll($date, true); | |||||
Subscription::addAll($date, true); | |||||
return ['success']; | return ['success']; | ||||
} | } | ||||
$order->save(); | $order->save(); | ||||
// init invoice prices | // init invoice prices | ||||
$user = User::searchOne([ | |||||
$user = User::searchOne([ | |||||
'id' => $deliveryNote->id_user | 'id' => $deliveryNote->id_user | ||||
]); | ]); | ||||
$userProducer = UserProducer::searchOne([ | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_user' => $deliveryNote->id_user, | 'id_user' => $deliveryNote->id_user, | ||||
'id_producer' => GlobalParam::getCurrentProducerId() | 'id_producer' => GlobalParam::getCurrentProducerId() | ||||
]); | ]); | ||||
if ($firstOrder->pointSale->id_user) { | if ($firstOrder->pointSale->id_user) { | ||||
$deliveryNote->id_user = $firstOrder->pointSale->id_user; | $deliveryNote->id_user = $firstOrder->pointSale->id_user; | ||||
$user = User::searchOne([ | |||||
$user = User::searchOne([ | |||||
'id' => $deliveryNote->id_user | 'id' => $deliveryNote->id_user | ||||
]); | ]); | ||||
$userProducer = UserProducer::searchOne([ | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_user' => $deliveryNote->id_user, | 'id_user' => $deliveryNote->id_user, | ||||
'id_producer' => GlobalParam::getCurrentProducerId() | 'id_producer' => GlobalParam::getCurrentProducerId() | ||||
]); | ]); | ||||
} else { | } else { | ||||
$user = new User; | $user = new User; | ||||
$user->type = User::TYPE_LEGAL_PERSON; | |||||
$user->type = User::TYPE_LEGAL_PERSON; | |||||
$user->name_legal_person = $firstOrder->pointSale->name; | $user->name_legal_person = $firstOrder->pointSale->name; | ||||
$user->address = $firstOrder->pointSale->address; | $user->address = $firstOrder->pointSale->address; | ||||
$user->id_producer = 0; | $user->id_producer = 0; | ||||
} | } | ||||
if (!isset($user) || !$user) { | if (!isset($user) || !$user) { | ||||
$user = User::searchOne([ | |||||
$user = User::searchOne([ | |||||
'id' => $deliveryNote->id_user | 'id' => $deliveryNote->id_user | ||||
]); | ]); | ||||
$userProducer = UserProducer::searchOne([ | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_user' => $deliveryNote->id_user, | 'id_user' => $deliveryNote->id_user, | ||||
'id_producer' => GlobalParam::getCurrentProducerId() | 'id_producer' => GlobalParam::getCurrentProducerId() | ||||
]); | ]); |
public function behaviors() | public function behaviors() | ||||
{ | { | ||||
return [ | return [ | ||||
'verbs' => [ | |||||
'class' => VerbFilter::className(), | |||||
'actions' => [ | |||||
], | |||||
'verbs' => [ | |||||
'class' => VerbFilter::className(), | |||||
'actions' => [ | |||||
], | ], | ||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
'matchCallback' => function ($rule, $action) { | |||||
return $this->getUserManager()->hasAccessBackend(); | |||||
} | |||||
] | |||||
], | |||||
], | |||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
'matchCallback' => function ($rule, $action) { | |||||
return $this->getUserManager()->hasAccessBackend(); | |||||
} | |||||
] | |||||
], | ], | ||||
], | |||||
]; | ]; | ||||
} | } | ||||
Invoice::find()->where(['status' => Document::STATUS_VALID])->all() | Invoice::find()->where(['status' => Document::STATUS_VALID])->all() | ||||
); | ); | ||||
foreach($validatedDocumentsArray as $document) { | |||||
if(!file_exists($document->getFilenameComplete())) { | |||||
foreach ($validatedDocumentsArray as $document) { | |||||
if (!file_exists($document->getFilenameComplete())) { | |||||
$document->generatePdf(Pdf::DEST_FILE); | $document->generatePdf(Pdf::DEST_FILE); | ||||
} | } | ||||
} | } | ||||
} | } | ||||
return $this->render('/document/create', [ | return $this->render('/document/create', [ | ||||
'title' => $this->getTitle('Ajouter'), | |||||
'typeDocument' => $this->getDocumentType(), | |||||
'model' => $model, | |||||
'title' => $this->getTitle('Ajouter'), | |||||
'typeDocument' => $this->getDocumentType(), | |||||
'model' => $model, | |||||
]); | ]); | ||||
} | } | ||||
if ($model->deliveryNotes && is_array($model->deliveryNotes) && count($model->deliveryNotes)) { | if ($model->deliveryNotes && is_array($model->deliveryNotes) && count($model->deliveryNotes)) { | ||||
foreach ($model->deliveryNotes as $key => $idDeliveryNote) { | foreach ($model->deliveryNotes as $key => $idDeliveryNote) { | ||||
Order::updateAll([ | Order::updateAll([ | ||||
'id_invoice' => $model->id | |||||
], [ | |||||
'id_delivery_note' => $idDeliveryNote | |||||
]); | |||||
'id_invoice' => $model->id | |||||
], [ | |||||
'id_delivery_note' => $idDeliveryNote | |||||
]); | |||||
} | } | ||||
} | } | ||||
} | } | ||||
} | } | ||||
return $this->render('/document/update', [ | return $this->render('/document/update', [ | ||||
'title' => $this->getTitle('Modifier'), | |||||
'typeDocument' => $this->getDocumentType(), | |||||
'model' => $model, | |||||
'title' => $this->getTitle('Modifier'), | |||||
'typeDocument' => $this->getDocumentType(), | |||||
'model' => $model, | |||||
]); | ]); | ||||
} | } | ||||
if ($this->getClass() == 'DeliveryNote') { | if ($this->getClass() == 'DeliveryNote') { | ||||
Order::updateAll([ | Order::updateAll([ | ||||
'order.id_delivery_note' => null | |||||
], [ | |||||
'order.id_delivery_note' => $id | |||||
]); | |||||
'order.id_delivery_note' => null | |||||
], [ | |||||
'order.id_delivery_note' => $id | |||||
]); | |||||
} | } | ||||
if ($this->getClass() == 'Quotation') { | if ($this->getClass() == 'Quotation') { | ||||
Order::updateAll([ | Order::updateAll([ | ||||
'order.id_quotation' => null | |||||
], [ | |||||
'order.id_quotation' => $id | |||||
]); | |||||
'order.id_quotation' => null | |||||
], [ | |||||
'order.id_quotation' => $id | |||||
]); | |||||
} | } | ||||
if ($this->getClass() == 'Invoice') { | if ($this->getClass() == 'Invoice') { | ||||
Order::updateAll([ | Order::updateAll([ | ||||
'order.id_invoice' => null | |||||
], [ | |||||
'order.id_invoice' => $id | |||||
]); | |||||
'order.id_invoice' => null | |||||
], [ | |||||
'order.id_invoice' => $id | |||||
]); | |||||
} | } | ||||
Yii::$app->getSession()->setFlash('success', $this->getFlashMessage('delete', $model)); | Yii::$app->getSession()->setFlash('success', $this->getFlashMessage('delete', $model)); | ||||
'Créateur', | 'Créateur', | ||||
]; | ]; | ||||
foreach($document->getProductsOrders() as $productOrderArray) { | |||||
foreach($productOrderArray as $productOrder) { | |||||
foreach ($document->getProductsOrders() as $productOrderArray) { | |||||
foreach ($productOrderArray as $productOrder) { | |||||
$price = $productOrder->getPrice() ; | |||||
if($document->isInvoicePrice() && $productOrder->getInvoicePrice()) { | |||||
$price = $productOrder->getInvoicePrice() ; | |||||
$price = $productOrder->getPrice(); | |||||
if ($document->isInvoicePrice() && $productOrder->getInvoicePrice()) { | |||||
$price = $productOrder->getInvoicePrice(); | |||||
} | } | ||||
$datas[] = [ | $datas[] = [ | ||||
// nom fichier | // nom fichier | ||||
$reference = $document->id; | $reference = $document->id; | ||||
if($document->reference && strlen($document->reference)) { | |||||
if ($document->reference && strlen($document->reference)) { | |||||
$reference = $document->reference; | $reference = $document->reference; | ||||
} | } | ||||
// status | // status | ||||
$status = ''; | $status = ''; | ||||
if($document->isStatusDraft()) { | |||||
if ($document->isStatusDraft()) { | |||||
$status = 'brouillon_'; | $status = 'brouillon_'; | ||||
} | } | ||||
CSV::downloadSendHeaders(strtolower($this->getDocumentType()).'_' . $status . $reference . '.csv'); | |||||
CSV::downloadSendHeaders(strtolower($this->getDocumentType()) . '_' . $status . $reference . '.csv'); | |||||
echo CSV::array2csv($datas); | echo CSV::array2csv($datas); | ||||
die(); | die(); | ||||
} | } | ||||
Yii::$app->getSession()->setFlash('danger', $this->getFlashMessage('send', $document)); | Yii::$app->getSession()->setFlash('danger', $this->getFlashMessage('send', $document)); | ||||
} | } | ||||
if($backUpdateForm) { | |||||
if ($backUpdateForm) { | |||||
return $this->redirect([$this->getControllerUrl() . '/update', 'id' => $id]); | return $this->redirect([$this->getControllerUrl() . '/update', 'id' => $id]); | ||||
} | |||||
else { | |||||
} else { | |||||
return $this->redirect([$this->getControllerUrl() . '/index']); | return $this->redirect([$this->getControllerUrl() . '/index']); | ||||
} | } | ||||
} | } | ||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||||
if ($idUser > 0) { | if ($idUser > 0) { | ||||
$user = User::searchOne([ | |||||
'id' => $idUser | |||||
]); | |||||
$user = User::searchOne([ | |||||
'id' => $idUser | |||||
]); | |||||
if ($user) { | if ($user) { | ||||
$document = null; | $document = null; | ||||
if (Document::isValidClass($classDocument)) { | if (Document::isValidClass($classDocument)) { | ||||
$document = $classDocument::searchOne([ | $document = $classDocument::searchOne([ | ||||
'id' => $idDocument, | |||||
'id_user' => $idUser | |||||
]); | |||||
'id' => $idDocument, | |||||
'id_user' => $idUser | |||||
]); | |||||
} | } | ||||
if ($document && $document->id_user == $user->id) { | if ($document && $document->id_user == $user->id) { | ||||
} | } | ||||
$json = [ | $json = [ | ||||
'return' => 'success', | |||||
'address' => $address | |||||
'return' => 'success', | |||||
'address' => $address | |||||
]; | ]; | ||||
if ($classDocument == 'Invoice') { | if ($classDocument == 'Invoice') { | ||||
'join_with' => ['user AS user_delivery_note', 'orders', 'producer'] | 'join_with' => ['user AS user_delivery_note', 'orders', 'producer'] | ||||
]; | ]; | ||||
$deliveryNotesCreateArray = DeliveryNote::searchAll([ | $deliveryNotesCreateArray = DeliveryNote::searchAll([ | ||||
'id_user' => $user->id, | |||||
'status' => Document::STATUS_VALID | |||||
], $options); | |||||
'id_user' => $user->id, | |||||
'status' => Document::STATUS_VALID | |||||
], $options); | |||||
$deliveryNotesUpdateArray = DeliveryNote::searchAll([ | $deliveryNotesUpdateArray = DeliveryNote::searchAll([ | ||||
'id_user' => $user->id, | |||||
'status' => Document::STATUS_VALID, | |||||
'order.id_invoice' => $idDocument | |||||
], $options); | |||||
'id_user' => $user->id, | |||||
'status' => Document::STATUS_VALID, | |||||
'order.id_invoice' => $idDocument | |||||
], $options); | |||||
$json['delivery_note_create_array'] = $this->initDeliveryNoteArray('create', $deliveryNotesCreateArray); | $json['delivery_note_create_array'] = $this->initDeliveryNoteArray('create', $deliveryNotesCreateArray); | ||||
$json['delivery_note_update_array'] = $this->initDeliveryNoteArray('update', $deliveryNotesUpdateArray); | $json['delivery_note_update_array'] = $this->initDeliveryNoteArray('update', $deliveryNotesUpdateArray); | ||||
} | } | ||||
{ | { | ||||
$deliveryNoteArray = []; | $deliveryNoteArray = []; | ||||
$isCreate = false; | $isCreate = false; | ||||
if($type == 'create') { | |||||
if ($type == 'create') { | |||||
$isCreate = true; | $isCreate = true; | ||||
} | } | ||||
if($deliveryNoteArrayResults) { | |||||
if ($deliveryNoteArrayResults) { | |||||
foreach ($deliveryNoteArrayResults as $deliveryNote) { | foreach ($deliveryNoteArrayResults as $deliveryNote) { | ||||
$deliveryNoteData = $this->addDeliveryNoteToArray($deliveryNote, $isCreate); | $deliveryNoteData = $this->addDeliveryNoteToArray($deliveryNote, $isCreate); | ||||
if($deliveryNoteData) { | |||||
if ($deliveryNoteData) { | |||||
$deliveryNoteArray[] = $deliveryNoteData; | $deliveryNoteArray[] = $deliveryNoteData; | ||||
} | } | ||||
} | } | ||||
if ($id > 0 && Document::isValidClass($classDocument)) { | if ($id > 0 && Document::isValidClass($classDocument)) { | ||||
$document = $classDocument::searchOne([ | $document = $classDocument::searchOne([ | ||||
'id' => $id | |||||
]); | |||||
'id' => $id | |||||
]); | |||||
if ($document) { | if ($document) { | ||||
$document->changeStatus(Document::STATUS_VALID); | $document->changeStatus(Document::STATUS_VALID); | ||||
Yii::$app->getSession()->setFlash('success', $this->getFlashMessage('validate', $document)); | Yii::$app->getSession()->setFlash('success', $this->getFlashMessage('validate', $document)); | ||||
if($backUpdateForm) { | |||||
if ($backUpdateForm) { | |||||
return $this->redirect([$this->getControllerUrl() . '/update', 'id' => $id]); | return $this->redirect([$this->getControllerUrl() . '/update', 'id' => $id]); | ||||
} | |||||
else { | |||||
} else { | |||||
return $this->redirect([$this->getControllerUrl() . '/index']); | return $this->redirect([$this->getControllerUrl() . '/index']); | ||||
} | } | ||||
} | } | ||||
if ($idDocument > 0 && Document::isValidClass($classDocument)) { | if ($idDocument > 0 && Document::isValidClass($classDocument)) { | ||||
$document = $classDocument::searchOne([ | $document = $classDocument::searchOne([ | ||||
'id' => $idDocument | |||||
]); | |||||
'id' => $idDocument | |||||
]); | |||||
if ($document) { | if ($document) { | ||||
$document->changeStatus(Document::STATUS_VALID); | $document->changeStatus(Document::STATUS_VALID); | ||||
$document->save(); | $document->save(); | ||||
return [ | return [ | ||||
'return' => 'success', | |||||
'alert' => [ | |||||
'type' => 'success', | |||||
'message' => 'Document validé' | |||||
] | |||||
'return' => 'success', | |||||
'alert' => [ | |||||
'type' => 'success', | |||||
'message' => 'Document validé' | |||||
] | |||||
]; | ]; | ||||
} | } | ||||
} | } | ||||
return [ | return [ | ||||
'return' => 'error', | |||||
'alert' => [ | |||||
'type' => 'danger', | |||||
'message' => 'Une erreur est survenue lors de la validation du document.' | |||||
] | |||||
'return' => 'error', | |||||
'alert' => [ | |||||
'type' => 'danger', | |||||
'message' => 'Une erreur est survenue lors de la validation du document.' | |||||
] | |||||
]; | ]; | ||||
} | } | ||||
if ($idDocument > 0 && Document::isValidClass($classDocument)) { | if ($idDocument > 0 && Document::isValidClass($classDocument)) { | ||||
$document = $classDocument::searchOne([ | $document = $classDocument::searchOne([ | ||||
'id' => $idDocument | |||||
]); | |||||
'id' => $idDocument | |||||
]); | |||||
if ($document) { | if ($document) { | ||||
$productsArray = Product::searchAll([], [ | |||||
'orderby' => 'product.order ASC' | |||||
$productsArray = Product::searchAll([], [ | |||||
'orderby' => 'product.order ASC' | |||||
]); | ]); | ||||
$ordersArray = []; | $ordersArray = []; | ||||
]); | ]); | ||||
} | } | ||||
$ordersArray[$order->id] = array_merge( | $ordersArray[$order->id] = array_merge( | ||||
$order->getAttributes(), | |||||
[ | |||||
'username' => $order->getUsername(), | |||||
'distribution_date' => isset($order->distribution) ? date( | |||||
'd/m/Y', | |||||
strtotime( | |||||
$order->distribution->date | |||||
) | |||||
) : null, | |||||
'point_sale_name' => isset($order->pointSale) ? $order->pointSale->name : null, | |||||
'productOrder' => $productsOrderArray, | |||||
] | |||||
$order->getAttributes(), | |||||
[ | |||||
'username' => $order->getUsername(), | |||||
'distribution_date' => isset($order->distribution) ? date( | |||||
'd/m/Y', | |||||
strtotime( | |||||
$order->distribution->date | |||||
) | |||||
) : null, | |||||
'point_sale_name' => isset($order->pointSale) ? $order->pointSale->name : null, | |||||
'productOrder' => $productsOrderArray, | |||||
] | |||||
); | ); | ||||
} | } | ||||
$userProducer = UserProducer::searchOne([ | |||||
'id_user' => $document->user->id, | |||||
'id_producer' => GlobalParam::getCurrentProducerId() | |||||
]); | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_user' => $document->user->id, | |||||
'id_producer' => GlobalParam::getCurrentProducerId() | |||||
]); | |||||
$pointSale = PointSale::searchOne([ | $pointSale = PointSale::searchOne([ | ||||
'id_user' => $document->user->id | |||||
]); | |||||
'id_user' => $document->user->id | |||||
]); | |||||
$productsArray = yii\helpers\ArrayHelper::map( | $productsArray = yii\helpers\ArrayHelper::map( | ||||
$productsArray, | |||||
'order', | |||||
function ($product) use ($document, $userProducer, $pointSale) { | |||||
return array_merge($product->getAttributes(), [ | |||||
'unit_coefficient' => Product::$unitsArray[$product->unit]['coefficient'], | |||||
'prices' => $product->getPriceArray($userProducer->user, $pointSale), | |||||
'wording_unit' => $product->wording_unit, | |||||
'tax_rate' => $product->taxRate->value | |||||
]); | |||||
} | |||||
$productsArray, | |||||
'order', | |||||
function ($product) use ($document, $userProducer, $pointSale) { | |||||
return array_merge($product->getAttributes(), [ | |||||
'unit_coefficient' => Product::$unitsArray[$product->unit]['coefficient'], | |||||
'prices' => $product->getPriceArray($userProducer->user, $pointSale), | |||||
'wording_unit' => $product->wording_unit, | |||||
'tax_rate' => $product->taxRate->value | |||||
]); | |||||
} | |||||
); | ); | ||||
return [ | return [ | ||||
'return' => 'success', | |||||
'tax_rate_producer' => GlobalParam::getCurrentProducer()->taxRate->value, | |||||
'document' => array_merge($document->getAttributes(), [ | |||||
'html_label' => $document->getHtmlLabel(), | |||||
'class' => $document->getClass() | |||||
]), | |||||
'id_user' => $document->user->id, | |||||
'products' => $productsArray, | |||||
'orders' => $ordersArray, | |||||
'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), | |||||
'invoice_url' => ($document->getClass() == 'DeliveryNote' && $document->getInvoice()) ? Yii::$app->urlManager->createUrl(['invoice/update', 'id' => $document->getInvoice()->id]) : null | |||||
'return' => 'success', | |||||
'tax_rate_producer' => GlobalParam::getCurrentProducer()->taxRate->value, | |||||
'document' => array_merge($document->getAttributes(), [ | |||||
'html_label' => $document->getHtmlLabel(), | |||||
'class' => $document->getClass() | |||||
]), | |||||
'id_user' => $document->user->id, | |||||
'products' => $productsArray, | |||||
'orders' => $ordersArray, | |||||
'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), | |||||
'invoice_url' => ($document->getClass() == 'DeliveryNote' && $document->getInvoice()) ? Yii::$app->urlManager->createUrl(['invoice/update', 'id' => $document->getInvoice()->id]) : null | |||||
]; | ]; | ||||
} | } | ||||
} | } | ||||
if (Document::isValidClass($classDocument)) { | if (Document::isValidClass($classDocument)) { | ||||
$document = $classDocument::searchOne([ | $document = $classDocument::searchOne([ | ||||
'id' => $idDocument | |||||
]); | |||||
$product = Product::searchOne([ | |||||
'id' => $idProduct | |||||
]); | |||||
'id' => $idDocument | |||||
]); | |||||
$product = Product::searchOne([ | |||||
'id' => $idProduct | |||||
]); | |||||
if ($document && $product) { | if ($document && $product) { | ||||
if (count($document->orders) == 0) { | if (count($document->orders) == 0) { | ||||
$productOrder = new ProductOrder; | $productOrder = new ProductOrder; | ||||
$productOrder->id_order = $order->id; | $productOrder->id_order = $order->id; | ||||
$productOrder->id_product = $idProduct; | $productOrder->id_product = $idProduct; | ||||
$quantity = $quantity / Product::$unitsArray[$product->unit]['coefficient']; | |||||
$quantity = $quantity / Product::$unitsArray[$product->unit]['coefficient']; | |||||
$productOrder->quantity = $quantity; | $productOrder->quantity = $quantity; | ||||
$productOrder->price = (float)$price; | $productOrder->price = (float)$price; | ||||
$productOrder->unit = $product->unit; | $productOrder->unit = $product->unit; | ||||
$productOrder->save(); | $productOrder->save(); | ||||
return [ | return [ | ||||
'return' => 'success', | |||||
'alert' => [ | |||||
'type' => 'success', | |||||
'message' => 'Produit ajouté' | |||||
] | |||||
'return' => 'success', | |||||
'alert' => [ | |||||
'type' => 'success', | |||||
'message' => 'Produit ajouté' | |||||
] | |||||
]; | ]; | ||||
} | } | ||||
} | } | ||||
} | } | ||||
return [ | return [ | ||||
'return' => 'error', | |||||
'alert' => [ | |||||
'type' => 'danger', | |||||
'message' => 'Une erreur est survenue lors de la suppression du produit.' | |||||
] | |||||
'return' => 'error', | |||||
'alert' => [ | |||||
'type' => 'danger', | |||||
'message' => 'Une erreur est survenue lors de la suppression du produit.' | |||||
] | |||||
]; | ]; | ||||
} | } | ||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||||
$productOrder = ProductOrder::searchOne([ | $productOrder = ProductOrder::searchOne([ | ||||
'id' => $idProductOrder | |||||
]); | |||||
'id' => $idProductOrder | |||||
]); | |||||
if ($productOrder) { | if ($productOrder) { | ||||
$productOrder->delete(); | $productOrder->delete(); | ||||
return [ | return [ | ||||
'return' => 'success', | |||||
'alert' => [ | |||||
'type' => 'danger', | |||||
'message' => 'Produit supprimé' | |||||
] | |||||
'return' => 'success', | |||||
'alert' => [ | |||||
'type' => 'danger', | |||||
'message' => 'Produit supprimé' | |||||
] | |||||
]; | ]; | ||||
} | } | ||||
return [ | return [ | ||||
'return' => 'error', | |||||
'alert' => [ | |||||
'type' => 'danger', | |||||
'message' => 'Une erreur est survenue lors de la suppression du produit.' | |||||
] | |||||
'return' => 'error', | |||||
'alert' => [ | |||||
'type' => 'danger', | |||||
'message' => 'Une erreur est survenue lors de la suppression du produit.' | |||||
] | |||||
]; | ]; | ||||
} | } | ||||
$class = $this->getClass(); | $class = $this->getClass(); | ||||
$model = $class::searchOne([ | $model = $class::searchOne([ | ||||
'id' => $id | |||||
], [ | |||||
'orderby' => 'teshtygjhtyt' | |||||
]); | |||||
'id' => $id | |||||
], [ | |||||
'orderby' => 'teshtygjhtyt' | |||||
]); | |||||
if ($model) { | if ($model) { | ||||
return $model; | return $model; |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use Yii; | use Yii; | ||||
class InvoiceController extends DocumentController | |||||
class InvoiceController extends DocumentController | |||||
{ | { | ||||
/** | /** | ||||
* Liste les modèles Invoice. | * Liste les modèles Invoice. | ||||
* | |||||
* | |||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionIndex() | |||||
public function actionIndex() | |||||
{ | { | ||||
$searchModel = new InvoiceSearch() ; | |||||
$searchModel = new InvoiceSearch(); | |||||
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); | $dataProvider = $searchModel->search(Yii::$app->request->queryParams); | ||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'searchModel' => $searchModel, | 'searchModel' => $searchModel, | ||||
'dataProvider' => $dataProvider, | 'dataProvider' => $dataProvider, | ||||
$invoice = Invoice::searchOne(['id' => $idInvoice]); | $invoice = Invoice::searchOne(['id' => $idInvoice]); | ||||
if($invoice && $invoice->isStatusDraft()) { | |||||
if ($invoice && $invoice->isStatusDraft()) { | |||||
Order::updateAll([ | Order::updateAll([ | ||||
'id_invoice' => null | 'id_invoice' => null | ||||
], [ | ], [ | ||||
'message' => 'Bon de livraison supprimé de la facture.' | 'message' => 'Bon de livraison supprimé de la facture.' | ||||
] | ] | ||||
]; | ]; | ||||
} | |||||
else { | |||||
} else { | |||||
return [ | return [ | ||||
'alert' => [ | 'alert' => [ | ||||
'type' => 'error', | 'type' => 'error', | ||||
$invoice = Invoice::searchOne(['id' => $idInvoice]); | $invoice = Invoice::searchOne(['id' => $idInvoice]); | ||||
$deliveryNote = DeliveryNote::searchOne(['id' => $idDeliveryNote]); | $deliveryNote = DeliveryNote::searchOne(['id' => $idDeliveryNote]); | ||||
if($invoice && $invoice->isStatusDraft() && $deliveryNote) { | |||||
if ($invoice && $invoice->isStatusDraft() && $deliveryNote) { | |||||
Order::updateAll([ | Order::updateAll([ | ||||
'id_invoice' => $idInvoice | 'id_invoice' => $idInvoice | ||||
], [ | ], [ | ||||
'message' => 'Bon de livraison ajouté à la facture.' | 'message' => 'Bon de livraison ajouté à la facture.' | ||||
] | ] | ||||
]; | ]; | ||||
} | |||||
else { | |||||
} else { | |||||
return [ | return [ | ||||
'alert' => [ | 'alert' => [ | ||||
'type' => 'error', | 'type' => 'error', |
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return User::getCurrentStatus() == User::STATUS_ADMIN | |||||
|| User::getCurrentStatus() == User::STATUS_PRODUCER; | |||||
return User::getCurrentStatus() == User::STATUS_ADMIN | |||||
|| User::getCurrentStatus() == User::STATUS_PRODUCER; | |||||
} | } | ||||
] | ] | ||||
], | ], | ||||
*/ | */ | ||||
public function actionIndex($date = '', $returnData = false) | public function actionIndex($date = '', $returnData = false) | ||||
{ | { | ||||
if (! Product::searchCount() || !PointSale::searchCount()) { | |||||
if (!Product::searchCount() || !PointSale::searchCount()) { | |||||
$this->redirect(['site/index', 'error_products_points_sale' => 1]); | $this->redirect(['site/index', 'error_products_points_sale' => 1]); | ||||
} | } | ||||
// users | // users | ||||
$arrayUsers = [0 => '--']; | $arrayUsers = [0 => '--']; | ||||
$users = User::searchAll([], ['orderby' => 'lastname, name ASC']); | |||||
$users = User::searchAll([], ['orderby' => 'lastname, name ASC']); | |||||
foreach ($users as $user) { | foreach ($users as $user) { | ||||
$arrayUsers[$user->id] = $user->name . ' ' . $user->lastname; | $arrayUsers[$user->id] = $user->name . ' ' . $user->lastname; | ||||
} | } | ||||
// produits | // produits | ||||
$arrayProducts = Product::searchAll(); | |||||
$arrayProducts = Product::searchAll(); | |||||
// gestion des commandes | // gestion des commandes | ||||
$this->processOrderForm($distribution, $date, $arrayPointsSale, $arrayProducts, $users); | $this->processOrderForm($distribution, $date, $arrayPointsSale, $arrayProducts, $users); | ||||
// produits | // produits | ||||
if ($distribution) { | if ($distribution) { | ||||
$arrayProducts = Product::searchByDistribution($distribution->id); | |||||
$arrayProducts = Product::searchByDistribution($distribution->id); | |||||
} | } | ||||
// poids total de la production et CA potentiel | // poids total de la production et CA potentiel | ||||
} | } | ||||
// produits | // produits | ||||
$productsArray = Product::find()->orderBy('order ASC')->all(); | |||||
$productsArray = Product::find()->orderBy('order ASC')->all(); | |||||
$distribution = DistributionModel::find() | $distribution = DistributionModel::find() | ||||
->where('date LIKE \':date\'') | ->where('date LIKE \':date\'') | ||||
if ($active) { | if ($active) { | ||||
// add commandes automatiques | // add commandes automatiques | ||||
Subscription::addAll($date); | |||||
Subscription::addAll($date); | |||||
} | } | ||||
if ($redirect) { | if ($redirect) { | ||||
// remboursement de la commande | // remboursement de la commande | ||||
if ($order->id_user && $order->getAmount(Order::AMOUNT_PAID) && Producer::getConfig('credit')) { | if ($order->id_user && $order->getAmount(Order::AMOUNT_PAID) && Producer::getConfig('credit')) { | ||||
$order->saveCreditHistory( | $order->saveCreditHistory( | ||||
CreditHistory::TYPE_REFUND, | |||||
CreditHistory::TYPE_REFUND, | |||||
$order->getAmount(Order::AMOUNT_PAID), | $order->getAmount(Order::AMOUNT_PAID), | ||||
$order->distribution->id_producer, | $order->distribution->id_producer, | ||||
$order->id_user, | $order->id_user, | ||||
$userProducer = false; | $userProducer = false; | ||||
if (isset($order->user) && $order->user) { | if (isset($order->user) && $order->user) { | ||||
$user = $order->user; | $user = $order->user; | ||||
$userProducer = UserProducer::searchOne([ | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_user' => $user->id, | 'id_user' => $user->id, | ||||
'id_producer' => $order->distribution->id_producer | 'id_producer' => $order->distribution->id_producer | ||||
]); | ]); | ||||
} | } | ||||
foreach ($products as $key => $dataProductOrder) { | foreach ($products as $key => $dataProductOrder) { | ||||
$product = Product::findOne($key); | |||||
$quantity = $dataProductOrder->quantity / Product::$unitsArray[$dataProductOrder->unit]['coefficient']; | |||||
$product = Product::findOne($key); | |||||
$quantity = $dataProductOrder->quantity / Product::$unitsArray[$dataProductOrder->unit]['coefficient']; | |||||
if ($product && $quantity) { | if ($product && $quantity) { | ||||
$productOrder = new ProductOrder; | $productOrder = new ProductOrder; | ||||
$productOrder->id_order = $order->id; | $productOrder->id_order = $order->id; | ||||
$order->id_user = 0; | $order->id_user = 0; | ||||
} | } | ||||
$user = User::searchOne(['id' => $order->id_user]); | |||||
$user = User::searchOne(['id' => $order->id_user]); | |||||
$userProducer = false; | $userProducer = false; | ||||
if ($user) { | if ($user) { | ||||
$userProducer = UserProducer::searchOne([ | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_user' => $user->id, | 'id_user' => $user->id, | ||||
'id_producer' => $order->distribution->id_producer | 'id_producer' => $order->distribution->id_producer | ||||
]); | ]); | ||||
]); | ]); | ||||
$quantity = $dataProductOrder->quantity | $quantity = $dataProductOrder->quantity | ||||
/ Product::$unitsArray[$dataProductOrder->unit]['coefficient']; | |||||
/ Product::$unitsArray[$dataProductOrder->unit]['coefficient']; | |||||
if ($quantity) { | if ($quantity) { | ||||
if ($productOrder) { | if ($productOrder) { | ||||
$productOrder->quantity = $quantity; | $productOrder->quantity = $quantity; | ||||
$productOrder->price = $dataProductOrder->price; | $productOrder->price = $dataProductOrder->price; | ||||
} else { | } else { | ||||
$product = Product::findOne($key); | |||||
$product = Product::findOne($key); | |||||
if ($product) { | if ($product) { | ||||
$productOrder = new ProductOrder; | $productOrder = new ProductOrder; | ||||
if ($order && $processCredit) { | if ($order && $processCredit) { | ||||
// Si changement d'user : on rembourse l'ancien user | // Si changement d'user : on rembourse l'ancien user | ||||
$amountPaid = $order->getAmount(Order::AMOUNT_PAID); | $amountPaid = $order->getAmount(Order::AMOUNT_PAID); | ||||
if($oldIdUser != $idUser && $amountPaid > 0) { | |||||
if ($oldIdUser != $idUser && $amountPaid > 0) { | |||||
$order->saveCreditHistory( | $order->saveCreditHistory( | ||||
CreditHistory::TYPE_REFUND, | |||||
CreditHistory::TYPE_REFUND, | |||||
$amountPaid, | $amountPaid, | ||||
GlobalParam::getCurrentProducerId(), | GlobalParam::getCurrentProducerId(), | ||||
$oldIdUser, | $oldIdUser, | ||||
$html = ''; | $html = ''; | ||||
if ($order->id_user) { | if ($order->id_user) { | ||||
$userProducer = UserProducer::find() | |||||
$userProducer = UserProducer::find() | |||||
->where([ | ->where([ | ||||
'id_user' => $order->id_user, | 'id_user' => $order->id_user, | ||||
'id_producer' => $order->distribution->id_producer | 'id_producer' => $order->distribution->id_producer | ||||
. '</span>'; | . '</span>'; | ||||
// historique | // historique | ||||
$history = CreditHistory::find() | |||||
$history = CreditHistory::find() | |||||
->with('userAction') | ->with('userAction') | ||||
->where(['id_order' => $idOrder]) | ->where(['id_order' => $idOrder]) | ||||
->all(); | ->all(); |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
namespace backend\controllers; | namespace backend\controllers; | ||||
/** | /** | ||||
* PointVenteController implements the CRUD actions for PointVente model. | * PointVenteController implements the CRUD actions for PointVente model. | ||||
*/ | */ | ||||
class PointSaleController extends BackendController | |||||
class PointSaleController extends BackendController | |||||
{ | { | ||||
public function behaviors() | |||||
public function behaviors() | |||||
{ | { | ||||
return [ | return [ | ||||
'verbs' => [ | 'verbs' => [ | ||||
/** | /** | ||||
* Liste les points de vente. | * Liste les points de vente. | ||||
* | |||||
* | |||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionIndex() | |||||
{ | |||||
$searchModel = new PointSaleSearch() ; | |||||
public function actionIndex() | |||||
{ | |||||
$searchModel = new PointSaleSearch(); | |||||
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); | $dataProvider = $searchModel->search(Yii::$app->request->queryParams); | ||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'searchModel' => $searchModel, | |||||
'searchModel' => $searchModel, | |||||
'dataProvider' => $dataProvider, | 'dataProvider' => $dataProvider, | ||||
]); | ]); | ||||
} | } | ||||
/** | /** | ||||
* Crée un point de vente. | * Crée un point de vente. | ||||
* | |||||
* | |||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionCreate() | |||||
public function actionCreate() | |||||
{ | { | ||||
$model = new PointSale(); | $model = new PointSale(); | ||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||||
$model->processPointProduction(); | $model->processPointProduction(); | ||||
$model->processRestrictedAccess(); | $model->processRestrictedAccess(); | ||||
DistributionModel::linkPointSaleIncomingDistributions($model) ; | |||||
DistributionModel::linkPointSaleIncomingDistributions($model); | |||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} else { | } else { | ||||
return $this->render('create', array_merge($this->initForm(), [ | return $this->render('create', array_merge($this->initForm(), [ | ||||
/** | /** | ||||
* Modifie un point de vente. | * Modifie un point de vente. | ||||
* | |||||
* | |||||
* @param integer $id | * @param integer $id | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionUpdate($id) | |||||
public function actionUpdate($id) | |||||
{ | { | ||||
$model = PointSale::find() | $model = PointSale::find() | ||||
->with('userPointSale') | |||||
->where(['id' => $id]) | |||||
->one(); | |||||
->with('userPointSale') | |||||
->where(['id' => $id]) | |||||
->one(); | |||||
foreach ($model->userPointSale as $userPointSale) { | foreach ($model->userPointSale as $userPointSale) { | ||||
$model->users[] = $userPointSale->id_user; | $model->users[] = $userPointSale->id_user; | ||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||||
$model->processPointProduction(); | $model->processPointProduction(); | ||||
$model->processRestrictedAccess(); | $model->processRestrictedAccess(); | ||||
DistributionModel::linkPointSaleIncomingDistributions($model) ; | |||||
DistributionModel::linkPointSaleIncomingDistributions($model); | |||||
Yii::$app->getSession()->setFlash('success', 'Point de vente modifié.'); | Yii::$app->getSession()->setFlash('success', 'Point de vente modifié.'); | ||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} else { | } else { | ||||
/** | /** | ||||
* Initialise le formulaire de création/modification. | * Initialise le formulaire de création/modification. | ||||
* | |||||
* | |||||
* @param integer $id | * @param integer $id | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function initForm($id = 0) | |||||
public function initForm($id = 0) | |||||
{ | { | ||||
$users = User::findBy() | |||||
->leftJoin('user_point_sale', 'user_point_sale.id_user = user.id AND user_point_sale.id_point_sale = :id_point_sale',[':id_point_sale' => $id]) | |||||
$users = User::findBy() | |||||
->leftJoin('user_point_sale', 'user_point_sale.id_user = user.id AND user_point_sale.id_point_sale = :id_point_sale', [':id_point_sale' => $id]) | |||||
->orderBy('user_point_sale.id_point_sale DESC, lastname ASC, name ASC') | ->orderBy('user_point_sale.id_point_sale DESC, lastname ASC, name ASC') | ||||
->all(); | ->all(); | ||||
return [ | return [ | ||||
'users' => $users | 'users' => $users | ||||
]; | ]; | ||||
/** | /** | ||||
* Supprime un point de vente et redirige vers la liste des points de vente. | * Supprime un point de vente et redirige vers la liste des points de vente. | ||||
* | |||||
* | |||||
* @param integer $id | * @param integer $id | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionDelete($id, $confirm = false) | |||||
{ | |||||
$pointSale = $this->findModel($id) ; | |||||
if($confirm) { | |||||
public function actionDelete($id, $confirm = false) | |||||
{ | |||||
$pointSale = $this->findModel($id); | |||||
if ($confirm) { | |||||
$pointSale->status = -1; | $pointSale->status = -1; | ||||
$pointSale->save(); | $pointSale->save(); | ||||
] | ] | ||||
); | ); | ||||
if($ordersArray) { | |||||
foreach($ordersArray as $order) { | |||||
if ($ordersArray) { | |||||
foreach ($ordersArray as $order) { | |||||
$order->delete(true); | $order->delete(true); | ||||
} | } | ||||
} | } | ||||
Yii::$app->getSession()->setFlash('success', 'Point de vente <strong>'.Html::encode($pointSale->name).'</strong> supprimé.'); | |||||
} | |||||
else { | |||||
Yii::$app->getSession()->setFlash('info', 'Souhaitez-vous vraiment supprimer le point de vente <strong>'.Html::encode($pointSale->name).'</strong> ? ' | |||||
. Html::a('Oui',['point-sale/delete','id' => $id, 'confirm' => 1], ['class' => 'btn btn-default']).' '.Html::a('Non', ['point-sale/index'], ['class' => 'btn btn-default'])); | |||||
Yii::$app->getSession()->setFlash('success', 'Point de vente <strong>' . Html::encode($pointSale->name) . '</strong> supprimé.'); | |||||
} else { | |||||
Yii::$app->getSession()->setFlash('info', 'Souhaitez-vous vraiment supprimer le point de vente <strong>' . Html::encode($pointSale->name) . '</strong> ? ' | |||||
. Html::a('Oui', ['point-sale/delete', 'id' => $id, 'confirm' => 1], ['class' => 'btn btn-default']) . ' ' . Html::a('Non', ['point-sale/index'], ['class' => 'btn btn-default'])); | |||||
} | } | ||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} | } | ||||
/** | /** | ||||
* Définit un point de vente par défaut. | * Définit un point de vente par défaut. | ||||
* | |||||
* | |||||
* @param integer $id | * @param integer $id | ||||
*/ | */ | ||||
public function actionDefault($id) | |||||
public function actionDefault($id) | |||||
{ | { | ||||
$pointSale = $this->findModel($id) ; | |||||
if($pointSale) { | |||||
PointSale::updateAll(['default' => 0], 'id_producer = :id_producer', [':id_producer' => GlobalParam::getCurrentProducerId()]) ; | |||||
if(!$pointSale->default) { | |||||
$pointSale->default = 1 ; | |||||
$pointSale->save() ; | |||||
Yii::$app->getSession()->setFlash('success', 'Point de vente <strong>'.Html::encode($pointSale->name).'</strong> défini par défaut.') ; | |||||
} | |||||
else { | |||||
Yii::$app->getSession()->setFlash('success', 'Aucun point de vente défini par défaut') ; | |||||
$pointSale = $this->findModel($id); | |||||
if ($pointSale) { | |||||
PointSale::updateAll(['default' => 0], 'id_producer = :id_producer', [':id_producer' => GlobalParam::getCurrentProducerId()]); | |||||
if (!$pointSale->default) { | |||||
$pointSale->default = 1; | |||||
$pointSale->save(); | |||||
Yii::$app->getSession()->setFlash('success', 'Point de vente <strong>' . Html::encode($pointSale->name) . '</strong> défini par défaut.'); | |||||
} else { | |||||
Yii::$app->getSession()->setFlash('success', 'Aucun point de vente défini par défaut'); | |||||
} | } | ||||
} | } | ||||
return $this->redirect(['index']); | return $this->redirect(['index']); | ||||
} | } | ||||
/** | /** | ||||
* Recherche un point de vente en fonction de son ID. | * Recherche un point de vente en fonction de son ID. | ||||
* | |||||
* | |||||
* @param integer $id | * @param integer $id | ||||
* @return PointVente | |||||
* @return PointVente | |||||
* @throws NotFoundHttpException si le modèle n'est pas trouvé | * @throws NotFoundHttpException si le modèle n'est pas trouvé | ||||
*/ | */ | ||||
protected function findModel($id) | |||||
protected function findModel($id) | |||||
{ | { | ||||
if (($model = PointSale::findOne($id)) !== null) { | if (($model = PointSale::findOne($id)) !== null) { | ||||
return $model; | return $model; | ||||
} | |||||
else { | |||||
} else { | |||||
throw new NotFoundHttpException('The requested page does not exist.'); | throw new NotFoundHttpException('The requested page does not exist.'); | ||||
} | } | ||||
} | } |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
namespace backend\controllers; | namespace backend\controllers; | ||||
/** | /** | ||||
* UserController implements the CRUD actions for User model. | * UserController implements the CRUD actions for User model. | ||||
*/ | */ | ||||
class ProducerAdminController extends BackendController | |||||
class ProducerAdminController extends BackendController | |||||
{ | { | ||||
public function behaviors() | |||||
public function behaviors() | |||||
{ | { | ||||
return [ | return [ | ||||
'verbs' => [ | 'verbs' => [ | ||||
'allow' => true, | 'allow' => true, | ||||
'roles' => ['@'], | 'roles' => ['@'], | ||||
'matchCallback' => function ($rule, $action) { | 'matchCallback' => function ($rule, $action) { | ||||
return User::getCurrentStatus() == User::STATUS_ADMIN; | |||||
return User::getCurrentStatus() == User::STATUS_ADMIN; | |||||
} | } | ||||
] | ] | ||||
], | ], | ||||
/** | /** | ||||
* Liste les producteurs. | * Liste les producteurs. | ||||
* | |||||
* | |||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionIndex() | |||||
public function actionIndex() | |||||
{ | { | ||||
$dataProviderProducer = new ActiveDataProvider([ | $dataProviderProducer = new ActiveDataProvider([ | ||||
'query' => Producer::find() | 'query' => Producer::find() | ||||
->with('userProducer', 'user') | |||||
->orderBy('active DESC, free_price DESC'), | |||||
->with('userProducer', 'user') | |||||
->orderBy('active DESC, free_price DESC'), | |||||
'pagination' => [ | 'pagination' => [ | ||||
'pageSize' => 1000, | 'pageSize' => 1000, | ||||
], | ], | ||||
$producersArray = Producer::find()->where('active = 1')->all(); | $producersArray = Producer::find()->where('active = 1')->all(); | ||||
$sumPrices = 0; | $sumPrices = 0; | ||||
foreach($producersArray as $producer) { | |||||
$sumPrices += $producer->getAmountBilledLastMonth(); | |||||
foreach ($producersArray as $producer) { | |||||
$sumPrices += $producer->getAmountBilledLastMonth(); | |||||
} | } | ||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'sumPrices' => $sumPrices | 'sumPrices' => $sumPrices | ||||
]); | ]); | ||||
} | } | ||||
/** | /** | ||||
* Crée un producteur. | * Crée un producteur. | ||||
* | |||||
* | |||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionCreate() | |||||
public function actionCreate() | |||||
{ | { | ||||
$model = new Producer(); | $model = new Producer(); | ||||
public function actionUserTransfer($fromProducerId, $toProducerId, $withOrders = 1) | public function actionUserTransfer($fromProducerId, $toProducerId, $withOrders = 1) | ||||
{ | { | ||||
$fromProducerId = (int) $fromProducerId; | |||||
$toProducerId = (int) $toProducerId; | |||||
$fromProducerId = (int)$fromProducerId; | |||||
$toProducerId = (int)$toProducerId; | |||||
$count = 0; | $count = 0; | ||||
$usersArray = User::findBy(['id_producer' => $fromProducerId])->all(); | |||||
$usersArray = User::findBy(['id_producer' => $fromProducerId])->all(); | |||||
foreach($usersArray as $user) { | |||||
foreach ($usersArray as $user) { | |||||
$idUser = $user['user_id']; | $idUser = $user['user_id']; | ||||
$countOrders = 0; | $countOrders = 0; | ||||
if($withOrders) { | |||||
if ($withOrders) { | |||||
$countOrders = Order::searchCount([ | $countOrders = Order::searchCount([ | ||||
'id_user' => $idUser, | 'id_user' => $idUser, | ||||
'distribution.id_producer' => $fromProducerId | 'distribution.id_producer' => $fromProducerId | ||||
], ['conditions' => 'date_delete IS NULL']); | ], ['conditions' => 'date_delete IS NULL']); | ||||
} | } | ||||
if(($withOrders && $countOrders) || !$withOrders) { | |||||
if (($withOrders && $countOrders) || !$withOrders) { | |||||
Producer::addUser($idUser, $toProducerId); | Producer::addUser($idUser, $toProducerId); | ||||
$count ++; | |||||
$count++; | |||||
} | } | ||||
} | } | ||||
if($count) { | |||||
Yii::$app->getSession()->setFlash('success', $count.' clients importés du producteur #'.$fromProducerId.' vers le producteur #'.$toProducerId.'.'); | |||||
} | |||||
else { | |||||
if ($count) { | |||||
Yii::$app->getSession()->setFlash('success', $count . ' clients importés du producteur #' . $fromProducerId . ' vers le producteur #' . $toProducerId . '.'); | |||||
} else { | |||||
Yii::$app->getSession()->setFlash('error', 'Aucun client à importer.'); | Yii::$app->getSession()->setFlash('error', 'Aucun client à importer.'); | ||||
} | } | ||||
/** | /** | ||||
* Génère la facture mensuelle d'un producteur. | * Génère la facture mensuelle d'un producteur. | ||||
* | |||||
* | |||||
* @param integer $idProducer | * @param integer $idProducer | ||||
*/ | */ | ||||
public function actionBill($idProducer) | |||||
public function actionBill($idProducer) | |||||
{ | { | ||||
$producer = Producer::findOne($idProducer); | $producer = Producer::findOne($idProducer); | ||||
if ($producer) { | if ($producer) { | ||||
$period = date('Y-m', strtotime('-1 month')); | $period = date('Y-m', strtotime('-1 month')); | ||||
$last_invoice = Invoice::getLastInvoice() ; | |||||
$last_invoice = Invoice::getLastInvoice(); | |||||
if (!$last_invoice) { | if (!$last_invoice) { | ||||
$reference = 'BAP000001'; | $reference = 'BAP000001'; | ||||
} else { | } else { | ||||
$reference = str_replace('BAP', '', $last_invoice->reference); | $reference = str_replace('BAP', '', $last_invoice->reference); | ||||
$reference ++; | |||||
$reference++; | |||||
$reference = 'BAP' . $reference; | $reference = 'BAP' . $reference; | ||||
} | } | ||||
$invoice->date = date('Y-m-d H:i:s'); | $invoice->date = date('Y-m-d H:i:s'); | ||||
$invoice->reference = $reference; | $invoice->reference = $reference; | ||||
$invoice->turnover = $producer->getTurnover($period); | $invoice->turnover = $producer->getTurnover($period); | ||||
$invoice->amount_ht = $producer->getFreePrice() ; | |||||
$invoice->amount_ht = $producer->getFreePrice(); | |||||
$invoice->wording = 'Facture ' . date('m/Y', strtotime('-1 month')); | $invoice->wording = 'Facture ' . date('m/Y', strtotime('-1 month')); | ||||
$invoice->text = 'Utilisation de la plateforme <strong>distrib</strong> pour le mois : ' . date('m/Y', strtotime('-1 month')) . '<br />' | $invoice->text = 'Utilisation de la plateforme <strong>distrib</strong> pour le mois : ' . date('m/Y', strtotime('-1 month')) . '<br />' | ||||
. 'Chiffre d\'affaire réalisé sur la plateforme : <strong>' . number_format($facture->ca, 2) . ' €</strong> commissionné à <strong>1%</strong>.'; | |||||
. 'Chiffre d\'affaire réalisé sur la plateforme : <strong>' . number_format($facture->ca, 2) . ' €</strong> commissionné à <strong>1%</strong>.'; | |||||
$invoice->paid = 0; | $invoice->paid = 0; | ||||
$invoice->period = $period; | $invoice->period = $period; | ||||
$invoice->save(); | $invoice->save(); | ||||
/** | /** | ||||
* Liste les factures des producteurs. | * Liste les factures des producteurs. | ||||
* | |||||
* | |||||
* @return mxied | * @return mxied | ||||
*/ | */ | ||||
public function actionBilling() | |||||
public function actionBilling() | |||||
{ | { | ||||
$dataProviderInvoice = new ActiveDataProvider([ | $dataProviderInvoice = new ActiveDataProvider([ | ||||
'query' => Invoice::find() | 'query' => Invoice::find() | ||||
->with('producer') | |||||
->orderBy('reference DESC'), | |||||
->with('producer') | |||||
->orderBy('reference DESC'), | |||||
'pagination' => [ | 'pagination' => [ | ||||
'pageSize' => 1000, | 'pageSize' => 1000, | ||||
], | ], | ||||
'dataProviderInvoice' => $dataProviderInvoice, | 'dataProviderInvoice' => $dataProviderInvoice, | ||||
]); | ]); | ||||
} | } | ||||
public function actionProducerInstallTaxUpdatePrices($idProducer) | public function actionProducerInstallTaxUpdatePrices($idProducer) | ||||
{ | { | ||||
// product | |||||
$productsArray = Product::searchAll([ | |||||
'id_producer' => $idProducer | |||||
]) ; | |||||
$connection = Yii::$app->getDb(); | |||||
foreach($productsArray as $product) { | |||||
$product->price = round($product->price / (1 + $product->taxRate->value), 2) ; | |||||
$product->save() ; | |||||
$command = $connection->createCommand(" | |||||
// product | |||||
$productsArray = Product::searchAll([ | |||||
'id_producer' => $idProducer | |||||
]); | |||||
$connection = Yii::$app->getDb(); | |||||
foreach ($productsArray as $product) { | |||||
$product->price = round($product->price / (1 + $product->taxRate->value), 2); | |||||
$product->save(); | |||||
$command = $connection->createCommand(" | |||||
UPDATE `product_order` | UPDATE `product_order` | ||||
SET price = ROUND(price / (1 + :tax_value), 2), | SET price = ROUND(price / (1 + :tax_value), 2), | ||||
id_tax_rate = :id_tax_rate | id_tax_rate = :id_tax_rate | ||||
WHERE id_product = :id_product", | WHERE id_product = :id_product", | ||||
[ | |||||
':id_product' => $product->id, | |||||
':tax_value' => $product->taxRate->value, | |||||
':id_tax_rate' => $product->taxRate->id, | |||||
]); | |||||
[ | |||||
':id_product' => $product->id, | |||||
':tax_value' => $product->taxRate->value, | |||||
':id_tax_rate' => $product->taxRate->id, | |||||
]); | |||||
$result = $command->query(); | |||||
} | |||||
$result = $command->query(); | |||||
} | |||||
echo 'ok' ; | |||||
echo 'ok'; | |||||
} | } | ||||
/** | /** | ||||
* Recherche un établissement. | * Recherche un établissement. | ||||
* | |||||
* | |||||
* @param integer $id | * @param integer $id | ||||
* @return Etablissement | * @return Etablissement | ||||
* @throws NotFoundHttpException | * @throws NotFoundHttpException | ||||
*/ | */ | ||||
protected function findModel($id) { | |||||
protected function findModel($id) | |||||
{ | |||||
if (($model = Producer::findOne($id)) !== null) { | if (($model = Producer::findOne($id)) !== null) { | ||||
return $model; | return $model; | ||||
} else { | } else { |
*/ | */ | ||||
class ProducerController extends BackendController | class ProducerController extends BackendController | ||||
{ | { | ||||
public $enableCsrfValidation = false; | public $enableCsrfValidation = false; | ||||
public function behaviors() | public function behaviors() | ||||
} | } | ||||
$dataProviderPrices = new ActiveDataProvider([ | $dataProviderPrices = new ActiveDataProvider([ | ||||
'query' => ProducerPriceRange::find() | |||||
'query' => ProducerPriceRange::find() | |||||
->orderBy('id ASC'), | ->orderBy('id ASC'), | ||||
'pagination' => [ | 'pagination' => [ | ||||
'pageSize' => 100, | 'pageSize' => 100, |
class ProducerPriceRangeAdminController extends BackendController | class ProducerPriceRangeAdminController 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::getCurrentStatus() == User::STATUS_ADMIN; | |||||
} | |||||
] | |||||
], | |||||
], | |||||
]; | |||||
} | |||||
public function behaviors() | |||||
{ | |||||
return [ | |||||
'verbs' => [ | |||||
'class' => VerbFilter::className(), | |||||
'actions' => [ | |||||
], | |||||
], | |||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
'matchCallback' => function ($rule, $action) { | |||||
return User::getCurrentStatus() == User::STATUS_ADMIN; | |||||
} | |||||
] | |||||
], | |||||
], | |||||
]; | |||||
} | |||||
/** | |||||
* Liste les tranches de prix. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionIndex() | |||||
{ | |||||
$dataProvider = new ActiveDataProvider([ | |||||
'query' => ProducerPriceRange::find()->orderBy('range_begin ASC') | |||||
]); | |||||
/** | |||||
* Liste les tranches de prix. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionIndex() | |||||
{ | |||||
$dataProvider = new ActiveDataProvider([ | |||||
'query' => ProducerPriceRange::find()->orderBy('range_begin ASC') | |||||
]); | |||||
return $this->render('index', [ | |||||
'dataProviderProducerPriceRange' => $dataProvider, | |||||
]); | |||||
} | |||||
return $this->render('index', [ | |||||
'dataProviderProducerPriceRange' => $dataProvider, | |||||
]); | |||||
} | |||||
/** | |||||
* Crée une tranche de prix. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionCreate() | |||||
{ | |||||
$model = new ProducerPriceRange(); | |||||
/** | |||||
* Crée une tranche de prix. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionCreate() | |||||
{ | |||||
$model = new ProducerPriceRange(); | |||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | |||||
Yii::$app->getSession()->setFlash('success', 'Tranche de prix créée.'); | |||||
return $this->redirect(['index']); | |||||
} else { | |||||
return $this->render('create', [ | |||||
'model' => $model, | |||||
]); | |||||
} | |||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | |||||
Yii::$app->getSession()->setFlash('success', 'Tranche de prix créée.'); | |||||
return $this->redirect(['index']); | |||||
} else { | |||||
return $this->render('create', [ | |||||
'model' => $model, | |||||
]); | |||||
} | } | ||||
} | |||||
/** | |||||
* Édition d'une tranche de prix. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionUpdate($id) | |||||
{ | |||||
$model = $this->findModel($id); | |||||
/** | |||||
* Édition d'une tranche de prix. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionUpdate($id) | |||||
{ | |||||
$model = $this->findModel($id); | |||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | |||||
Yii::$app->getSession()->setFlash('success', 'Tranche de prix éditée.'); | |||||
return $this->redirect(['index']); | |||||
} else { | |||||
return $this->render('update', [ | |||||
'model' => $model, | |||||
]); | |||||
} | |||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | |||||
Yii::$app->getSession()->setFlash('success', 'Tranche de prix éditée.'); | |||||
return $this->redirect(['index']); | |||||
} else { | |||||
return $this->render('update', [ | |||||
'model' => $model, | |||||
]); | |||||
} | } | ||||
} | |||||
/** | |||||
* Supprime une tranche de prix. | |||||
* | |||||
* @param integer $id | |||||
*/ | |||||
public function actionDelete($id) | |||||
{ | |||||
$producerPriceRange = ProducerPriceRange::searchOne([ | |||||
'id' => $id | |||||
]) ; | |||||
$producerPriceRange->delete(); | |||||
/** | |||||
* Supprime une tranche de prix. | |||||
* | |||||
* @param integer $id | |||||
*/ | |||||
public function actionDelete($id) | |||||
{ | |||||
$producerPriceRange = ProducerPriceRange::searchOne([ | |||||
'id' => $id | |||||
]); | |||||
$producerPriceRange->delete(); | |||||
Yii::$app->getSession()->setFlash('success', 'Tranche de prix supprimée.'); | |||||
return $this->redirect(['producer-price-range-admin/index']); | |||||
} | |||||
Yii::$app->getSession()->setFlash('success', 'Tranche de prix supprimée.'); | |||||
return $this->redirect(['producer-price-range-admin/index']); | |||||
} | |||||
/** | |||||
* Finds the Developpement model based on its primary key value. | |||||
* If the model is not found, a 404 HTTP exception will be thrown. | |||||
* @param integer $id | |||||
* @return ProducerPriceRange the loaded model | |||||
* @throws NotFoundHttpException if the model cannot be found | |||||
*/ | |||||
protected function findModel($id) | |||||
{ | |||||
if (($model = ProducerPriceRange::findOne($id)) !== null) { | |||||
return $model; | |||||
} else { | |||||
throw new NotFoundHttpException('The requested page does not exist.'); | |||||
} | |||||
/** | |||||
* Finds the Developpement model based on its primary key value. | |||||
* If the model is not found, a 404 HTTP exception will be thrown. | |||||
* @param integer $id | |||||
* @return ProducerPriceRange the loaded model | |||||
* @throws NotFoundHttpException if the model cannot be found | |||||
*/ | |||||
protected function findModel($id) | |||||
{ | |||||
if (($model = ProducerPriceRange::findOne($id)) !== null) { | |||||
return $model; | |||||
} else { | |||||
throw new NotFoundHttpException('The requested page does not exist.'); | |||||
} | } | ||||
} | |||||
} | } |
if ($model->load(Yii::$app->request->post()) && $model->save()) { | if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||||
$lastProductOrder = Product::find()->where('id_producer = :id_producer')->params([':id_producer' => GlobalParam::getCurrentProducerId()])->orderBy('order DESC')->one(); | |||||
$lastProductOrder = Product::find()->where('id_producer = :id_producer')->params([':id_producer' => GlobalParam::getCurrentProducerId()])->orderBy('order DESC')->one(); | |||||
if ($lastProductOrder) { | if ($lastProductOrder) { | ||||
$model->order = ++$lastProductOrder->order; | $model->order = ++$lastProductOrder->order; | ||||
} | } | ||||
'id_product' => $id | 'id_product' => $id | ||||
])); | ])); | ||||
$userProducerWithProductPercent = UserProducer::searchAll([], [ | |||||
$userProducerWithProductPercent = UserProducer::searchAll([], [ | |||||
'join_with' => ['user'], | 'join_with' => ['user'], | ||||
'conditions' => 'user_producer.product_price_percent != 0', | 'conditions' => 'user_producer.product_price_percent != 0', | ||||
]); | ]); | ||||
'from_quantity' => $model->from_quantity ? $model->from_quantity : null, | 'from_quantity' => $model->from_quantity ? $model->from_quantity : null, | ||||
]; | ]; | ||||
$productPriceExist = ProductPrice::findOne($conditionsProductPriceExist); | |||||
$productPriceExist = ProductPrice::findOne($conditionsProductPriceExist); | |||||
if ($productPriceExist) { | if ($productPriceExist) { | ||||
$productPriceExist->delete(); | $productPriceExist->delete(); | ||||
{ | { | ||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||||
$product = $this->findModel($id); | $product = $this->findModel($id); | ||||
$product->active = (int) $active; | |||||
$product->active = (int)$active; | |||||
$product->save(); | $product->save(); | ||||
DistributionModel::linkProductIncomingDistributions($product); | DistributionModel::linkProductIncomingDistributions($product); | ||||
*/ | */ | ||||
protected function findModel($id) | protected function findModel($id) | ||||
{ | { | ||||
if (($model = Product::findOne($id)) !== null) { | |||||
if (($model = Product::findOne($id)) !== null) { | |||||
return $model; | return $model; | ||||
} else { | } else { | ||||
throw new NotFoundHttpException('The requested page does not exist.'); | throw new NotFoundHttpException('The requested page does not exist.'); | ||||
protected function findModelProductPrice($id) | protected function findModelProductPrice($id) | ||||
{ | { | ||||
if (($model = ProductPrice::findOne($id)) !== null) { | |||||
if (($model = ProductPrice::findOne($id)) !== null) { | |||||
return $model; | return $model; | ||||
} else { | } else { | ||||
throw new NotFoundHttpException('The requested page does not exist.'); | throw new NotFoundHttpException('The requested page does not exist.'); |
class QuotationController extends DocumentController | class QuotationController extends DocumentController | ||||
{ | { | ||||
public function behaviors() | |||||
{ | |||||
return [ | |||||
'verbs' => [ | |||||
'class' => VerbFilter::className(), | |||||
'actions' => [ | |||||
], | |||||
], | |||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
'matchCallback' => function ($rule, $action) { | |||||
return $this->getUserManager()->hasAccessBackend(); | |||||
} | |||||
] | |||||
], | |||||
], | |||||
]; | |||||
} | |||||
public function behaviors() | |||||
{ | |||||
return [ | |||||
'verbs' => [ | |||||
'class' => VerbFilter::className(), | |||||
'actions' => [ | |||||
], | |||||
], | |||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
'matchCallback' => function ($rule, $action) { | |||||
return $this->getUserManager()->hasAccessBackend(); | |||||
} | |||||
] | |||||
], | |||||
], | |||||
]; | |||||
} | |||||
/** | |||||
* Liste les modèles Invoice. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionIndex() | |||||
{ | |||||
$searchModel = new QuotationSearch(); | |||||
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); | |||||
/** | |||||
* Liste les modèles Invoice. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionIndex() | |||||
{ | |||||
$searchModel = new QuotationSearch(); | |||||
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); | |||||
return $this->render('index', [ | |||||
'searchModel' => $searchModel, | |||||
'dataProvider' => $dataProvider, | |||||
]); | |||||
} | |||||
return $this->render('index', [ | |||||
'searchModel' => $searchModel, | |||||
'dataProvider' => $dataProvider, | |||||
]); | |||||
} | |||||
public function actionTransform($id) | |||||
{ | |||||
$quotation = $this->findModel($id) ; | |||||
if($quotation->isStatusValid()) { | |||||
public function actionTransform($id) | |||||
{ | |||||
$quotation = $this->findModel($id); | |||||
if ($quotation->isStatusValid()) { | |||||
$invoice = new Invoice ; | |||||
$invoice->initTaxCalculationMethod(); | |||||
$invoice->id_producer = GlobalParam::getCurrentProducerId(); | |||||
$invoice->id_user = $quotation->id_user ; | |||||
$invoice->address = $quotation->address ; | |||||
$invoice->comment = $quotation->comment ; | |||||
$invoice->name = str_replace(['Devis', 'devis'], 'Facture', $quotation->name); | |||||
$invoice->save() ; | |||||
$invoice = new Invoice; | |||||
$invoice->initTaxCalculationMethod(); | |||||
$invoice->id_producer = GlobalParam::getCurrentProducerId(); | |||||
$invoice->id_user = $quotation->id_user; | |||||
$invoice->address = $quotation->address; | |||||
$invoice->comment = $quotation->comment; | |||||
$invoice->name = str_replace(['Devis', 'devis'], 'Facture', $quotation->name); | |||||
$invoice->save(); | |||||
Order::updateAll([ | |||||
'order.id_invoice' => $invoice->id | |||||
], [ | |||||
'order.id_quotation' => $id | |||||
]) ; | |||||
Order::updateAll([ | |||||
'order.id_invoice' => $invoice->id | |||||
], [ | |||||
'order.id_quotation' => $id | |||||
]); | |||||
Yii::$app->getSession()->setFlash('success', 'Le devis <strong>'.Html::encode($quotation->name).'</strong> a bien été transformé en facture.'); | |||||
return $this->redirect(['/' . $this->getControllerUrl() . '/index']); | |||||
} | |||||
else { | |||||
throw new UserException('Vous ne pouvez pas transformer en facture un devis non validé.'); | |||||
} | |||||
Yii::$app->getSession()->setFlash('success', 'Le devis <strong>' . Html::encode($quotation->name) . '</strong> a bien été transformé en facture.'); | |||||
return $this->redirect(['/' . $this->getControllerUrl() . '/index']); | |||||
} else { | |||||
throw new UserException('Vous ne pouvez pas transformer en facture un devis non validé.'); | |||||
} | } | ||||
} | |||||
} | } |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use Yii; | use Yii; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
class ReportController extends BackendController | |||||
class ReportController extends BackendController | |||||
{ | { | ||||
var $enableCsrfValidation = false; | var $enableCsrfValidation = false; | ||||
public function behaviors() | |||||
public function behaviors() | |||||
{ | { | ||||
return [ | return [ | ||||
'access' => [ | 'access' => [ | ||||
], | ], | ||||
]; | ]; | ||||
} | } | ||||
public function actionIndex() | |||||
public function actionIndex() | |||||
{ | { | ||||
$this->checkProductsPointsSale() ; | |||||
return $this->render('index') ; | |||||
$this->checkProductsPointsSale(); | |||||
return $this->render('index'); | |||||
} | } | ||||
public function actionAjaxInit() | |||||
public function actionAjaxInit() | |||||
{ | { | ||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||||
$usersArray = User::findBy()->all() ; | |||||
$pointsSaleArray = PointSale::searchAll() ; | |||||
$usersArray = User::findBy()->all(); | |||||
$pointsSaleArray = PointSale::searchAll(); | |||||
// distributions | // distributions | ||||
$firstDistribution = DistributionModel::searchOne([], [ | $firstDistribution = DistributionModel::searchOne([], [ | ||||
'orderby' => 'date ASC' | 'orderby' => 'date ASC' | ||||
]) ; | |||||
]); | |||||
$lastDistribution = DistributionModel::searchOne([], [ | $lastDistribution = DistributionModel::searchOne([], [ | ||||
'orderby' => 'date DESC' | 'orderby' => 'date DESC' | ||||
]) ; | |||||
$firstYear = date('Y',strtotime($firstDistribution->date)) ; | |||||
$lastYear = date('Y',strtotime($lastDistribution->date)) ; | |||||
$distributionYearsArray = [] ; | |||||
for($year = $firstYear; $year <= $lastYear; $year ++) { | |||||
$distributionYearsArray[] = $year ; | |||||
]); | |||||
$firstYear = date('Y', strtotime($firstDistribution->date)); | |||||
$lastYear = date('Y', strtotime($lastDistribution->date)); | |||||
$distributionYearsArray = []; | |||||
for ($year = $firstYear; $year <= $lastYear; $year++) { | |||||
$distributionYearsArray[] = $year; | |||||
} | } | ||||
$distributionsArray = DistributionModel::searchAll([ | $distributionsArray = DistributionModel::searchAll([ | ||||
'distribution.active' => 1 | 'distribution.active' => 1 | ||||
], [ | ], [ | ||||
'orderby' => 'date ASC', | 'orderby' => 'date ASC', | ||||
]) ; | |||||
$distributionsByMonthArray = [] ; | |||||
foreach($distributionsArray as $distribution) { | |||||
$month = date('Y-m', strtotime($distribution->date)) ; | |||||
if(!isset($distributionsByMonthArray[$month])) { | |||||
]); | |||||
$distributionsByMonthArray = []; | |||||
foreach ($distributionsArray as $distribution) { | |||||
$month = date('Y-m', strtotime($distribution->date)); | |||||
if (!isset($distributionsByMonthArray[$month])) { | |||||
$distributionsByMonthArray[$month] = [ | $distributionsByMonthArray[$month] = [ | ||||
'display' => 0, | 'display' => 0, | ||||
'year' => date('Y',strtotime($distribution->date)), | |||||
'year' => date('Y', strtotime($distribution->date)), | |||||
'month' => strftime('%B', strtotime($distribution->date)), | 'month' => strftime('%B', strtotime($distribution->date)), | ||||
'distributions' => [] | 'distributions' => [] | ||||
] ; | |||||
]; | |||||
} | } | ||||
$distribution->date = strftime('%A %d %B %Y', strtotime($distribution->date)) ; | |||||
$distributionsByMonthArray[$month]['distributions'][] = $distribution ; | |||||
$distribution->date = strftime('%A %d %B %Y', strtotime($distribution->date)); | |||||
$distributionsByMonthArray[$month]['distributions'][] = $distribution; | |||||
} | } | ||||
return [ | |||||
return [ | |||||
'usersArray' => $usersArray, | 'usersArray' => $usersArray, | ||||
'pointsSaleArray' => $pointsSaleArray, | 'pointsSaleArray' => $pointsSaleArray, | ||||
'distributionYearsArray' => $distributionYearsArray, | 'distributionYearsArray' => $distributionYearsArray, | ||||
'distributionsByMonthArray' => $distributionsByMonthArray | 'distributionsByMonthArray' => $distributionsByMonthArray | ||||
] ; | |||||
]; | |||||
} | } | ||||
public function actionAjaxReport() | |||||
public function actionAjaxReport() | |||||
{ | { | ||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||||
$posts = Yii::$app->request->post(); | $posts = Yii::$app->request->post(); | ||||
$resArray = [] ; | |||||
$conditionUsers = $this->_generateConditionSqlReport($posts, 'users', 'id_user') ; | |||||
$conditionPointsSale = $this->_generateConditionSqlReport($posts, 'pointsSale', 'id_point_sale') ; | |||||
$conditionDistributions = $this->_generateConditionSqlReport($posts, 'distributions', 'id_distribution') ; | |||||
$resArray = []; | |||||
$conditionUsers = $this->_generateConditionSqlReport($posts, 'users', 'id_user'); | |||||
$conditionPointsSale = $this->_generateConditionSqlReport($posts, 'pointsSale', 'id_point_sale'); | |||||
$conditionDistributions = $this->_generateConditionSqlReport($posts, 'distributions', 'id_distribution'); | |||||
$res = Yii::$app->db->createCommand("SELECT product.name, SUM(product_order.quantity) AS quantity, SUM(product_order.price * product_order.quantity) AS total | $res = Yii::$app->db->createCommand("SELECT product.name, SUM(product_order.quantity) AS quantity, SUM(product_order.price * product_order.quantity) AS total | ||||
FROM `order`, product_order, product | FROM `order`, product_order, product | ||||
WHERE `order`.id = product_order.id_order | WHERE `order`.id = product_order.id_order | ||||
AND product.id_producer = ".((int) GlobalParam::getCurrentProducerId()) ." | |||||
AND product.id_producer = " . ((int)GlobalParam::getCurrentProducerId()) . " | |||||
AND product_order.id_product = product.id | AND product_order.id_product = product.id | ||||
AND `order`.date_delete IS NULL | AND `order`.date_delete IS NULL | ||||
".$conditionUsers." | |||||
".$conditionPointsSale." | |||||
".$conditionDistributions." | |||||
" . $conditionUsers . " | |||||
" . $conditionPointsSale . " | |||||
" . $conditionDistributions . " | |||||
GROUP BY product.id | GROUP BY product.id | ||||
ORDER BY product.order ASC | ORDER BY product.order ASC | ||||
") | ") | ||||
->queryAll(); | |||||
->queryAll(); | |||||
$totalGlobal = 0 ; | |||||
foreach($res as $line) { | |||||
$total = Price::format(round($line['total'], 2)) ; | |||||
if($line['quantity'] > 0) { | |||||
$totalGlobal = 0; | |||||
foreach ($res as $line) { | |||||
$total = Price::format(round($line['total'], 2)); | |||||
if ($line['quantity'] > 0) { | |||||
$resArray[] = [ | $resArray[] = [ | ||||
'name' => $line['name'], | 'name' => $line['name'], | ||||
'quantity' => $line['quantity'], | 'quantity' => $line['quantity'], | ||||
'total' => $total, | 'total' => $total, | ||||
] ; | |||||
$totalGlobal += $line['total'] ; | |||||
]; | |||||
$totalGlobal += $line['total']; | |||||
} | } | ||||
} | } | ||||
$resArray[] = [ | $resArray[] = [ | ||||
'name' => '', | 'name' => '', | ||||
'quantity' => '', | 'quantity' => '', | ||||
'total' => '<strong>'.Price::format(round($totalGlobal, 2)).'</strong>', | |||||
] ; | |||||
return $resArray ; | |||||
'total' => '<strong>' . Price::format(round($totalGlobal, 2)) . '</strong>', | |||||
]; | |||||
return $resArray; | |||||
} | } | ||||
public function _generateConditionSqlReport($posts, $name, $fieldOrder) | |||||
public function _generateConditionSqlReport($posts, $name, $fieldOrder) | |||||
{ | { | ||||
$condition = '' ; | |||||
if(isset($posts[$name]) && strlen($posts[$name])) { | |||||
$idsArray = explode(',', $posts[$name]) ; | |||||
for($i = 0; $i < count($idsArray); $i++) { | |||||
$idsArray[$i] = (int) $idsArray[$i] ; | |||||
$condition = ''; | |||||
if (isset($posts[$name]) && strlen($posts[$name])) { | |||||
$idsArray = explode(',', $posts[$name]); | |||||
for ($i = 0; $i < count($idsArray); $i++) { | |||||
$idsArray[$i] = (int)$idsArray[$i]; | |||||
} | } | ||||
$condition = 'AND `order`.'.$fieldOrder.' IN ('.implode(',',$idsArray).') ' ; | |||||
$condition = 'AND `order`.' . $fieldOrder . ' IN (' . implode(',', $idsArray) . ') '; | |||||
} | } | ||||
return $condition ; | |||||
return $condition; | |||||
} | } | ||||
} | } |
<?php | <?php | ||||
/** | /** | ||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | */ | ||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
use common\logic\Distribution\Distribution\Distribution; | |||||
use common\logic\Order\Order\Order; | |||||
use common\logic\PointSale\PointSale\PointSale; | |||||
use common\logic\Product\Product\Product; | |||||
use common\logic\User\User\User; | |||||
use Yii; | use Yii; | ||||
use yii\filters\AccessControl; | use yii\filters\AccessControl; | ||||
use common\forms\LoginForm; | use common\forms\LoginForm; | ||||
*/ | */ | ||||
class SiteController extends BackendController | class SiteController extends BackendController | ||||
{ | { | ||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function behaviors() | |||||
{ | |||||
return [ | |||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'actions' => ['login', 'error'], | |||||
'allow' => true, | |||||
], | |||||
[ | |||||
'actions' => ['logout', 'index'], | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
'matchCallback' => function ($rule, $action) { | |||||
return $this->getUserManager()->hasAccessBackend(); | |||||
} | |||||
], | |||||
[ | |||||
'actions' => ['change-producer'], | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
'matchCallback' => function ($rule, $action) { | |||||
return User::getCurrentStatus() == User::STATUS_ADMIN ; | |||||
} | |||||
], | |||||
], | |||||
], | |||||
'verbs' => [ | |||||
'class' => VerbFilter::className(), | |||||
'actions' => [ | |||||
], | |||||
], | |||||
]; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function actions() | |||||
{ | |||||
return [ | |||||
'error' => [ | |||||
'class' => 'yii\web\ErrorAction', | |||||
], | |||||
]; | |||||
} | |||||
/** | |||||
* Affiche le tableau de bord du backend avec les dernières commandes | |||||
* réalisée, les dernières inscriptions, la liste des clients ayant un crédit | |||||
* négatif etc. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionIndex() | |||||
{ | |||||
// commandes | |||||
$optionDashboardNumberDistributions = Producer::getConfig('option_dashboard_number_distributions') ; | |||||
$dashboardNumberDistributions = $optionDashboardNumberDistributions ? $optionDashboardNumberDistributions : 3 ; | |||||
$optionDashboardDateStart = Producer::getConfig('option_dashboard_date_start') ; | |||||
$optionDashboardDateEnd = Producer::getConfig('option_dashboard_date_end') ; | |||||
$queryDistributions = DistributionModel::find()->with('order') ; | |||||
if($optionDashboardDateStart || $optionDashboardDateEnd) { | |||||
if($optionDashboardDateStart) { | |||||
$queryDistributions->andWhere(['>=', 'distribution.date', $optionDashboardDateStart]) ; | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function behaviors() | |||||
{ | |||||
return [ | |||||
'access' => [ | |||||
'class' => AccessControl::class, | |||||
'rules' => [ | |||||
[ | |||||
'actions' => ['login', 'error'], | |||||
'allow' => true, | |||||
], | |||||
[ | |||||
'actions' => ['logout', 'index'], | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
'matchCallback' => function ($rule, $action) { | |||||
return $this->getUserManager()->hasAccessBackend(); | |||||
} | } | ||||
if($optionDashboardDateEnd) { | |||||
$queryDistributions->andWhere(['<=', 'distribution.date', $optionDashboardDateEnd]) ; | |||||
], | |||||
[ | |||||
'actions' => ['change-producer'], | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
'matchCallback' => function ($rule, $action) { | |||||
return $this->getUserManager()->getCurrentStatus() == User::STATUS_ADMIN; | |||||
} | } | ||||
} | |||||
else { | |||||
$queryDistributions->andWhere(['>=', 'distribution.date', date('Y-m-d')]) ; | |||||
} | |||||
$distributionsArray = $queryDistributions->andWhere([ | |||||
'distribution.id_producer' => GlobalParam::getCurrentProducerId(), | |||||
'distribution.active' => 1 | |||||
]) | |||||
->orderBy('date ASC') | |||||
->limit($dashboardNumberDistributions) | |||||
->all(); | |||||
// dernières commandes | |||||
$paramsOrders = [] ; | |||||
if($optionDashboardDateStart || $optionDashboardDateEnd) { | |||||
$conditionsOrders = '' ; | |||||
if($optionDashboardDateStart) { | |||||
$conditionsOrders .= 'distribution.date >= :date_start' ; | |||||
$paramsOrders[':date_start'] = $optionDashboardDateStart; | |||||
} | |||||
if($optionDashboardDateEnd) { | |||||
if($optionDashboardDateStart) { | |||||
$conditionsOrders .= ' AND ' ; | |||||
} | |||||
$conditionsOrders .= 'distribution.date <= :date_end' ; | |||||
$paramsOrders[':date_end'] = $optionDashboardDateEnd ; | |||||
} | |||||
} | |||||
else { | |||||
$conditionsOrders = 'distribution.date >= :date_start' ; | |||||
$paramsOrders[':date_start'] = date('Y-m-d 00:00:00') ; | |||||
} | |||||
$ordersArray = Order::searchAll([],[ | |||||
'orderby' => 'date DESC', | |||||
'conditions' => $conditionsOrders.' AND (origin = \'' . Order::ORIGIN_USER . '\' OR origin = \'' . Order::ORIGIN_ADMIN . '\' OR (origin = \'' . Order::ORIGIN_AUTO . '\' AND (date_update IS NOT NULL OR date_delete IS NOT NULL)))', | |||||
'params' => $paramsOrders, | |||||
]); | |||||
// clients | |||||
$usersArray = User::findBy() | |||||
->orderBy('created_at DESC') | |||||
->limit(5) | |||||
->all(); | |||||
$usersNegativeCredit = User::findBy(['id_producer' => GlobalParam::getCurrentProducerId()]) | |||||
->andWhere('user_producer.credit < 0') | |||||
->all(); | |||||
// paramètres | |||||
$producer = GlobalParam::getCurrentProducer(); | |||||
$productsCount = Product::searchCount() ; | |||||
$pointsSaleCount = PointSale::searchCount() ; | |||||
return $this->render('index', [ | |||||
'distributionsArray' => $distributionsArray, | |||||
'ordersArray' => $ordersArray, | |||||
'usersArray' => $usersArray, | |||||
'usersNegativeCredit' => $usersNegativeCredit, | |||||
'producer' => $producer, | |||||
'productsCount' => $productsCount, | |||||
'pointsSaleCount' => $pointsSaleCount | |||||
]); | |||||
], | |||||
], | |||||
], | |||||
'verbs' => [ | |||||
'class' => VerbFilter::class, | |||||
'actions' => [ | |||||
], | |||||
], | |||||
]; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function actions() | |||||
{ | |||||
return [ | |||||
'error' => [ | |||||
'class' => 'yii\web\ErrorAction', | |||||
], | |||||
]; | |||||
} | |||||
/** | |||||
* Affiche le tableau de bord du backend avec les dernières commandes | |||||
* réalisée, les dernières inscriptions, la liste des clients ayant un crédit | |||||
* négatif etc. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionIndex() | |||||
{ | |||||
$userManager = $this->getUserManager(); | |||||
$producerManager = $this->getProducerManager(); | |||||
// commandes | |||||
$optionDashboardNumberDistributions = $producerManager->getConfig('option_dashboard_number_distributions'); | |||||
$dashboardNumberDistributions = $optionDashboardNumberDistributions ? $optionDashboardNumberDistributions : 3; | |||||
$optionDashboardDateStart = $producerManager->getConfig('option_dashboard_date_start'); | |||||
$optionDashboardDateEnd = $producerManager->getConfig('option_dashboard_date_end'); | |||||
$queryDistributions = Distribution::find()->with('order'); | |||||
if ($optionDashboardDateStart || $optionDashboardDateEnd) { | |||||
if ($optionDashboardDateStart) { | |||||
$queryDistributions->andWhere(['>=', 'distribution.date', $optionDashboardDateStart]); | |||||
} | |||||
if ($optionDashboardDateEnd) { | |||||
$queryDistributions->andWhere(['<=', 'distribution.date', $optionDashboardDateEnd]); | |||||
} | |||||
} else { | |||||
$queryDistributions->andWhere(['>=', 'distribution.date', date('Y-m-d')]); | |||||
} | } | ||||
/** | |||||
* Affiche la page de connexion. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionLogin() | |||||
{ | |||||
if (!\Yii::$app->user->isGuest) { | |||||
return $this->goHome(); | |||||
} | |||||
$model = new LoginForm(); | |||||
if ($model->load(Yii::$app->request->post()) && $model->login()) { | |||||
return $this->goBack(); | |||||
} else { | |||||
return $this->render('login', [ | |||||
'model' => $model, | |||||
]); | |||||
$distributionsArray = $queryDistributions->andWhere([ | |||||
'distribution.id_producer' => GlobalParam::getCurrentProducerId(), | |||||
'distribution.active' => 1 | |||||
]) | |||||
->orderBy('date ASC') | |||||
->limit($dashboardNumberDistributions) | |||||
->all(); | |||||
// dernières commandes | |||||
$paramsOrders = []; | |||||
if ($optionDashboardDateStart || $optionDashboardDateEnd) { | |||||
$conditionsOrders = ''; | |||||
if ($optionDashboardDateStart) { | |||||
$conditionsOrders .= 'distribution.date >= :date_start'; | |||||
$paramsOrders[':date_start'] = $optionDashboardDateStart; | |||||
} | |||||
if ($optionDashboardDateEnd) { | |||||
if ($optionDashboardDateStart) { | |||||
$conditionsOrders .= ' AND '; | |||||
} | } | ||||
$conditionsOrders .= 'distribution.date <= :date_end'; | |||||
$paramsOrders[':date_end'] = $optionDashboardDateEnd; | |||||
} | |||||
} else { | |||||
$conditionsOrders = 'distribution.date >= :date_start'; | |||||
$paramsOrders[':date_start'] = date('Y-m-d 00:00:00'); | |||||
} | } | ||||
/** | |||||
* Déconnecte l'utilisateur et le redirige à la page d'accueil. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionLogout() | |||||
{ | |||||
Yii::$app->user->logout(); | |||||
return $this->goHome(); | |||||
$ordersArray = Order::searchAll([], [ | |||||
'orderby' => 'date DESC', | |||||
'conditions' => $conditionsOrders . ' AND (origin = \'' . Order::ORIGIN_USER . '\' OR origin = \'' . Order::ORIGIN_ADMIN . '\' OR (origin = \'' . Order::ORIGIN_AUTO . '\' AND (date_update IS NOT NULL OR date_delete IS NOT NULL)))', | |||||
'params' => $paramsOrders, | |||||
]); | |||||
// clients | |||||
$usersArray = $userManager->queryUsersBy() | |||||
->orderBy('created_at DESC') | |||||
->limit(5) | |||||
->all(); | |||||
$usersNegativeCredit = $userManager->queryUsersBy(['id_producer' => GlobalParam::getCurrentProducerId()]) | |||||
->andWhere('user_producer.credit < 0') | |||||
->all(); | |||||
// paramètres | |||||
$producer = GlobalParam::getCurrentProducer(); | |||||
$productsCount = Product::searchCount(); | |||||
$pointsSaleCount = PointSale::searchCount(); | |||||
return $this->render('index', [ | |||||
'distributionsArray' => $distributionsArray, | |||||
'ordersArray' => $ordersArray, | |||||
'usersArray' => $usersArray, | |||||
'usersNegativeCredit' => $usersNegativeCredit, | |||||
'producer' => $producer, | |||||
'productsCount' => $productsCount, | |||||
'pointsSaleCount' => $pointsSaleCount | |||||
]); | |||||
} | |||||
/** | |||||
* Affiche la page de connexion. | |||||
*/ | |||||
public function actionLogin() | |||||
{ | |||||
if (!\Yii::$app->user->isGuest) { | |||||
return $this->goHome(); | |||||
} | } | ||||
/** | |||||
* Change le producteur courant de l'utilisateur connecté. | |||||
* Permet de passer d'un producteur à un autre en tant qu'administrateur. | |||||
* | |||||
* @param integer $id | |||||
*/ | |||||
public function actionChangeProducer($id) | |||||
{ | |||||
Yii::$app->user->identity->id_producer = $id; | |||||
Yii::$app->user->identity->save(); | |||||
$this->redirect(['site/index']); | |||||
$model = new LoginForm(); | |||||
if ($model->load(Yii::$app->request->post()) && $model->login()) { | |||||
return $this->goBack(); | |||||
} else { | |||||
return $this->render('login', [ | |||||
'model' => $model, | |||||
]); | |||||
} | } | ||||
} | |||||
/** | |||||
* Déconnecte l'utilisateur et le redirige à la page d'accueil. | |||||
* | |||||
* @return mixed | |||||
*/ | |||||
public function actionLogout() | |||||
{ | |||||
Yii::$app->user->logout(); | |||||
return $this->goHome(); | |||||
} | |||||
/** | |||||
* Change le producteur courant de l'utilisateur connecté. | |||||
* Permet de passer d'un producteur à un autre en tant qu'administrateur. | |||||
* | |||||
* @param integer $id | |||||
*/ | |||||
public function actionChangeProducer($id) | |||||
{ | |||||
Yii::$app->user->identity->id_producer = $id; | |||||
Yii::$app->user->identity->save(); | |||||
$this->redirect(['site/index']); | |||||
} | |||||
} | } |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use DateInterval; | use DateInterval; | ||||
use DatePeriod; | use DatePeriod; | ||||
class StatsController extends BackendController | |||||
class StatsController extends BackendController | |||||
{ | { | ||||
public function behaviors() | |||||
public function behaviors() | |||||
{ | { | ||||
return [ | return [ | ||||
'access' => [ | 'access' => [ | ||||
/** | /** | ||||
* Affiche les statistiques de l'année avec le CA réalisé par mois. | * Affiche les statistiques de l'année avec le CA réalisé par mois. | ||||
* | |||||
* | |||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionIndex() | |||||
public function actionIndex() | |||||
{ | { | ||||
/* | /* | ||||
* Volume de commande de l'année passée (par mois) | * Volume de commande de l'année passée (par mois) | ||||
AND distribution.date >= :date_start | AND distribution.date >= :date_start | ||||
AND distribution.date <= :date_end | AND distribution.date <= :date_end | ||||
") | ") | ||||
->bindValue(':id_producer',GlobalParam::getCurrentProducerId()) | |||||
->bindValue(':date_start', date('Y-m-', $date->getTimestamp()).'01') | |||||
->bindValue(':date_end', date('Y-m-', $date->getTimestamp()).'31' ) | |||||
->bindValue(':id_producer', GlobalParam::getCurrentProducerId()) | |||||
->bindValue(':date_start', date('Y-m-', $date->getTimestamp()) . '01') | |||||
->bindValue(':date_end', date('Y-m-', $date->getTimestamp()) . '31') | |||||
->queryOne(); | ->queryOne(); | ||||
if($res['total']) { | |||||
if ($res['total']) { | |||||
$data[$month] = $res['total']; | $data[$month] = $res['total']; | ||||
} | |||||
else { | |||||
} else { | |||||
$data[$month] = 0; | $data[$month] = 0; | ||||
} | } | ||||
'data' => $dataNoIndex, | 'data' => $dataNoIndex, | ||||
]); | ]); | ||||
} | } | ||||
const TOTALS = 13 ; | |||||
const TOTALS = 13; | |||||
/** | /** | ||||
* Affiche un tableau avec les totaux (maximums, commandés) de chaque produit | * Affiche un tableau avec les totaux (maximums, commandés) de chaque produit | ||||
* par mois d'une année donnée. | * par mois d'une année donnée. | ||||
* | |||||
* | |||||
* @param integer $year | * @param integer $year | ||||
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionProducts($year = 0, $section = 1) | |||||
public function actionProducts($year = 0, $section = 1) | |||||
{ | { | ||||
if(!$year) $year = date('Y') ; | |||||
$productsArray = Product::searchAll() ; | |||||
$dataProducts = [] ; | |||||
$dataProducts[self::TOTALS] = ['max' => [], 'orders' => []] ; | |||||
foreach($productsArray as $product) { | |||||
$dataProducts[self::TOTALS]['max'][$product['name']] = 0 ; | |||||
$dataProducts[self::TOTALS]['orders'][$product['name']] = 0 ; | |||||
if (!$year) $year = date('Y'); | |||||
$productsArray = Product::searchAll(); | |||||
$dataProducts = []; | |||||
$dataProducts[self::TOTALS] = ['max' => [], 'orders' => []]; | |||||
foreach ($productsArray as $product) { | |||||
$dataProducts[self::TOTALS]['max'][$product['name']] = 0; | |||||
$dataProducts[self::TOTALS]['orders'][$product['name']] = 0; | |||||
} | } | ||||
if(!in_array($section, [1, 2, 3, 4])) { | |||||
$section = 1 ; | |||||
if (!in_array($section, [1, 2, 3, 4])) { | |||||
$section = 1; | |||||
} | } | ||||
$iStart = (3 * ($section - 1)) + 1 ; | |||||
$iEnd = 3 * $section ; | |||||
$empty = true ; | |||||
for($i = $iStart; $i <= $iEnd; $i++) { | |||||
$iStart = (3 * ($section - 1)) + 1; | |||||
$iEnd = 3 * $section; | |||||
$empty = true; | |||||
for ($i = $iStart; $i <= $iEnd; $i++) { | |||||
// Maximums | // Maximums | ||||
$resMaximums = Yii::$app->db->createCommand("SELECT product.name, SUM(IF(product_distribution.active, product_distribution.quantity_max,0)) AS total | $resMaximums = Yii::$app->db->createCommand("SELECT product.name, SUM(IF(product_distribution.active, product_distribution.quantity_max,0)) AS total | ||||
FROM distribution, product_distribution, product | FROM distribution, product_distribution, product | ||||
WHERE distribution.id_producer = ".GlobalParam::getCurrentProducerId()." | |||||
WHERE distribution.id_producer = " . GlobalParam::getCurrentProducerId() . " | |||||
AND distribution.date >= :date_begin | AND distribution.date >= :date_begin | ||||
AND distribution.date <= :date_end | AND distribution.date <= :date_end | ||||
AND distribution.id = product_distribution.id_distribution | AND distribution.id = product_distribution.id_distribution | ||||
AND product_distribution.id_product = product.id | AND product_distribution.id_product = product.id | ||||
GROUP BY product.id | GROUP BY product.id | ||||
ORDER BY product.name") | ORDER BY product.name") | ||||
->bindValue(':date_begin', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-01')) | |||||
->bindValue(':date_end', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-31')) | |||||
->queryAll(); | |||||
$dataProducts[$i]['max'] = $resMaximums ; | |||||
if(count($resMaximums)) $empty = false ; | |||||
foreach($resMaximums as $productMax) { | |||||
if(!isset($dataProducts[self::TOTALS]['max'][$productMax['name']])) { | |||||
$dataProducts[self::TOTALS]['max'][$productMax['name']] = 0 ; | |||||
->bindValue(':date_begin', date($year . '-' . str_pad($i, 2, 0, STR_PAD_LEFT) . '-01')) | |||||
->bindValue(':date_end', date($year . '-' . str_pad($i, 2, 0, STR_PAD_LEFT) . '-31')) | |||||
->queryAll(); | |||||
$dataProducts[$i]['max'] = $resMaximums; | |||||
if (count($resMaximums)) $empty = false; | |||||
foreach ($resMaximums as $productMax) { | |||||
if (!isset($dataProducts[self::TOTALS]['max'][$productMax['name']])) { | |||||
$dataProducts[self::TOTALS]['max'][$productMax['name']] = 0; | |||||
} | } | ||||
$dataProducts[self::TOTALS]['max'][$productMax['name']] += $productMax['total'] ; | |||||
$dataProducts[self::TOTALS]['max'][$productMax['name']] += $productMax['total']; | |||||
} | } | ||||
// Commandés | // Commandés | ||||
$resOrders = Yii::$app->db->createCommand(' | $resOrders = Yii::$app->db->createCommand(' | ||||
SELECT product.name, SUM(product_order.quantity) AS total | SELECT product.name, SUM(product_order.quantity) AS total | ||||
FROM `distribution`, `order`, `product_order`, `product` | FROM `distribution`, `order`, `product_order`, `product` | ||||
WHERE distribution.id_producer = '.GlobalParam::getCurrentProducerId().' | |||||
WHERE distribution.id_producer = ' . GlobalParam::getCurrentProducerId() . ' | |||||
AND distribution.date >= :date_begin | AND distribution.date >= :date_begin | ||||
AND distribution.date <= :date_end | AND distribution.date <= :date_end | ||||
AND distribution.id = `order`.id_distribution | AND distribution.id = `order`.id_distribution | ||||
AND product_order.id_product = product.id | AND product_order.id_product = product.id | ||||
GROUP BY product.id | GROUP BY product.id | ||||
ORDER BY product.name') | ORDER BY product.name') | ||||
->bindValue(':date_begin', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-01')) | |||||
->bindValue(':date_end', date($year.'-'.str_pad($i, 2, 0, STR_PAD_LEFT).'-31')) | |||||
->queryAll(); | |||||
->bindValue(':date_begin', date($year . '-' . str_pad($i, 2, 0, STR_PAD_LEFT) . '-01')) | |||||
->bindValue(':date_end', date($year . '-' . str_pad($i, 2, 0, STR_PAD_LEFT) . '-31')) | |||||
->queryAll(); | |||||
$dataProducts[$i]['orders'] = $resOrders; | $dataProducts[$i]['orders'] = $resOrders; | ||||
if(count($resOrders)) $empty = false ; | |||||
foreach($resOrders as $productOrder) { | |||||
if(!isset($dataProducts[self::TOTALS]['orders'][$productOrder['name']])) { | |||||
$dataProducts[self::TOTALS]['orders'][$productOrder['name']] = 0 ; | |||||
if (count($resOrders)) $empty = false; | |||||
foreach ($resOrders as $productOrder) { | |||||
if (!isset($dataProducts[self::TOTALS]['orders'][$productOrder['name']])) { | |||||
$dataProducts[self::TOTALS]['orders'][$productOrder['name']] = 0; | |||||
} | } | ||||
$dataProducts[self::TOTALS]['orders'][$productOrder['name']] += $productOrder['total'] ; | |||||
$dataProducts[self::TOTALS]['orders'][$productOrder['name']] += $productOrder['total']; | |||||
} | } | ||||
} | } | ||||
ksort($dataProducts) ; | |||||
$monthArray = ['Janvier','Février','Mars','Avril','Mai','Juin','Juillet','Août','Septembre','Octobre','Novembre','Décembre','Totaux'] ; | |||||
ksort($dataProducts); | |||||
$monthArray = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre', 'Totaux']; | |||||
return $this->render('products', [ | return $this->render('products', [ | ||||
'year' => $year, | 'year' => $year, | ||||
'monthArray' => $monthArray, | 'monthArray' => $monthArray, |
<?php | <?php | ||||
/** | |||||
Copyright distrib (2018) | |||||
contact@opendistrib.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
/** | |||||
* Copyright distrib (2018) | |||||
* | |||||
* contact@opendistrib.net | |||||
* | |||||
* Ce logiciel est un programme informatique servant à aider les producteurs | |||||
* à distribuer leur production en circuits courts. | |||||
* | |||||
* Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
* respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
* utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
* sur le site "http://www.cecill.info". | |||||
* | |||||
* En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
* de modification et de redistribution accordés par cette licence, il n'est | |||||
* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
* seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
* titulaire des droits patrimoniaux et les concédants successifs. | |||||
* | |||||
* A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
* associés au chargement, à l'utilisation, à la modification et/ou au | |||||
* développement et à la reproduction du logiciel par l'utilisateur étant | |||||
* donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
* manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
* avertis possédant des connaissances informatiques approfondies. Les | |||||
* utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
* logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
* sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
* | |||||
* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
* pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
* termes. | |||||
*/ | |||||
namespace backend\controllers; | namespace backend\controllers; | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
class SubscriptionController extends BackendController | |||||
class SubscriptionController extends BackendController | |||||
{ | { | ||||
var $enableCsrfValidation = false; | var $enableCsrfValidation = false; | ||||
public function behaviors() | |||||
public function behaviors() | |||||
{ | { | ||||
return [ | return [ | ||||
'access' => [ | 'access' => [ | ||||
/** | /** | ||||
* Liste les commandes récurrente du producteur. | * Liste les commandes récurrente du producteur. | ||||
* | |||||
* | |||||
* @return string | * @return string | ||||
*/ | */ | ||||
public function actionIndex() | |||||
public function actionIndex() | |||||
{ | { | ||||
$this->checkProductsPointsSale() ; | |||||
$searchModel = new SubscriptionSearch ; | |||||
$this->checkProductsPointsSale(); | |||||
$searchModel = new SubscriptionSearch; | |||||
$dataProvider = $searchModel->search(Yii::$app->request->queryParams); | $dataProvider = $searchModel->search(Yii::$app->request->queryParams); | ||||
return $this->render('index', [ | return $this->render('index', [ | ||||
'searchModel' => $searchModel, | 'searchModel' => $searchModel, | ||||
'dataProvider' => $dataProvider | 'dataProvider' => $dataProvider | ||||
/** | /** | ||||
* Crée un abonnement. | * Crée un abonnement. | ||||
* | |||||
* | |||||
* @return string | * @return string | ||||
*/ | */ | ||||
public function actionCreate($idOrder = 0) | |||||
{ | |||||
public function actionCreate($idOrder = 0) | |||||
{ | |||||
// form | // form | ||||
$model = new SubscriptionForm; | $model = new SubscriptionForm; | ||||
$model->isAdmin = true ; | |||||
$model->isAdmin = true; | |||||
$model->id_producer = GlobalParam::getCurrentProducerId(); | $model->id_producer = GlobalParam::getCurrentProducerId(); | ||||
if($idOrder) { | |||||
if ($idOrder) { | |||||
$order = Order::searchOne(['id' => $idOrder]); | $order = Order::searchOne(['id' => $idOrder]); | ||||
if ($order) { | if ($order) { | ||||
$model->id_user = $order->id_user; | $model->id_user = $order->id_user; | ||||
$model->username = $order->username; | $model->username = $order->username; | ||||
$model->id_point_sale = $order->id_point_sale; | $model->id_point_sale = $order->id_point_sale; | ||||
$model->date_begin = date('d/m/Y') ; | |||||
$dateDay = strtolower(date('l',strtotime($order->distribution->date))) ; | |||||
$model->$dateDay = 1 ; | |||||
$model->week_frequency = 1 ; | |||||
if($model->id_user && Producer::getConfig('credit')) { | |||||
$model->auto_payment = 1 ; | |||||
$model->date_begin = date('d/m/Y'); | |||||
$dateDay = strtolower(date('l', strtotime($order->distribution->date))); | |||||
$model->$dateDay = 1; | |||||
$model->week_frequency = 1; | |||||
if ($model->id_user && Producer::getConfig('credit')) { | |||||
$model->auto_payment = 1; | |||||
} | } | ||||
// produits | // produits | ||||
foreach ($order->productOrder as $productOrder) { | foreach ($order->productOrder as $productOrder) { | ||||
$model->products['product_' . $productOrder->id_product] = $productOrder->quantity; | $model->products['product_' . $productOrder->id_product] = $productOrder->quantity; | ||||
throw new NotFoundHttpException('La commande est introuvable.', 404); | throw new NotFoundHttpException('La commande est introuvable.', 404); | ||||
} | } | ||||
} | } | ||||
// produits | // produits | ||||
$productsArray = Product::searchAll([], [ | |||||
$productsArray = Product::searchAll([], [ | |||||
'orderby' => 'product.order ASC' | 'orderby' => 'product.order ASC' | ||||
]) ; | |||||
if ($model->load(Yii::$app->request->post()) && $model->validate() | |||||
&& $model->save()) | |||||
{ | |||||
]); | |||||
if ($model->load(Yii::$app->request->post()) && $model->validate() | |||||
&& $model->save()) { | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement ajouté'); | Yii::$app->getSession()->setFlash('success', 'Abonnement ajouté'); | ||||
$subscription = Subscription::findOne($model->id) ; | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions() ; | |||||
if(count($matchedDistributionsArray)) { | |||||
$subscription = Subscription::findOne($model->id); | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions(); | |||||
if (count($matchedDistributionsArray)) { | |||||
return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id]); | return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id]); | ||||
} | |||||
else { | |||||
} else { | |||||
return $this->redirect(['subscription/index']); | return $this->redirect(['subscription/index']); | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Modifie un abonnement. | * Modifie un abonnement. | ||||
* | |||||
* | |||||
* @param integer $id | * @param integer $id | ||||
* @return string | * @return string | ||||
* @throws NotFoundHttpException | * @throws NotFoundHttpException | ||||
*/ | */ | ||||
public function actionUpdate($id) | |||||
public function actionUpdate($id) | |||||
{ | { | ||||
// form | // form | ||||
$model = new SubscriptionForm; | $model = new SubscriptionForm; | ||||
$model->isAdmin = true ; | |||||
$subscription = Subscription::findOne($id); | |||||
$model->isAdmin = true; | |||||
$subscription = Subscription::findOne($id); | |||||
if ($subscription) { | if ($subscription) { | ||||
$model->id = $id; | $model->id = $id; | ||||
$model->id_producer = $subscription->id_producer; | $model->id_producer = $subscription->id_producer; | ||||
$model->date_end = date('d/m/Y', strtotime($subscription->date_end)); | $model->date_end = date('d/m/Y', strtotime($subscription->date_end)); | ||||
} | } | ||||
if(strlen($subscription->comment)) { | |||||
$model->comment = $subscription->comment ; | |||||
if (strlen($subscription->comment)) { | |||||
$model->comment = $subscription->comment; | |||||
} | } | ||||
// produits | // produits | ||||
$arrayProductsSubscription = ProductSubscription::searchAll([ | |||||
$arrayProductsSubscription = ProductSubscription::searchAll([ | |||||
'id_subscription' => $model->id | 'id_subscription' => $model->id | ||||
]) ; | |||||
]); | |||||
foreach ($arrayProductsSubscription as $productSubscription) { | foreach ($arrayProductsSubscription as $productSubscription) { | ||||
$model->products['product_' . $productSubscription->id_product] = $productSubscription->quantity; | $model->products['product_' . $productSubscription->id_product] = $productSubscription->quantity; | ||||
} | } | ||||
} | } | ||||
// produits | // produits | ||||
$productsArray = Product::searchAll([], [ | |||||
$productsArray = Product::searchAll([], [ | |||||
'orderby' => 'product.order ASC' | 'orderby' => 'product.order ASC' | ||||
]) ; | |||||
]); | |||||
if ($model->load(Yii::$app->request->post()) && $model->validate()) { | if ($model->load(Yii::$app->request->post()) && $model->validate()) { | ||||
if ($model->save()) { | if ($model->save()) { | ||||
$subscription = Subscription::findOne($model->id) ; | |||||
$subscription = Subscription::findOne($model->id); | |||||
$messageOrdersDeleted = ''; | $messageOrdersDeleted = ''; | ||||
if($model->date_end) { | |||||
if ($model->date_end) { | |||||
$countOrdersDeleted = $subscription->deleteOrdersIncomingDistributions(true); | $countOrdersDeleted = $subscription->deleteOrdersIncomingDistributions(true); | ||||
if($countOrdersDeleted) { | |||||
$messageOrdersDeleted = '<br />'.$countOrdersDeleted.' commandes supprimées'; | |||||
if ($countOrdersDeleted) { | |||||
$messageOrdersDeleted = '<br />' . $countOrdersDeleted . ' commandes supprimées'; | |||||
} | } | ||||
} | } | ||||
Yii::$app->getSession()->setFlash('success', 'Abonnement modifié'.$messageOrdersDeleted); | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement modifié' . $messageOrdersDeleted); | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions() ; | |||||
if(count($matchedDistributionsArray)) { | |||||
return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id,'update' => true]); | |||||
} | |||||
else { | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions(); | |||||
if (count($matchedDistributionsArray)) { | |||||
return $this->redirect(['subscription/update-distributions', 'idSubscription' => $subscription->id, 'update' => true]); | |||||
} else { | |||||
return $this->redirect(['subscription/index']); | return $this->redirect(['subscription/index']); | ||||
} | } | ||||
} | } | ||||
/** | /** | ||||
* Supprime une commande récurrente. | * Supprime une commande récurrente. | ||||
* | |||||
* | |||||
* @param integer $id | * @param integer $id | ||||
*/ | */ | ||||
public function actionDelete($id) | |||||
public function actionDelete($id) | |||||
{ | { | ||||
$subscription = Subscription::searchOne([ | |||||
$subscription = Subscription::searchOne([ | |||||
'subscription.id' => $id | 'subscription.id' => $id | ||||
]) ; | |||||
$subscription->deleteOrdersIncomingDistributions() ; | |||||
]); | |||||
$subscription->deleteOrdersIncomingDistributions(); | |||||
$subscription->delete(); | $subscription->delete(); | ||||
ProductSubscription::deleteAll(['id_subscription' => $id]); | |||||
ProductSubscription::deleteAll(['id_subscription' => $id]); | |||||
Yii::$app->getSession()->setFlash('success', 'Abonnement supprimé'); | Yii::$app->getSession()->setFlash('success', 'Abonnement supprimé'); | ||||
return $this->redirect(['subscription/index']); | return $this->redirect(['subscription/index']); | ||||
} | } | ||||
public function actionUpdateDistributions($idSubscription, $generate = false, $update = false) | |||||
public function actionUpdateDistributions($idSubscription, $generate = false, $update = false) | |||||
{ | { | ||||
$subscription = Subscription::findOne($idSubscription) ; | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions() ; | |||||
if($generate) { | |||||
if($update) { | |||||
$subscription->deleteOrdersIncomingDistributions() ; | |||||
$subscription = Subscription::findOne($idSubscription); | |||||
$matchedDistributionsArray = $subscription->searchMatchedIncomingDistributions(); | |||||
if ($generate) { | |||||
if ($update) { | |||||
$subscription->deleteOrdersIncomingDistributions(); | |||||
} | } | ||||
foreach($matchedDistributionsArray as $distribution) { | |||||
$subscription->add($distribution->date) ; | |||||
foreach ($matchedDistributionsArray as $distribution) { | |||||
$subscription->add($distribution->date); | |||||
} | } | ||||
Yii::$app->getSession()->setFlash('success', 'Commandes '.($update ? 're-' : '').'générées dans les distributions futures.'); | |||||
return $this->redirect(['subscription/index']) ; | |||||
Yii::$app->getSession()->setFlash('success', 'Commandes ' . ($update ? 're-' : '') . 'générées dans les distributions futures.'); | |||||
return $this->redirect(['subscription/index']); | |||||
} | } | ||||
return $this->render('update_distributions',[ | |||||
return $this->render('update_distributions', [ | |||||
'matchedDistributionsArray' => $matchedDistributionsArray, | 'matchedDistributionsArray' => $matchedDistributionsArray, | ||||
'idSubscription' => $idSubscription, | 'idSubscription' => $idSubscription, | ||||
'update' => $update | 'update' => $update | ||||
]) ; | |||||
]); | |||||
} | } | ||||
public function actionAjaxInfos($idSubscription = 0) | |||||
public function actionAjaxInfos($idSubscription = 0) | |||||
{ | { | ||||
\Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | \Yii::$app->response->format = \yii\web\Response::FORMAT_JSON; | ||||
$productsQuery = Product::find() | |||||
->where(['id_producer' => GlobalParam::getCurrentProducerId(),]) ; | |||||
if($idSubscription) { | |||||
$productsQuery->joinWith(['productSubscription' => function($query) use($idSubscription) { | |||||
$query->andOnCondition('product_subscription.id_subscription = '.((int) $idSubscription)) ; | |||||
}]) ; | |||||
$productsQuery = Product::find() | |||||
->where(['id_producer' => GlobalParam::getCurrentProducerId(),]); | |||||
if ($idSubscription) { | |||||
$productsQuery->joinWith(['productSubscription' => function ($query) use ($idSubscription) { | |||||
$query->andOnCondition('product_subscription.id_subscription = ' . ((int)$idSubscription)); | |||||
}]); | |||||
} | } | ||||
$productsArray = $productsQuery->asArray()->orderBy('order ASC')->all() ; | |||||
$productsArray = $productsQuery->asArray()->orderBy('order ASC')->all(); | |||||
/*Debug::dump($productsArray);*/ | /*Debug::dump($productsArray);*/ | ||||
foreach($productsArray as &$theProduct) { | |||||
foreach ($productsArray as &$theProduct) { | |||||
/*$theProduct['unit_save'] = $theProduct['unit'] ; | /*$theProduct['unit_save'] = $theProduct['unit'] ; | ||||
$theProduct['units'] = [] ; | $theProduct['units'] = [] ; | ||||
$theProduct['units'][] = [ | $theProduct['units'][] = [ | ||||
'price' => $theProduct['price'] | 'price' => $theProduct['price'] | ||||
] ;*/ | ] ;*/ | ||||
$theProduct['wording_unit'] = Product::strUnit($theProduct['unit'], 'wording_short'); | |||||
$theProduct['wording_unit'] = Product::strUnit($theProduct['unit'], 'wording_short'); | |||||
if(isset($theProduct['productSubscription'][0])) { | |||||
if (isset($theProduct['productSubscription'][0])) { | |||||
/*if($theProduct['productSubscription'][0]['unit'] != $theProduct['unit']) { | /*if($theProduct['productSubscription'][0]['unit'] != $theProduct['unit']) { | ||||
$theProduct['units'][] = [ | $theProduct['units'][] = [ | ||||
'unit' => $theProduct['productSubscription'][0]['unit'], | 'unit' => $theProduct['productSubscription'][0]['unit'], | ||||
$theProduct['step'] = $theProduct['productSubscription'][0]['step'] ; | $theProduct['step'] = $theProduct['productSubscription'][0]['step'] ; | ||||
$theProduct['price'] = $theProduct['productSubscription'][0]['price'] ; | $theProduct['price'] = $theProduct['productSubscription'][0]['price'] ; | ||||
}*/ | }*/ | ||||
$theProduct['quantity'] = $theProduct['productSubscription'][0]['quantity'] * Product::$unitsArray[$theProduct['unit']]['coefficient'] ; | |||||
} | |||||
else { | |||||
$theProduct['quantity'] = '' ; | |||||
$theProduct['quantity'] = $theProduct['productSubscription'][0]['quantity'] * Product::$unitsArray[$theProduct['unit']]['coefficient']; | |||||
} else { | |||||
$theProduct['quantity'] = ''; | |||||
} | } | ||||
} | } | ||||
return [ | return [ | ||||
'products' => $productsArray | 'products' => $productsArray | ||||
] ; | |||||
]; | |||||
} | } | ||||
} | } |
} | } | ||||
// product price percent | // product price percent | ||||
$userProducer = UserProducer::searchOne([ | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_producer' => GlobalParam::getCurrentProducerId(), | 'id_producer' => GlobalParam::getCurrentProducerId(), | ||||
'id_user' => $model->id | 'id_user' => $model->id | ||||
]); | ]); | ||||
->all(); | ->all(); | ||||
// groupes d'utilisateurs | // groupes d'utilisateurs | ||||
$userGroupsArray = UserGroup::find() | |||||
$userGroupsArray = UserGroup::find() | |||||
->where([ | ->where([ | ||||
'id_producer' => GlobalParam::getCurrentProducerId(), | 'id_producer' => GlobalParam::getCurrentProducerId(), | ||||
]) | ]) | ||||
$posts = Yii::$app->request->post(); | $posts = Yii::$app->request->post(); | ||||
if ($posts && isset($posts['User']['email']) && strlen($posts['User']['email']) > 0) { | if ($posts && isset($posts['User']['email']) && strlen($posts['User']['email']) > 0) { | ||||
$userExist = User::searchOne([ | |||||
$userExist = User::searchOne([ | |||||
'email' => $posts['User']['email'] | 'email' => $posts['User']['email'] | ||||
]); | ]); | ||||
} | } | ||||
// Moodification du profil | // Moodification du profil | ||||
$previousMail = $model->email; | $previousMail = $model->email; | ||||
$user = User::find()->with('userProducer')->where(['id' => $model['id']])->one(); | |||||
$userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]); | |||||
$user = User::find()->with('userProducer')->where(['id' => $model['id']])->one(); | |||||
$userBelongToProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]); | |||||
if ($userBelongToProducer) { | if ($userBelongToProducer) { | ||||
if ($model->load(Yii::$app->request->post()) && $model->save()) { | if ($model->load(Yii::$app->request->post()) && $model->save()) { | ||||
/** | /** | ||||
* Lie un utilisateur aux points de vente sélectionnés. | * Lie un utilisateur aux points de vente sélectionnés. | ||||
* | * | ||||
* @param User $modelUser | |||||
* @param User $modelUser | |||||
*/ | */ | ||||
public function processLinkPointSale($modelUser) | public function processLinkPointSale($modelUser) | ||||
{ | { | ||||
/** | /** | ||||
* Lie un utilisateur aux groupes d'utilisateurs sélectionnés. | * Lie un utilisateur aux groupes d'utilisateurs sélectionnés. | ||||
* | * | ||||
* @param User $modelUser | |||||
* @param User $modelUser | |||||
*/ | */ | ||||
public function processLinkUserGroup($modelUser) | public function processLinkUserGroup($modelUser) | ||||
{ | { | ||||
public function processProductPricePercent($model) | public function processProductPricePercent($model) | ||||
{ | { | ||||
$userProducer = UserProducer::searchOne([ | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_producer' => GlobalParam::getCurrentProducerId(), | 'id_producer' => GlobalParam::getCurrentProducerId(), | ||||
'id_user' => $model->id | 'id_user' => $model->id | ||||
]); | ]); | ||||
*/ | */ | ||||
public function actionDelete($id) | public function actionDelete($id) | ||||
{ | { | ||||
$userProducer = UserProducer::findOne([ | |||||
$userProducer = UserProducer::findOne([ | |||||
'id_user' => $id, | 'id_user' => $id, | ||||
'id_producer' => GlobalParam::getCurrentProducerId() | 'id_producer' => GlobalParam::getCurrentProducerId() | ||||
]); | ]); | ||||
$usersPointSaleLink = 1; | $usersPointSaleLink = 1; | ||||
} | } | ||||
$users = User::findBy([ | |||||
$users = User::findBy([ | |||||
'id_producer' => GlobalParam::getCurrentProducerId(), | 'id_producer' => GlobalParam::getCurrentProducerId(), | ||||
'id_point_sale' => $idPointSale, | 'id_point_sale' => $idPointSale, | ||||
'users_point_sale_link' => $usersPointSaleLink, | 'users_point_sale_link' => $usersPointSaleLink, | ||||
$bodyResponseSendMail = $responseSendMail->getBody(); | $bodyResponseSendMail = $responseSendMail->getBody(); | ||||
$emailsErrorArray = []; | $emailsErrorArray = []; | ||||
if(isset($bodyResponseSendMail['Messages'])) { | |||||
if (isset($bodyResponseSendMail['Messages'])) { | |||||
foreach ($bodyResponseSendMail['Messages'] as $message) { | foreach ($bodyResponseSendMail['Messages'] as $message) { | ||||
if ($message['Status'] != 'success') { | if ($message['Status'] != 'success') { | ||||
$emailsErrorArray[] = $message['To']['Email']; | $emailsErrorArray[] = $message['To']['Email']; | ||||
*/ | */ | ||||
public function actionCredit($id) | public function actionCredit($id) | ||||
{ | { | ||||
$user = User::find()->with('userProducer')->where(['id' => $id])->one(); | |||||
$userProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]); | |||||
$user = User::find()->with('userProducer')->where(['id' => $id])->one(); | |||||
$userProducer = UserProducer::findOne(['id_user' => $id, 'id_producer' => GlobalParam::getCurrentProducerId()]); | |||||
if (($userProducer) || User::getCurrentStatus() == User::STATUS_ADMIN) { | |||||
if (($userProducer) || User::getCurrentStatus() == User::STATUS_ADMIN) { | |||||
$creditForm = new CreditForm(); | $creditForm = new CreditForm(); | ||||
if ($creditForm->load(Yii::$app->request->post()) && $creditForm->validate()) { | if ($creditForm->load(Yii::$app->request->post()) && $creditForm->validate()) { | ||||
$creditForm = new CreditForm; | $creditForm = new CreditForm; | ||||
} | } | ||||
$history = CreditHistory::find() | |||||
$history = CreditHistory::find() | |||||
->with(['order', 'userAction']) | ->with(['order', 'userAction']) | ||||
->where([ | ->where([ | ||||
'id_user' => $user->id, | 'id_user' => $user->id, | ||||
*/ | */ | ||||
public function actionOrders($id) | public function actionOrders($id) | ||||
{ | { | ||||
$user = User::findOne($id); | |||||
$user = User::findOne($id); | |||||
$searchModel = new OrderSearch(); | $searchModel = new OrderSearch(); | ||||
$dataProvider = $searchModel->search(array_merge(Yii::$app->request->queryParams, ['id_user' => $id])); | $dataProvider = $searchModel->search(array_merge(Yii::$app->request->queryParams, ['id_user' => $id])); | ||||
*/ | */ | ||||
public function actionStateCredit($idUser, $state) | public function actionStateCredit($idUser, $state) | ||||
{ | { | ||||
$userProducer = UserProducer::searchOne([ | |||||
$userProducer = UserProducer::searchOne([ | |||||
'id_user' => $idUser | 'id_user' => $idUser | ||||
]); | ]); | ||||
*/ | */ | ||||
protected function findModel($id) | protected function findModel($id) | ||||
{ | { | ||||
if (($model = User::findOne($id)) !== null) { | |||||
if (($model = User::findOne($id)) !== null) { | |||||
return $model; | return $model; | ||||
} else { | } else { | ||||
throw new NotFoundHttpException('The requested page does not exist.'); | throw new NotFoundHttpException('The requested page does not exist.'); |
class UserGroupController extends BackendController | 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 $this->getUserManager()->hasAccessBackend(); | |||||
} | |||||
], | |||||
], | |||||
], | |||||
]; | |||||
public function behaviors() | |||||
{ | |||||
return [ | |||||
'verbs' => [ | |||||
'class' => VerbFilter::className(), | |||||
'actions' => [ | |||||
], | |||||
], | |||||
'access' => [ | |||||
'class' => AccessControl::className(), | |||||
'rules' => [ | |||||
[ | |||||
'allow' => true, | |||||
'roles' => ['@'], | |||||
'matchCallback' => function ($rule, $action) { | |||||
return $this->getUserManager()->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, | |||||
]); | |||||
} | } | ||||
/** | |||||
* 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']); | |||||
} | |||||
/** | |||||
* 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, | |||||
]); | |||||
} | } | ||||
/** | |||||
* 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.'); | |||||
} | |||||
} | |||||
/** | |||||
* 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.'); | |||||
} | } | ||||
} | |||||
} | } |
use yii\widgets\Breadcrumbs; | use yii\widgets\Breadcrumbs; | ||||
use dmstr\widgets\Alert; | use dmstr\widgets\Alert; | ||||
use common\helpers\GlobalParam; | |||||
$producerManager = $this->getProducerManager(); | |||||
?> | ?> | ||||
<div class="content-wrapper"> | <div class="content-wrapper"> | ||||
<section class="content"> | <section class="content"> | ||||
<?php $producer = GlobalParam::getCurrentProducer(); ?> | <?php $producer = GlobalParam::getCurrentProducer(); ?> | ||||
<?php if(!$producer->isUpToDateWithOpendistribVersion() && $producer->option_display_message_new_opendistrib_version): ?> | |||||
<?php if(!$producerManager->isUpToDateWithOpendistribVersion($producer) && $producer->option_display_message_new_opendistrib_version): ?> | |||||
<div class="alert alert-warning"> | <div class="alert alert-warning"> | ||||
<p>Opendistrib a été mis à jour vers la version <?= GlobalParam::getOpendistribVersion() ?> ! <a class="alert-link" href="<?= Yii::$app->urlManager->createUrl(['development/index']) ?>">Découvrir les nouveautés</a></p> | <p>Opendistrib a été mis à jour vers la version <?= GlobalParam::getOpendistribVersion() ?> ! <a class="alert-link" href="<?= Yii::$app->urlManager->createUrl(['development/index']) ?>">Découvrir les nouveautés</a></p> | ||||
<a href="<?= Yii::$app->urlManager->createUrl(['producer/update-opendistrib-version']) ?>" class="close"><span aria-hidden="true">×</span></a> | <a href="<?= Yii::$app->urlManager->createUrl(['producer/update-opendistrib-version']) ?>" class="close"><span aria-hidden="true">×</span></a> |
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use common\helpers\GlobalParam; | use common\helpers\GlobalParam; | ||||
/* @var $this \yii\web\View */ | |||||
/* @var $content string */ | |||||
use common\logic\Distribution\Distribution\Distribution; | |||||
use common\logic\Producer\Producer\Producer; | |||||
use common\logic\User\User\User; | |||||
$userManager = $this->getUserManager(); | |||||
$producerManager = $this->getProducerManager(); | |||||
$producer = GlobalParam::getCurrentProducer(); | $producer = GlobalParam::getCurrentProducer(); | ||||
?> | ?> | ||||
<div class="navbar-custom-menu"> | <div class="navbar-custom-menu"> | ||||
<?php | <?php | ||||
$usersArray = User::findBy(['id_producer' => GlobalParam::getCurrentProducerId()]) | |||||
$usersArray = $userManager->queryUsersBy(['id_producer' => GlobalParam::getCurrentProducerId()]) | |||||
->andWhere('CAST(FROM_UNIXTIME(user.created_at) AS date) > \'' . date("Y-m-d", strtotime("-7 days")) . '\'') | ->andWhere('CAST(FROM_UNIXTIME(user.created_at) AS date) > \'' . date("Y-m-d", strtotime("-7 days")) . '\'') | ||||
->orderBy('created_at DESC') | ->orderBy('created_at DESC') | ||||
->all(); | ->all(); | ||||
<?php | <?php | ||||
$pastDistributionsArray = DistributionModel::find() | |||||
$pastDistributionsArray = Distribution::find() | |||||
->where(['<', 'distribution.date', date('Y-m-d')]) | ->where(['<', 'distribution.date', date('Y-m-d')]) | ||||
->andWhere([ | ->andWhere([ | ||||
'distribution.id_producer' => GlobalParam::getCurrentProducerId(), | 'distribution.id_producer' => GlobalParam::getCurrentProducerId(), | ||||
$pastDistributionsArray = array_reverse($pastDistributionsArray); | $pastDistributionsArray = array_reverse($pastDistributionsArray); | ||||
$incomingDistributionsArray = DistributionModel::find() | |||||
$incomingDistributionsArray = Distribution::find() | |||||
->where(['>=', 'distribution.date', date('Y-m-d')]) | ->where(['>=', 'distribution.date', date('Y-m-d')]) | ||||
->andWhere([ | ->andWhere([ | ||||
'distribution.id_producer' => GlobalParam::getCurrentProducerId(), | 'distribution.id_producer' => GlobalParam::getCurrentProducerId(), | ||||
<?php | <?php | ||||
$usersNegativeCreditArray = User::findBy(['id_producer' => GlobalParam::getCurrentProducerId()]) | |||||
$usersNegativeCreditArray = $userManager->queryUsersBy(['id_producer' => GlobalParam::getCurrentProducerId()]) | |||||
->andWhere('user_producer.credit < 0') | ->andWhere('user_producer.credit < 0') | ||||
->orderBy('lastname, name ASC') | ->orderBy('lastname, name ASC') | ||||
->all(); | ->all(); | ||||
<?php foreach ($usersNegativeCreditArray as $user): ?> | <?php foreach ($usersNegativeCreditArray as $user): ?> | ||||
<li> | <li> | ||||
<a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/credit', 'id' => $user['user_id']]); ?>"> | <a href="<?= Yii::$app->urlManagerBackend->createUrl(['user/credit', 'id' => $user['user_id']]); ?>"> | ||||
<h5><?= User::getUsernameFromArray($user); ?> | |||||
<h5><?= $userManager->getUsernameFromArray($user); ?> | |||||
<small> | <small> | ||||
<i class="fa fa-euro"></i> <?= Price::format($user['credit']); ?> | <i class="fa fa-euro"></i> <?= Price::format($user['credit']); ?> | ||||
</small> | </small> | ||||
</li> | </li> | ||||
<?php if ( User::isCurrentProducer() || User::isCurrentAdmin()): ?> | |||||
<?php if ( $userManager->isCurrentProducer() || $userManager->isCurrentAdmin()): ?> | |||||
<li class="dropdown producer-menu"> | <li class="dropdown producer-menu"> | ||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | <a href="#" class="dropdown-toggle" data-toggle="dropdown"> | ||||
<?php else: ?> | <?php else: ?> | ||||
<span class="label label-danger">Hors-ligne</span> | <span class="label label-danger">Hors-ligne</span> | ||||
<?php endif; ?> | <?php endif; ?> | ||||
<span><?= Html::encode(Yii::$app->user->identity->getNameProducer()); ?></span> | |||||
<span><?= Html::encode($producerManager->getNameProducer(Yii::$app->user->identity)); ?></span> | |||||
<i class="fa fa-caret-down"></i> | <i class="fa fa-caret-down"></i> | ||||
</a> | </a> | ||||
<ul class="dropdown-menu"> | <ul class="dropdown-menu"> | ||||
<?php if ( User::isCurrentAdmin()): ?> | |||||
<?php if ( $userManager->isCurrentAdmin()): ?> | |||||
<li> | <li> | ||||
<a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => GlobalParam::getCurrentProducer()->slug]); ?>"> | <a href="<?= Yii::$app->urlManagerProducer->createAbsoluteUrl(['site/index', 'slug_producer' => GlobalParam::getCurrentProducer()->slug]); ?>"> | ||||
<i class="fa fa-th-large"></i> | <i class="fa fa-th-large"></i> | ||||
<li class="dropdown user user-menu"> | <li class="dropdown user user-menu"> | ||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> | <a href="#" class="dropdown-toggle" data-toggle="dropdown"> | ||||
<i class="fa fa-user"></i> | <i class="fa fa-user"></i> | ||||
<span class="hidden-xs"><?= Html::encode( User::getCurrent()->name . ' ' . User::getCurrent()->lastname); ?></span> | |||||
<span class="hidden-xs"><?= Html::encode( GlobalParam::getCurrentUser()->name . ' ' . GlobalParam::getCurrentUser()->lastname); ?></span> | |||||
<i class="fa fa-caret-down"></i> | <i class="fa fa-caret-down"></i> | ||||
</a> | </a> | ||||
<ul class="dropdown-menu"> | <ul class="dropdown-menu"> | ||||
class="fa fa-sign-out"></i> Déconnexion</a></li> | class="fa fa-sign-out"></i> Déconnexion</a></li> | ||||
</ul> | </ul> | ||||
</li> | </li> | ||||
<li class="link-control-sidebar"> | <li class="link-control-sidebar"> | ||||
<a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> | <a href="#" data-toggle="control-sidebar"><i class="fa fa-gears"></i></a> | ||||
</li> | </li> | ||||
</ul> | </ul> | ||||
</div> | </div> | ||||
</nav> | </nav> |
* termes. | * termes. | ||||
*/ | */ | ||||
use common\helpers\GlobalParam; | |||||
$producerManager = $this->getProducerManager(); | |||||
$userManager = $this->getUserManager(); | |||||
?> | ?> | ||||
<aside class="main-sidebar"> | <aside class="main-sidebar"> | ||||
<?php | <?php | ||||
$producer = GlobalParam::getCurrentProducer(); | $producer = GlobalParam::getCurrentProducer(); | ||||
$newVersionOpendistribTemplate = ''; | $newVersionOpendistribTemplate = ''; | ||||
if(!$producer->isUpToDateWithOpendistribVersion()) { | |||||
if(!$producerManager->isUpToDateWithOpendistribVersion($producer)) { | |||||
$newVersionOpendistribTemplate = '<span class="pull-right-container"><small class="label pull-right bg-orange"> </small></span>'; | $newVersionOpendistribTemplate = '<span class="pull-right-container"><small class="label pull-right bg-orange"> </small></span>'; | ||||
} | } | ||||
?> | ?> | ||||
[ | [ | ||||
'options' => ['class' => 'sidebar-menu tree', 'data-widget' => 'tree'], | 'options' => ['class' => 'sidebar-menu tree', 'data-widget' => 'tree'], | ||||
'items' => [ | 'items' => [ | ||||
['label' => 'Tableau de bord', 'icon' => 'dashboard', 'url' => ['/site/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Distributions', 'icon' => 'calendar', 'url' => ['/distribution/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Tableau de bord', 'icon' => 'dashboard', 'url' => ['/site/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
['label' => 'Distributions', 'icon' => 'calendar', 'url' => ['/distribution/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
[ | [ | ||||
'label' => 'Produits', | 'label' => 'Produits', | ||||
'icon' => 'clone', | 'icon' => 'clone', | ||||
'url' => ['/product/index'], | 'url' => ['/product/index'], | ||||
'visible' => User::isCurrentProducer(), | |||||
'visible' => $userManager->isCurrentProducer(), | |||||
'active' => Yii::$app->controller->id == 'product', | 'active' => Yii::$app->controller->id == 'product', | ||||
'items' => [ | 'items' => [ | ||||
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/product/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Catégories', 'icon' => 'book', 'url' => ['/product-category/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/product/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
['label' => 'Catégories', 'icon' => 'book', 'url' => ['/product-category/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
] | ] | ||||
], | ], | ||||
['label' => 'Points de vente', 'icon' => 'map-marker', 'url' => ['/point-sale/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'point-sale'], | |||||
['label' => 'Points de vente', 'icon' => 'map-marker', 'url' => ['/point-sale/index'], 'visible' => $userManager->isCurrentProducer(), 'active' => Yii::$app->controller->id == 'point-sale'], | |||||
[ | [ | ||||
'label' => 'Utilisateurs', | 'label' => 'Utilisateurs', | ||||
'icon' => 'users', | 'icon' => 'users', | ||||
'url' => ['/user/index'], | 'url' => ['/user/index'], | ||||
'items' => [ | 'items' => [ | ||||
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/user/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Groupes', 'icon' => 'users', 'url' => ['/user-group/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Liste', 'icon' => 'th-list', 'url' => ['/user/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
['label' => 'Groupes', 'icon' => 'users', 'url' => ['/user-group/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
], | ], | ||||
], | ], | ||||
['label' => 'Abonnements', 'icon' => 'repeat', 'url' => ['/subscription/index'], 'visible' => User::isCurrentProducer(), 'active' => Yii::$app->controller->id == 'subscription'], | |||||
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Abonnements', 'icon' => 'repeat', 'url' => ['/subscription/index'], 'visible' => $userManager->isCurrentProducer(), 'active' => Yii::$app->controller->id == 'subscription'], | |||||
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
[ | [ | ||||
'label' => 'Documents', | 'label' => 'Documents', | ||||
'icon' => 'clone', | 'icon' => 'clone', | ||||
'url' => ['/delivery-note/index'], | 'url' => ['/delivery-note/index'], | ||||
'items' => [ | 'items' => [ | ||||
['label' => 'Bons de livraison', 'icon' => 'sticky-note-o', 'url' => ['/delivery-note/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Factures', 'icon' => 'sticky-note-o', 'url' => ['/invoice/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Devis', 'icon' => 'sticky-note-o', 'url' => ['/quotation/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Bons de livraison', 'icon' => 'sticky-note-o', 'url' => ['/delivery-note/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
['label' => 'Factures', 'icon' => 'sticky-note-o', 'url' => ['/invoice/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
['label' => 'Devis', 'icon' => 'sticky-note-o', 'url' => ['/quotation/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
], | ], | ||||
], | ], | ||||
[ | [ | ||||
'icon' => 'line-chart', | 'icon' => 'line-chart', | ||||
'url' => ['/stats/index'], | 'url' => ['/stats/index'], | ||||
'items' => [ | 'items' => [ | ||||
['label' => 'Chiffre d\'affaire', 'icon' => 'line-chart', 'url' => ['/stats/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Rapports', 'icon' => 'pencil-square-o', 'url' => ['/report/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Produits', 'icon' => 'table', 'url' => ['/stats/products'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Chiffre d\'affaire', 'icon' => 'line-chart', 'url' => ['/stats/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
['label' => 'Rapports', 'icon' => 'pencil-square-o', 'url' => ['/report/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
['label' => 'Produits', 'icon' => 'table', 'url' => ['/stats/products'], 'visible' => $userManager->isCurrentProducer()], | |||||
], | ], | ||||
], | ], | ||||
['label' => 'Paramètres', 'icon' => 'cog', 'url' => ['/producer/update'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Accès', 'icon' => 'lock', 'url' => ['/access/index'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Paramètres', 'icon' => 'cog', 'url' => ['/producer/update'], 'visible' => $userManager->isCurrentProducer()], | |||||
['label' => 'Accès', 'icon' => 'lock', 'url' => ['/access/index'], 'visible' => $userManager->isCurrentProducer()], | |||||
[ | [ | ||||
'label' => 'Développement', | 'label' => 'Développement', | ||||
'icon' => 'code', | 'icon' => 'code', | ||||
'url' => ['/development/index'], | 'url' => ['/development/index'], | ||||
'visible' => User::isCurrentProducer(), | |||||
'visible' => $userManager->isCurrentProducer(), | |||||
'active' => Yii::$app->controller->id == 'development', | 'active' => Yii::$app->controller->id == 'development', | ||||
'template'=>'<a href="{url}">{icon} {label}'.$newVersionOpendistribTemplate.'</a>' | 'template'=>'<a href="{url}">{icon} {label}'.$newVersionOpendistribTemplate.'</a>' | ||||
], | ], | ||||
['label' => 'Tarifs', 'icon' => 'euro', 'url' => ['/producer/billing'], 'visible' => User::isCurrentProducer()], | |||||
['label' => 'Tarifs', 'icon' => 'euro', 'url' => ['/producer/billing'], 'visible' => $userManager->isCurrentProducer()], | |||||
['label' => 'Administration', 'options' => ['class' => 'header'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Producteurs', 'icon' => 'th-list', 'url' => ['/producer-admin/index'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Tranches de prix', 'icon' => 'eur', 'url' => ['/producer-price-range-admin/index'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Taxes', 'icon' => 'eur', 'url' => ['/tax-rate-admin/index'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate-admin/index'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Administration', 'options' => ['class' => 'header'], 'visible' => $userManager->isCurrentAdmin()], | |||||
['label' => 'Producteurs', 'icon' => 'th-list', 'url' => ['/producer-admin/index'], 'visible' => $userManager->isCurrentAdmin()], | |||||
['label' => 'Tranches de prix', 'icon' => 'eur', 'url' => ['/producer-price-range-admin/index'], 'visible' => $userManager->isCurrentAdmin()], | |||||
['label' => 'Taxes', 'icon' => 'eur', 'url' => ['/tax-rate-admin/index'], 'visible' => $userManager->isCurrentAdmin()], | |||||
['label' => 'Communiquer', 'icon' => 'bullhorn', 'url' => ['/communicate-admin/index'], 'visible' => $userManager->isCurrentAdmin()], | |||||
['label' => 'Outils', 'options' => ['class' => 'header'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Gii', 'icon' => 'file-code-o', 'url' => ['/gii'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Debug', 'icon' => 'dashboard', 'url' => ['/debug'], 'visible' => User::isCurrentAdmin()], | |||||
['label' => 'Login', 'url' => ['site/login'], 'visible' => ! User::isCurrentConnected()], | |||||
['label' => 'Outils', 'options' => ['class' => 'header'], 'visible' => $userManager->isCurrentAdmin()], | |||||
['label' => 'Gii', 'icon' => 'file-code-o', 'url' => ['/gii'], 'visible' => $userManager->isCurrentAdmin()], | |||||
['label' => 'Debug', 'icon' => 'dashboard', 'url' => ['/debug'], 'visible' => $userManager->isCurrentAdmin()], | |||||
['label' => 'Login', 'url' => ['site/login'], 'visible' => ! $userManager->isCurrentConnected()], | |||||
], | ], | ||||
] | ] | ||||
) ?> | ) ?> |
public function getNameProducer(User $user): string | public function getNameProducer(User $user): string | ||||
{ | { | ||||
$producer = $this->findOneProducerById($user->id_producer); | $producer = $this->findOneProducerById($user->id_producer); | ||||
return $producer->getName(); | |||||
return $producer->name; | |||||
} | } | ||||
public function isDocumentDisplayOrders(DocumentInterface $document): bool | public function isDocumentDisplayOrders(DocumentInterface $document): bool |