diff --git a/README.md b/README.md index 63ba995a..981a0335 100755 --- a/README.md +++ b/README.md @@ -287,6 +287,9 @@ settings/lookups => {type:show_total_before_tax, name:Show Total Before Tax, val For Using Staff Meal settings/lookups => { type:customer_type, name: Staff, value:Staff } +For Membership Type +settings/lookups => { type:membership_type, name: Timecity staff, value:8 } + - ToDo list 1. Migration diff --git a/app/controllers/reports/customer_controller.rb b/app/controllers/reports/customer_controller.rb new file mode 100644 index 00000000..b623d1e0 --- /dev/null +++ b/app/controllers/reports/customer_controller.rb @@ -0,0 +1,58 @@ +class Reports::CustomerController < BaseReportController + authorize_resource :class => false + def index + @membership_type = Lookup.where(lookup_type: 'membership_type') + from, to = get_date_range_from_params + customer_filter = params[:customer] + + @shift_sale_range = '' + + @shift = '' + if params[:shift_name].to_i != 0 + + @shift_sale_range = Sale.get_by_shift_sale_by_item(from,to,Sale::SALE_STATUS_COMPLETED) + + @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 + if @shift_sale.shift_closed_at.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 + end + + @lookup = Lookup.find_by_lookup_type('reprint_receipt') + if @lookup.nil? + @lookup = Lookup.create_reprint_receipt_lookup + end + if params[:membership_type] == "0" + membership_type = '' + else + membership_type = params[:membership_type] + end + @sale_data = Sale.get_shift_sales_by_customer(@shift_sale_range, @shift, from, to, membership_type, customer_filter) + @sale_taxes = Sale.get_separate_tax(@shift_sale_range, @shift, from, to, nil) + @tax_profiles = TaxProfile.group('name').order('order_by asc') #.limit(2) + + @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 + + end diff --git a/app/models/sale.rb b/app/models/sale.rb index d0b9c90a..247ef00c 100644 --- a/app/models/sale.rb +++ b/app/models/sale.rb @@ -1214,6 +1214,36 @@ def self.get_shift_sales_by_receipt_no(shift_sale_range, shift, from, to, paymen return query end +def self.get_shift_sales_by_customer(shift_sale_range, shift, from, to, membership_type, customer_filter) + ## => left join -> show all sales although no orders + query = Sale.includes(:sale_items).select("sales.*, sale_payments.*") + .select("customers.customer_id, customers.name as customer_name,customers.membership_type as membership_type, dining_facilities.name, dining_facilities.type") + .joins("INNER JOIN sale_payments ON sale_payments.sale_id = sales.sale_id") + .joins("INNER JOIN bookings ON bookings.sale_id = sales.sale_id") + .joins("LEFT JOIN dining_facilities ON dining_facilities.id = bookings.dining_facility_id") + .completed.where.not(total_amount: 0) + .group("sales.sale_id") + + if customer_filter.present? + query = query.joins(sanitize_sql_array(["INNER JOIN customers ON customers.customer_id = sales.customer_id AND " + + "customers.name LIKE :filter", filter: "%#{customer_filter}%"])) + else + query = query.joins(:customer) + end + if !membership_type.blank? + query = query.where("customers.membership_type = (?)", membership_type) + end + + if shift.present? + query = query.where("sales.shift_sale_id in (?)", shift.to_a) + elsif shift_sale_range.present? + query = query.where("sales.shift_sale_id in (?)", shift_sale_range.to_a) + else + query = query.where("sales.receipt_date between ? and ?", from, to) + end + return query.group_by(&:membership_type) +end + def self.get_shift_sales_by_receipt_no_detail(shift_sale_range, shift, from, to, payment_type, customer_filter) ## => left join -> show all sales although no orders puts customer_filter diff --git a/app/views/layouts/_left_sidebar.html.erb b/app/views/layouts/_left_sidebar.html.erb index 4ca2f1ad..78e4c06a 100644 --- a/app/views/layouts/_left_sidebar.html.erb +++ b/app/views/layouts/_left_sidebar.html.erb @@ -324,6 +324,9 @@
| <%= 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.detail.dining") %> | +<%= t("views.right_panel.detail.receipt_no") %> | +<%= t :customer %> | +<%= t :cashier %> | +<%= 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 %> +<%= t("views.right_panel.detail.grand_total") %> | +<%= t("views.right_panel.detail.rnd_adj_sh") %> | +<%= t("views.right_panel.detail.grand_total") %> + + <%= t("views.right_panel.detail.rnd_adj_sh") %> + |
+ ||||||||||
| Group Type : Normal | + <%else%> +Group Type : <%= Lookup.where(:lookup_type=>'membership_type', :value=>member_group[0]).last.name %> | + <%end%> +||||||||||||||||||
| + <%if result.type %> + <%= result.type %> - <%= result.name %> + <% else %> + - + <% end %> + | +<%= result.receipt_no rescue '-' %> | +<%= result.customer_name rescue '-' %> | +<%= result.cashier_name rescue '-' %> | +<%= number_format(result.total_amount, precision: precision.to_i, delimiter: delimiter) %> | +<%= number_format(result.total_discount, precision: precision.to_i, delimiter: delimiter) rescue '0' %> | + <% @tax_profiles.each do |tax| %> + <%tax_value=0%> + <% if sale_tax = result.sale_taxes.find { |sale_tax| sale_tax.tax_name == tax.name } %> + <%tax_value=sale_tax.tax_payable_amount%> +<%= number_format(sale_tax.tax_payable_amount, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <% else %> +<%= number_format(0, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <% end %> + <%total_tax << { + tax.name => tax_value + }%> + <% end %> +<%= number_format(result.grand_total - result.rounding_adjustment, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +<%= number_format(result.rounding_adjustment.to_f, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +<%= number_format(result.grand_total, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +|||||||||
| + | <%= number_format(total_sum, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +<%= number_format(discount_amt, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <% @tax_profiles.each do |tax| %> + <%if total_tax.has_key?(tax.name)%> +<%= number_format(total_tax[tax.name], precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <%end%> + <% end %> +<%= number_format(old_grand_total.to_f, precision: precision.to_i, delimiter: delimiter) rescue '0' %> | +<%= number_format(rounding_adj.to_f, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +<%= number_format(grand_total.to_f, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +|||||||||||||
| + | |||||||||||||||||||
| + | <%= 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 %> +<%= t("views.right_panel.detail.grand_total") %> | +<%= t("views.right_panel.detail.rnd_adj_sh") %> | +<%= t("views.right_panel.detail.grand_total") %> + + <%= t("views.right_panel.detail.rnd_adj_sh") %> + |
+ |||||||||||||
| + | <%= number_format(t_total_sum, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +<%= number_format(t_discount_amt, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <% @tax_profiles.each do |tax| %> + <% if sale_tax = @sale_taxes.find { |sale_tax| sale_tax.tax_name == tax.name } %> +<%= number_format(sale_tax.st_amount, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <% else %> +<%= number_format(0, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <% end %> + <% end %> +<%= number_format(t_old_grand_total.to_f, precision: precision.to_i, delimiter: delimiter) rescue '0' %> | +<%= number_format(t_rounding_adj.to_f, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +<%= number_format(t_grand_total.to_f, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +||||||||||||
| <%= 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.detail.dining") %> | +<%= t("views.right_panel.detail.receipt_no") %> | +<%= t :customer %> | +<%= t :cashier %> | +<%= 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 %> + +<%= t("views.right_panel.detail.grand_total") %> | +<%= t("views.right_panel.detail.rnd_adj_sh") %> | +<%= t("views.right_panel.detail.grand_total") %> + + <%= t("views.right_panel.detail.rnd_adj_sh") %> + |
+ ||||||||||
| Group Type : Normal | + <%else%> +Group Type : <%= Lookup.where(:lookup_type=>'membership_type', :value=>member_group[0]).last.name %> | + <%end%> +||||||||||||||||||
| + <%if result.type %> + <%= result.type %> - <%= result.name %> + <% else %> + - + <% end %> + | +<%= result.receipt_no rescue '-' %> | +<%= result.customer_name rescue '-' %> | +<%= result.cashier_name rescue '-' %> | +<%= number_format(result.total_amount, precision: precision.to_i, delimiter: delimiter) %> | +<%= number_format(result.total_discount, precision: precision.to_i, delimiter: delimiter) rescue '0' %> | + <% @tax_profiles.each do |tax| %> + <%tax_value=0%> + <% if sale_tax = result.sale_taxes.find { |sale_tax| sale_tax.tax_name == tax.name } %> + <%tax_value=sale_tax.tax_payable_amount%> +<%= number_format(sale_tax.tax_payable_amount, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <% else %> +<%= number_format(0, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <% end %> + <%total_tax << { + tax.name => tax_value + }%> + <% end %> +<%= number_format(result.grand_total - result.rounding_adjustment, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +<%= number_format(result.rounding_adjustment.to_f, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +<%= number_format(result.grand_total, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +|||||||||
| + | <%= number_format(total_sum, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +<%= number_format(discount_amt, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <% @tax_profiles.each do |tax| %> + <%if total_tax.has_key?(tax.name)%> +<%= number_format(total_tax[tax.name], precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <%end%> + <% end %> +<%= number_format(old_grand_total.to_f, precision: precision.to_i, delimiter: delimiter) rescue '0' %> | +<%= number_format(rounding_adj.to_f, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +<%= number_format(grand_total.to_f, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +|||||||||||||
| + | |||||||||||||||||||
| + | <%= 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 %> +<%= t("views.right_panel.detail.grand_total") %> | +<%= t("views.right_panel.detail.rnd_adj_sh") %> | +<%= t("views.right_panel.detail.grand_total") %> + + <%= t("views.right_panel.detail.rnd_adj_sh") %> + |
+ |||||||||||||
| + | <%= number_format(t_total_sum, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +<%= number_format(t_discount_amt, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <% @tax_profiles.each do |tax| %> + <% if sale_tax = @sale_taxes.find { |sale_tax| sale_tax.tax_name == tax.name } %> +<%= number_format(sale_tax.st_amount, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <% else %> +<%= number_format(0, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | + <% end %> + <% end %> +<%= number_format(t_old_grand_total.to_f, precision: precision.to_i, delimiter: delimiter) rescue '0' %> | +<%= number_format(t_rounding_adj.to_f, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +<%= number_format(t_grand_total.to_f, precision: precision.to_i, delimiter: delimiter) rescue '-' %> | +||||||||||||