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
      Rails.logger.debug '........ Sale data sync completed .......'
    end
  end
  def generate_invoice_from_booking(booking_id, requested_by, cashier, order_source = nil, current_checkin_induties_count)
    saleObj =''
    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|
        # puts "Hello 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
        saleObj = Sale.find(sale_id)
        # order = booking.booking_orders.take.order
        link_order_sale(order.order_id)
      end
      # InventoryJob.perform_now(self.id)
      InventoryDefinition.calculate_product_count(saleObj)



      # 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.nil?
        orderSoure = order_source.downcase
      else
        orderSoure = nil
      end

      if orderSoure == "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?
      saleOrder = SaleOrder.new
      # sale = saleOrder.create_sale_order(self.id, order_id)
    end

    sale = saleOrder.create_sale_order(self.id, order_id)
    # 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='KBZPay') then sale_payments.payment_amount else 0 end) as kbzpay_amount,
     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,
                 :kbzpay_amount => pay.kbzpay_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("sales.sale_id,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, " +
                     "date_format(CONVERT_TZ(receipt_date,'+00:00', '+06:30'), '%I %p')
                      as date_format")

  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='KBZPay') then sale_payments.payment_amount else 0 end) as kbzpay_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.qty desc,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)
    logger.debug 'hourly_sales<<<<<<<<<<<<<<<<<<<<<<<<'
    logger.debug today
    logger.debug current_user.to_json
    logger.debug from
    logger.debug to
    logger.debug from_time
    logger.debug 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

# Start hourly sale item report
def self.get_by_hourly_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_hourly_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_hourly_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("sales.sale_id,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, " +
                     "date_format(CONVERT_TZ(receipt_date,'+00:00', '+06:30'), '%I %p')
  					          as date_format")

  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("date_format asc")
  # query = query.order("i.menu_category_name asc, SUM(i.qty) desc")
end

# End hourly sale item report

private

  def generate_custom_id
    self.sale_id = SeedGenerator.generate_id(self.class.name, "SAL")
  end
end
