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.

258 lines
8.1KB

  1. <?php
  2. namespace common\models;
  3. use Yii;
  4. use common\helpers\Departements ;
  5. use yii\helpers\Html ;
  6. /**
  7. * This is the model class for table "etablissement".
  8. *
  9. * @property integer $id
  10. * @property string $nom
  11. * @property string $siret
  12. * @property string $logo
  13. * @property string $photo
  14. * @property string $description
  15. * @property string $code_postal
  16. * @property string $ville
  17. */
  18. class Etablissement extends \yii\db\ActiveRecord
  19. {
  20. const PAIEMENT_OK = 'ok' ;
  21. const PAIEMENT_ESSAI = 'essai' ;
  22. const PAIEMENT_ESSAI_TERMINE = 'essai-terminee' ;
  23. const PAIEMENT_RETARD = 'retard-paiement' ;
  24. /**
  25. * @inheritdoc
  26. */
  27. public static function tableName()
  28. {
  29. return 'etablissement';
  30. }
  31. /**
  32. * @inheritdoc
  33. */
  34. public function rules()
  35. {
  36. return [
  37. [['nom', 'siret', 'heure_limite_commande','delai_commande'], 'required'],
  38. [['heure_limite_commande','delai_commande'],'integer'],
  39. ['heure_limite_commande','in', 'range' => [8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]],
  40. ['delai_commande','in', 'range' => [1,2,3,4,5,6,7]],
  41. ['code', function($attribute, $params)
  42. {
  43. $code = $this->$attribute ;
  44. $etablissement = Etablissement::findOne(['code' => $code]) ;
  45. if($etablissement && $etablissement->id != $this->id)
  46. {
  47. $this->addError($attribute, 'Ce code est déjà utilisé par un autre producteur.');
  48. }
  49. }],
  50. [['description','infos_commande'], 'string'],
  51. [['solde_negatif', 'credit_pain','actif'], 'boolean'],
  52. [['nom', 'siret', 'logo', 'photo', 'code_postal', 'ville','code'], 'string', 'max' => 255],
  53. ['prix_libre','double'],
  54. ['prix_libre', 'compare', 'compareValue' => 0, 'operator' => '>=', 'type' => 'number','message' => 'Prix libre doit être supérieur ou égal à 0'],
  55. ];
  56. }
  57. /**
  58. * @inheritdoc
  59. */
  60. public function attributeLabels()
  61. {
  62. return [
  63. 'id' => 'ID',
  64. 'nom' => 'Nom',
  65. 'siret' => 'Siret',
  66. 'logo' => 'Logo',
  67. 'photo' => 'Photo',
  68. 'description' => 'Description',
  69. 'code_postal' => 'Code postal',
  70. 'ville' => 'Ville',
  71. 'code' => 'Code',
  72. 'heure_limite_commande' => 'Heure limite de commande',
  73. 'delai_commande' => 'Délai de commande',
  74. 'solde_negatif' => 'Solde négatif',
  75. 'credit_pain' => 'Crédit pain',
  76. 'actif' => 'Actif',
  77. 'date_creation' => 'Date de création',
  78. 'infos_commande' => 'Informations'
  79. ];
  80. }
  81. public function getUserEtablissement()
  82. {
  83. return $this->hasMany(UserEtablissement::className(), ['id_etablissement' => 'id']) ;
  84. }
  85. public function getUser()
  86. {
  87. return $this->hasMany(User::className(), ['id_etablissement' => 'id']) ;
  88. }
  89. public static function getEtablissementsPopulateDropdown()
  90. {
  91. $etablissements_dispos = Etablissement::find()
  92. ->where(['actif' => 1])
  93. ->orderby('code_postal, ville ASC')
  94. ->all() ;
  95. $departements = Departements::get() ;
  96. $data_etablissements_dispos = [] ;
  97. $options_etablissements_dispos = [] ;
  98. foreach($etablissements_dispos as $e)
  99. {
  100. if($e->etatPaiement() == self::PAIEMENT_OK || $e->etatPaiement() == self::PAIEMENT_ESSAI)
  101. {
  102. if(!key_exists('d'. substr($e->code_postal, 0, 2), $data_etablissements_dispos))
  103. {
  104. $data_etablissements_dispos['d'. substr($e->code_postal, 0, 2)] = '<strong>'.$departements[substr($e->code_postal, 0, 2)].'</strong>' ;
  105. $options_etablissements_dispos['d'. substr($e->code_postal, 0, 2)] = ['disabled' => true] ;
  106. }
  107. $data_etablissements_dispos[$e->id] = '<span class="glyphicon glyphicon-lock"></span> '.Html::encode($e->nom).' - '.Html::encode($e->code_postal).' '.Html::encode($e->ville).' <span class="glyphicon glyphicon-lock"></span>' ;
  108. if(strlen($e->code))
  109. $options_etablissements_dispos[$e->id] = ['class' => 'lock'] ;
  110. }
  111. }
  112. return ['data' => $data_etablissements_dispos, 'options' => $options_etablissements_dispos] ;
  113. }
  114. public function etatPaiement()
  115. {
  116. $date_limite = strtotime($this->date_creation) + 30*24*60*60 ;
  117. $date = time() ;
  118. $date_paiement = strtotime($this->date_paiement) ;
  119. if($date < $date_paiement + 30*24*60*60 || $this->gratuit)
  120. {
  121. return 'ok' ;
  122. }
  123. else {
  124. if($date < $date_limite)
  125. {
  126. return 'essai' ;
  127. }
  128. else {
  129. if(!$this->date_paiement)
  130. return 'essai-terminee' ;
  131. else
  132. return 'retard-paiement' ;
  133. }
  134. }
  135. }
  136. public function getCA($periode = '', $format = false)
  137. {
  138. if(!$periode)
  139. $periode = date('Y-m') ;
  140. $connection = Yii::$app->getDb();
  141. $command = $connection->createCommand('
  142. SELECT SUM(IF(produit.vrac,0,commande_produit.prix * commande_produit.quantite)) AS CA
  143. FROM commande, commande_produit, production, produit
  144. WHERE commande.id = commande_produit.id_commande
  145. AND production.id_etablissement = :id_etablissement
  146. AND commande.id_production = production.id
  147. AND commande_produit.id_produit = produit.id
  148. AND production.date > :date_debut
  149. AND production.date < :date_fin',
  150. [
  151. ':date_debut' => date('Y-m-31', strtotime("-1 month", strtotime($periode))),
  152. ':date_fin' => date('Y-m-01', strtotime("+1 month", strtotime($periode))),
  153. ':id_etablissement' => $this->id
  154. ]);
  155. $result = $command->queryOne();
  156. $ca = $result['CA'] ;
  157. if($format)
  158. return number_format($ca, 2).' €' ;
  159. else
  160. return $ca ;
  161. }
  162. public function getMontantFacturer($periode = '', $ca = 0, $format = false)
  163. {
  164. if(!$periode)
  165. $periode = date('Y-m') ;
  166. if(!$ca)
  167. $ca = $this->getCA($periode) ;
  168. if($ca < 500)
  169. {
  170. $montant = 0 ;
  171. }
  172. else {
  173. $montant = $ca * 0.02 ;
  174. }
  175. if($format)
  176. {
  177. return number_format($montant, 2).' €' ;
  178. }
  179. else {
  180. return $montant ;
  181. }
  182. }
  183. public function getFacture($periode = '')
  184. {
  185. if(!$periode)
  186. $periode = date('Y-m', strtotime('-1 month')) ;
  187. $facture = Facture::find()
  188. ->where('id_etablissement = :id_etablissement')
  189. ->andWhere('periode = :periode')
  190. ->addParams([
  191. ':id_etablissement' => $this->id,
  192. ':periode' => $periode,
  193. ])
  194. ->one() ;
  195. return $facture ;
  196. }
  197. public function factureMoisDernier()
  198. {
  199. return $this->getFacture(date('Y-m', strtotime('-1 month'))) ;
  200. }
  201. public static function getConfig($config = '', $id_etablissement = 0)
  202. {
  203. if(strlen($config))
  204. {
  205. if(!$id_etablissement)
  206. $id_etablissement = Yii::$app->user->identity->id_etablissement ;
  207. $etablissement = self::findOne($id_etablissement) ;
  208. if($etablissement)
  209. {
  210. return $etablissement->$config ;
  211. }
  212. }
  213. return false ;
  214. }
  215. public function getPrixLibre()
  216. {
  217. if(!is_null($this->prix_libre))
  218. {
  219. return number_format($this->prix_libre, 2, ',', false).' €' ;
  220. }
  221. }
  222. }