Pular para o conteúdo principal

RCA001 — Extrato de Contratos

Fonte​

  • Form: source/RCA001/URCA001.pas, source/RCA001/URCA001.dfm
  • DataModule: source/RCA001/UdmRCA001.pas, source/RCA001/UdmRCA001.dfm
  • Package: source/RCA001/RCA001.dpk

Objetivo​

Relatório central da Captacao de Leite: emite extratos financeiros e de producao ligados aos contratos com produtores. Oferece 8 modelos diferentes — desde o extrato analitico completo do produtor (com credito/debito/contas pendentes e recibo) ate relatorios gerenciais agregados por motorista, linha de captacao ou produtor. Fonte unica de demonstrativos de fechamento de contrato entregues aos produtores.

Modelos de Relatorio​

Selecionados pelo combobox "Modelo" (campo TP_MODELO em tabFILTRO). Conforme o modelo escolhido, o handler btnImprimir.OnClick monta um SQL diferente, carrega um .rtm especifico e grava um registro em RELATORIO via GravaRelatorio.

Modelo 1: Extrato de Contratos​

Quando usado: combo "Modelo" = "Extrato de Contratos" (valor N, default).

Layout analitico completo por contrato (RCA001.rtm). Mostra cabecalho com empresa, endereco e dados do produtor; total recebido, transferencias de entrada/saida, devolucoes, condenacoes, indenizacao, quitacao; credito (pagamentos recebidos), debitos (impostos, descontos, adiantamentos, insumos, frete), analise de qualidade do leite (gordura, proteina, CCS, CBT) e recibo juridico em extenso. E o relatorio entregue ao produtor no fechamento mensal.

SQL Base (dataset Contrato):

SELECT EMP.NM_EMPRESA, C.CD_EMPRESA, C.NR_CONTRATO, C.DT_COMPETENCIA, C.CD_PESSOA,
C.CD_ENDERECO, EP.DS_ENDERECO, FE.DT_FECHAMENTO, C.DT_ABERTURA,
CASE WHEN C.ST_CONTRATOLEITE = 'V' THEN 'Valido'
WHEN C.ST_CONTRATOLEITE = 'C' THEN 'Cancelado'
WHEN C.ST_CONTRATOLEITE = 'F' THEN 'Fechado' END ST_CONTRATO,
C.CD_FORMAPAGTO, C.DT_VENCTOPAGTO, C.VL_FRETE, C.VL_DESPESA,
P.NM_PESSOA||' - '||P.CD_PESSOA NM_PESSOA, P.NR_CNPJCPF,
FPG.DS_FORMAPAGTO,
MUNICIPIO.DS_MUNICIPIO||' - '||MUNICIPIO.SG_ESTADO DS_MUNICIPIO,
COALESCE(EP.NR_FONE, EP.NR_CELULAR, EP.NR_FAX) NR_FONE,
(SELECT DS_OBSERVACAO FROM PARMLEITE WHERE CD_EMPRESA = C.CD_EMPRESA) DS_MENSAGEM,
MIN((SELECT EMB.CD_MOTORISTA FROM EMBARQUE EMB
WHERE EMB.NR_EMBARQUE = ML.NR_EMBARQUE
AND EMB.CD_EMPRESA = ML.CD_EMPRESA
/* filtro opcional de motorista */)) CD_MOTORISTA,
CI.OQT_INCENTIVO QT_INCENTIVO,
'Recebi de '||EMP.NM_EMPRESA||', a importancia... de R$ '||FE.VL_SALDO||
' ('||VL.O_VALOR||'), referente ao meu fornecimento de '||FE.QT_FECHAMENTO||
' litros de Leite cru in natura durante o mes de '||M.O_DS_MES||' de '||
COPIA_TEXTO(C.DT_COMPETENCIA, 4, 7)||'. ...' RECIBO,
((SELECT OQT_SALDO FROM SALDO_CONTRATOLEITE('C', C.CD_EMPRESA, C.NR_CONTRATO, NULL)) +
(SELECT OQT_SALDO FROM SALDO_CONTRATOLEITE('T', C.CD_EMPRESA, C.NR_CONTRATO, NULL))) QT_RECEBIDA,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO,
RD.DS_ENDERECO EDS_ENDERECO, RD.DS_MUNICIPIO||'/'||RD.SG_ESTADO EDS_MUNICIPIO,
RD.NR_CEP ENR_CEP, RD.DS_EMAIL EDS_EMAIL, RD.DS_SITE EDS_SITE,
RD.NR_CNPJCPF ENR_CNJPCPF, RD.NR_INSCEST ENR_INSCEST,
COALESCE(RD.NR_FONE, RD.NR_FAX, RD.NR_CELULAR) ENR_FONE,
PF.DS_LOGOTIPO
FROM CONTRATOLEITE C
INNER JOIN PESSOA P ON (C.CD_PESSOA = P.CD_PESSOA)
INNER JOIN ENDERECOPESSOA EP ON (EP.CD_PESSOA = C.CD_PESSOA AND EP.CD_ENDERECO = C.CD_ENDERECO)
INNER JOIN FORMAPAGTO FPG ON (FPG.CD_FORMAPAGTO = C.CD_FORMAPAGTO)
INNER JOIN MUNICIPIO ON (MUNICIPIO.CD_MUNICIPIO = EP.CD_MUNICIPIO)
INNER JOIN EMPRESA ON (EMPRESA.CD_EMPRESA = C.CD_EMPRESA)
INNER JOIN PARMFATUR PF ON (PF.CD_EMPRESA = EMPRESA.CD_EMPRESA)
LEFT JOIN RETORNA_DADOSCADASTRAIS(EMPRESA.CD_PESSOA, NULL) RD ON (1=1)
LEFT JOIN FECHAMENTOCONTRATO FE ON (FE.CD_EMPRESA = C.CD_EMPRESA
AND FE.NR_CONTRATO = C.NR_CONTRATO
AND FE.DT_CANCELAMENTO IS NULL
AND FE.NR_SEQUENCIAL = (SELECT MAX(NR_SEQUENCIAL)
FROM FECHAMENTOCONTRATO
WHERE CD_EMPRESA = C.CD_EMPRESA
AND NR_CONTRATO = C.NR_CONTRATO
AND DT_CANCELAMENTO IS NULL))
INNER JOIN EMPRESA EMP ON (EMP.CD_EMPRESA = C.CD_EMPRESA)
INNER JOIN MOVTOLEITE ML ON (ML.CD_EMPRCONTRATO = C.CD_EMPRESA
AND ML.NR_CONTRATO = C.NR_CONTRATO)
INNER JOIN CAPTACAOLEITE CPL ON (CPL.CD_EMPREMBARQUE = C.CD_EMPRESA
AND CPL.NR_PLACA = ML.NR_PLACA
AND CPL.NR_EMBARQUE = ML.NR_EMBARQUE)
INNER JOIN ROTACAPTACAO R ON (R.NR_PLACA = CPL.NR_PLACA
AND R.CD_LINHACAPTACAO = CPL.CD_LINHACAPTACAO)
INNER JOIN LINHACAPTACAO LP ON (LP.CD_LINHACAPTACAO = R.CD_LINHACAPTACAO)
LEFT JOIN MES_EXTENSO('01.'||REPLACE(C.DT_COMPETENCIA,'/','.')) M ON (1=1)
LEFT JOIN VALOR_EXTENSO(FE.VL_SALDO) VL ON (1=1)
LEFT JOIN CALCULA_INCENTIVOPRODUCAO(C.CD_EMPRESA, C.NR_CONTRATO, NULL, NULL) CI ON (1=1)
/* WHERE dinamico: ML.ST_MOVTOLEITE, CD_EMPRESA, DT_COMPETENCIA,
CD_PESSOA IN (...), NR_CONTRATO IN (...),
CD_MOTORISTA IN (...), CD_LINHACAPTACAO */
GROUP BY ...
ORDER BY NM_PESSOA | CD_PESSOA | DS_MUNICIPIO

Sub-relatorios auxiliares populados via AfterScroll do tabLEITE (no modelo "R") e tabLEITEAfterScroll: tabCREDITO, tabDEBITO, tabContasPendente, tabMovimentacao, tabAnalise, tabResumo, tabINCENTIVO, tabDemonstrativo.

Layout: dist/Relatorios/RCA001.rtm (ou Custom/RCA001.rtm).

Modelo 2: Extrato de Contratos / Incentivos​

Quando usado: combo "Modelo" = "Extrato de Contratos / Incentivos" (valor E).

Variante do Modelo 1 com secao adicional de incentivos/bonificacoes por analise (gordura, proteina, volume). SQL base identico ao Modelo 1; diferenca esta no layout .rtm que inclui a regiao de incentivos alimentada por tabINCENTIVO e tabDemonstrativo via procedures CALCULA_INCENTIVOANALISE / CALCULA_INCENTIVOPRODUCAO.

Layout: dist/Relatorios/RCA001_E.rtm.

Modelo 3: Compra de Leite por Motorista​

Quando usado: combo "Modelo" = "Compra de Leite por Motorista" (valor M).

Planilha diaria (dias 1 a 31) da competencia agrupada por motorista e linha de captacao. Cada linha do relatorio e um motorista; colunas mostram litros coletados por dia do mes. Usado para controle operacional da frota.

SQL Base (dataset tabCOMPRAMOT):

SELECT SUM(V.V_QT_DIA1) V_QT_DIA1, ... SUM(V.V_QT_DIA31) V_QT_DIA31,
V.V_NM_MOTORISTA, V.V_NR_PLACAMOTORISTA,
CAST(NULL AS VARCHAR(2)) NM_PRODUTOR,
V.V_TP_MOTIVOLEITE,
V.V_DS_LINHACAPTACAO, V.V_CD_LINHACAPTACAO,
SUM(V.QT_TOTALEMPRESA) QT_TOTALEMPRESA,
NM_EMPRESA, DS_ENDERECO, DS_MUNICIPIOBAIRRO, NR_FONE, DS_SITE,
DS_LOGOTIPO, DS_EMAIL, NR_INSCESTAD, NR_CPFCNPJ, ODT_COMPETENCIA,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO
FROM VIEW_RCA001(:CD_EMPRESA, NULL, 'M', :FILTRO) V
GROUP BY V.V_TP_MOTIVOLEITE, V.V_DS_LINHACAPTACAO, V.V_CD_LINHACAPTACAO,
V.V_NM_MOTORISTA, V.V_NR_PLACAMOTORISTA, NM_EMPRESA,
DS_ENDERECO, DS_MUNICIPIOBAIRRO, NR_FONE, DS_SITE, DS_LOGOTIPO,
DS_EMAIL, NR_INSCESTAD, NR_CPFCNPJ, ODT_COMPETENCIA
ORDER BY V.V_CD_LINHACAPTACAO, V.V_NM_MOTORISTA

