From 155cb0a9eb9e8877c60680f1a62aabb655a89a42 Mon Sep 17 00:00:00 2001 From: Thein Lin Kyaw Date: Wed, 6 Nov 2019 17:34:42 +0630 Subject: [PATCH] rounding decimal to print_settings precision --- .../origami/discounts_controller.rb | 139 +++--- .../origami/payments_controller.rb | 24 +- .../origami/sale_edit_controller.rb | 4 +- app/models/promotion.rb | 442 +++++------------- app/models/sale.rb | 304 ++++-------- app/models/sale_item.rb | 19 + app/models/sale_order.rb | 5 +- app/models/sale_tax.rb | 11 + app/views/origami/discounts/index.html.erb | 179 +++---- app/views/reports/receipt_no/index.html.erb | 70 ++- app/views/reports/receipt_no/index.xls.erb | 72 ++- 11 files changed, 467 insertions(+), 802 deletions(-) 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 5de37662..78de240d 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 a7208d50..cb4854b8 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) @@ -2892,6 +2758,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/views/origami/discounts/index.html.erb b/app/views/origami/discounts/index.html.erb index 3b14e05a..86cf26c7 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 ' '%>

@@ -57,8 +57,8 @@ <% sub_total = 0 %> <% @sale_data.sale_items.each do |sale_item| %> - <% - sub_total += sale_item.qty*sale_item.unit_price + <% + sub_total += sale_item.qty*sale_item.unit_price if sale_item.price != 0 && sale_item.status != "void" && sale_item.status != "foc" %> > @@ -76,7 +76,7 @@ <% end - end + end %> @@ -130,18 +130,18 @@
-
-
+
+

