mmsc_app/app/models/p_customer.rb
Nicolas Bally f4ccdc82dc suite
2020-07-23 11:17:11 +02:00

616 lines
15 KiB
Ruby

class PCustomer < ApplicationRecord
acts_as_tree
has_many :particular_hists
has_many :price_documents
has_many :particulars, :as => :owner, :dependent => :destroy
has_many :p_contact_ps, :class_name => "PContact", :through => :particulars, :source => :p_contacts
has_many :p_contacts, :as => :contactable, :dependent => :destroy
accepts_nested_attributes_for :p_contacts, allow_destroy: true
has_many :p_customer_sheets
has_many :p_sheet_lines, :through => :p_customer_sheets
has_many :p_products, :through => :p_customer_sheets
accepts_nested_attributes_for :particulars
belongs_to :particular
accepts_nested_attributes_for :particular
has_many :p_payments
belongs_to :p_customer_cat
has_many :p_documents
#validates :code, :presence => true, :uniqueness => true
has_many :p_compta_elements
belongs_to :accounting_zone
belongs_to :market_discount
has_many :timer_watchers
has_many :open_range_elements, :as => :element
has_many :open_ranges, :through => :open_range_elements
belongs_to :p_commercial
has_many :mail_hists
has_many :m_odr_rep_ribs, :dependent => :destroy
has_many :m_odr_files
has_many :m_odr_primes
has_many :p_customer_ribs, :dependent => :destroy
accepts_nested_attributes_for :p_customer_ribs, :allow_destroy => true
has_secure_password validations: false
validates :password, :presence => true, :if => :password_needed?
validates :password, confirmation: { case_sensitive: true }, :presence => true, :if => :password_needed?
validates :email, :presence => true, :uniqueness => true
validates :cgv, :presence => true, :if => :require_cgv
#validates :rgpd, :presence => true, :if => :require_cgv
validates :past_id, :uniqueness => true, :if => :imported
acts_as_caching :fields => [:show_name]
attr_accessor :refresh_import
def do_import
if self.imp_iban? and self.imp_bic?
puts "RIB PRESENT"
if rib = self.m_odr_rep_ribs.first
puts "RIB EXISTANT"
rib.iban = self.imp_iban
rib.bic = self.imp_bic
rib.admin_ok = false
rib.save
else
puts "RIB CREER"
self.m_odr_rep_ribs.create(:bic => self.imp_bic, :iban => self.imp_iban, :admin_ok => nil)
end
end
if self.imp_test == "oui"
self.test_user = true
end
if self.particular
part = self.particular
else
part = Particular.new
part.owner = self
end
part.name = self.imp_name
part.firstname = self.imp_firstname
part.address_2 = self.imp_address
part.cp = self.imp_cp2
part.city = self.imp_city
part.country = "FR" if !part.country?
part.tel = self.imp_tel
self.particular = part
if self.imp_valid == "oui"
self.enabled = true
end
if self.imp_npai == "oui"
self.npai = true
end
if self.imp_stickers == "oui"
self.sticker = true
end
if circuit = Circuit.where(:past_id => self.imp_circuit_1).first
self.circuit_1_id = circuit.id
end
if circuit = Circuit.where(:past_id => self.imp_circuit_2).first
self.circuit_2_id = circuit.id
end
if circuit = Circuit.where(:past_id => self.imp_circuit_3).first
self.circuit_3_id = circuit.id
end
part.save
self.particular = part
self.refresh_import = nil
self.save
end
after_create do
puts "TEST1"
puts self.imp_email?
puts "TEST2"
self.do_import() if self.imp_email?
end
after_update do
self.do_import if self.refresh_import == "true"
end
acts_as_csv_import :fields =>[:imported, :email, :password, :past_id,:imp_cp,:imp_country,:imp_ref,:imp_email,:imp_firstname,:imp_name,:imp_fonction,:imp_organisme,:imp_address,:imp_cp2,:imp_city,:imp_tel,:imp_portable,:imp_lien,:imp_comment,:imp_iban,:imp_bic,:imp_circuit_1,:imp_circuit_2,:imp_circuit_3,:imp_partenaire,:imp_ecran,:imp_blocage,:imp_valid,:imp_user_valid,:imp_offre,:imp_info,:imp_cgu,:imp_test,:imp_stickers,:imp_npai,:npai,:imp_relance_adresse,:imp_demande_info,:imp_creation,:imp_modification, :refresh_import]
attr_accessor :actual_password, :valid_last_password, :valid_public, :generate_mdp, :valid_pswd_confirmation, :require_cgv
NBR_ROULAGES = ["Entre 1 et 2", "Entre 3 et 5", "Entre 6 et 8", "Entre 9 et 10", "> 10", "Pas pour l'instant"]
def particular_ok?
if self.particular and self.particular.address_2? and self.particular.cp? and self.particular.city? and self.particular.country?
true
else
false
end
end
def valid_m_odr_rep_rib
self.m_odr_rep_ribs.where(:admin_ok => true).order("id DESC").first
end
def verify_actual_password
self.authenticate(self.actual_password)
end
def password_needed?
if (!self.id and (!self.generate_mdp or self.generate_mdp == "0")) or self.valid_pswd_confirmation
true
else
false
end
end
after_commit do
self.generate_mdp_now if self.generate_mdp and self.generate_mdp != "0"
end
before_validation do
if self.valid_last_password and !PCustomer.find(self.id).authenticate(self.actual_password)
errors.add(:actual_password, 'ne correspond pas au mot de passe actuel')
end
end
before_create do
generate_token(:auth_token)
end
def generate_token(column)
begin
self[column] = SecureRandom.urlsafe_base64
end while PCustomer.exists?(column => self[column])
end
def generate_prime
MOdrFileRoulage.joins(:m_odr_file).where("m_odr_file_roulages.nbr_primes_useds = 0").where(:m_odr_files => {:p_customer_id => self.id, :admin_ok => true}).order("date ASC").all.each do |mofr|
mofr.generate_prime
end
end
def generate_mdp_now
ps = SecureRandom.hex(4)
self.password = ps
self.password_confirmation = ps
if !self.email?
errors.add(:email, "Doit être présent")
end
self.generate_mdp = false
if self.save
#GeneralMailer.send_qi_mail("fr", "generation_mdp", self.email, {"mdp" => ps}).deliver
mail_hist = MailHist.generate_mail(:fr, MailType.find_by_slug("generation_mdp"), self.email, {:arguments => {:mdp => ps, :civilite => self.particular.civilite, :nom => self.particular.name, :prenom => self.particular.firstname }, :p_customer => self, :element => self})
else
end
end
def self.qi_table_order
{
:created_at => {:name => "Date de création", :reorder => true, :as => :date},
:name => {:name => "Nom", :reorder => true, :sort_name => "particulars.name"},
:firstname => {:name => "Prénom", :reorder => true, :sort_name => "particulars.firstname"},
:mlm_token => {:name => "Code ambassadeur", :reorder => true},
:enabled => "Actif ?",
:test_user => "Utilisateur test ?",
:npai => "NPAI ?",
:sticker => "Stickers envoyés ?",
:particular_fill => "Adresse remplie ?",
:parent => "Ambassadeur",
:particular_cp => "Code postal",
:particular_city => "Ville",
:particular_country => "Pays",
:email => "Email",
:tel => "Téléphone",
:actions => "Actions"
}
#, :sort_name => "code"
end
def self.valid_sort
["code", "cc_show_name","particulars.firstname","particulars.name", "created_at", "cache_encours_th", "cache_encours", "cache_payments_th", "cache_payments", "cache_payments_tot", "cache_ca"]
end
def particular_fill?
true if self.particular.firstname? and self.particular.name? and self.particular.address_2? and self.particular.cp? and self.particular.city?
end
before_destroy do
if self.p_customer_sheets.count > 0 or self.p_payments.count > 0
false
else
true
end
end
def can_destroy?
if self.p_customer_sheets.count > 0 or self.p_payments.count > 0
return false
else
return true
end
end
after_initialize do
self.p_payment_type_id = 41 if !self.p_payment_type_id?
end
def self.find_parrain(token)
if token != ""
self.find_by_mlm_token(token.upcase)
else
nil
end
end
before_validation do
generate_mlm_token
if !self.id
if self.parent_code?
if mlm_parent = PCustomer.find_parrain(self.parent_code)
self.parent_id = mlm_parent.id
self.parent_at_create = true
else
errors.add(:parent_code, "Ce code ambassadeur n'est pas valide, merci de vérifier son exactitude. ")
end
end
end
if self.comptant
if self.acompte
errors.add(:acompte, "N'est pas compatible avec les paiements comptants")
end
if self.acompte_percent?
errors.add(:acompte_percent, "N'est pas compatible avec les paiements comptants")
end
if self.payment_delais?
errors.add(:payment_delais, "N'est pas compatible avec les paiements comptants")
end
if self.payment_fin_de_mois
errors.add(:payment_fin_de_mois, "N'est pas compatible avec les paiements comptants")
end
end
if self.acompte
if !self.acompte_percent?
errors.add(:acompte_percent, "Doit être remplis pour demander un acompte")
end
end
if !self.comptant
if !self.payment_delais?
errors.add(:payment_delais, "Délais de paiement nécessaire si pas de paiement comptant")
end
end
end
def update_caches
end
def ca_ht
0
end
def ca_ttc
0
end
def nbr_orders
self.p_customer_sheets.where(:state => "facturée")
end
def nbr_orders_refusees
self.p_customer_sheets.where(:state => "refusée")
end
def encours_assure
r = 0.0
r = self.p_customer_cat.encourt_max if self.p_customer_cat
r
end
def encours_assure_restant
self.encours_assure.to_f - self.encours_ttc.to_f
end
def encours_ttc
self.solde_avoir_and_bills - self.paiements_total
end
def th_r_encours_ttc
self.solde_avoir_and_bills - self.th_r_paiements_total
end
def encours_at(date)
self.solde_avoir_and_bills(date) - self.paiements_total(date)
end
def sheets_total_ht
self.p_customer_sheets.where(:state => "facturée").sum(:cc_tot_amount_ht)
end
def solde_avoir_and_bills(date = Date.today)
self.p_documents.where(:p_document_type_id => [4,7]).where("created_at < ?", date.to_time.end_of_day).sum(:cache_total_ttc)
end
def sheets_total_ttc(date = Date.today)
self.p_customer_sheets.where(:state => "facturée").where("created_at < ?", date.to_time.end_of_day).sum(:a_ok_total_ttc)
end
def paiements_total(date = Date.today)
self.p_payments.where(:paid => true).where("paid_at < ?", date.to_time.end_of_day).sum(:amount)
end
def th_paiements_total
self.p_payments.where(:paid => false).sum(:amount)
end
def th_r_paiements_total
self.p_payments.sum(:amount)
end
def self.for_search(search)
PCustomer.joins(:particulars).where("code LIKE ? or particulars.organisation LIKE ? or particulars.name LIKE ? or particulars.firstname LIKE ? or particulars.address_2 LIKE ? or particulars.address_3 LIKE ? or particulars.cp LIKE ? or particulars.city LIKE ?","%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%","%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%").uniq
end
def generate_mlm_token
if !self.mlm_token?
self.mlm_token = loop do
mlm_token = SecureRandom.hex(3).upcase
break mlm_token unless PCustomer.exists?(mlm_token: mlm_token)
end
end
end
def name
self.show_name
end
def member_label
self.show_name
end
def ca_show_name
if self.particular
n = ""
n += self.particular.organisation+" " if self.particular.organisation?
n += self.particular.firstname+" " if self.particular.firstname?
n += self.particular.name+" " if self.particular.name?
return n
end
end
def show_name_extend
if self.particular
n = ""
n += self.code.to_s+" "
n += self.particular.organisation+" " if self.particular.organisation?
n += self.particular.name+" " if self.particular.name?
n += self.particular.firstname+" " if self.particular.firstname?
n += self.particular.cp+" " if self.particular.cp?
n += self.particular.city+" " if self.particular.city?
return n
end
end
after_save do
if !self.particular and self.particulars.count > 0
self.particular = self.particulars.first
self.save
end
end
def archive_import
past_fact = self.p_documents.where("d_number regexp '^[0-9]+'").order("created_at DESC")
if past_fact.first
date = past_fact.first.created_at + 1.second
amount = past_fact.sum(:cache_total_ttc)
if !self.p_payments.where(:p_payment_type_id => 66).first
p_payment = self.p_payments.new(:p_payment_type_id => 66, :imported => true, :paid => true, :paid_at => date, :amount => amount)
p_payment.save
end
end
PPayment.where(:imported => true).update_all(:paid => true)
date = nil
self.p_payments.order("paid_at DESC").each do |pp|
enc = self.encours_at(pp.paid_at)
if enc == 0.0
date = pp.paid_at.end_of_day
break
end
end
self.p_customer_sheets.where(:state => "facturée", :imported => true).update_all(:i_archive => false)
self.p_documents.where(:label => "Facture", :imported => true).update_all(:i_archive => false)
self.p_payments.where(:imported => true).update_all(:i_archive => false)
self.p_customer_sheets.where(:state => "facturée", :imported => true).where("created_at < ?", date).update_all(:i_archive => true)
self.p_documents.where(:label => "Facture", :imported => true).where("created_at < ?", date).update_all(:i_archive => true)
self.p_payments.where(:imported => true).where("paid_at < ?", date).update_all(:i_archive => true) if date
return true
end
def csv_parent
if self.parent
self.parent.mlm_token.to_s+" - "+self.show_name.to_s
end
end
def csv_mlm_token
self.mlm_token if self.ambassadeur
end
def csv_tel
self.particular.tel if self.particular
end
def csv_name
self.particular.name if self.particular
end
def csv_firstname
self.particular.firstname if self.particular
end
def csv_particular_cp
self.particular.cp if self.particular
end
def csv_particular_city
self.particular.city if self.particular
end
def csv_particular_country
self.particular.country if self.particular
end
end