|
- <?php
-
- /**
- * Copyright Souke (2018)
- *
- * contact@souke.fr
- *
- * 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 domain\Order\Order;
-
- use common\components\ActiveRecordCommon;
- use domain\Distribution\Distribution\Distribution;
- use domain\Document\DeliveryNote\DeliveryNote;
- use domain\Document\Invoice\Invoice;
- use domain\Document\Quotation\Quotation;
- use domain\Order\OrderStatus\OrderStatus;
- use domain\Order\OrderStatusHistory\OrderStatusHistory;
- use domain\Order\ProductOrder\ProductOrder;
- use domain\Payment\Payment;
- use domain\PointSale\PointSale\PointSale;
- use domain\Subscription\Subscription\Subscription;
- use domain\User\User\User;
-
- class Order extends ActiveRecordCommon
- {
- protected OrderStatus $orderStatusObject;
-
- const EVENT_DELETE = 'order.event.delete';
-
- var $amount = 0;
- var $amount_with_tax = 0;
- var $amount_vat = [];
- var $invoice_amount = 0;
- var $invoice_amount_with_tax = 0;
- var $invoice_amount_vat = [];
- var $paid_amount = 0;
- var $weight = 0;
-
- const ORIGIN_AUTO = 'auto';
- const ORIGIN_USER = 'user';
- const ORIGIN_ADMIN = 'admin';
-
- const PAYMENT_PAID = 'paid';
- const PAYMENT_UNPAID = 'unpaid';
- const PAYMENT_SURPLUS = 'surplus';
-
- const INVOICE_AMOUNT_TOTAL = 'invoice-total';
- const AMOUNT_TOTAL = 'total';
- const AMOUNT_PAID = 'paid';
- const AMOUNT_REMAINING = 'remaining';
- const AMOUNT_SURPLUS = 'surplus';
-
- const STATE_OPEN = 'open';
- const STATE_PREPARATION = 'preparation';
- const STATE_DELIVERED = 'delivered';
-
-
- public function getOrderStatusAlias(): ?string
- {
- return $this->order_status_alias;
- }
-
- public function setOrderStatusAlias(string $orderStatusAlias): self
- {
- $this->order_status_alias = $orderStatusAlias;
- return $this;
- }
-
- public function getOrderStatus(): OrderStatus
- {
- return $this->orderStatusObject;
- }
-
- public function setOrderStatus(OrderStatus $orderStatus): self
- {
- $this->setOrderStatusAlias($orderStatus->getAlias());
- $this->orderStatusObject = $orderStatus;
- return $this;
- }
-
- public function getOrderStatusHistory(): array
- {
- return $this->orderStatusHistoryRelation;
- }
-
- /**
- * @inheritdoc
- */
- public static function tableName()
- {
- return 'order';
- }
-
- /**
- * @inheritdoc
- */
- public function rules()
- {
- return [
- [['id_user', 'date'], 'required', 'message' => ''],
- [
- [
- 'id_user',
- 'id_point_sale',
- 'id_distribution',
- 'id_subscription',
- 'id_invoice',
- 'id_quotation',
- 'id_delivery_note'
- ],
- 'integer'
- ],
- [['auto_payment', 'tiller_synchronization', 'delivery_home', 'ignore_when_invoicing'], 'boolean'],
- [['order_status_alias', 'reference', 'delivery_address', 'online_payment_url', 'tiller_external_id'], 'string'],
- [['date', 'date_update', 'comment', 'comment_point_sale', 'mean_payment', 'tiller_external_id'], 'safe']
- ];
- }
-
- /**
- * @inheritdoc
- */
- public function attributeLabels()
- {
- return [
- 'id' => 'ID',
- 'id_user' => 'Id User',
- 'date' => 'Date',
- 'date_update' => 'Date de modification',
- 'order_status_alias' => 'Statut',
- 'id_point_sale' => 'Point de vente',
- 'id_distribution' => 'Date de distribution',
- 'id_subscription' => 'Abonnement',
- 'id_invoice' => 'Facture',
- 'id_quotation' => 'Devis',
- 'id_delivery_note' => 'Bon de livraison',
- 'reference' => 'Référence',
- 'delivery_home' => 'Livraison à domicile',
- 'delivery_address' => 'Adresse de livraison',
- 'online_payment_url' => 'URL de paiement',
- 'tiller_external_id' => 'Tiller : externalId',
- 'ignore_when_invoicing' => "Ignorer au moment de la facturation"
- ];
- }
-
- /*
- * Relations
- */
-
- public function getUser()
- {
- return $this->hasOne(User::class, ['id' => 'id_user']);
- }
-
- public function populateUser(User $user)
- {
- $this->populateFieldObject('id_user', 'user', $user);
- }
-
- public function getProductOrder()
- {
- return $this->hasMany(ProductOrder::class, ['id_order' => 'id'])
- ->orderBy(['product.order' => SORT_ASC])
- ->joinWith('product');
- }
-
- public function getDistribution()
- {
- return $this->hasOne(Distribution::class, ['id' => 'id_distribution'])
- ->with('producer');
- }
-
- public function populateDistribution(Distribution $distribution)
- {
- $this->populateFieldObject('id_distribution', 'distribution', $distribution);
- }
-
- public function getPointSale()
- {
- return $this->hasOne(PointSale::class, ['id' => 'id_point_sale'])
- ->with('userPointSale');
- }
-
- public function populatePointSale(PointSale $pointSale): void
- {
- $this->populateFieldObject('id_point_sale', 'point_sale', $pointSale);
- }
-
- public function getPayment()
- {
- return $this->hasMany(Payment::class, ['id_order' => 'id'])
- ->orderBy(['payment.id' => SORT_DESC]);
- }
-
- public function getSubscription()
- {
- return $this->hasOne(Subscription::class, ['id' => 'id_subscription'])
- ->with('productSubscription');
- }
-
- public function populateSubscription(Subscription $subscription): void
- {
- $this->populateFieldObject('id_subscription', 'subscription', $subscription);
- }
-
- public function getInvoice()
- {
- return $this->hasOne(Invoice::class, ['id' => 'id_invoice']);
- }
-
- public function populateInvoice(Invoice $invoice): void
- {
- $this->populateFieldObject('id_invoice', 'invoice', $invoice);
- }
-
- public function getQuotation()
- {
- return $this->hasOne(Quotation::class, ['id' => 'id_quotation']);
- }
-
- public function populateQuotation(Quotation $quotation): void
- {
- $this->populateFieldObject('id_quotation', 'quotation', $quotation);
- }
-
- public function getDeliveryNote()
- {
- return $this->hasOne(DeliveryNote::class, ['id' => 'id_delivery_note']);
- }
-
- public function populateDeliveryNote(DeliveryNote $deliveryNote): void
- {
- $this->populateFieldObject('id_delivery_note', 'deliveryNote', $deliveryNote);
- }
-
- public function getOrderStatusHistoryRelation()
- {
- return $this->hasMany(OrderStatusHistory::class, ['id_order' => 'id'])
- ->orderBy(['order_status_history.date' => SORT_ASC]);
- }
- }
|