Layout: dist/Relatorios/RCA001_M.rtm.

Modelo 4: Compra de Leite por Produtor​

Quando usado: combo "Modelo" = "Compra de Leite por Produtor" (valor P).

Mesma matriz diaria (dias 1 a 31) do Modelo 3, porem agrupada por produtor (CD_PESSOA). Quando o checkbox "Quebra por Motorista" esta marcado (QB_MOTORISTA = 'T'), acrescenta quebra intermediaria por motorista (V_NM_MOTORISTA).

SQL Base (dataset tabCOMPRAMOT):

SELECT SUM(V.V_QT_DIA1) V_QT_DIA1, ... SUM(V.V_QT_DIA31) V_QT_DIA31,
/* se Quebra por Motorista: V.V_NR_PLACAMOTORISTA, V.V_TP_MOTIVOLEITE, */
(LIST(DISTINCT ' '||V.V_CD_LINHACAPTACAO||' - '||V.V_DS_LINHACAPTACAO)) V_DS_LINHACAPTACAO,
SUM(V.QT_TOTALEMPRESA) QT_TOTALEMPRESA,
NM_EMPRESA, DS_ENDERECO, DS_MUNICIPIOBAIRRO, NR_FONE, DS_SITE,
DS_LOGOTIPO, DS_EMAIL, NR_INSCESTAD, NR_CPFCNPJ,
CD_PRODUTOR||' - '||V.NM_PRODUTOR NM_PRODUTOR,
ODT_COMPETENCIA,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO
FROM VIEW_RCA001(:CD_EMPRESA, NULL, 'M', :FILTRO) V
GROUP BY V.V_TP_MOTIVOLEITE, /* se Quebra: V.V_NR_PLACAMOTORISTA, */
NM_EMPRESA, DS_ENDERECO, DS_MUNICIPIOBAIRRO, NR_FONE, DS_SITE,
DS_LOGOTIPO, DS_EMAIL, CD_PRODUTOR, NR_INSCESTAD, NR_CPFCNPJ,
V.NM_PRODUTOR, ODT_COMPETENCIA
/* se Quebra: , V.V_NM_MOTORISTA */
ORDER BY NM_PRODUTOR /* se Quebra: , V.V_NM_MOTORISTA */

Layout: dist/Relatorios/RCA001_P.rtm.

Modelo 5: Contratos - Sintetico​

Quando usado: combo "Modelo" = "Contratos - Sintetico" (valor S).

Lista 1 linha por contrato do periodo (sem detalhamento de movimentos). Rapido para visao geral de contratos fechados/validos.

SQL Base (dataset Contrato):

SELECT DISTINCT EMP.NM_EMPRESA, CL.CD_EMPRESA, CL.NR_CONTRATO, CL.DT_COMPETENCIA,
CL.CD_PESSOA, CL.CD_ENDERECO, EP.DS_ENDERECO, FE.DT_FECHAMENTO, CL.DT_ABERTURA,
CASE WHEN CL.ST_CONTRATOLEITE = 'V' THEN 'Valido'
WHEN CL.ST_CONTRATOLEITE = 'C' THEN 'Cancelado'
WHEN CL.ST_CONTRATOLEITE = 'F' THEN 'Fechado' END ST_CONTRATO,
((100.00*300)*0) QT_INCENTIVO,
CL.CD_FORMAPAGTO, CL.DT_VENCTOPAGTO, CL.VL_FRETE, CL.VL_DESPESA,
P.NM_PESSOA||' - '||P.CD_PESSOA NM_PESSOA, P.NR_CNPJCPF,
FPG.DS_FORMAPAGTO,
MUNICIPIO.DS_MUNICIPIO||' - '||MUNICIPIO.SG_ESTADO DS_MUNICIPIO,
COALESCE(EP.NR_FONE, EP.NR_CELULAR, EP.NR_FAX) NR_FONE,
(SELECT DS_OBSERVACAO FROM PARMLEITE WHERE CD_EMPRESA = CL.CD_EMPRESA) DS_MENSAGEM,
(SELECT MIN(EMB.CD_MOTORISTA) FROM EMBARQUE EMB
INNER JOIN MOVTOLEITE MV ON (EMB.NR_EMBARQUE = MV.NR_EMBARQUE
AND EMB.CD_EMPRESA = MV.CD_EMPRESA)
WHERE MV.NR_CONTRATO = CL.NR_CONTRATO
AND MV.CD_EMPRESA = CL.CD_EMPRESA /* filtro motorista */) CD_MOTORISTA,
'' RECIBO,
CAST(NULL AS NUMERIC(15,2)) QT_RECEBIDA,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO,
RD.DS_ENDERECO EDS_ENDERECO, ..., PF.DS_LOGOTIPO
FROM CONTRATOLEITE CL
INNER JOIN PRODUTORLEITE PL ON (PL.CD_PESSOA = CL.CD_PESSOA AND PL.CD_ENDERECO = CL.CD_ENDERECO)
INNER JOIN PESSOA P ON (CL.CD_PESSOA = P.CD_PESSOA)
INNER JOIN ENDERECOPESSOA EP ON (EP.CD_PESSOA = CL.CD_PESSOA AND EP.CD_ENDERECO = CL.CD_ENDERECO)
INNER JOIN FORMAPAGTO FPG ON (FPG.CD_FORMAPAGTO = CL.CD_FORMAPAGTO)
INNER JOIN MUNICIPIO ON (MUNICIPIO.CD_MUNICIPIO = EP.CD_MUNICIPIO)
LEFT JOIN FECHAMENTOCONTRATO FE ON (FE.CD_EMPRESA = CL.CD_EMPRESA
AND FE.NR_CONTRATO = CL.NR_CONTRATO
AND FE.DT_CANCELAMENTO IS NULL
AND FE.NR_SEQUENCIAL = (SELECT MAX(NR_SEQUENCIAL) ...))
INNER JOIN EMPRESA EMP ON (EMP.CD_EMPRESA = CL.CD_EMPRESA)
INNER JOIN PARMFATUR PF ON (PF.CD_EMPRESA = EMP.CD_EMPRESA)
LEFT JOIN RETORNA_DADOSCADASTRAIS(EMP.CD_PESSOA, NULL) RD ON (1=1)
LEFT JOIN MOVTOLEITE MV ON (MV.NR_CONTRATO = CL.NR_CONTRATO AND MV.CD_EMPRESA = CL.CD_EMPRESA)
LEFT JOIN EMBARQUE EMB ON (EMB.NR_EMBARQUE = MV.NR_EMBARQUE AND EMB.CD_EMPRESA = MV.CD_EMPRESA)
LEFT JOIN PESSOA MOT ON (MOT.CD_PESSOA = EMB.CD_MOTORISTA)
INNER JOIN CAPTACAOLEITE CPL ON (CPL.CD_EMPREMBARQUE = CL.CD_EMPRESA
AND CPL.NR_PLACA = MV.NR_PLACA
AND CPL.NR_EMBARQUE = MV.NR_EMBARQUE)
INNER JOIN ROTACAPTACAO R ON (R.NR_PLACA = CPL.NR_PLACA
AND R.CD_LINHACAPTACAO = CPL.CD_LINHACAPTACAO)
INNER JOIN LINHACAPTACAO LP ON (LP.CD_LINHACAPTACAO = R.CD_LINHACAPTACAO)
/* filtro: CL.ST_CONTRATOLEITE, CL.DT_COMPETENCIA, pessoa/contrato/motorista/linha */

Layout: dist/Relatorios/RCA001_S.rtm.

Modelo 6: Extrato de Contratos - Simples​

Quando usado: combo "Modelo" = "Extrato de Contratos - Simples" (valor R).

Extrato resumido por produtor com credito, debito, saldo, contas pendentes, analise e dados bancarios (Banco, Agencia, Conta Corrente) e rota de captacao — mais enxuto que o Modelo 1.

SQL Base (dataset tabLEITE):

