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.

271 satır
8.4KB

  1. <?php
  2. /**
  3. * Copyright Souke (2018)
  4. *
  5. * contact@souke.fr
  6. *
  7. * Ce logiciel est un programme informatique servant à aider les producteurs
  8. * à distribuer leur production en circuits courts.
  9. *
  10. * Ce logiciel est régi par la licence CeCILL soumise au droit français et
  11. * respectant les principes de diffusion des logiciels libres. Vous pouvez
  12. * utiliser, modifier et/ou redistribuer ce programme sous les conditions
  13. * de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA
  14. * sur le site "http://www.cecill.info".
  15. *
  16. * En contrepartie de l'accessibilité au code source et des droits de copie,
  17. * de modification et de redistribution accordés par cette licence, il n'est
  18. * offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons,
  19. * seule une responsabilité restreinte pèse sur l'auteur du programme, le
  20. * titulaire des droits patrimoniaux et les concédants successifs.
  21. *
  22. * A cet égard l'attention de l'utilisateur est attirée sur les risques
  23. * associés au chargement, à l'utilisation, à la modification et/ou au
  24. * développement et à la reproduction du logiciel par l'utilisateur étant
  25. * donné sa spécificité de logiciel libre, qui peut le rendre complexe à
  26. * manipuler et qui le réserve donc à des développeurs et des professionnels
  27. * avertis possédant des connaissances informatiques approfondies. Les
  28. * utilisateurs sont donc invités à charger et tester l'adéquation du
  29. * logiciel à leurs besoins dans des conditions permettant d'assurer la
  30. * sécurité de leurs systèmes et ou de leurs données et, plus généralement,
  31. * à l'utiliser et l'exploiter dans les mêmes conditions de sécurité.
  32. *
  33. * Le fait que vous puissiez accéder à cet en-tête signifie que vous avez
  34. * pris connaissance de la licence CeCILL, et que vous en avez accepté les
  35. * termes.
  36. */
  37. namespace domain\Order\Order;
  38. use common\components\ActiveRecordCommon;
  39. use domain\Distribution\Distribution\Distribution;
  40. use domain\Document\DeliveryNote\DeliveryNote;
  41. use domain\Document\Invoice\Invoice;
  42. use domain\Document\Quotation\Quotation;
  43. use domain\Order\OrderStatus\OrderStatus;
  44. use domain\Order\OrderStatusHistory\OrderStatusHistory;
  45. use domain\Order\ProductOrder\ProductOrder;
  46. use domain\Payment\Payment;
  47. use domain\PointSale\PointSale\PointSale;
  48. use domain\Subscription\Subscription\Subscription;
  49. use domain\User\User\User;
  50. class Order extends ActiveRecordCommon
  51. {
  52. protected OrderStatus $orderStatusObject;
  53. const EVENT_DELETE = 'order.event.delete';
  54. var $amount = 0;
  55. var $amount_with_tax = 0;
  56. var $amount_vat = [];
  57. var $invoice_amount = 0;
  58. var $invoice_amount_with_tax = 0;
  59. var $invoice_amount_vat = [];
  60. var $paid_amount = 0;
  61. var $weight = 0;
  62. const ORIGIN_AUTO = 'auto';
  63. const ORIGIN_USER = 'user';
  64. const ORIGIN_ADMIN = 'admin';
  65. const PAYMENT_PAID = 'paid';
  66. const PAYMENT_UNPAID = 'unpaid';
  67. const PAYMENT_SURPLUS = 'surplus';
  68. const INVOICE_AMOUNT_TOTAL = 'invoice-total';
  69. const AMOUNT_TOTAL = 'total';
  70. const AMOUNT_PAID = 'paid';
  71. const AMOUNT_REMAINING = 'remaining';
  72. const AMOUNT_SURPLUS = 'surplus';
  73. const STATE_OPEN = 'open';
  74. const STATE_PREPARATION = 'preparation';
  75. const STATE_DELIVERED = 'delivered';
  76. public function getOrderStatusAlias(): ?string
  77. {
  78. return $this->order_status_alias;
  79. }
  80. public function setOrderStatusAlias(string $orderStatusAlias): self
  81. {
  82. $this->order_status_alias = $orderStatusAlias;
  83. return $this;
  84. }
  85. public function getOrderStatus(): OrderStatus
  86. {
  87. return $this->orderStatusObject;
  88. }
  89. public function setOrderStatus(OrderStatus $orderStatus): self
  90. {
  91. $this->setOrderStatusAlias($orderStatus->getAlias());
  92. $this->orderStatusObject = $orderStatus;
  93. return $this;
  94. }
  95. public function getOrderStatusHistory(): array
  96. {
  97. return $this->orderStatusHistoryRelation;
  98. }
  99. /**
  100. * @inheritdoc
  101. */
  102. public static function tableName()
  103. {
  104. return 'order';
  105. }
  106. /**
  107. * @inheritdoc
  108. */
  109. public function rules()
  110. {
  111. return [
  112. [['id_user', 'date'], 'required', 'message' => ''],
  113. [
  114. [
  115. 'id_user',
  116. 'id_point_sale',
  117. 'id_distribution',
  118. 'id_subscription',
  119. 'id_invoice',
  120. 'id_quotation',
  121. 'id_delivery_note'
  122. ],
  123. 'integer'
  124. ],
  125. [['auto_payment', 'tiller_synchronization', 'delivery_home', 'ignore_when_invoicing'], 'boolean'],
  126. [['order_status_alias', 'reference', 'delivery_address', 'online_payment_url', 'tiller_external_id'], 'string'],
  127. [['date', 'date_update', 'comment', 'comment_point_sale', 'mean_payment', 'tiller_external_id'], 'safe']
  128. ];
  129. }
  130. /**
  131. * @inheritdoc
  132. */
  133. public function attributeLabels()
  134. {
  135. return [
  136. 'id' => 'ID',
  137. 'id_user' => 'Id User',
  138. 'date' => 'Date',
  139. 'date_update' => 'Date de modification',
  140. 'order_status_alias' => 'Statut',
  141. 'id_point_sale' => 'Point de vente',
  142. 'id_distribution' => 'Date de distribution',
  143. 'id_subscription' => 'Abonnement',
  144. 'id_invoice' => 'Facture',
  145. 'id_quotation' => 'Devis',
  146. 'id_delivery_note' => 'Bon de livraison',
  147. 'reference' => 'Référence',
  148. 'delivery_home' => 'Livraison à domicile',
  149. 'delivery_address' => 'Adresse de livraison',
  150. 'online_payment_url' => 'URL de paiement',
  151. 'tiller_external_id' => 'Tiller : externalId',
  152. 'ignore_when_invoicing' => "Ignorer au moment de la facturation"
  153. ];
  154. }
  155. /*
  156. * Relations
  157. */
  158. public function getUser()
  159. {
  160. return $this->hasOne(User::class, ['id' => 'id_user']);
  161. }
  162. public function populateUser(User $user)
  163. {
  164. $this->populateFieldObject('id_user', 'user', $user);
  165. }
  166. public function getProductOrder()
  167. {
  168. return $this->hasMany(ProductOrder::class, ['id_order' => 'id'])
  169. ->orderBy(['product.order' => SORT_ASC])
  170. ->joinWith('product');
  171. }
  172. public function getDistribution()
  173. {
  174. return $this->hasOne(Distribution::class, ['id' => 'id_distribution'])
  175. ->with('producer');
  176. }
  177. public function populateDistribution(Distribution $distribution)
  178. {
  179. $this->populateFieldObject('id_distribution', 'distribution', $distribution);
  180. }
  181. public function getPointSale()
  182. {
  183. return $this->hasOne(PointSale::class, ['id' => 'id_point_sale'])
  184. ->with('userPointSale');
  185. }
  186. public function populatePointSale(PointSale $pointSale): void
  187. {
  188. $this->populateFieldObject('id_point_sale', 'point_sale', $pointSale);
  189. }
  190. public function getPayment()
  191. {
  192. return $this->hasMany(Payment::class, ['id_order' => 'id'])
  193. ->orderBy(['payment.id' => SORT_DESC]);
  194. }
  195. public function getSubscription()
  196. {
  197. return $this->hasOne(Subscription::class, ['id' => 'id_subscription'])
  198. ->with('productSubscription');
  199. }
  200. public function populateSubscription(Subscription $subscription): void
  201. {
  202. $this->populateFieldObject('id_subscription', 'subscription', $subscription);
  203. }
  204. public function getInvoice()
  205. {
  206. return $this->hasOne(Invoice::class, ['id' => 'id_invoice']);
  207. }
  208. public function populateInvoice(Invoice $invoice): void
  209. {
  210. $this->populateFieldObject('id_invoice', 'invoice', $invoice);
  211. }
  212. public function getQuotation()
  213. {
  214. return $this->hasOne(Quotation::class, ['id' => 'id_quotation']);
  215. }
  216. public function populateQuotation(Quotation $quotation): void
  217. {
  218. $this->populateFieldObject('id_quotation', 'quotation', $quotation);
  219. }
  220. public function getDeliveryNote()
  221. {
  222. return $this->hasOne(DeliveryNote::class, ['id' => 'id_delivery_note']);
  223. }
  224. public function populateDeliveryNote(DeliveryNote $deliveryNote): void
  225. {
  226. $this->populateFieldObject('id_delivery_note', 'deliveryNote', $deliveryNote);
  227. }
  228. public function getOrderStatusHistoryRelation()
  229. {
  230. return $this->hasMany(OrderStatusHistory::class, ['id_order' => 'id'])
  231. ->orderBy(['order_status_history.date' => SORT_ASC]);
  232. }
  233. }