Skip to content

Instantly share code, notes, and snippets.

@AndyDaSilva52
Last active July 8, 2019 14:32
Show Gist options
  • Save AndyDaSilva52/94fdedc676ba8c3c9c247a5d6c73e543 to your computer and use it in GitHub Desktop.
Save AndyDaSilva52/94fdedc676ba8c3c9c247a5d6c73e543 to your computer and use it in GitHub Desktop.
#Mega - Função para Validar Chave em Lançamentos de Entrada do Mega (NFe ou CTe)
create or replace FUNCTION F_VALIDA_CHAVE
(
pRCB_ST_CHAVEACESSO IN MGADM.EST_RECEBIMENTO.RCB_ST_CHAVEACESSOCTE%TYPE,
pUF_ST_SIGLA IN MGGLO.GLO_AGENTES.UF_ST_SIGLA%TYPE,
pRCB_DT_DOCUMENTO IN MGADM.EST_RECEBIMENTO.RCB_DT_DOCUMENTO%TYPE,
pAGN_ST_CGC IN MGGLO.GLO_AGENTES.AGN_ST_CGC%TYPE,
pTDF_IN_CODIGO IN MGADM.EST_RECEBIMENTO.TDF_IN_CODIGO%TYPE,
pSER_ST_CODIGO IN MGADM.EST_RECEBIMENTO.SER_ST_CODIGO%TYPE,
pRCB_ST_NOTA IN MGADM.EST_RECEBIMENTO.RCB_ST_NOTA%TYPE
) RETURN VARCHAR2 AS -- Retorna 'S' caso seja válido
/**
• cUF - Código da UF do emitente do Documento Fiscal - Tamanho: 2
• AAMM - Ano e Mês de emissão da NF-e / CT-e - Tamanho: 4
• CNPJ - CNPJ do emitente - Tamanho: 14
• mod - Modelo do Documento Fiscal - Tamanho: 2
• Serie - Série do Documento Fiscal - Tamanho: 3
• nCT - Número do Documento Fiscal - Tamanho: 9
• tpEmis – Forma de emissão da NF-e / CT-e - Tamanho: 1
• cCT - Código Numérico que compõe a Chave de Acesso - Tamanho: 8
• cDV - Dígito Verificador da Chave de Acesso - Tamanho: 1
*/
vRCB_ST_CHAVEACESSO MGADM.EST_RECEBIMENTO.RCB_ST_CHAVEACESSOCTE%TYPE;
vUF_IN_CODIGO MGGLO.GLO_AGENTES.UF_ST_SIGLA%TYPE;
vRCB_DT_DOCUMENTO MGADM.EST_RECEBIMENTO.RCB_DT_DOCUMENTO%TYPE;
vAGN_ST_CGC MGGLO.GLO_AGENTES.AGN_ST_CGC%TYPE;
vTDF_IN_CODIGO MGADM.EST_RECEBIMENTO.TDF_IN_CODIGO%TYPE;
vMOD_ST_MODELO MGTRF.TRF_MODELODOC.MOD_ST_MODELO%TYPE;
vSER_ST_CODIGO MGADM.EST_RECEBIMENTO.SER_ST_CODIGO%TYPE;
vRCB_ST_NOTA MGADM.EST_RECEBIMENTO.RCB_ST_NOTA%TYPE;
vcUF VARCHAR(2);
vAAMM VARCHAR(4);
vCNPJ VARCHAR(14);
vmod VARCHAR(2);
vSerie VARCHAR(3);
vnCT VARCHAR(9);
vtpEmis VARCHAR(1);
vcCT VARCHAR(8);
vcDV VARCHAR(1);
vMensagem varchar2(4000);
BEGIN
vMensagem := NULL;
vRCB_ST_CHAVEACESSO := pRCB_ST_CHAVEACESSO;
vRCB_DT_DOCUMENTO := pRCB_DT_DOCUMENTO;
vAGN_ST_CGC := TRIM(REGEXP_REPLACE(pAGN_ST_CGC, '[^0-9]', ''));
vTDF_IN_CODIGO := pTDF_IN_CODIGO;
vSER_ST_CODIGO := pSER_ST_CODIGO;
vRCB_ST_NOTA := pRCB_ST_NOTA;
BEGIN
SELECT UF.UF_IN_CODIGO
INTO vUF_IN_CODIGO
FROM MGGLO.GLO_UF UF WHERE UF.UF_ST_SIGLA = pUF_ST_SIGLA;
EXCEPTION
WHEN NO_DATA_FOUND THEN
vMensagem := vMensagem || 'Não tem UF: ' || pUF_ST_SIGLA;
WHEN TOO_MANY_ROWS THEN
vMensagem := vMensagem || 'Muitas UFs: ' || pUF_ST_SIGLA;
END;
BEGIN
SELECT
--TD.TDF_IN_CODIGO, TD.TDF_ST_DESCRICAO, MD.MOD_ST_DESCRICAO,
MD.MOD_ST_MODELO
INTO
vMOD_ST_MODELO
FROM MGTRF.TRF_TIPODOCFISCAL TD
LEFT JOIN MGTRF.TRF_MODELODOC MD ON TD.MOD_IN_CODIGO = MD.MOD_IN_CODIGO
WHERE TD.TDF_IN_CODIGO = vTDF_IN_CODIGO
;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN TOO_MANY_ROWS THEN
NULL;
END;
SELECT
SUBSTR(vRCB_ST_CHAVEACESSO, 0,2) -- Código da UF do emitente do Documento Fiscal
, SUBSTR(vRCB_ST_CHAVEACESSO,3,4) -- Ano e Mês de emissão do CT-e
, SUBSTR(vRCB_ST_CHAVEACESSO,7,14) -- CNPJ do emitente
, SUBSTR(vRCB_ST_CHAVEACESSO,21,2) -- Modelo do Documento Fiscal
, SUBSTR(vRCB_ST_CHAVEACESSO,23,3) -- Série do Documento Fiscal
, SUBSTR(vRCB_ST_CHAVEACESSO,26,9) -- Número do Documento Fiscal
, SUBSTR(vRCB_ST_CHAVEACESSO,35,1) -- Forma de emissão do CT-e
, SUBSTR(vRCB_ST_CHAVEACESSO,36,8) -- Código Numérico que compõe a Chave de Acesso
, SUBSTR(vRCB_ST_CHAVEACESSO,44,1) -- Dígito Verificador da Chave de Acesso
INTO
vcUF
,vAAMM
,vCNPJ
,vmod
,vSerie
,vnCT
,vtpEmis
,vcCT
,vcDV
FROM DUAL;
-- Chave de acesso possui 44 dígitos
if vRCB_ST_CHAVEACESSO Is Not Null then
if Trunc(Length(vRCB_ST_CHAVEACESSO)) <> 44 then
vMensagem := vMensagem || ('Chave de acesso não possui 44 dígitos.') || CHR(13);
end if;
end if;
-- UF
if (trim(vcUF) <> trim(vUF_IN_CODIGO)) then
vMensagem := vMensagem || (CHR(26) || CHR(32) || 'UF ['|| trim(vUF_IN_CODIGO) ||'] do Emitente não confere com UF da chave ['|| trim(vcUF) ||'].') || CHR(13);
end if;
-- Mês/Ano de Emissão
if (TRIM(vAAMM) <> TRIM(TO_CHAR(vRCB_DT_DOCUMENTO, 'YYMM'))) then
vMensagem := vMensagem || (CHR(26) || CHR(32) || 'Mês e Ano da Data de Emissão ['|| TRIM(TO_CHAR(vRCB_DT_DOCUMENTO, 'MM/YY')) ||'] não confere com chave ['||
TO_CHAR(TO_DATE(vAAMM, 'YYMM') , 'MM/YY')
||'].') || CHR(13);
end if;
-- CNPJ (Emitente)
if (
-- Nota Fiscal Avulsa - https://arquivei.com.br/blog/nota-fiscal-avulsa-detalhes-documento/
TO_NUMBER(trim(TO_CHAR(TO_NUMBER(vSER_ST_CODIGO), '000'))) NOT BETWEEN 890 AND 899
) then
if (trim(vCNPJ) <> trim(vAGN_ST_CGC)) then
vMensagem := vMensagem || (CHR(26) || CHR(32) || 'CNPJ do Emitente ['||
TRIM((regexp_replace(LPAD(TRIM(vAGN_ST_CGC), 15),'([0-9]{2})([0-9]{3})([0-9]{3})([0-9]{4})([0-9]{2})','\1.\2.\3/\4-\5')))
|| '] não confere com da chave [' ||
TRIM((regexp_replace(LPAD(TRIM(vCNPJ), 15),'([0-9]{2})([0-9]{3})([0-9]{3})([0-9]{4})([0-9]{2})','\1.\2.\3/\4-\5')))
||'].') || CHR(13);
end if;
end if;
-- Modelo do Documento (Fiscal) - 55 = NFe / 56 / 57
if (trim(vmod) <> trim(TO_CHAR(TO_NUMBER(vMOD_ST_MODELO), '00'))) then
vMensagem := vMensagem || CHR(26) || CHR(32) || ('Tipo de Documento (Modelo) ['|| trim(TO_CHAR(TO_NUMBER(vMOD_ST_MODELO), '00')) || '] não confere com chave [' ||
trim(vmod)
||'].') || CHR(13);
end if;
-- Série
if (trim(vSerie) <> trim(TO_CHAR(TO_NUMBER(vSER_ST_CODIGO), '000'))) then
vMensagem := vMensagem || CHR(26) || CHR(32) || ('Série ['|| trim(TO_CHAR(TO_NUMBER(vSER_ST_CODIGO), '000')) ||'] não confere com chave ['||
trim(vSerie)
||'].') || CHR(13);
end if;
-- Número do Documento
if (trim(vnCT) <> TRIM(TO_CHAR(TO_NUMBER(vRCB_ST_NOTA),'000000000'))) then
vMensagem := vMensagem || CHR(26) || CHR(32) || ('Nr. Documento ['|| trim(vRCB_ST_NOTA) ||'] não confere com chave ['||
trim(TO_NUMBER(vnCT))
||'].') || CHR(13);
end if;
-- TODO: Ajustar para validar isso
-- tpEmis – Forma de emissão da NF-e / CT-e
/**
NF-e
1 - Emissão Normal
2 - Contingência em Formulário de Segurança
3 - Contingência SCAN (desativado)
4 - Contingência EPEC
5 - Contingência em Formulário de Segurança FS-DA
6 - Contingência SVC-AN
7 - Contingência SVC-RS
*/
-- Caso mensagem for null, retorna como válido. Valor S
if vMensagem IS NULL then
vMensagem := 'S';
end if;
RETURN vMensagem;
END F_VALIDA_CHAVE;
@AndyDaSilva52
Copy link
Author

