264 lines
5.6 KiB
Ruby
264 lines
5.6 KiB
Ruby
class PCustomer < ActiveRecord::Base
|
|
has_many :particulars, :as => :owner, :dependent => :destroy
|
|
|
|
has_many :p_contacts, :as => :contactable
|
|
accepts_nested_attributes_for :p_contacts
|
|
|
|
has_many :p_customer_sheets
|
|
|
|
accepts_nested_attributes_for :particulars
|
|
|
|
belongs_to :particular
|
|
accepts_nested_attributes_for :particular
|
|
|
|
has_secure_password validations: false
|
|
|
|
|
|
validates_presence_of :password, :on => :create, :if => :public_validation?
|
|
|
|
validates :email, :presence => true, :uniqueness => true, :format => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\z/i, :if => :public_validation?
|
|
|
|
validates :siren, :presence => true, :if => :valid_siren?
|
|
validates :ape, :presence => true, :if => :valid_siren?
|
|
|
|
has_many :p_documents
|
|
|
|
has_many :p_payments
|
|
belongs_to :p_price_cat
|
|
|
|
has_many :p_compta_elements
|
|
|
|
has_many :mail_histories
|
|
|
|
|
|
|
|
#acts_as_caching :fields => [:total_ht, :total_tva, :total_ttc]
|
|
|
|
|
|
acts_as_sorting :fields => {
|
|
|
|
#:code => {:name => "Code", :reorder => true},
|
|
:show_name => {:name => "Nom", :reorder => false},
|
|
:particular_cp => {:name => "CP", :reorder => false},
|
|
:particular_city => {:name => "Ville", :reorder => true},
|
|
:email => {:name => "Email", :reorder => true},
|
|
:cache_encours => {:name => "Encours", :reorder => true},
|
|
:emails => {:name => "Nbr emails", :reorder => true},
|
|
:actions => {:name => "Actions", :reorder => false}
|
|
}
|
|
|
|
|
|
|
|
|
|
attr_accessor :valid_public, :generate_mdp, :valid_siren
|
|
before_validation do
|
|
self.generate_token if !self.token? and self.email?
|
|
end
|
|
|
|
|
|
|
|
def update_caches
|
|
|
|
self.cache_encours = self.encours_ttc
|
|
#
|
|
self.cache_payments = self.paiements_total
|
|
|
|
self.cache_ca = self.ca_ht
|
|
|
|
self.cache_ca_ttc = self.ca_ttc
|
|
|
|
self.save
|
|
|
|
|
|
end
|
|
|
|
def ca_ht
|
|
0
|
|
end
|
|
|
|
def ca_ttc
|
|
0
|
|
end
|
|
|
|
def valid_siren?
|
|
true if self.valid_siren
|
|
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
|
|
|
|
|
|
if self.save
|
|
|
|
|
|
|
|
mail_history = MailHistory.generateMail("generation_mdp", self.email, {:element => self, :p_customer => self, :mail_options => {:arguments => {:mdp => ps}}})
|
|
|
|
mail_history.deliver_mail
|
|
|
|
|
|
|
|
|
|
else
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
|
|
def public_validation?
|
|
true if self.valid_public
|
|
end
|
|
|
|
before_create do
|
|
self.generate_token
|
|
end
|
|
|
|
def generate_token
|
|
begin
|
|
self.token = SecureRandom.urlsafe_base64
|
|
end while PCustomer.exists?(:token => self.token)
|
|
end
|
|
|
|
|
|
|
|
before_validation do
|
|
|
|
if !self.p_price_cat
|
|
self.p_price_cat = PPriceCat.first
|
|
end
|
|
generate_mlm_token
|
|
|
|
|
|
|
|
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 self.for_search(search)
|
|
PCustomer.joins(:particular).where("code LIKE ? or particulars.organisation LIKE ? or particulars.name LIKE ? or particulars.firstname LIKE ?","%#{search}%", "%#{search}%", "%#{search}%", "%#{search}%")
|
|
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 show_name
|
|
if self.particular
|
|
n = ""
|
|
n += self.particular.organisation+" " if self.particular.organisation?
|
|
n += self.particular.name+" " if self.particular.name?
|
|
n += self.particular.firstname+" " if self.particular.firstname?
|
|
return n
|
|
end
|
|
end
|
|
|
|
after_create do
|
|
if !self.particular and self.particulars.count > 0
|
|
self.particular = self.particulars.first
|
|
self.save
|
|
|
|
end
|
|
|
|
self.update_caches
|
|
end
|
|
|
|
|
|
def send_password_reset
|
|
|
|
|
|
begin
|
|
self[:reset_password_token] = SecureRandom.urlsafe_base64
|
|
end while PCustomer.exists?(:reset_password_token => self[:reset_password_token])
|
|
|
|
self.reset_password_sent_at = Time.now
|
|
|
|
|
|
|
|
|
|
self.save(:validate => false)
|
|
PCustomerMailer.password_reset(self).deliver
|
|
end
|
|
|
|
|
|
def encours_ttc
|
|
self.solde_avoir_and_bills - self.paiements_total
|
|
end
|
|
|
|
def encours_at(date)
|
|
self.solde_avoir_and_bills(date) - self.paiements_total(date)
|
|
end
|
|
|
|
def solde_avoir_and_bills(date = Date.today)
|
|
self.p_documents.where(:p_document_type_id => PDocument::COMPTA_DOC_TYPES).where("created_at < ?", date.to_time.end_of_day).sum(:cache_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
|
|
|
|
|
|
|
|
|
|
end
|