Last active
July 8, 2019 14:32
-
-
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)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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
;