AndyDaSilva52 commented Jul 8, 2019

Segue SELECT para usar a função e mostrar documentos com problema. Obs: A função foi desenvolvida considerando alguns critérios, talvez está faltando alguma regra não compemplada, caso seja isso pode ser comentado por aqui para validarmos a situação.

SELECT
R.FIL_IN_CODIGO, R.RCB_ST_NOTA, R.RCB_DT_DOCUMENTO,
CASE WHEN R.RCB_ST_CHAVEACESSOCTE IS NOT NULL THEN R.RCB_ST_CHAVEACESSOCTE ELSE R.RCB_ST_CHAVEACESSO END AS CHAVE
, R.TDF_IN_CODIGO, R.RCB_DT_MOVIMENTO,
MGCLI.F_VALIDA_CHAVE(
CASE WHEN R.RCB_ST_CHAVEACESSOCTE IS NOT NULL THEN R.RCB_ST_CHAVEACESSOCTE ELSE R.RCB_ST_CHAVEACESSO END,
A.UF_ST_SIGLA,-- pUF_ST_SIGLA IN MGGLO.GLO_AGENTES.UF_ST_SIGLA%TYPE,
R.RCB_DT_DOCUMENTO, -- pRCB_DT_DOCUMENTO IN MGADM.EST_RECEBIMENTO.RCB_DT_DOCUMENTO%TYPE,
A.AGN_ST_CGC,-- pAGN_ST_CGC IN MGGLO.GLO_AGENTES.AGN_ST_CGC%TYPE,
R.TDF_IN_CODIGO, -- pMOD_ST_MODELO IN MGTRF.TRF_MODELODOC.MOD_ST_MODELO%TYPE,
R.SER_ST_CODIGO, -- pSER_ST_CODIGO IN MGADM.EST_RECEBIMENTO.SER_ST_CODIGO%TYPE,
R.RCB_ST_NOTA -- pRCB_ST_NOTA IN MGADM.EST_RECEBIMENTO.RCB_ST_NOTA%TYPE
) MSG
,
CASE WHEN R.RCB_ST_CHAVEACESSOCTE IS NOT NULL THEN R.RCB_ST_CHAVEACESSOCTE ELSE R.RCB_ST_CHAVEACESSO END,
A.UF_ST_SIGLA,-- pUF_ST_SIGLA IN MGGLO.GLO_AGENTES.UF_ST_SIGLA%TYPE,
R.RCB_DT_DOCUMENTO, -- pRCB_DT_DOCUMENTO IN MGADM.EST_RECEBIMENTO.RCB_DT_DOCUMENTO%TYPE,
A.AGN_ST_CGC,-- pAGN_ST_CGC IN MGGLO.GLO_AGENTES.AGN_ST_CGC%TYPE,
R.TDF_IN_CODIGO, -- pMOD_ST_MODELO IN MGTRF.TRF_MODELODOC.MOD_ST_MODELO%TYPE,
R.SER_ST_CODIGO, -- pSER_ST_CODIGO IN MGADM.EST_RECEBIMENTO.SER_ST_CODIGO%TYPE,
R.RCB_ST_NOTA -- pRCB_ST_NOTA IN MGADM.EST_RECEBIMENTO.RCB_ST_NOTA%TYPE
FROM MGADM.EST_RECEBIMENTO R,MGGLO.GLO_AGENTES A
WHERE
A.AGN_IN_CODIGO = R.AGN_IN_CODIGO
AND R.RCB_ST_CHAVEACESSOCTE IS NOT NULL
AND
MGCLI.F_VALIDA_CHAVE(
CASE WHEN R.RCB_ST_CHAVEACESSOCTE IS NOT NULL THEN R.RCB_ST_CHAVEACESSOCTE ELSE R.RCB_ST_CHAVEACESSO END,
A.UF_ST_SIGLA,-- pUF_ST_SIGLA IN MGGLO.GLO_AGENTES.UF_ST_SIGLA%TYPE,
R.RCB_DT_DOCUMENTO, -- pRCB_DT_DOCUMENTO IN MGADM.EST_RECEBIMENTO.RCB_DT_DOCUMENTO%TYPE,
A.AGN_ST_CGC,-- pAGN_ST_CGC IN MGGLO.GLO_AGENTES.AGN_ST_CGC%TYPE,
R.TDF_IN_CODIGO, -- pMOD_ST_MODELO IN MGTRF.TRF_MODELODOC.MOD_ST_MODELO%TYPE,
R.SER_ST_CODIGO, -- pSER_ST_CODIGO IN MGADM.EST_RECEBIMENTO.SER_ST_CODIGO%TYPE,
R.RCB_ST_NOTA -- pRCB_ST_NOTA IN MGADM.EST_RECEBIMENTO.RCB_ST_NOTA%TYPE
) <> TRIM('S')
AND R.RCB_DT_MOVIMENTO >= '01/01/2015'
ORDER BY R.RCB_DT_MOVIMENTO
;

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment