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.

232 line
7.4KB

  1. <?php
  2. /**
  3. * Copyright distrib (2018)
  4. *
  5. * contact@opendistrib.net
  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\ProductOrder\ProductOrder;
  44. use domain\Payment\Payment;
  45. use domain\PointSale\PointSale\PointSale;
  46. use domain\Subscription\Subscription\Subscription;
  47. use domain\User\User\User;
  48. class Order extends ActiveRecordCommon
  49. {
  50. const EVENT_DELETE = 'order.event.delete';
  51. var $amount = 0;
  52. var $amount_with_tax = 0;
  53. var $amount_vat = [];
  54. var $invoice_amount = 0;
  55. var $invoice_amount_with_tax = 0;
  56. var $invoice_amount_vat = [];
  57. var $paid_amount = 0;
  58. var $weight = 0;
  59. const ORIGIN_AUTO = 'auto';
  60. const ORIGIN_USER = 'user';
  61. const ORIGIN_ADMIN = 'admin';
  62. const PAYMENT_PAID = 'paid';
  63. const PAYMENT_UNPAID = 'unpaid';
  64. const PAYMENT_SURPLUS = 'surplus';
  65. const INVOICE_AMOUNT_TOTAL = 'invoice-total';
  66. const AMOUNT_TOTAL = 'total';
  67. const AMOUNT_PAID = 'paid';
  68. const AMOUNT_REMAINING = 'remaining';
  69. const AMOUNT_SURPLUS = 'surplus';
  70. const STATE_OPEN = 'open';
  71. const STATE_PREPARATION = 'preparation';
  72. const STATE_DELIVERED = 'delivered';
  73. /**
  74. * @inheritdoc
  75. */
  76. public static function tableName()
  77. {
  78. return 'order';
  79. }
  80. /**
  81. * @inheritdoc
  82. */
  83. public function rules()
  84. {
  85. return [
  86. [['id_user', 'date', 'status'], 'required', 'message' => ''],
  87. [
  88. [
  89. 'id_user',
  90. 'id_point_sale',
  91. 'id_distribution',
  92. 'id_subscription',
  93. 'id_invoice',
  94. 'id_quotation',
  95. 'id_delivery_note'
  96. ],
  97. 'integer'
  98. ],
  99. [['auto_payment', 'tiller_synchronization', 'delivery_home', 'ignore_when_invoicing'], 'boolean'],
  100. [['status', 'reference', 'delivery_address', 'online_payment_url', 'tiller_external_id'], 'string'],
  101. [['date', 'date_update', 'comment', 'comment_point_sale', 'mean_payment', 'tiller_external_id'], 'safe']
  102. ];
  103. }
  104. /**
  105. * @inheritdoc
  106. */
  107. public function attributeLabels()
  108. {
  109. return [
  110. 'id' => 'ID',
  111. 'id_user' => 'Id User',
  112. 'date' => 'Date',
  113. 'date_update' => 'Date de modification',
  114. 'id_point_sale' => 'Point de vente',
  115. 'id_distribution' => 'Date de distribution',
  116. 'id_subscription' => 'Abonnement',
  117. 'status' => 'Statut',
  118. 'id_invoice' => 'Facture',
  119. 'id_quotation' => 'Devis',
  120. 'id_delivery_note' => 'Bon de livraison',
  121. 'reference' => 'Référence',
  122. 'delivery_home' => 'Livraison à domicile',
  123. 'delivery_address' => 'Adresse de livraison',
  124. 'online_payment_url' => 'URL de paiement',
  125. 'tiller_external_id' => 'Tiller : externalId',
  126. 'ignore_when_invoicing' => "Ignorer au moment de la facturation"
  127. ];
  128. }
  129. /*
  130. * Relations
  131. */
  132. public function getUser()
  133. {
  134. return $this->hasOne(User::class, ['id' => 'id_user']);
  135. }
  136. public function populateUser(User $user)
  137. {
  138. $this->populateFieldObject('id_user', 'user', $user);
  139. }
  140. public function getProductOrder()
  141. {
  142. return $this->hasMany(ProductOrder::class, ['id_order' => 'id'])
  143. ->orderBy(['product.order' => SORT_ASC])
  144. ->joinWith('product');
  145. }
  146. public function getDistribution()
  147. {
  148. return $this->hasOne(Distribution::class, ['id' => 'id_distribution'])
  149. ->with('producer');
  150. }
  151. public function populateDistribution(Distribution $distribution)
  152. {
  153. $this->populateFieldObject('id_distribution', 'distribution', $distribution);
  154. }
  155. public function getPointSale()
  156. {
  157. return $this->hasOne(PointSale::class, ['id' => 'id_point_sale'])
  158. ->with('userPointSale');
  159. }
  160. public function populatePointSale(PointSale $pointSale): void
  161. {
  162. $this->populateFieldObject('id_point_sale', 'point_sale', $pointSale);
  163. }
  164. public function getPayment()
  165. {
  166. return $this->hasMany(Payment::class, ['id_order' => 'id'])
  167. ->orderBy(['payment.id' => SORT_DESC]);
  168. }
  169. public function getSubscription()
  170. {
  171. return $this->hasOne(Subscription::class, ['id' => 'id_subscription'])
  172. ->with('productSubscription');
  173. }
  174. public function populateSubscription(Subscription $subscription): void
  175. {
  176. $this->populateFieldObject('id_subscription', 'subscription', $subscription);
  177. }
  178. public function getInvoice()
  179. {
  180. return $this->hasOne(Invoice::class, ['id' => 'id_invoice']);
  181. }
  182. public function populateInvoice(Invoice $invoice): void
  183. {
  184. $this->populateFieldObject('id_invoice', 'invoice', $invoice);
  185. }
  186. public function getQuotation()
  187. {
  188. return $this->hasOne(Quotation::class, ['id' => 'id_quotation']);
  189. }
  190. public function populateQuotation(Quotation $quotation): void
  191. {
  192. $this->populateFieldObject('id_quotation', 'quotation', $quotation);
  193. }
  194. public function getDeliveryNote()
  195. {
  196. return $this->hasOne(DeliveryNote::class, ['id' => 'id_delivery_note']);
  197. }
  198. public function populateDeliveryNote(DeliveryNote $deliveryNote): void
  199. {
  200. $this->populateFieldObject('id_delivery_note', 'deliveryNote', $deliveryNote);
  201. }
  202. }