From 4808947fcd7627edf23fed04da945d6728af3959 Mon Sep 17 00:00:00 2001 From: NyanLinHtut Date: Fri, 13 Sep 2019 21:13:04 +0630 Subject: [PATCH] fixed inventory --- .../origami/payments_controller.rb | 4 +- .../origami/sale_edit_controller.rb | 49 +++++----- app/controllers/origami/sales_controller.rb | 2 +- app/models/inventory_definition.rb | 95 ++++++------------- app/models/order_item.rb | 54 +++++++++++ app/models/sale.rb | 19 ++++ app/models/sale_item.rb | 40 +++++++- app/models/stock_journal.rb | 53 +++++------ .../inventory/stock_checks/index.html.erb | 84 ++++++++-------- 9 files changed, 228 insertions(+), 172 deletions(-) diff --git a/app/controllers/origami/payments_controller.rb b/app/controllers/origami/payments_controller.rb index 956f1a7b..c0260137 100755 --- a/app/controllers/origami/payments_controller.rb +++ b/app/controllers/origami/payments_controller.rb @@ -308,7 +308,7 @@ class Origami::PaymentsController < BaseOrigamiController logger.debug saleObj.to_json if !saleObj.nil? # InventoryJob.perform_now(self.id) - InventoryDefinition.calculate_product_count(saleObj) + # InventoryDefinition.calculate_product_count(saleObj) end end @@ -749,7 +749,7 @@ class Origami::PaymentsController < BaseOrigamiController # end if !saleObj.nil? #InventoryJob.perform_now(self.id) - InventoryDefinition.calculate_product_count(saleObj) + # InventoryDefinition.calculate_product_count(saleObj) end end end diff --git a/app/controllers/origami/sale_edit_controller.rb b/app/controllers/origami/sale_edit_controller.rb index b14ccc05..fb1dce31 100755 --- a/app/controllers/origami/sale_edit_controller.rb +++ b/app/controllers/origami/sale_edit_controller.rb @@ -10,7 +10,7 @@ class Origami::SaleEditController < BaseOrigamiController @table_id = nil @table_type = nil end - + @cashier_type = params[:type] @saleobj = Sale.find(sale_id) end @@ -39,19 +39,19 @@ class Origami::SaleEditController < BaseOrigamiController # re-calc tax saleObj = Sale.find(saleitemObj.sale_id) - - booking = Booking.find_by_sale_id(saleitemObj.sale_id) - booking.booking_orders.each do |bo| - order = Order.find(bo.order_id) - order.order_items.each do |o| - if saleitemObj.product_code == o.item_code - o.qty = saleitemObj.qty * -1 - o.price = saleitemObj.price * -1 - o.save - end - end - end - # FOr Sale Audit + + # booking = Booking.find_by_sale_id(saleitemObj.sale_id) + # booking.booking_orders.each do |bo| + # order = Order.find(bo.order_id) + # order.order_items.each do |o| + # if saleitemObj.product_code == o.item_code + # o.qty = saleitemObj.qty * -1 + # o.price = saleitemObj.price * -1 + # o.save + # end + # end + # end + # FOr Sale Audit action_by = current_user.name if access_code != "null" && current_user.role == "cashier" action_by = Employee.find_by_emp_id(access_code).name @@ -74,8 +74,7 @@ class Origami::SaleEditController < BaseOrigamiController saleitemObj.save @newsaleitem = SaleItem.new @newsaleitem = saleitemObj.dup - @newsaleitem.save - @newsaleitem.qty = saleitemObj.qty * -1 + @newsaleitem.qty = saleitemObj.qty * -1 @newsaleitem.unit_price = saleitemObj.unit_price * 1 @newsaleitem.taxable_price = saleitemObj.taxable_price * -1 @newsaleitem.price = saleitemObj.price * -1 @@ -147,7 +146,7 @@ class Origami::SaleEditController < BaseOrigamiController unless saleitemObj.product_name.include? 'updated' saleitemObj.product_name = saleitemObj.product_name + ' (UPDATED)' end - + saleitemObj.save # re-calc tax @@ -156,13 +155,13 @@ class Origami::SaleEditController < BaseOrigamiController order_id = SaleOrder.find_by_sale_id(saleitemObj.sale_id).order_id order = Order.find(order_id) - order.order_items.each do |o| - if saleitemObj.product_code == o.item_code - o.qty = update_qty - o.price = update_price - o.save - end - end + # order.order_items.each do |o| + # if saleitemObj.product_code == o.item_code + # o.qty = update_qty + # o.price = update_price + # o.save + # end + # end saleObj.compute_by_sale_items(saleObj.sale_id, saleObj.sale_items, saleObj.total_discount,order_source) @@ -229,5 +228,5 @@ class Origami::SaleEditController < BaseOrigamiController ProductCommission.remove_product_commission(item) end end - + end diff --git a/app/controllers/origami/sales_controller.rb b/app/controllers/origami/sales_controller.rb index 0549a5a5..01a1c70e 100755 --- a/app/controllers/origami/sales_controller.rb +++ b/app/controllers/origami/sales_controller.rb @@ -80,7 +80,7 @@ class Origami::SalesController < BaseOrigamiController # if !sale_data.empty? # InventoryJob.perform_now(self.id) # InventoryDefinition.calculate_product_count(nil,sale_data) - end + # end end end diff --git a/app/models/inventory_definition.rb b/app/models/inventory_definition.rb index 4232c7b3..e76b6fca 100755 --- a/app/models/inventory_definition.rb +++ b/app/models/inventory_definition.rb @@ -3,6 +3,9 @@ class InventoryDefinition < ApplicationRecord scope :active, -> {where(:is_active => true)} def self.calculate_product_count(saleObj=nil,saleobj_after_req_bill=nil) + # check_sj = StockJournal.where('item_code=?', item.item_instance_code).order("id DESC").first + logger.debug 'saleObj<<<<<<<<<<<<<<<<<<<<<<<<<<<' + logger.debug saleObj.sale_items.to_json if !saleObj.nil? saleObj.sale_items.each do |item| found, inventory_definition = find_product_in_inventory(item) @@ -34,81 +37,41 @@ class InventoryDefinition < ApplicationRecord end end - def self.check_balance(item,inventory_definition) # item => saleItemOBj + def self.check_balance(item, inventory_definition) # item => saleItemOBj stock = StockJournal.where('item_code=?', item.item_instance_code).order("id DESC").first unless stock.nil? modify_balance(item, stock, inventory_definition) else - StockJournal.add_to_journal(item, 0, "out of stock", inventory_definition) + puts "<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< OUT OF STOCK >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>" + StockJournal.add_to_journal(item.item_instance_code, item.qty, 0, "out of stock", inventory_definition, item.id, StockJournal::SALES_TRANS) end end def self.modify_balance(item, stock, inventory_definition) #saleitemObj - void_qty = 0 - if item.product_name.downcase.include?("void") - void_qty = item.qty.abs.to_i - end check_item = StockCheckItem.where('item_code=?', item.item_instance_code).order("id DESC").first - if stock.balance.to_i >= item.qty - puts ">> stock is greater than order qty" - if item.qty.to_i > 0 - StockJournal.add_to_journal(item, stock.balance, "ok", inventory_definition) - if !void_qty.nil? | void_qty != 0 - check_item.different = check_item.different - item.qty - check_item.save - end - else - if item.product_name.downcase.include?("void") - StockJournal.add_to_journal(item, stock.balance, "void", inventory_definition) - check_item.different = check_item.different + void_qty - check_item.save - end - end - else - puts " << stock is less than order qty" - data = item - extra_qty = item.qty.to_i - stock.balance.to_i - if stock.balance.to_i > 0 - item.qty = stock.balance.to_i - if item.qty.to_i > 0 - StockJournal.add_to_journal(item, stock.balance, "ok", inventory_definition) - check_item.different = check_item.different - item.qty - check_item.save - data.qty = extra_qty - StockJournal.add_to_journal(data, 0, "out of stock", inventory_definition) - if !void_qty.nil? | void_qty != 0 - check_item.different = check_item.different - item.qty - check_item.save - else - check_item.different = check_item.different + void_qty - check_item.save - end - else - if item.product_name.downcase.include?("void") - StockJournal.add_to_journal(item, stock.balance, "void", inventory_definition) - check_item.different = check_item.different + void_qty - check_item.save - end - end - else - if item.qty.to_i > 0 - StockJournal.add_to_journal(item, stock.balance, "out of stock", inventory_definition) - if !void_qty.nil? | void_qty != 0 - check_item.different = check_item.different - item.qty - check_item.save - else - check_item.different = check_item.different + void_qty - check_item.save - end - else - if item.product_name.downcase.include?("void") - StockJournal.add_to_journal(item, stock.balance, "void", inventory_definition) - check_item.different = check_item.different + void_qty - check_item.save - end - end - end - end + if item.qty.to_i >= 0 + qty = item.qty - item.qty_was + if !item.id_was.nil? + remark = "edit" + elsif stock.balance.to_i >= qty + puts ">> stock is greater than order qty" + remark = "ok" + else + puts " << stock is less than order qty" + remark = "out of stock" + end + else # item.qty < 0 + qty = item.qty + remark = "void" + end + if item.is_a? OrderItem + trans_type = StockJournal::ORDER_TRANS + elsif item.is_a? SaleItem + trans_type = StockJournal::SALES_TRANS + end + StockJournal.add_to_journal(item.item_instance_code, qty, stock.balance, remark, inventory_definition, item.id, trans_type) + check_item.different = check_item.different - qty + check_item.save end def self.search_by_category(cat_id) diff --git a/app/models/order_item.rb b/app/models/order_item.rb index 0ac03e9b..e2129cca 100755 --- a/app/models/order_item.rb +++ b/app/models/order_item.rb @@ -13,6 +13,15 @@ class OrderItem < ApplicationRecord # validates :qty, numericality: { :greater_than => 0 } validates_associated :order + after_save :update_stock_journal + + # after_update :update_stock_journal + + # after_save :add_to_journal, if: Proc.new { !self.id_changed? } + # after_save :update_stock_journal, if: Proc.new { self.id_changed? } + + + #This Method - handle how items is added into order # order_item : { # order_item_code : "", @@ -101,4 +110,49 @@ class OrderItem < ApplicationRecord self.order_items_id = SeedGenerator.generate_id(self.class.name, "ODI") end end + + def add_to_journal + defination = InventoryDefinition.find_by_item_code(self.item_instance_code) + stock = StockJournal.where('item_code = ?', self.item_instance_code).order("id DESC").first + journal = StockJournal.create( + item_code: self.item_instance_code, + credit: 0, + debit: self.qty, + balance: stock.balance - self.qty, + inventory_definition_id: defination.id, + remark: 'ok', + trans_ref: self.order.id, + trans_type: StockJournal::SALES_TRANS + ) + end + + def update_stock_journal + if self.qty != self.qty_was + found, inventory_definition = InventoryDefinition.find_product_in_inventory(self) + if found + InventoryDefinition.check_balance(self, inventory_definition) + end + end + # if self.qty > self.qty_was + # credit = 0 + # debit = self.qty.to_i - self.qty_was.to_i + # else + # credit = self.qty_was.to_i - self.qty.to_i + # debit = 0 + # end + # if credit != debit + # defination = InventoryDefinition.find_by_item_code(self.item_instance_code) + # stock = StockJournal.where('item_code = ?', self.item_instance_code).order("id DESC").first + # journal = StockJournal.create( + # item_code: self.item_instance_code, + # credit: credit, + # debit: debit, + # balance: stock.balance - debit + credit, + # inventory_definition_id: defination.id, + # remark: 'ok', + # trans_ref: self.order.id, + # trans_type: StockJournal::SALES_TRANS + # ) + # end + end end diff --git a/app/models/sale.rb b/app/models/sale.rb index 96cb8fae..d36afccf 100644 --- a/app/models/sale.rb +++ b/app/models/sale.rb @@ -16,6 +16,8 @@ class Sale < ApplicationRecord has_many :bookings has_many :product_commissions + after_update :update_stock_journal + scope :open_invoices, -> { where("sale_status = 'new' and receipt_date BETWEEN '#{DateTime.now.utc.end_of_day}' AND '#{DateTime.now.utc.beginning_of_day}'") } scope :complete_sale, -> { where("sale_status = 'completed' and receipt_date BETWEEN '#{DateTime.now.utc.beginning_of_day}' AND '#{DateTime.now.utc.end_of_day}'") } @@ -2970,4 +2972,21 @@ private self.sale_id = SeedGenerator.generate_id(self.class.name, "SAL") end end + + def update_stock_journal + if self.sale_status == "void" && self.sale_status_was != "void" + self.sale_items.each do |item| + found, inventory_definition = InventoryDefinition.find_product_in_inventory(item) + if found + stock = StockJournal.where('item_code=?', item.item_instance_code).order("id DESC").first + unless stock.nil? + check_item = StockCheckItem.where('item_code=?', item.item_instance_code).order("id DESC").first + StockJournal.add_to_journal(item.item_instance_code, -item.qty, stock.balance, "void", inventory_definition, item.id, StockJournal::SALES_TRANS) + check_item.different = check_item.different + item.qty + check_item.save + end + end + end + end + end end diff --git a/app/models/sale_item.rb b/app/models/sale_item.rb index bd97e5c5..960d9d4d 100755 --- a/app/models/sale_item.rb +++ b/app/models/sale_item.rb @@ -11,19 +11,21 @@ class SaleItem < ApplicationRecord def compute_item end + after_update :update_stock_journal + # Add Sale Items def self.add_sale_items(sale_items) sale_items.each do|saleitemObj| @newsaleitem = SaleItem.new @newsaleitem = saleitemObj.dup @newsaleitem.save - @newsaleitem.qty = saleitemObj.qty * (-1) + @newsaleitem.qty = saleitemObj.qty * (-1) @newsaleitem.unit_price = saleitemObj.unit_price * (-1) @newsaleitem.taxable_price = (saleitemObj.unit_price * saleitemObj.qty) * (-1) - @newsaleitem.price = (saleitemObj.unit_price * saleitemObj.qty) * (-1) + @newsaleitem.price = (saleitemObj.unit_price * saleitemObj.qty) * (-1) @newsaleitem.product_name = saleitemObj.product_name + ' (FOC)' @newsaleitem.save - end + end end def self.sync_sale_item_records(sale_items) @@ -118,7 +120,7 @@ class SaleItem < ApplicationRecord # Check for actual sale items sale_items.each do |si| - if si.account_id == a.id + if si.account_id == a.id account_price[:price] = account_price[:price] + si.price end end @@ -190,7 +192,7 @@ class SaleItem < ApplicationRecord total = 0 # Check for actual sale items sale_items.each do |si| - if si.product_code == "Other Charges" && si.item_instance_code == nil + if si.product_code == "Other Charges" && si.item_instance_code == nil total = total + si.price end end @@ -229,4 +231,32 @@ class SaleItem < ApplicationRecord self.sale_item_id = SeedGenerator.generate_id(self.class.name, "SLI") end end + + def update_stock_journal + is_void = self.status == "void" && self.status_was != "void" + cancel_void = self.status_was == "void" && self.status.nil? + is_edit = self.qty >= 0 && self.qty != self.qty_was + if is_void or cancel_void or is_edit + found, inventory_definition = InventoryDefinition.find_product_in_inventory(self) + if found + stock = StockJournal.where('item_code=?', self.item_instance_code).order("id DESC").first + unless stock.nil? + check_item = StockCheckItem.where('item_code=?', self.item_instance_code).order("id DESC").first + if is_void + qty = -self.qty + remark = "void" + elsif cancel_void + qty = self.qty + remark = "cancel void" + elsif is_edit + qty = self.qty - self.qty_was + remark = "edit" + end + StockJournal.add_to_journal(self.item_instance_code, qty, stock.balance, remark, inventory_definition, self.id, StockJournal::SALES_TRANS) + check_item.different = check_item.different + qty + check_item.save + end + end + end + end end diff --git a/app/models/stock_journal.rb b/app/models/stock_journal.rb index 037c164b..94d12275 100755 --- a/app/models/stock_journal.rb +++ b/app/models/stock_journal.rb @@ -1,44 +1,35 @@ class StockJournal < ApplicationRecord SALES_TRANS = "sale" + ORDER_TRANS = "order" STOCK_CHECK_TRANS = "stock_check" - def self.add_to_journal(item, balance, stock_message, inventory_definition) # item => saleObj | balance => Stock journal - journal = StockJournal.new - if item.qty < 0 - credit_balance = item.qty.abs.to_i - debit = 0 + def self.add_to_journal(item_instance_code, qty, old_balance, stock_message, inventory_definition, trans_ref, trans_type) # item => saleObj | balance => Stock journal + + balance = calculate_balance(old_balance, qty) + + if balance < old_balance + credit = 0 + debit = qty.abs else - credit_balance = balance - debit = item.qty + credit = qty.abs + debit = 0 end - journal.credit = credit_balance - balance = calculate_balance(balance, item) - - journal.item_code = item.item_instance_code - journal.inventory_definition_id = inventory_definition.id - journal.debit = debit - journal.balance = balance - journal.remark = stock_message - journal.trans_ref = item.id - journal.trans_type = StockJournal::SALES_TRANS - journal.save - - - + journal = StockJournal.create( + item_code: item_instance_code, + credit: credit, + debit: debit, + balance: balance, + inventory_definition_id: inventory_definition.id, + remark: stock_message, + trans_ref: trans_ref, + trans_type: trans_type + ) end - def self.calculate_balance(balance, item) - if item.product_name.downcase.include?("void") - logger.debug 'balance++++++++++++++++++' - logger.debug balance - logger.debug 'qty+++++++++++++++++++++++' - logger.debug item.qty - return balance.to_i + item.qty.abs.to_i - else - return balance.to_i - item.qty.to_i - end + def self.calculate_balance(balance, qty) + return balance.to_i - qty.to_i end def self.from_stock_check(item) diff --git a/app/views/inventory/stock_checks/index.html.erb b/app/views/inventory/stock_checks/index.html.erb index e0f200f8..7c4e85c4 100644 --- a/app/views/inventory/stock_checks/index.html.erb +++ b/app/views/inventory/stock_checks/index.html.erb @@ -5,15 +5,15 @@
-
+
@@ -30,7 +30,7 @@
- +