Merge branch 'r-1902001-01' into foodcourt
This commit is contained in:
@@ -47,6 +47,7 @@ class Employee < ApplicationRecord
|
||||
if (session_token)
|
||||
user = Employee.find_by_token_session(session_token)
|
||||
expiry_time = login_expiry_time
|
||||
|
||||
if user && user.session_expiry && user.session_expiry.utc > DateTime.now.utc
|
||||
#Extend the login time each time authenticatation take place
|
||||
user.session_expiry = user.session_expiry.utc + expiry_time.minutes
|
||||
|
||||
@@ -26,7 +26,7 @@ class Sale < ApplicationRecord
|
||||
has_one :booking
|
||||
has_many :product_commissions
|
||||
|
||||
before_validation :round_to_precision
|
||||
before_save :member_discount, :round_to_precision
|
||||
after_update :update_stock_journal
|
||||
|
||||
scope :open_invoices, -> { where("sale_status = 'new' and receipt_date BETWEEN '#{DateTime.now.utc.end_of_day}' AND '#{DateTime.now.utc.beginning_of_day}'") }
|
||||
@@ -1207,7 +1207,7 @@ def self.get_menu_item_query(order_by)
|
||||
end
|
||||
#product sale report query
|
||||
|
||||
def self.get_shift_sales_by_receipt_no(shift_sale_range,shift,from,to,payment_type)
|
||||
def self.get_shift_sales_by_receipt_no(shift_sale_range, shift, from, to, payment_type, customer_filter)
|
||||
## => left join -> show all sales although no orders
|
||||
if payment_type.blank?
|
||||
payment_type = ''
|
||||
@@ -1215,29 +1215,40 @@ def self.get_shift_sales_by_receipt_no(shift_sale_range,shift,from,to,payment_ty
|
||||
payment_type = " and sale_payments.payment_method = '#{payment_type}'"
|
||||
end
|
||||
|
||||
query = Sale.includes(:sale_items).select("sales.*,sale_payments.*,df.name,df.type")
|
||||
query = Sale.includes(:sale_items).select("sales.*, sale_payments.*")
|
||||
.select("customers.customer_id, customers.name as customer_name, 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 customer_filter.present?
|
||||
query = query.joins(sanitize_sql_array(["INNER JOIN customers ON customers.customer_id = sales.customer_id AND " +
|
||||
"customers.name LIKE :filter", filter: "%#{customer_filter}%"]))
|
||||
else
|
||||
query = query.joins(:customer)
|
||||
end
|
||||
|
||||
if 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)
|
||||
query = query.where("sales.shift_sale_id in (?)", shift_sale_range.to_a)
|
||||
else
|
||||
query = query.where("sales.receipt_date between ? and ?",from,to)
|
||||
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)
|
||||
def self.get_shift_sales_by_receipt_no_detail(shift_sale_range, shift, from, to, payment_type, customer_filter)
|
||||
## => left join -> show all sales although no orders
|
||||
|
||||
query = Sale.includes([:customer, :survey, :sale_payments])
|
||||
.includes(:bookings => :dining_facility)
|
||||
query = Sale.includes([:survey, :sale_payments])
|
||||
.select("sales.*, SUM(sale_payments.payment_amount) AS payments_for_credits_amount")
|
||||
.joins(:bookings)
|
||||
.select("dining_facilities.type AS table_type, dining_facilities.name AS table_name")
|
||||
.select("customers.customer_id, customers.name AS customer_name, customers.company AS customer_company")
|
||||
.joins(:booking => :dining_facility)
|
||||
.joins("INNER JOIN sale_payments sp ON sp.sale_id = sales.sale_id")
|
||||
.left_joins(:payments_for_credits)
|
||||
.completed
|
||||
@@ -1245,6 +1256,13 @@ def self.get_shift_sales_by_receipt_no_detail(shift_sale_range,shift,from,to,pay
|
||||
.group(:sale_id)
|
||||
.order(:receipt_date)
|
||||
|
||||
if customer_filter.present?
|
||||
query = query.joins(sanitize_sql_array(["INNER JOIN customers ON customers.customer_id = sales.customer_id AND " +
|
||||
"customers.name LIKE :filter", filter: "%#{customer_filter}%"]))
|
||||
else
|
||||
query = query.joins(:customer)
|
||||
end
|
||||
|
||||
if payment_type.present?
|
||||
if payment_type == 'card'
|
||||
query = query.where(sanitize_sql_array(["sp.payment_method IN (?)", SalePayment::CARD]))
|
||||
@@ -1266,7 +1284,7 @@ def self.get_shift_sales_by_receipt_no_detail(shift_sale_range,shift,from,to,pay
|
||||
return query
|
||||
end
|
||||
|
||||
def self.get_by_shift_sale_credit_payment(shift_sale_range,shift,from,to,filter,order_source)
|
||||
def self.get_by_shift_sale_credit_payment(shift_sale_range,shift,from,to,filter,customer_filter,order_source)
|
||||
payments_for_credits = SalePayment.select("
|
||||
sales.sale_id,
|
||||
DATE_FORMAT(CONVERT_TZ(sale_payments.created_at,'+00:00','+06:30'),'%d %b %y %h:%i%p') as credit_payment_receipt_date,
|
||||
@@ -1293,11 +1311,17 @@ def self.get_by_shift_sale_credit_payment(shift_sale_range,shift,from,to,filter,
|
||||
IFNULL(payments_for_credits.credit_payment_cashier_name, '-') as credit_payment_cashier_name,
|
||||
IFNULL(payments_for_credits.credit_payment_shift_name, '-') as credit_payment_shift_name")
|
||||
.joins("LEFT JOIN (#{payments_for_credits}) payments_for_credits ON payments_for_credits.sale_id = sales_sale_payments.sale_id")
|
||||
.joins(:sale => :customer)
|
||||
.joins(:sale => :orders)
|
||||
.credits
|
||||
.where("sales_sale_payments.sale_status = ?", 'completed')
|
||||
|
||||
if customer_filter.present?
|
||||
credits = credits.joins(sanitize_sql_array(["INNER JOIN customers ON customers.customer_id = sales_sale_payments.customer_id AND " +
|
||||
"customers.name LIKE :filter", filter: "%#{customer_filter}%"]))
|
||||
else
|
||||
credits = credits.joins(:sale => :customer)
|
||||
end
|
||||
|
||||
if order_source.present?
|
||||
if order_source == "cashier"
|
||||
credits = credits.where("orders.source IN (?)", ['cashier', 'emenu'])
|
||||
@@ -2412,6 +2436,50 @@ private
|
||||
end
|
||||
end
|
||||
|
||||
def member_discount
|
||||
return unless will_save_change_to_customer_id? || will_save_change_to_total_amount?
|
||||
|
||||
if self.customer && self.customer.membership_id.present?
|
||||
membership = MembershipSetting.find_by_membership_type("paypar_url")
|
||||
memberaction = MembershipAction.find_by_membership_type("get_member_campaign")
|
||||
merchant_uid = memberaction.merchant_account_id.to_s
|
||||
campaign_type_id = memberaction.additional_parameter["campaign_type_id"]
|
||||
auth_token = memberaction.auth_token
|
||||
url = "#{membership.gateway_url}#{memberaction.gateway_url}"
|
||||
|
||||
begin
|
||||
response = HTTParty.get(url,
|
||||
:body => {
|
||||
member_group_id: sObj.customer.membership_type,
|
||||
merchant_uid: merchant_uid,
|
||||
campaign_type_id: campaign_type_id,
|
||||
auth_token: auth_token
|
||||
}.to_json,
|
||||
:headers => {
|
||||
'Content-Type' => 'application/json',
|
||||
'Accept' => 'application/json; version=3'
|
||||
}, :timeout => 10)
|
||||
rescue Net::OpenTimeout
|
||||
response = { "status": false , "message": " Connection timeout" }
|
||||
rescue OpenURI::HTTPError
|
||||
response = { "status": false, "message": "Can't connect server"}
|
||||
rescue SocketError
|
||||
response = { "status": false, "message": "Can't connect server"}
|
||||
end
|
||||
|
||||
return unless response['status'] && response['membership_campaign_data'].present?
|
||||
|
||||
Account.where(discount: true).inject(0) do |dis, acc|
|
||||
rule = response['membership_campaign_data'].find { |c| c['rules_type'].downcase.strip == acc.title.downcase.strip }
|
||||
dis += acc.sale_items.inject(0) { |i| i.account_id == acc.id ? i.price : 0 } * rule["change_unit"].to_i / rule["base_unit"].to_i
|
||||
end
|
||||
|
||||
|
||||
else
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
def round_to_precision
|
||||
if (self.total_amount % 1 > 0 || self.total_discount % 1 > 0 || self.total_tax % 1 > 0)
|
||||
self.total_amount = self.total_amount.round(precision)
|
||||
|
||||
@@ -4,10 +4,11 @@ class TaxProfile < ApplicationRecord
|
||||
default_scope { order('order_by asc') }
|
||||
# validations
|
||||
validates_presence_of :name, :rate, :group_type
|
||||
|
||||
def self.calculate_tax(group_type)
|
||||
divided_value =0.0
|
||||
exclusive =0.0
|
||||
tax_profiles = TaxProfile.where(group_type: group_type,tax_type: 'Percentage')
|
||||
tax_profiles = TaxProfile.where(group_type: group_type, tax_type: 'Percentage')
|
||||
if !tax_profiles.empty?
|
||||
tax_profiles.each do |tax|
|
||||
#include or execulive
|
||||
|
||||
Reference in New Issue
Block a user