Merge branch 'r-1902001-01' into foodcourt

This commit is contained in:
Thein Lin Kyaw
2020-07-19 19:44:59 +06:30
17 changed files with 240 additions and 146 deletions

View File

@@ -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

View File

@@ -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)

View File

@@ -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