SELECT EDS_ENDERECO, EDS_MUNICIPIO, ENR_CEP, EDS_EMAIL, EDS_SITE, ENR_CNJPCPF,
ENR_INSCEST, ENR_FONE, DS_LOGOTIPO, NM_PESSOA, DS_ENDERECO, DS_MUNICIPIO,
NR_CNPJCPF, NR_FONE, DT_COMPETENCIA, NR_CONTRATO, VL_SALDO, VL_CREDITO,
VL_DEBITO, VL_PRECO, QT_FECHAMENTO, ST_CONTRATOLEITE, VL_TOTALIMPOSTO,
TP_MOVTOLEITE, CD_PESSOA, QT_INCENTIVO, NR_RELATORIO,
DT_COMPINICIAL, DT_COMPFINAL,
CD_BANCOPESSOA, DS_BANCOPESSOA, CD_AGENCIAPESSOA, NR_CONTACORPESSOA,
CAST(LIST(DS_ROTACAPTACAO) AS DOM_VARCHAR500) DS_ROTACAPTACAO,
CAST(LIST(CD_LINHACAPTACAO) AS DOM_VARCHAR32) CD_LINHACAPTACAO,
CAST(LIST(DS_LINHACAPTACAO) AS DOM_VARCHAR500) DS_LINHACAPTACAO
FROM (
SELECT DISTINCT
RD.DS_ENDERECO EDS_ENDERECO, ...,
(SELECT DS_LOGOTIPO FROM PARMFATUR WHERE CD_EMPRESA = CL.CD_EMPRESA) DS_LOGOTIPO,
P.NM_PESSOA, E.DS_ENDERECO, MP.DS_MUNICIPIO||MP.SG_ESTADO DS_MUNICIPIO,
P.NR_CNPJCPF, E.NR_FONE, CL.DT_COMPETENCIA, CL.NR_CONTRATO,
F.VL_SALDO, F.VL_CREDITO, F.VL_DEBITO, F.VL_PRECO, F.QT_FECHAMENTO,
CL.ST_CONTRATOLEITE, F.VL_TOTALIMPOSTO,
CASE WHEN ML.TP_MOVTOLEITE = 'C' THEN 'Recebimento'
WHEN ML.TP_MOVTOLEITE = 'E' THEN 'Transferencia de Entrada'
WHEN ML.TP_MOVTOLEITE = 'S' THEN 'Transferencia de Saida'
WHEN ML.TP_MOVTOLEITE = 'D' THEN 'Devolucao' END TP_MOVTOLEITE,
CL.CD_PESSOA, CI.OQT_INCENTIVO QT_INCENTIVO,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO,
/* DT_COMPINICIAL / DT_COMPFINAL calculadas a partir de CL.DT_COMPETENCIA */
COALESCE(BP.CD_BANCO, 0) CD_BANCOPESSOA,
COALESCE(BP.DS_BANCO, 'SEM BANCO') DS_BANCOPESSOA,
COALESCE(AP.CD_AGENCIA, 0) CD_AGENCIAPESSOA,
COALESCE(CCP.NR_CONTACOR, 0) NR_CONTACORPESSOA,
COALESCE(R.DS_ROTACAPTACAO, 'Sem Rota de Captacao de Leite') DS_ROTACAPTACAO,
LP.CD_LINHACAPTACAO,
COALESCE(LP.DS_LINHACAPTACAO, '---') DS_LINHACAPTACAO
FROM CONTRATOLEITE CL
INNER JOIN PRODUTORLEITE PL ON (PL.CD_PESSOA = CL.CD_PESSOA AND PL.CD_ENDERECO = CL.CD_ENDERECO)
INNER JOIN FECHAMENTOCONTRATO F ON (F.CD_EMPRESA = CL.CD_EMPRESA
AND F.NR_CONTRATO = CL.NR_CONTRATO
AND F.DT_CANCELAMENTO IS NULL)
INNER JOIN MOVTOLEITE ML ON (ML.CD_EMPRCONTRATO = CL.CD_EMPRESA
AND ML.NR_CONTRATO = CL.NR_CONTRATO
AND F.NR_SEQUENCIAL = (SELECT MAX(NR_SEQUENCIAL)
FROM FECHAMENTOCONTRATO
WHERE CD_EMPRESA = CL.CD_EMPRESA
AND NR_CONTRATO = CL.NR_CONTRATO))
INNER JOIN EMPRESA ON (EMPRESA.CD_EMPRESA = CL.CD_EMPRESA)
LEFT JOIN RETORNA_DADOSCADASTRAIS(EMPRESA.CD_PESSOA, NULL) RD ON (1=1)
INNER JOIN PESSOA P ON (P.CD_PESSOA = CL.CD_PESSOA)
INNER JOIN ENDERECOPESSOA E ON (E.CD_PESSOA = CL.CD_PESSOA AND E.CD_ENDERECO = CL.CD_ENDERECO)
INNER JOIN MUNICIPIO MP ON (MP.CD_MUNICIPIO = E.CD_MUNICIPIO)
LEFT JOIN EMBARQUE EMB ON (EMB.NR_EMBARQUE = ML.NR_EMBARQUE AND EMB.CD_EMPRESA = ML.CD_EMPRESA)
LEFT JOIN PESSOA MOT ON (MOT.CD_PESSOA = EMB.CD_MOTORISTA)
LEFT JOIN CONTACORPESSOA CCP ON (CCP.CD_PESSOA = P.CD_PESSOA
AND CCP.NR_CONTACOR = (SELECT FIRST 1 NR_CONTACOR
FROM CONTACORPESSOA
WHERE CD_PESSOA = CCP.CD_PESSOA))
LEFT JOIN BANCO BP ON (BP.CD_BANCO = CCP.CD_BANCO)
LEFT JOIN AGENCIA AP ON (AP.CD_AGENCIA = CCP.CD_AGENCIA)
INNER JOIN CAPTACAOLEITE CPL ON (CPL.CD_EMPREMBARQUE = CL.CD_EMPRESA
AND CPL.NR_PLACA = ML.NR_PLACA
AND CPL.NR_EMBARQUE = ML.NR_EMBARQUE)
INNER JOIN ROTACAPTACAO R ON (R.NR_PLACA = CPL.NR_PLACA
AND R.CD_LINHACAPTACAO = CPL.CD_LINHACAPTACAO)
INNER JOIN LINHACAPTACAO LP ON (LP.CD_LINHACAPTACAO = R.CD_LINHACAPTACAO)
LEFT JOIN CALCULA_INCENTIVOPRODUCAO(CL.CD_EMPRESA, CL.NR_CONTRATO, NULL, NULL) CI ON (1=1)
/* filtro WHERE ML.ST_MOVTOLEITE, CD_EMPRESA, DT_COMPETENCIA, CD_PESSOA IN, NR_CONTRATO IN, CD_MOTORISTA IN, CD_LINHACAPTACAO */
)
GROUP BY EDS_ENDERECO, ..., NR_CONTACORPESSOA

Antes de imprimir, o sistema pergunta "Deseja Imprimir os Debitos Pendentes do Produtor?" — se "Nao", oculta a regiao regionContasPendentes.

Layout: dist/Relatorios/RCA001_R.rtm.

Modelo 7: Total Entregue por Produtor​

Quando usado: combo "Modelo" = "Total Entregue por Produtor" (valor T).

Consolidado simples por produtor no periodo: pessoa + endereco completo + quantidade total de leite entregue (soma de QT_LEITE). Usado para conferencia rapida de producao por fornecedor. Ignora movimentos cancelados (ST_MOVTOLEITE <> 'C').

SQL Base (chamado por GeraRelatorio):

SELECT DISTINCT
CL.CD_PESSOA, P.NM_PESSOA,
SUM(ML.QT_LEITE) QT_LEITE,
CL.CD_EMPRESA||' - '||EMPRESA.NM_EMPRESA CD_EMPRESA,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO,
P.NR_CNPJCPF,
EP.DS_ENDERECO, EP.NR_ENDERECO, EP.DS_BAIRRO, EP.NR_CEP,
M.DS_MUNICIPIO, EP.DS_COMPLEMENTO,
P.DS_OBSERVACAO, LP.CD_LINHACAPTACAO,
COALESCE(EP.DS_ENDERECO,'')||COALESCE(', '||EP.NR_ENDERECO,'')||
COALESCE(' - '||EP.DS_COMPLEMENTO,'')||COALESCE(' - '||EP.DS_BAIRRO,'') DS_ENDERECOCOMPLETO
FROM CAPTACAOLEITE LP
INNER JOIN MOVTOLEITE ML ON (ML.CD_EMPRESA = LP.CD_EMPREMBARQUE AND ML.NR_EMBARQUE = LP.NR_EMBARQUE)
INNER JOIN EMBARQUE EMB ON (EMB.CD_EMPRESA = ML.CD_EMPRESA AND EMB.NR_EMBARQUE = ML.NR_EMBARQUE)
INNER JOIN CONTRATOLEITE CL ON (CL.CD_EMPRESA = ML.CD_EMPRCONTRATO AND CL.NR_CONTRATO = ML.NR_CONTRATO)
INNER JOIN PRODUTORLEITE PL ON (PL.CD_PESSOA = CL.CD_PESSOA AND PL.CD_ENDERECO = CL.CD_ENDERECO)
INNER JOIN PESSOA P ON (P.CD_PESSOA = CL.CD_PESSOA)
LEFT JOIN PESSOA MOT ON (MOT.CD_PESSOA = EMB.CD_MOTORISTA)
INNER JOIN EMPRESA ON (EMPRESA.CD_EMPRESA = CL.CD_EMPRESA)
INNER JOIN ENDERECOPESSOA EP ON (EP.CD_PESSOA = PL.CD_PESSOA AND EP.CD_ENDERECO = PL.CD_ENDERECO)
INNER JOIN MUNICIPIO M ON (M.CD_MUNICIPIO = EP.CD_MUNICIPIO)
WHERE ML.ST_MOVTOLEITE <> 'C'
/* filtro: CL.CD_EMPRESA, CL.DT_COMPETENCIA, CL.CD_PESSOA IN, CL.NR_CONTRATO IN, MOT.CD_PESSOA IN, LP.CD_LINHACAPTACAO */
GROUP BY CL.CD_PESSOA, P.NM_PESSOA, CL.CD_EMPRESA, EMPRESA.NM_EMPRESA, P.NR_CNPJCPF,
EP.DS_ENDERECO, EP.NR_ENDERECO, EP.DS_COMPLEMENTO, EP.DS_BAIRRO, EP.NR_CEP,
M.DS_MUNICIPIO, P.DS_OBSERVACAO, LP.CD_LINHACAPTACAO, DS_ENDERECOCOMPLETO
ORDER BY P.NM_PESSOA

Layout: dist/Relatorios/RCA001_T.rtm (via GeraRelatorio).

Modelo 8: Total Entregue por Linha de Captacao​

Quando usado: combo "Modelo" = "Total Entregue por Linha de Captacao" (valor L).

Sumario por linha de captacao: total de leite, preco medio contratado, numero de produtores ativos e media por produtor. Filtra contratos por ST_CONTRATOLEITE = 'V' (se Situacao="Aberto") ou 'F' (se "Fechado").

SQL Base (chamado por GeraRelatorio):

SELECT LP.CD_LINHACAPTACAO||' - '||LP.DS_LINHACAPTACAO NM_LINHACAPTACAO,
CL.CD_EMPRESA||' - '||EMPRESA.NM_EMPRESA CD_EMPRESA,
SUM(ML.QT_LEITE) TT_LEITE,
AVG(CL.VL_CONTRATADO) VL_PRECO,
COUNT(DISTINCT PL.CD_PESSOA) QT_PRODUTORES,
CAST(SUM(ML.QT_LEITE) / COALESCE(NULLIF(COUNT(DISTINCT PL.CD_PESSOA),0),1) AS DOM_NUMERIC15_2) QT_LEITE,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO
FROM EMBARQUE EMB
INNER JOIN CAPTACAOLEITE CP ON (CP.NR_EMBARQUE = EMB.NR_EMBARQUE
AND CP.CD_EMPREMBARQUE = EMB.CD_EMPRESA
AND CP.NR_PLACA = EMB.NR_PLACA)
INNER JOIN MOVTOLEITE ML ON (ML.CD_EMPRESA = CP.CD_EMPREMBARQUE AND ML.NR_EMBARQUE = CP.NR_EMBARQUE)
INNER JOIN CONTRATOLEITE CL ON (CL.CD_EMPRESA = ML.CD_EMPRCONTRATO
AND CL.NR_CONTRATO = ML.NR_CONTRATO
AND CL.ST_CONTRATOLEITE = :ST /* 'V' se Aberto, 'F' se Fechado */)
INNER JOIN PRODUTORLEITE PL ON (PL.CD_PESSOA = CL.CD_PESSOA AND PL.CD_ENDERECO = CL.CD_ENDERECO)
INNER JOIN PESSOA P ON (P.CD_PESSOA = CL.CD_PESSOA)
INNER JOIN LINHACAPTACAO LP ON (CP.CD_LINHACAPTACAO = LP.CD_LINHACAPTACAO)
LEFT JOIN PESSOA MOT ON (MOT.CD_PESSOA = EMB.CD_MOTORISTA)
INNER JOIN EMPRESA ON (EMPRESA.cd_empresa = CL.CD_EMPRESA)
WHERE ML.ST_MOVTOLEITE <> 'C'
/* filtro: empresa, periodo, pessoa IN, contrato IN, motorista IN, linha captacao */
GROUP BY LP.CD_LINHACAPTACAO, LP.DS_LINHACAPTACAO, CL.CD_EMPRESA, EMPRESA.NM_EMPRESA
ORDER BY LP.CD_LINHACAPTACAO

