251 lines
8.0 KiB
Ruby
251 lines
8.0 KiB
Ruby
class VContact < ApplicationRecord
|
|
|
|
has_many :mail_hists
|
|
|
|
belongs_to :societe, :foreign_key => :codeproprietaire, :primary_key => :socmanaginn
|
|
belongs_to :centre_o, :foreign_key => :codeproprietaire, :primary_key => :socmanaginn, :class_name => "Societe"
|
|
|
|
validates :codemanaginn, :presence => true, :uniqueness => true
|
|
|
|
validates :nom, :presence => true
|
|
validates :prenom, :presence => true
|
|
|
|
acts_as_sorting :fields => {
|
|
:actions => {:name => "Actions", :reorder => true},
|
|
:id => {:name => "Id", :reorder => true},
|
|
:codemanaginn => {:name => "Numéro CCV", :reorder => true},
|
|
#:nomgroupe => {:name => "Nomgroupe", :reorder => true},
|
|
:v_societe => {:name => "Societé", :reorder => false},
|
|
:civilite => {:name => "Civilité", :reorder => true},
|
|
:nom => {:name => "Nom", :reorder => true},
|
|
:prenom => {:name => "Prénom", :reorder => true},
|
|
#:titre => {:name => "Titre", :reorder => true},
|
|
:mailto => {:name => "Email", :reorder => true},
|
|
#:mailcc => {:name => "Email (cc)", :reorder => true},
|
|
#:mailbcc => {:name => "Email (bcc)", :reorder => true},
|
|
:numportable => {:name => "Portable", :reorder => true},
|
|
:numtel => {:name => "Tel", :reorder => true},
|
|
#:numfax => {:name => "Fax", :reorder => true},
|
|
:adresse1 => {:name => "Adresse", :reorder => true},
|
|
:adresse2 => {:name => "Adresse (suite)", :reorder => true},
|
|
:codepostal => {:name => "Code postal", :reorder => true},
|
|
:ville => {:name => "Ville", :reorder => true},
|
|
#:anniversaire => {:name => "Anniversaire", :reorder => true},
|
|
#:pays => {:name => "Pays", :reorder => true},
|
|
#:photo => {:name => "Photo", :reorder => true},
|
|
#:login => {:name => "Login", :reorder => true},
|
|
#:password => {:name => "Password", :reorder => true},
|
|
#:typeuser => {:name => "Typeuser", :reorder => true},
|
|
#:commentaire => {:name => "Commentaire", :reorder => true},
|
|
:codeproprietaire => {:name => "Code societé", :reorder => true},
|
|
#:typepartage => {:name => "Typepartage", :reorder => true},
|
|
#:libre1 => {:name => "Libre 1", :reorder => true},
|
|
#:libre2 => {:name => "Libre 2", :reorder => true},
|
|
#:libre3 => {:name => "Libre 3", :reorder => true},
|
|
#:libre4 => {:name => "Libre 4", :reorder => true},
|
|
#:libre5 => {:name => "Libre 5", :reorder => true},
|
|
#:accesbloque => {:name => "Accesbloque", :reorder => true},
|
|
:corbeille => {:name => "Corbeille", :reorder => true},
|
|
#:codecreateur => {:name => "Codecreateur", :reorder => true},
|
|
#:partagedefaut => {:name => "Partagedefaut", :reorder => true},
|
|
#:npai => {:name => "Npai", :reorder => true},
|
|
#:npaimail => {:name => "Npaimail", :reorder => true},
|
|
#:npaisms => {:name => "Npaisms", :reorder => true},
|
|
#:rate => {:name => "Rate", :reorder => true},
|
|
|
|
#:prime => {:name => "Prime", :reorder => true},
|
|
#:nbr_vidanges => {:name => "Nbr_vidanges", :reorder => true},
|
|
#:vidanges_seuil => {:name => "Vidanges_seuil", :reorder => true},
|
|
#:vidanges_offerte => {:name => "Vidanges_offerte", :reorder => true},
|
|
|
|
:datecreation => {:name => "Datecreation", :reorder => true},
|
|
|
|
:last_volume_at => {:name => "Dernier mouvement", :reorder => true},
|
|
#:ac_rate => {:name => "Ac_rate", :reorder => true},
|
|
:enabled => {:name => "Actif ?", :reorder => true, :as => :boolean},
|
|
:nbr_mvt => {:name => "Nbr_mvt", :reorder => true},
|
|
:cc_centre => {:name => "Centre", :reorder => true},
|
|
:cc_total => {:name => "Historique CA", :reorder => true, :as => :currency},
|
|
:cc_cagnotte => {:name => "Cumul", :reorder => true, :as => :currency}
|
|
#:cc_remise => {:name => "Remises", :reorder => true, :as => :currency},
|
|
|
|
#:created_at => {:name => "Created_at", :reorder => true},
|
|
#:updated_at => {:name => "Updated_at", :reorder => true},
|
|
|
|
}
|
|
|
|
after_destroy do
|
|
self.volumes.destroy_all
|
|
end
|
|
|
|
acts_as_caching :fields => [:cagnotte, :total, :remise, :centre]
|
|
|
|
has_many :v_bdas
|
|
|
|
before_create do
|
|
self.enabled = true
|
|
end
|
|
|
|
|
|
def generate_ba
|
|
if self.societe.bon_type == "Bon d'achat" and self.societe.seuil? and self.societe.seuil <= self.cagnotte
|
|
self.v_bdas.create(:date => Date.today, :amount => self.societe.bon_amount, :seuil => self.societe.seuil, :bda_type => "bda")
|
|
|
|
end
|
|
end
|
|
|
|
def max_ri_amount
|
|
(self.cagnotte * (self.societe.remise_percent/100)).to_i if self.societe and self.societe.remise_percent.to_f != 0.0 and self.cagnotte.to_f != 0.0
|
|
|
|
end
|
|
|
|
def ca_centre
|
|
|
|
self.centre_o.nom if self.centre_o
|
|
|
|
end
|
|
|
|
def ca_cagnotte
|
|
self.volumes.select("valeur","datereception").sum(:valeur)
|
|
|
|
|
|
end
|
|
|
|
def ca_total
|
|
self.volumes.where("valeur > 0.0").sum(:valeur)
|
|
end
|
|
|
|
def ca_remise
|
|
self.volumes.where("valeur < 0.0").sum(:valeur)
|
|
end
|
|
|
|
before_validation do
|
|
self.ac_centre = nil
|
|
self.nbr_mvt = self.volumes.count
|
|
if lt = self.volumes.order("datedebut DESC").select("datedebut").first
|
|
self.last_volume_at = lt.datedebut
|
|
end
|
|
if self.societe
|
|
self.societe_id = self.societe.id
|
|
else
|
|
self.societe_id = nil
|
|
end
|
|
end
|
|
|
|
|
|
def volumes
|
|
VolumePeriodique.where(:codemanaginn => self.codemanaginn, :codeindicateur => "MGI000000001") #.order("datereception DESC")
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.update_caches(force = false)
|
|
|
|
|
|
@gen_past_time = Time.now
|
|
|
|
if !force
|
|
v_contacts = VContact.where(:enabled => true, :nbr_mvt => nil)
|
|
else
|
|
v_contacts = VContact.where(:enabled => true)
|
|
end
|
|
|
|
#v_contacts = v_contacts.limit(2)
|
|
|
|
v_contacts.each do |vc|
|
|
puts vc.codemanaginn
|
|
vc.cumul = vc.volumes.select("valeur","datereception").where("valeur > 0.0").sum(:valeur)
|
|
vc.cagnotte = vc.volumes.select("valeur","datereception").sum(:valeur)
|
|
vc.nbr_mvt = vc.volumes.count
|
|
|
|
vc.last_volume_at = vc.volumes.select("datereception").first.datereception if vc.volumes.first
|
|
|
|
vc.prime = (vc.ac_rate.to_f / 100.0) * vc.cagnotte
|
|
|
|
vc.save
|
|
end
|
|
to_delete = VContact.where("(last_volume_at is NULL and datecreation < ?) or (last_volume_at < ?)", (Date.today-5.year), (Date.today-5.year))
|
|
|
|
puts VolumePeriodique.count
|
|
codes = to_delete.map{|a| a.codemanaginn}
|
|
codes = codes.reject { |e| e.to_s.empty? }
|
|
VolumePeriodique.where(:codemanaginn => codes).destroy_all
|
|
to_delete.destroy_all
|
|
|
|
if @gen_past_time
|
|
|
|
return "Rendu en #{(Time.now - @gen_past_time).round(3)}s"
|
|
else
|
|
|
|
return false
|
|
|
|
end
|
|
|
|
|
|
end
|
|
|
|
def self.set_valid_cards
|
|
VContact.where(:codeproprietaire => Societe.where(:enabled => true).pluck(:socmanaginn)).update_all(:enabled => true)
|
|
end
|
|
|
|
def self.update_centre_name
|
|
Societe.where(:enabled => true).find_each do |s|
|
|
s.v_contacts.update_all(:cc_centre => s.nom)
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def self.update_mvt
|
|
|
|
|
|
# Mettre nbr_mvt à 0 pour toutes les cartes actives qui n'ont pas eu de mouvement
|
|
|
|
vc_ids = VolumePeriodique.select(:codemanaginn).group(:codemanaginn).map{|a| a.codemanaginn}
|
|
|
|
|
|
VContact.where(:enabled => true).where("codemanaginn not in(?)", vc_ids).update_all(:nbr_mvt => 0, :cc_cagnotte => 0, :cc_total => 0, :cc_remise => 0)
|
|
|
|
return true
|
|
end
|
|
|
|
def self.update_non_nil
|
|
VContact.where(:enabled => true).where(:nbr_mvt => nil).find_each do |vc|
|
|
vc.save
|
|
|
|
end
|
|
end
|
|
|
|
def self.update_all_cards
|
|
VContact.where(:enabled => true).find_each do |vc|
|
|
vc.save
|
|
|
|
end
|
|
end
|
|
|
|
|
|
def member_label
|
|
"#{self.codemanaginn} - #{self.nom} #{self.prenom}"
|
|
end
|
|
|
|
|
|
def self.update_code_proprietaires
|
|
VContact.where("codecreateur is not NULL and codecreateur != ''").find_each do |vc|
|
|
if societe = Societe.where(:socmanaginn => vc.codecreateur.upcase).first
|
|
|
|
vc.a_codeproprietaire = vc.codeproprietaire if !vc.a_codeproprietaire?
|
|
vc.codeproprietaire = societe.socmanaginn
|
|
vc.save
|
|
|
|
|
|
|
|
end
|
|
end
|
|
|
|
|
|
end
|
|
|
|
end
|