namespace common\models; | namespace common\models; | ||||
use common\helpers\Debug; | |||||
use common\helpers\GlobalParam; | |||||
use common\helpers\Price; | |||||
use Yii; | use Yii; | ||||
use yii\helpers\Html; | use yii\helpers\Html; | ||||
use common\models\Producer; | use common\models\Producer; | ||||
use common\components\ActiveRecordCommon; | use common\components\ActiveRecordCommon; | ||||
use yii\web\NotFoundHttpException; | |||||
/** | /** | ||||
* This is the model class for table "order". | * This is the model class for table "order". | ||||
*/ | */ | ||||
public function initAmount() | public function initAmount() | ||||
{ | { | ||||
$this->amount = 0 ; | |||||
$this->weight = 0 ; | |||||
$this->amount = 0; | |||||
$this->weight = 0; | |||||
if (isset($this->productOrder)) { | if (isset($this->productOrder)) { | ||||
foreach ($this->productOrder as $productOrder) { | foreach ($this->productOrder as $productOrder) { | ||||
$this->amount += $productOrder->price * $productOrder->quantity; | |||||
$this->amount += Price::getPriceWithTax($productOrder->price, $productOrder->taxRate->value) * $productOrder->quantity; | |||||
if ($productOrder->unit == 'piece') { | if ($productOrder->unit == 'piece') { | ||||
if (isset($productOrder->product)) { | if (isset($productOrder->product)) { | ||||
$this->weight += ($productOrder->quantity * $productOrder->product->weight) / 1000; | $this->weight += ($productOrder->quantity * $productOrder->product->weight) / 1000; | ||||
} | } | ||||
} | } | ||||
/** | |||||
* Changement de statut d'une commande | |||||
* | |||||
* @param $newStatus | |||||
*/ | |||||
public function changeOrderStatus($newStatus, $origin) | |||||
{ | |||||
$orderStatusArray = GlobalParam::get('orderStatus'); | |||||
switch ($newStatus) { | |||||
case 'new-order' : | |||||
$this->addOrderStatusHistory($newStatus, $origin); | |||||
$this->status = $newStatus; | |||||
$this->save(); | |||||
break; | |||||
case 'waiting-paiement-on-delivery': | |||||
if(in_array($newStatus, $orderStatusArray[$this->status]['nextStatusAllow'])){ | |||||
$this->addOrderStatusHistory($newStatus, $origin); | |||||
$this->status = $newStatus; | |||||
$this->save(); | |||||
} | |||||
break; | |||||
case 'waiting-paiement-by-credit': | |||||
if(in_array($newStatus, $orderStatusArray[$this->status]['nextStatusAllow'])){ | |||||
$this->addOrderStatusHistory($newStatus, $origin); | |||||
$this->status = $newStatus; | |||||
$this->save(); | |||||
} | |||||
break; | |||||
case 'paid-by-credit': | |||||
if(in_array($newStatus, $orderStatusArray[$this->status]['nextStatusAllow'])){ | |||||
$this->addOrderStatusHistory($newStatus, $origin); | |||||
$this->status = $newStatus; | |||||
$this->save(); | |||||
} | |||||
break; | |||||
case 'waiting-delevery' : | |||||
if(in_array($newStatus, $orderStatusArray[$this->status]['nextStatusAllow'])){ | |||||
$this->addOrderStatusHistory($newStatus, $origin); | |||||
$this->status = $newStatus; | |||||
$this->save(); | |||||
} | |||||
break; | |||||
case 'delivered': | |||||
if(in_array($newStatus, $orderStatusArray[$this->status]['nextStatusAllow'])){ | |||||
$this->addOrderStatusHistory($newStatus, $origin); | |||||
$this->status = $newStatus; | |||||
$this->save(); | |||||
} | |||||
break; | |||||
case 'refunded': | |||||
if(in_array($newStatus, $orderStatusArray[$this->status]['nextStatusAllow'])){ | |||||
$this->addOrderStatusHistory($newStatus, $origin); | |||||
$this->status = $newStatus; | |||||
$this->save(); | |||||
} | |||||
break; | |||||
case 'cancel': | |||||
if(in_array($newStatus, $orderStatusArray[$this->status]['nextStatusAllow'])){ | |||||
$this->addOrderStatusHistory($newStatus, $origin); | |||||
$this->status = $newStatus; | |||||
$this->save(); | |||||
} | |||||
break; | |||||
default: | |||||
throw new NotFoundHttpException('Statut de commande inconnu.'); | |||||
break; | |||||
} | |||||
} | |||||
public function addOrderStatusHistory($newStatus,$origin) | |||||
{ | |||||
$orderStatusHistory = new OrderStatusHistory(); | |||||
$orderStatusHistory->id_user = User::getCurrentId(); | |||||
$orderStatusHistory->id_order = $this->id; | |||||
$orderStatusHistory->status = $newStatus; | |||||
$orderStatusHistory->origin = $origin; | |||||
$orderStatusHistory->date = date('Y-m-d H:i:s'); | |||||
$orderStatusHistory->save(); | |||||
} | |||||
/** | /** | ||||
* Retourne le montant de la commande (total, payé, restant, ou en surplus). | * Retourne le montant de la commande (total, payé, restant, ou en surplus). | ||||
* | * |
public function rules() | public function rules() | ||||
{ | { | ||||
return [ | return [ | ||||
[['id_order', 'status', 'id_user',], 'integer'], | |||||
[['id_order', 'status', 'id_user', 'date', 'origin'], 'required'], | |||||
[['id_order', 'id_user',], 'integer'], | |||||
[['date'], 'safe'], | [['date'], 'safe'], | ||||
]; | ]; | ||||
} | } | ||||
'id_order' => 'Commande', | 'id_order' => 'Commande', | ||||
'id_user' => 'Utilisateur', | 'id_user' => 'Utilisateur', | ||||
'status' => 'Statut', | 'status' => 'Statut', | ||||
'origin' => 'Origine', | |||||
'date' => 'Date', | 'date' => 'Date', | ||||
]; | ]; | ||||
} | } | ||||
return $this->hasOne(User::className(), ['id' => 'id_order']); | return $this->hasOne(User::className(), ['id' => 'id_order']); | ||||
} | } | ||||
public function getOrderStatus() | |||||
{ | |||||
return $this->hasOne(OrderStatus::className(), ['id' => 'id_order_status']); | |||||
} | |||||
public function getUser() | public function getUser() | ||||
{ | { | ||||
return $this->hasOne(User::className(), ['id' => 'id_user']); | return $this->hasOne(User::className(), ['id' => 'id_user']); |
<?php | <?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. | |||||
*/ | |||||
/** | |||||
* 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; | namespace common\models; | ||||
use common\helpers\GlobalParam; | |||||
use Yii; | use Yii; | ||||
use common\components\ActiveRecordCommon ; | |||||
use common\components\ActiveRecordCommon; | |||||
/** | /** | ||||
* This is the model class for table "product_order". | * This is the model class for table "product_order". | ||||
class ProductOrder extends ActiveRecordCommon | class ProductOrder extends ActiveRecordCommon | ||||
{ | { | ||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public static function tableName() | |||||
{ | |||||
return 'product_order'; | |||||
} | |||||
/* | |||||
* Relations | |||||
*/ | |||||
public function getProduct() | |||||
{ | |||||
return $this->hasOne(Product::className(), ['id' => 'id_product']); | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function rules() | |||||
{ | |||||
return [ | |||||
[['id_order', 'id_product', 'quantity'], 'required'], | |||||
[['id_order', 'id_product', 'id_tax_rate'], 'integer'], | |||||
[['unit'], 'string', 'max' => 255], | |||||
[['quantity'], 'number', 'min' => 0], | |||||
[['description'], 'safe'] | |||||
]; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public static function tableName() | |||||
{ | |||||
return 'product_order'; | |||||
} | |||||
/* | |||||
* Relations | |||||
*/ | |||||
public function getProduct() | |||||
{ | |||||
return $this->hasOne(Product::className(), ['id' => 'id_product']); | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function rules() | |||||
{ | |||||
return [ | |||||
[['id_order', 'id_product', 'quantity'], 'required'], | |||||
[['id_order', 'id_product', 'id_tax_rate'], 'integer'], | |||||
[['unit'], 'string', 'max' => 255], | |||||
[['quantity'], 'number', 'min' => 0], | |||||
[['description'], 'safe'] | |||||
]; | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function attributeLabels() | |||||
{ | |||||
return [ | |||||
'id' => 'ID', | |||||
'id_order' => 'Commande', | |||||
'id_product' => 'Product', | |||||
'quantity' => 'Quantité', | |||||
'unit' => 'Unité', | |||||
'id_tax_rate' => 'Taxe', | |||||
'description' => 'Description' | |||||
]; | |||||
} | |||||
/** | |||||
* Retourne les options de base nécessaires à la fonction de recherche. | |||||
* | |||||
* @return array | |||||
*/ | |||||
public static function defaultOptionsSearch() | |||||
{ | |||||
return [ | |||||
'with' => ['taxRate'], | |||||
'join_with' => [], | |||||
'orderby' => '', | |||||
'attribute_id_producer' => '' | |||||
]; | |||||
} | |||||
public function afterFind() { | |||||
if ($this->taxRate == null) { | |||||
$this->populateRelation('taxRate', GlobalParam::getCurrentProducer()->taxRate); | |||||
} | |||||
parent::afterFind(); | |||||
} | |||||
public function getTaxRate() | |||||
{ | |||||
return $this->hasOne(TaxRate::className(), ['id' => 'id_tax_rate']); | |||||
} | |||||
/** | |||||
* @inheritdoc | |||||
*/ | |||||
public function attributeLabels() | |||||
{ | |||||
return [ | |||||
'id' => 'ID', | |||||
'id_order' => 'Commande', | |||||
'id_product' => 'Product', | |||||
'quantity' => 'Quantité', | |||||
'unit' => 'Unité', | |||||
'id_tax_rate' => 'Taxe', | |||||
'description' => 'Description' | |||||
]; | |||||
} | |||||
/** | |||||
* Retourne les options de base nécessaires à la fonction de recherche. | |||||
* | |||||
* @return array | |||||
*/ | |||||
public static function defaultOptionsSearch() { | |||||
return [ | |||||
'with' => [], | |||||
'join_with' => [], | |||||
'orderby' => '', | |||||
'attribute_id_producer' => '' | |||||
] ; | |||||
} | |||||
} | } |
<?php | |||||
use yii\db\Migration; | |||||
use yii\db\Schema; | |||||
class m200109_152833_module_bl_devis_factures_order_status_history_add_origin extends Migration | |||||
{ | |||||
public function safeUp() | |||||
{ | |||||
$this->addColumn('order_status_history', 'origin', Schema::TYPE_STRING); | |||||
} | |||||
public function safeDown() | |||||
{ | |||||
$this->dropColumn('order_status_history', 'origin'); | |||||
} | |||||
} |
$order = new Order; | $order = new Order; | ||||
$order->load(Yii::$app->request->post()); | $order->load(Yii::$app->request->post()); | ||||
$order->id_user = User::getCurrentId(); | $order->id_user = User::getCurrentId(); | ||||
$order->status = 'tmp-order'; | |||||
$order->date = date('Y-m-d H:i:s'); | $order->date = date('Y-m-d H:i:s'); | ||||
$order->origin = Order::ORIGIN_USER; | $order->origin = Order::ORIGIN_USER; | ||||
} | } | ||||
// sauvegarde de la commande | // sauvegarde de la commande | ||||
$order->save(); | $order->save(); | ||||
$order->changeOrderStatus('new-order', 'user'); | |||||
// ajout de l'utilisateur à l'établissement | // ajout de l'utilisateur à l'établissement | ||||
Producer::addUser(User::getCurrentId(), $distribution->id_producer); | Producer::addUser(User::getCurrentId(), $distribution->id_producer); | ||||
$productOrder->id_product = $product->id; | $productOrder->id_product = $product->id; | ||||
$productOrder->price = $product->price; | $productOrder->price = $product->price; | ||||
$productOrder->id_tax_rate = $product->id_tax_rate; | |||||
$unit = (!is_null($order) && isset($unitsArray[$product->id])) ? $unitsArray[$product->id] : $product->unit; | $unit = (!is_null($order) && isset($unitsArray[$product->id])) ? $unitsArray[$product->id] : $product->unit; | ||||
$coefficient = Product::$unitsArray[$unit]['coefficient']; | $coefficient = Product::$unitsArray[$unit]['coefficient']; | ||||
$creditFunctioning == Producer::CREDIT_FUNCTIONING_MANDATORY || | $creditFunctioning == Producer::CREDIT_FUNCTIONING_MANDATORY || | ||||
($creditFunctioning == Producer::CREDIT_FUNCTIONING_USER && $userProducer->credit_active) | ($creditFunctioning == Producer::CREDIT_FUNCTIONING_USER && $userProducer->credit_active) | ||||
)) { | )) { | ||||
$order->changeOrderStatus('waiting-paiement-by-credit', 'user'); | |||||
// à payer | // à payer | ||||
if ($order->getPaymentStatus() == Order::PAYMENT_UNPAID) { | if ($order->getPaymentStatus() == Order::PAYMENT_UNPAID) { | ||||
User::getCurrentId(), | User::getCurrentId(), | ||||
User::getCurrentId() | User::getCurrentId() | ||||
); | ); | ||||
$order->changeOrderStatus('paid-by-credit', 'user'); | |||||
}else{ | |||||
$order->changeOrderStatus('waiting-paiement-on-delivery', 'user'); | |||||
} | } | ||||
} // surplus à rembourser | } // surplus à rembourser | ||||
elseif ($order->getPaymentStatus() == Order::PAYMENT_SURPLUS) { | elseif ($order->getPaymentStatus() == Order::PAYMENT_SURPLUS) { | ||||
User::getCurrentId() | User::getCurrentId() | ||||
); | ); | ||||
} | } | ||||
}else{ | |||||
$order->changeOrderStatus('waiting-paiement-on-delivery', 'user'); | |||||
} | } | ||||
} | } | ||||
if ($order && User::getCurrentId() == $order->id_user) { | if ($order && User::getCurrentId() == $order->id_user) { | ||||
$order->delete(); | $order->delete(); | ||||
$order->changeOrderStatus('canceled', 'user'); | |||||
Yii::$app->session->setFlash('success', 'Votre commande a bien été annulée.'); | Yii::$app->session->setFlash('success', 'Votre commande a bien été annulée.'); | ||||
} | } | ||||