You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

414 lines
12KB

  1. <?php
  2. namespace common\models;
  3. use Yii;
  4. use yii\helpers\Html ;
  5. use common\models\Etablissement ;
  6. /**
  7. * This is the model class for table "commande".
  8. *
  9. * @property integer $id
  10. * @property integer $id_user
  11. * @property string $date
  12. * @property string $date_update
  13. * @property integer $id_point_vente
  14. * @property integer $id_production
  15. */
  16. class Commande extends \yii\db\ActiveRecord
  17. {
  18. var $montant = 0 ;
  19. var $montant_pain = 0 ;
  20. var $montant_vrac = 0 ;
  21. var $montant_paye = 0 ;
  22. var $poids_pain = 0 ;
  23. var $poids_vrac = 0 ;
  24. const TYPE_AUTO = 'auto' ;
  25. const TYPE_USER = 'user' ;
  26. const TYPE_ADMIN = 'admin' ;
  27. const STATUT_PAYEE = 'payee' ;
  28. const STATUT_IMPAYEE = 'impayee' ;
  29. const STATUT_SURPLUS = 'surplus' ;
  30. const ETAT_MODIFIABLE = 'ouverte' ;
  31. const ETAT_PREPARATION = 'preparation' ;
  32. const ETAT_LIVREE = 'livree' ;
  33. /**
  34. * @inheritdoc
  35. */
  36. public static function tableName()
  37. {
  38. return 'commande';
  39. }
  40. public function init() {
  41. if(isset($this->commandeProduits))
  42. {
  43. foreach($this->commandeProduits as $p)
  44. {
  45. if(isset($p->produit) && $p->produit->vrac)
  46. {
  47. $this->montant_vrac += $p->prix * $p->quantite/1000 ;
  48. $this->poids_vrac += $p->quantite/1000 ;
  49. }
  50. else {
  51. $this->montant_pain += $p->prix * $p->quantite ;
  52. if(isset($p->produit))
  53. $this->poids_pain += $p->quantite * $p->produit->poids/1000 ;
  54. }
  55. }
  56. $this->montant = $this->montant_vrac + $this->montant_pain ;
  57. }
  58. if(isset($this->creditHistorique) && !$this->montant_paye)
  59. {
  60. foreach($this->creditHistorique as $ch)
  61. {
  62. if($ch->type == CreditHistorique::TYPE_PAIEMENT)
  63. $this->montant_paye += $ch->montant ;
  64. elseif($ch->type == CreditHistorique::TYPE_REMBOURSEMENT)
  65. $this->montant_paye -= $ch->montant ;
  66. }
  67. }
  68. }
  69. public static function getQuantiteProduit($id_produit, $commandes) {
  70. $quantite = 0 ;
  71. if(isset($commandes) && is_array($commandes) && count($commandes)) {
  72. foreach($commandes as $c) {
  73. foreach($c->commandeProduits as $cp) {
  74. if($cp->id_produit == $id_produit)
  75. $quantite += $cp->quantite ;
  76. }
  77. }
  78. }
  79. return $quantite ;
  80. }
  81. /*
  82. * relations
  83. */
  84. public function getUser() {
  85. return $this->hasOne(User::className(), ['id'=>'id_user']) ;
  86. }
  87. public function getCommandeProduits() {
  88. return $this->hasMany(CommandeProduit::className(), ['id_commande'=>'id'])->with('produit') ;
  89. }
  90. public function getProduction() {
  91. return $this->hasOne(Production::className(), ['id'=>'id_production'])->with('etablissement') ;
  92. }
  93. public function getPointVente() {
  94. return $this->hasOne(PointVente::className(), ['id'=>'id_point_vente'])->with('pointVenteUser') ;
  95. }
  96. public function getCreditHistorique()
  97. {
  98. return $this->hasMany(CreditHistorique::className(), ['id_commande'=>'id']) ;
  99. }
  100. /**
  101. * @inheritdoc
  102. */
  103. public function rules()
  104. {
  105. return [
  106. [['id_user', 'date', 'id_point_vente','id_production'], 'required','message'=>''],
  107. [['id_user', 'id_point_vente', 'id_production'], 'integer'],
  108. [['date', 'date_update','commentaire', 'commentaire_point_vente'], 'safe']
  109. ];
  110. }
  111. /**
  112. * @inheritdoc
  113. */
  114. public function attributeLabels()
  115. {
  116. return [
  117. 'id' => 'ID',
  118. 'id_user' => 'Id User',
  119. 'date' => 'Date',
  120. 'date_update' => 'Date Update',
  121. 'id_point_vente' => 'Point de vente',
  122. 'id_production' => 'Date de production',
  123. ];
  124. }
  125. public function strListeVrac()
  126. {
  127. $str = '' ;
  128. foreach($this->commandeProduits as $cp) {
  129. if($cp->produit->vrac) {
  130. $str .= $cp->quantite.'&nbsp;'.Html::encode($cp->produit->diminutif).', ' ;
  131. }
  132. }
  133. return substr($str, 0, strlen($str) - 2) ;
  134. }
  135. public function getMontantPaye()
  136. {
  137. if($this->montant_paye)
  138. {
  139. return $this->montant_paye ;
  140. }
  141. else {
  142. $historique = CreditHistorique::find()
  143. ->where(['id_commande' => $this->id])
  144. ->all() ;
  145. $montant = 0 ;
  146. foreach($historique as $ch)
  147. {
  148. if($ch->type == CreditHistorique::TYPE_PAIEMENT)
  149. $montant += $ch->montant ;
  150. elseif($ch->type == CreditHistorique::TYPE_REMBOURSEMENT)
  151. $montant -= $ch->montant ;
  152. }
  153. return $montant ;
  154. }
  155. }
  156. public function getMontant($format = false)
  157. {
  158. if($format)
  159. return number_format($this->getMontant(),2).' €' ;
  160. else
  161. return $this->montant ;
  162. }
  163. public function getMontantFormat()
  164. {
  165. return number_format($this->getMontant(),2).' €' ;
  166. }
  167. public function getMontantRestant($format = false)
  168. {
  169. $montant_restant = $this->getMontant() - $this->getMontantPaye() ;
  170. if($format)
  171. return number_format($montant_restant, 2).' €';
  172. else
  173. return $montant_restant ;
  174. }
  175. public function getMontantSurplus($format = false)
  176. {
  177. $montant_surplus = $this->getMontantPaye() - $this->getMontant() ;
  178. if($format)
  179. return number_format($montant_surplus, 2).' €';
  180. else
  181. return $montant_surplus ;
  182. }
  183. public function getDataJson()
  184. {
  185. $commande = Commande::find()->with('commandeProduits')->where(['id' => $this->id])->one() ;
  186. $commande->init() ;
  187. $json_commande = [
  188. 'produits'=> [],
  189. 'montant' => $commande->montant,
  190. 'str_montant' => $commande->getMontantFormat(),
  191. 'montant_paye' => $commande->getMontantPaye(),
  192. 'commentaire' => $commande->commentaire,
  193. ] ;
  194. foreach($commande->commandeProduits as $commande_produit)
  195. {
  196. $json_commande['produits'][$commande_produit->id_produit] = $commande_produit->quantite ;
  197. }
  198. return json_encode($json_commande) ;
  199. }
  200. public function creditHistorique($type, $montant, $id_etablissement, $id_user)
  201. {
  202. $credit_historique = new CreditHistorique ;
  203. $credit_historique->id_user = $this->id_user ;
  204. $credit_historique->id_commande = $this->id ;
  205. $credit_historique->montant = $montant ;
  206. $credit_historique->type = $type ;
  207. $credit_historique->id_etablissement = $id_etablissement ;
  208. $credit_historique->id_user_action = $id_user ;
  209. $credit_historique->save() ;
  210. }
  211. public function getStatutPaiement()
  212. {
  213. // payé
  214. if($this->montant - $this->montant_paye < 0.001)
  215. {
  216. return self::STATUT_PAYEE ;
  217. }
  218. // reste à payer
  219. elseif($this->montant - $this->montant_paye > 0.01)
  220. {
  221. return self::STATUT_IMPAYEE ;
  222. }
  223. // à rembourser
  224. elseif($this->montant - $this->montant_paye < 0.01)
  225. {
  226. return self::STATUT_SURPLUS ;
  227. }
  228. }
  229. public function getResumePanier()
  230. {
  231. if(!isset($this->commandeProduits))
  232. $this->commandeProduits = CommandeProduit::find()->where(['id_commande' => $this->id])->all() ;
  233. $html = '' ;
  234. $count = count($this->commandeProduits);
  235. $i = 0;
  236. foreach($this->commandeProduits as $p)
  237. {
  238. if(isset($p->produit))
  239. {
  240. $html .= $p->quantite.' x '.Html::encode($p->produit->nom) ;
  241. if(++$i != $count) $html .= '<br />' ;
  242. }
  243. }
  244. return $html ;
  245. }
  246. public function getResumePointVente()
  247. {
  248. $html = '' ;
  249. if(isset($this->pointVente))
  250. {
  251. $html .= '<span class="nom-point-vente">'.Html::encode($this->pointVente->nom) .'</span>'
  252. . '<br /><span class="localite">'.Html::encode($this->pointVente->localite).'</span>' ;
  253. if(strlen($this->commentaire_point_vente))
  254. {
  255. $html .= '<div class="commentaire"><span>'.Html::encode($this->commentaire_point_vente).'</span></div>' ;
  256. }
  257. }
  258. else {
  259. $html .= 'Point de vente supprimé' ;
  260. }
  261. return $html ;
  262. }
  263. public function getStrMontant()
  264. {
  265. return number_format($this->montant,2).' €' ;
  266. }
  267. public function getResumeMontant()
  268. {
  269. $html = '' ;
  270. $html .= $this->getStrMontant().'<br />' ;
  271. if($this->montant_paye)
  272. {
  273. if($this->getStatutPaiement() == Commande::STATUT_PAYEE)
  274. {
  275. $html .= '<span class="label label-success">Payée</span>' ;
  276. }
  277. elseif($this->getStatutPaiement() == Commande::STATUT_IMPAYEE)
  278. {
  279. $html .= '<span class="label label-danger">Non payée</span><br />
  280. Reste <strong>'.$this->getMontantRestant(true).'</strong> à payer' ;
  281. }
  282. elseif($this->getStatutPaiement() == Commande::STATUT_SURPLUS)
  283. {
  284. $html .= '<span class="label label-success">Payée</span>' ;
  285. }
  286. }
  287. else {
  288. $html .= '<span class="label label-default">À régler sur place</span>' ;
  289. }
  290. return $html ;
  291. }
  292. public function getStrUser()
  293. {
  294. if(isset($this->user))
  295. {
  296. return Html::encode($this->user->prenom.' '.$this->user->nom) ;
  297. }
  298. elseif(strlen($this->username)) {
  299. return Html::encode($this->username) ;
  300. }
  301. else {
  302. return 'Client introuvable' ;
  303. }
  304. }
  305. public static function findBy($params = [])
  306. {
  307. if(!isset($params['id_etablissement']))
  308. $params['id_etablissement'] = Yii::$app->user->identity->id_etablissement ;
  309. $commandes = Commande::find()
  310. ->with('commandeProduits', 'user', 'creditHistorique', 'pointVente')
  311. ->joinWith('production')
  312. ->where(['production.id_etablissement' => $params['id_etablissement']]) ;
  313. if(isset($params['date']))
  314. $commandes = $commandes->andWhere(['production.date' => $params['date']]);
  315. if(isset($params['order']))
  316. $commandes = $commandes->orderBy('date '.$params['order']);
  317. else
  318. $commandes = $commandes->orderBy('date ASC');
  319. if(isset($params['limit']))
  320. $commandes = $commandes->limit($params['limit']) ;
  321. $commandes = $commandes->all() ;
  322. return $commandes ;
  323. }
  324. public function getEtat()
  325. {
  326. $delai_commande = Etablissement::getConfig('delai_commande',$this->production->id_etablissement) ;
  327. $heure_limite = Etablissement::getConfig('heure_limite_commande',$this->production->id_etablissement) ;
  328. $date_commande = strtotime($this->production->date) ;
  329. $date_today = strtotime(date('Y-m-d'));
  330. $heure_today = date('G') ;
  331. $nb_jours = (int) (($date_commande - $date_today) / (24 * 60 * 60)) ;
  332. if($nb_jours <= 0)
  333. {
  334. return self::ETAT_LIVREE ;
  335. }
  336. elseif($nb_jours >= $delai_commande &&
  337. ($nb_jours != $delai_commande ||
  338. ($nb_jours == $delai_commande && $heure_today < $heure_limite)))
  339. {
  340. return self::ETAT_MODIFIABLE ;
  341. }
  342. return self::ETAT_PREPARATION ;
  343. }
  344. }