KataoOrder.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. <?php
  2. /**
  3. * Subclass for representing a row from the 'katao_order' table.
  4. *
  5. * @package lib.model
  6. */
  7. class KataoOrder extends BaseKataoOrder {
  8. const STATUS_GENERATED = 1;
  9. const STATUS_ADJUSTED = 2;
  10. const STATUS_SENT = 3;
  11. const STATUS_RECEIVED = 4;
  12. const STATUS_DELIVERED = 5;
  13. public function __toString() {
  14. return $this->getNumber();
  15. }
  16. public function getNumber() {
  17. return sprintf('CO%04d', $this->getId());
  18. }
  19. public function getStatusStr() {
  20. return KataoOrderPeer::getStatusStr($this->getStatus());
  21. }
  22. public function getSupplierName() {
  23. return $this->getKataoSupplier()->getName();
  24. }
  25. public function getSupplierLink() {
  26. $result = '';
  27. if (null != $katao_supplier = $this->getKataoSupplier()) {
  28. $result = link_to($katao_supplier->getName(), '@katao_supplier_show?id=' . $katao_supplier->getId());
  29. }
  30. return $result;
  31. }
  32. /**
  33. * KataoOrder::sumProducts()
  34. *
  35. * @return float
  36. */
  37. public function sumProducts() {
  38. $return = 0;
  39. $criteria = new Criteria();
  40. $criteria->addSelectColumn(KataoOrderProductPeer::KATAO_ORDER_ID);
  41. $criteria->addAsColumn('sum_products', sprintf('SUM(ROUND(%s * (1 + %s), 2) * %s)', KataoOrderProductPeer::PRODUCT_PRICE_EURO, KataoOrderProductPeer::PRODUCT_TVA_RATE, KataoOrderProductPeer::QUANTITY));
  42. $criteria->add(KataoOrderProductPeer::KATAO_ORDER_ID, $this->getId());
  43. $criteria->addGroupByColumn(KataoOrderProductPeer::KATAO_ORDER_ID);
  44. $rs = KataoOrderProductPeer::doSelectRS($criteria);
  45. if ($rs->next()) {
  46. $return = $rs->getFloat(2);
  47. }
  48. return $return;
  49. }
  50. public function sumProductsStr() {
  51. return Utils::formatCurrencyEuro($this->sumProducts());
  52. }
  53. /**
  54. * KataoOrder::updateProductQuantity()
  55. *
  56. * @param int $katao_product_id
  57. * @param int $katao_order_product_quantity
  58. * @return
  59. */
  60. public function updateProductQuantity($katao_product_id, $katao_order_product_quantity) {
  61. $criteria_update = new Criteria();
  62. $criteria_update->add(KataoOrderProductPeer::QUANTITY, $katao_order_product_quantity);
  63. $criteria_where = new Criteria();
  64. $criteria_where->add(KataoOrderProductPeer::KATAO_ORDER_ID, $this->getId());
  65. $criteria_where->add(KataoOrderProductPeer::KATAO_PRODUCT_ID, $katao_product_id);
  66. BasePeer::doUpdate($criteria_where, $criteria_update, Propel::getConnection());
  67. }
  68. public function getCreatedAtStr() {
  69. return CatalyzDate::formatShort($this->getCreatedAt(null));
  70. }
  71. public function getNodeLink($with_link = false) {
  72. if ($with_link) {
  73. return link_to($this->getKataoNode()->getCity(), '@katao_node_show?id=' . $this->getKataoNodeId());
  74. }
  75. return $this->getKataoNode()->getCity();
  76. }
  77. public function getPeriodLink($with_link = false) {
  78. if ($with_link) {
  79. return link_to($this->getKataoPeriod()->getName(), '@katao_node_show?id=' . $this->getKataoPeriodId());
  80. }
  81. return $this->getKataoPeriod()->getName();
  82. }
  83. /**
  84. * KataoOrder::addProductToUser()
  85. *
  86. * @param int $katao_user_id
  87. * @param int $katao_product_id
  88. * @param int $quantity
  89. * @return
  90. */
  91. public function addProductToUser($katao_user_id, $katao_product_id, $quantity) {
  92. if (null != $katao_order_product = $this->getKataoOrderProductByProductId($katao_product_id)) {
  93. $katao_order_product->addProductToUser($katao_user_id, $quantity);
  94. }
  95. }
  96. /**
  97. * KataoOrder::updateProductQuantity()
  98. *
  99. * @param int $katao_product_id
  100. * @param int $katao_order_product_quantity
  101. * @return KataoOrderProduct
  102. */
  103. public function getKataoOrderProductByProductId($katao_product_id) {
  104. $criteria = new Criteria();
  105. $criteria->add(KataoOrderProductPeer::KATAO_ORDER_ID, $this->getId());
  106. $criteria->add(KataoOrderProductPeer::KATAO_PRODUCT_ID, $katao_product_id);
  107. return KataoOrderProductPeer::doSelectOne($criteria);
  108. }
  109. public function generatePDF() {
  110. $katao_supplier = $this->getKataoSupplier();
  111. $tva_rates = array('0.055' => '2', '0.196' => '1');
  112. $tva_rates_map = array(2 => 0.055, 1 => 0.196);
  113. $pdf = new PDF_Invoice('P', 'mm', 'A4');
  114. $page = $pdf->addPageHeaderOrder(1, $this, $katao_supplier);
  115. $y = 109;
  116. $used_sol_by_product = $this->getUsedSolByProduct();
  117. $total_by_tva_rate = array(1 => 0, 2 => 0);
  118. $criteria = new Criteria();
  119. $criteria->addAscendingOrderByColumn(KataoOrderProductPeer::PRODUCT_NAME);
  120. foreach ($this->getKataoOrderProductsJoinKataoProduct($criteria) as/*(KataoOrderProduct)*/ $katao_order_product) {
  121. if ($y > 244) {
  122. $page = $pdf->addPageHeaderOrder($page, $this, $katao_supplier);
  123. $y = 109;
  124. }
  125. $tva_rate = !empty($tva_rates[(string)$katao_order_product->getProductTvaRate()])?$tva_rates[(string)$katao_order_product->getProductTvaRate()]:0;
  126. $quantity_adjusted = $katao_order_product->getQuantity();
  127. $quantity_received = $katao_order_product->getHasBeenReceived()?$katao_order_product->getQuantityReceived():CONST_N_A;
  128. $quantity_delivered = $katao_order_product->getHasBeenDelivered()?$katao_order_product->getQuantityDelivered():CONST_N_A;
  129. $quantity = $quantity_delivered;
  130. if (CONST_N_A === $quantity) {
  131. $quantity = $quantity_received;
  132. }
  133. if (CONST_N_A === $quantity) {
  134. $quantity = $quantity_adjusted;
  135. }
  136. $unit_price = round($katao_order_product->getProductPriceEuro() * (1 + $katao_order_product->getProductTvaRate()), 2);
  137. $amount = $quantity * $unit_price;
  138. if ($tva_rate) {
  139. $total_by_tva_rate[$tva_rate] += $amount;
  140. }
  141. $designation = utf8_decode($katao_order_product->getProductName());
  142. if (null != $katao_product = $katao_order_product->getKataoProduct()) {
  143. $designation .= utf8_decode(sprintf(' (UC : %d)', $katao_product->getMinOrderNumber()));
  144. }
  145. // $designation .= "\n" . utf8_decode(sprintf('Aju. : %s / Réc. : %s / Fac. : %s', $quantity_adjusted , strip_tags($quantity_delivered), strip_tags($quantity_invoiced)));
  146. $line = array("REFERENCE" => $katao_order_product->getProductReference(),
  147. "DESIGNATION" => $designation,
  148. "QUANTITE" => $quantity,
  149. "P.U. TTC" => Utils::formatCurrency($unit_price),
  150. "MONTANT TTC" => Utils::formatCurrency($amount),
  151. "TVA" => $tva_rate);
  152. $size = $pdf->addLine($y, $line);
  153. $y += $size + 2;
  154. }
  155. $pdf->addCadreTVAs();
  156. $tot_prods = array();
  157. foreach ($total_by_tva_rate as $tva_rate => $amount) {
  158. $tot_prods[] = array ("px_unit" => round($amount / (1 + $tva_rates_map[$tva_rate]), 2), "qte" => 1, "tva" => $tva_rate);
  159. }
  160. $tab_tva = array("1" => 19.6,
  161. "2" => 5.5);
  162. $params = array("RemiseGlobale" => 1,
  163. "remise_tva" => 0, // {la remise s'applique sur ce code TVA}
  164. "remise" => 0, // {montant de la remise}
  165. "remise_percent" => 0, // {pourcentage de remise sur ce montant de TVA}
  166. "FraisPort" => 0,
  167. "portTTC" => 0, // montant des frais de ports TTC
  168. // par defaut la TVA = 19.6 %
  169. "portHT" => 0, // montant des frais de ports HT
  170. "portTVA" => 19.6, // valeur de la TVA a appliquer sur le montant HT
  171. "AccompteExige" => 0,
  172. "accompte" => 0, // montant de l'acompte (TTC)
  173. "accompte_percent" => 0, // pourcentage d'acompte (TTC)
  174. "Remarque" => "");
  175. $pdf->addTVAs($params, $tab_tva, $tot_prods, null);
  176. $pdf->addCadreEurosFrancs();
  177. return $pdf->Output('', 'S');
  178. }
  179. public function checkIfAllProductsHaveBeenDelivered() {
  180. $return = false;
  181. $criteria = new Criteria();
  182. $criteria->addSelectColumn(KataoOrderProductPeer::KATAO_ORDER_ID);
  183. $criteria->addAsColumn('sum_has_been_delivered', sprintf('SUM(%s)', KataoOrderProductPeer::HAS_BEEN_DELIVERED));
  184. $criteria->add(KataoOrderProductPeer::KATAO_ORDER_ID, $this->getId());
  185. $criteria->addGroupByColumn(KataoOrderProductPeer::KATAO_ORDER_ID);
  186. $rs = KataoOrderProductPeer::doSelectRS($criteria);
  187. if ($rs->next()) {
  188. $return = $rs->getInt(2) == $this->countKataoOrderProducts();
  189. }
  190. return $return;
  191. }
  192. public function getUsedSolByProduct() {
  193. $return = array();
  194. $criteria = new Criteria();
  195. $criteria->addSelectColumn(KataoInvoiceProductPeer::KATAO_PRODUCT_ID);
  196. $criteria->addSelectColumn(KataoInvoiceProductPeer::SOL_AMOUNT);
  197. $criteria->addJoin(KataoInvoicePeer::ID, KataoInvoiceProductPeer::KATAO_INVOICE_ID);
  198. $criteria->add(KataoInvoicePeer::KATAO_PERIOD_ID, $this->getKataoPeriodId());
  199. $criteria->add(KataoInvoicePeer::KATAO_NODE_ID, $this->getKataoNodeId());
  200. $criteria->add(KataoInvoicePeer::STATUS, KataoInvoice::STATUS_SENT);
  201. $rs = KataoInvoiceProductPeer::doSelectRS($criteria);
  202. while ($rs->next()) {
  203. $return[$rs->getInt(1)] = $rs->getInt(2);
  204. }
  205. return $return;
  206. }
  207. public function getUsedSolTotal() {
  208. $return = 0;
  209. $criteria = new Criteria();
  210. $criteria->addAsColumn('sum_products', sprintf('SUM(%s)', KataoInvoiceProductPeer::SOL_AMOUNT));
  211. $criteria->addJoin(KataoInvoicePeer::ID, KataoInvoiceProductPeer::KATAO_INVOICE_ID);
  212. $criteria->add(KataoInvoicePeer::KATAO_PERIOD_ID, $this->getKataoPeriodId());
  213. $criteria->add(KataoInvoicePeer::KATAO_NODE_ID, $this->getKataoNodeId());
  214. $criteria->add(KataoInvoicePeer::STATUS, KataoInvoice::STATUS_SENT);
  215. $criteria->addGroupByColumn(KataoInvoicePeer::ID);
  216. $rs = KataoInvoiceProductPeer::doSelectRS($criteria);
  217. while ($rs->next()) {
  218. $return += $rs->getInt(1);
  219. }
  220. return $return;
  221. }
  222. public function notifyMembersWithModifiedAdjustedQuantities() {
  223. $criteria = new Criteria();
  224. $criteria->addJoin(KataoCartPeer::ID, KataoCartProductPeer::KATAO_CART_ID);
  225. $criteria->addJoin(KataoCartProductPeer::KATAO_ORDER_PRODUCT_ID, KataoOrderProductPeer::ID);
  226. $criteria->add(KataoOrderProductPeer::KATAO_ORDER_ID, $this->getId());
  227. $criteria->add(KataoCartProductPeer::HAS_BEEN_ADJUSTED, true);
  228. $criteria->add(KataoCartProductPeer::QUANTITY, sprintf('%s <> %s', KataoCartProductPeer::QUANTITY, KataoCartProductPeer::QUANTITY_ADJUSTED), Criteria::CUSTOM);
  229. $criteria->setDistinct();
  230. $katao_carts = KataoCartPeer::doSelectJoinKataoUser($criteria);
  231. if (0 < count($katao_carts)) {
  232. $mailer = new wpMail();
  233. foreach ($katao_carts as/*(KataoCart)*/ $katao_cart) {
  234. $katao_user = $katao_cart->getKataoUser();
  235. $katao_member = $katao_user->getKataoMember();
  236. try {
  237. $mailer->send(new Swift_Message('Les demandes ont été ajustées et la vôtre modifiée', sprintf('%s,
  238. Suite à l\'ajustement des demandes pour atteindre les minimun de commande fournisseur,
  239. la quantité d\'un ou plusieurs produits que tu avais demandé
  240. dans ta demande N° %s du %s a changé.
  241. Tu peux en pendre connaissance via ton panier :
  242. %smon-panier
  243. %s', $katao_member->getFirstName(), $katao_cart->getNumber(), $katao_cart->getCreatedAtStr(), sfConfig::get('app_katao_frontend_url'), Utils::getKataoEmailFooter())), new Swift_Address($katao_user->getEmail(), $katao_member->getFullName()), sfConfig::get('app_mail_from'));
  244. }
  245. catch (Exception $e) {
  246. $mailer->disconnect();
  247. }
  248. }
  249. $mailer->disconnect();
  250. }
  251. }
  252. public function notifyMembersWithModifiedDeliveredQuantities() {
  253. $criteria = new Criteria();
  254. $criteria->addJoin(KataoCartPeer::ID, KataoCartProductPeer::KATAO_CART_ID);
  255. $criteria->addJoin(KataoCartProductPeer::KATAO_ORDER_PRODUCT_ID, KataoOrderProductPeer::ID);
  256. $criteria->add(KataoOrderProductPeer::KATAO_ORDER_ID, $this->getId());
  257. $criteria->add(KataoOrderProductPeer::HAS_BEEN_DELIVERED, true);
  258. $criteria->add(KataoOrderProductPeer::QUANTITY, sprintf('%s <> %s', KataoOrderProductPeer::QUANTITY, KataoOrderProductPeer::QUANTITY_DELIVERED), Criteria::CUSTOM);
  259. $criteria->setDistinct();
  260. $katao_carts = KataoCartPeer::doSelectJoinKataoUser($criteria);
  261. if (0 < count($katao_carts)) {
  262. $mailer = new wpMail();
  263. foreach ($katao_carts as/*(KataoCart)*/ $katao_cart) {
  264. $katao_user = $katao_cart->getKataoUser();
  265. $katao_member = $katao_user->getKataoMember();
  266. try {
  267. $mailer->send(new Swift_Message('La commande des fournisseurs a été réceptionnée et votre demande modifiée', sprintf('%s,
  268. Suite à la recepton des commandes de nos fournisseurs la quantité d\'un ou plusieurs produits que tu avais demandé
  269. dans ta demande N° %s du %s a changé.
  270. Merci d\'en prendre connaissance en suivant le Lien vers ton panier :
  271. %smon-panier
  272. %s', $katao_member->getFirstName(), $katao_cart->getNumber(), $katao_cart->getCreatedAtStr(), sfConfig::get('app_katao_frontend_url'), Utils::getKataoEmailFooter())), new Swift_Address($katao_user->getEmail(), $katao_member->getFullName()), sfConfig::get('app_mail_from'));
  273. }
  274. catch (Exception $e) {
  275. $mailer->disconnect();
  276. }
  277. }
  278. $mailer->disconnect();
  279. }
  280. }
  281. public function notifiySeoWithAdjustment() {
  282. try {
  283. $katao_member_seo = wpConfig::getInstance()->getKataoMember();
  284. $katao_user_seo = $katao_member_seo->getFirstKataoUser();
  285. $mailer = new wpMail();
  286. $mailer->send(new Swift_Message('Une commande a été justifiée', sprintf('%s,
  287. le %s, le Délégué %s du noeud %s
  288. a fini d\'ajuster la commande de la période %s pour le fournisseur %s
  289. Pour approfondir cette information, suivre le Lien ci-dessous :
  290. %s
  291. Système katao.fr', $katao_member_seo->getFirstName(), CatalyzDate::formatShort(time()), $this->getKataoNode()->getKataoUser()->getKataoMember()->getFirstName(), $this->getKataoNode()->getCity(), $this->getKataoPeriod()->getName(), $this->getSupplierName(), sfConfig::get('app_katao_backend_url'))), new Swift_Address($katao_user->getEmail(), $katao_member->getFullName()), sfConfig::get('app_mail_from'));
  292. $mailer->disconnect();
  293. }
  294. catch (Exception $e) {
  295. $mailer->disconnect();
  296. }
  297. }
  298. public function notifiySeoWithReceive() {
  299. try {
  300. $katao_member_seo = wpConfig::getInstance()->getKataoMember();
  301. $katao_user_seo = $katao_member_seo->getFirstKataoUser();
  302. $mailer = new wpMail();
  303. $mailer->send(new Swift_Message('Une commande a été réceptionnée', sprintf('%s,
  304. le %s, le Délégué %s du noeud %s
  305. a fini de réceptionner la commande de la période %s pour le fournisseur %s
  306. Pour approfondir cette information, suivre le Lien ci-dessous :
  307. %s
  308. Système katao.fr', $katao_member_seo->getFirstName(), CatalyzDate::formatShort(time()), $this->getKataoNode()->getKataoUser()->getKataoMember()->getFirstName(), $this->getKataoNode()->getCity(), $this->getKataoPeriod()->getName(), $this->getSupplierName(), sfConfig::get('app_katao_backend_url'))), new Swift_Address($katao_user->getEmail(), $katao_member->getFullName()), sfConfig::get('app_mail_from'));
  309. $mailer->disconnect();
  310. }
  311. catch (Exception $e) {
  312. $mailer->disconnect();
  313. }
  314. }
  315. public function notifiySeoWithDeliver() {
  316. try {
  317. $katao_member_seo = wpConfig::getInstance()->getKataoMember();
  318. $katao_user_seo = $katao_member_seo->getFirstKataoUser();
  319. $mailer = new wpMail();
  320. $mailer->send(new Swift_Message('Les demandes ont été distribuées', sprintf('%s,
  321. le %s, le Délégué %s du noeud %s
  322. a fini de distribuer les demandes de période %s
  323. Pour approfondir cette information, suivre le Lien ci-dessous :
  324. %s
  325. Système katao.fr', $katao_member_seo->getFirstName(), CatalyzDate::formatShort(time()), $this->getKataoNode()->getKataoUser()->getKataoMember()->getFirstName(), $this->getKataoNode()->getCity(), $this->getKataoPeriod()->getName(), sfConfig::get('app_katao_backend_url'))), new Swift_Address($katao_user->getEmail(), $katao_member->getFullName()), sfConfig::get('app_mail_from'));
  326. $mailer->disconnect();
  327. }
  328. catch (Exception $e) {
  329. $mailer->disconnect();
  330. }
  331. }
  332. public function adjust($sf_user) {
  333. $this->setStatus(KataoOrder::STATUS_ADJUSTED);
  334. $this->save();
  335. $this->notifyMembersWithModifiedAdjustedQuantities();
  336. if ($sf_user->isJustDelegate()) {
  337. $this->notifiySeoWithAdjustment();
  338. }
  339. }
  340. public function getOtherProducts() {
  341. $return = array();
  342. $product_ids = array();
  343. $criteria = new Criteria();
  344. $criteria->addSelectColumn(KataoOrderProductPeer::KATAO_PRODUCT_ID);
  345. $criteria->add(KataoOrderProductPeer::KATAO_ORDER_ID, $this->getId());
  346. $rs = KataoOrderProductPeer::doSelectRS($criteria);
  347. while ($rs->next()) {
  348. $product_ids[$rs->getInt(1)] = true;
  349. }
  350. $criteria = new Criteria();
  351. $criteria->addSelectColumn(KataoProductPeer::ID);
  352. $criteria->addSelectColumn(KataoProductPeer::NAME);
  353. $criteria->add(KataoProductPeer::KATAO_SUPPLIER_ID, $this->getKataoSupplierId());
  354. $criteria->add(KataoProductPeer::ID, array_keys($product_ids), Criteria::NOT_IN);
  355. $criteria->addAscendingOrderByColumn(KataoProductPeer::NAME);
  356. $rs = KataoProductPeer::doSelectRS($criteria);
  357. while ($rs->next()) {
  358. $return[$rs->getInt(1)] = $rs->getString(2);
  359. }
  360. return $return;
  361. }
  362. }