@@ -82,7 +82,7 @@ class DistributionController extends BackendController | |||
]; | |||
} | |||
public function actionIndex($date = '') | |||
public function actionIndex($date = '', $idOrderUpdate = 0) | |||
{ | |||
$this->checkProductsPointsSale(); | |||
@@ -94,8 +94,14 @@ class DistributionController extends BackendController | |||
$theDate = $date; | |||
} | |||
$orderUpdate = null; | |||
if($idOrderUpdate) { | |||
$orderUpdate = Order::searchOne(['id' => $idOrderUpdate]); | |||
} | |||
return $this->render('index', [ | |||
'date' => $theDate | |||
'date' => $theDate, | |||
'orderUpdate' => $orderUpdate | |||
]); | |||
} | |||
@@ -43,6 +43,20 @@ $this->setTitle('Distributions') ; | |||
$this->setPageTitle('Distributions') ; | |||
?> | |||
<?php if($orderUpdate): | |||
$orderUpdateDistributionTimestamp = strtotime($orderUpdate->distribution->date); | |||
?> | |||
<script> | |||
window.vueValues = { | |||
date: new Date(<?= date('Y', $orderUpdateDistributionTimestamp) ?>, <?= date('m', $orderUpdateDistributionTimestamp) - 1 ?>, <?= date('d', $orderUpdateDistributionTimestamp) ?>), | |||
dateFormat: '<?= date('d/m/Y', $orderUpdateDistributionTimestamp) ?>', | |||
showModalFormOrderUpdate: true, | |||
idOrderUpdate: <?= $orderUpdate->id ?> | |||
}; | |||
</script> | |||
<?php endif; ?> | |||
<div id="app-distribution-index" class="app-vuejs"> | |||
<?php if(strlen($date)): ?> | |||
<span id="distribution-date"><?= $date; ?></span> | |||
@@ -397,6 +411,7 @@ $this->setPageTitle('Distributions') ; | |||
<order-form | |||
v-if="showModalFormOrderUpdate && idOrderUpdate == order.id" | |||
:date="date" | |||
:date-format="dateFormat" | |||
:id-point-sale="idActivePointSale" | |||
:points-sale="pointsSale" | |||
:means-payment="meansPayment" | |||
@@ -550,7 +565,11 @@ $this->setPageTitle('Distributions') ; | |||
<!-- template for the order-form component --> | |||
<script type="text/x-template" id="order-form-template"> | |||
<modal class="modal-form-order" @close="$emit('close')"> | |||
<h3 slot="header">Ajouter une commande</h3> | |||
<h3 v-if="order.id" slot="header"> | |||
<template v-if="order.id">Modifier</template> | |||
<template v-else>Ajouter</template> | |||
une commande - {{ dateFormat }} | |||
</h3> | |||
<div slot="body"> | |||
<div class="callout callout-warning" v-if="errors.length"> | |||
<ul> |
@@ -69,7 +69,7 @@ if (Yii::$app->controller->action->id === 'login') { | |||
<meta name="baseurl" content="<?= Yii::$app->urlManagerBackend->baseUrl ; ?>"> | |||
<meta name="baseurl-absolute" content="<?= Yii::$app->urlManagerBackend->getHostInfo().Yii::$app->urlManagerBackend->baseUrl; ?>"> | |||
<?= Html::csrfMetaTags() ?> | |||
<title><?= Html::encode($this->title) ?> | distrib</title> | |||
<title><?= Html::encode($this->page_title) ?> | Opendistrib</title> | |||
<link rel="icon" type="image/png" href="<?php echo Yii::$app->urlManagerBackend->getBaseUrl(); ?>/img/favicon-distrib.png" /> | |||
<?php $this->head() ?> | |||
</head> |
@@ -1,79 +1,105 @@ | |||
<?php | |||
/** | |||
Copyright distrib (2018) | |||
/** | |||
* 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. | |||
*/ | |||
contact@opendistrib.net | |||
use yii\grid\GridView; | |||
Ce logiciel est un programme informatique servant à aider les producteurs | |||
à distribuer leur production en circuits courts. | |||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||
sur le site "http://www.cecill.info". | |||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||
de modification et de redistribution accordés par cette licence, il n'est | |||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||
titulaire des droits patrimoniaux et les concédants successifs. | |||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||
associés au chargement, à l'utilisation, à la modification et/ou au | |||
développement et à la reproduction du logiciel par l'utilisateur étant | |||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||
avertis possédant des connaissances informatiques approfondies. Les | |||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||
termes. | |||
*/ | |||
use yii\helpers\Html; | |||
use yii\widgets\ActiveForm; | |||
use common\models\CreditHistory; | |||
use common\models\Producer; | |||
use common\models\Order; | |||
$this->setTitle('Commandes <small>'.Html::encode($user->lastname.' '.$user->name).'</small>', 'Commandes de '.Html::encode($user->lastname.' '.$user->name)) ; | |||
$this->addBreadcrumb(['label' => 'Utilisateurs', 'url' => ['index']]) ; | |||
$this->addBreadcrumb(['label' => Html::encode($user->lastname.' '.$user->name)]) ; | |||
$this->addBreadcrumb('Commandes') ; | |||
$this->setTitle('Commandes <small>' . Html::encode($user->getUsername()) . '</small>', 'Commandes de ' . Html::encode($user->getUsername())); | |||
$this->addBreadcrumb(['label' => 'Utilisateurs', 'url' => ['index']]); | |||
$this->addBreadcrumb(['label' => Html::encode($user->lastname . ' ' . $user->name)]); | |||
$this->addBreadcrumb('Commandes'); | |||
?> | |||
<div class="user-orders"> | |||
<?php if(count($ordersArray)): ?> | |||
<table id="historique-commandes" class="table table-striped table-bordered"> | |||
<thead> | |||
<tr> | |||
<th>Date livraison</th> | |||
<th>Historique</th> | |||
<th>Résumé</th> | |||
<th>Point de vente</th> | |||
<th class="montant">Montant</th> | |||
</tr> | |||
</thead> | |||
<tbody> | |||
<?php foreach($ordersArray as $order): ?> | |||
<tr class="<?= $order->getClassHistory() ; ?>"> | |||
<td><?php echo date('d/m/Y',strtotime($order->distribution->date)); ?></td> | |||
<td class="historique"><?= $order->getStrHistory() ; ?></td> | |||
<td class="resume"><?= $order->getCartSummary() ; ?></td> | |||
<td><?= $order->getPointSaleSummary(); ?></td> | |||
<td class="montant"><?= $order->getAmountSummary(); ?></td> | |||
</tr> | |||
<?php endforeach; ?> | |||
</tbody> | |||
</table> | |||
<?php else: ?> | |||
<div class="alert alert-warning">Aucune commande passée par ce client.</div> | |||
<?php endif; ?> | |||
<?= GridView::widget([ | |||
'filterModel' => $searchModel, | |||
'dataProvider' => $dataProvider, | |||
'columns' => [ | |||
[ | |||
'attribute' => 'distribution.date', | |||
'label' => 'Date de livraison', | |||
'value' => function ($model) { | |||
return date('d/m/Y',strtotime($model->distribution->date)); | |||
} | |||
], | |||
[ | |||
'label' => 'Historique', | |||
'format' => 'raw', | |||
'value' => function ($model) { | |||
return $model->getStrHistory(); | |||
} | |||
], | |||
[ | |||
'label' => 'Résumé', | |||
'format' => 'raw', | |||
'value' => function ($model) { | |||
return $model->getCartSummary(); | |||
} | |||
], | |||
[ | |||
'label' => 'Point de vente', | |||
'format' => 'raw', | |||
'value' => function ($model) { | |||
return $model->getPointSaleSummary(); | |||
} | |||
], | |||
[ | |||
'label' => 'Montant', | |||
'format' => 'raw', | |||
'value' => function ($model) { | |||
$model->init(); | |||
return $model->getAmountSummary(); | |||
} | |||
], | |||
[ | |||
'class' => 'yii\grid\ActionColumn', | |||
'template' => '{update}', | |||
'headerOptions' => ['class' => 'column-actions'], | |||
'contentOptions' => ['class' => 'column-actions'], | |||
'buttons' => [ | |||
'update' => function ($url, $model) { | |||
$url = Yii::$app->urlManager->createUrl(['distribution/index', 'idOrderUpdate' => $model->id]); | |||
return Html::a('<span class="glyphicon glyphicon-pencil"></span>', $url, [ | |||
'title' => Yii::t('app', 'Modifier'), 'class' => 'btn btn-default' | |||
]); | |||
}, | |||
], | |||
] | |||
], | |||
]); ?> | |||
</div> |
@@ -37,90 +37,95 @@ termes. | |||
var app = new Vue({ | |||
el: '#app-distribution-index', | |||
data: { | |||
UrlManager: UrlManager, | |||
baseUrl: $('meta[name=baseurl]').attr('content'), | |||
date: null, | |||
dateFormat: null, | |||
loading: true, | |||
distribution: { | |||
active: false, | |||
}, | |||
producer: null, | |||
oneDistributionWeekActive: false, | |||
products: [], | |||
countActiveProducts: 0, | |||
pointsSale: [], | |||
meansPayment: [], | |||
idActivePointSale: 0, | |||
idDefaultPointSale: 0, | |||
countActivePointsSale: 0, | |||
countOrdersByPointSale: [], | |||
orders: [], | |||
ordersUpdate: [], | |||
countOrders: 0, | |||
users: [], | |||
deliveryNotes: [], | |||
showModalProducts: false, | |||
showModalPointsSale: false, | |||
showModalFormOrderCreate: false, | |||
orderCreate: null, | |||
showModalFormOrderUpdate: false, | |||
idOrderUpdate: 0, | |||
showViewProduct: false, | |||
idOrderView: 0, | |||
showModalPayment: false, | |||
idOrderPayment: 0, | |||
showLoading: false, | |||
tillerIsSynchro: false, | |||
checkboxSelectAllOrders: false, | |||
messageGenerateDeliveryNoteDisplayed: false, | |||
missingSubscriptions: false, | |||
loadingUpdateProductOrder: false, | |||
calendar: { | |||
mode: 'single', | |||
attrs: [], | |||
themeStyles: { | |||
wrapper: { | |||
background: '#F7F7F7', | |||
color: '#333', | |||
border: 'solid 1px #e0e0e0' | |||
}, | |||
header: { | |||
padding: '10px 10px', | |||
}, | |||
headerHorizontalDivider: { | |||
borderTop: 'solid rgba(255, 255, 255, 0.2) 1px', | |||
width: '80%', | |||
}, | |||
weekdays: { | |||
color: '#e0e0e0', | |||
fontWeight: '600', | |||
padding: '10px 10px', | |||
fontSize: '2rem' | |||
}, | |||
weeks: { | |||
padding: '0 15px 15px 15px', | |||
data() { | |||
return Object.assign( | |||
{ | |||
UrlManager: UrlManager, | |||
baseUrl: $('meta[name=baseurl]').attr('content'), | |||
date: null, | |||
dateFormat: null, | |||
loading: true, | |||
distribution: { | |||
active: false, | |||
}, | |||
dayContent: function(object) { | |||
var style = { | |||
fontSize: '2rem', | |||
padding: '16px', | |||
}; | |||
if(object.isHovered || object.isFocus) { | |||
style.backgroundColor = '#F39C12' ; | |||
producer: null, | |||
oneDistributionWeekActive: false, | |||
products: [], | |||
countActiveProducts: 0, | |||
pointsSale: [], | |||
meansPayment: [], | |||
idActivePointSale: 0, | |||
idDefaultPointSale: 0, | |||
countActivePointsSale: 0, | |||
countOrdersByPointSale: [], | |||
orders: [], | |||
ordersUpdate: [], | |||
countOrders: 0, | |||
users: [], | |||
deliveryNotes: [], | |||
showModalProducts: false, | |||
showModalPointsSale: false, | |||
showModalFormOrderCreate: false, | |||
orderCreate: null, | |||
showModalFormOrderUpdate: false, | |||
idOrderUpdate: 0, | |||
showViewProduct: false, | |||
idOrderView: 0, | |||
showModalPayment: false, | |||
idOrderPayment: 0, | |||
showLoading: false, | |||
tillerIsSynchro: false, | |||
checkboxSelectAllOrders: false, | |||
messageGenerateDeliveryNoteDisplayed: false, | |||
missingSubscriptions: false, | |||
loadingUpdateProductOrder: false, | |||
calendar: { | |||
mode: 'single', | |||
attrs: [], | |||
themeStyles: { | |||
wrapper: { | |||
background: '#F7F7F7', | |||
color: '#333', | |||
border: 'solid 1px #e0e0e0' | |||
}, | |||
header: { | |||
padding: '10px 10px', | |||
}, | |||
headerHorizontalDivider: { | |||
borderTop: 'solid rgba(255, 255, 255, 0.2) 1px', | |||
width: '80%', | |||
}, | |||
weekdays: { | |||
color: '#e0e0e0', | |||
fontWeight: '600', | |||
padding: '10px 10px', | |||
fontSize: '2rem' | |||
}, | |||
weeks: { | |||
padding: '0 15px 15px 15px', | |||
}, | |||
dayContent: function(object) { | |||
var style = { | |||
fontSize: '2rem', | |||
padding: '16px', | |||
}; | |||
if(object.isHovered || object.isFocus) { | |||
style.backgroundColor = '#F39C12' ; | |||
} | |||
return style ; | |||
}, | |||
}, | |||
formats: { | |||
dayPopover: 'DD/MM/YYYY' | |||
} | |||
return style ; | |||
}, | |||
}, | |||
formats: { | |||
dayPopover: 'DD/MM/YYYY' | |||
} | |||
}, | |||
, window.vueValues); | |||
}, | |||
mounted: function() { | |||
if($('#distribution-date').size()) { | |||
this.date = new Date($('#distribution-date').html()) ; | |||
@@ -128,7 +133,6 @@ var app = new Vue({ | |||
+ ('0' + (this.date.getMonth() +1)).slice(-2) + '/' | |||
+ this.date.getFullYear() ; | |||
} | |||
this.init() ; | |||
this.loading = false ; | |||
}, | |||
@@ -220,6 +224,10 @@ var app = new Vue({ | |||
appAlerts.alert('info','Pour générer un bon de livraison, sélectionnez tout d\'abord un jour et un lieu de distribution.', 6000) ; | |||
app.messageGenerateDeliveryNoteDisplayed = true ; | |||
} | |||
if(app.idOrderUpdate) { | |||
app.updateOrderFromUrl(); | |||
} | |||
}) ; | |||
}, | |||
initCountActiveProducts: function() { | |||
@@ -360,6 +368,10 @@ var app = new Vue({ | |||
app.init(app.idActivePointSale) ; | |||
}) ; | |||
}, | |||
updateOrderFromUrl: function() { | |||
this.initModalFormOrder() ; | |||
this.updateProductOrderPrices(false); | |||
}, | |||
updateOrderClick: function(event) { | |||
var idOrder = event.currentTarget.getAttribute('data-id-order') ; | |||
this.idOrderUpdate = idOrder ; | |||
@@ -661,7 +673,7 @@ Vue.component('modal', { | |||
}) | |||
Vue.component('order-form',{ | |||
props: ['date', 'pointsSale','meansPayment', 'users', 'products', 'order', 'producer', 'loadingUpdateProductOrder'], | |||
props: ['date', 'dateFormat', 'pointsSale','meansPayment', 'users', 'products', 'order', 'producer', 'loadingUpdateProductOrder'], | |||
emits: ['updateProductPrice'], | |||
data: function() { | |||
return { |
@@ -42,174 +42,189 @@ use common\helpers\GlobalParam; | |||
class ActiveRecordCommon extends \yii\db\ActiveRecord | |||
{ | |||
const SEARCH_ALL = 'all'; | |||
const SEARCH_ONE = 'one'; | |||
const SEARCH_COUNT = 'count'; | |||
/** | |||
* Méthode générique de recherche utilisée pour tous les modèles. Elle a | |||
* pour but de construire la requête et de retourner le résultat. | |||
* | |||
* @param array $params | |||
* @param array $options | |||
* @return mixed | |||
* @throws NotFoundHttpException | |||
*/ | |||
public static function searchBy($params = [], $options = []) | |||
{ | |||
$class = get_called_class(); | |||
if (is_callable([$class, 'defaultOptionsSearch'])) { | |||
$default_options = $class::defaultOptionsSearch(); | |||
} else { | |||
throw new \ErrorException('La méthode "defaultOptionsSearch" n\'est ' | |||
. 'pas définie dans la classe "' . $class . '"'); | |||
} | |||
$options = array_merge($default_options, $options); | |||
$pk = $class::primaryKey(); | |||
$pk = $class::tableName() . '.' . $pk[0]; | |||
const SEARCH_QUERY = 'query'; | |||
const SEARCH_ALL = 'all'; | |||
const SEARCH_ONE = 'one'; | |||
const SEARCH_COUNT = 'count'; | |||
/** | |||
* Méthode générique de recherche utilisée pour tous les modèles. Elle a | |||
* pour but de construire la requête et de retourner le résultat. | |||
* | |||
* @param array $params | |||
* @param array $options | |||
* @return mixed | |||
* @throws NotFoundHttpException | |||
*/ | |||
public static function searchBy($params = [], $options = []) | |||
{ | |||
$class = get_called_class(); | |||
if (is_callable([$class, 'defaultOptionsSearch'])) { | |||
$default_options = $class::defaultOptionsSearch(); | |||
} else { | |||
throw new \ErrorException('La méthode "defaultOptionsSearch" n\'est ' | |||
. 'pas définie dans la classe "' . $class . '"'); | |||
} | |||
if (isset($options['attribute_id_producer']) && strlen($options['attribute_id_producer']) | |||
&& !isset($params[$options['attribute_id_producer']]) && !Yii::$app->user->isGuest) { | |||
$params[$options['attribute_id_producer']] = GlobalParam::getCurrentProducerId(); | |||
} | |||
$options = array_merge($default_options, $options); | |||
if (!isset($options['type_search'])) { | |||
$options['type_search'] = self::SEARCH_ALL; | |||
} | |||
$pk = $class::primaryKey(); | |||
$pk = $class::tableName() . '.' . $pk[0]; | |||
$records = $class::find(); | |||
// With | |||
if (is_array($options['with']) && count($options['with'])) { | |||
$records = $records->with($options['with']); | |||
} | |||
if (isset($options['attribute_id_producer']) && strlen($options['attribute_id_producer']) | |||
&& !isset($params[$options['attribute_id_producer']]) && !Yii::$app->user->isGuest) { | |||
$params[$options['attribute_id_producer']] = GlobalParam::getCurrentProducerId(); | |||
} | |||
// Join with | |||
if (is_array($options['join_with']) && count($options['join_with'])) { | |||
$records = $records->joinWith($options['join_with']); | |||
} | |||
if (!isset($options['type_search'])) { | |||
$options['type_search'] = self::SEARCH_ALL; | |||
} | |||
// Conditions | |||
if (isset($options['conditions'])) { | |||
if (is_array($options['conditions'])) { | |||
if (count($options['conditions'])) { | |||
foreach ($options['conditions'] as $condition) { | |||
$records = $records->andWhere($condition); | |||
} | |||
} | |||
} else { | |||
if (strlen($options['conditions'])) { | |||
$records = $records->andWhere($options['conditions']); | |||
} | |||
} | |||
} | |||
$records = $class::find(); | |||
// Params | |||
if (isset($options['params']) && is_array($options['params']) && count($options['params'])) { | |||
$records = $records->params($options['params']); | |||
} | |||
// With | |||
if (is_array($options['with']) && count($options['with'])) { | |||
$records = $records->with($options['with']); | |||
} | |||
// Paramètres | |||
if (is_array($params) && count($params)) { | |||
foreach ($params as $key => $val) { | |||
if (strpos($key, '.') === false) { | |||
unset($params[$key]); | |||
$key = $class::tableName() . '.' . $key; | |||
$params[$key] = $val; | |||
} | |||
$records = $records->andWhere([$key => $val]); | |||
} | |||
} | |||
// Join with | |||
if (is_array($options['join_with']) && count($options['join_with'])) { | |||
$records = $records->joinWith($options['join_with']); | |||
} | |||
if (!isset($params[$pk])) { | |||
// Orderby | |||
if (isset($options['orderby']) && strlen($options['orderby'])) { | |||
$records = $records->orderBy($options['orderby']); | |||
} | |||
// Limit | |||
if (isset($options['limit']) && is_numeric($options['limit']) | |||
&& $options['limit'] > 0) { | |||
$records = $records->limit($options['limit']); | |||
} | |||
// Conditions | |||
if (isset($options['conditions'])) { | |||
if (is_array($options['conditions'])) { | |||
if (count($options['conditions'])) { | |||
foreach ($options['conditions'] as $condition) { | |||
$records = $records->andWhere($condition); | |||
} | |||
} | |||
if (isset($options['groupby'])) { | |||
$records = $records->groupBy($options['groupby']); | |||
} else { | |||
if (strlen($options['conditions'])) { | |||
$records = $records->andWhere($options['conditions']); | |||
} | |||
} | |||
} | |||
if (isset($options['as_array'])) { | |||
$records = $records->asArray(); | |||
} | |||
// Params | |||
if (isset($options['params']) && is_array($options['params']) && count($options['params'])) { | |||
$records = $records->params($options['params']); | |||
} | |||
if ($options['type_search'] == self::SEARCH_ALL) { | |||
return $records->all(); | |||
} elseif ($options['type_search'] == self::SEARCH_ONE) { | |||
$record = $records->one(); | |||
if ($record) { | |||
return $record; | |||
} | |||
} elseif ($options['type_search'] == self::SEARCH_COUNT) { | |||
$primaryKey = static::primaryKey(); | |||
$records = $records->groupBy($class::tableName() . '.'.$primaryKey[0]); | |||
return $records->count(); | |||
// Paramètres | |||
if (is_array($params) && count($params)) { | |||
foreach ($params as $key => $val) { | |||
if (strpos($key, '.') === false) { | |||
unset($params[$key]); | |||
$key = $class::tableName() . '.' . $key; | |||
$params[$key] = $val; | |||
} | |||
return false; | |||
$records = $records->andWhere([$key => $val]); | |||
} | |||
} | |||
/** | |||
* Recherche un enregistrement. | |||
* | |||
* @param array $params | |||
* @param array $options | |||
* @return mixed | |||
*/ | |||
public static function searchOne($params = [], $options = []) | |||
{ | |||
$options['type_search'] = self::SEARCH_ONE; | |||
return self::searchDispatch($params, $options); | |||
if (!isset($params[$pk])) { | |||
// Orderby | |||
if (isset($options['orderby']) && strlen($options['orderby'])) { | |||
$records = $records->orderBy($options['orderby']); | |||
} | |||
// Limit | |||
if (isset($options['limit']) && is_numeric($options['limit']) | |||
&& $options['limit'] > 0) { | |||
$records = $records->limit($options['limit']); | |||
} | |||
} | |||
/** | |||
* Recherche tous les enregistrements. | |||
* | |||
* @param array $params | |||
* @param array $options | |||
* @return mixed | |||
*/ | |||
public static function searchAll($params = [], $options = []) | |||
{ | |||
$options['type_search'] = self::SEARCH_ALL; | |||
return self::searchDispatch($params, $options); | |||
if (isset($options['groupby'])) { | |||
$records = $records->groupBy($options['groupby']); | |||
} | |||
/** | |||
* Recherche et compte le nombre de résultats. | |||
* | |||
* @param array $params | |||
* @param array $options | |||
* @return integer | |||
*/ | |||
public static function searchCount($params = [], $options = []) | |||
{ | |||
$options['type_search'] = self::SEARCH_COUNT; | |||
return self::searchDispatch($params, $options); | |||
if (isset($options['as_array'])) { | |||
$records = $records->asArray(); | |||
} | |||
/** | |||
* Appelle la méthode 'search' de la classe appellante. | |||
* | |||
* @param array $params | |||
* @param array $options | |||
* @return mixed | |||
*/ | |||
public static function searchDispatch($params = [], $options = []) | |||
{ | |||
$class = get_called_class(); | |||
return $class::searchBy($params, $options); | |||
if ($options['type_search'] == self::SEARCH_QUERY) { | |||
self::groupByPrimaryKey($class, $records); | |||
return $records; | |||
} elseif ($options['type_search'] == self::SEARCH_ALL) { | |||
return $records->all(); | |||
} elseif ($options['type_search'] == self::SEARCH_ONE) { | |||
$record = $records->one(); | |||
if ($record) { | |||
return $record; | |||
} | |||
} elseif ($options['type_search'] == self::SEARCH_COUNT) { | |||
self::groupByPrimaryKey($class, $records); | |||
return $records->count(); | |||
} | |||
return false; | |||
} | |||
public static function groupByPrimaryKey($class, $records) | |||
{ | |||
$primaryKey = static::primaryKey(); | |||
$records = $records->groupBy($class::tableName() . '.' . $primaryKey[0]); | |||
} | |||
public static function searchQuery($params = [], $options = []) | |||
{ | |||
$options['type_search'] = self::SEARCH_QUERY; | |||
return self::searchDispatch($params, $options); | |||
} | |||
/** | |||
* Recherche un enregistrement. | |||
* | |||
* @param array $params | |||
* @param array $options | |||
* @return mixed | |||
*/ | |||
public static function searchOne($params = [], $options = []) | |||
{ | |||
$options['type_search'] = self::SEARCH_ONE; | |||
return self::searchDispatch($params, $options); | |||
} | |||
/** | |||
* Recherche tous les enregistrements. | |||
* | |||
* @param array $params | |||
* @param array $options | |||
* @return mixed | |||
*/ | |||
public static function searchAll($params = [], $options = []) | |||
{ | |||
$options['type_search'] = self::SEARCH_ALL; | |||
return self::searchDispatch($params, $options); | |||
} | |||
/** | |||
* Recherche et compte le nombre de résultats. | |||
* | |||
* @param array $params | |||
* @param array $options | |||
* @return integer | |||
*/ | |||
public static function searchCount($params = [], $options = []) | |||
{ | |||
$options['type_search'] = self::SEARCH_COUNT; | |||
return self::searchDispatch($params, $options); | |||
} | |||
/** | |||
* Appelle la méthode 'search' de la classe appellante. | |||
* | |||
* @param array $params | |||
* @param array $options | |||
* @return mixed | |||
*/ | |||
public static function searchDispatch($params = [], $options = []) | |||
{ | |||
$class = get_called_class(); | |||
return $class::searchBy($params, $options); | |||
} | |||
} |
@@ -0,0 +1,74 @@ | |||
<?php | |||
/** | |||
Copyright distrib (2018) | |||
contact@opendistrib.net | |||
Ce logiciel est un programme informatique servant à aider les producteurs | |||
à distribuer leur production en circuits courts. | |||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||
sur le site "http://www.cecill.info". | |||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||
de modification et de redistribution accordés par cette licence, il n'est | |||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||
titulaire des droits patrimoniaux et les concédants successifs. | |||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||
associés au chargement, à l'utilisation, à la modification et/ou au | |||
développement et à la reproduction du logiciel par l'utilisateur étant | |||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||
avertis possédant des connaissances informatiques approfondies. Les | |||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||
termes. | |||
*/ | |||
namespace common\models ; | |||
use common\helpers\GlobalParam; | |||
use common\models\Product ; | |||
class OrderSearch extends Order | |||
{ | |||
public function search($params) | |||
{ | |||
$optionsSearch = self::defaultOptionsSearch() ; | |||
$paramsSearch = []; | |||
if(isset($params['id_user'])) { | |||
$paramsSearch['id_user'] = $params['id_user']; | |||
} | |||
$query = Order::searchQuery($paramsSearch, [ | |||
'orderby' => 'distribution.date DESC' | |||
]); | |||
$dataProvider = new ActiveDataProvider([ | |||
'query' => $query, | |||
'sort' => ['attributes' => []], | |||
'pagination' => [ | |||
'pageSize' => 20, | |||
], | |||
]); | |||
$this->load($params); | |||
if (!$this->validate()) { | |||
return $dataProvider; | |||
} | |||
return $dataProvider; | |||
} | |||
} |