Layout: dist/Relatorios/RCA001_L.rtm (via GeraRelatorio).

Filtros​

Campos simples:

  • Empresa (Lista de Empresas do usuario — EMPRESAUSUARIO) F9 — obrigatorio
  • Competencia (mes/ano no formato MM/AAAA) — obrigatorio exceto no Modelo "Extrato de Contratos" (N); para modelos M, P, R, T, L o periodo e expandido para BETWEEN primeiro e ultimo dia do mes
  • Modelo (combo) — seleciona entre os 8 modelos acima
  • Situacao (combo) — "Aberto" (A) / "Fechado" (F); default "Fechado". Define filtro do estado de contrato/movimento:
    • Modelo "R" Simples: ML.ST_MOVTOLEITE = 'N' (Fechado) ou 'A' (Aberto)
    • Modelos "P"/"M": idem acima
    • Modelo "S" Sintetico: CL.ST_CONTRATOLEITE = 'V' (Aberto) ou 'F' (Fechado)
    • Modelo "T": CL.ST_CONTRATOLEITE <> 'F' (Aberto) ou = 'F' (Fechado)
  • Ordenacao (combo, so aparece no Modelo "N") — Nome Pessoa (N) / Código Pessoa (E) / Nome Municipio (M); default "Nome Pessoa"
  • Rota (codigo da Linha de Captacao) F9 — lookup em LINHACAPTACAO
  • Dia de Pagamento (1 a 31) — filtra por EXTRACT(DAY FROM PL.DT_PAGAMENTO)
  • Quebra por Motorista (checkbox, so aparece no Modelo "P") — acrescenta quebra por motorista na matriz diaria

Filtros de grid (multi-selecao via F9):

  • Pessoas (gridPessoa) F9 — Lista de Produtores de Leite (PRODUTORLEITE); multi-selecao de produtores a incluir no relatorio (filtra CD_PESSOA IN (...))
  • Contratos (gridContrato) — multi-selecao de contratos especificos (NR_CONTRATO IN (...))
  • Motoristas (gridMotorista) F9 — Lista de Motoristas (MOTORISTA via PESSOA); multi-selecao de motoristas (CD_MOTORISTA IN (...))

Parametros que Influenciam​

TabelaCampoEfeito
PARMLEITEDS_OBSERVACAOMensagem institucional impressa no rodape do extrato (coluna DS_MENSAGEM nos Modelos 1, 2 e 5).
PARMFATURDS_LOGOTIPOLogotipo da empresa impresso no cabecalho do relatorio (todos os modelos).
USUARIOEMPRESACD_EMPRESA + CD_USUARIORestringe F9 de Empresa apenas as empresas as quais o usuario logado tem acesso.

Perguntas Frequentes​

P: Qual é a finalidade da tela RCA001? R: A tela RCA001 é utilizada para gerar relatórios referentes aos contratos de leite. Ela oferece oito modelos de relatório: Extrato de Contratos, Compra de Leite por Motorista, Compra de Leite por Produtor, Contratos Sintético, Extrato de Contratos Simples, Total Entregue por Produtor, Total Entregue por Linha de Captação e Extrato de Contratos com Incentivos. O usuário define os filtros desejados (empresa, competência, situação, rota, produtores, motoristas, contratos) e pressiona Imprimir (F8) para gerar o relatório.

P: Como selecionar os diferentes modelos de relatório disponíveis? R: No campo "Modelo", selecione a opção desejada entre as oito disponíveis. Cada modelo gera um relatório com agrupamentos e informações diferentes. Por exemplo, "Compra de Leite por Motorista" agrupa os dados por motorista, enquanto "Total Entregue por Linha de Captação" agrupa por linha de coleta. O campo "Ordenação" (visível apenas para o modelo "Extrato de Contratos") permite ordenar por Nome da Pessoa, Código da Pessoa ou Nome do Município.

P: Como filtrar o relatório por uma linha de captação específica? R: Preencha o campo "Rota" com o código da linha de captação desejada. Pressione F9 no campo para abrir a lista de linhas de captação cadastradas. Caso deseje filtrar também por dia de pagamento, preencha o campo "Dia de Pagamento" com o número do dia (entre 1 e 31).

P: Ao tentar imprimir, o sistema apresenta a mensagem "A Empresa deve ser Informada!". Como devo proceder? R: O campo "Empresa" é obrigatório para a emissão do relatório. Informe um código de empresa válido no campo correspondente. Utilize a tecla F9 para pesquisar as empresas disponíveis para o seu usuário.

P: O sistema exibe a mensagem "A Data de Competência deve ser informada!". Quando isso acontece? R: Esta mensagem aparece quando o campo "Competência" não está preenchido e o modelo de relatório selecionado é diferente de "Extrato de Contratos". Para todos os demais modelos, é obrigatório informar o período de competência no formato MM/AAAA.

P: Recebi a mensagem "O Relatório não retornou Registros! Verifique os Filtros.". O que devo fazer? R: Esta mensagem indica que não foram encontrados dados que correspondam aos filtros aplicados. Revise os critérios de filtragem (empresa, competência, produtores, contratos, rotas) e amplie ou ajuste o intervalo para incluir registros existentes no sistema.

P: Ao selecionar o modelo "Extrato de Contratos Simples", o sistema pergunta "Deseja Imprimir os Débitos Pendentes do Produtor?". O que significa? R: Trata-se de uma confirmação do sistema antes da impressão. Ao clicar em "Sim", o relatório incluirá uma seção com as contas pendentes do produtor. Ao clicar em "Não", essa seção será ocultada no relatório.

P: Ao informar um produtor, recebo a mensagem "O Produtor não Está Cadastrado. Verifique! [TCA001]". Como resolver? R: O código informado não corresponde a um produtor de leite ativo no sistema. Verifique se o código está correto e se o produtor está cadastrado e com status ativo na tela Cadastro de Produtores de Leite (TCA001).

P: O sistema apresenta a mensagem "Motorista não Está Cadastrado! Verifique [TTR005]". O que devo fazer? R: O código do motorista informado não foi encontrado ou o motorista não está ativo. Acesse a tela Cadastro de Motoristas (TTR005) para verificar se o motorista está cadastrado e com status ativo.

P: Recebi a mensagem "A Linha de Captação não está cadastrado! Verifique [TCA005]". Como resolver? R: O código informado no campo "Rota" não corresponde a nenhuma linha de captação cadastrada. Acesse a tela Cadastro de Linhas de Captação (TCA005) para verificar os códigos existentes ou cadastrar uma nova linha.

P: O sistema apresenta a mensagem "A Empresa não está Cadastrada! Verifique [ADM002]". O que significa? R: O código de empresa informado não existe no sistema ou o usuário atual não possui acesso a esta empresa. Verifique o código na tela Cadastro de Empresas/Usuários (ADM002) e confirme que seu usuário possui permissão de acesso.

P: Ao preencher o campo "Dia de Pagamento", recebo a mensagem "Informe Apenas Números!". Como corrigir? R: O campo "Dia de Pagamento" aceita apenas valores numéricos. Remova quaisquer caracteres não numéricos e informe apenas o número do dia desejado.

P: Recebi a mensagem "O Dia Informado Deve ser Positivo!" ou "O Dia Informado Deve Maior que Zero!" ao preencher o dia de pagamento. O que fazer? R: O valor informado no campo "Dia de Pagamento" deve ser um número entre 1 e 31. Informe um valor positivo e maior que zero.

P: O sistema exibe "O Dia Informado Deve ser Menor que 31!" ao preencher o dia de pagamento. Como resolver? R: O valor informado excede o limite máximo de 31 dias. Informe um número entre 1 e 31 no campo "Dia de Pagamento".

Mensagens exibidas​

Levantadas de source/RCA001/ pela camada 0 (commit 96fc51e236).

Mais 13 mensagens com texto literal no código: RCA001.

Tabelas de Escrita (INSERT/UPDATE/DELETE)​

Nenhuma — RCA001 e um relatorio puramente consumidor. A unica gravacao (via GravaRelatorio) e o registro de auditoria em RELATORIO (feito pelo framework jReport, nao pelo módulo).

Tabelas de Leitura (SELECT)​

TabelaOperacoes
AGENCIASELECT
ANALISESELECT
ANALISELEITESELECT
BANCOSELECT
CAPTACAOLEITESELECT
CONTACORPESSOASELECT
CONTASSELECT
CONTASHISTORICOSELECT
CONTRATOLEITESELECT
EMBARQUESELECT
EMPRESASELECT
ENDERECOPESSOASELECT
FECHAMENTOCONTRATOSELECT
FECHAMENTODEBITOSELECT
FORMAPAGTOSELECT
HISTORICOSELECT
ITEMSELECT
LINHACAPTACAOSELECT
MOTORISTASELECT
MOVTOLEITESELECT
MUNICIPIOSELECT
PARMFATURSELECT
PARMLEITESELECT
PESSOASELECT
PRODUTORLEITESELECT
ROTACAPTACAOSELECT
USUARIOEMPRESASELECT

Procedures Chamadas​

ProcedureTabelas Acessadas
CALCULA_INCENTIVOANALISEANALISE, ANALISELEITE, INCENTIVOPRODUCAO, RESULTADOANALISE (SELECT)
CALCULA_INCENTIVOPRODUCAOCONTRATOLEITE, FECHAMENTOCONTRATO, INCENTIVOPRODUCAO, MOVTOLEITE (SELECT)
FORMATA_ANALISEANALISE, ANALISELEITE, ITEMTABDESCLEITE, TABDESCLEITE (SELECT)
MES_EXTENSO-
RETORNA_DADOSCADASTRAISENDERECOPESSOA, ESTADO, MUNICIPIO, PAISBACEN, PESSOA, PESSOAFISICA (SELECT)
SALDO_CONTRATOLEITECONTRATOLEITE, FECHAMENTOCONTRATO, MOVTOFECHAMENTOCONTR, MOVTOLEITE (SELECT)
VALOR_EXTENSO-
VIEW_RCA001CAPTACAOLEITE, CONTRATOLEITE, EMBARQUE, EMPRESA, LINHACAPTACAO, MOVTOLEITE, PESSOA, PRODUTORLEITE, ROTACAPTACAO (SELECT)

Tabelas via Procedures (acesso indireto)​

