| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- class Sale < ActiveRecord::Base
- belongs_to :customer
- belongs_to :user
- belongs_to :open_cash_register
- belongs_to :seller
- has_many :cash_registers_moves
- has_many :inventories_moves
- has_many :sales_details
- has_many :products, through: :sales_details
- has_one :credit
- has_many :credit_payments, through: :credit
- has_one :sales_sellercommission
- has_many :products_returns
- has_many :pointsales, through: :open_cash_register
- ##--- Llevar registro de Actividad del usuario
- audited
- enum status: [:notpaid, :cancelled, :paid, :parcial, :cancelled_by_expiration]
- enum saletype: [:credit, :cash, :reserved]
- ##--- Validaciones previas de guardar
- validates :open_cash_register_id, presence: { message: "Se debe seleccionar caja registradora." }, on: [:create]
- validates :sale_code, presence: { message: "Se debe seleccionar caja registradora para generar el código de venta." }, on: [:create, :update]
- validates :customer_id, presence: { message: "Debe seleccionar cliente para la venta." }, on: [:create, :update]
- validates :seller_id, presence: { message: "Debe seleccionar vendedor para la venta." }, on: [:create, :update]
- validates :saletype, presence: { message: "Debe seleccionar tipo de venta." }, on: [:create, :update]
- accepts_nested_attributes_for :sales_details
- scope :activas, -> { where.not(sales: { status: 1 }) }
- scope :credit_pending, ->(customer) { where(saletype: 0, status: [0, 3], customer_id: customer).order(:id) }
- def get_pointsale
- user.pointsale
- end
- def reserve_is_expired?
- if expiration_date >= Date.today
- false
- else
- true
- end
- end
- def self.sales_chart_by_period_of_time(period)
- all_sales = Array.new
- if period == 'week'
- beg_period = Date.current.beginning_of_week
- end_period = Date.current.end_of_week
- elsif period == 'month'
- beg_period = Date.current.beginning_of_month
- end_period = Date.current.end_of_month
- elsif period == 'day'
- beg_period = Date.current.beginning_of_day
- end_period = Date.current.end_of_day
- end
- Pointsale.activos.each do |pointsale|
- obj = {}
- obj[:pointsale] = pointsale.name.gsub(" ", "\n")
- obj[:total] = pointsale.sales.activas.where(date_sale: beg_period..end_period).where('sales.status > 1').sum(:total)
- all_sales << obj
- end
- all_sales = all_sales.to_json
- all_sales
- end
- def reserve_debt
- total_in_moves = cash_registers_moves.where(status: 1).sum(:quantity)
- total - total_in_moves
- end
- def can_be_cancelled?(pos_config)
- if (date_sale + pos_config.days_cancel_sale.days) >= Date.today && !cancelled?
- # checar si la venta es de credito y ver si tiene pagos
- if credit?
- has_payments = CreditPayment.where(credit_id: credit.id).any?
- has_payments ? (return false) : (return true)
- else
- true
- end
- else
- false
- end
- end
- end
|