diff --git a/app/assets/javascripts/reports/product_sale.coffee b/app/assets/javascripts/reports/product_sale.coffee
new file mode 100644
index 00000000..24f83d18
--- /dev/null
+++ b/app/assets/javascripts/reports/product_sale.coffee
@@ -0,0 +1,3 @@
+# Place all the behaviors and hooks related to the matching controller here.
+# All this logic will automatically be available in application.js.
+# You can use CoffeeScript in this file: http://coffeescript.org/
diff --git a/app/assets/stylesheets/reports/product_sale.scss b/app/assets/stylesheets/reports/product_sale.scss
new file mode 100644
index 00000000..cb0b9a13
--- /dev/null
+++ b/app/assets/stylesheets/reports/product_sale.scss
@@ -0,0 +1,3 @@
+// Place all the styles related to the reports/ProductSale controller here.
+// They will automatically be included in application.css.
+// You can use Sass (SCSS) here: http://sass-lang.com/
diff --git a/app/controllers/reports/product_sale_controller.rb b/app/controllers/reports/product_sale_controller.rb
new file mode 100644
index 00000000..0061818a
--- /dev/null
+++ b/app/controllers/reports/product_sale_controller.rb
@@ -0,0 +1,80 @@
+class Reports::ProductSaleController < BaseReportController
+ authorize_resource :class => false
+
+ def index
+ from, to = get_date_range_from_params
+ shift_sale_range = Sale.get_by_shift_sale(from,to,Sale::SALE_STATUS_COMPLETED)
+
+ shift = ''
+ if params[:shift_name].to_i != 0
+ shift_sale = ShiftSale.find(params[:shift_name])
+ if to.blank?
+ shift = ShiftSale.where('shift_started_at = ? and shift_closed_at is NULL ',shift_sale.shift_started_at)
+ else
+
+ shift = ShiftSale.where('shift_started_at = ? and shift_closed_at = ? ',shift_sale.shift_started_at, shift_sale.shift_closed_at)
+ end
+ end
+ @sale_data, @grand_total = Sale.get_by_items(shift_sale_range,shift, from, to)
+
+ @sale_taxes = Sale.get_separate_tax(shift_sale_range,shift,from,to,nil)
+
+ @account_cate_count = Hash.new {|hash, key| hash[key] = 0}
+
+
+ @sale_data.each {|acc_cate| @account_cate_count[acc_cate.account_id] += 1}
+
+ @menu_cate_count = Hash.new {|hash, key| hash[key] = 0}
+ @sale_data.each {|cate| @menu_cate_count[cate.account_id] += 1}
+
+
+ @totalByAccount = Hash.new {|hash, key| hash[key] = 0}
+ @sale_data.each {|acc| @totalByAccount[acc.account_id] += acc.grand_total}
+
+ @from = from
+ @to = to
+
+ # get printer info
+ @print_settings = PrintSetting.get_precision_delimiter()
+
+ if shift.present?
+ shift.each do |sh|
+ @shift_from = sh.shift_started_at.nil? ? '-' : sh.shift_started_at.utc.getlocal.strftime("%e %b %I:%M%p")
+ @shift_to = sh.shift_closed_at.nil? ? '-' : sh.shift_closed_at.utc.getlocal.strftime("%e %b %I:%M%p")
+ @shift_data = sh
+ end
+ end
+
+ respond_to do |format|
+ format.html
+ format.xls
+ end
+ end
+
+ # def show
+ # from, to, report_type = get_date_range_from_params
+
+ # @sale_data = Sale.get_by_shift_sale(from,to,Sale::SALE_STATUS_COMPLETED)
+
+ # date_arr = Array.new
+ # @sale_data.each do |sale|
+ # local_opening_date = sale.opening_date.nil? ? '-' : sale.opening_date.utc.getlocal.strftime("%e %b %I:%M%p")
+ # local_closing_date = sale.closing_date.nil? ? '-' : sale.closing_date.utc.getlocal.strftime("%e %b %I:%M%p")
+ # opening_date = sale.opening_date.nil? ? '-' : sale.opening_date.utc
+ # closing_date = sale.closing_date.nil? ? '-' : sale.closing_date.utc
+ # shift_id = sale.id.nil? ? '-' : sale.id
+ # str = {:shift_id => shift_id, :local_opening_date => local_opening_date, :local_closing_date => local_closing_date, :opening_date => opening_date, :closing_date => closing_date}
+ # date_arr.push(str)
+ # end
+
+ # @totalByAccount = Hash.new {|hash, key| hash[key] = 0}
+ # @sale_data.each {|acc| @totalByAccount[acc.account_id] += acc.grand_total}
+
+ # out = {:status => 'ok', :message => date_arr}
+
+ # respond_to do |format|
+ # format.json { render json: out }
+ # end
+ # end
+
+end
diff --git a/app/controllers/reports/saleitem_controller.rb b/app/controllers/reports/saleitem_controller.rb
index 4e337e30..06124265 100755
--- a/app/controllers/reports/saleitem_controller.rb
+++ b/app/controllers/reports/saleitem_controller.rb
@@ -33,9 +33,7 @@ class Reports::SaleitemController < BaseReportController
@from = from
@to = to
-
- puts "foc_data"
- puts @foc_data
+
# get printer info
@print_settings = PrintSetting.get_precision_delimiter()
diff --git a/app/helpers/reports/product_sale_helper.rb b/app/helpers/reports/product_sale_helper.rb
new file mode 100644
index 00000000..103bd624
--- /dev/null
+++ b/app/helpers/reports/product_sale_helper.rb
@@ -0,0 +1,2 @@
+module Reports::ProductSaleHelper
+end
diff --git a/app/models/sale.rb b/app/models/sale.rb
index 2265a135..cd896f5f 100755
--- a/app/models/sale.rb
+++ b/app/models/sale.rb
@@ -785,7 +785,6 @@ end
def self.get_by_shift_items(shift_sale_range, shift, from, to, status)
# date_type_selection = get_sql_function_for_report_type(report_type)
-
query = self.get_item_query()
discount_query = 0
@@ -861,6 +860,52 @@ def self.get_by_shift_items(shift_sale_range, shift, from, to, status)
return query,other_charges, discount_query , total_cash_amount , total_card_amount , total_credit_amount , total_foc_amount , total_grand_total , change_amount
end
+#product sale report query
+def self.get_product_item_query()
+ query = Sale.select("acc.title as account_name,mi.account_id, i.item_instance_code as item_code,i.account_id as account_id, " +
+ "SUM(i.qty * i.unit_price) as grand_total,SUM(i.qty) as total_item,i.qty as qty," +
+ "i.remark as status_type,"+
+ " i.unit_price,i.price as price,i.product_name as product_name, mc.name as" +
+ " menu_category_name,mc.id as menu_category_id ")
+
+ query = query.joins("JOIN sale_items i ON i.sale_id = sales.sale_id" +
+ " JOIN menu_item_instances mii ON i.item_instance_code = mii.item_instance_code" +
+ " JOIN menu_items mi ON mi.id = mii.menu_item_id" +
+ " JOIN shift_sales sh ON sh.`id` = sales.shift_sale_id" +
+ " JOIN menu_categories mc ON mc.id = mi.menu_category_id ")
+ # "JOIN employee_accesses ea ON ea.`employee_id` = sales.cashier_id ")
+ query = query.joins(" JOIN accounts acc ON acc.id = mi.account_id")
+ # query = query.where("i.item_instance_code IS NOT NULL")
+ query = query.group("acc.title,mi.account_id,mi.menu_category_id,mi.name,mii.price")
+ .order("acc.title desc, mi.account_id desc, mi.menu_category_id desc, mii.price asc")
+end
+
+def self.get_by_items(shift_sale_range, shift, from, to)
+ query = self.get_product_item_query()
+
+ puts "query"
+ total_grand_total = 0
+
+ # if shift.present?
+ # query = query.where("sales.shift_sale_id IN (?)",shift.to_a)
+
+ # # total_grand_total = total_cash_amount.to_f + total_card_amount.to_f + total_credit_amount.to_f
+
+ # ### => get all sales range in shift_sales
+ # elsif shift_sale_range.present?
+ # query = query.where("sales.shift_sale_id IN (?)",shift_sale_range.to_a)
+
+ # # total_grand_total = total_cash_amount.to_f + total_card_amount.to_f + total_credit_amount.to_f
+
+ # else
+ # query = query.where("sales.receipt_date between ? and ?",from,to)
+ # # total_grand_total = total_cash_amount.to_f + total_card_amount.to_f + total_credit_amount.to_f
+ # end
+
+ return query, total_grand_total
+end
+#product sale report query
+
def self.get_shift_sales_by_receipt_no(shift_sale_range,shift,from,to,payment_type)
## => left join -> show all sales although no orders
if payment_type.blank?
diff --git a/app/views/layouts/_left_sidebar.html.erb b/app/views/layouts/_left_sidebar.html.erb
index 9bffd4d7..de42e719 100755
--- a/app/views/layouts/_left_sidebar.html.erb
+++ b/app/views/layouts/_left_sidebar.html.erb
@@ -122,6 +122,9 @@
Sale Items
+
+ Product Sale
+
Receipt
diff --git a/app/views/reports/product_sale/_shift_sale_report_filter.html.erb b/app/views/reports/product_sale/_shift_sale_report_filter.html.erb
new file mode 100755
index 00000000..88f26c1f
--- /dev/null
+++ b/app/views/reports/product_sale/_shift_sale_report_filter.html.erb
@@ -0,0 +1,120 @@
+
+ <%= form_tag report_path, :method => :get, :id=>"frm_report", :class => "form" do %>
+ <% if period_type != false %>
+
+
+ <%= t("views.right_panel.detail.select_period") %>
+
+ <%= t("views.right_panel.detail.select_period") %>
+ Today
+ Yesterday
+ This week
+ Last week
+ Last 7 days
+ This month
+ Last month
+ Last 30 days
+ This year
+ Last year
+
+
+
+
+
+ <%= t("views.right_panel.detail.from") %>
+
+
+
+ <%= t("views.right_panel.detail.to") %>
+
+
+
+ All Shift
+
+
+
+
+
+
+
+
+ <% end %>
+
+ <% end %>
+
+
+
diff --git a/app/views/reports/product_sale/index.html.erb b/app/views/reports/product_sale/index.html.erb
new file mode 100644
index 00000000..12e1dfe1
--- /dev/null
+++ b/app/views/reports/product_sale/index.html.erb
@@ -0,0 +1,292 @@
+
+
+
+ <%= render :partial=>'shift_sale_report_filter',
+ :locals=>{ :period_type => true, :shift_name => true, :report_path =>reports_product_sale_index_path} %>
+
+
+
+
+
+
+
+
+
+
+
+ <%= t("views.right_panel.detail.from_date") %> : <%= @from.utc.getlocal.strftime("%Y-%b-%d") rescue '-' %> - <%= t("views.right_panel.detail.to_date") %> : <%= @to.utc.getlocal.strftime("%Y-%b-%d") rescue '-'%>
+
+ <% if @shift_from %>
+
+ <% if @shift_data.employee %>
+ <% cashier_name = !@shift_data.nil? ? @shift_data.employee.name : '-' %>
+ <% end %>
+ <%= t("views.right_panel.detail.shift_name") %> = <%= @shift_from %> - <%= @shift_to %> ( <%= cashier_name %> )
+
+ <% end %>
+
+
+ <%= t("views.right_panel.header.menu_category") %>
+ <%= t("views.right_panel.detail.code") %>
+ <%= t("views.right_panel.detail.product") %>
+ <%= t("views.right_panel.detail.total") %> <%= t("views.right_panel.detail.item") %>
+ <%= t("views.right_panel.detail.unit_price") %>
+ <%= t("views.right_panel.detail.revenue") %>
+
+
+
+ <% if @print_settings.precision.to_i > 0
+ precision = @print_settings.precision
+ else
+ precision = 0
+ end
+ #check delimiter
+ if @print_settings.delimiter
+ delimiter = ","
+ else
+ delimiter = ""
+ end
+ %>
+ <% unless @sale_data.blank? %>
+ <% acc_arr = Array.new %>
+ <% cate_arr = Array.new %>
+
+ <% sub_qty = 0 %>
+ <% sub_total = 0 %>
+ <% other_sub_total = 0 %>
+ <% count = 0 %>
+ <% total_price = 0 %>
+ <% cate_count = 0 %>
+ <% acc_count = 0 %>
+ <% grand_total = 0 %>
+ <% total_qty = 0 %>
+ <% total_amount = 0 %>
+ <% discount = 0 %>
+ <% total_item_foc = 0 %>
+ <% total_item_dis = 0.0 %>
+ <% total_tax = 0 %>
+
+ <% @sale_data.each do |sale| %>
+
+ <% if sale.status_type != "Discount" && sale.status_type != "foc"
+ total_qty += sale.total_item
+ end %>
+ <% if sale.status_type == "foc" && sale.price > 0
+ total_qty += sale.total_item
+ end %>
+
+ <% if sale.status_type == "foc" && sale.grand_total < 0
+ total_item_foc += sale.grand_total*(-1)
+ end %>
+
+ <% if sale.status_type == "Discount" && sale.grand_total < 0
+ total_item_dis += sale.grand_total*(-1)
+ end %>
+
+ <% if !acc_arr.include?(sale.account_id) %>
+
+ <%= sale.account_name %>
+
+ <%= t("views.right_panel.detail.total_price_by") %> <%= sale.account_name %>
+
+ <% @totalByAccount.each do |account, total| %>
+ <% if sale.account_id == account %>
+ <%= number_with_precision(total, precision:precision.to_i,delimiter:delimiter) %>
+ <% grand_total += total %>
+ <% end %>
+ <% end %>
+
+
+ <% acc_arr.push(sale.account_id) %>
+ <% end %>
+
+
+ <% if !cate_arr.include?(sale.menu_category_id) %>
+ <%= sale.menu_category_name %>
+ <% cate_arr.push(sale.menu_category_id) %>
+ <% else %>
+
+ <% end %>
+ <%= sale.item_code rescue '-' %>
+ <%= sale.product_name rescue '-' %>
+ <%= sale.total_item rescue '-' %>
+ <%= number_with_precision(sale.unit_price , precision:precision.to_i,delimiter:delimiter) rescue '-'%>
+ <%= number_with_precision(sale.grand_total , precision:precision.to_i,delimiter:delimiter) rescue '-'%>
+
+
+
+ <% @menu_cate_count.each do |key,value| %>
+ <% if sale.account_id == key %>
+ <% count = count + 1 %>
+ <% sub_total += sale.grand_total %>
+ <% #sub_qty += sale.total_item %>
+ <% if sale.status_type!="Discount" && (!sale.product_name.include? "FOC")
+ sub_qty += sale.total_item
+ end %>
+
+ <% if count == value %>
+
+
+ Total <%= sale.account_name %> Qty
+ <%= sub_qty %>
+ <%= t("views.right_panel.detail.sub_total") %>
+ <%= number_with_precision(sub_total , precision:precision.to_i,delimiter:delimiter)%>
+
+ <% sub_total = 0.0%>
+ <% sub_qty = 0 %>
+ <% count = 0%>
+ <% end %>
+ <% end %>
+ <% end %>
+
+ <% end %>
+
+
+
+ <%= t("views.right_panel.detail.total") %> <%= t("views.right_panel.detail.item") %>
+ <%= total_qty%>
+ <%= t("views.right_panel.detail.total") %> <%= t("views.right_panel.detail.amount") %>
+ <%= number_with_precision(grand_total , precision:precision.to_i,delimiter:delimiter)%>
+
+ <% end %>
+
+
+
+
+ Net Amount
+ <%= number_with_precision(grand_total.to_f - @discount_data.to_f , precision:precision.to_i,delimiter:delimiter)%>
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/views/reports/product_sale/index.xls.erb b/app/views/reports/product_sale/index.xls.erb
new file mode 100755
index 00000000..f97edbb8
--- /dev/null
+++ b/app/views/reports/product_sale/index.xls.erb
@@ -0,0 +1,175 @@
+
+
+
+
+
+
+
+
+ <%= t("views.right_panel.detail.from_date") %> : <%= @from.utc.getlocal.strftime("%Y-%b-%d") rescue '-' %> - <%= t("views.right_panel.detail.to_date") %> : <%= @to.utc.getlocal.strftime("%Y-%b-%d") rescue '-'%>
+
+ <% if @shift_from %>
+
+ <% if @shift_data.employee %>
+ <% cashier_name = !@shift_data.nil? ? @shift_data.employee.name : '-' %>
+ <% end %>
+ <%= t("views.right_panel.detail.shift_name") %> = <%= @shift_from %> - <%= @shift_to %> ( <%= cashier_name %> )
+
+ <% end %>
+
+
+ <%= t("views.right_panel.header.menu_category") %>
+ <%= t("views.right_panel.detail.code") %>
+ <%= t("views.right_panel.detail.product") %>
+ <%= t("views.right_panel.detail.total") %> <%= t("views.right_panel.detail.item") %>
+ <%= t("views.right_panel.detail.unit_price") %>
+ <%= t("views.right_panel.detail.revenue") %>
+
+
+
+ <% unless @sale_data.blank? %>
+ <% acc_arr = Array.new %>
+ <% cate_arr = Array.new %>
+
+ <% sub_total = 0 %>
+ <% other_sub_total = 0 %>
+ <% count = 0 %>
+ <% total_price = 0 %>
+ <% cate_count = 0 %>
+ <% acc_count = 0 %>
+ <% grand_total = 0 %>
+ <% total_qty = 0 %>
+ <% total_amount = 0 %>
+ <% discount = 0 %>
+ <% total_item_foc = 0 %>
+ <% total_item_dis = 0 %>
+
+ <% @sale_data.each do |sale| %>
+
+ <% if sale.total_item > 0
+ total_qty += sale.total_item
+ end %>
+
+ <% if !acc_arr.include?(sale.account_id) %>
+
+ <%= sale.account_name %>
+
+ <%= t("views.right_panel.detail.total_price_by") %> <%= sale.account_name %>
+
+ <% @totalByAccount.each do |account, total| %>
+ <% if sale.account_id == account %>
+ <%= total %>
+ <% grand_total += total %>
+ <% end %>
+ <% end %>
+
+
+ <% acc_arr.push(sale.account_id) %>
+ <% end %>
+
+
+ <% if !cate_arr.include?(sale.menu_category_id) %>
+ <%= sale.menu_category_name %>
+ <% cate_arr.push(sale.menu_category_id) %>
+ <% else %>
+
+ <% end %>
+ <%= sale.item_code rescue '-' %>
+ <%= sale.product_name rescue '-' %>
+ <%= sale.total_item rescue '-' %>
+ <%= sale.unit_price rescue '-' %>
+ <%= sale.grand_total rescue '-' %>
+
+
+ <% @menu_cate_count.each do |key,value| %>
+ <% if sale.menu_category_id == key %>
+
+ <% count = count + 1 %>
+ <% sub_total += sale.grand_total %>
+ <% if count == value %>
+
+
+ <%= t("views.right_panel.detail.sub_total") %>
+ <%= sub_total %>
+
+ <% if sale.status_type === "foc"
+ total_item_foc += sale.grand_total
+ end %>
+
+ <% if sale.status_type === "Discount"
+ total_item_dis += sale.grand_total
+ end %>
+ <% sub_total = 0.0%>
+ <% count = 0%>
+ <% end %>
+ <% end %>
+ <% end %>
+
+ <% end %>
+
+
+ Other Charges
+
+
+
+ <% @other_charges.each do |other| %>
+ <% if other.total_item > 0
+ total_qty += other.total_item
+ end %>
+ <% grand_total +=other.grand_total%>
+
+
+ Other Charges
+ <%= other.item_code rescue '-' %>
+ <%= other.product_name rescue '-' %>
+ <%= other.total_item rescue '-' %>
+ <%= other.unit_price rescue '-' %>
+ <%= other.grand_total rescue '-' %>
+
+
+
+ <% other_sub_total += other.grand_total %>
+
+ <% end %>
+
+
+ <%= t("views.right_panel.detail.sub_total") %>
+ <%= other_sub_total %>
+
+
+
+
+ <%= t("views.right_panel.detail.total") %> <%= t("views.right_panel.detail.item") %>
+ <%= total_qty%>
+ <%= t("views.right_panel.detail.net_amount") %>
+ <%= grand_total%>
+
+ <% end %>
+
+
+
+ <%= t("views.right_panel.detail.foc_item") %> <%= t("views.right_panel.detail.amount") %>
+ <%= total_item_foc %>
+
+
+
+ <%= t("views.right_panel.detail.item_discount") %> <%= t("views.right_panel.detail.amount") %>
+ <%= total_item_dis %>
+
+
+
+ <%= t("views.right_panel.detail.foc_sales") %>
+ <%= @foc_data %>
+
+
+
+ <%= t("views.right_panel.detail.discount") %> <%= t("views.right_panel.detail.amount") %>
+ <%= @discount_data %>
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/config/routes.rb b/config/routes.rb
index 7d21aeb5..a189da13 100755
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -373,6 +373,7 @@ scope "(:locale)", locale: /en|mm/ do
resources :commission, :only => [:index, :show]
resources :stock_check, :only => [:index, :show]
resources :payment_method
+ resources :product_sale, :only => [:index, :show]
get "receipt_no/get_shift_by_date", to: "receipt_no#get_shift_by_date", as: "get_shift_by_date"
end
diff --git a/spec/controllers/reports/product_sale_controller_spec.rb b/spec/controllers/reports/product_sale_controller_spec.rb
new file mode 100644
index 00000000..1f87b3bc
--- /dev/null
+++ b/spec/controllers/reports/product_sale_controller_spec.rb
@@ -0,0 +1,5 @@
+require 'rails_helper'
+
+RSpec.describe Reports::ProductSaleController, type: :controller do
+
+end
diff --git a/spec/helpers/reports/product_sale_helper_spec.rb b/spec/helpers/reports/product_sale_helper_spec.rb
new file mode 100644
index 00000000..17d29e63
--- /dev/null
+++ b/spec/helpers/reports/product_sale_helper_spec.rb
@@ -0,0 +1,15 @@
+require 'rails_helper'
+
+# Specs in this file have access to a helper object that includes
+# the Reports::ProductSaleHelper. For example:
+#
+# describe Reports::ProductSaleHelper do
+# describe "string concat" do
+# it "concats two strings with spaces" do
+# expect(helper.concat_strings("this","that")).to eq("this that")
+# end
+# end
+# end
+RSpec.describe Reports::ProductSaleHelper, type: :helper do
+ pending "add some examples to (or delete) #{__FILE__}"
+end