diff --git a/Gemfile b/Gemfile index a49cf828..c8139eb7 100644 --- a/Gemfile +++ b/Gemfile @@ -1,5 +1,5 @@ source 'https://rubygems.org' - +ruby '2.4.1' git_source(:github) do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/") "https://github.com/#{repo_name}.git" diff --git a/Gemfile.lock b/Gemfile.lock index 3a70c5bd..30925792 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -375,5 +375,8 @@ DEPENDENCIES web-console (>= 3.3.0) whenever + +RUBY VERSION + ruby 2.4.1p111 BUNDLED WITH 2.0.2 diff --git a/app/controllers/origami/discounts_controller.rb b/app/controllers/origami/discounts_controller.rb index cd73d174..827d26c7 100755 --- a/app/controllers/origami/discounts_controller.rb +++ b/app/controllers/origami/discounts_controller.rb @@ -7,9 +7,9 @@ class Origami::DiscountsController < BaseOrigamiController @print_settings = PrintSetting.get_precision_delimiter() @webview = false if check_mobile - @webview = true + @webview = true end - + sale_id = params[:id] @cashier_type = params[:type] if Sale.exists?(sale_id) @@ -32,7 +32,7 @@ class Origami::DiscountsController < BaseOrigamiController discount_items = JSON.parse(params[:discount_items]) overall_discount = params[:overall_discount] sub_total = params[:sub_total] - + if Sale.exists?(sale_id) sale = Sale.find(sale_id) @@ -44,26 +44,29 @@ class Origami::DiscountsController < BaseOrigamiController table_id = nil end - - # sale.total_discount = overall_discount.to_f + + # sale.total_discount = overall_discount.to_f # sale.total_amount = sub_total.to_f - # sale.grand_total = (sub_total.to_f - overall_discount.to_f) + sale.total_tax; - # sale.save + # sale.grand_total = (sub_total.to_f - overall_discount.to_f) + sale.total_tax; + # sale.save if discount_items.length > 0 #save sale item for discount discount_items.each do |di| origin_sale_item = SaleItem.find(di["id"]) - + sale_item = SaleItem.new - if !origin_sale_item.nil? - menu_category = MenuCategory.get_menu_category(origin_sale_item.product_code) #get menu category for menu items - if !menu_category.nil? - sale_item.menu_category_code = menu_category.code - sale_item.menu_category_name = menu_category.name - end - end + # if !origin_sale_item.nil? + # menu_category = MenuCategory.get_menu_category(origin_sale_item.product_code) #get menu category for menu items + # if !menu_category.nil? + # sale_item.menu_category_code = menu_category.code + # sale_item.menu_category_name = menu_category.name + # end + # end + + sale_item.menu_category_code = origin_sale_item.menu_category_code + sale_item.menu_category_name = origin_sale_item.menu_category_name sale_item.sale_id = sale_id sale_item.product_code = origin_sale_item != nil ? origin_sale_item.product_code : sale_id @@ -73,7 +76,7 @@ class Origami::DiscountsController < BaseOrigamiController sale_item.status = "Discount" sale_item.qty = -1 - sale_item.unit_price = di["price"].to_f * (-1) + sale_item.unit_price = di["price"].to_f * -1 sale_item.taxable_price = di["price"] sale_item.is_taxable = 1 sale_item.account_id = origin_sale_item.account_id @@ -83,11 +86,11 @@ class Origami::DiscountsController < BaseOrigamiController action_by = current_user.name remark = "Discount Item Name ->#{sale_item.product_name}-Product Code ->#{sale_item.product_code} | Price [#{sale_item.price}] | Receipt No #{sale.receipt_no} " - + sale_audit = SaleAudit.record_audit_discount(sale_item.sale_id,sale.cashier_name, action_by,remark,"ITEMDISCOUNT" ) - - end - end + + end + end # Re-calc All Amount in Sale if overall_discount.to_f > 0 @@ -97,24 +100,24 @@ class Origami::DiscountsController < BaseOrigamiController else remark = "Discount Overall Price [#{overall_discount}]| Receipt No #{sale.receipt_no} | Table- #{table.name} " end - + sale_audit = SaleAudit.record_audit_discount(sale.sale_id,sale.cashier_name, action_by,remark,"OVERALLDISCOUNT" ) - end - sale.compute_by_sale_items(sale_id, sale.sale_items, overall_discount.to_f, nil,order_source) + end + sale.compute_by_sale_items(sale_id, sale.sale_items, overall_discount.to_f, nil,order_source) if !table.nil? result = {:status=> "Success", :table_id => table_id, :table_type => table.type } else result = {:status=> "Success" } end - else + else if !table.nil? result = {:status=> "Please, Check Again!", :table_id => table_id, :table_type => table.type } else result = {:status=> "Please, Check Again!" } end - end + end + - render :json => result.to_json end @@ -131,45 +134,45 @@ class Origami::DiscountsController < BaseOrigamiController else table_id = nil table = nil - end - - - if discount_items.length > 0 + end + + + if discount_items.length > 0 #destroy sale item for discount - discount_items.each do |di| - sale_item = SaleItem.find(di["id"]) + discount_items.each do |di| + sale_item = SaleItem.find(di["id"]) sale.total_amount = (sale.total_amount + sale_item.price.abs) action_by = current_user.name if table.nil? remark = "Remove Item Discount Item Name ->#{sale_item.product_name}-Product Code ->#{sale_item.product_code} | Price [#{sale_item.price}] | Receipt No #{sale.receipt_no} | Table- No Table " else - remark = "Remove Item Discount Item Name ->#{sale_item.product_name}-Product Code ->#{sale_item.product_code} | Price [#{sale_item.price}] | Receipt No #{sale.receipt_no} | Table- #{table.name} " + remark = "Remove Item Discount Item Name ->#{sale_item.product_name}-Product Code ->#{sale_item.product_code} | Price [#{sale_item.price}] | Receipt No #{sale.receipt_no} | Table- #{table.name} " end sale_audit = SaleAudit.record_audit_discount(sale.sale_id,sale.cashier_name, action_by,remark,"REMOVEITEMDISCOUNT" ) - - sale_item.destroy - end - end - # sale.grand_total = (sale.total_amount - sale.total_discount) + sale.total_tax; + sale_item.destroy + end + end + + # sale.grand_total = (sale.total_amount - sale.total_discount) + sale.total_tax; # sale.save # Re-calc All Amount in Sale - sale.compute_by_sale_items(sale_id, sale.sale_items, sale.total_discount, nil, order_source) + sale.compute_by_sale_items(sale_id, sale.sale_items, sale.total_discount, nil, order_source) if table.nil? result = {:status=> "Success"} else result = {:status=> "Success", :table_id => table_id, :table_type => table.type } end - - else + + else if table.nil? result = {:status=> "Please, Check Again!"} else result = {:status=> "Please, Check Again!", :table_id => table_id, :table_type => table.type } end - - end + + end render :json => result.to_json end @@ -180,29 +183,29 @@ class Origami::DiscountsController < BaseOrigamiController order_source = params[:type] if Sale.exists?(sale_id) - sale = Sale.find(sale_id) - + sale = Sale.find(sale_id) + if sale.bookings[0].dining_facility_id.to_i > 0 table_id = sale.bookings[0].dining_facility_id table = DiningFacility.find(table_id) - table_type = table.type + table_type = table.type else table_id = nil table = nil table_type = nil - end + end - discount_items = [] + discount_items = [] #destroy all discount sale item - sale.sale_items.each do |si| - if si.status == "Discount" && si.price < 0 - sale.total_amount = (sale.total_amount + si.price.abs) - discount_items.push(si) + sale.sale_items.each do |si| + if si.status == "Discount" && si.price < 0 + sale.total_amount = (sale.total_amount + si.price.abs) + discount_items.push(si) end - end + end # sale.total_discount = 0 - # sale.grand_total = (sale.total_amount - sale.total_discount) + sale.total_tax; + # sale.grand_total = (sale.total_amount - sale.total_discount) + sale.total_tax; # sale.save #destroy in sale.sale_items @@ -215,23 +218,23 @@ class Origami::DiscountsController < BaseOrigamiController remark = "Remove Discount Sale Id [#{sale.sale_id}]| Receipt No #{sale.receipt_no} | Table- #{table.name} " end sale_audit = SaleAudit.record_audit_discount(sale.sale_id,sale.cashier_name, action_by,remark,"REMOVEALLDISCOUNT" ) - + # Re-calc All Amount in Sale sale.compute_by_sale_items(sale_id, sale.sale_items, 0, nil, order_source) if table.nil? result = {:status=> "Success"} else - result = {:status=> "Success", :table_id => table_id, :dining => table.name, :table_type => table_type } + result = {:status=> "Success", :table_id => table_id, :dining => table.name, :table_type => table_type } end - - else + + else if table.nil? result = {:status=> "Please, Check Again!"} else - result = {:status=> "Please, Check Again!", :table_id => table_id, :dining => table.name, :table_type => table_type } + result = {:status=> "Please, Check Again!", :table_id => table_id, :dining => table.name, :table_type => table_type } end - - end + + end render :json => result.to_json end @@ -251,7 +254,7 @@ class Origami::DiscountsController < BaseOrigamiController end # Check for Card Payment is_card_payment = SalePayment.get_sale_payments_by_card(sale.sale_payments) - + # if is_card != "true" account_types = Account.where("discount=?",true) table_id = sale.bookings[0].dining_facility_id @@ -267,9 +270,9 @@ class Origami::DiscountsController < BaseOrigamiController str={type:pc[:name],amount:pc[:price]} acc_prices.push(str) end - end + end end - generic_customer_id = sale.customer.membership_id + generic_customer_id = sale.customer.membership_id receipt_no = sale.receipt_no membership = MembershipSetting.find_by_membership_type("paypar_url") memberaction = MembershipAction.find_by_membership_type("member_discount") @@ -282,7 +285,7 @@ class Origami::DiscountsController < BaseOrigamiController # Check for items for Paypar Cloud if acc_prices.length > 0 begin - response = HTTParty.post(url, + response = HTTParty.post(url, :body => { account_no: account_no, generic_customer_id:generic_customer_id , campaign_type_id: campaign_type_id, @@ -307,7 +310,7 @@ class Origami::DiscountsController < BaseOrigamiController rescue SocketError response = {"status": false, "message": "Can't open membership server " } end - else + else response = {"status": false, "message": "You have no selected discount item" } end Rails.logger.debug "-------------- Member Discount Osaka ---------" @@ -325,7 +328,7 @@ class Origami::DiscountsController < BaseOrigamiController else result = {:status=> response["message"],:title=>"Alert", :table_id => table_id,:table_type => table_type } end - + render :json => result.to_json # end #end Is Card Payment @@ -376,5 +379,5 @@ class Origami::DiscountsController < BaseOrigamiController # redirect_to origami_path(sale_id) # end - + end diff --git a/app/controllers/origami/payments_controller.rb b/app/controllers/origami/payments_controller.rb index 963d6ee3..7d71941b 100755 --- a/app/controllers/origami/payments_controller.rb +++ b/app/controllers/origami/payments_controller.rb @@ -64,15 +64,9 @@ class Origami::PaymentsController < BaseOrigamiController customer = Customer.find(sale_data.customer_id) # rounding adjustment if shop_detail.is_rounding_adj - a = sale_data.grand_total % 25 # Modulus - b = sale_data.grand_total / 25 # Division - #not calculate rounding if modulus is 0 and division is even - #calculate rounding if modulus is zero or not zero and division are not even - if (a != 0.0 && b%2 != 0.0) || (a==0.0 && b%2 !=0) - new_total = Sale.get_rounding_adjustment(sale_data.grand_total) - rounding_adj = new_total-sale_data.grand_total - sale_data.update_attributes(grand_total: new_total,old_grand_total: sale_data.grand_total,rounding_adjustment:rounding_adj) - end + new_total = Sale.get_rounding_adjustment(sale_data.grand_total) + rounding_adj = new_total - sale_data.grand_total + sale_data.update_attributes(grand_total: new_total,old_grand_total: sale_data.grand_total,rounding_adjustment:rounding_adj) if rounding_adj > 0 end #end rounding adjustment #record for sale audit @@ -151,15 +145,9 @@ class Origami::PaymentsController < BaseOrigamiController # rounding adjustment if !path.include? ("credit_payment") if shop_detail.is_rounding_adj - a = saleObj.grand_total % 25 # Modulus - b = saleObj.grand_total / 25 # Division - #not calculate rounding if modulus is 0 and division is even - #calculate rounding if modulus is zero or not zero and division are not even - if (a != 0.0 && b%2 != 0.0) || (a==0.0 && b%2 !=0) - new_total = Sale.get_rounding_adjustment(saleObj.grand_total) - rounding_adj = new_total-saleObj.grand_total - saleObj.update_attributes(grand_total: new_total,old_grand_total: saleObj.grand_total,rounding_adjustment:rounding_adj) - end + new_total = Sale.get_rounding_adjustment(saleObj.grand_total) + rounding_adj = new_total - saleObj.grand_total + saleObj.update_attributes(grand_total: new_total,old_grand_total: saleObj.grand_total,rounding_adjustment:rounding_adj) if rounding_adj > 0 end end #end rounding adjustment diff --git a/app/controllers/origami/sale_edit_controller.rb b/app/controllers/origami/sale_edit_controller.rb index 40f79afd..d537f8e9 100755 --- a/app/controllers/origami/sale_edit_controller.rb +++ b/app/controllers/origami/sale_edit_controller.rb @@ -72,7 +72,7 @@ class Origami::SaleEditController < BaseOrigamiController saleitemObj.status = 'foc' saleitemObj.remark = remark saleitemObj.save - @newsaleitem = SaleItem.new + @newsaleitem = saleitemObj.dup @newsaleitem.qty = saleitemObj.qty * -1 @newsaleitem.unit_price = saleitemObj.unit_price * 1 @@ -143,7 +143,7 @@ class Origami::SaleEditController < BaseOrigamiController sale_audit = SaleAudit.record_audit_for_edit(saleitemObj.sale_id,current_user.name, action_by,remark,"SALEITEMEDIT" ) # saleitemObj.remark = 'edit' - unless saleitemObj.product_name.include? 'updated' + unless saleitemObj.product_name.include? 'UPDATED' saleitemObj.product_name = saleitemObj.product_name + ' (UPDATED)' end diff --git a/app/models/promotion.rb b/app/models/promotion.rb index b636a097..0fa2b3e9 100755 --- a/app/models/promotion.rb +++ b/app/models/promotion.rb @@ -11,37 +11,23 @@ class Promotion < ApplicationRecord PROMO_TYPE3 = "Net_price" # 1800 => 1000 => 1000 PROMO_TYPE4 = "Percentage" + def is_promo_day + promo_day.include? Date.today.wday.to_s + end + def self.promo_activate(saleObj) - array_same =[] current_day = Time.now.strftime("%Y-%m-%d") current_time = Time.now.strftime('%H:%M:%S') day = Date.today.wday promoList = is_between_promo_datetime(current_day,current_time) - puts "promoList - " + promoList.size.to_s - if promoList.size > 0 - itemList = combine_item(saleObj) - itemList.each do|list| - list.each do |l| - array_same.push({ - item_instance_code: l.item_instance_code, - order_id:l.order_id, - qty:l.qty - }) + + promoList.each do |promo| + if promo.is_promo_day + if item = saleObj.qty_of(promo.original_product) + check_promo_type(promo, item, saleObj) end end end - item_list =[] - array_same.group_by do |same| - same.values_at :item_instance_code - end.map do |(item_instance_code), array_same| - quantities = array_same.map { |p| p[:qty] } - qty = quantities.all? ? quantities.reduce(:+) : nil - item_list.push({ item_instance_code: item_instance_code, qty: qty }) - end - Rails.logger.debug "-------promo_activate array_same-------" - puts item_list.to_json - is_promo_day(promoList,day, item_list, saleObj.sale_id) - end def self.is_between_promo_datetime(current_day,current_time) #database is not local time @@ -49,45 +35,7 @@ class Promotion < ApplicationRecord return promoList end - def self.combine_item(saleObj) - # order_id = saleObj.sale_orders[0][0].order_id - # itemList = OrderItem.where("order_id = ?", order_id).group(:item_instance_code).sum(:qty) - # array_same =[] - itemList = [] - saleObj.sale_orders.each do |so| - # itemList << OrderItem.where("order_id = ?",so.order_id).group(["item_instance_code", "order_id"]).sum(:qty) - itemList << OrderItem.where("order_id = ?",so.order_id).select(:item_instance_code,:order_id,:qty) - end - - return itemList - end - - def self.is_promo_day(promoList, day, orderitemList, sale_id) - puts "Today date - " + day.to_s - promoList.each do |promo| - dayresult = promo.promo_day.include?(day.to_s) - if dayresult - orderitemList.each do |item| - find_promo_item(promo, item, sale_id) - end - end - end - end - - def self.find_promo_item(promo, orderitem, sale_id) - item_code = OrderItem.find_by_item_instance_code(orderitem[:item_instance_code]).item_code - # orderitem.each do |odr_item| - if promo.original_product.downcase.to_s == orderitem[:item_instance_code] - if promo.min_qty.to_i > orderitem[:qty].to_i - return false - else - check_promo_type(promo,orderitem, sale_id) - end - end - # end - end - - def self.check_promo_type(promo, orderitem, sale_id) + def self.check_promo_type(promo, orderitem, saleObj) promo.promotion_products.each do |promo_product| if promo_product.item_code.downcase == orderitem[:item_instance_code] same = true @@ -97,20 +45,20 @@ class Promotion < ApplicationRecord end # same, promo_product = check_giveaway_product(promo, orderitem[0][0]) if promo.promo_type == Promotion::PROMO_TYPE1 - if same - give_promotion_same_product(orderitem[:qty], promo.min_qty, promo_product.min_qty, orderitem, sale_id,promo_product.item_code) - else - give_promotion_second_product(orderitem[:qty], promo.min_qty, promo_product.item_code, orderitem, sale_id) + if same + give_promotion_same_product(orderitem[:qty], promo.min_qty, promo_product.min_qty, orderitem, saleObj, promo_product.item_code) + else + give_promotion_second_product(orderitem[:qty], promo.min_qty, promo_product.item_code, orderitem, saleObj) end elsif promo.promo_type == Promotion::PROMO_TYPE2 - give_promotion_nett_off(same,promo_product,promo.min_qty, orderitem, sale_id) + give_promotion_nett_off(same,promo_product,promo.min_qty, orderitem, saleObj) elsif promo.promo_type == Promotion::PROMO_TYPE3 - give_promotion_nett_price(same,promo_product,promo.min_qty, orderitem, sale_id) + give_promotion_nett_price(same,promo_product,promo.min_qty, orderitem, saleObj) elsif promo.promo_type == Promotion::PROMO_TYPE4 - give_promotion_discount(same,promo_product,promo.min_qty, orderitem, sale_id) + give_promotion_discount(same,promo_product,promo.min_qty, orderitem, saleObj) end end end @@ -128,106 +76,66 @@ class Promotion < ApplicationRecord # end end - def self.give_promotion_same_product(qty, promoqty, foc_min_qty, orderitem, sale_id,promo_product) - item ='' - puts " Order qty: " + qty.to_s + " / promoqty: " + promoqty.to_s + " / giveaway: " + foc_min_qty.to_s - multiple = qty.to_i / promoqty.to_i # loop count - charge_qty = 0 - foc_qty = 0 - if multiple > 0 - multiple.times.each do |key| - if qty > promoqty - charge_qty += promoqty - different = qty - promoqty - qty = different - if different == 0 - foc_qty += foc_min_qty - else - foc_qty += foc_min_qty - qty = qty - foc_min_qty - end + def self.give_promotion_same_product(qty, promoqty, foc_min_qty, orderitem, saleObj,promo_product) + puts " Order qty: " + qty.to_s + " / promoqty: " + promoqty.to_s + " / giveaway: " + foc_min_qty.to_s + multiple = qty.to_i / promoqty.to_i # loop count + charge_qty = 0 + foc_qty = 0 + if multiple > 0 + multiple.times.each do |key| + if qty > promoqty + charge_qty += promoqty + different = qty - promoqty + qty = different + if different == 0 + foc_qty += foc_min_qty else - charge_qty += qty + foc_qty += foc_min_qty + qty = qty - foc_min_qty end + else + charge_qty += qty end - if multiple == foc_qty - charge_qty += qty - end - else + end + if multiple == foc_qty charge_qty += qty end - sale_order =SaleOrder.where("sale_id=?",sale_id) - price =0 - source ='' - sale_order.each do|order| - source = Order.find(order.order_id).source - end + else + charge_qty += qty + end - item = OrderItem.where("item_instance_code = ?",orderitem[:item_instance_code]).order("order_items_id DESC").first - item ={ - item_code:item.item_code, - item_instance_code:item.item_instance_code, - item_name:item.item_name, - alt_name:item.alt_name, - account_id:item.account_id, - price:item.price - } - if promo_product.downcase != item[:item_instance_code] + price = 0 + source = saleObj.orders.first.source + item = saleObj.order_items.where(item_instance_code: promo_product).first - sale_order.each do|order| - source = Order.find(order.order_id).source - end - item = OrderItem.where("item_code = ?",promo_product).order("order_items_id DESC").first - item ={ - item_code:item.item_code, - item_instance_code:item.item_instance_code, - item_name:item.item_name, - alt_name:item.alt_name, - account_id:item.account_id, - price:item.price - } - end - if !item.nil? - update_existing_item(foc_qty, item, sale_id, "promotion", item[:price],source) - end + if !item.nil? + update_existing_item(foc_qty, item, sale_id, "promotion", item[:price], source) + end end # AA - 10 # 3 # BB # orderList, #S34345 - def self.give_promotion_second_product(orderitem_count, foc_min_qty, promo_product, orderitem, sale_id) - source ='' - item ='' + def self.give_promotion_second_product(orderitem_count, foc_min_qty, promo_product, orderitem, saleObj) puts "..... orderitem_count: " + orderitem_count.to_s + " / foc_min_qty: " + foc_min_qty.to_s + " /promo_product: " + promo_product + " orderitem: " + orderitem.to_s + promotion_qty = orderitem_count.to_i / foc_min_qty.to_i # get foc item qty - foc_qty = find_second_item_qty(sale_id, promo_product) + foc_qty = saleObj.qty_of(promo_product).qty rescue 0 if (foc_qty < promotion_qty) promotion_qty = foc_qty end # item = OrderItem.find_by_item_instance_code(promo_product) - sale_order =SaleOrder.where("sale_id=?",sale_id) - price =0 - sale_order.each do|order| - source = Order.find(order.order_id).source - end - item = OrderItem.where("item_instance_code = ?",promo_product).order("order_items_id DESC").first - item ={ - item_code:item.item_code, - item_instance_code:item.item_instance_code, - item_name:item.item_name, - alt_name:item.alt_name, - account_id:item.account_id, - price:item.price - } - # item = OrderItem.where("item_instance_code = '#{promo_product}' and order_id = '#{orderitem[0][1]}'").first + + price = 0 + source = saleObj.orders.first.source + item = saleObj.order_items.where(item_instance_code: promo_product).first + if !item.nil? - # source = Order.find(item.order_id).source update_existing_item(promotion_qty, item, sale_id, "promotion", item[:price],source) end end - - def self.update_existing_item(qty, item, sale_id, type, item_price,source) - if qty >0 + def self.update_existing_item(qty, item, saleObj, type, item_price,source) + if qty > 0 menu_category = MenuCategory.get_menu_category(item[:item_code]) #get menu category for menu items - + sale_item = SaleItem.new if !menu_category.nil? sale_item.menu_category_code = menu_category.code @@ -247,216 +155,84 @@ class Promotion < ApplicationRecord sale_item.price = qty * item_price * (-1) sale_item.is_taxable = 1 - sale_item.sale_id = sale_id + sale_item.sale = saleObj sale_item.save - sale = Sale.find(sale_id) - sale.compute_by_sale_items(sale.id, sale.sale_items, sale.total_discount,nil,source) + + saleObj.compute_by_sale_items(saleObj.id, saleObj.sale_items, saleObj.total_discount,nil,source) end end - def self.give_promotion_nett_off(same, promo_product, foc_min_qty, orderitem, sale_id) - item ='' - source ='' + def self.give_promotion_nett_off(same, promo_product, foc_min_qty, orderitem, saleObj) puts " same: " + same.to_s + " promo_product: " + promo_product.item_code.to_s + " foc_min_qty: " + foc_min_qty.to_s + " orderitem: " + orderitem.to_s - sale_order =SaleOrder.where("sale_id=?",sale_id) - if same - foc_qty = orderitem[:qty].to_i / foc_min_qty - # item = OrderItem.find_by_item_instance_code(orderitem[0][0]) - - price =0 - sale_order.each do|order| - source = Order.find(order.order_id).source - end - item = OrderItem.where("item_instance_code = ?",orderitem[:item_instance_code]).order("order_items_id DESC").first - item ={ - item_code:item.item_code, - item_instance_code:item.item_instance_code, - item_name:item.item_name, - alt_name:item.alt_name, - account_id:item.account_id, - price:item.price - } - # item = OrderItem.where("item_instance_code = '#{orderitem[0][0]}' and order_id = '#{orderitem[0][1]}'").first - if !item.nil? - # source = Order.find(item.order_id).source - update_existing_item(foc_qty, item, sale_id, "promotion nett off", promo_product.net_off,source) - end - - else - foc_qty = orderitem[:qty].to_i / foc_min_qty - # foc_qty = find_second_item_qty(sale_id, promo_product.item_code) - # item = OrderItem.find_by_item_instance_code(promo_product.item_code) - # item = OrderItem.where("item_instance_code = '#{promo_product.item_code}' and order_id = '#{orderitem[0][1]}'").first - sale_order.each do|order| - source = Order.find(order.order_id).source - end - item = OrderItem.where("item_instance_code = ?",promo_product.item_code).order("order_items_id DESC").first - item ={ - item_code:item.item_code, - item_instance_code:item.item_instance_code, - item_name:item.item_name, - alt_name:item.alt_name, - account_id:item.account_id, - price:item.price - } - if !item.nil? - # source = Order.find(item.order_id).source - update_existing_item(foc_qty, item, sale_id, "promotion nett off", promo_product.net_off,source) - end - end - end - - def self.give_promotion_nett_price(same, promo_product, foc_min_qty, orderitem, sale_id) - puts " same: " + same.to_s + " promo_product: " + promo_product.item_code.to_s + " foc_min_qty: " + foc_min_qty.to_s + " orderitem: " + orderitem.to_s - sale_order =SaleOrder.where("sale_id=?",sale_id) - source ='' - item ='' - if same - foc_qty = orderitem[:qty].to_i / foc_min_qty - # item = OrderItem.find_by_item_instance_code(orderitem[0][0]) # need to specify with menu item instance - # item = OrderItem.where("item_instance_code = '#{orderitem[0][0]}' and order_id = '#{orderitem[0][1]}'").first - sale_order.each do|order| - source = Order.find(order.order_id).source - end - item = OrderItem.where("item_instance_code = ?",orderitem[:item_instance_code]).order("order_items_id DESC").first - item ={ - item_code:item.item_code, - item_instance_code:item.item_instance_code, - item_name:item.item_name, - alt_name:item.alt_name, - account_id:item.account_id, - price:item.price - } - if !item.nil? - price = item[:price].to_i - promo_product.net_price.to_i - # source = Order.find(item.order_id).source - update_existing_item(foc_qty, item, sale_id, "promotion nett price", price,source) - end - - else - order_qty = find_second_item_qty(sale_id, promo_product.item_code)# need to check for qty + foc_qty = orderitem[:qty].to_i / foc_min_qty + if !same + order_qty = saleObj.qty_of(promo_product.item_code).qty rescue 0 foc_qty = orderitem[:qty].to_i / foc_min_qty if foc_qty > order_qty foc_qty = order_qty end - # item = OrderItem.find_by_item_instance_code(promo_product.item_code) - # item = OrderItem.where("item_instance_code = '#{promo_product.item_code}' and order_id = '#{orderitem[0][1]}'").first - sale_order.each do|order| - source = Order.find(order.order_id).source - end - item = OrderItem.where("item_instance_code",promo_product.item_code).order("order_items_id DESC").first - item ={ - item_code:item.item_code, - item_instance_code:item.item_instance_code, - item_name:item.item_name, - alt_name:item.alt_name, - account_id:item.account_id, - price:item.price - } + end - if !item.nil? - price = item[:price].to_i - promo_product.net_price.to_i - # source = Order.find(item.order_id).source - update_existing_item(foc_qty, item, sale_id, "promotion nett price", price,source) - end - + source = saleObj.orders.first.source + item = saleObj.order_items.where(item_instance_code: promo_product.item_code).first + + if !item.nil? + update_existing_item(foc_qty, item, sale_id, "promotion nett off", promo_product.net_off,source) end end - def self.give_promotion_discount(same, promo_product, foc_min_qty, orderitem, sale_id) + def self.give_promotion_nett_price(same, promo_product, foc_min_qty, orderitem, saleObj) puts " same: " + same.to_s + " promo_product: " + promo_product.item_code.to_s + " foc_min_qty: " + foc_min_qty.to_s + " orderitem: " + orderitem.to_s - sale_order =SaleOrder.where("sale_id=?",sale_id) - source ='' - item ='' - if same + + foc_qty = orderitem[:qty].to_i / foc_min_qty + if !same + order_qty = saleObj.qty_of(promo_product.item_code).qty rescue 0 foc_qty = orderitem[:qty].to_i / foc_min_qty - # item = OrderItem.find_by_item_instance_code(orderitem[0][0]) - # item = OrderItem.where("item_instance_code = '#{orderitem[0][0]}' and order_id = '#{orderitem[0][1]}'").first - sale_order.each do|order| - source = Order.find(order.order_id).source - end - item = OrderItem.where("item_instance_code = ?",orderitem[:item_instance_code]).order("order_items_id DESC").first - item ={ - item_code:item.item_code, - item_instance_code:item.item_instance_code, - item_name:item.item_name, - alt_name:item.alt_name, - account_id:item.account_id, - price:item.price - } - # total = orderitem[1].to_i * item.price - if !item.nil? - total = item[:price] - price = calculate_discount(total, promo_product.percentage) - # source = Order.find(item.order_id).source - update_existing_item(foc_qty, item, sale_id, "promotion discount", price,source) - end - - else - order_qty = find_second_item_qty(sale_id, promo_product.item_code) #need to check - foc_qty = orderitem[:qty].to_i / foc_min_qty - # give total qty is 1 - #foc_qty = (foc_qty - foc_qty) + 1 + if foc_qty > order_qty foc_qty = order_qty end - # item = OrderItem.find_by_item_instance_code(promo_product.item_code) - # item = OrderItem.where("item_instance_code = '#{promo_product.item_code}' and order_id = '#{orderitem[0][1]}'").first - sale_order.each do|order| - source = Order.find(order.order_id).source - end - item = OrderItem.where("item_instance_code = ?",promo_product.item_code).order("order_items_id DESC").first - item ={ - item_code:item.item_code, - item_instance_code:item.item_instance_code, - item_name:item.item_name, - alt_name:item.alt_name, - account_id:item.account_id, - price:item.price - } - # total = item.price * foc_qty - if !item.nil? - total = item[:price] - price = calculate_discount(total, promo_product.percentage) - # source = Order.find(item.order_id).source - update_existing_item(foc_qty, item, sale_id, "promotion discount", price,source) - end + end + + source = saleObj.orders.first.source + item = saleObj.order_items.where(item_instance_code: promo_product.item_code).first + + if !item.nil? + price = item[:price].to_i - promo_product.net_price.to_i + update_existing_item(foc_qty, item, saleObj, "promotion nett price", price,source) end end - def self.find_second_item_qty(sale_id, promo_item) - array_same =[] - saleObj = Sale.find_by_sale_id(sale_id) - itemList = combine_item(saleObj) - itemList.each do|list| - list.each do |l| - array_same.push({ - item_instance_code: l.item_instance_code, - order_id:l.order_id, - qty:l.qty - }) + def self.give_promotion_discount(same, promo_product, foc_min_qty, orderitem, saleObj) + puts " same: " + same.to_s + " promo_product: " + promo_product.item_code.to_s + " foc_min_qty: " + foc_min_qty.to_s + " orderitem: " + orderitem.to_s + + foc_qty = orderitem[:qty].to_i / foc_min_qty + if !same + order_qty = saleObj.qty_of(promo_product.item_code).qty rescue 0 + foc_qty = orderitem[:qty].to_i / foc_min_qty + + if foc_qty > order_qty + foc_qty = order_qty end end - item_list =[] - array_same.group_by do |same| - same.values_at :item_instance_code - end.map do |(item_instance_code), array_same| - quantities = array_same.map { |p| p[:qty] } - qty = quantities.all? ? quantities.reduce(:+) : nil - item_list.push({ item_instance_code: item_instance_code, qty: qty }) - end - item_list.each do |item| - if item[:item_instance_code] == promo_item.downcase - return item[:qty].to_i - end - end - return 0 - end - def self.calculate_discount(total, percentage) - return (total.to_i * percentage.to_i) / 100 - end + source = saleObj.orders.first.source + item = saleObj.order_items.where(item_instance_code: promo_product.item_code).first + puts saleObj + puts item + # total = orderitem[1].to_i * item.price + if item + total = item[:price] + price = calculate_discount(total, promo_product.percentage) + # source = Order.find(item.order_id).source + update_existing_item(foc_qty, item, saleObj, "promotion discount", price,source) + end + end + + def self.calculate_discount(total, percentage) + return (total * percentage) / 100 + end end diff --git a/app/models/sale.rb b/app/models/sale.rb index 8be79db3..ae350e80 100644 --- a/app/models/sale.rb +++ b/app/models/sale.rb @@ -14,14 +14,20 @@ class Sale < ApplicationRecord has_many :sale_payments has_many :sale_orders has_many :orders, through: :sale_orders + has_many :order_items, through: :sale_orders has_many :bookings has_many :product_commissions + before_validation :round_to_precision 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}'") } + def qty_of(item_instance_code) + order_items.select(:order_items_id, :item_instance_code, 'SUM(qty) as qty').where(item_instance_code: item_instance_code).group(:item_instance_code).first + end + REPORT_TYPE = { "daily" => 0, "monthly" => 1, @@ -418,11 +424,11 @@ class Sale < ApplicationRecord apply_tax(total_taxable, order_source, tax_type) self.total_amount = subtotal_price - self.total_discount = total_discount + # self.total_discount = total_discount self.grand_total = (self.total_amount - self.total_discount) + self.total_tax - self.grand_total_round + # self.grand_total_round #compute rounding adjustment - adjust_rounding + # adjust_rounding self.save! @@ -455,7 +461,7 @@ class Sale < ApplicationRecord sale.grand_total = 0 else sale.grand_total = (sale.total_amount - sale.total_discount) + sale.total_tax - sale.grand_total_round + # sale.grand_total_round end if discount_type == "member_discount" @@ -463,7 +469,6 @@ class Sale < ApplicationRecord end #compute rounding adjustment # adjust_rounding - sale.rounding_adjustment = compute_adjust_rounding(sale.grand_total) sale.save! end @@ -491,11 +496,11 @@ class Sale < ApplicationRecord apply_tax(total_taxable, order_source) self.total_amount = subtotal_price - self.total_discount = total_discount + # self.total_discount = total_discount self.grand_total = (self.total_amount - self.total_discount) + self.total_tax - self.grand_total_round + # self.grand_total_round #compute rounding adjustment - adjust_rounding + # adjust_rounding self.save! end @@ -509,89 +514,45 @@ class Sale < ApplicationRecord # #delete existing and create new # existing_tax.delete # end - taxes = SaleTax.where("sale_id='#{sale.sale_id}'").pluck(:sale_tax_id) - SaleTax.where("sale_tax_id IN (?)", taxes).destroy_all + taxes = SaleTax.where("sale_id='#{self.sale_id}'").destroy_all total_tax_amount = 0 tax_incl_exec = "exclusive" #tax_profile - list by order_by # tax_profiles = TaxProfile.all.order("order_by asc") # customer = Customer.find(sale.customer_id) - arr_tax = [] - arr_tax = unique_tax_profiles(order_source, self.customer_id) - if !arr_tax.empty? - if tax_type.nil? - tax_profiles = TaxProfile.where(:id => arr_tax) - else - tax_profiles = TaxProfile.where("group_type=?",order_source) - end - else - tax_profiles = TaxProfile.where("group_type=?",order_source) - end - - # #Creat new tax records if order_source.to_s == "emenu" order_source = "cashier" end + tax_profiles = unique_tax_profiles(order_source, self.customer_id) + + # #Creat new tax records if sale.payment_status != 'foc' tax_profiles.each do |tax| - if tax.group_type.to_s == order_source.to_s - if tax_type - if tax_type.to_s == tax.name.to_s || tax_type == 'all' - sale_tax = SaleTax.new(:sale => sale) - sale_tax.tax_name = tax.name - sale_tax.tax_rate = tax.rate + sale_tax = SaleTax.new(:sale => sale) + sale_tax.tax_name = tax.name + sale_tax.tax_rate = tax.rate - # substract , to give after discount - total_tax = total_taxable - total_discount - #include or execulive - if tax.inclusive - tax_incl_exec = "inclusive" - rate = tax.rate - divided_value = (100 + rate)/rate - sale_tax.tax_payable_amount = total_tax / divided_value - else - sale_tax.tax_payable_amount = total_tax * tax.rate / 100 - total_tax_amount = total_tax_amount + sale_tax.tax_payable_amount - end - #new taxable amount is standard rule for step by step - if shop.calc_tax_order - total_taxable = total_taxable + sale_tax.tax_payable_amount - end - sale_tax.inclusive = tax.inclusive - sale_tax.save - end - else - # customer.tax_profiles.each do |cus_tax| - # if cus_tax.to_i == tax.id - sale_tax = SaleTax.new(:sale => sale) - sale_tax.tax_name = tax.name - sale_tax.tax_rate = tax.rate - - # substract , to give after discount - total_tax = total_taxable - total_discount - #include or execulive - if tax.inclusive - tax_incl_exec = "inclusive" - rate = tax.rate - divided_value = (100 + rate)/rate - sale_tax.tax_payable_amount = total_tax / divided_value - else - sale_tax.tax_payable_amount = total_tax * tax.rate / 100 - total_tax_amount = total_tax_amount + sale_tax.tax_payable_amount - end - #new taxable amount is standard rule for step by step - if shop.calc_tax_order - total_taxable = total_taxable + sale_tax.tax_payable_amount - end - sale_tax.inclusive = tax.inclusive - sale_tax.save - # end - # end - end + # substract , to give after discount + total_tax = total_taxable - total_discount + #include or execulive + if tax.inclusive + tax_incl_exec = "inclusive" + rate = tax.rate + divided_value = (100 + rate)/rate + sale_tax.tax_payable_amount = total_tax / divided_value + else + sale_tax.tax_payable_amount = total_tax * tax.rate / 100 + total_tax_amount = total_tax_amount + sale_tax.tax_payable_amount end + #new taxable amount is standard rule for step by step + if shop.calc_tax_order + total_taxable = total_taxable + sale_tax.tax_payable_amount + end + sale_tax.inclusive = tax.inclusive + sale_tax.save end end sale.tax_type = tax_incl_exec @@ -608,8 +569,7 @@ class Sale < ApplicationRecord # existing_tax.delete # end - taxes = SaleTax.where("sale_id='#{self.sale_id}'").pluck(:sale_tax_id) - SaleTax.where("sale_tax_id IN (?)", taxes).destroy_all + taxes = SaleTax.where("sale_id='#{self.sale_id}'").destroy_all total_tax_amount = 0 tax_incl_exec = "exclusive" @@ -622,77 +582,34 @@ class Sale < ApplicationRecord # tax_data = TaxProfile.unscoped.where("group_type=?",order_source).pluck(:id) # customer = Customer.find(self.customer_id).tax_profiles - arr_tax = [] - arr_tax = unique_tax_profiles(order_source, self.customer_id) + tax_profiles = unique_tax_profiles(order_source, self.customer_id) - if !arr_tax.empty? - if tax_type.nil? - tax_profiles = TaxProfile.where(:id => arr_tax) - else - tax_profiles = TaxProfile.where("group_type=?",order_source) - end - else - tax_profiles = TaxProfile.where("group_type=?",order_source) - end #Create new tax records tax_profiles.each do |tax| - if tax.group_type.to_s == order_source.to_s - if tax_type - if tax_type.to_s == tax.name.to_s || tax_type == 'all' - sale_tax = SaleTax.new(:sale => self) - sale_tax.tax_name = tax.name - sale_tax.tax_rate = tax.rate + sale_tax = SaleTax.new(:sale => self) + sale_tax.tax_name = tax.name + sale_tax.tax_rate = tax.rate - # substract , to give after discount - total_tax = total_taxable - total_discount - #include or execulive - if tax.inclusive - tax_incl_exec = "inclusive" - rate = tax.rate - divided_value = (100 + rate)/rate - sale_tax.tax_payable_amount = total_tax / divided_value - else - sale_tax.tax_payable_amount = total_tax * tax.rate / 100 - total_tax_amount = total_tax_amount + sale_tax.tax_payable_amount - end - #new taxable amount is standard rule for step by step - if shop.calc_tax_order - total_taxable = total_taxable + sale_tax.tax_payable_amount - end - sale_tax.inclusive = tax.inclusive - sale_tax.save - end - else - # customer.tax_profiles.each do |cus_tax| - # if cus_tax.to_i == tax.id - sale_tax = SaleTax.new(:sale => self) - sale_tax.tax_name = tax.name - sale_tax.tax_rate = tax.rate - - # substract , to give after discount - total_tax = total_taxable - self.total_discount - #include or execulive - if tax.inclusive - tax_incl_exec = "inclusive" - rate = tax.rate - divided_value = (100 + rate)/rate - sale_tax.tax_payable_amount = total_tax / divided_value - else - sale_tax.tax_payable_amount = total_tax * tax.rate / 100 - total_tax_amount = total_tax_amount + sale_tax.tax_payable_amount - end - - #new taxable amount is standard rule for step by step - if shop.calc_tax_order - total_taxable = total_taxable + sale_tax.tax_payable_amount - end - - sale_tax.inclusive = tax.inclusive - sale_tax.save - # end - # end - end + # substract , to give after discount + total_tax = total_taxable - self.total_discount + #include or execulive + if tax.inclusive + tax_incl_exec = "inclusive" + rate = tax.rate + divided_value = (100 + rate)/rate + sale_tax.tax_payable_amount = total_tax / divided_value + else + sale_tax.tax_payable_amount = total_tax * tax.rate / 100 + total_tax_amount = total_tax_amount + sale_tax.tax_payable_amount end + + #new taxable amount is standard rule for step by step + if shop.calc_tax_order + total_taxable = total_taxable + sale_tax.tax_payable_amount + end + + sale_tax.inclusive = tax.inclusive + sale_tax.save end self.tax_type = tax_incl_exec self.total_tax = total_tax_amount @@ -727,42 +644,16 @@ class Sale < ApplicationRecord shop_details = Shop.first # rounding adjustment if shop_details.is_rounding_adj - a = self.grand_total % 25 # Modulus - b = self.grand_total / 25 # Division - #not calculate rounding if modulus is 0 and division is even - #calculate rounding if modulus is zero or not zero and division are not even - if (a != 0.0 && b%2 != 0.0) || (a==0.0 && b%2 !=0) - new_total = Sale.get_rounding_adjustment(self.grand_total) - self.rounding_adjustment = new_total - self.grand_total - else - self.rounding_adjustment = 0.00 - end + new_total = Sale.get_rounding_adjustment(self.grand_total) + self.rounding_adjustment = new_total - self.grand_total + self.old_grand_total = self.grand_total + self.grand_total = new_total else self.rounding_adjustment = 0.00 end end - def compute_adjust_rounding(grand_total) - shop_details = Shop.first - # rounding adjustment - if shop_details.is_rounding_adj - a = grand_total % 25 # Modulus - b = grand_total / 25 # Division - #not calculate rounding if modulus is 0 and division is even - #calculate rounding if modulus is zero or not zero and division are not even - if (a != 0.0 && b%2 != 0.0) || (a==0.0 && b%2 !=0) - new_total = Sale.get_rounding_adjustment(grand_total) - rounding_adjustment = new_total - grand_total - else - rounding_adjustment = 0.00 - end - else - rounding_adjustment = 0.00 - end - return rounding_adjustment - end - #Generate new Receipt No when it is not assigned def generate_receipt_no #shop_code and client_code @@ -857,36 +748,16 @@ class Sale < ApplicationRecord # if get_rounded_amt == true value = 0 - num = num.to_f.round - get_last_no = num.to_s.last(2).to_f - if get_last_no.between?(0,25) - ## down to 0 - num -= get_last_no - else - if get_last_no.between?(26,50) - ## up to 50 - value = 50 - get_last_no.to_f - num += value - puts 'up to 50' - else - if get_last_no.between?(51, 75) - ## down to 50 - value = get_last_no.to_f - 50 - num -= value - puts 'down to 50' - else - ## up to 100 - value = 100 - get_last_no.to_f - num += value - puts 'up to 100' - end - end + # num = num.to_f.round + mod = num % 50 + if mod > 0 && mod <= 25 + num -= mod + elsif mod > 25 + num += 50 - mod end - # end return num end - def self.daily_sales_list(from,to) sub_query = "SELECT (CASE WHEN SUM(sale_payments.payment_amount) > 0 THEN (SUM(sale_payments.payment_amount) + SUM(sale_payments.outstanding_amount)) ELSE 0 END) @@ -2646,20 +2517,15 @@ def self.get_sale_data_for_other_payment_credit(sale_id) end def unique_tax_profiles(order_source, customer_id) - tax_data = TaxProfile.where("group_type='#{order_source}'").pluck(:id) - customer_tax_profiles = Customer.find(customer_id).tax_profiles + tax_data = TaxProfile + .where(group_type: order_source) - arr_data = [] - if !customer_tax_profiles.empty? - customer_tax_profiles.each do |value1| - if tax_data.include? value1.to_i - arr_data.push(value1.to_i) - end - end - return arr_data - else - return tax_data + customer_tax_profiles = Customer.select(:tax_profiles).where(customer_id: customer_id).first + if customer_tax_profiles.present? + tax_data = tax_data.where(id: customer_tax_profiles.tax_profiles) end + + return tax_data end def self.top_bottom(today,shift=nil,from=nil,to=nil,from_time=nil,to_time=nil) @@ -2893,6 +2759,20 @@ private end end + def round_to_precision + if (self.total_amount != self.total_amount_was || self.total_discount != self.total_discount_was || self.total_tax != self.total_tax_was) + if (self.total_amount % 1 > 0 || self.total_discount % 1 > 0 || self.total_tax % 1 > 0) + precision = PrintSetting.get_precision_delimiter().precision.to_i + + self.total_amount = self.total_amount.round(precision) + self.total_discount = self.total_discount.round(precision) + self.total_tax = self.total_tax.round(precision) + self.grand_total = (self.total_amount - self.total_discount) + self.total_tax + end + adjust_rounding + end + end + def update_stock_journal if self.sale_status == "void" && self.sale_status_before_last_save != "void" self.sale_items.each do |item| diff --git a/app/models/sale_item.rb b/app/models/sale_item.rb index d17edc6e..0e073f13 100755 --- a/app/models/sale_item.rb +++ b/app/models/sale_item.rb @@ -11,6 +11,7 @@ class SaleItem < ApplicationRecord def compute_item end + before_validation :round_to_precision after_update :update_stock_journal # Add Sale Items @@ -231,6 +232,24 @@ class SaleItem < ApplicationRecord end end + def round_to_precision + unit_price_fraction = self.unit_price % 1 + price_fraction = self.unit_price % 1 + # is_dining_charge = self.menu_category_code == 'DingingCharge' + + if self.unit_price != self.unit_price_was || self.price != self.price_was + if unit_price_fraction > 0 || price_fraction > 0 + if ['Discount', 'promotion'].include?(self.status) + precision = PrintSetting.get_precision_delimiter().precision.to_i + + self.unit_price = self.unit_price.round(precision) + self.price = (self.unit_price * self.qty).round(precision) + self.taxable_price = self.price + end + end + end + end + def update_stock_journal is_void = self.status == "void" && self.status_before_last_save != "void" cancel_void = self.status_before_last_save == "void" && self.status.nil? diff --git a/app/models/sale_order.rb b/app/models/sale_order.rb index bbd68829..bb1375a8 100755 --- a/app/models/sale_order.rb +++ b/app/models/sale_order.rb @@ -6,8 +6,9 @@ class SaleOrder < ApplicationRecord belongs_to :sale belongs_to :order + has_many :order_items, foreign_key: "order_id", primary_key: "order_id" - def create_sale_order(sale_id, order_id) + def create_sale_order(sale_id, order_id) # sale_order = SaleOrder.new self.sale_id = sale_id self.order_id = order_id @@ -37,6 +38,6 @@ class SaleOrder < ApplicationRecord if self.sale_order_id.nil? self.sale_order_id = SeedGenerator.generate_id(self.class.name, 'SOI') end - + end end diff --git a/app/models/sale_tax.rb b/app/models/sale_tax.rb index 06c73253..2e35d2b5 100755 --- a/app/models/sale_tax.rb +++ b/app/models/sale_tax.rb @@ -5,6 +5,8 @@ class SaleTax < ApplicationRecord before_create :generate_custom_id belongs_to :sale + before_validation :round_to_precision + def self.sync_sale_tax_records(sale_taxes) if !sale_taxes.nil? sale_taxes.each do |t| @@ -38,4 +40,13 @@ class SaleTax < ApplicationRecord self.sale_tax_id = SeedGenerator.generate_id(self.class.name, "STI") end end + + def round_to_precision + if self.tax_payable_amount != self.tax_payable_amount_was + if self.tax_payable_amount % 1 > 0 + precision = PrintSetting.get_precision_delimiter().precision.to_i + self.tax_payable_amount = self.tax_payable_amount.round(precision) + end + end + end end diff --git a/app/pdf/order_item_customise_pdf.rb b/app/pdf/order_item_customise_pdf.rb index 850a9574..b509a01a 100644 --- a/app/pdf/order_item_customise_pdf.rb +++ b/app/pdf/order_item_customise_pdf.rb @@ -129,7 +129,7 @@ class OrderItemCustomisePdf < Prawn::Document # add option y_position = cursor - bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + bounding_box([0,y_position], :width => self.item_width) do text "#{options}", :size => self.item_font_size,:align => :left end end diff --git a/app/pdf/order_item_pdf.rb b/app/pdf/order_item_pdf.rb index 58937093..ed079aeb 100755 --- a/app/pdf/order_item_pdf.rb +++ b/app/pdf/order_item_pdf.rb @@ -130,7 +130,7 @@ class OrderItemPdf < Prawn::Document # add option y_position = cursor - bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + bounding_box([0,y_position], :width => self.item_width) do text "#{options}", :size => self.item_font_size,:align => :left end end diff --git a/app/pdf/order_item_slim_pdf.rb b/app/pdf/order_item_slim_pdf.rb index 33e1e314..3e39644f 100755 --- a/app/pdf/order_item_slim_pdf.rb +++ b/app/pdf/order_item_slim_pdf.rb @@ -130,7 +130,7 @@ class OrderItemSlimPdf < Prawn::Document # add option y_position = cursor - bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + bounding_box([0,y_position], :width => self.item_width) do text "#{options}", :size => self.item_font_size,:align => :left end end diff --git a/app/pdf/order_item_star_pdf.rb b/app/pdf/order_item_star_pdf.rb index 711fb81e..2686efd7 100644 --- a/app/pdf/order_item_star_pdf.rb +++ b/app/pdf/order_item_star_pdf.rb @@ -130,7 +130,7 @@ class OrderItemStarPdf < Prawn::Document # add option y_position = cursor - bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + bounding_box([0,y_position], :width => self.item_width) do text "#{options}", :size => self.item_font_size,:align => :left end end diff --git a/app/pdf/order_set_item_customise_pdf.rb b/app/pdf/order_set_item_customise_pdf.rb index ce3e654f..2e1d0a2c 100644 --- a/app/pdf/order_set_item_customise_pdf.rb +++ b/app/pdf/order_set_item_customise_pdf.rb @@ -144,7 +144,7 @@ class OrderSetItemCustomisePdf < Prawn::Document # add option y_position = cursor - bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + bounding_box([0,y_position], :width => self.item_width) do text "#{options}", :size => self.item_font_size,:align => :left end end diff --git a/app/pdf/order_set_item_pdf.rb b/app/pdf/order_set_item_pdf.rb index a02dc3e2..09cdc6db 100755 --- a/app/pdf/order_set_item_pdf.rb +++ b/app/pdf/order_set_item_pdf.rb @@ -143,7 +143,7 @@ class OrderSetItemPdf < Prawn::Document # add option y_position = cursor - bounding_box([0,y_position], :width => self.item_width, :height => self.item_height) do + bounding_box([0,y_position], :width => self.item_width) do text "#{options}", :size => self.item_font_size,:align => :left end end diff --git a/app/views/origami/discounts/index.html.erb b/app/views/origami/discounts/index.html.erb index 3b14e05a..abeeb442 100755 --- a/app/views/origami/discounts/index.html.erb +++ b/app/views/origami/discounts/index.html.erb @@ -34,7 +34,7 @@ <%end%> - +

Receipt No: <%=@sale_data.receipt_no rescue ' '%>

@@ -44,24 +44,22 @@
-
- - - - - - +
+ +
ItemsQTY
+ + + + - - + + <% sub_total = 0 %> <% @sale_data.sale_items.each do |sale_item| %> - <% - sub_total += sale_item.qty*sale_item.unit_price - if sale_item.price != 0 && sale_item.status != "void" && sale_item.status != "foc" - %> - > + <% sub_total += sale_item.qty * sale_item.unit_price %> + <% if sale_item.price > 0 && sale_item.status.blank? %> + > - <% - end - end - %> - -
ItemsQTY Price
@@ -74,14 +72,26 @@ <%=(sale_item.qty*sale_item.unit_price)%>
-
-
+ <% elsif sale_item.price < 0 && sale_item.status == "Discount" %> + > + + + + <%=sale_item.product_name%>@<%=sale_item.unit_price%> + + + <%=sale_item.qty.abs%> + + + <%=(sale_item.qty*sale_item.unit_price)%> + + + <% end %> + <% end %> + + + +