TabelaOperacoes
ANALISESELECT
ANALISELEITESELECT
AREACOMERCIALSELECT
CAPTACAOLEITESELECT
COMPLEMENTOLEITESELECT
CONDENACAOLEITESELECT
CONTASSELECT
CONTRATOLEITESELECT
EMPRESASELECT
ENDERECOPESSOASELECT
ESTADOSELECT
ESTRUTURAPROPRIEDADERURALSELECT
FECHAMENTOCONTRATOSELECT
FORMAPAGTOSELECT
GRUPOPCPSELECT
IMPOSTOSELECT
IMPOSTONOTASELECT
INCENTIVOPRODUCAOSELECT
ITEMTABDESCLEITESELECT
LINHACAPTACAOSELECT
MOVTOFECHAMENTOCONTRSELECT
MOVTOLEITESELECT
MOVTOLEITENOTASELECT
MUNICIPIOSELECT
NOTASELECT
PAISBACENSELECT
PARMFATURSELECT
PARMLEITESELECT
PESSOASELECT
PESSOAFISICASELECT
PRODUTORESTRUTURASELECT
PRODUTORLEITESELECT
REGIAOCOMERCIALSELECT
RESULTADOANALISESELECT
ROTACAPTACAOSELECT
TABDESCLEITESELECT
TRANSFERENCIALEITESELECT

Dependencias Aferentes (quem alimenta esta tela)​

Telas que escrevem em tabelas lidas por RCA001. Top 30 (de 583 telas consumidoras — ver IMPACT-MAP para lista completa).

TelaTítuloTabelas em Comum
CNF001Consulta de Notas FiscaisCONTAS, EMBARQUE, EMPRESA, ITEM, PESSOA
MCA012Consulta/Alteracao de Lancamento diario de LeiteCAPTACAOLEITE, CONTRATOLEITE, EMPRESA, MOVTOLEITE, PESSOA
MNF001Recebimento de Notas Fiscais de CompraEMBARQUE, EMPRESA, ENDERECOPESSOA, ITEM, PESSOA
MNF011Alteracao de ComissoesCONTAS, EMPRESA, ENDERECOPESSOA, ITEM, PESSOA
MNF030(sem titulo)EMBARQUE, EMPRESA, ENDERECOPESSOA, ITEM, PESSOA
MPD010Ordem de CarregamentoEMBARQUE, EMPRESA, FORMAPAGTO, MUNICIPIO, PESSOA
RNF005Demonstrativo de Notas FiscaisEMPRESA, HISTORICO, ITEM, MOTORISTA, PESSOA
TFA006Tabelas de PrecoEMPRESA, FORMAPAGTO, ITEM, PARMFATUR, PESSOA
CNF012Consulta de CTRCCONTAS, EMPRESA, ITEM, PESSOA
CPD008(sem titulo)CONTAS, EMPRESA, ITEM, PESSOA
MCA004Fechamento de ContratosCONTAS, EMPRESA, FECHAMENTOCONTRATO, FECHAMENTODEBITO
MCA013(sem titulo)CONTAS, EMPRESA, FECHAMENTOCONTRATO, FECHAMENTODEBITO
MCB015Envio de EmailEMPRESA, FORMAPAGTO, MUNICIPIO, PESSOA
MFC009Alteracao de DuplicatasCONTAS, CONTASHISTORICO, HISTORICO, PESSOA
MFC019Reparcelamento de ContasCONTAS, CONTASHISTORICO, EMPRESA, PESSOA
MPD011Confirmacao Ordem CarregamentoCONTAS, EMBARQUE, EMPRESA, PESSOA
MPD046(sem titulo)CONTAS, EMPRESA, ITEM, PESSOA
MRC019Ordem de Carregamento RecapadoraEMBARQUE, EMPRESA, MUNICIPIO, PESSOA
MRC020Confirmacao de Ordem de Carregamento RecapadoraCONTAS, EMBARQUE, EMPRESA, PESSOA
MRC048Montagem Ordem Carregamento Automatica - Pre-FaturamentoEMBARQUE, EMPRESA, MUNICIPIO, PESSOA
MRC049Faturamento Automatico de Ordem de CarregamentoCONTAS, EMBARQUE, EMPRESA, PESSOA
RNF002Comissao sobre Notas FiscaisEMPRESA, HISTORICO, ITEM, PESSOA
RNF004Relacao de Notas FiscaisEMPRESA, ITEM, MUNICIPIO, PESSOA
RNF040Vendas Agrupadas por ProdutosEMPRESA, ITEM, MUNICIPIO, PESSOA
CCO001Consulta de CotacoesEMPRESA, ITEM, PESSOA
CFC001Contas / Cheques / AdiantamentosCONTASHISTORICO, HISTORICO, PESSOA
CNF002Troca de MercadoriasEMPRESA, ITEM, PESSOA
CNF005Analise de Produtos para CompraEMPRESA, ITEM, PESSOA
CNF008Demonstrativo de Margens sobre VendasEMPRESA, ITEM, PESSOA
CNF011Consulta de NFS-eEMPRESA, ITEM, PESSOA

Aferentes diretas do dominio Captacao (principais alimentadores): MCA001 Contratos (CONTRATOLEITE), MCA002 Movtos de Leite (MOVTOLEITE), MCA004 Fechamento de Contratos (FECHAMENTOCONTRATO, FECHAMENTODEBITO, CONTAS), MCA012 Lancamento diario de Leite (MOVTOLEITE, CAPTACAOLEITE), CAP001 Parametros de Captacao (PARMLEITE), TCA001 Produtor de Leite (PRODUTORLEITE), TCA005 Linha de Captacao (LINHACAPTACAO), MCA003 Embarque (EMBARQUE), TTR005 Motorista (MOTORISTA).

+553 telas demais alimentam tabelas comuns (PESSOA, EMPRESA, MUNICIPIO, ITEM, CONTAS) — ver docs/screens/IMPACT-MAP.md para lista exaustiva.

Dependencias Eferentes (quem consome dados desta tela)​

Nenhuma — RCA001 nao escreve em tabelas de negocio (apenas gera arquivos .raf de relatorio e grava metadata de auditoria em RELATORIO via framework). Nao ha telas que consumam dados produzidos por este módulo.

Regras de Negocio​

  1. Empresa obrigatoria — validacao no inicio do btnImprimir.OnClick (W-0000: A Empresa deve ser Informada!). F9 usa EMPRESAUSUARIO filtrando pelo usuario logado.
  2. Competencia obrigatoria para modelos nao-"N" — quando o modelo nao e "Extrato de Contratos" (N), a competencia e obrigatoria; caso nao preenchida, exibe W-0000: A Data de Competencia deve ser informada!.
  3. Dia de Pagamento — aceita apenas numero inteiro entre 1 e 31; validacao no tabFILTRODIA_PAGTOValidate.
  4. Validacao de Produtor — ao digitar codigo no grid de Pessoas, verifica existencia em PESSOA INNER JOIN PRODUTORLEITE com ST_ATIVO = 'S'. Se nao encontrado: W-0000: O Produtor nao Esta Cadastrado. Verifique! [TCA001].
  5. Validacao de Motorista — consulta PESSOA INNER JOIN MOTORISTA com ST_ATIVA = 'S'. Se nao encontrado: W-0000: Motorista nao Esta Cadastrado! Verifique [TTR005].
  6. Validacao de Rota — consulta LINHACAPTACAO.CD_LINHACAPTACAO. Se nao encontrada: W-0000: A Linha de Captacao nao esta cadastrado! Verifique [TCA005].
  7. Registro de Relatório — todo relatorio gerado (qualquer modelo) registra metadata em RELATORIO via GravaRelatorio(transaction, nm_relatorio, sql, now, cd_empresa, cd_usuario). O NR_RELATORIO retornado substitui o placeholder CAST(NULL AS VARCHAR(25)) no SQL via StringReplace.
  8. Arquivamento fisico — cada relatorio e salvo como .raf em sessao.Path\Relatórios\<nm_relatorio>_<NR_RELATORIO>.raf antes de ser exibido no visualizador (CarregaVisualizador).
  9. Layout customizavel — o arquivo .rtm e buscado primeiro em sessao.Path\Custom\<nm_relatorio>.RTM; se nao existir, usa sessao.Path\<nm_relatorio>.RTM. Permite customizacao do layout por cliente sem mudar o deploy padrao.
  10. Quebra por Motorista so no Modelo "P" — checkbox chkQuebraMotorista so fica visivel quando TP_MODELO = 'P' (Compra de Leite por Produtor).
  11. Ordenacao so no Modelo "N" — o combo "Ordenacao" so fica visivel para o Modelo padrao (N - Extrato de Contratos); os demais modelos tem ordenacao fixa no SQL.
  12. Modelo "R" pergunta sobre Debitos Pendentes — antes de imprimir o Extrato Simples, a tela exibe C-0000: Deseja Imprimir os Debitos Pendentes do Produtor?; se "Nao", oculta a regiao regionContasPendentes do layout.
  13. AfterScroll carrega detalhe por contrato (Modelo R) — quando tabLEITE muda de registro, o evento tabLEITEAfterScroll recarrega tabMovimentacao, tabCREDITO, tabDEBITO e tabContasPendente para o contrato corrente. E este mecanismo que alimenta as regioes de sub-relatorio.
  14. Filtro de Situacao se comporta diferente por modelo — "Aberto"/"Fechado" aplica a ML.ST_MOVTOLEITE (A/N) nos modelos R/P/M e a CL.ST_CONTRATOLEITE (V/F ou <>F) nos modelos S/T.

Datasets e SQL​

DatasetPapel
tabFILTROClientDataSet em memoria com filtros da UI (CD_EMPRESA, DT_COMPETENCIA, CD_ROTA, TP_MODELO, ST_CONTRATO, ST_ORDENACAO, DIA_PAGTO, QB_MOTORISTA).
cdsPessoaClientDataSet com lista de produtores selecionados via F9 no grid "Pessoas".
cdsContratoClientDataSet com contratos selecionados no grid "Contratos".
tabMOTORISTAMotoristas selecionados no grid "Motoristas".
ContratoDataset principal dos modelos 1/2 (Extrato analitico) e 5 (Sintetico). Popula o relatorio Extrato ou Sintetico.
tabLEITEDataset principal do modelo 6 (Simples). Ao scroll, carrega sub-queries de debito/credito/pendentes/movimentação.
tabCOMPRAMOTDataset dos modelos 3 e 4 (Matriz diaria por motorista/produtor) — usa VIEW_RCA001.
tabCREDITOSub-relatorio: pagamentos/creditos do produtor (CONTAS com TP_CONTAS='R').
tabDEBITOSub-relatorio: descontos/debitos (CONTAS com TP_CONTAS='P').
tabContasPendenteContas em aberto do produtor (sem baixa).
tabAnaliseAnalise de qualidade do leite (gordura, proteina, CCS, CBT) via FORMATA_ANALISE.
tabResumoTotais agregados do contrato (QT_RECEBIDA, QT_TRANSFENTRADA, QT_TRANSFSAIDA, QT_CONDENADO, QT_DEVOLUCAO, VL_PRECO, VL_IMPOSTO, VL_FRETE, VL_DESPESA, VL_SALDO).
tabINCENTIVO / tabDemonstrativoIncentivos calculados via CALCULA_INCENTIVOANALISE / CALCULA_INCENTIVOPRODUCAO (Modelo "E").
tabMovimentacaoDetalhamento dia-a-dia de movimentação do contrato.
tabContasContas consolidadas (credito/debito/total) do contrato.

