Guest User

Untitled

a guest
Dec 12th, 2018
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.34 KB | None | 0 0
  1. <?xml version="1.0"?>
  2. <config>
  3. <modules>
  4. <Vish_StockMovements>
  5. <version>1.1.0</version>
  6. </Vish_StockMovements>
  7. </modules>
  8. <global>
  9. <resources>
  10. <vish_stockmovements_setup>
  11. <setup>
  12. <module>Vish_StockMovements</module>
  13. </setup>
  14. </vish_stockmovements_setup>
  15. </resources>
  16. <blocks>
  17. <vish_stockmovements>
  18. <class>Vish_StockMovements_Block</class>
  19. </vish_stockmovements>
  20. </blocks>
  21. <helpers>
  22. <vish_stockmovements>
  23. <class>Vish_StockMovements_Helper</class>
  24. </vish_stockmovements>
  25. </helpers>
  26. <models>
  27. <vish_stockmovements>
  28. <class>Vish_StockMovements_Model</class>
  29. <resourceModel>vish_stockmovements_resource</resourceModel>
  30. </vish_stockmovements>
  31. <vish_stockmovements_resource>
  32. <class>Vish_StockMovements_Model_Resource</class>
  33. <entities>
  34. <stock_movement>
  35. <table>vish_stock_movement</table>
  36. </stock_movement>
  37. </entities>
  38. </vish_stockmovements_resource>
  39. <cataloginventory>
  40. <rewrite>
  41. <stock>Vish_StockMovements_Model_CatalogInventory_Stock</stock>
  42. </rewrite>
  43. </cataloginventory>
  44. </models>
  45. <events>
  46. <checkout_submit_all_after>
  47. <observers>
  48. <vish_stockmovements>
  49. <class>vish_stockmovements/stock_observer</class>
  50. <method>checkoutAllSubmitAfter</method>
  51. </vish_stockmovements>
  52. </observers>
  53. </checkout_submit_all_after>
  54. <cataloginventory_stock_item_save_after>
  55. <observers>
  56. <vish_stockmovements>
  57. <type>singleton</type>
  58. <class>vish_stockmovements/stock_observer</class>
  59. <method>saveStockItemAfter</method>
  60. </vish_stockmovements>
  61. </observers>
  62. </cataloginventory_stock_item_save_after>
  63. <cataloginventory_stock_revert_products_sale>
  64. <observers>
  65. <vish_stockmovements>
  66. <class>vish_stockmovements/stock_observer</class>
  67. <method>stockRevertProductsSale</method>
  68. </vish_stockmovements>
  69. </observers>
  70. </cataloginventory_stock_revert_products_sale>
  71. <catalog_product_import_finish_before>
  72. <observers>
  73. <vish_stockmovements>
  74. <class>vish_stockmovements/stock_observer</class>
  75. <method>catalogProductImportFinishBefore</method>
  76. </vish_stockmovements>
  77. </observers>
  78. </catalog_product_import_finish_before>
  79. <controller_action_layout_render_before_adminhtml_catalog_product_edit>
  80. <observers>
  81. <vish_stockmovements>
  82. <class>vish_stockmovements/stock_observer</class>
  83. <method>addStockMovementsTab</method>
  84. </vish_stockmovements>
  85. </observers>
  86. </controller_action_layout_render_before_adminhtml_catalog_product_edit>
  87. <sales_order_item_cancel>
  88. <observers>
  89. <inventory><type>disabled</type></inventory>
  90. <vish_stockmovements>
  91. <class>vish_stockmovements/stock_observer</class>
  92. <method>cancelOrderItem</method>
  93. </vish_stockmovements>
  94. </observers>
  95. </sales_order_item_cancel>
  96. </events>
  97. </global>
  98. <adminhtml>
  99. <translate>
  100. <modules>
  101. <Vish_StockMovements>
  102. <files>
  103. <default>Vish_StockMovements.csv</default>
  104. </files>
  105. </Vish_StockMovements>
  106. </modules>
  107. </translate>
  108. </adminhtml>
  109. <admin>
  110. <routers>
  111. <adminhtml>
  112. <args>
  113. <modules>
  114. <Vish_StockMovements before="Mage_Adminhtml">Vish_StockMovements_Adminhtml</Vish_StockMovements>
  115. </modules>
  116. </args>
  117. </adminhtml>
  118. </routers>
  119. </admin>
  120. </config>
  121.  
  122. <?php
  123. /**
  124. * @category Vish
  125. * @package Vish_StockMovements
  126. * @version 1.0.0
  127. */
  128. class Vish_StockMovements_Model_Stock_Observer
  129. {
  130. public function addStockMovementsTab()
  131. {
  132.  
  133.  
  134. $layout = Mage::getSingleton('core/layout');
  135. /** @var Mage_Adminhtml_Block_Catalog_Product_Edit_Tabs $block */
  136. $block = $layout->getBlock('product_tabs');
  137. $manageStock = $block->getProduct()->getStockItem()->getManageStock();
  138. if ($block && $block->getProduct() && $block->getProduct()->getTypeId() == 'simple') {
  139. $block->addTab('stock_movements', array(
  140. 'after' => 'inventory',
  141. 'label' => Mage::helper('vish_stockmovements')->__('Stock Movements'),
  142. 'content' => $layout->createBlock('vish_stockmovements/adminhtml_stock_movement_grid')->toHtml(),
  143. ));
  144. }
  145. }
  146.  
  147. public function cancelOrderItem($observer)
  148. {
  149. $item = $observer->getEvent()->getItem();
  150.  
  151. $children = $item->getChildrenItems();
  152. $qty = $item->getQtyOrdered() - max($item->getQtyShipped(), $item->getQtyInvoiced()) - $item->getQtyCanceled();
  153. $manageStock = $item->getProduct()->getStockItem()->getManageStock();
  154. if ($manageStock && $item->getId() && ($productId = $item->getProductId()) && empty($children) && $qty) {
  155. Mage::getSingleton('cataloginventory/stock')->backItemQty($productId, $qty);
  156. $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($item->getProductId());
  157. $this->insertStockMovement($stockItem, sprintf(
  158. 'Product restocked after order cancellation (order: %s)',
  159. $item->getOrder()->getIncrementId())
  160. );
  161. }
  162.  
  163. return $this;
  164. }
  165.  
  166. public function catalogProductImportFinishBefore($observer)
  167. {
  168. $productIds = array();
  169. $adapter = $observer->getEvent()->getAdapter();
  170. $resource = Mage::getResourceModel('vish_stockmovements/stock_movement');
  171.  
  172. if ($adapter instanceof Mage_Catalog_Model_Convert_Adapter_Product) {
  173. $productIds = $adapter->getAffectedEntityIds();
  174. } else {
  175. Mage_ImportExport_Model_Import::getDataSourceModel()->getIterator()->rewind();
  176. $skus = array();
  177. while ($bunch = $adapter->getNextBunch()) {
  178. foreach ($bunch as $rowData) {
  179. if (null !== $rowData['sku']) {
  180. $skus[] = $rowData['sku'];
  181. }
  182. }
  183. }
  184. if (!empty($skus)) {
  185. $productIds = $resource->getProductsIdBySku($skus);
  186. }
  187. }
  188.  
  189. if (!empty($productIds)) {
  190. $stock = Mage::getSingleton('cataloginventory/stock');
  191. $stocks = Mage::getResourceModel('cataloginventory/stock')->getProductsStock($stock, $productIds);
  192. $stocksMovements = array();
  193. $datetime = Varien_Date::formatDate(time());
  194. foreach ($stocks as $stockData) {
  195. $manageStock = ($stockData['manage_stock'] == 1 || $stockData['use_config_manage_stock'] == 1 ? true : false);
  196. if($manageStock === true){
  197. $stocksMovements[] = array(
  198. 'item_id' => $stockData['item_id'],
  199. 'user' => $this->_getUsername(),
  200. 'user_id' => $this->_getUserId(),
  201. 'qty' => $stockData['qty'],
  202. 'is_in_stock' => (int) $stockData['is_in_stock'],
  203. 'message' => 'Product import',
  204. 'created_at' => $datetime,
  205. );
  206. }
  207. }
  208.  
  209. if (!empty($stocksMovements)) {
  210. $resource->insertStocksMovements($stocksMovements);
  211. }
  212. }
  213. }
  214.  
  215. public function checkoutAllSubmitAfter($observer)
  216. {
  217. if ($observer->getEvent()->hasOrders()) {
  218. $orders = $observer->getEvent()->getOrders();
  219. } else {
  220. $orders = array($observer->getEvent()->getOrder());
  221. }
  222. $stockItems = array();
  223. foreach ($orders as $order) {
  224. if ($order) {
  225. foreach ($order->getAllItems() as $orderItem) {
  226. /** @var Mage_Sales_Model_Order_Item $orderItem */
  227. if ($orderItem->getQtyOrdered() && $orderItem->getProductType() == 'simple') {
  228. $stockItem = Mage::getModel('cataloginventory/stock_item')
  229. ->loadByProduct($orderItem->getProductId());
  230. if($stockItem->getManageStock()){
  231. if (!isset($stockItems[$stockItem->getId()])) {
  232. $stockItems[$stockItem->getId()] = array(
  233. 'item' => $stockItem,
  234. 'orders' => array($order->getIncrementId()),
  235. );
  236. } else {
  237. $stockItems[$stockItem->getId()]['orders'][] = $order->getIncrementId();
  238. }
  239. }
  240. }
  241.  
  242. }
  243. }
  244. }
  245.  
  246. if (!empty($stockItems)) {
  247. foreach ($stockItems as $data) {
  248. $this->insertStockMovement($data['item'], sprintf(
  249. 'Product ordered (order%s: %s)',
  250. count($data['orders']) > 1 ? 's' : '',
  251. implode(', ', $data['orders'])
  252. ));
  253. }
  254. }
  255. }
  256.  
  257. public function insertStockMovement(Mage_CatalogInventory_Model_Stock_Item $stockItem, $message = '')
  258. {
  259. if ($stockItem->getId()) {
  260. Mage::getModel('vish_stockmovements/stock_movement')
  261. ->setItemId($stockItem->getId())
  262. ->setUser($this->_getUsername())
  263. ->setUserId($this->_getUserId())
  264. ->setIsAdmin((int) Mage::getSingleton('admin/session')->isLoggedIn())
  265. ->setQty($stockItem->getQty())
  266. ->setIsInStock((int) $stockItem->getIsInStock())
  267. ->setMessage($message)
  268. ->save();
  269. Mage::getModel('catalog/product')->load($stockItem->getProductId())->cleanCache();
  270. }
  271. }
  272.  
  273. public function saveStockItemAfter($observer)
  274. {
  275.  
  276. if ($actionInstance = Mage::app()->getFrontController()->getAction()->getFullActionName() == 'adminhtml_catalog_product_save') {
  277. $stockItem = $observer->getEvent()->getItem();
  278. if (!$stockItem->getStockStatusChangedAutomaticallyFlag() && $stockItem->getOriginalInventoryQty() != $stockItem->getQty()) {
  279. if (!$message = $stockItem->getSaveMovementMessage()) {
  280. if (Mage::getSingleton('api/session')->getSessionId()) {
  281. $message = 'Stock saved from Magento API';
  282. } else {
  283. $message = 'Stock saved manually';
  284. }
  285. }
  286. $this->insertStockMovement($stockItem, $message);
  287. }
  288. }
  289. }
  290.  
  291. public function stockRevertProductsSale($observer)
  292. {
  293. $items = $observer->getEvent()->getItems();
  294. foreach ($items as $productId => $item) {
  295. $stockItem = Mage::getModel('cataloginventory/stock_item')->loadByProduct($productId);
  296. if ($stockItem->getManageStock() && $stockItem->getId()) {
  297. $message = 'Product restocked';
  298. if ($creditMemo = Mage::registry('current_creditmemo')) {
  299. $message = sprintf(
  300. 'Product restocked after credit memo creation (credit memo: %s)',
  301. $creditMemo->getIncrementId()
  302. );
  303. }
  304. $this->insertStockMovement($stockItem, $message);
  305. }
  306. }
  307. }
  308.  
  309. protected function _getUserId()
  310. {
  311. $userId = null;
  312. if (Mage::getSingleton('customer/session')->isLoggedIn()) {
  313. $userId = Mage::getSingleton('customer/session')->getCustomerId();
  314. } elseif (Mage::getSingleton('admin/session')->isLoggedIn()) {
  315. $userId = Mage::getSingleton('admin/session')->getUser()->getId();
  316. }
  317.  
  318. return $userId;
  319. }
  320.  
  321. protected function _getUsername()
  322. {
  323. $username = '-';
  324. if (Mage::getSingleton('api/session')->isLoggedIn()) {
  325. $username = Mage::getSingleton('api/session')->getUser()->getUsername();
  326. } elseif (Mage::getSingleton('customer/session')->isLoggedIn()) {
  327. $username = Mage::getSingleton('customer/session')->getCustomer()->getName();
  328. } elseif (Mage::getSingleton('admin/session')->isLoggedIn()) {
  329. $username = Mage::getSingleton('admin/session')->getUser()->getUsername();
  330. }
  331.  
  332. return $username;
  333. }
  334. }
Add Comment
Please, Sign In to add comment