@@ -38,10 +38,14 @@ | |||
namespace common\models; | |||
use common\helpers\Debug; | |||
use common\helpers\GlobalParam; | |||
use common\helpers\Price; | |||
use Yii; | |||
use yii\helpers\Html; | |||
use common\models\Producer; | |||
use common\components\ActiveRecordCommon; | |||
use yii\web\NotFoundHttpException; | |||
/** | |||
* This is the model class for table "order". | |||
@@ -205,12 +209,12 @@ class Order extends ActiveRecordCommon | |||
*/ | |||
public function initAmount() | |||
{ | |||
$this->amount = 0 ; | |||
$this->weight = 0 ; | |||
$this->amount = 0; | |||
$this->weight = 0; | |||
if (isset($this->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 (isset($productOrder->product)) { | |||
$this->weight += ($productOrder->quantity * $productOrder->product->weight) / 1000; | |||
@@ -277,6 +281,95 @@ class Order extends ActiveRecordCommon | |||
} | |||
} | |||
/** | |||
* 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). | |||
* |
@@ -29,7 +29,8 @@ class OrderStatusHistory extends ActiveRecordCommon | |||
public function rules() | |||
{ | |||
return [ | |||
[['id_order', 'status', 'id_user',], 'integer'], | |||
[['id_order', 'status', 'id_user', 'date', 'origin'], 'required'], | |||
[['id_order', 'id_user',], 'integer'], | |||
[['date'], 'safe'], | |||
]; | |||
} | |||
@@ -44,6 +45,7 @@ class OrderStatusHistory extends ActiveRecordCommon | |||
'id_order' => 'Commande', | |||
'id_user' => 'Utilisateur', | |||
'status' => 'Statut', | |||
'origin' => 'Origine', | |||
'date' => 'Date', | |||
]; | |||
} | |||
@@ -57,11 +59,6 @@ class OrderStatusHistory extends ActiveRecordCommon | |||
return $this->hasOne(User::className(), ['id' => 'id_order']); | |||
} | |||
public function getOrderStatus() | |||
{ | |||
return $this->hasOne(OrderStatus::className(), ['id' => 'id_order_status']); | |||
} | |||
public function getUser() | |||
{ | |||
return $this->hasOne(User::className(), ['id' => 'id_user']); |
@@ -1,45 +1,46 @@ | |||
<?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; | |||
use common\helpers\GlobalParam; | |||
use Yii; | |||
use common\components\ActiveRecordCommon ; | |||
use common\components\ActiveRecordCommon; | |||
/** | |||
* This is the model class for table "product_order". | |||
@@ -53,65 +54,79 @@ use common\components\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' => '' | |||
] ; | |||
} | |||
} |
@@ -0,0 +1,19 @@ | |||
<?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'); | |||
} | |||
} |
@@ -182,6 +182,7 @@ class OrderController extends ProducerBaseController | |||
$order = new Order; | |||
$order->load(Yii::$app->request->post()); | |||
$order->id_user = User::getCurrentId(); | |||
$order->status = 'tmp-order'; | |||
$order->date = date('Y-m-d H:i:s'); | |||
$order->origin = Order::ORIGIN_USER; | |||
} | |||
@@ -298,6 +299,7 @@ class OrderController extends ProducerBaseController | |||
// sauvegarde de la commande | |||
$order->save(); | |||
$order->changeOrderStatus('new-order', 'user'); | |||
// ajout de l'utilisateur à l'établissement | |||
Producer::addUser(User::getCurrentId(), $distribution->id_producer); | |||
@@ -324,6 +326,7 @@ class OrderController extends ProducerBaseController | |||
$productOrder->id_product = $product->id; | |||
$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; | |||
$coefficient = Product::$unitsArray[$unit]['coefficient']; | |||
@@ -358,6 +361,7 @@ class OrderController extends ProducerBaseController | |||
$creditFunctioning == Producer::CREDIT_FUNCTIONING_MANDATORY || | |||
($creditFunctioning == Producer::CREDIT_FUNCTIONING_USER && $userProducer->credit_active) | |||
)) { | |||
$order->changeOrderStatus('waiting-paiement-by-credit', 'user'); | |||
// à payer | |||
if ($order->getPaymentStatus() == Order::PAYMENT_UNPAID) { | |||
@@ -374,6 +378,9 @@ class OrderController extends ProducerBaseController | |||
User::getCurrentId(), | |||
User::getCurrentId() | |||
); | |||
$order->changeOrderStatus('paid-by-credit', 'user'); | |||
}else{ | |||
$order->changeOrderStatus('waiting-paiement-on-delivery', 'user'); | |||
} | |||
} // surplus à rembourser | |||
elseif ($order->getPaymentStatus() == Order::PAYMENT_SURPLUS) { | |||
@@ -386,6 +393,8 @@ class OrderController extends ProducerBaseController | |||
User::getCurrentId() | |||
); | |||
} | |||
}else{ | |||
$order->changeOrderStatus('waiting-paiement-on-delivery', 'user'); | |||
} | |||
} | |||
@@ -426,6 +435,7 @@ class OrderController extends ProducerBaseController | |||
if ($order && User::getCurrentId() == $order->id_user) { | |||
$order->delete(); | |||
$order->changeOrderStatus('canceled', 'user'); | |||
Yii::$app->session->setFlash('success', 'Votre commande a bien été annulée.'); | |||
} | |||