Reports ReportBuilder: Extrato (Modelo N/E), Sintetico (S), CompraMot (M), CompraProd (P), Relatório (R). Modelos T e L delegam para helper GeraRelatorio (framework jReport).

Modelos de Relatório​

Selecionados pelo combobox "Modelo" (campo TP_MODELO em tabFILTRO). Conforme o modelo escolhido, o handler btnImprimir.OnClick monta um SQL diferente, carrega um .rtm especifico e grava um registro em RELATORIO via GravaRelatorio.

Modelo 1: Extrato de Contratos​

Quando usado: combo "Modelo" = "Extrato de Contratos" (valor N, default).

Layout analitico completo por contrato (RCA001.rtm). Mostra cabecalho com empresa, endereco e dados do produtor; total recebido, transferencias de entrada/saida, devolucoes, condenacoes, indenizacao, quitacao; credito (pagamentos recebidos), debitos (impostos, descontos, adiantamentos, insumos, frete), analise de qualidade do leite (gordura, proteina, CCS, CBT) e recibo juridico em extenso. E o relatorio entregue ao produtor no fechamento mensal.

SQL Base (dataset Contrato):

SELECT EMP.NM_EMPRESA, C.CD_EMPRESA, C.NR_CONTRATO, C.DT_COMPETENCIA, C.CD_PESSOA,
C.CD_ENDERECO, EP.DS_ENDERECO, FE.DT_FECHAMENTO, C.DT_ABERTURA,
CASE WHEN C.ST_CONTRATOLEITE = 'V' THEN 'Valido'
WHEN C.ST_CONTRATOLEITE = 'C' THEN 'Cancelado'
WHEN C.ST_CONTRATOLEITE = 'F' THEN 'Fechado' END ST_CONTRATO,
C.CD_FORMAPAGTO, C.DT_VENCTOPAGTO, C.VL_FRETE, C.VL_DESPESA,
P.NM_PESSOA||' - '||P.CD_PESSOA NM_PESSOA, P.NR_CNPJCPF,
FPG.DS_FORMAPAGTO,
MUNICIPIO.DS_MUNICIPIO||' - '||MUNICIPIO.SG_ESTADO DS_MUNICIPIO,
COALESCE(EP.NR_FONE, EP.NR_CELULAR, EP.NR_FAX) NR_FONE,
(SELECT DS_OBSERVACAO FROM PARMLEITE WHERE CD_EMPRESA = C.CD_EMPRESA) DS_MENSAGEM,
MIN((SELECT EMB.CD_MOTORISTA FROM EMBARQUE EMB
WHERE EMB.NR_EMBARQUE = ML.NR_EMBARQUE
AND EMB.CD_EMPRESA = ML.CD_EMPRESA
/* filtro opcional de motorista */)) CD_MOTORISTA,
CI.OQT_INCENTIVO QT_INCENTIVO,
'Recebi de '||EMP.NM_EMPRESA||', a importancia... de R$ '||FE.VL_SALDO||
' ('||VL.O_VALOR||'), referente ao meu fornecimento de '||FE.QT_FECHAMENTO||
' litros de Leite cru in natura durante o mes de '||M.O_DS_MES||' de '||
COPIA_TEXTO(C.DT_COMPETENCIA, 4, 7)||'. ...' RECIBO,
((SELECT OQT_SALDO FROM SALDO_CONTRATOLEITE('C', C.CD_EMPRESA, C.NR_CONTRATO, NULL)) +
(SELECT OQT_SALDO FROM SALDO_CONTRATOLEITE('T', C.CD_EMPRESA, C.NR_CONTRATO, NULL))) QT_RECEBIDA,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO,
RD.DS_ENDERECO EDS_ENDERECO, RD.DS_MUNICIPIO||'/'||RD.SG_ESTADO EDS_MUNICIPIO,
RD.NR_CEP ENR_CEP, RD.DS_EMAIL EDS_EMAIL, RD.DS_SITE EDS_SITE,
RD.NR_CNPJCPF ENR_CNJPCPF, RD.NR_INSCEST ENR_INSCEST,
COALESCE(RD.NR_FONE, RD.NR_FAX, RD.NR_CELULAR) ENR_FONE,
PF.DS_LOGOTIPO
FROM CONTRATOLEITE C
INNER JOIN PESSOA P ON (C.CD_PESSOA = P.CD_PESSOA)
INNER JOIN ENDERECOPESSOA EP ON (EP.CD_PESSOA = C.CD_PESSOA AND EP.CD_ENDERECO = C.CD_ENDERECO)
INNER JOIN FORMAPAGTO FPG ON (FPG.CD_FORMAPAGTO = C.CD_FORMAPAGTO)
INNER JOIN MUNICIPIO ON (MUNICIPIO.CD_MUNICIPIO = EP.CD_MUNICIPIO)
INNER JOIN EMPRESA ON (EMPRESA.CD_EMPRESA = C.CD_EMPRESA)
INNER JOIN PARMFATUR PF ON (PF.CD_EMPRESA = EMPRESA.CD_EMPRESA)
LEFT JOIN RETORNA_DADOSCADASTRAIS(EMPRESA.CD_PESSOA, NULL) RD ON (1=1)
LEFT JOIN FECHAMENTOCONTRATO FE ON (FE.CD_EMPRESA = C.CD_EMPRESA
AND FE.NR_CONTRATO = C.NR_CONTRATO
AND FE.DT_CANCELAMENTO IS NULL
AND FE.NR_SEQUENCIAL = (SELECT MAX(NR_SEQUENCIAL)
FROM FECHAMENTOCONTRATO
WHERE CD_EMPRESA = C.CD_EMPRESA
AND NR_CONTRATO = C.NR_CONTRATO
AND DT_CANCELAMENTO IS NULL))
INNER JOIN EMPRESA EMP ON (EMP.CD_EMPRESA = C.CD_EMPRESA)
INNER JOIN MOVTOLEITE ML ON (ML.CD_EMPRCONTRATO = C.CD_EMPRESA
AND ML.NR_CONTRATO = C.NR_CONTRATO)
INNER JOIN CAPTACAOLEITE CPL ON (CPL.CD_EMPREMBARQUE = C.CD_EMPRESA
AND CPL.NR_PLACA = ML.NR_PLACA
AND CPL.NR_EMBARQUE = ML.NR_EMBARQUE)
INNER JOIN ROTACAPTACAO R ON (R.NR_PLACA = CPL.NR_PLACA
AND R.CD_LINHACAPTACAO = CPL.CD_LINHACAPTACAO)
INNER JOIN LINHACAPTACAO LP ON (LP.CD_LINHACAPTACAO = R.CD_LINHACAPTACAO)
LEFT JOIN MES_EXTENSO('01.'||REPLACE(C.DT_COMPETENCIA,'/','.')) M ON (1=1)
LEFT JOIN VALOR_EXTENSO(FE.VL_SALDO) VL ON (1=1)
LEFT JOIN CALCULA_INCENTIVOPRODUCAO(C.CD_EMPRESA, C.NR_CONTRATO, NULL, NULL) CI ON (1=1)
/* WHERE dinamico: ML.ST_MOVTOLEITE, CD_EMPRESA, DT_COMPETENCIA,
CD_PESSOA IN (...), NR_CONTRATO IN (...),
CD_MOTORISTA IN (...), CD_LINHACAPTACAO */
GROUP BY ...
ORDER BY NM_PESSOA | CD_PESSOA | DS_MUNICIPIO

Sub-relatorios auxiliares populados via AfterScroll do tabLEITE (no modelo "R") e tabLEITEAfterScroll: tabCREDITO, tabDEBITO, tabContasPendente, tabMovimentacao, tabAnalise, tabResumo, tabINCENTIVO, tabDemonstrativo.

Layout: dist/Relatórios/RCA001.rtm (ou Custom/RCA001.rtm).

Modelo 2: Extrato de Contratos / Incentivos​

Quando usado: combo "Modelo" = "Extrato de Contratos / Incentivos" (valor E).

Variante do Modelo 1 com secao adicional de incentivos/bonificacoes por analise (gordura, proteina, volume). SQL base identico ao Modelo 1; diferenca esta no layout .rtm que inclui a regiao de incentivos alimentada por tabINCENTIVO e tabDemonstrativo via procedures CALCULA_INCENTIVOANALISE / CALCULA_INCENTIVOPRODUCAO.

Layout: dist/Relatórios/RCA001_E.rtm.

Modelo 3: Compra de Leite por Motorista​

Quando usado: combo "Modelo" = "Compra de Leite por Motorista" (valor M).

Planilha diaria (dias 1 a 31) da competencia agrupada por motorista e linha de captacao. Cada linha do relatorio e um motorista; colunas mostram litros coletados por dia do mes. Usado para controle operacional da frota.

SQL Base (dataset tabCOMPRAMOT):

SELECT SUM(V.V_QT_DIA1) V_QT_DIA1, ... SUM(V.V_QT_DIA31) V_QT_DIA31,
V.V_NM_MOTORISTA, V.V_NR_PLACAMOTORISTA,
CAST(NULL AS VARCHAR(2)) NM_PRODUTOR,
V.V_TP_MOTIVOLEITE,
V.V_DS_LINHACAPTACAO, V.V_CD_LINHACAPTACAO,
SUM(V.QT_TOTALEMPRESA) QT_TOTALEMPRESA,
NM_EMPRESA, DS_ENDERECO, DS_MUNICIPIOBAIRRO, NR_FONE, DS_SITE,
DS_LOGOTIPO, DS_EMAIL, NR_INSCESTAD, NR_CPFCNPJ, ODT_COMPETENCIA,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO
FROM VIEW_RCA001(:CD_EMPRESA, NULL, 'M', :FILTRO) V
GROUP BY V.V_TP_MOTIVOLEITE, V.V_DS_LINHACAPTACAO, V.V_CD_LINHACAPTACAO,
V.V_NM_MOTORISTA, V.V_NR_PLACAMOTORISTA, NM_EMPRESA,
DS_ENDERECO, DS_MUNICIPIOBAIRRO, NR_FONE, DS_SITE, DS_LOGOTIPO,
DS_EMAIL, NR_INSCESTAD, NR_CPFCNPJ, ODT_COMPETENCIA
ORDER BY V.V_CD_LINHACAPTACAO, V.V_NM_MOTORISTA

Layout: dist/Relatórios/RCA001_M.rtm.

Modelo 4: Compra de Leite por Produtor​

Quando usado: combo "Modelo" = "Compra de Leite por Produtor" (valor P).

