From 7c171057d1fc0e05d9062b1aa32ebbab01acfad6 Mon Sep 17 00:00:00 2001 From: phyusin Date: Fri, 23 Feb 2018 14:03:25 +0630 Subject: [PATCH] product sale --- .../javascripts/reports/product_sale.coffee | 3 + .../stylesheets/reports/product_sale.scss | 3 + .../reports/product_sale_controller.rb | 80 +++++ .../reports/saleitem_controller.rb | 4 +- app/helpers/reports/product_sale_helper.rb | 2 + app/models/sale.rb | 47 ++- app/views/layouts/_left_sidebar.html.erb | 3 + .../_shift_sale_report_filter.html.erb | 120 +++++++ app/views/reports/product_sale/index.html.erb | 292 ++++++++++++++++++ app/views/reports/product_sale/index.xls.erb | 175 +++++++++++ config/routes.rb | 1 + .../reports/product_sale_controller_spec.rb | 5 + .../reports/product_sale_helper_spec.rb | 15 + 13 files changed, 746 insertions(+), 4 deletions(-) create mode 100644 app/assets/javascripts/reports/product_sale.coffee create mode 100644 app/assets/stylesheets/reports/product_sale.scss create mode 100644 app/controllers/reports/product_sale_controller.rb create mode 100644 app/helpers/reports/product_sale_helper.rb create mode 100755 app/views/reports/product_sale/_shift_sale_report_filter.html.erb create mode 100644 app/views/reports/product_sale/index.html.erb create mode 100755 app/views/reports/product_sale/index.xls.erb create mode 100644 spec/controllers/reports/product_sale_controller_spec.rb create mode 100644 spec/helpers/reports/product_sale_helper_spec.rb 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 %> +
    +
    + + +
    + +
    + + + +
    +
    + + +
    +
    + + +
    +
    +
    + +
    +
    + <% 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} %> + +
    + + + +
    +
    +
    + + + + + + <% if @shift_from %> + + <% if @shift_data.employee %> + <% cashier_name = !@shift_data.nil? ? @shift_data.employee.name : '-' %> + <% end %> + + + <% end %> + + + + + + + + + + + + <% 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) %> + + + + + + + <% acc_arr.push(sale.account_id) %> + <% end %> + + + <% if !cate_arr.include?(sale.menu_category_id) %> + + <% cate_arr.push(sale.menu_category_id) %> + <% else %> + + <% end %> + + + + + + + + + <% @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 %> + + + + + + + + <% sub_total = 0.0%> + <% sub_qty = 0 %> + <% count = 0%> + <% end %> + <% end %> + <% end %> + + <% end %> + + + + + + + + + <% end %> + + + + + + + + +
    <%= 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 '-'%>
    <%= t("views.right_panel.detail.shift_name") %> = <%= @shift_from %> - <%= @shift_to %> ( <%= cashier_name %> )
     <%= 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") %>
    <%= 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 %> +
     <%= sale.menu_category_name %> <%= 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 '-'%>
     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)%>
     <%= 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)%>
     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 @@ +
    +
    +
    +
    +
    + + + + + + <% if @shift_from %> + + <% if @shift_data.employee %> + <% cashier_name = !@shift_data.nil? ? @shift_data.employee.name : '-' %> + <% end %> + + + <% end %> + + + + + + + + + + + + <% 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) %> + + + + + + + <% acc_arr.push(sale.account_id) %> + <% end %> + + + <% if !cate_arr.include?(sale.menu_category_id) %> + + <% cate_arr.push(sale.menu_category_id) %> + <% else %> + + <% end %> + + + + + + + + <% @menu_cate_count.each do |key,value| %> + <% if sale.menu_category_id == key %> + + <% count = count + 1 %> + <% sub_total += sale.grand_total %> + <% if count == value %> + + + + + + <% 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.each do |other| %> + <% if other.total_item > 0 + total_qty += other.total_item + end %> + <% grand_total +=other.grand_total%> + + + + + + + + + + + + <% other_sub_total += other.grand_total %> + + <% end %> + + + + + + + + + + + + + + <% end %> + + + + + + + + + + + + + + + + + + + + + + +
    <%= 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 '-'%>
    <%= t("views.right_panel.detail.shift_name") %> = <%= @shift_from %> - <%= @shift_to %> ( <%= cashier_name %> )
     <%= 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") %>
    <%= 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 %> +
     <%= sale.menu_category_name %> <%= sale.item_code rescue '-' %><%= sale.product_name rescue '-' %><%= sale.total_item rescue '-' %><%= sale.unit_price rescue '-' %><%= sale.grand_total rescue '-' %>
     <%= t("views.right_panel.detail.sub_total") %><%= sub_total %>
    Other Charges 
     Other Charges<%= other.item_code rescue '-' %><%= other.product_name rescue '-' %><%= other.total_item rescue '-' %><%= other.unit_price rescue '-' %><%= other.grand_total rescue '-' %>
     <%= 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%>
     <%= 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