# app/models/entrega.rb # # Model de LEITURA para a tabela existente da Reem Transporte. # NUNCA criar migration para esta tabela. # NUNCA executar INSERT, UPDATE, DELETE ou DROP nesta tabela. # class Entrega < ApplicationRecord self.table_name = 'db_reem_simplerout_2026' self.primary_key = 'tracking_id' # Apenas leitura — segurança contra mutações acidentais def readonly? true end # ── Scopes ────────────────────────────────────────────────── scope :concluidas, -> { where(status: 'completed') } scope :com_checkout, -> { where.not(checkout: nil) } # Pagamento = entrega concluída com checkout registrado scope :pagas, -> { concluidas.com_checkout } scope :pendentes, -> { where.not(status: 'completed') } scope :no_periodo, ->(inicio, fim) { where(planned_date: inicio.to_date..fim.to_date) } scope :do_motorista, ->(nome) { where(driver: nome) } scope :da_veiculo, ->(vehicle) { where(vehicle: vehicle) } scope :do_mes, ->(data = Date.current) { where(planned_date: data.beginning_of_month..data.end_of_month) } # Filtra pela(s) conta(s) configurada(s) em DB_EXISTING_ACCOUNT_ID. # A coluna account_id é TEXTO e pode vir vazia, então comparamos como string. # Aceita: "95907" (uma) | "95907,12345" (várias) | "all" ou vazio (sem filtro). # Use "95907," (com vírgula) para incluir também os registros de conta vazia. scope :da_conta_gade, -> { contas = ENV.fetch('DB_EXISTING_ACCOUNT_ID', '95907').to_s.strip if contas.empty? || contas.casecmp?('all') all else where(account_id: contas.split(',', -1).map(&:strip)) end } # ── Métodos de classe ──────────────────────────────────────── # Lista motoristas únicos (para selects, consolidações) def self.motoristas_ativos(inicio: nil, fim: nil) base = da_conta_gade base = base.no_periodo(inicio, fim) if inicio && fim base.distinct.order(:driver).pluck(:driver).compact.reject(&:empty?) end # Lista veículos únicos (para selects/filtros de consolidação) def self.veiculos_unicos(inicio: nil, fim: nil) base = da_conta_gade base = base.no_periodo(inicio, fim) if inicio && fim base.distinct.order(:vehicle).pluck(:vehicle).compact.reject(&:empty?) end # Contagem de entregas pagas para cálculo estimado def self.contar_pagas(inicio:, fim:, motorista: nil, vehicle: nil) base = pagas.da_conta_gade.no_periodo(inicio, fim) base = base.do_motorista(motorista) if motorista.present? base = base.da_veiculo(vehicle) if vehicle.present? base.count end # ── Helpers de instância ───────────────────────────────────── def numero_nf reference_id end def local contact_name.presence || address end def concluida? status == 'completed' end def checkout_registrado? checkout.present? end def elegivel_pagamento? concluida? && checkout_registrado? end def atraso_minutos return 0 unless delay.present? delay.to_s.split(':').then { |h, m, _s| h.to_i * 60 + m.to_i } end end