Mesma matriz diaria (dias 1 a 31) do Modelo 3, porem agrupada por produtor (CD_PESSOA). Quando o checkbox "Quebra por Motorista" esta marcado (QB_MOTORISTA = 'T'), acrescenta quebra intermediaria por motorista (V_NM_MOTORISTA).

SQL Base (dataset tabCOMPRAMOT):

SELECT SUM(V.V_QT_DIA1) V_QT_DIA1, ... SUM(V.V_QT_DIA31) V_QT_DIA31,
/* se Quebra por Motorista: V.V_NR_PLACAMOTORISTA, V.V_TP_MOTIVOLEITE, */
(LIST(DISTINCT ' '||V.V_CD_LINHACAPTACAO||' - '||V.V_DS_LINHACAPTACAO)) V_DS_LINHACAPTACAO,
SUM(V.QT_TOTALEMPRESA) QT_TOTALEMPRESA,
NM_EMPRESA, DS_ENDERECO, DS_MUNICIPIOBAIRRO, NR_FONE, DS_SITE,
DS_LOGOTIPO, DS_EMAIL, NR_INSCESTAD, NR_CPFCNPJ,
CD_PRODUTOR||' - '||V.NM_PRODUTOR NM_PRODUTOR,
ODT_COMPETENCIA,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO
FROM VIEW_RCA001(:CD_EMPRESA, NULL, 'M', :FILTRO) V
GROUP BY V.V_TP_MOTIVOLEITE, /* se Quebra: V.V_NR_PLACAMOTORISTA, */
NM_EMPRESA, DS_ENDERECO, DS_MUNICIPIOBAIRRO, NR_FONE, DS_SITE,
DS_LOGOTIPO, DS_EMAIL, CD_PRODUTOR, NR_INSCESTAD, NR_CPFCNPJ,
V.NM_PRODUTOR, ODT_COMPETENCIA
/* se Quebra: , V.V_NM_MOTORISTA */
ORDER BY NM_PRODUTOR /* se Quebra: , V.V_NM_MOTORISTA */

Layout: dist/Relatórios/RCA001_P.rtm.

Modelo 5: Contratos - Sintetico​

Quando usado: combo "Modelo" = "Contratos - Sintetico" (valor S).

Lista 1 linha por contrato do periodo (sem detalhamento de movimentos). Rapido para visao geral de contratos fechados/validos.

SQL Base (dataset Contrato):

SELECT DISTINCT EMP.NM_EMPRESA, CL.CD_EMPRESA, CL.NR_CONTRATO, CL.DT_COMPETENCIA,
CL.CD_PESSOA, CL.CD_ENDERECO, EP.DS_ENDERECO, FE.DT_FECHAMENTO, CL.DT_ABERTURA,
CASE WHEN CL.ST_CONTRATOLEITE = 'V' THEN 'Valido'
WHEN CL.ST_CONTRATOLEITE = 'C' THEN 'Cancelado'
WHEN CL.ST_CONTRATOLEITE = 'F' THEN 'Fechado' END ST_CONTRATO,
((100.00*300)*0) QT_INCENTIVO,
CL.CD_FORMAPAGTO, CL.DT_VENCTOPAGTO, CL.VL_FRETE, CL.VL_DESPESA,
P.NM_PESSOA||' - '||P.CD_PESSOA NM_PESSOA, P.NR_CNPJCPF,
FPG.DS_FORMAPAGTO,
MUNICIPIO.DS_MUNICIPIO||' - '||MUNICIPIO.SG_ESTADO DS_MUNICIPIO,
COALESCE(EP.NR_FONE, EP.NR_CELULAR, EP.NR_FAX) NR_FONE,
(SELECT DS_OBSERVACAO FROM PARMLEITE WHERE CD_EMPRESA = CL.CD_EMPRESA) DS_MENSAGEM,
(SELECT MIN(EMB.CD_MOTORISTA) FROM EMBARQUE EMB
INNER JOIN MOVTOLEITE MV ON (EMB.NR_EMBARQUE = MV.NR_EMBARQUE
AND EMB.CD_EMPRESA = MV.CD_EMPRESA)
WHERE MV.NR_CONTRATO = CL.NR_CONTRATO
AND MV.CD_EMPRESA = CL.CD_EMPRESA /* filtro motorista */) CD_MOTORISTA,
'' RECIBO,
CAST(NULL AS NUMERIC(15,2)) QT_RECEBIDA,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO,
RD.DS_ENDERECO EDS_ENDERECO, ..., PF.DS_LOGOTIPO
FROM CONTRATOLEITE CL
INNER JOIN PRODUTORLEITE PL ON (PL.CD_PESSOA = CL.CD_PESSOA AND PL.CD_ENDERECO = CL.CD_ENDERECO)
INNER JOIN PESSOA P ON (CL.CD_PESSOA = P.CD_PESSOA)
INNER JOIN ENDERECOPESSOA EP ON (EP.CD_PESSOA = CL.CD_PESSOA AND EP.CD_ENDERECO = CL.CD_ENDERECO)
INNER JOIN FORMAPAGTO FPG ON (FPG.CD_FORMAPAGTO = CL.CD_FORMAPAGTO)
INNER JOIN MUNICIPIO ON (MUNICIPIO.CD_MUNICIPIO = EP.CD_MUNICIPIO)
LEFT JOIN FECHAMENTOCONTRATO FE ON (FE.CD_EMPRESA = CL.CD_EMPRESA
AND FE.NR_CONTRATO = CL.NR_CONTRATO
AND FE.DT_CANCELAMENTO IS NULL
AND FE.NR_SEQUENCIAL = (SELECT MAX(NR_SEQUENCIAL) ...))
INNER JOIN EMPRESA EMP ON (EMP.CD_EMPRESA = CL.CD_EMPRESA)
INNER JOIN PARMFATUR PF ON (PF.CD_EMPRESA = EMP.CD_EMPRESA)
LEFT JOIN RETORNA_DADOSCADASTRAIS(EMP.CD_PESSOA, NULL) RD ON (1=1)
LEFT JOIN MOVTOLEITE MV ON (MV.NR_CONTRATO = CL.NR_CONTRATO AND MV.CD_EMPRESA = CL.CD_EMPRESA)
LEFT JOIN EMBARQUE EMB ON (EMB.NR_EMBARQUE = MV.NR_EMBARQUE AND EMB.CD_EMPRESA = MV.CD_EMPRESA)
LEFT JOIN PESSOA MOT ON (MOT.CD_PESSOA = EMB.CD_MOTORISTA)
INNER JOIN CAPTACAOLEITE CPL ON (CPL.CD_EMPREMBARQUE = CL.CD_EMPRESA
AND CPL.NR_PLACA = MV.NR_PLACA
AND CPL.NR_EMBARQUE = MV.NR_EMBARQUE)
INNER JOIN ROTACAPTACAO R ON (R.NR_PLACA = CPL.NR_PLACA
AND R.CD_LINHACAPTACAO = CPL.CD_LINHACAPTACAO)
INNER JOIN LINHACAPTACAO LP ON (LP.CD_LINHACAPTACAO = R.CD_LINHACAPTACAO)
/* filtro: CL.ST_CONTRATOLEITE, CL.DT_COMPETENCIA, pessoa/contrato/motorista/linha */

Layout: dist/Relatórios/RCA001_S.rtm.

Modelo 6: Extrato de Contratos - Simples​

Quando usado: combo "Modelo" = "Extrato de Contratos - Simples" (valor R).

Extrato resumido por produtor com credito, debito, saldo, contas pendentes, analise e dados bancarios (Banco, Agencia, Conta Corrente) e rota de captacao — mais enxuto que o Modelo 1.

SQL Base (dataset tabLEITE):

