PageRenderTime 51ms CodeModel.GetById 20ms RepoModel.GetById 1ms app.codeStats 0ms

/src/core/Helpers/OrderHelper.php

https://bitbucket.org/icoa/bladecommerce-core
PHP | 475 lines | 368 code | 72 blank | 35 comment | 59 complexity | d47fdf7fa61b10c53f67e50767cf6fc2 MD5 | raw file
  1. <?php
  2. /*
  3. * This is a N3m3s7s creation
  4. * @author Fabio Politi <f.politi@icoa.it at icoa.it>
  5. * @created 23-gen-2014 15.29.08
  6. */
  7. use Carbon\Carbon;
  8. use Underscore\Types\Arrays;
  9. use services\Morellato\Gls\Handler\OrderAddressHandler;
  10. abstract class OrderHelper
  11. {
  12. /**
  13. * @param $order_id
  14. * @return Order|null
  15. */
  16. static function getOrder($order_id)
  17. {
  18. return Order::getObj($order_id);
  19. }
  20. static function getRma($rma_id)
  21. {
  22. $rma = Rma::getObj($rma_id);
  23. if ($rma == null) {
  24. return null;
  25. }
  26. $rma->expand();
  27. return $rma;
  28. }
  29. static function getStatusTable($order_id, $type = 'O')
  30. {
  31. $order = self::getOrder($order_id);
  32. $rows = OrderHistory::where('order_id', $order_id)->whereType($type)->orderBy('id', 'desc')->get();
  33. foreach ($rows as $row) {
  34. $user = $row->created_by > 0 ? Sentry::findUserById($row->created_by) : null;
  35. $row->status = ($type == 'O') ? OrderState::getObj($row->status_id) : PaymentState::getObj($row->status_id);
  36. $row->user = ($user) ? $user->first_name . " " . $user->last_name : "";
  37. }
  38. return Theme::partial('order.status', ['rows' => $rows]);
  39. }
  40. static function getStatusSelect($order_id, $acl = false)
  41. {
  42. $order = self::getOrder($order_id);
  43. $html = Form::select('status_id', \Mainframe::selectOrderStates($acl, $acl), $order->status);
  44. return $html;
  45. }
  46. static function getPaymentStatusSelect($order_id, $acl = false)
  47. {
  48. $order = self::getOrder($order_id);
  49. $html = Form::select('payment_status_id', \Mainframe::selectPaymentStates($acl, $acl), $order->payment_status);
  50. return $html;
  51. }
  52. static function getCustomerInfo($customer_id)
  53. {
  54. $customer = Customer::getObj($customer_id);
  55. if ($customer == null) {
  56. return null;
  57. }
  58. return Theme::partial('order.customer', ['obj' => $customer]);
  59. }
  60. static function getOrderInfo($order_id)
  61. {
  62. $order = Order::getObj($order_id);
  63. if ($order == null) {
  64. return null;
  65. }
  66. $order->expand();
  67. return Theme::partial('shared.order', ['obj' => $order]);
  68. }
  69. static function getRmaDetails($id)
  70. {
  71. $rma = Rma::getObj($id);
  72. if ($rma == null) {
  73. return null;
  74. }
  75. $rma->expand();
  76. return Theme::partial('shared.rma', ['obj' => $rma]);
  77. }
  78. static function getOrderRma($order_id)
  79. {
  80. $order = self::getOrder($order_id);
  81. $rows = $order->getRma();
  82. return Theme::partial('order.rmas', ['rows' => $rows]);
  83. }
  84. static function getCartDetails($id)
  85. {
  86. $cart = Cart::getObj($id);
  87. if ($cart == null) {
  88. return null;
  89. }
  90. $cart->expand();
  91. return Theme::partial('shared.cart', ['obj' => $cart]);
  92. }
  93. static function getAddressSelect($order_id, $billing = 0)
  94. {
  95. $order = self::getOrder($order_id);
  96. $customer = $order->getCustomer();
  97. if ($customer == null) {
  98. return null;
  99. }
  100. $rows = $customer->getAddresses($billing);
  101. if (count($rows) == 0 AND $billing == 1) {
  102. $rows = $customer->getAddresses(0);
  103. }
  104. $data = [];
  105. foreach ($rows as $row) {
  106. $data[$row->id] = $row->extendedName();
  107. }
  108. $selected = ($billing == 0) ? $order->shipping_address_id : $order->billing_address_id;
  109. if ($billing == 1 AND $order->billing_address_id == 0) {
  110. $selected = $order->shipping_address_id;
  111. }
  112. $name = ($billing == 0) ? "shipping_address_id" : "billing_address_id";
  113. $html = Form::select($name, $data, $selected);
  114. return $html;
  115. }
  116. static function address($order_id, $billing = 0)
  117. {
  118. $order = self::getOrder($order_id);
  119. $address = ($billing == 0) ? $order->getShippingAddress() : $order->getBillingAddress();
  120. $html = $address->toHtml();
  121. $url_edit = URL::action("CustomersController@getEdit", $order->customer_id) . "?update_address=" . $address->id;
  122. $url_map = $address->gmap();
  123. $url_gls = OrderAddressHandler::getUrlForXml($order_id);
  124. $table = <<<TABLE
  125. <div>
  126. <span class="pull-right">
  127. <a target="_blank" href="$url_edit">Modifica</a> | <a target="_blank" href="$url_map">Apri su Google Maps</a> | <a target="_blank" href="$url_gls">Apri XML GLS</a>
  128. </span>
  129. $html
  130. </div>
  131. TABLE;
  132. return $table;
  133. }
  134. static function getAddressVerification($order_id)
  135. {
  136. $order = self::getOrder($order_id);
  137. $address = $order->getShippingAddress();
  138. $address_responses = $order->getAddressResponses($address->id);
  139. $address_trackings = $order->getAddressTrackings();
  140. return Theme::partial('order.address_verification', compact('address', 'order', 'address_responses', 'address_trackings'));
  141. }
  142. static function getGlsTrackingInfo($order_id)
  143. {
  144. $order = self::getOrder($order_id);
  145. $trackings = $order->getAddressTrackings();
  146. return Theme::partial('order.tracking_info', compact('order', 'trackings'));
  147. }
  148. static function getProductsTable($order_id)
  149. {
  150. $order = self::getOrder($order_id);
  151. $products = $order->getProducts();
  152. return Theme::partial('order.products', ['rows' => $products, 'order' => $order]);
  153. }
  154. static function getNegoziandoProductsTable($order_id)
  155. {
  156. $order = self::getOrder($order_id);
  157. $products = $order->getProducts();
  158. return Theme::partial('order.products_negoziando', ['rows' => $products, 'order' => $order]);
  159. }
  160. static function getRmaProductsTable($order_id)
  161. {
  162. $rma = self::getRma($order_id);
  163. $products = $rma->getProducts();
  164. return Theme::partial('rma.products', ['rows' => $products]);
  165. }
  166. static function getCartProductsTable($cart_id)
  167. {
  168. $cart = Cart::getObj($cart_id);
  169. $products = $cart->getProducts();
  170. return Theme::partial('cart.products', ['rows' => $products]);
  171. }
  172. static function getCartProductsNegoziandoTable($cart_id)
  173. {
  174. $cart = Cart::getObj($cart_id);
  175. $products = $cart->getProducts();
  176. return Theme::partial('cart.products_negoziando', ['rows' => $products]);
  177. }
  178. static function getProductsSummary($order_id)
  179. {
  180. $order = self::getOrder($order_id);
  181. return Theme::partial('order.summary', ['obj' => $order]);
  182. }
  183. static function getPromo($order_id)
  184. {
  185. $order = self::getOrder($order_id);
  186. return Theme::partial('order.promo', ['obj' => $order]);
  187. }
  188. static function getPayments($order_id)
  189. {
  190. $order = self::getOrder($order_id);
  191. $transactions = DB::table('transactions')->where('order_id', $order->id)->orderBy('created_at', 'desc')->get();
  192. foreach ($transactions as $tr) {
  193. $view = 'gateway::' . $tr->module . '.details';
  194. if (\View::exists($view)) {
  195. $tr->details = \View::make($view, ['obj' => $tr])->render();
  196. } else {
  197. $tr->details = 'None registered';
  198. }
  199. }
  200. return Theme::partial('order.payments', ['obj' => $order, 'rows' => $transactions]);
  201. }
  202. static function getShipment($order_id)
  203. {
  204. $order = self::getOrder($order_id);
  205. return Theme::partial('order.shipment', ['obj' => $order]);
  206. }
  207. static function getMorellatoDetails($order_id)
  208. {
  209. $order = self::getOrder($order_id);
  210. return Theme::partial('order.morellato', ['obj' => $order]);
  211. }
  212. static function getDocuments($order_id)
  213. {
  214. $order = self::getOrder($order_id);
  215. $rows = [];
  216. $invoice = $order->getInvoice();
  217. if ($invoice) {
  218. $invoice = (object)$invoice;
  219. $rows[] = $invoice;
  220. }
  221. $delivery = $order->getDelivery();
  222. if ($delivery) {
  223. $delivery = (object)$delivery;
  224. $rows[] = $delivery;
  225. }
  226. return Theme::partial('order.docs', ['obj' => $order, 'rows' => $rows, 'invoice' => $invoice, 'delivery' => $delivery]);
  227. }
  228. static function createDocument($order_id, $params)
  229. {
  230. $prefix = $params['type'];
  231. $data = [
  232. $prefix . "_number" => $params['number'],
  233. $prefix . "_date" => Format::sqlDate($params['date']),
  234. $prefix . "_notes" => $params['notes'],
  235. ];
  236. Order::where('id', $order_id)->update($data);
  237. self::createDocumentFile($prefix, $order_id);
  238. if ($prefix == 'invoice') {
  239. \Cfg::save('ORDER_INVOICE_NUMBER', $params['number']);
  240. } else {
  241. \Cfg::save('ORDER_DTD_NUMBER', $params['number']);
  242. }
  243. }
  244. static function createDocumentFile($type, $order_id)
  245. {
  246. /* @var $order Order */
  247. $order = Order::getObj($order_id);
  248. if ($type == 'invoice' and feats()->bladeReceipts()) {
  249. $order->createFeeDocumentFile();
  250. return;
  251. }
  252. $data = ($type == 'invoice') ? $order->getInvoiceData() : $order->getDeliveryData();
  253. //$filename = $data['filename'];
  254. audit($order->toArray(), __METHOD__);
  255. audit($data, __METHOD__);
  256. $pdf = PDF::loadView('pdf.' . $type, $data);
  257. if (File::exists($data['filepath'])) {
  258. File::delete($data['filepath']);
  259. }
  260. $output = $pdf->output();
  261. File::put($data['filepath'], $output);
  262. }
  263. static function getMessages($order_id)
  264. {
  265. $order = self::getOrder($order_id);
  266. $messages = $order->getMessages();
  267. return Theme::partial('order.messages', ['obj' => $order, 'rows' => $messages]);
  268. }
  269. static function getRmaMessages($rma_id)
  270. {
  271. $rma = self::getRma($rma_id);
  272. $messages = $rma->getMessages();
  273. return Theme::partial('rma.messages', ['obj' => $rma, 'rows' => $messages]);
  274. }
  275. static function getRmaTable($order_id)
  276. {
  277. $order = self::getOrder($order_id);
  278. $rma = $order->getRma();
  279. return Theme::partial('order.rmas', ['obj' => $order, 'rows' => $rma]);
  280. }
  281. static function getWarehouseByOrder(\Order $order)
  282. {
  283. $mode = $order->getMode();
  284. if ($mode == 'local') {
  285. return 'LC';
  286. }
  287. if ($mode == 'shop') {
  288. return 'NG';
  289. }
  290. if ($mode == 'online') {
  291. return $order->warehouse;
  292. }
  293. return null;
  294. }
  295. /**
  296. * @param Order $order
  297. * @param $receipt
  298. * @return bool
  299. */
  300. static function isReceiptValid(Order $order, $receipt)
  301. {
  302. $valid = false;
  303. $receipt = trim($receipt);
  304. if ($receipt != '') {
  305. $len = strlen($receipt);
  306. //offline payment
  307. if ($order->getPayment()->online == 0) {
  308. //check if the code is only numeric, and the "valid" lenghts are 11 (CRO), 13 (Scontrino) and 15 (CRO by Poste)
  309. /*if (ctype_digit($receipt) and ($len == 11 or $len == 13 or $len >= 15)) {
  310. $valid = true;
  311. }*/
  312. if ($len >= 10) {
  313. $valid = true;
  314. }
  315. } else {
  316. //online payment
  317. if ($len >= 10) {
  318. $valid = true;
  319. }
  320. }
  321. } else {
  322. $valid = true;
  323. }
  324. return $valid;
  325. }
  326. static function findBestShopByOrderDetails(Order $order, &$solvable = null)
  327. {
  328. if(feats()->switchDisabled(Core\Cfg::SERVICE_BESTSHOP_MIGRATION)){
  329. return null;
  330. }
  331. $products = $order->getProducts(false);
  332. /** @var services\Morellato\Database\Sql\Connection $connection */
  333. $connection = Core::getNegoziandoConnection();
  334. $connection->setDebug(true);
  335. $connection->setExcludeOrder($order->id);
  336. //cycle through the array to get the selected shop
  337. $avoid_shops = [];
  338. foreach ($products as $product) {
  339. if ($product->isModeShop()) {
  340. if ($product->availability_shop_id != '') {
  341. $avoid_shops[] = $product->availability_shop_id;
  342. }
  343. }
  344. }
  345. $deliveryStore = $order->getDeliveryStore();
  346. if ($deliveryStore) {
  347. $connection->addPreferredShop($deliveryStore->cd_neg);
  348. }
  349. $connection->setUnusedShops($avoid_shops);
  350. foreach ($products as $product) {
  351. if ($product->isModeShop()) {
  352. $row_solvable = $connection->addProduct($product->getSapSku(), $product->product_quantity, $product->product_id);
  353. if (is_array($solvable) and !empty($row_solvable)) {
  354. $solvable[$product->getSapSku()] = $row_solvable;
  355. }
  356. }
  357. }
  358. //return $connection->getBestMapping();
  359. return $connection->getBestShop(true);
  360. }
  361. static function assignBestShopToOrderDetails(Order $order, $best_shop)
  362. {
  363. if ($best_shop === null or trim($best_shop) === '')
  364. return;
  365. if(feats()->switchDisabled(Core\Cfg::SERVICE_BESTSHOP_MIGRATION)){
  366. return;
  367. }
  368. $products = $order->getProducts(false);
  369. /** @var services\Morellato\Database\Sql\Connection $connection */
  370. $connection = Core::getNegoziandoConnection();
  371. $connection->setDebug(true);
  372. $connection->setExcludeOrder($order->id);
  373. foreach ($products as $product) {
  374. if ($product->isModeShop()) {
  375. $connection->incrementTakenQuantity($product->getSapSku(), $best_shop, $product->product_quantity, true);
  376. }
  377. }
  378. }
  379. /**
  380. * @param $code
  381. * @return bool
  382. */
  383. static function isValidGlsCode($code)
  384. {
  385. $code = trim($code);
  386. $check = strlen($code) >= 6;
  387. if (true === $check)
  388. return true;
  389. return false;
  390. }
  391. /**
  392. * @param $code
  393. * @return bool
  394. */
  395. static function isNegCode($code)
  396. {
  397. $code = trim($code);
  398. //check if 'NEG'
  399. if (stripos($code, 'NEG') === 0)
  400. return true;
  401. return false;
  402. }
  403. }