Amélioration de la fonction de recherche de ActiveRecordCommon.dev
if (!Yii::$app->user->isGuest) | if (!Yii::$app->user->isGuest) | ||||
$id_etablissement = Yii::$app->user->identity->id_etablissement; | $id_etablissement = Yii::$app->user->identity->id_etablissement; | ||||
$orders = Order::searchAll([ | |||||
'date' => $date, | |||||
'date_delete' => 'NULL' | |||||
], | |||||
[ | |||||
'orderby' => 'commentaire_point_vente ASC, user.nom ASC' | |||||
]) ; | |||||
$commandes = Commande::findBy([ | $commandes = Commande::findBy([ | ||||
'date' => $date, | 'date' => $date, | ||||
'date_delete' => 'NULL', | 'date_delete' => 'NULL', |
class ActiveRecordCommon extends \yii\db\ActiveRecord | class ActiveRecordCommon extends \yii\db\ActiveRecord | ||||
{ | { | ||||
public static function findByGeneric($class, $pk, $with = [], $join_with = [], | |||||
$params = [], $conditions = [], $orderby = '', $limit = 0) { | |||||
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 search($params = [], $options = []) | |||||
{ | |||||
$class = get_called_class() ; | |||||
$records = $class::find() ; | |||||
$default_options = $class::defaultOptionsSearch() ; | |||||
$options = array_merge($default_options, $options) ; | |||||
$pk = $class::primaryKey() ; | |||||
$pk = $class::tableName().'.'.$pk[0] ; | |||||
if (!isset($params[$options['attribute_id_producer']]) && !Yii::$app->user->isGuest) { | |||||
$params[$options['attribute_id_producer']] = Producer::getCurrent(); | |||||
} | |||||
if(!isset($options['type_search'])) { | |||||
$options['type_search'] = self::SEARCH_ALL ; | |||||
} | |||||
$records = $options['class']::find() ; | |||||
// With | // With | ||||
if(is_array($with) && count($with)) { | |||||
$records = $records->with($with) ; | |||||
if(is_array($options['with']) && count($options['with'])) { | |||||
$records = $records->with($options['with']) ; | |||||
} | } | ||||
// Join with | // Join with | ||||
if(is_array($join_with) && count($join_with)) { | |||||
$records = $records->joinWith($join_with) ; | |||||
if(is_array($options['join_with']) && count($options['join_with'])) { | |||||
$records = $records->joinWith($options['join_with']) ; | |||||
} | } | ||||
// Conditions | // Conditions | ||||
if(is_array($conditions)) { | |||||
if(count($conditions)) { | |||||
foreach($conditions as $condition) { | |||||
$records = $records->andWhere($condition); | |||||
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($conditions)) { | |||||
$records = $records->andWhere($conditions); | |||||
else { | |||||
if(strlen($options['conditions'])) { | |||||
$records = $records->andWhere($options['conditions']); | |||||
} | |||||
} | } | ||||
} | } | ||||
// Paramètres | // Paramètres | ||||
if(is_array($params) && count($params)) { | if(is_array($params) && count($params)) { | ||||
foreach($params as $key => $val) { | foreach($params as $key => $val) { | ||||
if(strpos($key, '.') === false) { | |||||
unset($params[$key]) ; | |||||
$key = $class::tableName().'.'.$key ; | |||||
$params[$key] = $val ; | |||||
} | |||||
$records = $records->andWhere([$key => $val]); | $records = $records->andWhere([$key => $val]); | ||||
} | } | ||||
} | } | ||||
if(!isset($params[$pk])) { | if(!isset($params[$pk])) { | ||||
// Orderby | // Orderby | ||||
if (isset($orderby) && strlen($orderby)) { | |||||
$records = $records->orderBy($orderby); | |||||
if (isset($options['orderby']) && strlen($options['orderby'])) { | |||||
$records = $records->orderBy($options['orderby']); | |||||
} | } | ||||
// Limit | // Limit | ||||
if (isset($limit) && is_numeric($limit) && $limit > 0) { | |||||
$records = $records->limit($limit); | |||||
if (isset($options['limit']) && is_numeric($options['limit']) | |||||
&& $options['limit'] > 0) | |||||
{ | |||||
$records = $records->limit($options['limit']); | |||||
} | } | ||||
} | } | ||||
if(isset($params[$pk])) { | |||||
if($options['type_search'] == self::SEARCH_ALL) { | |||||
return $records->all(); | |||||
} | |||||
elseif($options['type_search'] == self::SEARCH_ONE) { | |||||
$record = $records->one(); | $record = $records->one(); | ||||
if($record) { | if($record) { | ||||
return $record ; | return $record ; | ||||
'Le modèle '.$class.' #'.((int) $params[$pk]).' n\'a pas été trouvé.'); | 'Le modèle '.$class.' #'.((int) $params[$pk]).' n\'a pas été trouvé.'); | ||||
} | } | ||||
} | } | ||||
else { | |||||
$records = $records->all(); | |||||
return $records ; | |||||
elseif($options['type_search'] == self::SEARCH_COUNT) { | |||||
return $records->count() ; | |||||
} | } | ||||
} | } | ||||
/** | |||||
* 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::search($params, $options) ; | |||||
} | |||||
} | } |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
namespace common\models; | |||||
use Yii; | |||||
use common\models\Etablissement; | |||||
use common\models\PointVente; | |||||
use common\models\PointVenteUser; | |||||
use common\models\Commande; | |||||
use common\models\CommandeProduit; | |||||
/** | |||||
* This is the model class for table "commande_auto". | |||||
* | |||||
* @property integer $id | |||||
* @property integer $id_user | |||||
* @property integer $id_etablissement | |||||
* @property integer $id_point_vente | |||||
* @property string $date_debut | |||||
* @property string $date_fin | |||||
* @property integer $lundi | |||||
* @property integer $mardi | |||||
* @property integer $mercredi | |||||
* @property integer $jeudi | |||||
* @property integer $vendredi | |||||
* @property integer $samedi | |||||
* @property integer $dimanche | |||||
* @property integer $periodicite_semaine | |||||
* @property string $username | |||||
* @property string $paiement_automatique | |||||
*/ | |||||
class CommandeAuto extends \yii\db\ActiveRecord | |||||
{ | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public static function tableName() | |||||
{ | |||||
return 'commande_auto'; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function rules() | |||||
{ | |||||
return [ | |||||
[['id_etablissement', 'id_point_vente'], 'required'], | |||||
[['id_user', 'id_etablissement', 'id_point_vente', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi', 'dimanche', 'periodicite_semaine'], 'integer'], | |||||
[['paiement_automatique'], 'boolean'], | |||||
[['date_debut', 'date_fin', 'username'], 'safe'], | |||||
]; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function attributeLabels() | |||||
{ | |||||
return [ | |||||
'id' => 'ID', | |||||
'id_user' => 'Utilisateur', | |||||
'id_etablissement' => 'Etablissement', | |||||
'id_point_vente' => 'Point de vente', | |||||
'date_debut' => 'Date de début', | |||||
'date_fin' => 'Date de fin', | |||||
'lundi' => 'Lundi', | |||||
'mardi' => 'Mardi', | |||||
'mercredi' => 'Mercredi', | |||||
'jeudi' => 'Jeudi', | |||||
'vendredi' => 'Vendredi', | |||||
'samedi' => 'Samedi', | |||||
'dimanche' => 'Dimanche', | |||||
'periodicite_semaine' => 'Périodicité', | |||||
'paiement_automatique' => 'Paiement automatique' | |||||
]; | |||||
} | |||||
/* | |||||
* Relations | |||||
*/ | |||||
public function getUser() | |||||
{ | |||||
return $this->hasOne(User::className(), ['id' => 'id_user']); | |||||
} | |||||
public function getEtablissement() | |||||
{ | |||||
return $this->hasOne(Etablissement::className(), ['id' => 'id_etablissement']); | |||||
} | |||||
public function getPointVente() | |||||
{ | |||||
return $this->hasOne(PointVente::className(), ['id' => 'id_point_vente']); | |||||
} | |||||
public function getCommandeAutoProduit() | |||||
{ | |||||
return $this->hasMany(CommandeAutoProduit::className(), ['id_commande_auto' => 'id'])->with('produit'); | |||||
} | |||||
/** | |||||
* Retourne les commandes récurrentes pour une date donnée. | |||||
* | |||||
* @param string $date | |||||
* @return array | |||||
*/ | |||||
public static function getAll($date) | |||||
{ | |||||
$date = date('Y-m-d', strtotime($date)); | |||||
// commandes auto | |||||
$commandes_auto = self::find() | |||||
->with('commandeAutoProduit') | |||||
->where(['id_etablissement' => Yii::$app->user->identity->id_etablissement]) | |||||
->all(); | |||||
$arr_commandes_auto = []; | |||||
foreach ($commandes_auto as $c) { | |||||
// vérif dates | |||||
if ($date >= $c->date_debut && | |||||
(!$c->date_fin || $date <= $c->date_fin)) | |||||
{ | |||||
// périodicite | |||||
$nb_jours = (strtotime($date) - strtotime($c->date_debut)) / (24 * 60 * 60); | |||||
if ($nb_jours % ($c->periodicite_semaine * 7) < 7) { | |||||
// jour de la semaine | |||||
$jour = date('N', strtotime($date)); | |||||
switch ($jour) { | |||||
case 1 : $jour = 'lundi'; | |||||
break; | |||||
case 2 : $jour = 'mardi'; | |||||
break; | |||||
case 3 : $jour = 'mercredi'; | |||||
break; | |||||
case 4 : $jour = 'jeudi'; | |||||
break; | |||||
case 5 : $jour = 'vendredi'; | |||||
break; | |||||
case 6 : $jour = 'samedi'; | |||||
break; | |||||
case 7 : $jour = 'dimanche'; | |||||
break; | |||||
} | |||||
if ($c->$jour) { | |||||
$arr_commandes_auto[] = $c; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
return $arr_commandes_auto; | |||||
} | |||||
/** | |||||
* Ajoute les commandes pour une date donnée à partir des commnandes | |||||
* récurrentes. | |||||
* | |||||
* @param string $date | |||||
* @param boolean $force | |||||
*/ | |||||
public static function addAll($date, $force = false) | |||||
{ | |||||
// production | |||||
$production = Production::findOne([ | |||||
'date' => date('Y-m-d', strtotime($date)), | |||||
'id_etablissement' => Yii::$app->user->identity->id_etablissement | |||||
]); | |||||
if ($production) { | |||||
$count_commandes_prod = Commande::find() | |||||
->where(['id_production' => $production->id]) | |||||
->count(); | |||||
if (!$count_commandes_prod || $force) { | |||||
$commandes_auto = self::getAll($date); | |||||
foreach ($commandes_auto as $c) { | |||||
$c->add($date); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Ajoute la commande récurrente pour une date donnée. | |||||
* | |||||
* @param string $date | |||||
*/ | |||||
public function add($date) | |||||
{ | |||||
// production | |||||
$production = Production::find() | |||||
->where([ | |||||
'date' => date('Y-m-d', strtotime($date)), | |||||
'id_etablissement' => Yii::$app->user->identity->id_etablissement | |||||
]) | |||||
->with('productionProduit') | |||||
->one(); | |||||
if ($production && count($this->commandeAutoProduit)) { | |||||
// commande | |||||
$commande = new Commande; | |||||
if (strlen($this->username)) { | |||||
$commande->username = $this->username; | |||||
$commande->id_user = 0; | |||||
} else { | |||||
$commande->id_user = $this->id_user; | |||||
} | |||||
$commande->date = date('Y-m-d H:i:s'); | |||||
$commande->type = Commande::TYPE_AUTO; | |||||
$commande->id_point_vente = $this->id_point_vente; | |||||
$commande->id_production = $production->id; | |||||
$commande->paiement_automatique = $this->paiement_automatique ; | |||||
$point_vente_user = PointVenteUser::find() | |||||
->where(['id_point_vente' => $this->id_point_vente, 'id_user' => $this->id_user]) | |||||
->one(); | |||||
if ($point_vente_user && strlen($point_vente_user->commentaire)) { | |||||
$commande->commentaire_point_vente = $point_vente_user->commentaire; | |||||
} | |||||
$commande->save(); | |||||
// produits | |||||
$montant_total = 0; | |||||
$produits_add = false; | |||||
foreach ($this->commandeAutoProduit as $commande_auto_produit) { | |||||
$commande_produit = new CommandeProduit; | |||||
$commande_produit->id_commande = $commande->id; | |||||
$commande_produit->id_produit = $commande_auto_produit->produit->id; | |||||
$commande_produit->quantite = $commande_auto_produit->quantite; | |||||
$commande_produit->prix = $commande_auto_produit->produit->prix; | |||||
$commande_produit->save(); | |||||
$produits_add = true; | |||||
} | |||||
if (!$produits_add) { | |||||
$commande->delete(); | |||||
} | |||||
} | |||||
} | |||||
} |
use common\components\ActiveRecordCommon ; | use common\components\ActiveRecordCommon ; | ||||
/** | /** | ||||
* This is the model class for table "commande". | |||||
* This is the model class for table "order". | |||||
* | * | ||||
* @property integer $id | * @property integer $id | ||||
* @property integer $id_user | * @property integer $id_user | ||||
* @property string $date_update | * @property string $date_update | ||||
* @property integer $id_point_sale | * @property integer $id_point_sale | ||||
* @property integer $id_production | * @property integer $id_production | ||||
* @property boolean $paiement_automatique | |||||
* @property boolean $auto_payment | |||||
*/ | */ | ||||
class Order extends ActiveRecordCommon | class Order extends ActiveRecordCommon | ||||
{ | { | ||||
var $amount = 0 ; | var $amount = 0 ; | ||||
var $paid_amount = 0 ; | var $paid_amount = 0 ; | ||||
var $Weight = 0 ; | |||||
var $weight = 0 ; | |||||
const ORIGIN_AUTO = 'auto'; | const ORIGIN_AUTO = 'auto'; | ||||
const ORIGIN_USER = 'user'; | const ORIGIN_USER = 'user'; | ||||
{ | { | ||||
return 'order'; | return 'order'; | ||||
} | } | ||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function rules() | |||||
{ | |||||
return [ | |||||
[['id_user', 'date', 'id_point_sale', 'id_production'], 'required', 'message' => ''], | |||||
[['id_user', 'id_point_sale', 'id_production'], 'integer'], | |||||
[['auto_payment'], 'boolean'], | |||||
[['date', 'date_update', 'comment', 'point_sale_comment'], 'safe'] | |||||
]; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function attributeLabels() | |||||
{ | |||||
return [ | |||||
'id' => 'ID', | |||||
'id_user' => 'Id User', | |||||
'date' => 'Date', | |||||
'date_update' => 'Date de modification', | |||||
'id_point_sale' => 'Point de vente', | |||||
'id_production' => 'Date de production', | |||||
]; | |||||
} | |||||
/* | /* | ||||
* Relations | * Relations | ||||
} | } | ||||
/** | /** | ||||
* @inheritdoc | |||||
* Retourne les options de base nécessaires à la fonction de recherche. | |||||
* | |||||
* @return array | |||||
*/ | */ | ||||
public function rules() | |||||
{ | |||||
public static function defaultOptionsSearch() { | |||||
return [ | return [ | ||||
[['id_user', 'date', 'id_point_sale', 'id_production'], 'required', 'message' => ''], | |||||
[['id_user', 'id_point_sale', 'id_production'], 'integer'], | |||||
[['payment_auto'], 'boolean'], | |||||
[['date', 'date_update', 'comment', 'point_sale_comment'], 'safe'] | |||||
]; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function attributeLabels() | |||||
{ | |||||
return [ | |||||
'id' => 'ID', | |||||
'id_user' => 'Id User', | |||||
'date' => 'Date', | |||||
'date_update' => 'Date de modification', | |||||
'id_point_sale' => 'Point de vente', | |||||
'id_production' => 'Date de production', | |||||
]; | |||||
'class' => 'Order', | |||||
'with' => ['productOrder', 'creditHistory', 'pointSale'], | |||||
'join_with' => ['production', 'user', 'user.userProducer'], | |||||
'orderby' => 'order.date ASC', | |||||
'attribute_id_producer' => 'production.id_producer' | |||||
] ; | |||||
} | } | ||||
/** | /** | ||||
{ | { | ||||
$this->initAmount() ; | $this->initAmount() ; | ||||
$this->initPaidAmount() ; | $this->initPaidAmount() ; | ||||
return $this ; | |||||
} | } | ||||
/** | /** | ||||
*/ | */ | ||||
public function getDataJson() | public function getDataJson() | ||||
{ | { | ||||
$order = Order::findBy(['order.id' => $this->id]) ; | |||||
$order = Order::searchOne(['order.id' => $this->id]) ; | |||||
$json_order = [] ; | |||||
$jsonOrder = [] ; | |||||
if($order) { | if($order) { | ||||
$json_order = [ | |||||
$jsonOrder = [ | |||||
'products' => [], | 'products' => [], | ||||
'amount' => $order->montant, | |||||
'amount' => $order->amount, | |||||
'str_amount' => $order->getAmount(self::TYPE_AMOUNT_TOTAL, true), | 'str_amount' => $order->getAmount(self::TYPE_AMOUNT_TOTAL, true), | ||||
'paid_amount' => $order->getPaidAmount(self::TYPE_AMOUNT_PAID), | 'paid_amount' => $order->getPaidAmount(self::TYPE_AMOUNT_PAID), | ||||
'comment' => $order->comment, | 'comment' => $order->comment, | ||||
]; | ]; | ||||
foreach ($order->productOrder as $product_order) { | |||||
$json_order['products'][$product_order->id_product] = $product_order->quantity; | |||||
foreach ($order->productOrder as $productOrder) { | |||||
$jsonOrder['products'][$productOrder->id_product] = $productOrder->quantity; | |||||
} | } | ||||
} | } | ||||
return json_encode($json_order); | |||||
return json_encode($jsonOrder); | |||||
} | } | ||||
/** | /** | ||||
* @param integer $id_user | * @param integer $id_user | ||||
* @param integer $id_user_action | * @param integer $id_user_action | ||||
*/ | */ | ||||
public function saveCreditHistory($type, $amount, $id_producer, $id_user, $id_user_action) | |||||
public function saveCreditHistory($type, $amount, $idProducer, $idUser, $idUserAction) | |||||
{ | { | ||||
$credit_history = new CreditHistorique; | |||||
$credit_history->id_user = $this->id_user; | |||||
$credit_history->id_order = $this->id; | |||||
$credit_history->amount = $amount; | |||||
$credit_history->type = $type; | |||||
$credit_history->id_producer = $id_producer; | |||||
$credit_history->id_user_action = $id_user_action; | |||||
$credit_history->populateRelation('order', $this) ; | |||||
$credit_history->populateRelation('user', User::find()->where(['id' => $this->id_user])->one()) ; | |||||
$credit_history->save(); | |||||
$creditHistory = new CreditHistory; | |||||
$creditHistory->id_user = $this->id_user; | |||||
$creditHistory->id_order = $this->id; | |||||
$creditHistory->amount = $amount; | |||||
$creditHistory->type = $type; | |||||
$creditHistory->id_producer = $idProducer; | |||||
$creditHistory->id_user_action = $idUserAction; | |||||
$creditHistory->populateRelation('order', $this) ; | |||||
$creditHistory->populateRelation('user', User::find()->where(['id' => $this->id_user])->one()) ; | |||||
$creditHistory->save(); | |||||
} | } | ||||
/** | /** | ||||
*/ | */ | ||||
public function getState() | public function getState() | ||||
{ | { | ||||
$order_delay = Producer::getConfig( | |||||
$orderDelay = Producer::getConfig( | |||||
'order_delay', | 'order_delay', | ||||
$this->production->id_producer | $this->production->id_producer | ||||
); | ); | ||||
$order_deadline = Producer::getConfig( | |||||
$orderDeadline = Producer::getConfig( | |||||
'order_deadline', | 'order_deadline', | ||||
$this->production->id_producer | $this->production->id_producer | ||||
); | ); | ||||
$order_date = strtotime($this->production->date); | |||||
$orderDate = strtotime($this->production->date); | |||||
$today = strtotime(date('Y-m-d')); | $today = strtotime(date('Y-m-d')); | ||||
$today_hour = date('G'); | |||||
$todayHour = date('G'); | |||||
$nb_days = (int) (($date_order - $today) / (24 * 60 * 60)); | |||||
$nbDays = (int) (($dateOrder - $today) / (24 * 60 * 60)); | |||||
if ($nb_days <= 0) { | if ($nb_days <= 0) { | ||||
return self::STATE_DELIVERED; | return self::STATE_DELIVERED; | ||||
} | } | ||||
elseif ($nb_days >= $order_delay && | |||||
($nb_days != $order_delay || | |||||
($nb_days == $order_delay && $today_hour < $order_deadline))) | |||||
elseif ($nbDays >= $orderDelay && | |||||
($nbDays != $orderDelay || | |||||
($nbDays == $orderDelay && $todayHour < $orderDeadline))) | |||||
{ | { | ||||
return self::STATE_OPEN; | return self::STATE_OPEN; | ||||
} | } | ||||
* @param boolean $with_label | * @param boolean $with_label | ||||
* @return string | * @return string | ||||
*/ | */ | ||||
public function getStrOrigin($with_label = false) | |||||
public function getStrOrigin($withLabel = false) | |||||
{ | { | ||||
$class_label = ''; | |||||
$classLabel = ''; | |||||
$str = ''; | $str = ''; | ||||
if ($this->type == self::ORIGIN_USER) { | if ($this->type == self::ORIGIN_USER) { | ||||
$class_label = 'success'; | |||||
$classLabel = 'success'; | |||||
$str = 'Client'; | $str = 'Client'; | ||||
} | } | ||||
elseif ($this->type == self::ORIGIN_AUTO) { | elseif ($this->type == self::ORIGIN_AUTO) { | ||||
$class_label = 'default'; | |||||
$classLabel = 'default'; | |||||
$str = 'Auto'; | $str = 'Auto'; | ||||
} | } | ||||
elseif ($this->type == self::ORIGIN_ADMIN) { | elseif ($this->type == self::ORIGIN_ADMIN) { | ||||
$class_label = 'warning'; | |||||
$classLabel = 'warning'; | |||||
$str = 'Vous'; | $str = 'Vous'; | ||||
} | } | ||||
if ($with_label) { | |||||
return '<span class="label label-' . $class_label . '">' . $str . '</span>'; | |||||
if ($withLabel) { | |||||
return '<span class="label label-' . $classLabel . '">' | |||||
. $str . '</span>'; | |||||
} | } | ||||
else { | else { | ||||
return $str; | return $str; | ||||
] ; | ] ; | ||||
} | } | ||||
$html = '<div class="small"><span class="'.$arr['class'].'"><span class="glyphicon glyphicon-'.$arr['glyphicon'].'"></span> '.$arr['str'].'</span> le <strong>'.date('d/m/Y à G\hi', strtotime($arr['date'])).'</strong></div>' ; | |||||
$html = '<div class="small"><span class="'.$arr['class'].'">' | |||||
. '<span class="glyphicon glyphicon-'.$arr['glyphicon'].'"></span> ' | |||||
. $arr['str'].'</span> le <strong>' | |||||
. date('d/m/Y à G\hi', strtotime($arr['date'])).'</strong></div>' ; | |||||
return $html ; | return $html ; | ||||
} | } | ||||
/** | /** | ||||
* Retourne la quantité d'un produit donné de plusieurs commandes. | * Retourne la quantité d'un produit donné de plusieurs commandes. | ||||
* | * | ||||
* @param integer $id_produit | |||||
* @param array $commandes | |||||
* @param integer $idProduct | |||||
* @param array $orders | |||||
* | * | ||||
* @return integer | * @return integer | ||||
*/ | */ | ||||
public static function getProductQuantity($id_product, $orders) | |||||
public static function getProductQuantity($idProduct, $orders) | |||||
{ | { | ||||
$quantity = 0; | $quantity = 0; | ||||
} | } | ||||
/** | /** | ||||
* Recherche des commandes. | |||||
* Recherche et initialise des commandes. | |||||
* | * | ||||
* @param array $params | * @param array $params | ||||
* @param array $conditions | * @param array $conditions | ||||
* @param integer $limit | * @param integer $limit | ||||
* @return array | * @return array | ||||
*/ | */ | ||||
public static function findBy($params = [], $conditions = [], $orderby = '', $limit = 0) | |||||
public static function search($params = [], $options = []) | |||||
{ | { | ||||
if (!isset($params['production.id_producer']) && !Yii::$app->user->isGuest) { | |||||
$params['production.id_producer'] = Producer::getCurrent(); | |||||
} | |||||
$orders = parent::findByGeneric( | |||||
'Order', | |||||
'order.id', | |||||
['productOrder', 'creditHistory', 'pointSale'], | |||||
['production', 'user', 'user.userProducer'], | |||||
$params, | |||||
$conditions, | |||||
strlen($orderby) ? $orderby : 'date ASC', | |||||
$limit | |||||
) ; | |||||
$orders = parent::search($params, $options) ; | |||||
/* | /* | ||||
* Initialisation des commandes | * Initialisation des commandes | ||||
} | } | ||||
else { | else { | ||||
$order = $orders ; | $order = $orders ; | ||||
$order->init() ; | |||||
return $order ; | |||||
return $order->init() ; | |||||
} | } | ||||
return false ; | return false ; |
namespace common\models; | namespace common\models; | ||||
use Yii; | use Yii; | ||||
use common\models\Produit; | |||||
use common\models\Product; | |||||
/** | /** | ||||
* This is the model class for table "commande_auto_produit". | * This is the model class for table "commande_auto_produit". | ||||
* @property integer $id_produit | * @property integer $id_produit | ||||
* @property double $quantite | * @property double $quantite | ||||
*/ | */ | ||||
class CommandeAutoProduit extends \yii\db\ActiveRecord | |||||
class ProductSubscription extends \yii\db\ActiveRecord | |||||
{ | { | ||||
/** | /** | ||||
*/ | */ | ||||
public static function tableName() | public static function tableName() | ||||
{ | { | ||||
return 'commande_auto_produit'; | |||||
return 'product_subscription'; | |||||
} | } | ||||
/** | /** | ||||
* Relations | * Relations | ||||
*/ | */ | ||||
public function getProduit() | |||||
public function getProduct() | |||||
{ | { | ||||
return $this->hasOne(Produit::className(), ['id' => 'id_produit']); | |||||
return $this->hasOne(Product::className(), ['id' => 'id_product']); | |||||
} | } | ||||
} | } |
<?php | |||||
/** | |||||
Copyright La boîte à pain (2018) | |||||
contact@laboiteapain.net | |||||
Ce logiciel est un programme informatique servant à aider les producteurs | |||||
à distribuer leur production en circuits courts. | |||||
Ce logiciel est régi par la licence CeCILL soumise au droit français et | |||||
respectant les principes de diffusion des logiciels libres. Vous pouvez | |||||
utiliser, modifier et/ou redistribuer ce programme sous les conditions | |||||
de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA | |||||
sur le site "http://www.cecill.info". | |||||
En contrepartie de l'accessibilité au code source et des droits de copie, | |||||
de modification et de redistribution accordés par cette licence, il n'est | |||||
offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, | |||||
seule une responsabilité restreinte pèse sur l'auteur du programme, le | |||||
titulaire des droits patrimoniaux et les concédants successifs. | |||||
A cet égard l'attention de l'utilisateur est attirée sur les risques | |||||
associés au chargement, à l'utilisation, à la modification et/ou au | |||||
développement et à la reproduction du logiciel par l'utilisateur étant | |||||
donné sa spécificité de logiciel libre, qui peut le rendre complexe à | |||||
manipuler et qui le réserve donc à des développeurs et des professionnels | |||||
avertis possédant des connaissances informatiques approfondies. Les | |||||
utilisateurs sont donc invités à charger et tester l'adéquation du | |||||
logiciel à leurs besoins dans des conditions permettant d'assurer la | |||||
sécurité de leurs systèmes et ou de leurs données et, plus généralement, | |||||
à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. | |||||
Le fait que vous puissiez accéder à cet en-tête signifie que vous avez | |||||
pris connaissance de la licence CeCILL, et que vous en avez accepté les | |||||
termes. | |||||
*/ | |||||
namespace common\models; | |||||
use Yii; | |||||
use common\models\Producer; | |||||
use common\models\PointSale; | |||||
use common\models\PointSaleUser; | |||||
use common\models\Order; | |||||
use common\models\ProductOrder; | |||||
/** | |||||
* This is the model class for table "commande_auto". | |||||
* | |||||
* @property integer $id | |||||
* @property integer $id_user | |||||
* @property integer $id_producer | |||||
* @property integer $id_point_sale | |||||
* @property string $date_begin | |||||
* @property string $date_end | |||||
* @property integer $monday | |||||
* @property integer $tuesday | |||||
* @property integer $wednesday | |||||
* @property integer $thursday | |||||
* @property integer $friday | |||||
* @property integer $saturday | |||||
* @property integer $sunday | |||||
* @property integer $week_frequency | |||||
* @property string $username | |||||
* @property string $auto_payment | |||||
*/ | |||||
class Subscription extends ActiveRecordCommon | |||||
{ | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public static function tableName() | |||||
{ | |||||
return 'subscription'; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function rules() | |||||
{ | |||||
return [ | |||||
[['id_producer', 'id_point_sale'], 'required'], | |||||
[['id_user', 'id_producer', 'id_point_sale', 'monday', 'tuesday', | |||||
'wednesday', 'thursday', 'friday', 'saterday', 'sunday', 'week_frequency'], 'integer'], | |||||
[['auto_payment'], 'boolean'], | |||||
[['date_begin', 'date_end', 'username'], 'safe'], | |||||
]; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function attributeLabels() | |||||
{ | |||||
return [ | |||||
'id' => 'ID', | |||||
'id_user' => 'Utilisateur', | |||||
'id_producer' => 'Etablissement', | |||||
'id_point_sale' => 'Point de vente', | |||||
'date_begin' => 'Date de début', | |||||
'date_end' => 'Date de fin', | |||||
'monday' => 'Lundi', | |||||
'tuesday' => 'Mardi', | |||||
'wednesday' => 'Mercredi', | |||||
'thursday' => 'Jeudi', | |||||
'friday' => 'Vendredi', | |||||
'saterday' => 'Samedi', | |||||
'sunday' => 'Dimanche', | |||||
'week_frequency' => 'Périodicité', | |||||
'auto_payment' => 'Paiement automatique' | |||||
]; | |||||
} | |||||
/* | |||||
* Relations | |||||
*/ | |||||
public function getUser() | |||||
{ | |||||
return $this->hasOne(User::className(), ['id' => 'id_user']); | |||||
} | |||||
public function getProducer() | |||||
{ | |||||
return $this->hasOne( | |||||
Producer::className(), | |||||
['id' => 'id_producer'] | |||||
); | |||||
} | |||||
public function getPointSale() | |||||
{ | |||||
return $this->hasOne( | |||||
PointSale::className(), | |||||
['id' => 'id_point_sale'] | |||||
); | |||||
} | |||||
public function getProductSubscription() | |||||
{ | |||||
return $this->hasMany( | |||||
ProductSubscription::className(), | |||||
['id_subscription' => 'id'] | |||||
)->with('product'); | |||||
} | |||||
/** | |||||
* Retourne les options de base nécessaires à la fonction de recherche. | |||||
* | |||||
* @return array | |||||
*/ | |||||
public static function defaultOptionsSearch() { | |||||
return [ | |||||
'class' => 'Subscription', | |||||
'with' => ['producer', 'pointSale', 'productSubscription'], | |||||
'join_with' => ['user'], | |||||
'orderby' => 'user.name ASC', | |||||
'attribute_id_producer' => 'subscription.id_producer' | |||||
] ; | |||||
} | |||||
/** | |||||
* Ajoute la commande pour une date donnée. | |||||
* | |||||
* @param string $date | |||||
*/ | |||||
public function add($date) | |||||
{ | |||||
// production | |||||
$production = Production::searchOne([ | |||||
'production.date' => date('Y-m-d', strtotime($date)) | |||||
]) ; | |||||
if ($production && count($this->productSubscription)) { | |||||
// commande | |||||
$order = new Order; | |||||
if (strlen($this->username)) { | |||||
$order->username = $this->username; | |||||
$order->id_user = 0; | |||||
} | |||||
else { | |||||
$order->id_user = $this->id_user; | |||||
} | |||||
$order->date = date('Y-m-d H:i:s'); | |||||
$order->origin = Order::ORIGIN_AUTO; | |||||
$order->id_point_sale = $this->id_point_sale; | |||||
$order->id_production = $production->id; | |||||
$order->auto_payment = $this->auto_payment ; | |||||
$pointSaleUser = PointSaleUser::searchOne([ | |||||
'id_point_sale' => $this->id_point_sale, | |||||
'id_user' => $this->id_user | |||||
]) ; | |||||
if ($pointSaleUser && strlen($pointSaleUser->comment)) { | |||||
$order->comment_point_sale = $pointSaleUser->comment; | |||||
} | |||||
$order->save(); | |||||
// produits | |||||
$amountTotal = 0; | |||||
$productsAdd = false; | |||||
foreach ($this->productSubscription as $productSubscription) { | |||||
$productOrder = new ProductOrder; | |||||
$productOrder->id_order = $order->id; | |||||
$productOrder->id_product = $productSubscription->product->id; | |||||
$productOrder->quantity = $productSubscription->quantity; | |||||
$productOrder->price = $productSubscription->product->price; | |||||
$productOrder->save(); | |||||
$productsAdd = true; | |||||
} | |||||
if (!$products_add) { | |||||
$order->delete(); | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Ajoute les commandes pour une date donnée à partir des abonnements. | |||||
* | |||||
* @param string $date | |||||
* @param boolean $force | |||||
*/ | |||||
public static function addAll($date, $force = false) | |||||
{ | |||||
$production = Production::searchOne([ | |||||
'date' => date('Y-m-d', strtotime($date)) | |||||
]) ; | |||||
if ($production) { | |||||
$countOrdersProd = Order::searchCount([ | |||||
Order::tableName().'.id_production' => $production->id | |||||
]) ; | |||||
if (!$countOrdersProd || $force) { | |||||
$subscriptions = self::searchByDate($date); | |||||
foreach ($subscriptions as $s) { | |||||
$s->add($date); | |||||
} | |||||
} | |||||
} | |||||
} | |||||
/** | |||||
* Retourne les abonnements pour une date donnée. | |||||
* | |||||
* @param string $date | |||||
* @return array | |||||
*/ | |||||
public static function searchByDate($date) | |||||
{ | |||||
$date = date('Y-m-d', strtotime($date)); | |||||
$subscriptions = Subscription::searchAll() ; | |||||
$arrSubscriptions = []; | |||||
foreach ($subscriptions as $s) { | |||||
// vérif dates | |||||
if ($date >= $s->date_begin && | |||||
(!$s->date_end || $date <= $s->date_end)) | |||||
{ | |||||
// périodicite | |||||
$nbDays = (strtotime($date) - strtotime($s->date_begin)) / (24 * 60 * 60); | |||||
if ($nbDays % ($c->week_frequency * 7) < 7) { | |||||
// jour de la semaine | |||||
$day = date('N', strtotime($date)); | |||||
switch ($day) { | |||||
case 1 : $day = 'monday'; | |||||
break; | |||||
case 2 : $day = 'tuesday'; | |||||
break; | |||||
case 3 : $day = 'wednesday'; | |||||
break; | |||||
case 4 : $day = 'thursday'; | |||||
break; | |||||
case 5 : $day = 'friday'; | |||||
break; | |||||
case 6 : $day = 'saturday'; | |||||
break; | |||||
case 7 : $day = 'sunday'; | |||||
break; | |||||
} | |||||
if ($s->$day) { | |||||
$arrSubscriptions[] = $s; | |||||
} | |||||
} | |||||
} | |||||
} | |||||
return $arrSubscriptions; | |||||
} | |||||
} |
* @return mixed | * @return mixed | ||||
*/ | */ | ||||
public function actionIndex() | public function actionIndex() | ||||
{ | |||||
{ | |||||
return $this->render('index'); | return $this->render('index'); | ||||
} | } | ||||