hasOne(User::className(), ['id' => 'id_user']);
}
public function getCommandeProduits()
{
return $this->hasMany(CommandeProduit::className(),['id_commande' => 'id'])
->with('produit');
}
public function getProduction()
{
return $this->hasOne(Production::className(), ['id' => 'id_production'])
->with('etablissement');
}
public function getPointVente()
{
return $this->hasOne(PointVente::className(), ['id' => 'id_point_vente'])
->with('pointVenteUser');
}
public function getCreditHistorique()
{
return $this->hasMany(CreditHistorique::className(), ['id_commande' => 'id']);
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['id_user', 'date', 'id_point_vente', 'id_production'], 'required', 'message' => ''],
[['id_user', 'id_point_vente', 'id_production'], 'integer'],
[['paiement_automatique'], 'boolean'],
[['date', 'date_update', 'commentaire', 'commentaire_point_vente'], 'safe']
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'id_user' => 'Id User',
'date' => 'Date',
'date_update' => 'Date Update',
'id_point_vente' => 'Point de vente',
'id_production' => 'Date de production',
];
}
/**
* Initialise le montant total, le montant déjà payé et le poids de la
* commande
*/
public function init()
{
// Montant
if (isset($this->commandeProduits)) {
foreach ($this->commandeProduits as $p) {
if ($p->mode_vente == 'unite') {
$this->montant += $p->prix * $p->quantite;
if(isset($p->produit)) {
$this->poids += ($p->quantite * $p->produit->poids) / 1000 ;
}
}
elseif ($p->mode_vente == 'poids') {
$this->montant += $p->prix * $p->quantite / 1000;
}
}
}
// Montant payé
if (isset($this->creditHistorique) && !$this->montant_paye) {
foreach ($this->creditHistorique as $ch) {
if ($ch->type == CreditHistorique::TYPE_PAIEMENT) {
$this->montant_paye += $ch->montant;
}
elseif ($ch->type == CreditHistorique::TYPE_REMBOURSEMENT) {
$this->montant_paye -= $ch->montant;
}
}
}
}
/**
* Retourne la quantité d'un produit donné de plusieurs commandes.
*
* @param integer $id_produit
* @param array $commandes
*
* @return integer
*/
public static function getQuantiteProduit($id_produit, $commandes)
{
$quantite = 0;
if (isset($commandes) && is_array($commandes) && count($commandes)) {
foreach ($commandes as $c) {
if(is_null($c->date_delete)) {
foreach ($c->commandeProduits as $cp) {
if ($cp->id_produit == $id_produit) {
$quantite += $cp->quantite;
}
}
}
}
}
return $quantite;
}
/**
* Retourne le montant payé de la commande.
*
* @return float
*/
public function getMontantPaye()
{
if ($this->montant_paye) {
return $this->montant_paye;
}
else {
$historique = CreditHistorique::find()
->where(['id_commande' => $this->id])
->all();
$montant = 0;
foreach ($historique as $ch) {
if ($ch->type == CreditHistorique::TYPE_PAIEMENT) {
$montant += $ch->montant;
}
elseif ($ch->type == CreditHistorique::TYPE_REMBOURSEMENT) {
$montant -= $ch->montant;
}
}
return $montant;
}
}
/**
* Retourne le montant de la commande.
*
* @param boolean $format
* @return float
*/
public function getMontant($format = false)
{
if ($format) {
return number_format($this->getMontant(), 2) . ' €';
}
else {
return $this->montant;
}
}
/**
* Retourne le montant restant à payer.
*
* @param boolean $format
* @return float
*/
public function getMontantRestant($format = false)
{
$montant_restant = $this->getMontant() - $this->getMontantPaye();
if ($format) {
return number_format($montant_restant, 2) . ' €';
}
else {
return $montant_restant;
}
}
/**
* Retourne le montant payé en surplus.
*
* @param boolean $format
* @return float
*/
public function getMontantSurplus($format = false)
{
$montant_surplus = $this->getMontantPaye() - $this->getMontant();
if ($format) {
return number_format($montant_surplus, 2) . ' €';
}
else {
return $montant_surplus;
}
}
/**
* Retourne les informations relatives à la commande au format JSON.
*
* @return string
*/
public function getDataJson()
{
$commande = Commande::find()->with('commandeProduits')->where(['id' => $this->id])->one();
$commande->init();
$json_commande = [
'produits' => [],
'montant' => $commande->montant,
'str_montant' => $commande->getMontant(true),
'montant_paye' => $commande->getMontantPaye(),
'commentaire' => $commande->commentaire,
];
foreach ($commande->commandeProduits as $commande_produit) {
$json_commande['produits'][$commande_produit->id_produit] = $commande_produit->quantite;
}
return json_encode($json_commande);
}
/**
* Enregistre un modèle de type CreditHistorique.
*
* @param string $type
* @param float $montant
* @param integer $id_etablissement
* @param integer $id_user
* @param integer $id_user_action
*/
public function creditHistorique($type, $montant, $id_etablissement, $id_user, $id_user_action)
{
$credit_historique = new CreditHistorique;
$credit_historique->id_user = $this->id_user;
$credit_historique->id_commande = $this->id;
$credit_historique->montant = $montant;
$credit_historique->type = $type;
$credit_historique->id_etablissement = $id_etablissement;
$credit_historique->id_user_action = $id_user_action;
$credit_historique->populateRelation('commande', $this) ;
$credit_historique->populateRelation('user', User::find()->where(['id' => $this->id_user])->one()) ;
$credit_historique->save();
}
/**
* Retourne le statut de paiement de la commande (payée, surplus, ou impayée).
*
* @return string
*/
public function getStatutPaiement()
{
// payé
if ($this->getMontant() - $this->getMontantPaye() < 0.01 &&
$this->getMontant() - $this->getMontantPaye() >= 0)
{
return self::STATUT_PAYEE;
}
// à rembourser
elseif ($this->getMontant() - $this->getMontantPaye() <= -0.01) {
return self::STATUT_SURPLUS;
}
// reste à payer
elseif ($this->getMontant() - $this->getMontantPaye() >= 0.01) {
return self::STATUT_IMPAYEE;
}
}
/**
* Retourne le résumé du panier au format HTML.
*
* @return string
*/
public function getResumePanier()
{
if (!isset($this->commandeProduits)) {
$this->commandeProduits = CommandeProduit::find()->where(['id_commande' => $this->id])->all();
}
$html = '';
$count = count($this->commandeProduits);
$i = 0;
foreach ($this->commandeProduits as $p) {
if (isset($p->produit)) {
$html .= $p->quantite . ' x ' . Html::encode($p->produit->nom);
if (++$i != $count) {
$html .= '
';
}
}
}
return $html;
}
/**
* Retourne le résumé du point de vente lié à la commande au format HTML.
*
* @return string
*/
public function getResumePointVente()
{
$html = '';
if (isset($this->pointVente)) {
$html .= '' . Html::encode($this->pointVente->nom) . ''
. '
' . Html::encode($this->pointVente->localite) . '';
if (strlen($this->commentaire_point_vente)) {
$html .= '