SELECT EDS_ENDERECO, EDS_MUNICIPIO, ENR_CEP, EDS_EMAIL, EDS_SITE, ENR_CNJPCPF,
ENR_INSCEST, ENR_FONE, DS_LOGOTIPO, NM_PESSOA, DS_ENDERECO, DS_MUNICIPIO,
NR_CNPJCPF, NR_FONE, DT_COMPETENCIA, NR_CONTRATO, VL_SALDO, VL_CREDITO,
VL_DEBITO, VL_PRECO, QT_FECHAMENTO, ST_CONTRATOLEITE, VL_TOTALIMPOSTO,
TP_MOVTOLEITE, CD_PESSOA, QT_INCENTIVO, NR_RELATORIO,
DT_COMPINICIAL, DT_COMPFINAL,
CD_BANCOPESSOA, DS_BANCOPESSOA, CD_AGENCIAPESSOA, NR_CONTACORPESSOA,
CAST(LIST(DS_ROTACAPTACAO) AS DOM_VARCHAR500) DS_ROTACAPTACAO,
CAST(LIST(CD_LINHACAPTACAO) AS DOM_VARCHAR32) CD_LINHACAPTACAO,
CAST(LIST(DS_LINHACAPTACAO) AS DOM_VARCHAR500) DS_LINHACAPTACAO
FROM (
SELECT DISTINCT
RD.DS_ENDERECO EDS_ENDERECO, ...,
(SELECT DS_LOGOTIPO FROM PARMFATUR WHERE CD_EMPRESA = CL.CD_EMPRESA) DS_LOGOTIPO,
P.NM_PESSOA, E.DS_ENDERECO, MP.DS_MUNICIPIO||MP.SG_ESTADO DS_MUNICIPIO,
P.NR_CNPJCPF, E.NR_FONE, CL.DT_COMPETENCIA, CL.NR_CONTRATO,
F.VL_SALDO, F.VL_CREDITO, F.VL_DEBITO, F.VL_PRECO, F.QT_FECHAMENTO,
CL.ST_CONTRATOLEITE, F.VL_TOTALIMPOSTO,
CASE WHEN ML.TP_MOVTOLEITE = 'C' THEN 'Recebimento'
WHEN ML.TP_MOVTOLEITE = 'E' THEN 'Transferencia de Entrada'
WHEN ML.TP_MOVTOLEITE = 'S' THEN 'Transferencia de Saida'
WHEN ML.TP_MOVTOLEITE = 'D' THEN 'Devolucao' END TP_MOVTOLEITE,
CL.CD_PESSOA, CI.OQT_INCENTIVO QT_INCENTIVO,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO,
/* DT_COMPINICIAL / DT_COMPFINAL calculadas a partir de CL.DT_COMPETENCIA */
COALESCE(BP.CD_BANCO, 0) CD_BANCOPESSOA,
COALESCE(BP.DS_BANCO, 'SEM BANCO') DS_BANCOPESSOA,
COALESCE(AP.CD_AGENCIA, 0) CD_AGENCIAPESSOA,
COALESCE(CCP.NR_CONTACOR, 0) NR_CONTACORPESSOA,
COALESCE(R.DS_ROTACAPTACAO, 'Sem Rota de Captacao de Leite') DS_ROTACAPTACAO,
LP.CD_LINHACAPTACAO,
COALESCE(LP.DS_LINHACAPTACAO, '---') DS_LINHACAPTACAO
FROM CONTRATOLEITE CL
INNER JOIN PRODUTORLEITE PL ON (PL.CD_PESSOA = CL.CD_PESSOA AND PL.CD_ENDERECO = CL.CD_ENDERECO)
INNER JOIN FECHAMENTOCONTRATO F ON (F.CD_EMPRESA = CL.CD_EMPRESA
AND F.NR_CONTRATO = CL.NR_CONTRATO
AND F.DT_CANCELAMENTO IS NULL)
INNER JOIN MOVTOLEITE ML ON (ML.CD_EMPRCONTRATO = CL.CD_EMPRESA
AND ML.NR_CONTRATO = CL.NR_CONTRATO
AND F.NR_SEQUENCIAL = (SELECT MAX(NR_SEQUENCIAL)
FROM FECHAMENTOCONTRATO
WHERE CD_EMPRESA = CL.CD_EMPRESA
AND NR_CONTRATO = CL.NR_CONTRATO))
INNER JOIN EMPRESA ON (EMPRESA.CD_EMPRESA = CL.CD_EMPRESA)
LEFT JOIN RETORNA_DADOSCADASTRAIS(EMPRESA.CD_PESSOA, NULL) RD ON (1=1)
INNER JOIN PESSOA P ON (P.CD_PESSOA = CL.CD_PESSOA)
INNER JOIN ENDERECOPESSOA E ON (E.CD_PESSOA = CL.CD_PESSOA AND E.CD_ENDERECO = CL.CD_ENDERECO)
INNER JOIN MUNICIPIO MP ON (MP.CD_MUNICIPIO = E.CD_MUNICIPIO)
LEFT JOIN EMBARQUE EMB ON (EMB.NR_EMBARQUE = ML.NR_EMBARQUE AND EMB.CD_EMPRESA = ML.CD_EMPRESA)
LEFT JOIN PESSOA MOT ON (MOT.CD_PESSOA = EMB.CD_MOTORISTA)
LEFT JOIN CONTACORPESSOA CCP ON (CCP.CD_PESSOA = P.CD_PESSOA
AND CCP.NR_CONTACOR = (SELECT FIRST 1 NR_CONTACOR
FROM CONTACORPESSOA
WHERE CD_PESSOA = CCP.CD_PESSOA))
LEFT JOIN BANCO BP ON (BP.CD_BANCO = CCP.CD_BANCO)
LEFT JOIN AGENCIA AP ON (AP.CD_AGENCIA = CCP.CD_AGENCIA)
INNER JOIN CAPTACAOLEITE CPL ON (CPL.CD_EMPREMBARQUE = CL.CD_EMPRESA
AND CPL.NR_PLACA = ML.NR_PLACA
AND CPL.NR_EMBARQUE = ML.NR_EMBARQUE)
INNER JOIN ROTACAPTACAO R ON (R.NR_PLACA = CPL.NR_PLACA
AND R.CD_LINHACAPTACAO = CPL.CD_LINHACAPTACAO)
INNER JOIN LINHACAPTACAO LP ON (LP.CD_LINHACAPTACAO = R.CD_LINHACAPTACAO)
LEFT JOIN CALCULA_INCENTIVOPRODUCAO(CL.CD_EMPRESA, CL.NR_CONTRATO, NULL, NULL) CI ON (1=1)
/* filtro WHERE ML.ST_MOVTOLEITE, CD_EMPRESA, DT_COMPETENCIA, CD_PESSOA IN, NR_CONTRATO IN, CD_MOTORISTA IN, CD_LINHACAPTACAO */
)
GROUP BY EDS_ENDERECO, ..., NR_CONTACORPESSOA

Antes de imprimir, o sistema pergunta "Deseja Imprimir os Debitos Pendentes do Produtor?" — se "Nao", oculta a regiao regionContasPendentes.

Layout: dist/Relatórios/RCA001_R.rtm.

Modelo 7: Total Entregue por Produtor​

Quando usado: combo "Modelo" = "Total Entregue por Produtor" (valor T).

Consolidado simples por produtor no periodo: pessoa + endereco completo + quantidade total de leite entregue (soma de QT_LEITE). Usado para conferencia rapida de producao por fornecedor. Ignora movimentos cancelados (ST_MOVTOLEITE <> 'C').

SQL Base (chamado por GeraRelatorio):

SELECT DISTINCT
CL.CD_PESSOA, P.NM_PESSOA,
SUM(ML.QT_LEITE) QT_LEITE,
CL.CD_EMPRESA||' - '||EMPRESA.NM_EMPRESA CD_EMPRESA,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO,
P.NR_CNPJCPF,
EP.DS_ENDERECO, EP.NR_ENDERECO, EP.DS_BAIRRO, EP.NR_CEP,
M.DS_MUNICIPIO, EP.DS_COMPLEMENTO,
P.DS_OBSERVACAO, LP.CD_LINHACAPTACAO,
COALESCE(EP.DS_ENDERECO,'')||COALESCE(', '||EP.NR_ENDERECO,'')||
COALESCE(' - '||EP.DS_COMPLEMENTO,'')||COALESCE(' - '||EP.DS_BAIRRO,'') DS_ENDERECOCOMPLETO
FROM CAPTACAOLEITE LP
INNER JOIN MOVTOLEITE ML ON (ML.CD_EMPRESA = LP.CD_EMPREMBARQUE AND ML.NR_EMBARQUE = LP.NR_EMBARQUE)
INNER JOIN EMBARQUE EMB ON (EMB.CD_EMPRESA = ML.CD_EMPRESA AND EMB.NR_EMBARQUE = ML.NR_EMBARQUE)
INNER JOIN CONTRATOLEITE CL ON (CL.CD_EMPRESA = ML.CD_EMPRCONTRATO AND CL.NR_CONTRATO = ML.NR_CONTRATO)
INNER JOIN PRODUTORLEITE PL ON (PL.CD_PESSOA = CL.CD_PESSOA AND PL.CD_ENDERECO = CL.CD_ENDERECO)
INNER JOIN PESSOA P ON (P.CD_PESSOA = CL.CD_PESSOA)
LEFT JOIN PESSOA MOT ON (MOT.CD_PESSOA = EMB.CD_MOTORISTA)
INNER JOIN EMPRESA ON (EMPRESA.CD_EMPRESA = CL.CD_EMPRESA)
INNER JOIN ENDERECOPESSOA EP ON (EP.CD_PESSOA = PL.CD_PESSOA AND EP.CD_ENDERECO = PL.CD_ENDERECO)
INNER JOIN MUNICIPIO M ON (M.CD_MUNICIPIO = EP.CD_MUNICIPIO)
WHERE ML.ST_MOVTOLEITE <> 'C'
/* filtro: CL.CD_EMPRESA, CL.DT_COMPETENCIA, CL.CD_PESSOA IN, CL.NR_CONTRATO IN, MOT.CD_PESSOA IN, LP.CD_LINHACAPTACAO */
GROUP BY CL.CD_PESSOA, P.NM_PESSOA, CL.CD_EMPRESA, EMPRESA.NM_EMPRESA, P.NR_CNPJCPF,
EP.DS_ENDERECO, EP.NR_ENDERECO, EP.DS_COMPLEMENTO, EP.DS_BAIRRO, EP.NR_CEP,
M.DS_MUNICIPIO, P.DS_OBSERVACAO, LP.CD_LINHACAPTACAO, DS_ENDERECOCOMPLETO
ORDER BY P.NM_PESSOA

Layout: dist/Relatórios/RCA001_T.rtm (via GeraRelatorio).

Modelo 8: Total Entregue por Linha de Captacao​

Quando usado: combo "Modelo" = "Total Entregue por Linha de Captacao" (valor L).

Sumario por linha de captacao: total de leite, preco medio contratado, numero de produtores ativos e media por produtor. Filtra contratos por ST_CONTRATOLEITE = 'V' (se Situacao="Aberto") ou 'F' (se "Fechado").

SQL Base (chamado por GeraRelatorio):

SELECT LP.CD_LINHACAPTACAO||' - '||LP.DS_LINHACAPTACAO NM_LINHACAPTACAO,
CL.CD_EMPRESA||' - '||EMPRESA.NM_EMPRESA CD_EMPRESA,
SUM(ML.QT_LEITE) TT_LEITE,
AVG(CL.VL_CONTRATADO) VL_PRECO,
COUNT(DISTINCT PL.CD_PESSOA) QT_PRODUTORES,
CAST(SUM(ML.QT_LEITE) / COALESCE(NULLIF(COUNT(DISTINCT PL.CD_PESSOA),0),1) AS DOM_NUMERIC15_2) QT_LEITE,
CAST(NULL AS VARCHAR(25)) NR_RELATORIO
FROM EMBARQUE EMB
INNER JOIN CAPTACAOLEITE CP ON (CP.NR_EMBARQUE = EMB.NR_EMBARQUE
AND CP.CD_EMPREMBARQUE = EMB.CD_EMPRESA
AND CP.NR_PLACA = EMB.NR_PLACA)
INNER JOIN MOVTOLEITE ML ON (ML.CD_EMPRESA = CP.CD_EMPREMBARQUE AND ML.NR_EMBARQUE = CP.NR_EMBARQUE)
INNER JOIN CONTRATOLEITE CL ON (CL.CD_EMPRESA = ML.CD_EMPRCONTRATO
AND CL.NR_CONTRATO = ML.NR_CONTRATO
AND CL.ST_CONTRATOLEITE = :ST /* 'V' se Aberto, 'F' se Fechado */)
INNER JOIN PRODUTORLEITE PL ON (PL.CD_PESSOA = CL.CD_PESSOA AND PL.CD_ENDERECO = CL.CD_ENDERECO)
INNER JOIN PESSOA P ON (P.CD_PESSOA = CL.CD_PESSOA)
INNER JOIN LINHACAPTACAO LP ON (CP.CD_LINHACAPTACAO = LP.CD_LINHACAPTACAO)
LEFT JOIN PESSOA MOT ON (MOT.CD_PESSOA = EMB.CD_MOTORISTA)
INNER JOIN EMPRESA ON (EMPRESA.cd_empresa = CL.CD_EMPRESA)
WHERE ML.ST_MOVTOLEITE <> 'C'
/* filtro: empresa, periodo, pessoa IN, contrato IN, motorista IN, linha captacao */
GROUP BY LP.CD_LINHACAPTACAO, LP.DS_LINHACAPTACAO, CL.CD_EMPRESA, EMPRESA.NM_EMPRESA
ORDER BY LP.CD_LINHACAPTACAO

Layout: dist/Relatórios/RCA001_L.rtm (via GeraRelatorio).