product sale
This commit is contained in:
3
app/assets/javascripts/reports/product_sale.coffee
Normal file
3
app/assets/javascripts/reports/product_sale.coffee
Normal file
@@ -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/
|
||||||
3
app/assets/stylesheets/reports/product_sale.scss
Normal file
3
app/assets/stylesheets/reports/product_sale.scss
Normal file
@@ -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/
|
||||||
80
app/controllers/reports/product_sale_controller.rb
Normal file
80
app/controllers/reports/product_sale_controller.rb
Normal file
@@ -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
|
||||||
@@ -33,9 +33,7 @@ class Reports::SaleitemController < BaseReportController
|
|||||||
|
|
||||||
@from = from
|
@from = from
|
||||||
@to = to
|
@to = to
|
||||||
|
|
||||||
puts "foc_data"
|
|
||||||
puts @foc_data
|
|
||||||
# get printer info
|
# get printer info
|
||||||
@print_settings = PrintSetting.get_precision_delimiter()
|
@print_settings = PrintSetting.get_precision_delimiter()
|
||||||
|
|
||||||
|
|||||||
2
app/helpers/reports/product_sale_helper.rb
Normal file
2
app/helpers/reports/product_sale_helper.rb
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
module Reports::ProductSaleHelper
|
||||||
|
end
|
||||||
@@ -785,7 +785,6 @@ end
|
|||||||
|
|
||||||
def self.get_by_shift_items(shift_sale_range, shift, from, to, status)
|
def self.get_by_shift_items(shift_sale_range, shift, from, to, status)
|
||||||
# date_type_selection = get_sql_function_for_report_type(report_type)
|
# date_type_selection = get_sql_function_for_report_type(report_type)
|
||||||
|
|
||||||
query = self.get_item_query()
|
query = self.get_item_query()
|
||||||
|
|
||||||
discount_query = 0
|
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
|
return query,other_charges, discount_query , total_cash_amount , total_card_amount , total_credit_amount , total_foc_amount , total_grand_total , change_amount
|
||||||
end
|
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)
|
def self.get_shift_sales_by_receipt_no(shift_sale_range,shift,from,to,payment_type)
|
||||||
## => left join -> show all sales although no orders
|
## => left join -> show all sales although no orders
|
||||||
if payment_type.blank?
|
if payment_type.blank?
|
||||||
|
|||||||
@@ -122,6 +122,9 @@
|
|||||||
<li>
|
<li>
|
||||||
<a href="<%= reports_saleitem_index_path %>">Sale Items</a>
|
<a href="<%= reports_saleitem_index_path %>">Sale Items</a>
|
||||||
</li>
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="<%= reports_product_sale_index_path %>">Product Sale</a>
|
||||||
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<a href="<%= reports_receipt_no_index_path %>">Receipt</a>
|
<a href="<%= reports_receipt_no_index_path %>">Receipt</a>
|
||||||
</li>
|
</li>
|
||||||
|
|||||||
120
app/views/reports/product_sale/_shift_sale_report_filter.html.erb
Executable file
120
app/views/reports/product_sale/_shift_sale_report_filter.html.erb
Executable file
@@ -0,0 +1,120 @@
|
|||||||
|
<div class="p-l-15">
|
||||||
|
<%= form_tag report_path, :method => :get, :id=>"frm_report", :class => "form" do %>
|
||||||
|
<% if period_type != false %>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-2 col-md-2 col-sm-2">
|
||||||
|
<label class="font-14"><%= t("views.right_panel.detail.select_period") %></label>
|
||||||
|
<select name="period" id="sel_period" class="form-control">
|
||||||
|
<option value=""><%= t("views.right_panel.detail.select_period") %></option>
|
||||||
|
<option value="0">Today</option>
|
||||||
|
<option value="1">Yesterday</option>
|
||||||
|
<option value="2">This week</option>
|
||||||
|
<option value="3">Last week</option>
|
||||||
|
<option value="4">Last 7 days</option>
|
||||||
|
<option value="5">This month</option>
|
||||||
|
<option value="6">Last month</option>
|
||||||
|
<option value="7">Last 30 days</option>
|
||||||
|
<option value="8">This year</option>
|
||||||
|
<option value="9">Last year</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<!-- <input type="hidden" name="report_type" value="sale_item" id="sel_sale_type"> -->
|
||||||
|
<div class="col-lg-3 col-md-3 col-sm-3">
|
||||||
|
<!-- <label class="">Select Shift Period</label> -->
|
||||||
|
<label class="font-14"><%= t("views.right_panel.detail.from") %></label>
|
||||||
|
<input data-behaviour='datepicker' class="form-control m-t-3 datepicker" name="from" id="from" type="text" placeholder="From date" style="height: 32px;">
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-3 col-md-3 col-sm-3">
|
||||||
|
<label class="font-14"><%= t("views.right_panel.detail.to") %></label>
|
||||||
|
<input data-behaviour='datepicker' class="form-control m-t-3 datepicker" name="to" id="to" type="text" placeholder="To date" style="height: 32px;">
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-2 col-md-2 col-sm-2">
|
||||||
|
<label class="font-14">All Shift</label>
|
||||||
|
<select class="form-control select" name="shift_name" id="shift_name" >
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-lg-2 col-md-2 col-sm-2 margin-top-20">
|
||||||
|
<br>
|
||||||
|
<input type="submit" value="Generate Report" class='btn btn-primary'>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<% end %>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(function(){
|
||||||
|
$('#custom_excel').hide();
|
||||||
|
|
||||||
|
$('#custom_excel').click(function(){
|
||||||
|
var url = $('#custom_excel').attr('data-url');
|
||||||
|
$('#frm_report').attr('action',url)
|
||||||
|
$('#frm_report').submit();
|
||||||
|
// window.location = url;
|
||||||
|
});
|
||||||
|
|
||||||
|
var item = $('#item').val();
|
||||||
|
var payment_type = $('#payment_type');
|
||||||
|
|
||||||
|
if(item == 'order'){
|
||||||
|
$('#cashier').hide();
|
||||||
|
$('#waiter').show();
|
||||||
|
if(payment_type){
|
||||||
|
$('#payment_type').hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if(item == 'sale'){
|
||||||
|
$('#waiter').hide();
|
||||||
|
$('#cashier').show();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$('#waiter').hide();
|
||||||
|
$('#cashier').show();
|
||||||
|
$("#item").val('sale');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
<% if params[:shift_name].to_i > 0%>
|
||||||
|
shift_id = '<%= params[:shift_name] %>'
|
||||||
|
local_date = '<%= @shift_from %> - <%= @shift_to %> '
|
||||||
|
var shift = $('#shift_name');
|
||||||
|
str = '<option value="'+ shift_id +'" '+ 'selected = "selected"' +'>' + local_date + '</option>';
|
||||||
|
shift.append(str);
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
$("#from").val("<%=params[:from] rescue '-'%>");
|
||||||
|
$("#to").val("<%=params[:to] rescue '-'%>");
|
||||||
|
$("#sel_period").val(<%=params[:period] rescue '-'%>);
|
||||||
|
$("#sel_sale_type").val(<%=params[:sale_type] rescue '-'%>);
|
||||||
|
|
||||||
|
|
||||||
|
<% if params[:period_type] == 1 || params[:period_type] == "1" %>
|
||||||
|
$("#rd_period_type_1").attr("checked","checked");
|
||||||
|
<% else %>
|
||||||
|
$("#rd_period_type_0").attr("checked","checked");
|
||||||
|
<% end %>
|
||||||
|
$(".btn-group button").removeClass("active");
|
||||||
|
<% report_type = params[:report_type].blank? ? "0" : params[:report_type] %>
|
||||||
|
$("#btn_report_type_<%= report_type %>").addClass("active");
|
||||||
|
|
||||||
|
$('#item').change(function(){
|
||||||
|
var item = $('#item').val();
|
||||||
|
var payment_type = $('#payment_type');
|
||||||
|
|
||||||
|
if(item == 'sale'){
|
||||||
|
$('#waiter').hide();
|
||||||
|
$('#cashier').show();
|
||||||
|
if(payment_type){
|
||||||
|
$('#payment_type').show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
$('#cashier').hide();
|
||||||
|
$('#waiter').show();
|
||||||
|
if(payment_type){
|
||||||
|
$('#payment_type').hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
292
app/views/reports/product_sale/index.html.erb
Normal file
292
app/views/reports/product_sale/index.html.erb
Normal file
@@ -0,0 +1,292 @@
|
|||||||
|
<div class="page-header">
|
||||||
|
<ol class="breadcrumb">
|
||||||
|
<li class="breadcrumb-item"><a href="<%= dashboard_path %>"><%= t("views.right_panel.button.home") %></a></li>
|
||||||
|
<li class="breadcrumb-item active"><%= t("views.right_panel.detail.sale_item_report") %></li>
|
||||||
|
<span class="float-right">
|
||||||
|
<%= link_to 'Back', dashboard_path %>
|
||||||
|
</span>
|
||||||
|
</ol>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<%= render :partial=>'shift_sale_report_filter',
|
||||||
|
:locals=>{ :period_type => true, :shift_name => true, :report_path =>reports_product_sale_index_path} %>
|
||||||
|
|
||||||
|
<hr />
|
||||||
|
|
||||||
|
<div class="text-right">
|
||||||
|
<a href="javascript:export_to('<%=reports_product_sale_index_path%>.xls')" class = "btn btn-info wave-effects "><%= t("views.btn.exp_to_excel") %></a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="margin-top-20">
|
||||||
|
<div class="card">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-striped" id="items_table" border="0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th colspan="7"> <%= 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 '-'%></th>
|
||||||
|
</tr>
|
||||||
|
<% if @shift_from %>
|
||||||
|
<tr>
|
||||||
|
<% if @shift_data.employee %>
|
||||||
|
<% cashier_name = !@shift_data.nil? ? @shift_data.employee.name : '-' %>
|
||||||
|
<% end %>
|
||||||
|
<th colspan="7"> <%= t("views.right_panel.detail.shift_name") %> = <%= @shift_from %> - <%= @shift_to %> ( <%= cashier_name %> )</th>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
<tr>
|
||||||
|
<th> </th>
|
||||||
|
<th><%= t("views.right_panel.header.menu_category") %></th>
|
||||||
|
<th><%= t("views.right_panel.detail.code") %></th>
|
||||||
|
<th><%= t("views.right_panel.detail.product") %></th>
|
||||||
|
<th><%= t("views.right_panel.detail.total") %> <%= t("views.right_panel.detail.item") %></th>
|
||||||
|
<th><%= t("views.right_panel.detail.unit_price") %></th>
|
||||||
|
<th><%= t("views.right_panel.detail.revenue") %></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<% 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| %>
|
||||||
|
<!-- all total qty sum -->
|
||||||
|
<% 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 %>
|
||||||
|
<!-- end all total qty -->
|
||||||
|
<% 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) %>
|
||||||
|
<tr>
|
||||||
|
<td><b><%= sale.account_name %></b></td>
|
||||||
|
<td colspan="4"> </td>
|
||||||
|
<td><%= t("views.right_panel.detail.total_price_by") %> <%= sale.account_name %></td>
|
||||||
|
<td>
|
||||||
|
<% @totalByAccount.each do |account, total| %>
|
||||||
|
<% if sale.account_id == account %>
|
||||||
|
<b><%= number_with_precision(total, precision:precision.to_i,delimiter:delimiter) %></b>
|
||||||
|
<% grand_total += total %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<% acc_arr.push(sale.account_id) %>
|
||||||
|
<% end %>
|
||||||
|
<tr>
|
||||||
|
<td> </td>
|
||||||
|
<% if !cate_arr.include?(sale.menu_category_id) %>
|
||||||
|
<td><%= sale.menu_category_name %></td>
|
||||||
|
<% cate_arr.push(sale.menu_category_id) %>
|
||||||
|
<% else %>
|
||||||
|
<td> </td>
|
||||||
|
<% end %>
|
||||||
|
<td><%= sale.item_code rescue '-' %></td>
|
||||||
|
<td><%= sale.product_name rescue '-' %></td>
|
||||||
|
<td><%= sale.total_item rescue '-' %></td>
|
||||||
|
<td><%= number_with_precision(sale.unit_price , precision:precision.to_i,delimiter:delimiter) rescue '-'%></td>
|
||||||
|
<td><%= number_with_precision(sale.grand_total , precision:precision.to_i,delimiter:delimiter) rescue '-'%></td>
|
||||||
|
</tr>
|
||||||
|
<!-- sub total -->
|
||||||
|
|
||||||
|
<% @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 %>
|
||||||
|
<tr>
|
||||||
|
<td colspan="3"> </td>
|
||||||
|
<td><b>Total <%= sale.account_name %> Qty </b> </td>
|
||||||
|
<td><b><%= sub_qty %></b></td>
|
||||||
|
<td><%= t("views.right_panel.detail.sub_total") %></td>
|
||||||
|
<td ><span class="underline"><%= number_with_precision(sub_total , precision:precision.to_i,delimiter:delimiter)%> </span></td>
|
||||||
|
</tr>
|
||||||
|
<% sub_total = 0.0%>
|
||||||
|
<% sub_qty = 0 %>
|
||||||
|
<% count = 0%>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
<!-- end sub total -->
|
||||||
|
<% end %>
|
||||||
|
<!-- End Other Charges -->
|
||||||
|
<tr style="border-top:2px solid grey;">
|
||||||
|
<td colspan="3"> </td>
|
||||||
|
<td><%= t("views.right_panel.detail.total") %> <%= t("views.right_panel.detail.item") %></td>
|
||||||
|
<td><span><%= total_qty%></span></td>
|
||||||
|
<td style="border-bottom:2px solid grey;"><%= t("views.right_panel.detail.total") %> <%= t("views.right_panel.detail.amount") %></td>
|
||||||
|
<td style="border-bottom:2px solid grey;"><span><%= number_with_precision(grand_total , precision:precision.to_i,delimiter:delimiter)%></span></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td colspan="5"> </td>
|
||||||
|
<td style="border-top:2px solid grey;">Net Amount</td>
|
||||||
|
<td style="border-top:2px solid grey;"><%= number_with_precision(grand_total.to_f - @discount_data.to_f , precision:precision.to_i,delimiter:delimiter)%></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
$(function(){
|
||||||
|
|
||||||
|
|
||||||
|
var check_arr = [];
|
||||||
|
|
||||||
|
var search = '<%= params[:period_type] %>';
|
||||||
|
|
||||||
|
if(search){
|
||||||
|
|
||||||
|
if(parseInt(search) == 0){
|
||||||
|
search_by_period();
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
search_by_date();
|
||||||
|
}
|
||||||
|
}else{
|
||||||
|
search_by_period();
|
||||||
|
}
|
||||||
|
|
||||||
|
$('#sel_period').change(function(){
|
||||||
|
search_by_period();
|
||||||
|
});
|
||||||
|
|
||||||
|
function search_by_period(){
|
||||||
|
var period = $('#sel_period').val();
|
||||||
|
var period_type = 0;
|
||||||
|
var from = "";
|
||||||
|
var to = "";
|
||||||
|
|
||||||
|
show_shift_name(period,period_type,from,to,'shift_item');
|
||||||
|
}
|
||||||
|
|
||||||
|
// OK button is clicked
|
||||||
|
$('#from').bootstrapMaterialDatePicker().on('beforeChange', function(e, date){
|
||||||
|
new_date = new Date(date) ;
|
||||||
|
month = parseInt(new_date.getMonth()+1)
|
||||||
|
from = new_date.getDate() + "-" + month + "-" + new_date.getFullYear();
|
||||||
|
$('#from').val(from)
|
||||||
|
search_by_date();
|
||||||
|
});
|
||||||
|
$('#to').bootstrapMaterialDatePicker().on('beforeChange', function(e, date){
|
||||||
|
new_date = new Date(date) ;
|
||||||
|
month = parseInt(new_date.getMonth()+1)
|
||||||
|
to = new_date.getDate() + "-" + month + "-" + new_date.getFullYear();
|
||||||
|
$('#to').val(to)
|
||||||
|
search_by_date();
|
||||||
|
});
|
||||||
|
|
||||||
|
function search_by_date(){
|
||||||
|
from = $("#from").val();
|
||||||
|
to = $("#to").val();
|
||||||
|
var period = 0;
|
||||||
|
var period_type = 1;
|
||||||
|
|
||||||
|
if(to != '' && from != ''){
|
||||||
|
shift_name = from + ',' + to;
|
||||||
|
|
||||||
|
check_arr.push(to);
|
||||||
|
|
||||||
|
console.log(check_arr.length)
|
||||||
|
if(check_arr.length == 1){
|
||||||
|
show_shift_name(period,period_type,from,to,'shift_item');
|
||||||
|
}
|
||||||
|
if(check_arr.length == 3){
|
||||||
|
check_arr = [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function show_shift_name(period,period_type,from,to,shift_item){
|
||||||
|
var shift = $('#shift_name');
|
||||||
|
if (from == '' && to == '') {
|
||||||
|
from = $("#from").val();
|
||||||
|
to = $("#to").val();
|
||||||
|
}
|
||||||
|
shift.empty();
|
||||||
|
var selected = '';
|
||||||
|
var str = '';
|
||||||
|
var param_shift = '<%= params[:shift_name]%>';
|
||||||
|
|
||||||
|
url = '<%= reports_get_shift_by_date_path %>';
|
||||||
|
$.get(url, {period :period, period_type :period_type, from :from, to :to, report_type :shift_item} , function(data){
|
||||||
|
console.log(data)
|
||||||
|
|
||||||
|
str = '<option value="0">--- All Shift ---</option>';
|
||||||
|
$(data.message).each(function(index){
|
||||||
|
|
||||||
|
var local_date = data.message[index].local_opening_date + ' - ' + data.message[index].local_closing_date;
|
||||||
|
var sh_date = data.message[index].opening_date + ' - ' + data.message[index].closing_date;
|
||||||
|
var shift_id = data.message[index].shift_id ;
|
||||||
|
|
||||||
|
if(param_shift != ''){
|
||||||
|
if(shift_id == param_shift){
|
||||||
|
selected = 'selected = "selected"';
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
selected = '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
selected = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
str += '<option value="'+ shift_id +'" '+ selected +'>' + local_date + '</option>';
|
||||||
|
|
||||||
|
// console.log(sh_date)
|
||||||
|
})
|
||||||
|
shift.append(str);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
</script>
|
||||||
175
app/views/reports/product_sale/index.xls.erb
Executable file
175
app/views/reports/product_sale/index.xls.erb
Executable file
@@ -0,0 +1,175 @@
|
|||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="margin-top-20">
|
||||||
|
<div class="card">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table table-striped" id="items_table" border="0">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th colspan="7"> <%= 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 '-'%></th>
|
||||||
|
</tr>
|
||||||
|
<% if @shift_from %>
|
||||||
|
<tr>
|
||||||
|
<% if @shift_data.employee %>
|
||||||
|
<% cashier_name = !@shift_data.nil? ? @shift_data.employee.name : '-' %>
|
||||||
|
<% end %>
|
||||||
|
<th colspan="7"> <%= t("views.right_panel.detail.shift_name") %> = <%= @shift_from %> - <%= @shift_to %> ( <%= cashier_name %> )</th>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
<tr>
|
||||||
|
<th> </th>
|
||||||
|
<th><%= t("views.right_panel.header.menu_category") %></th>
|
||||||
|
<th><%= t("views.right_panel.detail.code") %></th>
|
||||||
|
<th><%= t("views.right_panel.detail.product") %></th>
|
||||||
|
<th><%= t("views.right_panel.detail.total") %> <%= t("views.right_panel.detail.item") %></th>
|
||||||
|
<th><%= t("views.right_panel.detail.unit_price") %></th>
|
||||||
|
<th><%= t("views.right_panel.detail.revenue") %></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
<% 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) %>
|
||||||
|
<tr>
|
||||||
|
<td><b><%= sale.account_name %></b></td>
|
||||||
|
<td colspan="4"> </td>
|
||||||
|
<td><%= t("views.right_panel.detail.total_price_by") %> <%= sale.account_name %></td>
|
||||||
|
<td>
|
||||||
|
<% @totalByAccount.each do |account, total| %>
|
||||||
|
<% if sale.account_id == account %>
|
||||||
|
<b><%= total %></b>
|
||||||
|
<% grand_total += total %>
|
||||||
|
<% end %>
|
||||||
|
<% end %>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<% acc_arr.push(sale.account_id) %>
|
||||||
|
<% end %>
|
||||||
|
<tr>
|
||||||
|
<td> </td>
|
||||||
|
<% if !cate_arr.include?(sale.menu_category_id) %>
|
||||||
|
<td><%= sale.menu_category_name %></td>
|
||||||
|
<% cate_arr.push(sale.menu_category_id) %>
|
||||||
|
<% else %>
|
||||||
|
<td> </td>
|
||||||
|
<% end %>
|
||||||
|
<td><%= sale.item_code rescue '-' %></td>
|
||||||
|
<td><%= sale.product_name rescue '-' %></td>
|
||||||
|
<td><%= sale.total_item rescue '-' %></td>
|
||||||
|
<td><%= sale.unit_price rescue '-' %></td>
|
||||||
|
<td><%= sale.grand_total rescue '-' %></td>
|
||||||
|
</tr>
|
||||||
|
<!-- sub total -->
|
||||||
|
<% @menu_cate_count.each do |key,value| %>
|
||||||
|
<% if sale.menu_category_id == key %>
|
||||||
|
|
||||||
|
<% count = count + 1 %>
|
||||||
|
<% sub_total += sale.grand_total %>
|
||||||
|
<% if count == value %>
|
||||||
|
<tr>
|
||||||
|
<td colspan="5"> </td>
|
||||||
|
<td><%= t("views.right_panel.detail.sub_total") %></td>
|
||||||
|
<td ><span class="underline"><%= sub_total %></span></td>
|
||||||
|
</tr>
|
||||||
|
<% 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 sub total -->
|
||||||
|
<% end %>
|
||||||
|
<!--Other Charges -->
|
||||||
|
<tr>
|
||||||
|
<td><b>Other Charges</b></td>
|
||||||
|
<td colspan="4"> </td>
|
||||||
|
<td></td>
|
||||||
|
</tr>
|
||||||
|
<% @other_charges.each do |other| %>
|
||||||
|
<% if other.total_item > 0
|
||||||
|
total_qty += other.total_item
|
||||||
|
end %>
|
||||||
|
<% grand_total +=other.grand_total%>
|
||||||
|
<tr>
|
||||||
|
<td> </td>
|
||||||
|
<td>Other Charges</td>
|
||||||
|
<td><%= other.item_code rescue '-' %></td>
|
||||||
|
<td><%= other.product_name rescue '-' %></td>
|
||||||
|
<td><%= other.total_item rescue '-' %></td>
|
||||||
|
<td><%= other.unit_price rescue '-' %></td>
|
||||||
|
<td><%= other.grand_total rescue '-' %></td>
|
||||||
|
</tr>
|
||||||
|
<!-- sub total -->
|
||||||
|
|
||||||
|
<% other_sub_total += other.grand_total %>
|
||||||
|
<!-- end sub total -->
|
||||||
|
<% end %>
|
||||||
|
<tr>
|
||||||
|
<td colspan="5"> </td>
|
||||||
|
<td><%= t("views.right_panel.detail.sub_total") %></td>
|
||||||
|
<td ><span class="underline"><%= other_sub_total %></span></td>
|
||||||
|
</tr>
|
||||||
|
<!-- End Other Charges -->
|
||||||
|
<tr style="border-top:2px solid grey;">
|
||||||
|
<td colspan="3"> </td>
|
||||||
|
<td><%= t("views.right_panel.detail.total") %> <%= t("views.right_panel.detail.item") %></td>
|
||||||
|
<td><span><%= total_qty%></span></td>
|
||||||
|
<td><%= t("views.right_panel.detail.net_amount") %></td>
|
||||||
|
<td><span><%= grand_total%></span></td>
|
||||||
|
</tr>
|
||||||
|
<% end %>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td colspan="5"> </td>
|
||||||
|
<td><%= t("views.right_panel.detail.foc_item") %> <%= t("views.right_panel.detail.amount") %></td>
|
||||||
|
<td><span><%= total_item_foc %></span></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="5"> </td>
|
||||||
|
<td><%= t("views.right_panel.detail.item_discount") %> <%= t("views.right_panel.detail.amount") %></td>
|
||||||
|
<td><span><%= total_item_dis %></span></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="5"> </td>
|
||||||
|
<td><%= t("views.right_panel.detail.foc_sales") %></td>
|
||||||
|
<td><span><%= @foc_data %></span></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td colspan="5"> </td>
|
||||||
|
<td><%= t("views.right_panel.detail.discount") %> <%= t("views.right_panel.detail.amount") %></td>
|
||||||
|
<td><span><%= @discount_data %></span></td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -373,6 +373,7 @@ scope "(:locale)", locale: /en|mm/ do
|
|||||||
resources :commission, :only => [:index, :show]
|
resources :commission, :only => [:index, :show]
|
||||||
resources :stock_check, :only => [:index, :show]
|
resources :stock_check, :only => [:index, :show]
|
||||||
resources :payment_method
|
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"
|
get "receipt_no/get_shift_by_date", to: "receipt_no#get_shift_by_date", as: "get_shift_by_date"
|
||||||
end
|
end
|
||||||
|
|||||||
5
spec/controllers/reports/product_sale_controller_spec.rb
Normal file
5
spec/controllers/reports/product_sale_controller_spec.rb
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
require 'rails_helper'
|
||||||
|
|
||||||
|
RSpec.describe Reports::ProductSaleController, type: :controller do
|
||||||
|
|
||||||
|
end
|
||||||
15
spec/helpers/reports/product_sale_helper_spec.rb
Normal file
15
spec/helpers/reports/product_sale_helper_spec.rb
Normal file
@@ -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
|
||||||
Reference in New Issue
Block a user