class Sale < ApplicationRecord self.primary_key = "sale_id" #primary key - need to be unique generated for multiple shops before_create :generate_custom_id before_create :generate_receipt_no belongs_to :cashier, :optional => true belongs_to :customer, :optional => true belongs_to :employees has_many :sale_items has_many :sale_discount_items has_many :sale_discounts has_many :sale_taxes has_many :sale_payments has_many :sale_orders has_many :bookings has_many :product_commissions 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}'") } REPORT_TYPE = { "daily" => 0, "monthly" => 1, "yearly" => 2 } SALE_STATUS_OUTSTANDING = "outstanding" SALE_STATUS_COMPLETED = "completed" def self.sync_sale_records(sales) if !sales.nil? sales.each do |s| sale = Sale.find_by_sale_id(s['sale_id']) # unless Sale.exists?(s['sale_id']) if sale.nil? sale = Sale.new end sale.sale_id = s['sale_id'] sale.cashier_id = s['cashier_id'] sale.cashier_name = s['cashier_name'] sale.requested_by = s['requested_by'] sale.requested_at = s['requested_at'] sale.receipt_no = s['receipt_no'] sale.receipt_date = s['receipt_date'] sale.customer_id = s['customer_id'] sale.payment_status = s['payment_status'] sale.sale_status = s['sale_status'] sale.total_amount = s['total_amount'] sale.discount_type = s['discount_type'] sale.total_tax = s['total_tax'] sale.total_discount = s['total_discount'] sale.tax_type = s['tax_type'] sale.grand_total = s['grand_total'] sale.rounding_adjustment = s['rounding_adjustment'] sale.amount_received = s['amount_received'] sale.amount_changed = s['amount_changed'] sale.shift_sale_id = s['shift_sale_id'] sale.old_grand_total = s['old_grand_total'] sale.rebate_status = s['rebate_status'] sale.equal_persons = s['equal_persons'] sale.save end puts '........ Sale data sync completed .......' end end def generate_invoice_from_booking(booking_id, requested_by, cashier, order_source = nil, current_checkin_induties_count) booking = Booking.find(booking_id) status = false Rails.logger.debug "Booking -> " + booking.id.to_s if (booking) Rails.logger.debug "Booking -> Booking Order Count -> " + booking.booking_orders.count.to_s #get all order attached to this booking and combine into 1 invoice booking.booking_orders.each do |order| if booking.sale_id status, sale_id = generate_invoice_from_order(order.order_id, nil, booking, requested_by, cashier, order_source) else status, sale_id = generate_invoice_from_order(order.order_id, booking.sale_id, booking, requested_by, cashier, order_source) end booking.sale_id = sale_id end order = booking.booking_orders.take.order link_order_sale(order.id) # dining charges charges = DiningCharge.where('dining_facility_id=?',booking.dining_facility_id).take if !charges.nil? block_count, diningprice = DiningCharge.amount_calculate(charges, booking.checkin_at, booking.checkout_at) if charges.charge_type =='hr' dining_time = booking.checkin_at.strftime('%H:%M %p').to_s + " - " + booking.checkout_at.strftime('%H:%M %p').to_s else dining_time = booking.checkin_at.strftime('%B %d, %H:%M %p').to_s + " - " + booking.checkout_at.strftime('%B %d, %H:%M %p').to_s end later_time = booking.checkout_at early_time = booking.checkin_at distance_in_minutes = ((later_time - early_time)/60.0).round basic_pay_amount =0 name ="" if current_checkin_induties_count != "0" basic_pay = Commission.where('commission_type=?','Basic Pay') basic_pay.each do |pay| basic_pay_amount =pay.amount name =pay.name end induties_pay_amount = (current_checkin_induties_count.to_i * (distance_in_minutes / 60.0).to_f * basic_pay_amount).to_i create_saleitem_indutycharges(charges, current_checkin_induties_count.to_i, induties_pay_amount, booking.dining_facility.name, dining_time, order_source, basic_pay_amount) end create_saleitem_diningcharges(charges, block_count, diningprice, booking.dining_facility.name, dining_time, order_source) end return status, sale_id end end def generate_invoice_from_order (order_id, sale_id, booking, requested_by, cashier = nil, order_source = nil) taxable = true #if sale_id is exsit and validate #add order to that invoice if (sale_id) self.find(sale_id) end Rails.logger.debug "Does it have Existing Sale -> [#{self.id.to_s}] - Status [#{self.sale_status}]" if self.sale_status == "void" return false, "Invoice is void. Cannot be edited" else #if this is new sale generate_receipt_no # generate_receipt_no order = Order.find(order_id) #Default Tax - Values self.tax_type = "exclusive" # current cashier login open_cashier = Employee.where("role = 'cashier' AND token_session <> ''") current_shift = ShiftSale.current_shift # shift with terminal zone # set cashier if order_source.downcase == "emenu" if !booking.dining_facility_id.nil? table = DiningFacility.find(booking.dining_facility_id) cashier_zone = CashierTerminalByZone.find_by_zone_id(table.zone_id) shift = ShiftSale.where("shift_started_at is not null and shift_closed_at is null and cashier_terminal_id = #{cashier_zone.cashier_terminal_id}").first #for multiple zone with terminal if shift.nil? multiple_zone = CashierTerminalByZone.where("zone_id = #{table.zone_id}") multiple_zone.each do |zone| shift = ShiftSale.where("shift_started_at is not null and shift_closed_at is null and cashier_terminal_id = #{zone.cashier_terminal_id}").first if !shift.nil? then break end end end end else shift = ShiftSale.current_open_shift(cashier.id) end # set cashier if shift != nil #if current login employee open shift self.cashier_id = cashier.id self.cashier_name = cashier.name self.shift_sale_id = shift.id else if open_cashier.count>0 # if we have two open cashier # table and terminal in multiple shift self.cashier_id = open_cashier[0].id self.cashier_name = open_cashier[0].name shift_id = ShiftSale.current_open_shift(open_cashier[0].id) if shift_id self.shift_sale_id = shift_id.id else self.shift_sale_id = current_shift.id end else self.cashier_id = current_shift.employee_id self.cashier_name = Employee.find(current_shift.employee_id).name self.shift_sale_id = current_shift.id end end # set waiter self.requested_by = requested_by.name self.requested_at = DateTime.now.utc.getlocal Rails.logger.debug "Order -> #{order.id} | order_status -> #{order.status}" if order self.customer_id = order.customer_id Rails.logger.debug "Order -> #{order.id} | Items Count -> #{order.order_items.count}" order.order_items.each do |item| add_item(item) if !item.set_menu_items.nil? add_sub_item(item.set_menu_items) end end link_order_sale(order.id) end self.save! #compute sales summary if order_source.nil? order_source = order.source end compute(order_source) #Update the order items that is billed order.update_items_status_to_billed(nil) order.status = "billed" order.save booking.sale_id = self.id if !booking.checkout_at.nil? if booking.checkout_at.utc < Time.now.utc booking.checkout_at = Time.now.utc.getlocal end else booking.checkout_at = Time.now.utc.getlocal end booking.checkout_by = requested_by.name booking.save # InventoryJob.perform_now(self.id) saleObj = Sale.find(self.id) InventoryDefinition.calculate_product_count(saleObj) return true, self.id end return false, nil end #fOR Quick Service pay and create def self.request_bill(order,current_user,current_login_employee) @sale = Sale.new sale_order=SaleOrder.new if !ShiftSale.current_shift.nil? order_id = order.order_id # order_id bk_order = BookingOrder.find_by_order_id(order_id) check_booking = Booking.find_by_booking_id(bk_order.booking_id) if check_booking.sale_id.nil? # Create Sale if it doesn't exist # puts "current_login_employee" # puts current_login_employee.name @status, @sale_id = @sale.generate_invoice_from_booking(check_booking.id,current_login_employee,current_user,order.source) @sale_data = Sale.find_by_sale_id(@sale_id) @sale_items = SaleItem.where("sale_id=?",@sale_id) else @sale_data = Sale.find_by_sale_id(check_booking.sale_id) @sale_items = SaleItem.where("sale_id=?",@sale_data.sale_id) end # Bind shift sale id to sale # @sale_data.shift_sale_id = shift.id # @sale_data.save # Promotion Activation Promotion.promo_activate(@sale) @status = true return @status, @sale else @status = false @message = "No Current Open Shift for This Employee" end end #This is when spilt bill is request - then we cannot link order to invoice #Cos there will be multiple orders - and items are spilt from there. #Unless order is spilt by then it is possible. def generate_invoice_by_items (items, requested_by) taxable = true self.requested_by = requested_by self.requested_at = DateTime.now.utc.getlocal items.each do |item| add_item(item) if !item.set_menu_items.nil? add_sub_item(item.set_menu_items) end #this will result in multiple orders belonging in multiple invoices - because of spilt invoices. link_order_sale(item.order_id, taxable) end #Update item status as billed order.update_items_status_to_billed(items) status = self.save! return status, self.id end def add_item (item) #check if the item is on promotion menu_category = MenuCategory.get_menu_category(item.item_code) #get menu category for menu items #save sale_audit sale_item = SaleItem.new #pull if !menu_category.nil? sale_item.menu_category_code = menu_category.code sale_item.menu_category_name = menu_category.name else sale_item.menu_category_name = "Product" end sale_item.product_code = item.item_code sale_item.item_instance_code = item.item_instance_code sale_item.product_name = item.item_name sale_item.product_alt_name = item.alt_name sale_item.account_id = item.account_id sale_item.status = item.remark sale_item.qty = item.qty sale_item.unit_price = item.price sale_item.taxable_price = sale_item.qty * sale_item.unit_price sale_item.is_taxable = item.taxable sale_item.price = sale_item.qty * sale_item.unit_price self.sale_items << sale_item end def add_sub_item (item) #check if the item is on promotion JSON.parse(item).each do |item| #save sale item sale_item = SaleItem.new #pull instance = MenuItemInstance.find_by_item_instance_code(item["item_instance_code"]) menu_item = instance.menu_item menu_category = MenuCategory.get_menu_category(menu_item.item_code) #get menu category for menu items sale_item.menu_category_code = menu_category.code ? menu_category.code : nil sale_item.menu_category_name = menu_category.name sale_item.product_code = menu_item.item_code sale_item.item_instance_code = item["item_instance_code"] sale_item.product_name = instance.item_instance_name sale_item.product_alt_name = menu_item.alt_name sale_item.account_id = menu_item.account_id sale_item.status = nil sale_item.qty = item["quantity"] sale_item.unit_price = item["price"] sale_item.taxable_price = sale_item.qty * sale_item.unit_price sale_item.is_taxable = menu_item.taxable sale_item.price = sale_item.qty * sale_item.unit_price self.sale_items << sale_item end end def create_saleitem_diningcharges(chargeObj, block_count, diningprice, dining_name, dining_time, order_source = nil) sale_item = SaleItem.new sale_item.menu_category_code = "DingingCharge" sale_item.menu_category_name = "Dining Charge" sale_item.product_code = chargeObj.item_code sale_item.product_name = dining_name.to_s + " ( " + dining_time.to_s + " )" sale_item.account_id = 0 sale_item.product_alt_name = "-" sale_item.qty = block_count sale_item.unit_price = chargeObj.unit_price sale_item.taxable_price = diningprice sale_item.is_taxable = chargeObj.taxable sale_item.sale_id = self.id sale_item.price = diningprice sale_item.save # Re-calc sale = Sale.find(self.id) self.compute_by_sale_items(self.id, sale.sale_items, self.total_discount, nil, order_source) end def create_saleitem_indutycharges(chargeObj, current_checkin_induties_count, induties_pay_amount, dining_name, dining_time, order_source = nil, basic_pay_amount) sale_item = SaleItem.new sale_item.menu_category_code = "IndutyCharge" sale_item.menu_category_name = "Induty Charge" sale_item.product_code = "" sale_item.product_name ='Vocalist' + " ( " + dining_time.to_s + " )" sale_item.account_id = 0 sale_item.product_alt_name = "-" sale_item.qty = current_checkin_induties_count sale_item.unit_price = basic_pay_amount sale_item.taxable_price = induties_pay_amount sale_item.is_taxable = chargeObj.taxable sale_item.sale_id = self.id sale_item.price = induties_pay_amount sale_item.save # Re-calc sale = Sale.find(self.id) self.compute_by_sale_items(self.id, sale.sale_items, self.total_discount, nil, order_source) end def update_item (item) #save sale_audit end def apply_item_discount (item_code, discount_type, discount_amount) end def apply_discount (discount_type, discount_code) #save action to sale_audit end def void_sales (void_by, reason, approval_code, request_by) #save sale_audit self.sale_status = "void" end #compute - invoice total def compute(order_source = nil, tax_type = nil) sales_items = self.sale_items #Computation Fields subtotal_price = 0 total_taxable = 0 rounding_adjustment = 0 sales_items.each do |item| #compute each item and added to total subtotal_price = subtotal_price + item.price # only calc tax when true if(item.is_taxable) total_taxable = total_taxable + item.taxable_price end # total_taxable = total_taxable + (item.taxable_price * item.qty) end apply_tax(total_taxable, order_source, tax_type) self.total_amount = subtotal_price self.total_discount = total_discount self.grand_total = (self.total_amount - self.total_discount) + self.total_tax #compute rounding adjustment adjust_rounding self.save! end #compute - invoice total def compute_by_sale_items(sale_id, sale_itemss, total_discount,discount_type=nil,order_source=nil,tax_type=nil) sale = Sale.find(sale_id) sales_items = sale_itemss #Computation Fields subtotal_price = 0 total_taxable = 0 rounding_adjustment = 0 sales_items.each do |item| #compute each item and added to total subtotal_price = subtotal_price + item.price # check for item is taxable and calculate if item.is_taxable total_taxable = total_taxable + item.taxable_price end end compute_tax(sale, total_taxable, total_discount, order_source, tax_type) sale.total_amount = subtotal_price sale.total_discount = total_discount sale.grand_total = (sale.total_amount - sale.total_discount) + sale.total_tax if discount_type == "member_discount" sale.discount_type = discount_type end #compute rounding adjustment # adjust_rounding sale.rounding_adjustment = compute_adjust_rounding(sale.grand_total) sale.save! end # No Use too many wrong def compute_without_void(order_source = nil) sales_items = self.sale_items #Computation Fields subtotal_price = 0 total_taxable = 0 rounding_adjustment = 0 sales_items.each do |item| if item.status != 'void' && item.status != 'foc' #compute each item and added to total subtotal_price = subtotal_price + item.price # only calc tax when true if(item.is_taxable) total_taxable = total_taxable + item.taxable_price end end end apply_tax(total_taxable, order_source) self.total_amount = subtotal_price self.total_discount = total_discount self.grand_total = (self.total_amount - self.total_discount) + self.total_tax #compute rounding adjustment adjust_rounding self.save! end # Tax Re-Calculte def compute_tax(sale, total_taxable, total_discount = 0, order_source = nil, tax_type=nil) shop = Shop.first #if tax is not apply create new record # SaleTax.where("sale_id='#{sale.sale_id}'").find_each do |existing_tax| # #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 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 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 # 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 end end end sale.tax_type = tax_incl_exec sale.total_tax = total_tax_amount end # Tax Calculate def apply_tax(total_taxable, order_source = nil, tax_type = nil) shop = Shop.first #if tax is not apply create new record # SaleTax.where("sale_id='#{self.sale_id}'").find_each do |existing_tax| # #delete existing and create new # 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 total_tax_amount = 0 tax_incl_exec = "exclusive" #tax_profile - list by order_by # tax_profiles = TaxProfile.all.order("order_by asc") if order_source.to_s == "emenu" order_source = "cashier" end # 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) 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 # 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 end end self.tax_type = tax_incl_exec self.total_tax = total_tax_amount end def product_get_unit_price(item_code) menu_item_hash =MenuItem.search_by_item_code(item_code) if (menu_instance_code) return menu_ item_hash[:item_instance_code], menu_item_hash[:price] end return nil,nil end def link_order_sale(order_id) #create if it doesn't exist saleOrder = SaleOrder.where("sale_id=? and order_id=?", self.id, order_id).take if saleOrder.nil? sale_order = SaleOrder.new sale = sale_order.create_sale_order(self.id, order_id) end # if (SaleOrder.where("sale_id = #{self.id} and order_id=#{order_id}").nil?) # SaleOrder.create(:sale_id => self.id, :order_id => order_id) # end #dosomrting here #puts Time.now.format(":short") end def adjust_rounding 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 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 shop_details = Shop.first #Date-Shift- if self.receipt_no.nil? prefix = DateTime.now().utc #self.receipt_no = prefix.to_s + "/" + self.shit_id.to_s + "/" + SeedGenerator.new_receipt_no().to_s new_receipt_no = SeedGenerator.new_receipt_no().to_s if !shop_details.nil? if !shop_details.shop_code.nil? self.receipt_no = shop_details.shop_code + "-" + prefix.strftime("%Y%m%d") + "-" + new_receipt_no else self.receipt_no = prefix.strftime("%Y%m%d") + "-" + new_receipt_no end else self.receipt_no = prefix.strftime("%Y%m%d") + "-" + new_receipt_no end self.receipt_date = prefix Rails.logger.debug "Receipt No #{self.receipt_no} | Date #{ self.receipt_date.to_s}" end end def self.search(filter,from,to,shift) if filter.blank? keyword = '' else keyword = "receipt_no LIKE ? OR cashier_name LIKE ? OR sale_status ='#{filter}'","%#{filter}%","%#{filter}%" end if from.present? && to.present? if shift.blank? sale = Sale.where("DATE_FORMAT(receipt_date,'%Y-%m-%d') >= ?" + " AND DATE_FORMAT(receipt_date,'%Y-%m-%d') <= ? and NOT sale_status = 'new' ", from,to) else sale = Sale.where("DATE_FORMAT(receipt_date,'%Y-%m-%d') >= ?" + " AND DATE_FORMAT(receipt_date,'%Y-%m-%d') <= ? and NOT sale_status = 'new' and shift_sale_id = '#{shift.id}'", from,to) end query = sale.where(keyword) else if shift.blank? where("receipt_no LIKE ? OR cashier_name LIKE ? OR sale_status ='#{filter}'","%#{filter}%","%#{filter}%") else where("receipt_no LIKE ? OR cashier_name LIKE ? OR sale_status ='#{filter}' and shift_sale_id = ?","%#{filter}%","%#{filter}%",shift.id) end end .order("sale_id DESC") end def self.search_credit_sales(customer,filter,from,to,order_source="") if filter.blank? keyword = '' else keyword = "and sales.receipt_no LIKE ? OR sales.cashier_name LIKE ? OR sales.sale_status ='#{filter}'","%#{filter}%","%#{filter}%" end if customer.blank? custo = '' else custo = "and sales.customer_id = '#{customer}'" end order_source_query = "(select orders.source FROM orders JOIN sale_orders so ON so.order_id=orders.order_id WHERE so.sale_id=sales.sale_id GROUP BY so.sale_id)" if order_source.blank? source = "" else if order_source == "cashier" source = "and #{order_source_query}='cashier' or #{order_source_query}='emenu'" else source = "and #{order_source_query}='#{order_source}'" end end if from.present? && to.present? sale = Sale.select("sales.*,#{order_source_query} as source").joins("JOIN sale_payments sp on sp.sale_id = sales.sale_id") .joins(" JOIN bookings ON bookings.sale_id=sales.sale_id") .joins(" JOIN booking_orders ON booking_orders.booking_id=bookings.booking_id") .joins(" JOIN orders ON orders.order_id=booking_orders.order_id") .where("DATE_FORMAT(receipt_date,'%d-%m-%Y') >= ?" + " AND DATE_FORMAT(receipt_date,'%d-%m-%Y') <= ? and (CASE WHEN (sales.grand_total + sales.amount_changed)=(select SUM(sale_payments.payment_amount) FROM sale_payments WHERE sale_payments.sale_id=sales.sale_id AND sale_payments.payment_method!='creditnote') THEN NULL ELSE payment_method='creditnote' END) #{keyword} #{custo} #{source}", from,to) else sale = Sale.select("sales.*,#{order_source_query} as source").joins(" JOIN sale_payments sp on sp.sale_id = sales.sale_id") .joins(" JOIN bookings ON bookings.sale_id=sales.sale_id") .joins(" JOIN booking_orders ON booking_orders.booking_id=bookings.booking_id") .joins(" JOIN orders ON orders.order_id=booking_orders.order_id") .where("(CASE WHEN (sales.grand_total + sales.amount_changed)=(select SUM(sale_payments.payment_amount) FROM sale_payments WHERE sale_payments.sale_id=sales.sale_id AND sale_payments.payment_method!='creditnote') THEN NULL ELSE payment_method='creditnote' END) #{keyword} #{custo} #{source}") end end def self.get_rounding_adjustment(num) ## 0 -- 25 -- 50 -- 75 -- 100 # 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 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) FROM sale_payments INNER JOIN sale_audits sa ON SUBSTRING_INDEX(sa.remark,'||',1)=sale_payments.sale_payment_id INNER JOIN sales s ON s.sale_id=sa.sale_id WHERE s.sale_status='completed' AND DATE_FORMAT(CONVERT_TZ(s.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') = DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d')" payments_total = Sale.select("CAST((CONVERT_TZ(sales.receipt_date,'+00:00','+06:30')) AS DATE) as sale_date, SUM(case when (sale_payments.payment_method='mpu') then sale_payments.payment_amount else 0 end) as mpu_amount, SUM(case when (sale_payments.payment_method='master') then sale_payments.payment_amount else 0 end) as master_amount, SUM(case when (sale_payments.payment_method='visa') then sale_payments.payment_amount else 0 end) as visa_amount, SUM(case when (sale_payments.payment_method='jcb') then sale_payments.payment_amount else 0 end) as jcb_amount, SUM(case when (sale_payments.payment_method='paypar') then sale_payments.payment_amount else 0 end) as paypar_amount, SUM(case when (sale_payments.payment_method='unionpay') then sale_payments.payment_amount else 0 end) as unionpay_amount, SUM(case when (sale_payments.payment_method='alipay') then sale_payments.payment_amount else 0 end) as alipay_amount, SUM(case when (sale_payments.payment_method='paymal') then sale_payments.payment_amount else 0 end) as paymal_amount, SUM(case when (sale_payments.payment_method='dinga') then sale_payments.payment_amount else 0 end) as dinga_amount, SUM(case when (sale_payments.payment_method='JunctionPay') then sale_payments.payment_amount else 0 end) as junctionpay_amount, SUM(case when (sale_payments.payment_method='cash') then sale_payments.payment_amount else 0 end) as cash_amount, (CASE WHEN (SUM(case when (sale_payments.payment_method='creditnote') then sale_payments.payment_amount else 0 end)) > 0 THEN (SUM(case when (sale_payments.payment_method='creditnote') then sale_payments.payment_amount else 0 end) - (#{sub_query})) ELSE 0 END) as credit_amount, SUM(case when (sale_payments.payment_method='giftvoucher') then sale_payments.payment_amount else 0 end) as giftvoucher_amount, SUM(case when (sale_payments.payment_method='foc') then sale_payments.payment_amount else 0 end) as foc_amount") .joins(" join sale_payments on sale_payments.sale_id = sales.sale_id") .where("sale_status = ? AND sales.receipt_date between ? and ? ", 'completed', from, to) .group("DATE_FORMAT((CONVERT_TZ(sales.receipt_date,'+00:00','+06:30')),'%Y-%m-%d')") daily_total = Array.new payments_total.each do |pay| sale_date = pay.sale_date diff_time = payments_total.first.sale_date.beginning_of_day.utc - from diff = diff_time % 86400 from_date = sale_date.beginning_of_day.utc - diff to_date = sale_date.end_of_day.utc - diff total_sale = Sale.select("IFNULL(SUM(case when (sale_status='completed') then grand_total else 0 end),0) as grand_total, IFNULL(SUM(case when (sale_status='completed') then old_grand_total else 0 end),0) as old_grand_total, IFNULL(SUM(case when (sale_status='completed') then total_discount else 0 end),0) as total_discount, IFNULL(SUM(case when (sale_status='completed') then amount_changed else 0 end),0) as total_change_amount, IFNULL(SUM(case when (sale_status='void') then grand_total else 0 end),0) as void_amount, IFNULL(SUM(case when (sale_status='completed') then rounding_adjustment else 0 end),0) as rounding_adj") .where("(sale_status = ? OR sale_status = ?) AND receipt_date between ? and ? AND total_amount != 0", 'completed', 'void', from_date, to_date) total_sale.each do |sale| grand_total = sale.grand_total old_grand_total = sale.old_grand_total total_discount = sale.total_discount void_amount = sale.void_amount total_change_amount = sale.total_change_amount total = {:sale_date => pay.sale_date, :mpu_amount => pay.mpu_amount, :master_amount => pay.master_amount, :visa_amount => pay.visa_amount, :jcb_amount => pay.jcb_amount, :paypar_amount => pay.paypar_amount, :unionpay_amount => pay.unionpay_amount, :alipay_amount => pay.alipay_amount, :paymal_amount => pay.paymal_amount, :dinga_amount => pay.dinga_amount, :junctionpay_amount => pay.junctionpay_amount, :cash_amount => pay.cash_amount, :credit_amount => pay.credit_amount, :foc_amount => pay.foc_amount, :giftvoucher_amount => pay.giftvoucher_amount, :total_discount => total_discount, :total_change_amount => total_change_amount, :grand_total => grand_total, :old_grand_total => old_grand_total, :void_amount => void_amount, :rounding_adj => sale.rounding_adj} daily_total.push(total) end end return daily_total end def self.get_by_range_by_saleitems(from,to,status,report_type) query = Sale.select(" mi.item_code as code,(SUM(i.qty) * i.unit_price) as grand_total, SUM(i.qty) as total_item," + " i.unit_price as unit_price, i.product_name, sale_items.menu_category_name, sale_items.menu_category_code") .group('i.product_code') .order("sale_items.menu_category_code") query = query.joins("JOIN sale_items i ON i.sale_id = sales.sale_id JOIN employees ea ON ea.id = sales.cashier_id") query = query.where("(receipt_date between ? and ? and sale_status=?) AND i.unit_price <> 0",from,to,status) end def self.get_by_shiftsales(from,to,shift) if !shift.blank? query = ShiftSale.where("shift_sales.id =?",shift.id) else query = ShiftSale.where("(shift_started_at between ? and ? OR shift_closed_at between ? and ? )", from, to, from, to) end shift_sale_data = Hash.new query.each do |shift_sale| foc = 0 foc_data = Sale.select("SUM(sp.payment_amount) as foc_sales") .joins("JOIN sale_payments as sp on sp.sale_id=sales.sale_id") .where("sales.shift_sale_id=? and sp.payment_method='foc'",shift_sale.id) .first() if !foc_data.foc_sales.nil? && foc_data.foc_sales > 0 shift_sale.other_sales -= foc_data.foc_sales foc = foc_data.foc_sales end shift_sale_data[shift_sale.id] = { :cashier_terminal_name => shift_sale.cashier_terminal.name, :employee_name => shift_sale.employee.name, :shift_started_at => shift_sale.shift_started_at, :shift_closed_at => shift_sale.shift_closed_at, :cash_sales => shift_sale.cash_sales, :credit_sales => shift_sale.credit_sales, :other_sales => shift_sale.other_sales.to_f, :foc_sales => foc, :grand_total => shift_sale.grand_total, :shift_id => shift_sale.id } end return shift_sale_data.values end def self.get_by_shift_sale(from,to,status) query = ShiftSale.select("shift_sales.id ,shift_started_at AS opening_date, shift_closed_at As closing_date," + " grand_total AS grand_total, cash_sales AS cash," + "total_taxes AS total_tax,total_discounts As total_discount") .order("shift_sales.id DESC") return query = query.where("shift_sales.shift_started_at >= ?" + " AND shift_sales.shift_closed_at <= ?", from,to) end def self.get_by_shift_sale_by_item(from,to,status) query = ShiftSale.select("shift_sales.id ,shift_started_at AS opening_date, shift_closed_at As closing_date," + " grand_total AS grand_total, cash_sales AS cash," + "total_taxes AS total_tax,total_discounts As total_discount") .order("shift_sales.id DESC") return query = query.where("shift_sales.shift_started_at >= ?" , from) end def self.get_item_query(type) check_product = "i.menu_category_name != 'product'" if type == "revenue" sale_type = "i.qty > 0 and status IS NULL" elsif type == "all" || type.nil? sale_type = "#{check_product}" elsif type == "discount" sale_type = "#{check_product} and i.status = 'Discount'" elsif type == "foc" sale_type = "#{check_product} and i.status = 'foc' and i.item_instance_code IS NOT NULL and i.qty > 0" elsif type == "void" sale_type = "#{check_product} and i.status = 'void' and i.item_instance_code IS NOT NULL and i.qty > 0" elsif type == "other" sale_type = "#{check_product} and i.item_instance_code IS NULL" elsif type == "promotion" sale_type = "#{check_product} and i.status = 'promotion'" end query = Sale.select("acc.title as account_name, 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.status as status_type,i.remark as remark,"+ "i.unit_price,i.price as price,i.product_name as product_name, " + "i.menu_category_name,i.menu_category_code as menu_category_id ") query = query.joins("JOIN sale_items i ON i.sale_id = sales.sale_id" + " JOIN shift_sales sh ON sh.`id` = sales.shift_sale_id") # "JOIN employee_accesses ea ON ea.`employee_id` = sales.cashier_id ") query = query.joins(" JOIN accounts acc ON acc.id = i.account_id") query = query.where("#{sale_type}") query = query.group("acc.title,i.account_id,i.menu_category_code,i.item_instance_code,i.product_name,i.unit_price") .order("acc.title desc, i.account_id desc, i.menu_category_code desc, i.item_instance_code asc, SUM(i.qty) desc, i.unit_price asc") # query = query.order("i.menu_category_name asc, SUM(i.qty) desc") end def self.get_other_charges() query = Sale.select("i.account_id as account_id, " + "SUM(i.qty * i.unit_price) as grand_total,SUM(i.qty) as total_item," + "i.status as status_type,i.remark as remark,"+ " i.unit_price as unit_price,i.product_name as product_name") query = query.joins("JOIN sale_items i ON i.sale_id = sales.sale_id") query = query.where("i.item_instance_code IS NULL AND i.product_code = 'Other Charges'") query = query.group("i.sale_item_id") end def self.get_by_shift_items(shift_sale_range, shift, from, to, status,type,account_type) # date_type_selection = get_sql_function_for_report_type(report_type) if account_type.blank? account_type = '' else account_type = " and acc.title = '#{account_type}'" end query = self.get_item_query(type) discount_query = 0 total_card_amount = 0 total_cash_amount = 0 total_credit_amount = 0 total_foc_amount = 0 total_grand_total = 0 if type.nil? || type == 'all' || type == "other" other_charges = self.get_other_charges() end product = self.get_product_sale() if shift.present? query = query.where("sales.shift_sale_id IN (?) #{account_type} and sale_status='completed'",shift.to_a) if type.nil? || type == 'all' || type == "other" other_charges = other_charges.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift.to_a) end product = product.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift.to_a) discount_query = Sale.where("sales.shift_sale_id in (?) and sale_status= 'completed' ", shift.to_a).sum(:total_discount) change_amount = Sale.where("sales.shift_sale_id in (?) and sale_status= 'completed' ", shift.to_a).sum(:amount_changed) sale_cash = Sale.select("SUM(case when (sale_payments.payment_method ='mpu' or sale_payments.payment_method = 'visa' or sale_payments.payment_method = 'master' or sale_payments.payment_method = 'jcb' or sale_payments.payment_method = 'paypar' or sale_payments.payment_method = 'unionpay' or sale_payments.payment_method = 'alipay' or sale_payments.payment_method = 'paymal' or sale_payments.payment_method = 'dinga' or sale_payments.payment_method = 'JunctionPay' or sale_payments.payment_method = 'giftvoucher') then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") .joins("join sale_payments on sale_payments.sale_id = sales.sale_id") .where("sales.shift_sale_id in (?) and sale_status = 'completed' and sale_payments.payment_amount != 0 ", shift.to_a) sale_cash.each do |s_c| total_cash_amount += s_c.cash_amount.to_f total_card_amount += s_c.card_amount.to_f total_credit_amount += s_c.credit_amount.to_f total_foc_amount += s_c.foc_amount.to_f end 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 (?) #{account_type} and sale_status='completed'",shift_sale_range.to_a) if type.nil? || type == 'all' || type == "other" other_charges = other_charges.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift_sale_range.to_a) end product = product.where("sales.shift_sale_id IN (?) and sale_status='completed'",shift_sale_range.to_a) discount_query = Sale.where("sales.shift_sale_id IN (?) and sale_status ='completed'", shift_sale_range.to_a).sum(:total_discount) change_amount = Sale.where("sales.shift_sale_id IN (?) and sale_status ='completed'", shift_sale_range.to_a).sum(:amount_changed) sale_cash = Sale.select("SUM(case when (sale_payments.payment_method = 'mpu' or sale_payments.payment_method = 'visa' or sale_payments.payment_method = 'master' or sale_payments.payment_method = 'jcb' or sale_payments.payment_method = 'paypar' or sale_payments.payment_method = 'unionpay' or sale_payments.payment_method = 'alipay' sale_payments.payment_method = 'paymal' or sale_payments.payment_method = 'dinga' or sale_payments.payment_method = 'JunctionPay' or sale_payments.payment_method = 'giftvoucher') then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") .joins("join sale_payments on sale_payments.sale_id = sales.sale_id") .where("sales.shift_sale_id in (?) and sale_status = 'completed' and sale_payments.payment_amount != 0 ", shift_sale_range.to_a) sale_cash.each do |s_c| total_cash_amount += s_c.cash_amount.to_f total_card_amount += s_c.card_amount.to_f total_credit_amount += s_c.credit_amount.to_f total_foc_amount += s_c.foc_amount.to_f end 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 ? #{account_type} and sale_status='completed'",from,to) if type.nil? || type == 'all' || type == "other" other_charges = other_charges.where("sales.receipt_date between ? and ? and sale_status='completed'",from,to) end product = product.where("sales.receipt_date between ? and ? and sale_status='completed'",from,to) discount_query = Sale.where("sales.receipt_date between ? and ? and sale_status ='completed'", from,to).sum(:total_discount) change_amount = Sale.where("sales.receipt_date between ? and ? and sale_status ='completed'", from,to).sum(:amount_changed) sale_cash = Sale.select("SUM(case when (sale_payments.payment_method = 'mpu' or sale_payments.payment_method = 'visa' or sale_payments.payment_method = 'master' or sale_payments.payment_method = 'jcb' or sale_payments.payment_method = 'paypar' or sale_payments.payment_method = 'unionpay' or sale_payments.payment_method = 'alipay' or sale_payments.payment_method = 'paymal' or sale_payments.payment_method = 'dinga' or sale_payments.payment_method = 'JunctionPay' or sale_payments.payment_method = 'giftvoucher') then (sale_payments.payment_amount) else 0 end) as card_amount, SUM(case when (sale_payments.payment_method='cash') then (sale_payments.payment_amount) else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='creditnote') then (sale_payments.payment_amount) else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then (sale_payments.payment_amount) else 0 end) as foc_amount") .joins("join sale_payments on sale_payments.sale_id = sales.sale_id") .where("sales.receipt_date between ? and ? and sale_status = 'completed' and sale_payments.payment_amount != 0 ", from,to) sale_cash.each do |s_c| total_cash_amount += s_c.cash_amount.to_f total_card_amount += s_c.card_amount.to_f total_credit_amount += s_c.credit_amount.to_f total_foc_amount += s_c.foc_amount.to_f end total_grand_total = total_cash_amount.to_f + total_card_amount.to_f + total_credit_amount.to_f end return query,other_charges, product, discount_query , total_cash_amount , total_card_amount , total_credit_amount , total_foc_amount , total_grand_total , change_amount end def self.get_product_sale() query = Sale.select("i.account_id as account_id, " + "SUM(i.qty * i.unit_price) as grand_total,SUM(i.qty) as total_item," + "i.status as status_type,"+ " i.unit_price as unit_price,i.product_name as product_name,i.product_code as product_code") query = query.joins("JOIN sale_items i ON i.sale_id = sales.sale_id") .where("LOWER(i.menu_category_name) = 'product'") # query = query.joins("JOIN products p ON p.`item_code` = i.product_code") query = query.group("i.product_code") end #product sale report query def self.get_menu_item_query(order_by) query = MenuItem.unscoped.select("acc.id as account_id, acc.title as account_name, mii.item_instance_code as item_code, " + "(CASE WHEN si.qty IS NOT NULL THEN SUM(si.qty) ELSE 0 END) as total_item," + "(CASE WHEN si.unit_price != mii.price THEN si.unit_price ELSE mii.price END) as unit_price," + "(CASE WHEN si.qty IS NOT NULL THEN (SUM(si.qty) * si.unit_price) ELSE 0 END) as grand_total," + "mii.price as unit_price, (CASE WHEN si.product_name IS NOT NULL THEN si.product_name ELSE CONCAT(menu_items.name,' - ',mii.item_instance_name) END) as product_name, mc.name as" + " menu_category_name,mc.id as menu_category_id, si.status as status_type, si.price as price ") .joins(" LEFT JOIN menu_item_instances mii ON menu_items.id = mii.menu_item_id" + " LEFT JOIN menu_categories mc ON mc.id = menu_items.menu_category_id" + " LEFT JOIN accounts acc ON acc.id = menu_items.account_id" + " LEFT JOIN sale_items si ON si.item_instance_code = mii.item_instance_code" + " LEFT JOIN sales s ON s.sale_id = si.sale_id") .where("(CASE WHEN s.sale_status IS NOT NULL THEN s.sale_status='completed' ELSE 1 END)") .group("mc.id, (CASE WHEN si.product_name IS NOT NULL THEN si.product_name ELSE CONCAT(menu_items.name,' - ',mii.item_instance_name) END)") .order("si.qty #{order_by}, menu_items.menu_category_id #{order_by}") 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? payment_type = '' else payment_type = " and sale_payments.payment_method = '#{payment_type}'" end query = Sale.all.select("sales.*,sale_payments.*,df.name,df.type") .where("sale_status= 'completed' and sale_payments.payment_amount != 0 #{payment_type}") .joins("join sale_payments on sale_payments.sale_id = sales.sale_id") .joins("join bookings on bookings.sale_id = sales.sale_id") .joins("left join dining_facilities df on df.id = bookings.dining_facility_id") .group("sales.sale_id") 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 end def self.get_shift_sales_by_receipt_no_detail(shift_sale_range,shift,from,to,payment_type) ## => left join -> show all sales although no orders if payment_type.blank? payment_type = '' else payment_type = " and sale_payments.payment_method = '#{payment_type}'" end query = Sale.select("sales.*,bookings.dining_facility_id as table_id") .where("sale_status= 'completed' and sale_payments.payment_amount != 0 #{payment_type}") .joins("join sale_payments on sale_payments.sale_id = sales.sale_id") .joins("join bookings on bookings.sale_id = sales.sale_id") .group("sales.sale_id") 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 end def self.get_by_shift_sale_credit_payment(shift_sale_range,shift,from,to,filter,order_source) sub_query = "SELECT (CASE WHEN SUM(payment_amount) > 0 THEN DATE_FORMAT(CONVERT_TZ(sale_payments.created_at,'+00:00','+06:30'),'%d %b %y %h:%i%p') ELSE '-' END) FROM `sale_payments` INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id WHERE sale_audits.sale_id = s.sale_id" sub_query1 = "SELECT (CASE WHEN SUM(payment_amount) > 0 THEN SUM(payment_amount) - (SUM(payment_amount) - (SELECT SUM(payment_amount) FROM sale_payments WHERE payment_method='creditnote' AND sale_id=s.sale_id)) ELSE 0 END) FROM `sale_payments` INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id WHERE sale_audits.sale_id = s.sale_id" sub_query2 = "SELECT (CASE WHEN shift_closed_at IS NOT NULL AND credit_payment > 0 THEN CONCAT(DATE_FORMAT(CONVERT_TZ(shift_started_at,'+00:00','+06:30'),'%d %b %y %h:%i%p'),' - ',DATE_FORMAT(CONVERT_TZ(shift_closed_at,'+00:00','+06:30'),'%d %b %y %h:%i%p')) ELSE '-' END) FROM shift_sales WHERE shift_sales.id = s.shift_sale_id" sub_query3 = "SELECT (CASE WHEN shift_closed_at IS NOT NULL OR shift_closed_at IS NULL AND credit_payment > 0 THEN employees.name ELSE '-' END) FROM shift_sales INNER JOIN employees ON employees.id=shift_sales.employee_id WHERE shift_sales.id = s.shift_sale_id" filter_check = "" if filter == 'paid' filter_check = " AND (SELECT (CASE WHEN SUM(payment_amount) > 0 THEN SUM(payment_amount) ELSE 0 END) FROM `sale_payments` INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id WHERE sale_audits.sale_id = s.sale_id) > 0" elsif filter == 'unpaid' filter_check = " AND (SELECT (CASE WHEN SUM(payment_amount) > 0 THEN SUM(payment_amount) ELSE 0 END) FROM `sale_payments` INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id WHERE sale_audits.sale_id = s.sale_id) = 0" end order_source_query = "(select orders.source FROM orders JOIN sale_orders so ON so.order_id=orders.order_id WHERE so.sale_id=s.sale_id GROUP BY so.sale_id)" if order_source.blank? source = "" else if order_source == "cashier" source = "and #{order_source_query}='cashier' or #{order_source_query}='emenu'" else source = "and #{order_source_query}='#{order_source}'" end end query = SalePayment.select("s.receipt_no, sale_payments.*, SUM(sale_payments.payment_amount) as payment_amount, s.receipt_date as sale_date, #{order_source_query} as order_source, s.cashier_name as cashier_name, (#{sub_query}) as credit_payment_receipt_date, (#{sub_query1}) as credit_payment, (#{sub_query3}) as credit_payment_cashier_name, (#{sub_query2}) as credit_payment_shift_name") .joins("INNER JOIN sales s ON s.sale_id = sale_payments.sale_id") .joins("INNER JOIN shift_sales ss ON ss.id = s.shift_sale_id") if shift.present? query = query.where("sale_payments.payment_method= 'creditnote' and s.sale_status = 'completed' #{filter_check} and s.shift_sale_id in (?) #{source}",shift.to_a) elsif shift_sale_range.present? query = query.where("sale_payments.payment_method='creditnote' and s.sale_status = 'completed' #{filter_check} and s.shift_sale_id in (?) #{source}",shift_sale_range.to_a) else query = query.where("sale_payments.payment_method='creditnote' and s.sale_status = 'completed' #{filter_check} and s.receipt_date between ? and ? #{source}",from,to) end query = query.group("s.sale_id") end def self.get_void_sale(shift,from,to) sale_arr = Array.new query = Sale.select("sales.receipt_no,sales.receipt_date, sales.payment_status, sales.sale_status,sales.total_amount,sales.grand_total, sales.rounding_adjustment") # .joins("INNER JOIN shift_sales sh ON sh.id = sales.shift_sale_id") # .where("sales.sale_status = 'void' and (sh.shift_started_at between ? and ? # OR sh.shift_closed_at between ? and ? )", from ,to, from, to) if shift.present? query = query.where("sales.sale_status = 'void' and sales.shift_sale_id in (?)",shift.to_a) else query = query.where("sales.sale_status = 'void' and sales.receipt_date between ? and ? ",from,to) end out = {:items => query} sale_arr.push(out) return sale_arr end def self.get_total_waste(shift_id) query = Sale.where("sale_status = 'waste' and shift_sale_id = ?", shift_id) end def self.get_total_spoile(shift_id) query = Sale.where("sale_status = 'spoile' and shift_sale_id = ?", shift_id) end def self.get_separate_tax(shift_sale_range=nil,shift,from,to,payment_type) if payment_type.blank? payment_type = '' else payment_type = " and sale_payments.payment_method = '#{payment_type}'" end query = SaleTax.select("SUM(tax_payable_amount) AS st_amount,tax_name") .where("sale_status= 'completed'") .joins("LEFT JOIN sales ON sales.sale_id = sale_taxes.sale_id") .group("sale_taxes.tax_name") .order("sale_taxes.tax_name desc") if payment_type != '' query = query.where("#{payment_type} and sale_payments.payment_amount!=0") 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 end def self.get_payment_method_by_shift(shift_sale_range,shift,from,to,payment_type) sub_query = "SELECT (CASE WHEN SUM(sale_payments.payment_amount) > 0 THEN SUM(sale_payments.payment_amount) ELSE 0 END) FROM sale_payments INNER JOIN sale_audits sa ON SUBSTRING_INDEX(sa.remark,'||',1)=sale_payments.sale_payment_id INNER JOIN sales ON sa.sale_id = sales.sale_id WHERE sales.sale_status='completed' " if shift.present? shift_ids = shift.map(&:id).join(",") sub_query += " AND sales.shift_sale_id in (#{shift_ids})" elsif shift_sale_range.present? shift_ids = shift_sale_range.map(&:id).join(",") sub_query += " AND sales.shift_sale_id in (#{shift_ids})" else sub_query += " AND sales.receipt_date between '#{from}' and '#{to}'" end sub_query1 = "CASE WHEN (SELECT SUM(sale_payments.payment_amount) FROM sale_payments WHERE sale_payments.payment_method = 'creditnote' AND sale_payments.sale_id = s.sale_id ) - (SELECT SUM(sale_payments.payment_amount) FROM sale_payments INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id WHERE sale_payments.sale_id = s.sale_id) = 0 THEN sale_payments.sale_id = s.sale_id AND sale_payments.payment_method!='creditnote' ELSE 1 END" sale_payment = SalePayment.select("s.amount_changed as change_amount,s.receipt_no, sale_payments.*,s.receipt_date as sale_date, s.cashier_name as cashier_name") .joins("INNER JOIN sales s ON s.sale_id = sale_payments.sale_id") .where("(#{sub_query1}) ") .order('s.receipt_no DESC') payments_total = SalePayment.select("CAST((CONVERT_TZ(sales.receipt_date,'+00:00','+06:30')) AS DATE) as sale_date, SUM(case when (sale_payments.payment_method='mpu') then sale_payments.payment_amount else 0 end) as mpu_amount, SUM(case when (sale_payments.payment_method='master') then sale_payments.payment_amount else 0 end) as master_amount, SUM(case when (sale_payments.payment_method='visa') then sale_payments.payment_amount else 0 end) as visa_amount, SUM(case when (sale_payments.payment_method='jcb') then sale_payments.payment_amount else 0 end) as jcb_amount, SUM(case when (sale_payments.payment_method='paypar') then sale_payments.payment_amount else 0 end) as paypar_amount, SUM(case when (sale_payments.payment_method='unionpay') then sale_payments.payment_amount else 0 end) as unionpay_amount, SUM(case when (sale_payments.payment_method='alipay') then sale_payments.payment_amount else 0 end) as alipay_amount, SUM(case when (sale_payments.payment_method='paymal') then sale_payments.payment_amount else 0 end) as paymal_amount, SUM(case when (sale_payments.payment_method='dinga') then sale_payments.payment_amount else 0 end) as dinga_amount, SUM(case when (sale_payments.payment_method='JunctionPay') then sale_payments.payment_amount else 0 end) as junctionpay_amount, SUM(case when (sale_payments.payment_method='cash') then sale_payments.payment_amount else 0 end) as cash_amount, SUM(case when (sale_payments.payment_method='cash') then sales.amount_changed else 0 end) as total_change_amount, (CASE WHEN (SUM(case when (sale_payments.payment_method='creditnote') then sale_payments.payment_amount else 0 end)) > 0 THEN (SUM(case when (sale_payments.payment_method='creditnote') then sale_payments.payment_amount else 0 end) - (#{sub_query})) ELSE 0 END) as credit_amount, SUM(case when (sale_payments.payment_method='giftvoucher') then sale_payments.payment_amount else 0 end) as giftvoucher_amount, SUM(case when (sale_payments.payment_method='foc') then sale_payments.payment_amount else 0 end) as foc_amount") .joins("join sales on sales.sale_id = sale_payments.sale_id") if shift.present? all_total = payments_total.where("sales.shift_sale_id in (?) and sale_status= 'completed' and sale_payments.payment_amount != 0", shift.to_a) # .group("DATE_FORMAT((CONVERT_TZ(sales.receipt_date,'+00:00','+06:30')),'%Y-%m-%d')") if payment_type.blank? sale_type = sale_payment.where(" s.sale_status = 'completed' and payment_amount != 0 and s.shift_sale_id in (?)",shift.to_a) .order("payment_method") else sale_type = sale_payment.where(" payment_method= '#{payment_type}' and payment_amount != 0 and s.sale_status = 'completed' and s.shift_sale_id in (?)",shift.to_a) end elsif shift_sale_range.present? all_total = payments_total.where("sales.shift_sale_id in (?) and sale_status= 'completed' and sale_payments.payment_amount != 0", shift_sale_range.to_a) # .group("DATE_FORMAT((CONVERT_TZ(sales.receipt_date,'+00:00','+06:30')),'%Y-%m-%d')") if payment_type.blank? sale_type = sale_payment.where(" s.sale_status = 'completed' and payment_amount != 0 and s.shift_sale_id in (?)",shift_sale_range.to_a) .order("payment_method") else sale_type = sale_payment.where(" payment_method='#{payment_type}' and payment_amount != 0 and s.sale_status = 'completed' and s.shift_sale_id in (?)",shift_sale_range.to_a) end else all_total = payments_total.where("sales.receipt_date between ? and ? and sales.sale_status= 'completed' and sale_payments.payment_amount != 0", from,to) # .group("DATE_FORMAT((CONVERT_TZ(sales.receipt_date,'+00:00','+06:30')),'%Y-%m-%d')") if payment_type.blank? sale_type = sale_payment.where(" s.sale_status = 'completed' and payment_amount != 0 and s.receipt_date between ? and ? ",from,to) .order("payment_method") else sale_type = sale_payment.where(" payment_method='#{payment_type}' and payment_amount != 0 and s.sale_status = 'completed' and s.receipt_date between ? and ? ",from,to) end end return all_total,sale_type end def self.get_wastes_and_spoilages(from,to,status) if status == "spoile" type = "and sales.sale_status = 'spoile'" else type = "and sales.sale_status = 'waste'" end query = Sale.select("sales.sale_id,sales.receipt_no,sales.created_at,sales.total_amount,sales.grand_total,sales.rounding_adjustment,sales.shift_sale_id,sale_items.product_name,sale_items.product_code,sale_items.item_instance_code,sale_items.qty,sale_items.price,sale_items.unit_price,sale_items.menu_category_name as name") .joins("JOIN sale_items ON sales.sale_id = sale_items.sale_id" ) .where("sales.receipt_date between ? and ? #{type}",from,to) .group("sales.receipt_no,sale_items.menu_category_code,sale_items.item_instance_code") .order("sales.sale_id,sale_items.menu_category_name,sale_items.product_name") end # def self.get_separate_tax(from,to,payment_method=nil) # query = SaleTax.select("SUM(tax_payable_amount) AS st_amount,tax_name") # .joins("INNER JOIN sales ON sales.sale_id = sale_taxes.sale_id") # .group("sale_taxes.tax_name") # return query = query.where("sale_status=? and receipt_date between ? and ?","completed",from,to) # end def grand_total_after_rounding return self.grand_total.to_f + self.rounding_adjustment.to_f end def get_cash_amount cash = 0.0 self.sale_payments.each do |pay| if pay.payment_method == 'cash' cash = pay.payment_amount-self.amount_changed end end return cash end def get_credit_amount credit = 0.0 self.sale_payments.each do |pay| if pay.payment_method == 'creditnote' credit += pay.payment_amount end end return credit end def get_other_amount other = 0.0 self.sale_payments.each do |pay| if pay.payment_method != 'cash' && pay.payment_method != 'creditnote' other += pay.payment_amount end end return other end def get_commerical_tax tax = 0.0 self.sale_taxes.each do |taxobj| if taxobj.tax_name == "Commercial Tax" tax += taxobj.tax_payable_amount end end return tax end def self.top_bottom_products(today,current_user,from,to,from_time,to_time,type) if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? query = Sale.top_bottom(today,nil,from,to,from_time,to_time) if type == "top" query = query.group('i.product_name') .order("SUM(i.qty) DESC").limit(20) elsif type == "bottom" query = query.group('i.product_name') .order("SUM(i.qty) ASC").limit(20) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = Sale.top_bottom(today,nil,from,to,from_time,to_time) if type == "top" query = query.group('i.product_name') .order("SUM(i.qty) DESC").limit(20) elsif type == "bottom" query = query.group('i.product_name') .order("SUM(i.qty) ASC").limit(20) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = Sale.top_bottom(today,shift,from,to,from_time,to_time) if type == "top" query = query.group('i.product_name') .order("SUM(i.qty) DESC").limit(20) elsif type == "bottom" query = query.group('i.product_name') .order("SUM(i.qty) ASC").limit(20) end end end end else if current_user.nil? query = Sale.top_bottom(today).group('i.product_name') if type == "top" query = query.order("SUM(i.qty) DESC").limit(20) elsif type == "bottom" query = query.order("SUM(i.qty) ASC").limit(20) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = Sale.top_bottom(today).group('i.product_name') if type == "top" query = query.order("SUM(i.qty) DESC").limit(20) elsif type == "bottom" query = query.order("SUM(i.qty) ASC").limit(20) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = Sale.top_bottom(today,shift).group('i.product_name') if type == "top" query = query.order("SUM(i.qty) DESC").limit(20) elsif type == "bottom" query = query.order("SUM(i.qty) ASC").limit(20) end end end end end end def self.hourly_sales(today,current_user,from,to,from_time,to_time) if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? query = Sale.hourly_sale_data(today,nil,from,to,from_time,to_time) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = Sale.hourly_sale_data(today,nil,from,to,from_time,to_time) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = Sale.hourly_sale_data(today,shift,from,to,from_time,to_time) end end end else if current_user.nil? query = Sale.hourly_sale_data(today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = Sale.hourly_sale_data(today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = Sale.hourly_sale_data(today,shift) end end end end end def self.employee_sales(today,current_user,from,to,from_time,to_time) #sub query for credit payment outstanding_query = "SELECT CASE WHEN SUM(sale_payments.outstanding_amount) < 0 THEN SUM(sale_payments.outstanding_amount) ELSE 0 END FROM sale_payments JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id JOIN sales ON sale_payments.sale_id = sales.sale_id WHERE sale_payments.outstanding_amount LIKE '%-%' AND sales.sale_status='completed'" if (!from.nil? && !to.nil?) && (from != "" && to!="") if !from_time.nil? && !to_time.nil? outstanding_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') between '#{from}' and '#{to}' and DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%H:%i') between '#{from_time}' and '#{to_time}'" else outstanding_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') between '#{from}' and '#{to}'" end else outstanding_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') = '#{today}'" end sub_query = "SELECT (CASE WHEN SUM(sale_payments.payment_amount) > 0 THEN SUM(sale_payments.payment_amount) + (#{outstanding_query}) ELSE 0 END) FROM sale_payments INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id INNER JOIN sales ON sale_payments.sale_id = sales.sale_id WHERE sales.sale_status='completed'" if (!from.nil? && !to.nil?) && (from != "" && to!="") if !from_time.nil? && !to_time.nil? sub_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' AND '#{to}' AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between '#{from_time}' and '#{to_time}'" else sub_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' AND '#{to}'" end else sub_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') = '#{today}'" end #sub query for credit payment changed_query = "SELECT SUM(s.amount_changed) FROM `sales` s WHERE s.sale_status='completed'" if (!from.nil? && !to.nil?) && (from != "" && to!="") if !from_time.nil? && !to_time.nil? changed_query += " AND DATE_FORMAT(CONVERT_TZ(s.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' AND '#{to}' AND DATE_FORMAT(CONVERT_TZ(s.receipt_date,'+00:00','+06:30'),'%H:%i') between '#{from_time}' and '#{to_time}'" else changed_query += " AND DATE_FORMAT(CONVERT_TZ(s.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' AND '#{to}'" end else changed_query += " AND DATE_FORMAT(CONVERT_TZ(s.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') = '#{today}'" end if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? query = Sale.employee_sale(today,nil,from,to,from_time,to_time) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' changed_query += " AND s.shift_sale_id=sales.shift_sale_id" query = Sale.employee_sale(today,nil,from,to,from_time,to_time) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? changed_query += " AND s.shift_sale_id=#{shift.id}" query = Sale.employee_sale(today,shift,from,to,from_time,to_time) end end end else if current_user.nil? query = Sale.employee_sale(today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' changed_query += " AND s.shift_sale_id=sales.shift_sale_id" query = Sale.employee_sale(today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? changed_query += " AND s.shift_sale_id=#{shift.id}" query = Sale.employee_sale(today,shift) end end end end query = query.select("(CASE WHEN sp.payment_method='cash' THEN (SUM(sp.payment_amount) - (#{changed_query})) WHEN sp.payment_method='creditnote' THEN (SUM(sp.payment_amount) - (#{sub_query})) ELSE SUM(sp.payment_amount) END) AS payment_amount, (CASE WHEN (sp.payment_method='mpu' or sp.payment_method='visa' or sp.payment_method='master' or sp.payment_method='jcb' or sp.payment_method='unionpay' or sp.payment_method='alipay' or sp.payment_method='paymal' or sp.payment_method='dinga' or sp.payment_method='JunctionPay' or sp.payment_method='giftvoucher') THEN 'card' ELSE sp.payment_method END) AS payment_method, e.name AS e_name") end def self.total_trans(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) query = Sale.select("SUM(grand_total) as total_sale, COUNT(sales.sale_id) as total_count") .where('sale_status = "completed"') if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? total = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else total = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? total = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else total = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? if !from_time.nil? && !to_time.nil? total = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ? and shift_sale_id=?',from,to,from_time,to_time,shift.id) else total = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and shift_sale_id=?',from,to,shift.id) end end end end else if current_user.nil? total = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',today,today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' total = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',today,today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? total = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and shift_sale_id=?',today,today,shift.id) end end end end end def self.total_card_sale(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) query = Sale.joins("JOIN sale_payments sp ON sp.sale_id = sales.sale_id") .where('sales.sale_status = "completed" and (sp.payment_method = "mpu" or sp.payment_method = "visa" or sp.payment_method = "master" or sp.payment_method = "jcb" or sp.payment_method = "unionpay" or sp.payment_method = "alipay" or sp.payment_method = "paymal" or sp.payment_method = "dinga" or sp.payment_method = "JunctionPay")') if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ? and shift_sale_id=?',from,to,from_time,to_time,shift.id) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and shift_sale_id=?',from,to,shift.id) end end end end else if current_user.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ? and shift_sale_id=?',today,shift.id) end end end end query = query.sum("sp.payment_amount") end def self.credit_payment(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) outstanding_query = "SELECT CASE WHEN SUM(sale_payments.outstanding_amount) < 0 THEN SUM(sale_payments.outstanding_amount) ELSE 0 END FROM sale_payments JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id JOIN sales ON sale_payments.sale_id = sales.sale_id WHERE sale_payments.outstanding_amount LIKE '%-%' AND sales.sale_status='completed'" if (!from.nil? && !to.nil?) && (from != "" && to!="") if !from_time.nil? && !to_time.nil? outstanding_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') between '#{from}' and '#{to}' and DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%H:%i') between '#{from_time}' and '#{to_time}'" else outstanding_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') between '#{from}' and '#{to}'" end else outstanding_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') = '#{today}'" end sub_query = SalePayment.select("(CASE WHEN SUM(sale_payments.payment_amount) > 0 THEN SUM(sale_payments.payment_amount) + (#{outstanding_query}) ELSE 0 END) as total_credit_payment") .joins(" JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id") .joins(" JOIN sales ON sale_payments.sale_id = sales.sale_id") .where("sales.sale_status='completed'") if (!from.nil? && !to.nil?) && (from != "" && to!="") if !from_time.nil? && !to_time.nil? sub_query = sub_query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' AND '#{to}' AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between '#{from_time}' and '#{to_time}'") else sub_query = sub_query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' AND '#{to}'") end else sub_query = sub_query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') = '#{today}'") end query = SalePayment.where('s.sale_status = "completed" and payment_method="creditnote"') .joins("INNER JOIN sales s ON s.sale_id = sale_payments.sale_id") if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(s.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(s.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) .sum("payment_amount") if !sub_query.nil? query = query.to_f - (sub_query[0].total_credit_payment.to_f > 0 ? sub_query[0].total_credit_payment.to_f : 0) end else query = query.where('DATE_FORMAT(CONVERT_TZ(s.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) .sum("payment_amount") if !sub_query.nil? query = query.to_f - (sub_query[0].total_credit_payment.to_f > 0 ? sub_query[0].total_credit_payment.to_f : 0) end end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(s.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(s.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) .sum("payment_amount") if !sub_query.nil? query = query.to_f - (sub_query[0].total_credit_payment.to_f > 0 ? sub_query[0].total_credit_payment.to_f : 0) end else query = query.where('DATE_FORMAT(CONVERT_TZ(s.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) .sum("payment_amount") if !sub_query.nil? query = query.to_f - (sub_query[0].total_credit_payment.to_f > 0 ? sub_query[0].total_credit_payment.to_f : 0) end end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(s.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(s.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ? and s.shift_sale_id=?',from,to,from_time,to_time,shift.id) .sum("payment_amount") if !sub_query.nil? query = query.to_f - (sub_query[0].total_credit_payment.to_f > 0 ? sub_query[0].total_credit_payment.to_f : 0) end else query = query.where('DATE_FORMAT(CONVERT_TZ(s.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and s.shift_sale_id=?',from,to,shift.id) .sum("payment_amount") if !sub_query.nil? query = query.to_f - (sub_query[0].total_credit_payment.to_f > 0 ? sub_query[0].total_credit_payment.to_f : 0) end end end end end else if current_user.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(s.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',today,today) .sum("payment_amount") if !sub_query.nil? query = query.to_f - (sub_query[0].total_credit_payment.to_f > 0 ? sub_query[0].total_credit_payment.to_f : 0) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = query.where('DATE_FORMAT(CONVERT_TZ(s.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',today,today) .sum("payment_amount") if !sub_query.nil? query = query.to_f - (sub_query[0].total_credit_payment.to_f > 0 ? sub_query[0].total_credit_payment.to_f : 0) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(s.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and s.shift_sale_id=?',today,today,shift.id) .sum("payment_amount") if !sub_query.nil? query = query.to_f - (sub_query[0].total_credit_payment.to_f > 0 ? sub_query[0].total_credit_payment.to_f : 0) end end end end end return query end def self.summary_sale_receipt(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) query = Sale.select('count(sale_id) as total_receipt, (case when sum(total_amount) > 0 then sum(total_amount) else 0.0 end) as total_amount, (case when sum(grand_total) > 0 then sum(grand_total) else 0.0 end) as grand_total, (case when sum(total_discount) > 0 then sum(total_discount) else 0.0 end) as total_discount, (case when sum(total_tax) > 0 then sum(total_tax) else 0.0 end) as total_tax') .where('sale_status = "completed"') if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ? and shift_sale_id=?',from,to,from_time,to_time,shift.id) else query = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and shift_sale_id=?',from,to,shift.id) end end end end else if current_user.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ? and shift_sale_id=?',today,shift.id) end end end end query = query.first() end def self.total_payment_methods(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) query = Sale.select("distinct sp.payment_method") .where('sales.sale_status = "completed"') .joins("JOIN sale_payments as sp ON sp.sale_id = sales.sale_id") if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date, "+00:00", "+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date, "+00:00", "+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date, "+00:00", "+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date, "+00:00", "+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date, "+00:00", "+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date, "+00:00", "+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date, "+00:00", "+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date, "+00:00", "+06:30"),"%H:%i") between ? and ? and sales.shift_sale_id=?',from,to,from_time,to_time,shift.id) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date, "+00:00", "+06:30"),"%Y-%m-%d") between ? and ? and sales.shift_sale_id=?',from,to,shift.id) end end end end else if current_user.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ? and sales.shift_sale_id=?',today,shift.id) end end end end end def self.payment_sale(payment_method, today, current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) time_query = '' if !from_time.nil? && !to_time.nil? time_query = " and DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%H:%i') between '#{from_time}' and '#{to_time}'" end outstanding_query = "SELECT CASE WHEN SUM(sale_payments.outstanding_amount) < 0 THEN SUM(sale_payments.outstanding_amount) ELSE 0 END FROM sale_payments JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id JOIN sales ON sale_payments.sale_id = sales.sale_id WHERE sale_payments.outstanding_amount LIKE '%-%' AND sales.sale_status='completed'" if (!from.nil? && !to.nil?) && (from != "" && to!="") if !from_time.nil? && !to_time.nil? outstanding_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') between '#{from}' and '#{to}' and DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%H:%i') between '#{from_time}' and '#{to_time}'" else outstanding_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') between '#{from}' and '#{to}'" end else outstanding_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') = '#{today}'" end sub_query = "SELECT (CASE WHEN SUM(sale_payments.payment_amount) > 0 THEN SUM(sale_payments.payment_amount) + (#{outstanding_query}) ELSE 0 END) FROM sale_payments INNER JOIN sale_audits ON SUBSTRING_INDEX(sale_audits.remark,'||',1)=sale_payments.sale_payment_id INNER JOIN sales ON sale_payments.sale_id = sales.sale_id WHERE sales.sale_status='completed'" if (!from.nil? && !to.nil?) && (from != "" && to!="") if !from_time.nil? && !to_time.nil? sub_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' AND '#{to}' AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between '#{from_time}' and '#{to_time}'" else sub_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' AND '#{to}'" end else sub_query += " AND DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') = '#{today}'" end changed_query = "SELECT SUM(s.amount_changed) FROM `sales` s WHERE s.sale_status='completed'" if (!from.nil? && !to.nil?) && (from != "" && to!="") if !from_time.nil? && !to_time.nil? changed_query += " AND DATE_FORMAT(CONVERT_TZ(s.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' AND '#{to}' AND DATE_FORMAT(CONVERT_TZ(s.receipt_date,'+00:00','+06:30'),'%H:%i') between '#{from_time}' and '#{to_time}'" else changed_query += " AND DATE_FORMAT(CONVERT_TZ(s.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' AND '#{to}'" end else changed_query += " AND DATE_FORMAT(CONVERT_TZ(s.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') = '#{today}'" end query = Sale.joins("JOIN sale_payments as sp ON sp.sale_id = sales.sale_id") where('sales.sale_status = "completed"') if payment_method == 'card' query = query.where('(sp.payment_method = "mpu" or sp.payment_method = "visa" or sp.payment_method = "master" or sp.payment_method = "jcb" or sp.payment_method = "unionpay" or sp.payment_method="alipay" or sp.payment_method="paymal" or sp.payment_method="dinga" or sp.payment_method="JunctionPay" or sp.payment_method = "giftvoucher")') else query = query.where("sp.payment_method = '#{payment_method}'") end if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') between ? and ? and and DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%H:%i') between ? and ?",from,to,from_time,to_time) else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') between ? and ?",from,to) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%H:%i') between ? and ?",from,to,from_time,to_time) else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') between ? and ?",from,to) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? changed_query += " AND s.shift_sale_id = #{shift.id}" if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%H:%i') between ? and ? and sales.shift_sale_id=?",from,to,from_time,to_time,shift.id) else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date, '+00:00', '+06:30'),'%Y-%m-%d') between ? and ? and sales.shift_sale_id=?",from,to,shift.id) end end end end else if current_user.nil? query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ?",today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ?",today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? changed_query += " AND s.shift_sale_id = #{shift.id}" query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ? and sales.shift_sale_id=?",today,shift.id) end end end end query = query.select("(CASE WHEN sp.payment_method='cash' THEN (SUM(sp.payment_amount) - (#{changed_query})) WHEN sp.payment_method='creditnote' THEN SUM(sp.payment_amount) - (#{sub_query}) ELSE SUM(sp.payment_amount) END) as payment_amount").first() end def self.total_customer(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) total_dinein_takeaway = self.total_dinein_takeaway(today,current_user,from,to,from_time,to_time) dinein_cnt = 0 takeaway_cnt = 0 if !total_dinein_takeaway.nil? if total_dinein_takeaway[0] dinein_cnt = total_dinein_takeaway[0].total_dinein_cus takeaway_cnt = total_dinein_takeaway[0].total_take_cus end end membership_cnt = self.total_membership(today,current_user,from,to,from_time,to_time) member_cnt = 0 if !membership_cnt.nil? member_cnt = membership_cnt.total_memb_cus end total_cus = 0 if dinein_cnt > dinein_cnt || takeaway_cnt > 0 || !membership_cnt.nil? total_cus = dinein_cnt.to_int + takeaway_cnt.to_int + member_cnt.to_int end return total_cus, dinein_cnt, takeaway_cnt, member_cnt end def self.total_dinein_takeaway(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) query = Sale.select("(CASE WHEN c.customer_type='Dinein' THEN count(sales.customer_id) ELSE 0 END) as total_dinein_cus, (CASE WHEN c.customer_type='Takeaway' THEN count(sales.customer_id) ELSE 0 END) as total_take_cus") .joins("JOIN customers as c ON c.customer_id = sales.customer_id") .where('sales.sale_status = "completed" and c.membership_id is null') if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ? and sales.shift_sale_id=?',from,to,from_time,to_time,shift.id) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and sales.shift_sale_id=?',from,to,shift.id) end end end end else if current_user.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ? and sales.shift_sale_id=?',today,shift.id) end end end end query = query.first() end def self.total_membership(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) query = Sale.select("count(distinct sales.customer_id) as total_memb_cus") .joins("JOIN customers as c ON c.customer_id = sales.customer_id") .where('sales.sale_status = "completed" and ((c.customer_type = "Dinein" and c.membership_id is not null) or (c.customer_type = "Takeaway" and c.membership_id is not null))') if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?)',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ? and sales.shift_sale_id=?',from,to,from_time,to_time,shift.id).first() else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and sales.shift_sale_id=?',from,to,shift.id).first() end end end end else if current_user.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = query.where('sales.sale_status = "completed" and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = query.where('sales.sale_status = "completed" and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ? and sales.shift_sale_id=?',today,shift.id) end end end end query = query.first() end # def self.total_other_customer(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) # query = Sale.select("count(sales.customer_id) as total_cus") # .joins("JOIN customers as c ON c.customer_id = sales.customer_id") # .where('sales.sale_status = "completed" and c.customer_type is null and c.membership_id is null') # if !from.nil? && !to.nil? # if current_user.nil? # if !from_time.nil? && !to_time.nil? # query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) # else # query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) # end # else # if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' # if !from_time.nil? && !to_time.nil? # query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) # else # query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) # end # else # shift = ShiftSale.current_open_shift(current_user.id) # if !shift.nil? # if !from_time.nil? && !to_time.nil? # query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ? and sales.shift_sale_id=?',from,to,from_time,to_time,shift.id) # else # query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and sales.shift_sale_id=?',from,to,shift.id) # end # end # end # end # else # if current_user.nil? # query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) # else # if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' # query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) # else # shift = ShiftSale.current_open_shift(current_user.id) # if !shift.nil? # query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ? and sales.shift_sale_id=?',today,shift.id) # end # end # end # end # query = query.first() # end def self.total_order(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) query = Sale.select("count(distinct a.order_id) as total_order") .joins("JOIN sale_orders as a ON a.sale_id = sales.sale_id") .joins("JOIN orders as b ON b.order_id = a.order_id") .where('b.status = "billed"') if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ? and sales.shift_sale_id=?',from,to,from_time,to_time,shift.id) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and sales.shift_sale_id=?',from,to,shift.id) end end end end else if current_user.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ? and sales.shift_sale_id=?',today,shift.id) end end end end query = query.first() end def self.total_account(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) query = Sale.select("distinct b.id as account_id, b.title as title") .joins("JOIN sale_items as a ON a.sale_id = sales.sale_id") .joins("JOIN accounts as b ON b.id = a.account_id") .where('sales.sale_status = "completed"') if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ?',from,to,from_time,to_time) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? if !from_time.nil? && !to_time.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%H:%i") between ? and ? and sales.shift_sale_id=?',from,to,from_time,to_time,shift.id) else query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and sales.shift_sale_id=?',from,to,shift.id) end end end end else if current_user.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ?',today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = query.where('DATE_FORMAT(CONVERT_TZ(sales.receipt_date,"+00:00","+06:30"),"%Y-%m-%d") = ? and sales.shift_sale_id=?',today,shift.id) end end end end end def self.account_data(account_id, today, current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) query = Sale.select("count(*) as cnt_acc, SUM(a.price) as total_acc") .joins("JOIN sale_items as a ON a.sale_id = sales.sale_id") .where("sales.sale_status = 'completed' and a.account_id ='#{account_id}'") if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between ? and ?",from,to,from_time,to_time) else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ?",from,to) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between ? and ?",from,to,from_time,to_time) else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ?",from,to) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between ? and ? and sales.shift_sale_id=?",from,to,from_time,to_time,shift.id) else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ? and sales.shift_sale_id=?",from,to,shift.id) end end end end else if current_user.nil? query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ?",today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ?",today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ? and sales.shift_sale_id=?",today,shift.id) end end end end query = query.first() end def self.top_items(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) query = Sale.select("a.product_name as item_name, SUM(a.price) as item_total_price") .joins("JOIN sale_items as a ON a.sale_id = sales.sale_id") .where("(a.qty > 0 and a.price > 0) and payment_status='paid' and sales.sale_status = 'completed'") if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between ? and ?",from,to,from_time,to_time) else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ?",from,to) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between ? and ?",from,to,from_time,to_time) else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ?",from,to) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between ? and ? and sales.shift_sale_id=?",from,to,from_time,to_time,shift.id) else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ? and sales.shift_sale_id=?",from,to,shift.id) end end end end else if current_user.nil? query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ?",today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ?",today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ? and sales.shift_sale_id=?",today,shift.id) end end end end query = query.group("a.product_code") .order("SUM(a.qty) DESC") .first() end def self.total_foc_items(today,current_user=nil,from=nil,to=nil,from_time=nil,to_time=nil) query = Sale.joins("JOIN sale_items as a ON a.sale_id = sales.sale_id") .where("sales.sale_status = 'completed' and a.status='foc' and a.product_name like '%FOC%'") if (!from.nil? && !to.nil?) && (from != "" && to!="") if current_user.nil? if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between ? and ?",from,to,from_time,to_time) else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ?",from,to) end else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between ? and ?",from,to,from_time,to_time) else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ?",from,to) end else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ? and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between ? and ? and sales.shift_sale_id=?",from,to,from_time,to_time,shift.id) else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between ? and ? and sales.shift_sale_id=?",from,to,shift.id) end end end end else if current_user.nil? query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ?",today) else if current_user.role == 'administrator' || current_user.role == 'manager' || current_user.role == 'account' || current_user.role == 'supervisor' query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ?",today) else shift = ShiftSale.current_open_shift(current_user.id) if !shift.nil? query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ? and sales.shift_sale_id=?",today,shift.id) end end end end query = query.count() end #card sale trans data def self.getCardSaleTrans(sale_id) query = Sale.select("cst.res_date,cst.res_time,cst.trace,cst.pan,cst.batch_no,cst.exp_date,cst.app,cst.res_type,cst.ref_no,cst.terminal_id,cst.merchant_id,cst.app_code") .joins("JOIN card_sale_trans as cst on cst.sale_id = sales.sale_id") .where("sales.sale_id=? and status = 'Approved'",sale_id) return query end def self.add_to_existing_pending_invoice(dining,sale_id,booking) existing_booking = Booking.find_by_sale_id(sale_id) if dining.to_i > 0 table = DiningFacility.find(dining) table.bookings.each do |booking| # if !booking.checkout_at.nil? # existing_booking.update_attributes(checkout_at: checkout_at) # end if booking.sale_id.nil? booking.booking_orders.each do |booking_order| booking.booking_status = 'moved' order = Order.find(booking_order.order_id) order.status = 'billed' order.order_items.each do |item| item.order_item_status = 'billed' end # create sale item saleobj = Sale.find(sale_id) order.order_items.each do |orer_item| saleobj.add_item (orer_item) end # Re-compute for add saleobj.compute(order.source) saleobj.save order.save booking.save end booking_order = BookingOrder.where('booking_id=?',booking) booking_order.each do |bo| bo.booking_id = existing_booking.booking_id bo.save end end end else if booking.sale_id.nil? booking.booking_orders.each do |booking_order| booking.booking_status = 'moved' order = Order.find(booking_order.order_id) order.status = 'billed' order.order_items.each do |item| item.order_item_status = 'billed' end # create sale item saleobj = Sale.find(sale_id) order.order_items.each do |orer_item| saleobj.add_item (orer_item) end # Re-compute for add saleobj.compute(order.source) saleobj.save order.save booking.save end booking_order = BookingOrder.where('booking_id=?',booking) booking_order.each do |bo| bo.booking_id = existing_booking.booking_id bo.save end end end end def self.get_shift_sale_items(sh_id) query = Sale.select("sales.shift_sale_id as shift_sale_id, i.account_id as account_id, acc.title as account_name, i.item_instance_code as item_code, i.menu_category_name, i.menu_category_code as menu_category_id, i.product_name as product_name, i.unit_price, i.price as price, i.qty as qty, SUM(i.qty) as total_item, SUM(i.qty * i.unit_price) as grand_total, i.status as status_type, i.remark as remark") .joins("JOIN sale_items i on i.sale_id = sales.sale_id") .joins("JOIN accounts acc on acc.id = i.account_id") .where("sales.shift_sale_id=?", sh_id) .group("acc.title,i.account_id,i.menu_category_code,i.item_instance_code,i.product_name,i.unit_price") .order("acc.title desc, i.account_id desc, i.menu_category_code desc, i.unit_price asc") end def self.pending_sale(type) query = Sale.all query = query.joins("join sale_orders as sale_orders on sale_orders.sale_id = sales.sale_id") .joins("join orders as orders on orders.order_id = sale_orders.order_id") query = query.where("sales.sale_status = 'new' AND orders.status = 'billed' AND orders.source =? ","#{type}") .group("sales.sale_id") end def self.pending_order(type) query = Booking.all query = query.joins("join booking_orders as booking_orders on booking_orders.booking_id = bookings.booking_id") .joins("join orders as orders on orders.order_id = booking_orders.order_id") query = query.where("bookings.booking_status = 'assign' AND orders.status = 'new' AND orders.source =? ","#{type}") .group("bookings.booking_id") end def self.completed_sale(type) if type == "cashier" type = "and orders.source = 'emenu' or orders.source = 'cashier'" else type = "and orders.source = '#{type}'" end query = Sale.all query = query.joins("join sale_orders as sale_orders on sale_orders.sale_id = sales.sale_id") .joins("join orders as orders on orders.order_id = sale_orders.order_id") query = query.where("sales.sale_status != 'new' AND orders.status = 'billed' #{type}") query = query.where("DATE_FORMAT(sales.receipt_date,'%Y-%m-%d') = ? ",DateTime.now.strftime('%Y-%m-%d')) .group("sales.sale_id") end def self.all_receipts query = Sale.select("sales.*,sale_payments.created_at as receipt_close_time, case when (sale_audits.action='SALEPAYMENT') then sale_audits.remark else 0 end as remark, case when (sale_taxes.tax_name='Service Charges') then sale_taxes.tax_payable_amount else 0 end as service_charges, SUM(case when (sale_payments.payment_method='mpu') then sale_payments.payment_amount else 0 end) as mpu_amount, SUM(case when (sale_payments.payment_method='master') then sale_payments.payment_amount else 0 end) as master_amount, SUM(case when (sale_payments.payment_method='visa') then sale_payments.payment_amount else 0 end) as visa_amount, SUM(case when (sale_payments.payment_method='jcb') then sale_payments.payment_amount else 0 end) as jcb_amount, SUM(case when (sale_payments.payment_method='unionpay') then sale_payments.payment_amount else 0 end) as unionpay_amount, SUM(case when (sale_payments.payment_method='alipay') then sale_payments.payment_amount else 0 end) as alipay_amount, SUM(case when (sale_payments.payment_method='paymal') then sale_payments.payment_amount else 0 end) as paymal_amount, SUM(case when (sale_payments.payment_method='dinga') then sale_payments.payment_amount else 0 end) as dinga_amount, SUM(case when (sale_payments.payment_method='JunctionPay') then sale_payments.payment_amount else 0 end) as junctionpay_amount, SUM(case when (sale_payments.payment_method='creditnote') then sale_payments.payment_amount else 0 end) as credit_amount, SUM(case when (sale_payments.payment_method='foc') then sale_payments.payment_amount else 0 end) as foc_amount, SUM(case when (sale_payments.payment_method='giftvoucher') then sale_payments.payment_amount else 0 end) as giftvoucher_amount, SUM(case when (sale_items.status='foc') then sale_items.price else 0 end) as item_foc, SUM(case when (sale_items.status='Discount') then sale_items.price else 0 end) as item_discount, SUM(sale_items.qty) as qty, sales.cashier_name as cashier_name, surveys.child as child, surveys.adult as adult") .joins("join sale_payments on sale_payments.sale_id = sales.sale_id") .joins("join sale_taxes on sale_taxes.sale_id = sales.sale_id") .joins("join sale_items on sale_items.sale_id = sales.sale_id") .joins("join sale_audits on sale_audits.sale_id = sales.sale_id") .joins("left join surveys on surveys.receipt_no = sales.receipt_no") query = query.where("sales.sale_status != 'new' && sale_payments.payment_amount > 0") query = query.where("sales.created_at between ? and ?", '2017-11-01 00:00:00 +0630','2018-11-16 13:59:59 +0630') .group("sales.sale_id") return query end def self.all_receipt_details query = SaleItem.select("sale_items.*, sale_payments.created_at as receipt_close_time, sales.requested_at as requested_at, sales.receipt_no as receipt_no,sales.sale_id as s_id") .joins("join sale_payments on sale_payments.sale_id = sale_items.sale_id") .joins("join sales on sales.sale_id = sale_items.sale_id") .group("sale_items.sale_item_id") query = query.where("sale_items.qty > 0 and sales.sale_status !='new'") query = query.where("sale_items.created_at between ? and ?", '2017-11-01 00:00:00 +0630','2018-11-16 13:59:59 +0630') return query end def self.get_sale_data_for_other_payment_credit(sale_id) query = Sale.select("sales.sale_id,sales.receipt_no,sales.customer_id,SUM(sp.payment_amount) as total_amount,SUM(sp.payment_amount) as grand_total") .joins(" JOIN sale_payments sp on sp.sale_id=sales.sale_id") .where("sp.payment_method ='creditnote' and sales.sale_id='#{sale_id}'") .group("sales.sale_id") .first return query 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 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 end end def self.top_bottom(today,shift=nil,from=nil,to=nil,from_time=nil,to_time=nil) if !from.nil? && !to.nil? query = Sale.select("(SUM(i.qty) * i.price) as grand_total,SUM(i.qty) as total_item," + " i.price as unit_price,i.product_name") .joins("JOIN sale_items i ON i.sale_id = sales.sale_id") if !from_time.nil? && !to_time.nil? query = query.where("(i.qty > 0 and i.price > 0) and DATE_FORMAT(CONVERT_TZ(receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' and '#{to}'"+ " and DATE_FORMAT(CONVERT_TZ(receipt_date,'+00:00','+06:30'),'%H:%i') between '#{from_time}' and '#{to_time}' and sale_status= 'completed'") else query = query.where("(i.qty > 0 and i.price > 0) and DATE_FORMAT(CONVERT_TZ(receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' and '#{to}'"+ " and sale_status= 'completed'") end if !shift.nil? query = query.where("shift_sale_id='#{shift.id}'") end else query = Sale.select("(SUM(i.qty) * i.price) as grand_total,SUM(i.qty) as total_item," + " i.price as unit_price,i.product_name") .joins("JOIN sale_items i ON i.sale_id = sales.sale_id") .where("(i.qty > 0 and i.price > 0) and DATE_FORMAT(receipt_date,'%Y-%m-%d') = '#{today}'"+ " and sale_status= 'completed'") if !shift.nil? query = query.where("shift_sale_id='#{shift.id}'") end end return query end def self.hourly_sale_data(today,shift=nil,from=nil,to=nil,from_time=nil,to_time=nil) if !from.nil? && !to.nil? query = Sale.select("grand_total") if !from_time.nil? && !to_time.nil? query = query.where('sale_status = "completed" and DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ? and DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%H:%M") between ? and ?',from,to,from_time,to_time) else query = query.where('sale_status = "completed" and DATE_FORMAT(CONVERT_TZ(receipt_date,"+00:00","+06:30"),"%Y-%m-%d") between ? and ?',from,to) end if !shift.nil? query = query.where("shift_sale_id='#{shift.id}'") end query = query.group("date_format(CONVERT_TZ(receipt_date,'+00:00', '+06:30'), '%I %p')") .order('receipt_date') else query = Sale.select("grand_total") .where('sale_status = "completed" and DATE_FORMAT(receipt_date,"%Y-%m-%d") = ?',today) if !shift.nil? query = query.where("shift_sale_id='#{shift.id}'") end query = query.group("date_format(CONVERT_TZ(receipt_date,'+00:00', '+06:30'), '%I %p')") .order('receipt_date') end return query end def self.employee_sale(today,shift=nil,from=nil,to=nil,from_time=nil,to_time=nil) query = Sale.joins("JOIN employees as e on e.id=sales.cashier_id") .joins("JOIN sale_payments as sp on sp.sale_id=sales.sale_id") .where("sales.payment_status='paid' and sales.sale_status = 'completed' ") if !from.nil? && !to.nil? if !from_time.nil? && !to_time.nil? query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' and '#{to}' and DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%H:%i') between '#{from_time}' and '#{to_time}'") else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') between '#{from}' and '#{to}'") end else query = query.where("DATE_FORMAT(CONVERT_TZ(sales.receipt_date,'+00:00','+06:30'),'%Y-%m-%d') = '#{today}'") end if !shift.nil? query = query.where("sales.shift_sale_id ='#{shift.id}'") end query = query.group("(CASE WHEN (sp.payment_method='mpu' or sp.payment_method='visa' or sp.payment_method='master' or sp.payment_method='jcb' or sp.payment_method='unionpay' or sp.payment_method='alipay' or sp.payment_method='paymal' or sp.payment_method='dinga' or sp.payment_method='JunctionPay' or sp.payment_method='giftvoucher') THEN 'card' ELSE sp.payment_method END)","e.name") .order("e.name") return query end private def generate_custom_id self.sale_id = SeedGenerator.generate_id(self.class.name, "SAL") end end