Implantação da função filtro de Operções exemplo UBS***

This commit is contained in:
2026-06-17 16:08:22 -03:00
parent e9def7e21a
commit c969049c1a
11 changed files with 202 additions and 7 deletions

View File

@@ -35,6 +35,21 @@ class Entrega < ApplicationRecord
where(vehicle: vehicle)
}
# Restringe às entregas cujas NFs (reference_id) constam na(s) tabela(s) de
# operação informada(s). O JOIN é o mesmo do script de gestão do cliente:
# reference_id::text = <tabela_operacao>.nota_fiscal
#
# SEGURANÇA: o nome da tabela entra no SQL, então passa pela whitelist
# (Operacao.sanitizar) e por quote_table_name. Nomes inválidos são descartados;
# se nada sobrar, não filtra (all) — o filtro de operação é opcional.
scope :da_operacoes, ->(tabelas) {
validas = Operacao.sanitizar(tabelas)
next all if validas.empty?
selects = validas.map { |t| "SELECT nota_fiscal FROM #{connection.quote_table_name(t)}" }
where("reference_id::text IN (#{selects.join(' UNION ')})")
}
scope :do_mes, ->(data = Date.current) {
where(planned_date: data.beginning_of_month..data.end_of_month)
}
@@ -84,10 +99,11 @@ class Entrega < ApplicationRecord
end
# Contagem de entregas pagas para cálculo estimado
def self.contar_pagas(inicio:, fim:, motorista: nil, vehicle: nil)
def self.contar_pagas(inicio:, fim:, motorista: nil, vehicle: nil, operacoes: 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 = base.do_motorista(motorista) if motorista.present?
base = base.da_veiculo(vehicle) if vehicle.present?
base = base.da_operacoes(operacoes) if operacoes.present?
base.count
end