372 lines
7.8 KiB
Ruby
372 lines
7.8 KiB
Ruby
class PriceLine < ApplicationRecord
|
|
belongs_to :price_line_block
|
|
belongs_to :p_product
|
|
belongs_to :p_product_ref
|
|
default_scope { order('position ASC') }
|
|
|
|
validates :p_product_ref_id, :presence => true
|
|
validates :qte, :presence => true
|
|
attr_accessor :forced_price
|
|
|
|
QI_DYNAMICS = %w(product_no_remise price_calc weight_u weight_tot accounting_zone_id accounting_zone_name tva_account_id tva_account_value ref title description price_u_ht price_u_tva price_u_ttc tot_line_ht tot_line_tva tot_line_ttc tot_discount_ht tot_discount_tva tot_discount_ttc tot_amount_ht tot_amount_tva tot_amount_ttc discount_market_percent discount_qte_percent discount_delay_percent discount_enrobage_percent discount_ecole_percent discount_comptant_percent product_remise_enrobage_ok uv p_product_specific_customer_id)
|
|
|
|
|
|
eval(QI_DYNAMICS_CORE)
|
|
|
|
|
|
def personalised_archive
|
|
|
|
end
|
|
|
|
def personalised_unarchive
|
|
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
before_validation do
|
|
|
|
end
|
|
|
|
|
|
def ca_product_no_remise
|
|
self.p_product_ref.no_remise if self.p_product_ref
|
|
end
|
|
|
|
|
|
def ca_price_calc
|
|
self.p_product_ref.p_product.price_calc == "Kg" if self.p_product_ref and self.p_product_ref.p_product
|
|
|
|
end
|
|
|
|
def ca_p_product_specific_customer_id
|
|
if self.p_product_ref and self.p_product_ref.p_product
|
|
self.p_product_ref.p_product.p_customer_id
|
|
else
|
|
nil
|
|
end
|
|
end
|
|
|
|
def ca_weight_u
|
|
if self.p_product_ref
|
|
self.p_product_ref.weight
|
|
else
|
|
0.0
|
|
end
|
|
end
|
|
|
|
def ca_weight_tot
|
|
self.weight_u.to_f * self.qte.to_f
|
|
end
|
|
|
|
def ca_accounting_zone_id
|
|
self.price_line_block.accounting_zone_id if self.price_line_block
|
|
end
|
|
|
|
def ca_accounting_zone_name
|
|
self.price_line_block.accounting_zone_name
|
|
end
|
|
|
|
def ca_tva_account_id
|
|
if self.p_product_ref and self.p_product_ref.p_product and tva_rate = self.p_product_ref.p_product.tva_rate(self.accounting_zone_id)
|
|
return tva_rate.id
|
|
end
|
|
end
|
|
|
|
def ca_tva_account_value
|
|
if self.p_product_ref and self.p_product_ref.p_product and tva_rate = self.p_product_ref.p_product.tva_rate(self.accounting_zone_id)
|
|
return (tva_rate.rate).round(2)
|
|
|
|
else
|
|
return 0.0
|
|
end
|
|
end
|
|
|
|
def ca_ref
|
|
if self.p_product_ref and self.p_product_ref.p_product
|
|
self.p_product_ref.p_product.code
|
|
else
|
|
""
|
|
end
|
|
|
|
end
|
|
|
|
def ca_title
|
|
if self.p_product_ref
|
|
"#{self.p_product_ref.p_product.name} - #{self.p_product_ref.uv}"
|
|
else
|
|
""
|
|
end
|
|
end
|
|
|
|
def ca_uv
|
|
if self.p_product_ref
|
|
self.p_product_ref.uv
|
|
else
|
|
""
|
|
end
|
|
end
|
|
|
|
def ca_description
|
|
|
|
end
|
|
|
|
def th_price_u_ht
|
|
if self.p_product_ref
|
|
return self.p_product_ref.get_price(:p_customer_id => nil, :qte => self.qte)
|
|
else
|
|
return nil
|
|
end
|
|
end
|
|
|
|
def ca_price_u_ht
|
|
if self.ct_u_price_ht
|
|
return self.ct_u_price_ht
|
|
elsif self.p_product_ref
|
|
|
|
return self.p_product_ref.get_price(:p_customer_id => nil, :qte => self.qte)
|
|
|
|
|
|
|
|
else
|
|
return 0.0
|
|
end
|
|
end
|
|
|
|
def ca_price_u_kg_ht
|
|
|
|
if self.price_calc == "Kg"
|
|
|
|
if self.weight_u.to_f != 0.0
|
|
self.price_u_ht.to_f / self.weight_u.to_f
|
|
else
|
|
0
|
|
end
|
|
|
|
else
|
|
self.price_u_ht
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
def weight_qte
|
|
if self.price_calc == "Kg"
|
|
self.qte.to_f * self.weight_u.to_f
|
|
else
|
|
self.qte.to_f
|
|
end
|
|
|
|
end
|
|
|
|
|
|
def ca_price_u_tva
|
|
((self.tva_account_value/100) * self.price_u_ht).round(2)
|
|
end
|
|
|
|
def ca_price_u_ttc
|
|
(self.price_u_ht + self.price_u_tva).round(2)
|
|
end
|
|
|
|
|
|
|
|
def ca_tot_line_ht
|
|
(self.price_u_ht * self.qte.to_f).round(2)
|
|
end
|
|
|
|
def ca_tot_line_tva
|
|
(self.tot_line_ht * (self.tva_account_value/100)).round(2)
|
|
end
|
|
|
|
def ca_tot_line_ttc
|
|
(self.tot_line_ht + self.tot_line_tva).round(2)
|
|
end
|
|
|
|
|
|
|
|
|
|
# REMISES
|
|
|
|
# Remise marché annuel
|
|
def ca_discount_market_percent
|
|
if !self.product_no_remise and !self.ct_u_price_ht and !self.p_product_specific_customer_id and self.discount_ecole_percent == 0 and self.p_customer and self.p_customer.market_discount
|
|
self.p_customer.market_discount.percent
|
|
else
|
|
0.0
|
|
end
|
|
|
|
end
|
|
|
|
def ca_discount_market_ht
|
|
((1-(self.discount_market_percent.to_f / 100)) * self.ca_price_u_kg_ht)
|
|
end
|
|
|
|
|
|
# Remise quantité livrée (par commande)
|
|
def ca_discount_qte_percent
|
|
if !self.product_no_remise and !self.ct_u_price_ht and !self.p_product_specific_customer_id and self.discount_ecole_percent == 0 and self.price_line_block and self.price_line_block.remise_qte_ok
|
|
weight = self.price_line_block.weight_tot
|
|
if weight > 500
|
|
percent = 5
|
|
elsif weight > 300
|
|
percent = 4
|
|
elsif weight > 220
|
|
percent = 3
|
|
elsif weight > 160
|
|
percent = 2
|
|
elsif weight > 75
|
|
percent = 1
|
|
else
|
|
percent = 0
|
|
end
|
|
|
|
|
|
return percent
|
|
|
|
else
|
|
return 0.0
|
|
end
|
|
end
|
|
|
|
|
|
|
|
def ca_discount_qte_ht
|
|
((1-(self.discount_qte_percent.to_f / 100) )* self.ca_discount_market_ht)
|
|
end
|
|
|
|
def ca_discount_delay_percent
|
|
if !self.product_no_remise and !self.ct_u_price_ht and !self.p_product_specific_customer_id and self.discount_ecole_percent == 0 and self.price_line_block and self.price_line_block.remise_pre_order_ok and self.price_line_block.wish_date and self.price_line_block.created_at and self.price_line_block.wish_date >= (self.price_line_block.created_at + 8.weeks)
|
|
2
|
|
else
|
|
0
|
|
end
|
|
|
|
end
|
|
|
|
def ca_discount_delay_ht
|
|
((1-(self.discount_delay_percent.to_f / 100)) * self.ca_discount_qte_ht)
|
|
end
|
|
|
|
|
|
|
|
def ca_discount_comptant_percent
|
|
if !self.product_no_remise and !self.p_product_specific_customer_id and self.discount_ecole_percent == 0 and self.p_customer and self.p_customer.discount_comptant
|
|
2
|
|
else
|
|
0
|
|
end
|
|
end
|
|
|
|
def ca_discount_comptant_ht
|
|
((1-(self.discount_comptant_percent.to_f / 100)) * self.ca_discount_delay_ht)
|
|
end
|
|
|
|
def ca_product_remise_enrobage_ok
|
|
if !self.product_no_remise and !self.ct_u_price_ht and self.p_product_ref and self.p_product_ref.p_product and self.p_product_ref.p_product.discount_enrobage
|
|
false
|
|
else
|
|
false
|
|
end
|
|
end
|
|
def ca_discount_enrobage_percent
|
|
if !self.product_no_remise and !self.p_product_specific_customer_id and self.discount_ecole_percent == 0 and self.price_line_block and self.price_line_block.remise_enrobage_ok and self.product_remise_enrobage_ok
|
|
5
|
|
else
|
|
0
|
|
end
|
|
|
|
end
|
|
|
|
def ca_discount_enrobage_ht
|
|
((1-(self.discount_enrobage_percent.to_f / 100) )* self.ca_discount_comptant_ht)
|
|
end
|
|
|
|
def ca_discount_ecole_percent
|
|
if !self.product_no_remise and !self.ct_u_price_ht and !self.p_product_specific_customer_id and self.price_line_block and self.price_line_block.remise_ecole_ok
|
|
20
|
|
else
|
|
0
|
|
end
|
|
end
|
|
|
|
def ca_discount_ecole_ht
|
|
((1-(self.discount_ecole_percent.to_f / 100)) * self.ca_discount_enrobage_ht)
|
|
end
|
|
|
|
|
|
# FIN REMISES
|
|
|
|
def ca_price_u_kg_net_ht
|
|
self.ca_discount_ecole_ht
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def ca_tot_amount_ht
|
|
(self.ca_price_u_kg_net_ht * self.weight_qte).round(2)
|
|
end
|
|
|
|
def ca_tot_amount_tva
|
|
(self.tot_amount_ht * (self.tva_account_value/100)).round(2)
|
|
end
|
|
|
|
def ca_tot_amount_ttc
|
|
(self.tot_amount_ht + self.tot_amount_tva).round(2)
|
|
end
|
|
|
|
|
|
|
|
def ca_tot_discount_ht
|
|
(self.ca_price_u_ht * self.qte.to_f).round(2) - self.ca_tot_amount_ht
|
|
end
|
|
|
|
|
|
|
|
def ca_tot_discount_tva
|
|
(self.tot_discount_ht * (self.tva_account_value/100)).round(2)
|
|
end
|
|
|
|
def ca_tot_discount_ttc
|
|
(self.tot_discount_ht+self.tot_discount_tva).round(2)
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def p_customer
|
|
if self.price_line_block
|
|
self.price_line_block.p_customer
|
|
end
|
|
end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
end
|