| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- class Promotion < ActiveRecord::Base
- ##--- Llevar registro de Actividad del usuario
- audited
- belongs_to :product
- belongs_to :category
- # belongs_to :subcategory_id, class_name: "Category"
- enum status: [:inactive, :active]
- validates_presence_of :start_date, message: "Debe indicar fecha de inicio de la promoción."
- validates_presence_of :end_date, message: "Debe indicar fecha de término de la promoción."
- validates_presence_of :percent, message: "Debe indicar el porcentaje de descuento de la promoción."
- validates :percent, numericality: { only_integer: true, greater_than_or_equal_to: 1, less_than_or_equal_to: 100 }
- validate :start_end_date, on: [:create]
- validate :start_date_greater_than_end_date, if: proc { |p| p.start_date.present? && p.end_date.present? }
- validate :promotion_source
- validate :check_for_duplicates
- scope :activas, -> { where(status: 1) }
- scope :vigentes, -> { where("? between start_date and end_date", Date.today) }
- def verify_promotion
- is_active = end_date >= Date.today
- unless is_active
- update_attribute(:status, :inactive)
- end
- end
- def start_end_date
- if end_date.present? && end_date < Date.today
- errors.add(:end_date, "La fecha de fin debe ser mayor a hoy.")
- end
- end
- def start_date_greater_than_end_date
- if end_date < start_date
- errors.add(:start_date, 'La fecha de inicio debe ser mayor a la fecha de término de la promoción.')
- end
- end
- def promotion_source
- if product_id.blank? && category_id.blank?
- errors.add(:base, 'Seleccione una opción entre línea o producto.')
- end
- end
- def check_for_duplicates
- source =
- if category_id.present?
- "category_id = #{category_id}"
- elsif subcategory_id.present? && subcategory_id != "0"
- "subcategory_id = #{subcategory_id}"
- elsif product_id.present?
- "product_id = #{product_id}"
- end
- if source
- exists_already = Promotion.activas.where(source).where("start_date < ? AND end_date > ?", end_date, start_date).any?
- errors.add(:base, 'Ya existe una promoción activa con los parámetros seleccionados') if exists_already
- end
- end
- end
|