PageRenderTime 65ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 0ms

/erply/app/code/community/Eepohs/Erply/Model/Cron.php

https://github.com/erplyopensource/magento-integration
PHP | 452 lines | 354 code | 64 blank | 34 comment | 84 complexity | 7ac50d55ffa03520955bb8e1f5db4620 MD5 | raw file
Possible License(s): GPL-2.0
  1. <?php
  2. /**
  3. * NB! This is a BETA release of Erply Connector.
  4. *
  5. * Use with caution and at your own risk.
  6. *
  7. * The author does not take any responsibility for any loss or damage to business
  8. * or customers or anything at all. These terms may change without further notice.
  9. *
  10. * License terms are subject to change. License is all-restrictive until
  11. * said otherwise.
  12. *
  13. * @author Eepohs Ltd
  14. */
  15. class Eepohs_Erply_Model_Cron extends Eepohs_Erply_Model_Erply
  16. {
  17. public function __construct() {
  18. $pCollection = Mage::getSingleton('index/indexer')->getProcessesCollection();
  19. foreach ($pCollection as $process) {
  20. $process->setMode(Mage_Index_Model_Process::MODE_MANUAL)->save();
  21. }
  22. }
  23. public function __destruct() {
  24. $pCollection = Mage::getSingleton('index/indexer')->getProcessesCollection();
  25. foreach ($pCollection as $process) {
  26. $process->setMode(Mage_Index_Model_Process::MODE_REAL_TIME)->save();
  27. }
  28. }
  29. /**
  30. * @param $timescheduled Y-m-d H:M:S
  31. * @throws Exception
  32. */
  33. public function addCronJob($jobCode, $schedule = null)
  34. {
  35. $timecreated = strftime("%Y-%m-%d %H:%M:%S", mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")));
  36. Mage::helper('Erply')->log("Scheduled at:".$schedule);
  37. if (!$schedule) {
  38. $timescheduled = strftime("%Y-%m-%d %H:%M:%S", mktime(date("H"), date("i") + 5, date("s"), date("m"), date("d"), date("Y")));
  39. } else {
  40. $timescheduled = $schedule;
  41. }
  42. try {
  43. $schedule = Mage::getModel('cron/schedule');
  44. $schedule->setJobCode($jobCode)
  45. ->setCreatedAt($timecreated)
  46. ->setScheduledAt($timescheduled)
  47. ->setStatus(Mage_Cron_Model_Schedule::STATUS_PENDING)
  48. ->save();
  49. } catch (Exception $e) {
  50. throw new Exception(Mage::helper('cron')->__('Unable to save Cron expression'));
  51. }
  52. }
  53. public function importCategories()
  54. {
  55. $queue = Mage::getModel('Erply/Queue')->loadActive('erply_category_import');
  56. if (count($queue) > 0) {
  57. foreach ($queue as $item) {
  58. if ($item) {
  59. $runEvery = Mage::getStoreConfig('eepohs_erply/queue/run_every', $item->getStoreId());
  60. if(!Mage::getStoreConfig('eepohs_erply/account/enabled', $item->getStoreId())) {
  61. return false;
  62. }
  63. $loops = $item->getLoopsPerRun();
  64. $pageSize = $item->getRecordsPerRun();
  65. $recordsLeft = $item->getTotalRecords() - $pageSize * $item->getLastPageNo();
  66. if ($loops * $pageSize > $recordsLeft) {
  67. $loops = ceil($recordsLeft / $pageSize);
  68. $item->setStatus(0);
  69. } else {
  70. $thisRunTime = strtotime($item->getScheduledAt());
  71. $newRunTime = strtotime('+' . $runEvery . 'minute', $thisRunTime);
  72. $scheduleDateTime = date('Y-m-d H:i:s', $newRunTime);
  73. $item->setScheduledAt($scheduleDateTime);
  74. }
  75. $loops--;
  76. $firstPage = $item->getLastPageNo() + 1;
  77. $item->setLastPageNo($firstPage + $loops);
  78. $item->setUpdatedAt(date('Y-m-d H:i:s', time()));
  79. $item->save();
  80. $this->verifyUser($item->getStoreId());
  81. for ($i = $firstPage; $i <= ($firstPage + $loops + 1); $i++) {
  82. $parameters = array('recordsOnPage' => $pageSize, 'pageNo' => $i);
  83. $result = $this->sendRequest('getProductGroups', $parameters);
  84. // $return = "";
  85. $output = json_decode($result, true);
  86. Mage::helper('Erply')->log("Erply Categories Response: " . $result);
  87. if ($output["status"]["responseStatus"] == "error" || count($output["records"]) == 0) return false;
  88. // $start = time();
  89. $categories = $output["records"];
  90. if($item->getStoreId() == 0) {
  91. $rootCategory = Mage::app()->getWebsite(true)->getDefaultStore()->getRootCategoryId();
  92. } else {
  93. $rootCategory = Mage::getModel('core/store')->load($item->getStoreId())->getRootCategoryId();
  94. }
  95. Mage::getModel('Erply/Category_Import')->addCategories($categories, $rootCategory, $item->getStoreId());
  96. }
  97. }
  98. }
  99. if( $scheduleDateTime ) {
  100. Mage::getModel('Erply/Cron')->addCronJob('erply_category_import', $scheduleDateTime);
  101. }
  102. }
  103. }
  104. public function updateInventory()
  105. {
  106. $code = 'erply_inventory_update';
  107. $queue = Mage::getModel('Erply/Queue')->loadActive($code);
  108. $scheduleDateTime = false;
  109. $params = array('getStockInfo' => 1);
  110. if (count($queue) > 0) {
  111. foreach ($queue as $item) {
  112. if ($item) {
  113. $runEvery = Mage::getStoreConfig('eepohs_erply/queue/run_every', $item->getStoreId());
  114. $loops = $item->getLoopsPerRun();
  115. $pageSize = $item->getRecordsPerRun();
  116. $recordsLeft = $item->getTotalRecords() - $pageSize * $item->getLastPageNo();
  117. if ($item->getChangedSince()) {
  118. $params['changedSince'] = $item->getChangedSince();
  119. }
  120. if ($loops * $pageSize > $recordsLeft) {
  121. $loops = ceil($recordsLeft / $pageSize);
  122. $item->setStatus(0);
  123. } else {
  124. $thisRunTime = strtotime($item->getScheduledAt());
  125. $newRunTime = strtotime('+' . $runEvery . 'minute', $thisRunTime);
  126. $scheduleDateTime = date('Y-m-d H:i:s', $newRunTime);
  127. $item->setScheduledAt($scheduleDateTime);
  128. }
  129. $loops--;
  130. $firstPage = $item->getLastPageNo() + 1;
  131. $item->setLastPageNo($firstPage + $loops);
  132. $item->setUpdatedAt(date('Y-m-d H:i:s', time()));
  133. $item->save();
  134. $this->verifyUser($item->getStoreId());
  135. // $parameters = array('recordsOnPage' => $pageSize, 'pageNo' => $i, 'getStockInfo' => 1,
  136. // 'displayedInWebshop' => 1,
  137. // 'active' => 1);
  138. $params["warehouseID"] = Mage::getStoreConfig('eepohs_erply/product/warehouse', $item->getStoreId());
  139. $result = $this->sendRequest('getProductStock', $params);
  140. // $return = "";
  141. $output = json_decode($result, true);
  142. // Mage::helper('Erply')->log("Erply Stock Response: " . $result);
  143. if ($output["status"]["responseStatus"] == "error" || count($output["records"]) == 0) return false;
  144. // $start = time();
  145. if(empty($output["records"])) continue;
  146. $stockData = $output["records"];
  147. for ($i = $firstPage; $i <= ($firstPage + $loops); $i++) {
  148. $start = ($i-1)*$pageSize;
  149. $end = $start+$pageSize-1;
  150. if($end >= count($stockData)) {
  151. $end = count($stockData)-1;
  152. }
  153. Mage::getModel('Erply/Inventory')->updateInventory($stockData, $item->getStoreId(), $start, $end);
  154. // $return = "";
  155. if($end == count($stockData))break;
  156. // Mage::helper('Erply')->log("Erply Prices Response: " . $result);
  157. }
  158. }
  159. }
  160. if ($scheduleDateTime) {
  161. Mage::getModel('Erply/Cron')->addCronJob($code, $scheduleDateTime);
  162. }
  163. }
  164. }
  165. public function updatePrices()
  166. {
  167. $code = 'erply_price_update';
  168. $queue = Mage::getModel('Erply/Queue')->loadActive($code);
  169. $scheduleDateTime = false;
  170. $params = array();
  171. if (count($queue) > 0) {
  172. foreach ($queue as $item) {
  173. if ($item) {
  174. $pricelistId = Mage::getStoreConfig('eepohs_erply/product/pricelist', $item->getStoreId());
  175. $params["pricelistID"] = $pricelistId;
  176. $runEvery = Mage::getStoreConfig('eepohs_erply/queue/run_every', $item->getStoreId());
  177. $recordPerRun = Mage::getStoreConfig('eepohs_erply/queue/records_per_run', $item->getStoreId());
  178. $loops = $item->getLoopsPerRun();
  179. $pageSize = $item->getRecordsPerRun();
  180. $recordsLeft = $item->getTotalRecords() - $pageSize * $item->getLastPageNo();
  181. if ($item->getChangedSince()) {
  182. $params['changedSince'] = $item->getChangedSince();
  183. }
  184. if ($loops * $pageSize > $recordsLeft) {
  185. $loops = ceil($recordsLeft / $pageSize);
  186. $item->setStatus(0);
  187. } else {
  188. $thisRunTime = strtotime($item->getScheduledAt());
  189. $newRunTime = strtotime('+' . $runEvery . 'minute', $thisRunTime);
  190. $scheduleDateTime = date('Y-m-d H:i:s', $newRunTime);
  191. $item->setScheduledAt($scheduleDateTime);
  192. }
  193. $loops--;
  194. $firstPage = $item->getLastPageNo() + 1;
  195. //$item->setRecordsPerRun($recordPerRun );
  196. $item->setLastPageNo($firstPage + $loops);
  197. $item->setUpdatedAt(date('Y-m-d H:i:s', time()));
  198. $item->save();
  199. $this->verifyUser($item->getStoreId());
  200. $params["recordsOnPage"] = 1;
  201. $params["pageNo"] = 0;
  202. $result = $this->sendRequest('getPriceLists', $params);
  203. $output = json_decode($result, true);
  204. if ($output["status"]["responseStatus"] == "error" || count($output["records"]) == 0) return false;
  205. // $start = time();
  206. $rules = $output["records"][0]["pricelistRules"];
  207. for ($i = $firstPage; $i <= ($firstPage + $loops); $i++) {
  208. $start = ($i-1)*$pageSize;
  209. $end = $start+$pageSize-1;
  210. if($end >= count($rules)) {
  211. $end = count($rules)-1;
  212. }
  213. Mage::getModel('Erply/Price')->updatePrices($rules, $item->getStoreId(),$start, $end);
  214. // $return = "";
  215. if($end == count($rules))break;
  216. // Mage::helper('Erply')->log("Erply Prices Response: " . $result);
  217. }
  218. }
  219. }
  220. if ($scheduleDateTime) {
  221. Mage::getModel('Erply/Cron')->addCronJob($code, $scheduleDateTime);
  222. }
  223. }
  224. }
  225. public function importProducts()
  226. {
  227. Mage::app()->setCurrentStore(Mage_Core_Model_App::ADMIN_STORE_ID);
  228. $queue = Mage::getModel('Erply/Queue')->loadActive('erply_product_import');
  229. $params = array();
  230. $scheduleDateTime = false;
  231. if (count($queue) > 0) {
  232. foreach ($queue as $item) {
  233. if ($item) {
  234. $storeId = $item->getStoreId();
  235. if(Mage::getStoreConfig('eepohs_erply/update_schedule/only_main')) {
  236. if(!Mage::getStoreConfig('eepohs_erply/account/is_main',$storeId)) {
  237. continue;
  238. }
  239. }
  240. $runEvery = Mage::getStoreConfig('eepohs_erply/queue/run_every', $item->getStoreId());
  241. $loops = $item->getLoopsPerRun();
  242. $pageSize = $item->getRecordsPerRun();
  243. $recordsLeft = $item->getTotalRecords() - $pageSize * $item->getLastPageNo();
  244. if ($item->getChangedSince() > 0) {
  245. $params['changedSince'] = $item->getChangedSince();
  246. $storeId = $item->getStoreId();
  247. } else {
  248. $storeId = 0;
  249. }
  250. if(Mage::getStoreConfig('eepohs_erply/update_schedule/only_main')) {
  251. $storeId = 0;
  252. }
  253. if ($loops * $pageSize > $recordsLeft) {
  254. $loops = ceil($recordsLeft / $pageSize);
  255. $item->setStatus(0);
  256. } else {
  257. $thisRunTime = strtotime($item->getScheduledAt());
  258. $newRunTime = strtotime('+' . $runEvery . 'minute', $thisRunTime);
  259. $scheduleDateTime = date('Y-m-d H:i:s', $newRunTime);
  260. $item->setScheduledAt($scheduleDateTime);
  261. }
  262. $loops--;
  263. $firstPage = $item->getLastPageNo() + 1;
  264. $item->setLastPageNo($firstPage + $loops);
  265. $item->setUpdatedAt(date('Y-m-d H:i:s', time()));
  266. $item->save();
  267. $this->verifyUser($item->getStoreId());
  268. $store = Mage::getModel('core/store')->load($item->getStoreId());
  269. for ($i = $firstPage; $i <= ($firstPage + $loops); $i++) {
  270. $parameters = array_merge(array(
  271. 'recordsOnPage' => $pageSize,
  272. 'pageNo' => $i,
  273. 'displayedInWebshop' => 1,
  274. 'active' => 1
  275. ), $params);
  276. Mage::helper('Erply')->log("Erply request: ");
  277. Mage::helper('Erply')->log($parameters);
  278. $result = $this->sendRequest('getProducts', $parameters);
  279. $return = "";
  280. Mage::helper('Erply')->log("Erply product import:");
  281. // Mage::helper('Erply')->log($result);
  282. $output = json_decode($result, true);
  283. if ($output["status"]["responseStatus"] == "error" || count($output["records"]) == 0) return false;
  284. $start = time();
  285. $products = $output["records"];
  286. Mage::getModel('Erply/Product')->importProducts($products, $storeId, $store);
  287. unset($output);
  288. }
  289. }
  290. }
  291. if( $scheduleDateTime ) {
  292. Mage::getModel('Erply/Cron')->addCronJob('erply_product_import', $scheduleDateTime);
  293. }
  294. }
  295. }
  296. public function importImages() {
  297. $queue = Mage::getModel('Erply/Queue')->loadActive('erply_image_import');
  298. $params = array();
  299. $scheduleDateTime = false;
  300. if (count($queue) > 0) {
  301. foreach ($queue as $item) {
  302. if ($item) {
  303. $runEvery = Mage::getStoreConfig('eepohs_erply/queue/run_every');
  304. $loops = 1;
  305. $pageSize = floor(450 /(60/$runEvery));
  306. $recordsLeft = $item->getTotalRecords() - $pageSize * $item->getLastPageNo();
  307. if ($item->getChangedSince()) {
  308. $params = array('changedSince' => $item->getChangedSince());
  309. }
  310. if ($loops * $pageSize > $recordsLeft) {
  311. $loops = ceil($recordsLeft / $pageSize);
  312. $item->setStatus(0);
  313. } else {
  314. $thisRunTime = strtotime($item->getScheduledAt());
  315. $newRunTime = strtotime('+' . $runEvery . 'minute', $thisRunTime);
  316. $scheduleDateTime = date('Y-m-d H:i:s', $newRunTime);
  317. $item->setScheduledAt($scheduleDateTime);
  318. }
  319. $loops--;
  320. $firstPage = $item->getLastPageNo() + 1;
  321. $item->setPageSize($pageSize);
  322. $item->setLastPageNo($firstPage + $loops);
  323. $item->setUpdatedAt(date('Y-m-d H:i:s', time()));
  324. $item->save();
  325. $this->verifyUser($item->getStoreId());
  326. $store = Mage::getModel('core/store')->load($item->getStoreId());
  327. for ($i = $firstPage; $i <= ($firstPage + $loops + 1); $i++) {
  328. $parameters = array('recordsOnPage' => $pageSize, 'pageNo' => $i,
  329. 'displayedInWebshop' => 1,
  330. 'active' => 1);
  331. $result = $this->sendRequest('getProducts', $parameters);
  332. // $return = "";
  333. $output = json_decode($result, true);
  334. Mage::helper('Erply')->log("Erply Images Response: " . $result);
  335. if ($output["status"]["responseStatus"] == "error" || count($output["records"]) == 0) return false;
  336. // $start = time();
  337. $products = $output["records"];
  338. Mage::getModel('Erply/Image')->updateImages($products, $item->getStoreId());
  339. }
  340. }
  341. }
  342. if( $scheduleDateTime ) {
  343. Mage::getModel('Erply/Cron')->addCronJob('erply_image_import', $scheduleDateTime);
  344. }
  345. }
  346. }
  347. public function checkPendingOrders() {
  348. $orders = Mage::getModel('sales/order')->getCollection()->addAttributeToSelect("*")->addAttributeToFilter('status', 'processing');
  349. $params = array();
  350. if($orders->getSize() > 0) {
  351. Mage::helper('Erply')->log("Starting order status checking");
  352. Mage::helper('Erply')->log("Found ".$orders->getSize()." pending orders in Magento");
  353. foreach($orders as $order) {
  354. $isComplete = false;
  355. $storeId = $order->getStoreId();
  356. $e = new $this;
  357. $e->verifyUser($storeId);
  358. $params["number"] = $order->getIncrementId();
  359. Mage::helper('Erply')->log("Request to Erply for Magento order #".$order->getIncrementId()." - ".print_r($params, true));
  360. $request = $e->sendRequest('getSalesDocuments', $params);
  361. $output = json_decode($request, true);
  362. Mage::helper('Erply')->log("Reponse from Erply for Magento order #".$order->getIncrementId()." - ".print_r($output, true));
  363. if ($output["status"]["responseStatus"] == "error" || count($output["records"]) == 0) continue;
  364. $erpOrder = $output["records"][0];
  365. try {
  366. if($erpOrder["invoiceState"] == "SHIPPED" || $erpOrder["invoiceState"] == "FULFILLED") {
  367. $shipment = $order->prepareShipment();
  368. $shipment->register();
  369. $order->setIsInProcess(true);
  370. $order->addStatusHistoryComment('Order is now Complete.', false);
  371. $transactionSave = Mage::getModel('core/resource_transaction')
  372. ->addObject($shipment)
  373. ->addObject($shipment->getOrder())
  374. ->save();
  375. Mage::helper('Erply')->log("Marked order #".$order->getIncrementId()." as Completed");
  376. } elseif($erpOrder["invoiceState"] == "CANCELLED") {
  377. if($order->canCancel()) {
  378. $order->cancel()->save();
  379. Mage::helper('Erply')->log("Marked order #".$order->getIncrementId()." as Cancelled");
  380. }
  381. }
  382. }catch (Exception $e) {
  383. Mage::helper('Erply')->log("Failed to change order status: ".$e->getMessage());
  384. }
  385. }
  386. }
  387. }
  388. }