-
+
<% @accounts.each do |acc| %> <% end %>
-
+
@@ -217,11 +217,11 @@
- +
-
+
@@ -235,7 +235,7 @@
-
+
@@ -243,11 +243,11 @@
-
+
-
+
- + --> @@ -259,7 +259,7 @@ <% if @member_discount%> - <%end %> @@ -300,10 +300,10 @@ var cashier_type = "<%= @cashier_type %>"; case 'num': var input_value = $(this).attr("data-value"); if (original_value == "0.0"){ - $('#discount-amount').val(input_value); + $('#discount-amount').val(input_value); } else{ - $('#discount-amount').val(original_value + '' + input_value); + $('#discount-amount').val(original_value + '' + input_value); } break; case 'add': @@ -313,10 +313,10 @@ var cashier_type = "<%= @cashier_type %>"; break; case 'del' : var discount_text=$('#discount-amount').val(); - $('#discount-amount').val(discount_text.substr(0,discount_text.length-1)); + $('#discount-amount').val(discount_text.substr(0,discount_text.length-1)); break; case 'clr': - $('#discount-amount').val("0.0"); + $('#discount-amount').val("0.0"); break; } event.handled = true; @@ -374,7 +374,7 @@ var cashier_type = "<%= @cashier_type %>"; } } }); - } + } }); // Calculate Net Discount for Payment @@ -384,7 +384,7 @@ var cashier_type = "<%= @cashier_type %>"; var discount_value = $('#discount-amount').val(); var sub_total = parseFloat($('#order-sub-total').text()); var ajax_url = "/origami/" + sale_id + "/discount"; - + if(discount_value!=""){ if(discount_value > 0){ if(parseFloat(discount_value) > sub_total){ @@ -393,7 +393,7 @@ var cashier_type = "<%= @cashier_type %>"; }else{ $("#discount-amountErr").html(""); // Selected Items - var sale_items = get_selected_sale_items(); + var sale_items = get_selected_sale_items(); // Selected Account var account_types = get_selected_account_types(); @@ -402,8 +402,8 @@ var cashier_type = "<%= @cashier_type %>"; calculate_overall_discount(0, discount_value); } else { - calculate_item_discount(0, discount_value, sale_items, account_types); - } + calculate_item_discount(0, discount_value, sale_items, account_types); + } // Remove Selection selection_remove(); @@ -414,7 +414,7 @@ var cashier_type = "<%= @cashier_type %>"; }else{ $("#discount-amountErr").html("can't be blank"); } - + }); // Calculate Percentage Discount for Payment @@ -425,19 +425,19 @@ var cashier_type = "<%= @cashier_type %>"; var ajax_url = "/origami/" + sale_id + "/discount"; // Selected Items - var sale_items = get_selected_sale_items(); + var sale_items = get_selected_sale_items(); // Selected Account var account_types = get_selected_account_types(); - + if(sale_items.length == 0 && account_types.length == 0){ calculate_overall_discount(1, discount_value); } else { - calculate_item_discount(1, discount_value, sale_items, account_types); + calculate_item_discount(1, discount_value, sale_items, account_types); } // Remove Selection - selection_remove(); + selection_remove(); }); // Remove selected discount items @@ -447,8 +447,8 @@ var cashier_type = "<%= @cashier_type %>"; var total = 0; $('.discount-item-row.selected-item').each(function(i){ - var amount = parseFloat($(this).find('#item-total-price').text()); - total = total + Math.abs(amount); + var amount = parseFloat($(this).find('#item-total-price').text()); + total = total + Math.abs(amount); $(this).remove(); }); $("#order-sub-total").text(origin_sub_total + total); @@ -464,8 +464,8 @@ var cashier_type = "<%= @cashier_type %>"; var sale_id = $('#sale-id').text(); var discount_items = JSON.stringify(get_discount_item_rows()); var overall_discount = $("#order-discount").text(); - var sub_total = $('#order-sub-total').text(); - var ajax_url = "/origami/" + sale_id + "/discount"; + var sub_total = $('#order-sub-total').text(); + var ajax_url = "/origami/" + sale_id + "/discount"; var params = { 'cashier_type' : cashier_type,'sale_id': sale_id, 'sub_total': sub_total, 'discount_items': discount_items, 'overall_discount': overall_discount }; @@ -473,8 +473,8 @@ var cashier_type = "<%= @cashier_type %>"; type: "POST", url: ajax_url, data: params, - success:function(result){ - $("#loading_wrapper").hide(); + success:function(result){ + $("#loading_wrapper").hide(); swal({ title: "Information!", text: result.status, @@ -489,7 +489,7 @@ var cashier_type = "<%= @cashier_type %>"; window.location.href = "/origami/room/" + result.table_id } } - }); + }); } }); }); @@ -500,12 +500,12 @@ var cashier_type = "<%= @cashier_type %>"; var sale_id = $('#sale-id').text(); var discount_items = []; - // Selected Items - var sale_items = get_selected_sale_items(); + // Selected Items + var sale_items = get_selected_sale_items(); if(sale_items.length == 0){ //swal("Information!", "You have no selected item!"); - swal ( "Oops" , "You have no selected item!" , "error" ); - return; + swal ( "Oops" , "You have no selected item!" , "error" ); + return; } for(var i=0;i < sale_items.length;i++){ @@ -514,7 +514,7 @@ var cashier_type = "<%= @cashier_type %>"; } else { swal ("Oops" , "You have no selected item!" , "error" ); - return; + return; } } @@ -539,7 +539,7 @@ var cashier_type = "<%= @cashier_type %>"; window.location.href = "/origami/room/" + result.table_id } } - }); + }); } }); }); @@ -566,7 +566,7 @@ var cashier_type = "<%= @cashier_type %>"; window.location.href = "/origami/room/" + result.table_id } } - }); + }); } }); }); @@ -575,8 +575,8 @@ var cashier_type = "<%= @cashier_type %>"; $("#member-discount").on('click', function(e){ e.preventDefault(); var sale_id = $('#sale-id').text(); - var sub_total = $('#order-sub-total').text(); - var ajax_url = "/origami/" + sale_id + "/member_discount"; + var sub_total = $('#order-sub-total').text(); + var ajax_url = "/origami/" + sale_id + "/member_discount"; // Selected Account //var account_types = JSON.stringify(get_selected_account_types()); @@ -618,7 +618,7 @@ var cashier_type = "<%= @cashier_type %>"; }); } }); - + });//end member discount }); @@ -631,7 +631,7 @@ var cashier_type = "<%= @cashier_type %>"; /* Get Item rows but not discount*/ function get_item_rows(){ - var sale_items = []; + var sale_items = []; $('.item-row').not('.discount-item-row').each(function(i){ var sale_item = {}; sale_item.id = $(this).attr('id').substr(0,16); @@ -639,13 +639,13 @@ var cashier_type = "<%= @cashier_type %>"; sale_item.account_id = $(this).find('#item-account-type').text(); sale_item.price = $(this).find('#item-total-price').text(); sale_items.push(sale_item); - }); + }); return sale_items; } /* Get discount Item rows */ function get_discount_item_rows(){ - var sale_items = []; + var sale_items = []; $('.discount-item-row').each(function(i){ var sale_item = {}; sale_item.id = $(this).attr('id'); @@ -653,13 +653,13 @@ var cashier_type = "<%= @cashier_type %>"; sale_item.account_id = $(this).find('#item_account_type').text(); sale_item.price = $(this).find('#item-total-price').text(); sale_items.push(sale_item); - }); + }); return sale_items; } /* Get discount Item rows */ // function get_selected_discount_items(){ -// var sale_items = []; +// var sale_items = []; // $('.discount-item-row').hasClass('.selected-item').each(function(i){ // var sale_item = {}; // sale_item.id = $(this).attr('id'); @@ -667,13 +667,13 @@ var cashier_type = "<%= @cashier_type %>"; // sale_item.account_id = $(this).find('#item_account_type').text(); // sale_item.price = $(this).find('#item-total-price').text(); // sale_items.push(sale_item); -// }); +// }); // return sale_items; // } /* Get Selected Sale Item's ID and Price */ function get_selected_sale_items(){ - var sale_items = []; + var sale_items = []; $('.item-row.selected-item').each(function(i){ var sale_item = {}; sale_item.id = $(this).attr('id').substr(0,16); @@ -681,33 +681,33 @@ function get_selected_sale_items(){ sale_item.account_id = $(this).find('#item-account-type').text(); sale_item.price = $(this).find('#item-total-price').text(); sale_items.push(sale_item); - }); + }); return sale_items; } /* Get Selected Accounts ID and Price */ -function get_selected_account_types(){ +function get_selected_account_types(){ var account_types = []; $('.selected-account').each(function(i){ var account= {}; account.id = $(this).attr('id').substr(8); - account.name = $(this).text(); + account.name = $(this).text(); account_types.push(account); - }); + }); return account_types; } /* Calculate Overall Discount*/ function calculate_overall_discount(type, amount){ - var origin_sub_total = parseFloat($("#order-sub-total").text()); + var origin_sub_total = parseFloat($("#order-sub-total").text()); var dis_amount = 0; var sub_total = 0; var total_discount = 0; // For Net Pay if(type == 0){ - total_discount = amount; + total_discount = Math.round(amount * Math.pow(10, precision)) / Math.pow(10, precision); } // For Percentage Pay @@ -719,10 +719,10 @@ function calculate_overall_discount(type, amount){ type: "error", confirmButtonText: 'OK', confirmButtonColor:"red" - }); + }); } else{ - total_discount = (origin_sub_total * amount)/100; + total_discount = Math.round(origin_sub_total * amount / 100 * Math.pow(10, precision)) / Math.pow(10, precision); } } @@ -731,22 +731,23 @@ function calculate_overall_discount(type, amount){ /* Calculate Items Discount*/ function calculate_item_discount(type, amount, sale_items, account_types){ - var origin_sub_total = parseFloat($("#order-sub-total").text()); + var origin_sub_total = parseFloat($("#order-sub-total").text()); var dis_amount = 0; var sub_total = 0; var total_discount = 0; var arrItemName = ""; + var precision = <%= precision %>; $("#discount_itemsErr").html(""); $("#discount-amountErr").html(""); // For Net Pay if(origin_sub_total > 0){ if(type == 0){ - dis_amount = (0 - amount); + dis_amount = -Math.round(amount * Math.pow(10, precision)) / Math.pow(10, precision); if(sale_items.length > 0){ for(var i=0;i < sale_items.length;i++){ // if(account_types.length > 0){ // for(var j=0; j < account_types.length; j++){ - // if(sale_items[i].account_id == account_types[j].id){ + // if(sale_items[i].account_id == account_types[j].id){ // // Discount Items // var discount_item_row = item_row_template(type, sale_items[i], dis_amount, amount); // $("#order-items-table tbody").append(discount_item_row); @@ -768,7 +769,7 @@ function calculate_item_discount(type, amount, sale_items, account_types){ $("#discount-amountErr").html("Discount is greater than sub total!"); } } - + // } } } @@ -782,11 +783,11 @@ function calculate_item_discount(type, amount, sale_items, account_types){ }else{ $("#discount_itemsErr").html("Discount is greater than "+arrItemName+" price"); } - + } - + // No Needs For Auto Selected - // if(account_types.length > 0){ + // if(account_types.length > 0){ // var item_rows=get_item_rows(); // if(item_rows.length > 0){ // for(var k=0; k < item_rows.length; k++){ @@ -802,7 +803,7 @@ function calculate_item_discount(type, amount, sale_items, account_types){ // } // else { // alert("No Items!"); - // } + // } // } sub_total = parseFloat(origin_sub_total) - parseFloat(total_discount); @@ -817,7 +818,7 @@ function calculate_item_discount(type, amount, sale_items, account_types){ type: "error", confirmButtonText: 'OK', confirmButtonColor:"red" - }); + }); } else{ // Check sale items exists @@ -825,7 +826,7 @@ function calculate_item_discount(type, amount, sale_items, account_types){ for(var i=0;i < sale_items.length;i++){ // if(account_types.length > 0){ // for(var j=0; j < account_types.length; j++){ - // if(sale_items[i].account_id == account_types[j].id){ + // if(sale_items[i].account_id == account_types[j].id){ // // Discount Items // dis_amount = 0 - ((sale_items[i].price * amount)/100); // var discount_item_row = item_row_template(type,sale_items[i], dis_amount, amount); @@ -835,9 +836,9 @@ function calculate_item_discount(type, amount, sale_items, account_types){ // } // } // else { - dis_amount = 0 - ((sale_items[i].price * amount)/100); + dis_amount = -Math.round(sale_items[i].price * amount / 100 * Math.pow(10, precision)) / Math.pow(10, precision); var discount_item_row = item_row_template(type,sale_items[i], dis_amount, amount); - + total_discount = total_discount + dis_amount; if(parseFloat(origin_sub_total) >= parseFloat(total_discount)){ $("#order-items-table tbody").append(discount_item_row); @@ -852,14 +853,14 @@ function calculate_item_discount(type, amount, sale_items, account_types){ } // No Needs For Auto Selected // Check account types exists - // if(account_types.length > 0){ + // if(account_types.length > 0){ // var item_rows=get_item_rows(); // console.log(account_types); // if(item_rows.length > 0){ // for(var k=0; k < item_rows.length; k++){ // for(var j=0; j < account_types.length; j++){ // if(item_rows[k].account_id == account_types[j].id){ - // // Discount Items + // // Discount Items // dis_amount = 0 - ((item_rows[k].price * amount)/100); // var discount_item_row = item_row_template(type, item_rows[k], dis_amount, amount); // $("#order-items-table tbody").append(discount_item_row); @@ -870,15 +871,15 @@ function calculate_item_discount(type, amount, sale_items, account_types){ // } // else { // alert("No Items!"); - // } - // } + // } + // } } - + $("#order-sub-total").text(parseFloat(sub_total).toFixed(<%= precision.to_i %>)); }else{ $("#discount-amountErr").html("Discount is greater than sub total!"); } - + } function item_row_template(type, item, discount_amount, amount){ @@ -887,24 +888,24 @@ function item_row_template(type, item, discount_amount, amount){ dis_str = dis_str + "(" + amount + "%)" } var discount_item_row = "" + - "" + - "" + "" + - "" + + "" + "1" + "" + - "" + - "" + + "" + + "" + discount_amount + - "" + + "" + "" + ""; - return discount_item_row; + return discount_item_row; } diff --git a/app/views/reports/receipt_no/index.html.erb b/app/views/reports/receipt_no/index.html.erb index fbd49e3e..ab8edfd0 100755 --- a/app/views/reports/receipt_no/index.html.erb +++ b/app/views/reports/receipt_no/index.html.erb @@ -98,8 +98,8 @@ <%if !@sale_data.nil? %> <% @sale_data.each do |result| %> - <% grand_total +=result.grand_total.to_f %> - <% old_grand_total += result.grand_total_after_rounding() %> + <% grand_total += result.grand_total.to_f %> + <% old_grand_total += result.grand_total.to_f - result.rounding_adjustment.to_f %> <% total_tax += result.total_tax.to_f %> <% total_sum += result.total_amount.to_f %> <% discount_amt += result.total_discount.to_f %> @@ -127,47 +127,35 @@ <%= number_with_precision(result.total_amount, precision: precision.to_i ,delimiter: delimiter) %> <%= number_with_precision(result.total_discount, precision: precision.to_i ,delimiter: delimiter) rescue '0' %> - <% if !result.sale_taxes.empty? %> - <% num = 1 - if tax_flag && tax_count > 0 %> - <% while num <= tax_count %> - - <%= number_with_precision(0, precision: precision.to_i ,delimiter: delimiter) %> - - <% num += 1 - end %> - <% end %> - <% result.sale_taxes.each do |tax| %> - - <%= number_with_precision(tax.tax_payable_amount, precision: precision.to_i ,delimiter: delimiter) rescue '-' %> - - <%end%> - <% num = 1 - if tax_flag==false && tax_count > 0 %> - <% while num <= tax_count %> - - <%= number_with_precision(0, precision: precision.to_i ,delimiter: delimiter) %> - - <% num += 1 - end %> - <% end %> - <% else %> - <% @tax_profiles.each do |tax| %> - <%= number_with_precision(0, precision: precision.to_i ,delimiter: delimiter) rescue '-' %> - <% end %> - <%end%> + <% num = 1 %> + <% if tax_flag && tax_count > 0 %> + <% while num <= tax_count %> + 0 + <% num += 1 %> + <% end %> + <% end %> + <% result.sale_taxes.each do |tax| %> + + <%= number_with_precision(tax.tax_payable_amount, precision: precision.to_i, delimiter: delimiter) rescue '-' %> + + <%end%> + <% num = 1 %> + <% if !tax_flag && tax_count > 0 %> + <% while num <= tax_count %> + 0 + <% num += 1 %> + <% end %> + <% end %> + <% else %> + <% @tax_profiles.each do |tax| %> + 0 + <% end %> + <%end%> - <% if result.old_grand_total.nil? %> - <%= number_with_precision(result.grand_total, precision: precision.to_i ,delimiter: delimiter) rescue '-' %> - <%else%> - <%= number_with_precision(result.old_grand_total, precision: precision.to_i ,delimiter: delimiter) rescue '-' %> - <%end%> - - <%= result.rounding_adjustment.to_f rescue '-' %> - <%= number_with_precision(result.grand_total, precision: precision.to_i ,delimiter: delimiter) %> + <%= number_with_precision(result.grand_total - result.rounding_adjustment, precision: precision.to_i, delimiter: delimiter) rescue '-' %> + <%= number_with_precision(result.rounding_adjustment.to_f, precision: precision.to_i, delimiter: delimiter) rescue '-' %> + <%= number_with_precision(result.grand_total, precision: precision.to_i, delimiter: delimiter) %> <% if @lookup.value.to_i == 1 %> diff --git a/app/views/reports/receipt_no/index.xls.erb b/app/views/reports/receipt_no/index.xls.erb index 66734e56..a221934f 100755 --- a/app/views/reports/receipt_no/index.xls.erb +++ b/app/views/reports/receipt_no/index.xls.erb @@ -16,21 +16,21 @@ <% if @shift_from %> - <% if @shift_data.employee %> + <% if @shift_data.employee %> <% cashier_name = !@shift_data.nil? ? @shift_data.employee.name : '-' %> - <% end %> + <% end %> <%= t("views.right_panel.detail.shift_name") %> = <%= @shift_from %> - <%= @shift_to %> ( <%= cashier_name %> ) - <% end %> + <% end %> <%= t("views.right_panel.detail.dining") %> <%= t("views.right_panel.detail.receipt_no") %> - <%= t :cashier %> <%= t("views.right_panel.detail.name") %> + <%= t :cashier %> <%= t("views.right_panel.detail.name") %> <%= t("views.right_panel.detail.total") %> <%= t("views.right_panel.detail.amount") %> <%= t("views.right_panel.detail.discount") %> <%= t("views.right_panel.detail.amount") %> <% @tax_profiles.each do |tax| %> - <%= tax.name %> + <%= tax.name %> <% end %> <%= t("views.right_panel.detail.grand_total") %> @@ -45,36 +45,36 @@ <% old_grand_total = 0 %> <% total_tax = 0 %> <% guest_count = 0 %> - <% total_sum = 0 %> - <% discount_amt = 0 %> + <% total_sum = 0 %> + <% discount_amt = 0 %> <% other_amt = 0 %> - <% total_nett = 0 %> - <% rounding_adj = 0%> <% gov_tax = 0 %> <% service_charge = 0 %> + <% total_nett = 0 %> + <% rounding_adj = 0%> <% gov_tax = 0 %> <% service_charge = 0 %> <% tax_profile_count = @tax_profiles.length %> - <% + <% ttax_count = tax_profile_count - @sale_taxes.length ttax_flag = true - @sale_taxes.each do |tax| + @sale_taxes.each do |tax| if tax.tax_name.downcase.include?("service") ttax_flag = false end - end + end %> - <%if @sale_data %> + <%if @sale_data %> <% @sale_data.each do |result| %> - <% grand_total = grand_total.to_f + result.grand_total.to_f %> - <% old_grand_total = old_grand_total.to_f + result.old_grand_total.to_f %> + <% grand_total += result.grand_total.to_f %> + <% old_grand_total += result.grand_total.to_f - result.rounding_adjustment.to_f %> <% total_tax += result.total_tax.to_f %> - <% total_sum += result.total_amount.to_f %> + <% total_sum += result.total_amount.to_f %> <% discount_amt += result.total_discount.to_f %> <% rounding_adj += result.rounding_adjustment.to_f %> <% sale_tax_count = result.sale_taxes.length %> <% tax_count = tax_profile_count - sale_tax_count %> <% tax_flag = true %> - <% result.sale_taxes.each do |tax| + <% result.sale_taxes.each do |tax| if tax.tax_name.downcase.include?("service") tax_flag = false end @@ -82,7 +82,7 @@ <%if result.type %> - <%= result.type %> - <%= result.name %> + <%= result.type %> - <%= result.name %> <% else %> - <% end %> @@ -91,15 +91,13 @@ <%= result.cashier_name rescue '-' %> <%= result.total_amount rescue '-' %> <%= result.total_discount rescue '-' %> - + <% if !result.sale_taxes.empty? %> - <% num = 1 + <% num = 1 if tax_flag && tax_count > 0 %> <% while num <= tax_count %> 0 - <% num += 1 + <% num += 1 end %> <% end %> <% result.sale_taxes.each do |tax| %> @@ -107,11 +105,11 @@ <%= tax.tax_payable_amount rescue '-' %> <%end%> - <% num = 1 + <% num = 1 if tax_flag==false && tax_count > 0 %> <% while num <= tax_count %> 0 - <% num += 1 + <% num += 1 end %> <% end %> <% else %> @@ -120,9 +118,9 @@ <% end %> <%end%> - <%= result.grand_total %> - <%= result.rounding_adjustment.to_f rescue '-' %> - <%= result.grand_total_after_rounding() rescue '-'%> + <%= result.grand_total - result.rounding_adjustment %> + <%= result.rounding_adjustment.to_f rescue '-' %> + <%= result.grand_total rescue '-'%> <% end %> @@ -134,11 +132,11 @@ <%= tax.st_amount.round(2) %> <% end %> --> <% if !@sale_taxes.empty? %> - <% num = 1 + <% num = 1 if ttax_flag && ttax_count > 0 %> <% while num <= ttax_count %> 0.00 - <% num += 1 + <% num += 1 end %> <% end %> <% @sale_taxes.each do |tax| %> @@ -146,11 +144,11 @@ <%= tax.st_amount.to_f.round(2) %> <%end%> - <% num = 1 + <% num = 1 if ttax_flag==false && ttax_count > 0 %> <% while num <= ttax_count %> 0.00 - <% num += 1 + <% num += 1 end %> <% end %> <% else %> @@ -158,15 +156,15 @@ 0.00 <% end %> <%end%> - <%= grand_total.to_f.round(2) rescue '-'%> - <%= rounding_adj rescue '-'%> - <%= grand_total.to_f.round + rounding_adj %> + <%= grand_total.to_f.round(2) rescue '-'%> + <%= rounding_adj rescue '-'%> + <%= grand_total.to_f.round + rounding_adj %>   <%= t("views.right_panel.detail.total") %> <%= t("views.right_panel.detail.amount") %> <%= t("views.right_panel.detail.discount") %> <%= t("views.right_panel.detail.amount") %> - + <% @tax_profiles.each do |tax| %> <%= tax.name %> <% end %> @@ -184,4 +182,4 @@ - \ No newline at end of file +