224 lines
8.4 KiB
Ruby
224 lines
8.4 KiB
Ruby
class Customer < ApplicationRecord
|
|
|
|
#self.primary_key = :customer_id
|
|
|
|
before_create :generate_custom_id
|
|
has_many :orders
|
|
has_many :sales
|
|
|
|
validates_presence_of :name, :contact_no, :email,:card_no
|
|
validates :contact_no, uniqueness: true, numericality: true
|
|
validates :email, uniqueness: true,format: { with: /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, on: :create }
|
|
validates :card_no, uniqueness: true
|
|
validates :paypar_account_no, uniqueness: true
|
|
|
|
paginates_per 50
|
|
|
|
def self.get_member_account(customer)
|
|
membership = MembershipSetting.find_by_membership_type("paypar_url")
|
|
memberaction = MembershipAction.find_by_membership_type("get_all_member_account")
|
|
merchant_uid = memberaction.merchant_account_id.to_s
|
|
auth_token = memberaction.auth_token.to_s
|
|
url = membership.gateway_url.to_s + memberaction.gateway_url.to_s
|
|
# urltest =self.url_exist?(url)
|
|
|
|
begin
|
|
response = HTTParty.get(url, :body => { membership_id: customer.membership_id,merchant_uid:merchant_uid,auth_token:auth_token}.to_json,
|
|
:headers => {
|
|
'Content-Type' => 'application/json',
|
|
'Accept' => 'application/json'
|
|
},
|
|
:timeout => 10
|
|
)
|
|
rescue HTTParty::Error
|
|
response = {status: false, message: "Server Error"}
|
|
|
|
rescue Net::OpenTimeout
|
|
response = { status: false , message: "Server Time out"}
|
|
|
|
rescue OpenURI::HTTPError
|
|
response = { status: false, message: "Can't connect server"}
|
|
|
|
rescue SocketError
|
|
response = { status: false, message: "Can't connect server"}
|
|
end
|
|
|
|
return response;
|
|
|
|
end
|
|
|
|
def self.get_membership_transactions(customer,receipt_no = nil)
|
|
membership = MembershipSetting.find_by_membership_type("paypar_url")
|
|
memberaction = MembershipAction.find_by_membership_type("get_member_transactions")
|
|
merchant_uid = memberaction.merchant_account_id.to_s
|
|
auth_token = memberaction.auth_token.to_s
|
|
url = membership.gateway_url.to_s + memberaction.gateway_url.to_s
|
|
# urltest =self.url_exist?(url)
|
|
|
|
begin
|
|
response = HTTParty.get(url,
|
|
:body => { membership_id: customer.membership_id,
|
|
receipt_no:receipt_no,
|
|
merchant_uid:merchant_uid,auth_token:auth_token
|
|
}.to_json,
|
|
:headers => {
|
|
'Content-Type' => 'application/json',
|
|
'Accept' => 'application/json'
|
|
},
|
|
:timeout => 10
|
|
)
|
|
rescue HTTParty::Error
|
|
response = {status: false, message: "Can't open membership server " }
|
|
|
|
rescue Net::OpenTimeout
|
|
response = { status: false , message: "Server Time out"}
|
|
|
|
rescue OpenURI::HTTPError
|
|
response = { status: false, message: "Can't connect server"}
|
|
|
|
rescue SocketError
|
|
response = { status: false, message: "Can't connect server"}
|
|
end
|
|
|
|
return response;
|
|
|
|
end
|
|
|
|
def self.update_membership
|
|
membership = MembershipSetting.find_by_membership_type("paypar_url")
|
|
memberaction = MembershipAction.find_by_membership_type("create_membership_customer")
|
|
merchant_uid = memberaction.merchant_account_id.to_s
|
|
auth_token = memberaction.auth_token.to_s
|
|
url = membership.gateway_url.to_s + memberaction.gateway_url.to_s
|
|
|
|
@customers = Customer.where("membership_type IS NOT NULL AND membership_id IS NULL")
|
|
|
|
@customers.each do |customer|
|
|
begin
|
|
response = HTTParty.post(url,
|
|
:body =>
|
|
{ name: customer.name,phone: customer.contact_no,
|
|
email: customer.email,dob: customer.date_of_birth,
|
|
address: customer.address,nrc:customer.nrc_no,
|
|
card_no:customer.card_no,member_group_id: customer.membership_type,
|
|
merchant_uid:merchant_uid,auth_token:auth_token
|
|
}.to_json,
|
|
:headers => {
|
|
'Content-Type' => 'application/json',
|
|
'Accept' => 'application/json'
|
|
})
|
|
rescue Net::OpenTimeout
|
|
response = { status: false, message: "Server Time out" }
|
|
|
|
rescue OpenURI::HTTPError
|
|
response = { status: false, message: "Can't connect server"}
|
|
|
|
rescue SocketError
|
|
response = { status: false, message: "Can't connect server"}
|
|
end
|
|
|
|
if response["status"] == true
|
|
status = customer.update_attributes(membership_id: response["customer_datas"]["id"])
|
|
end
|
|
|
|
end
|
|
end
|
|
|
|
def self.update_rebate
|
|
|
|
sales = Sale.where("rebate_status = 'false'")
|
|
sales.each do |sale|
|
|
if sale.customer.membership_id
|
|
response = self.rebat(Sale.find(sale.sale_id))
|
|
puts response.to_json
|
|
if response["status"] == true
|
|
status = sale.update_attributes(rebate_status: "true")
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
def self.rebat(sObj)
|
|
rebate_prices = SaleItem.calculate_rebate_by_account(sObj.sale_items)
|
|
|
|
generic_customer_id = sObj.customer.membership_id
|
|
if generic_customer_id.present?
|
|
paypar = sObj.sale_payments
|
|
payparcost = 0
|
|
credit = 0
|
|
paypar.each do |pp|
|
|
if pp.payment_method == "paypar"
|
|
payparcost = payparcost + pp.payment_amount
|
|
elsif pp.payment_method == "creditnote"
|
|
credit = 1
|
|
end
|
|
end
|
|
# overall_dis = SaleItem.get_overall_discount(sObj.id)
|
|
overall_dis = sObj.total_discount
|
|
|
|
total_amount = rebate_prices - payparcost - overall_dis
|
|
if credit == 1
|
|
total_amount = 0
|
|
end
|
|
if total_amount >= 0
|
|
receipt_no = sObj.receipt_no
|
|
membership = MembershipSetting.find_by_membership_type("paypar_url")
|
|
memberaction = MembershipAction.find_by_membership_type("rebate")
|
|
merchant_uid = memberaction.merchant_account_id.to_s
|
|
campaign_type_id = memberaction.additional_parameter["campaign_type_id"]
|
|
auth_token = memberaction.auth_token.to_s
|
|
url = membership.gateway_url.to_s + memberaction.gateway_url.to_s
|
|
|
|
# Control for Paypar Cloud
|
|
begin
|
|
response = HTTParty.post(url, :body => { generic_customer_id:generic_customer_id ,total_sale_transaction_amount: sObj.grand_total,merchant_uid:merchant_uid,total_amount: total_amount,campaign_type_id: campaign_type_id,
|
|
receipt_no: receipt_no,auth_token:auth_token}.to_json,
|
|
:headers => {
|
|
'Content-Type' => 'application/json',
|
|
'Accept' => 'application/json'
|
|
}, :timeout => 10)
|
|
rescue Net::OpenTimeout
|
|
response = { "status": false , "message": "Connect To" }
|
|
|
|
|
|
rescue OpenURI::HTTPError
|
|
response = { "status": false, "message": "Can't connect server"}
|
|
|
|
rescue SocketError
|
|
response = { "status": false, "message": "Can't connect server"}
|
|
|
|
end
|
|
return response
|
|
puts response.to_json
|
|
end
|
|
end
|
|
end
|
|
|
|
def self.search(search)
|
|
if search
|
|
# find(:all, :conditions => ['name LIKE ? OR contact_no LIKE ?', "%#{search}%", "%#{search}%"])
|
|
where("name LIKE ? OR contact_no LIKE ? OR card_no LIKE ? OR paypar_account_no ='#{search}'", "%#{search}%", "%#{search}%", "%#{search}%",)
|
|
else
|
|
find(:all)
|
|
end
|
|
end
|
|
|
|
def lastest_invoices
|
|
sales.where(:customer_id => self.id).order("created_at desc").limit(5)
|
|
end
|
|
|
|
def self.count_customer
|
|
all = self.all.count+1
|
|
count = all-2
|
|
|
|
end
|
|
|
|
WALKIN = "CUS-000000000001"
|
|
TAKEAWAY = "CUS-000000000002"
|
|
|
|
private
|
|
def generate_custom_id
|
|
self.customer_id = SeedGenerator.generate_id(self.class.name, "CUS")
|
|
end
|
|
end
|