Good afternoon to all,
I would like to open a topic on electronic fiscal notes. We here from Paraná we will be required to meet our systems (in some segments) in the coming months, and several other states already have this implanted and others will still deploy. Someone has more information on this, as companies that have been able to integrate their system with Oracle (Oracle modules) that perform these tasks, source codes, and any relevant information to the theme ...
Thanks in advance!!!
Electronic Invoice (NF-e)
-
- Rank: Estagiário Pleno
- Posts: 7
- Joined: Sun, 28 Oct 2007 6:48 pm
- Location: Curitiba - PR
[MCTS] Marco Aurélio Santi Gatti
-
- Moderador
- Posts: 2016
- Joined: Wed, 12 Jan 2005 3:25 pm
- Location: Araraquara - SP
Abraço,
Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP
Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP
Marco, good afternoon.
I can check for you.
I know here where I work (software development company), this development work (including integrating with modules that the client in question needed).
Would you like to acquire such integration service, or, only this information?
I can check for you.
I know here where I work (software development company), this development work (including integrating with modules that the client in question needed).
Would you like to acquire such integration service, or, only this information?
-
- Rank: Estagiário Júnior
- Posts: 2
- Joined: Wed, 21 May 2008 8:27 pm
- Location: Salvador
- Contact:
_________________
Atenciosamente,
Victory Fernandes
Engenheiro
Engenharia, Pesquisa e Desenvolvimento
E-mail: hereim@ig.com.br
TKS Software
Tech-Knowledge Solutions
Soluções em Automação e Softwares Dedicados
Site: www.igara.com.br
Atenciosamente,
Victory Fernandes
Engenheiro
Engenharia, Pesquisa e Desenvolvimento
E-mail: hereim@ig.com.br
TKS Software
Tech-Knowledge Solutions
Soluções em Automação e Softwares Dedicados
Site: www.igara.com.br
Refer to the article by my own published in http://www.activedelphi.com.br/lista_to ... &topico=17 EU contains information on generation, signature, transmission and DANFE electronic invoice (NF-e)
there you find generation examples, Signature and transmission that simplify the process for just the call of 1 function!
there you find generation examples, Signature and transmission that simplify the process for just the call of 1 function!
- fabdepaula
- Rank: Estagiário Pleno
- Posts: 4
- Joined: Thu, 15 May 2008 8:53 pm
- Location: Araraquara -SP
Our legal find this topic about electronic invoice. Here in the company we work we are developing a module to work with NF-E, everything was going very well until we come across the inviving XML and XSD. Creating the XML files is no problem, the problem is at the time of submitting this XML creates validation through the XSD that the government offers, we are trying to find the best solution to do this. First we try the following solution, record the XML we create on the bench, until ai beleza, we created a table with XmlType field and recorded the XML. The problem is in loading the xsd in the bank, we are trying to do this using the dbms_xmlschema package where we put the xsd purchases in a bank directory and with the command dbms_xmlschema.registererschema we register these xsd to the bank, that's where we are with problems, if we create a simple sample XSD we managed to register normal on the bank and then we managed to submit the XML already saved in the bank the validation of XSD, but when we try to load the XSD from the government we can not, the government xsd are more complex From an XSD it is called another XSD, ours we are picking up from them !!!
If someone has passed this problem using this solution or another please help us and tell us how they are doing to validate the XML using the XSD of the Government
Thanks !!!!
Note: We are using Forms 6i and Banco Oracle 10G.
If someone has passed this problem using this solution or another please help us and tell us how they are doing to validate the XML using the XSD of the Government
Thanks !!!!
Note: We are using Forms 6i and Banco Oracle 10G.
-
- Rank: Estagiário Pleno
- Posts: 4
- Joined: Tue, 16 Sep 2008 6:21 pm
- Location: Patos de Minas MG
We have developed solution for our own ERP, Fusing Forms (6i + 10g), Report (6i + 10g). Forms 6i is not as practicing to work with new technolegias, so we use the resources of the 10GR2 Taas Bank up, using XMLDB for part of the XML and Java stored procedures to take account of the webservices and digital signature.
We use JDeveloper to create the Java for WebService and digital signature that we import at the bank later.
In other words, the "hard" part was due to the database. So do not need to install an application server to take care of webservices.
Who is interested in the solution, can look for me.
ABR,
Sjraar Gubbels
We use JDeveloper to create the Java for WebService and digital signature that we import at the bank later.
In other words, the "hard" part was due to the database. So do not need to install an application server to take care of webservices.
Who is interested in the solution, can look for me.
ABR,
Sjraar Gubbels
-
- Rank: Estagiário Pleno
- Posts: 4
- Joined: Tue, 16 Sep 2008 6:21 pm
- Location: Patos de Minas MG
It was enough for the solution. The good of the solution that it can fit into which ERP, because it runs 100% inside the bank and does not need licenses from other software. Integration can be done with triggers / procedures.
If anyone has doubts:
Sjraar Gubbels
OBERS LTDA
Tel 0xx34 38231423
Sgubels @ obers .com.br
If anyone has doubts:
Sjraar Gubbels
OBERS LTDA
Tel 0xx34 38231423
Sgubels @ obers .com.br
-
- Rank: Analista Júnior
- Posts: 88
- Joined: Fri, 18 Aug 2006 11:13 am
- Location: São Paulo - SP
Bertosro
MSN / TALK - roberto.fernandes@gmail.com
MSN / TALK - roberto.fernandes@gmail.com
Hello Masters Good evening
I would like to know if you have already developed some skeleton in PL / SQL for XML generation to order NF-E issuance to Sefaz.
I developed a routine for generation but the same Fiocu very slowly, it takes 15 seconds to generate an invoice.
Thanks for the help of all.
follows the code developed.
I would like to know if you have already developed some skeleton in PL / SQL for XML generation to order NF-E issuance to Sefaz.
I developed a routine for generation but the same Fiocu very slowly, it takes 15 seconds to generate an invoice.
Thanks for the help of all.
follows the code developed.
CREATE OR REPLACE
PACKAGE pkg_infe_send_new08
IS
TYPE tp_estruct_xml_nfe IS RECORD (--LNFE_ESTR_ID_NEXT
LEVEL INTEGER,
lnfe_id infe_leiaute_xml.lnfe_id%TYPE,
lnfe_id_pai infe_leiaute_xml.lnfe_id_pai%TYPE,
lnfe_estr_id infe_leiaute_xml.lnfe_estr_id%TYPE,
lnfe_estr_id_next infe_leiaute_xml.lnfe_estr_id_next%TYPE,
lnfe_seq infe_leiaute_xml.lnfe_seq%TYPE,
lnfe_status infe_leiaute_xml.lnfe_status%TYPE,
lnfe_tag_xml infe_leiaute_xml.lnfe_tag_xml%TYPE,
lnfe_tag_desc infe_leiaute_xml.lnfe_tag_desc%TYPE,
lnfe_atributo_tag infe_leiaute_xml.lnfe_atributo_tag%TYPE,
lnfe_valor_default infe_leiaute_xml.lnfe_valor_default%TYPE,
lnfe_coluna infe_leiaute_xml.lnfe_coluna%TYPE,
lnfe_tam_max infe_leiaute_xml.lnfe_tam_max%TYPE,
lnfe_tam_ele infe_leiaute_xml.lnfe_tam_ele%TYPE,
lnfe_tipo infe_leiaute_xml.lnfe_tipo%TYPE,
lnfe_dec infe_leiaute_xml.lnfe_dec%TYPE,
lnfe_obrg infe_leiaute_xml.lnfe_obrg%TYPE,
lnfe_obs infe_leiaute_xml.lnfe_obs%TYPE,
lnfe_usr_inc infe_leiaute_xml.lnfe_usr_inc%TYPE,
lnfe_usr_dt_inc infe_leiaute_xml.lnfe_usr_dt_inc%TYPE,
lnfe_usr_atlz infe_leiaute_xml.lnfe_usr_atlz%TYPE,
lnfe_usr_dt_atlz infe_leiaute_xml.lnfe_usr_dt_atlz%TYPE,
lnfe_car_direita infe_leiaute_xml.lnfe_car_direita%TYPE,
lnfe_car_esquerda infe_leiaute_xml.lnfe_car_esquerda%TYPE,
conteudo VARCHAR2(500),
ind_fecha_tag INTEGER,
ind_conteudo INTEGER,
col_select VARCHAR2(300)
);
TYPE tb_xml_struct IS TABLE OF tp_estruct_xml_nfe INDEX BY BINARY_INTEGER;
--/menssagem retorno
TYPE ty_controle_rec IS RECORD (
txt_ret VARCHAR2 (1000),
v$errm VARCHAR2 (10000),
tip_ret VARCHAR2 (1),
raise_ BOOLEAN
);
rec_xml_header tb_xml_struct;
rec_xml_detail tb_xml_struct;
rec_tag_header tb_xml_struct;
rec_tag_detail tb_xml_struct;
-- rec_tag_close tb_xml_struct;
v$_rot_glb VARCHAR2(30) := 'pkg_infe_send';
v$_prog VARCHAR2(30) ;
v$_lnfe_id infe_leiaute_xml.lnfe_id%TYPE;
v$_lnfe_id_pai infe_leiaute_xml.lnfe_id_pai%TYPE;
v$_lnfe_tag_xml infe_leiaute_xml.lnfe_tag_xml%TYPE;
v$_lnfe_tipo infe_leiaute_xml.lnfe_tipo%TYPE;
v$_conteudo infe_leiaute_xml.lnfe_tipo%TYPE;
v$ctrl INTEGER :=0;
-- vp estruct_xml_nfe%rowtype;
--/------by rfs 10-mar-2010 ----------------------------------------------------
PROCEDURE prc_req_danfe (
p_gera_arq IN VARCHAR2 DEFAULT 'N',
p_retcode IN VARCHAR2,
p_mensagem IN VARCHAR2,
p_nome_arq IN VARCHAR2
);
FUNCTION XML_fnc_format (P_lnfe_tipo infe_leiaute_xml.lnfe_tipo%TYPE,
P_lnfe_dec infe_leiaute_xml.lnfe_dec%TYPE,
P_lnfe_tam_max infe_leiaute_xml.lnfe_tam_max%TYPE,
P_lnfe_car_direita infe_leiaute_xml.lnfe_car_direita%TYPE,
P_lnfe_car_esquerda infe_leiaute_xml.lnfe_car_esquerda%TYPE,
P_dado VARCHAR2
)
RETURN VARCHAR2;
END pkg_infe_send_new08;
/
CREATE OR REPLACE
PACKAGE BODY pkg_infe_send_new08
IS
/*
*-------------------------------------------------------------------------------------------------*
* *
*-------------------------------------------------------------------------------------------------*
* Cliente : *
* Modulo : Pacote para geracao de XML para requisição de emissão de Nota Fiscal Eletronica *
* Tipo : - *
* Transacao: ** *
* Programa : pkg_infe_send *
* Descricao: Requisitar para Conector emissão de NFe *
*-------------------------------------------------------------------------------------------------*
* Nome | Data | Descricao (Historico) *
*-------------------------------------------------------------------------------------------------*
* RobertoF.S | 12.03.2010 | Codificacao Inicial *
* | | *
*-------------------------------------------------------------------------------------------------*
*/
--/Funcao para montar o corpo do XML 'by RFS'
FUNCTION XML_fnc_mount(p_xml IN out tb_xml_struct, p_value IN VARCHAR2, p_idx IN INTEGER,
rec_tag_open IN OUT tb_xml_struct, sc OUT ty_controle_rec)
RETURN VARCHAR2
IS
v_ret VARCHAR2 (32000) := '';
v_attr VARCHAR2 (32000) := '';
BEGIN v$_prog := 'XML_fnc_mount';
--/Verifica se é primeiro registro da estrutura XML
IF p_xml.PRIOR(p_idx-1) IS NOT NULL THEN
-- IF rec_tag_open.EXISTS (rec_tag_open.FIRST) THEN
IF TO_NUMBER(NVL(p_xml(p_idx-1).LEVEL,p_xml(p_idx).LEVEL)) > TO_NUMBER(p_xml(p_idx).LEVEL) THEN
FOR I IN REVERSE p_xml.FIRST .. p_idx-1
LOOP
v$ctrl := v$ctrl+1;
dbms_output.put_line(v$ctrl||' '||to_char(sysdate,'hh24:mi:ss'));
-- dbms_output.put_line('p_xml.FIRST .. p_idx-1 '||to_char(p_xml.FIRST)||' .. '||to_char(p_idx-1));
--/Se a Tag for de menor Level fecha as Tags Abertas ate o nivel atual
IF TO_NUMBER(p_xml(I).LEVEL) >= TO_NUMBER(p_xml(p_idx).LEVEL) AND p_xml(I).lnfe_tipo = 'T'
AND p_xml(I).ind_fecha_tag = 0
THEN
v_ret := v_ret || '</' || p_xml(I).lnfe_tag_xml || '>'; --|| --CHR (13) || CHR (10);
p_xml(I).ind_fecha_tag := 1;
END IF;
--/Sai do loop quando a TAG chegar no mesmo Level
IF TO_NUMBER(p_xml(I).LEVEL) = TO_NUMBER(p_xml(p_idx).LEVEL) AND p_xml(I).lnfe_tipo = 'T'
THEN
IF rec_tag_open.EXISTS (rec_tag_open.FIRST) THEN
IF TO_NUMBER(p_xml(p_idx).LEVEL) <= TO_NUMBER(rec_tag_open(rec_tag_open.FIRST).LEVEL) THEN
rec_tag_open.DELETE;
ELSE
rec_tag_open.DELETE(rec_tag_open.LAST);
END IF;
END IF;
EXIT;
END IF;
END LOOP;
END IF;
-- END IF;
END IF;
--/Se for TAG abre a TAG e inclui atrubuto se houver
IF p_xml(p_idx).lnfe_tipo = 'T' THEN
p_xml(p_idx).ind_fecha_tag := 2;
rec_tag_open(p_idx) := p_xml(p_idx);
ELSIF p_xml(p_idx).lnfe_tipo = 'TF' THEN
v_ret := v_ret || '<' || p_xml(p_idx).lnfe_tag_xml || p_xml(p_idx).lnfe_atributo_tag || '/>'; --|| CHR (13) || CHR (10);
p_xml(p_idx).ind_fecha_tag := 0;
--/Se não for Tag e tiver conteudo escreve TAG
ELSIF NVL(p_value, p_xml(p_idx).lnfe_valor_default) IS NOT NULL AND
p_xml(p_idx).lnfe_tipo IN ('N','C','D') THEN
IF rec_tag_open.COUNT > 0 THEN
FOR t IN rec_tag_open.FIRST .. rec_tag_open.LAST
LOOP
IF rec_tag_open.EXISTS (t) then
v_ret := v_ret || '<' || rec_tag_open(t).lnfe_tag_xml || rec_tag_open(t).lnfe_atributo_tag || '>'; --|| CHR (13) || CHR (10);
p_xml(t).ind_fecha_tag := 0;
END IF;
END LOOP;
rec_tag_open.DELETE;
END IF;
v_ret := v_ret || '<' || p_xml(p_idx).lnfe_tag_xml || p_xml(p_idx).lnfe_atributo_tag || '>' ||
NVL(p_value, p_xml(p_idx).lnfe_valor_default) || '</' ||p_xml(p_idx).lnfe_tag_xml|| '>';--||
END IF;
RETURN v_ret;
v$_prog := 'PRC_GERA_XML_NFE';
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao montar conteudo XML. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
END XML_fnc_mount;
--/
--/
--/Funcao para fechar Tags abertas do corpo do XML 'by RFS'
FUNCTION XML_close (p_xml IN out tb_xml_struct, sc OUT ty_controle_rec)
RETURN VARCHAR2
IS
v_ret VARCHAR2 (32000) := '';
v_attr VARCHAR2 (32000) := '';
BEGIN v$_prog := 'XML_close';
FOR I IN REVERSE p_xml.FIRST .. p_xml.LAST
LOOP
IF p_xml(I).lnfe_tipo = 'T' AND p_xml(I).ind_fecha_tag = 0
THEN
v_ret := v_ret || '</' || p_xml(I).lnfe_tag_xml || '>'; --|| CHR (13) || CHR (10);
p_xml(I).ind_fecha_tag := 1; --/Indica fechamento da tag
END IF;
END LOOP;
RETURN v_ret;
v$_prog := 'PRC_GERA_XML_NFE';
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao fechar conteudo XML. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
END XML_close;
--/
--/Funcao para gerar o cabeçario do XML 'by RFS'
FUNCTION XML_fnc_gera_tag_h (p_attr_value IN VARCHAR2 DEFAULT NULL, p_attr_tag IN VARCHAR2 DEFAULT NULL, sc OUT ty_controle_rec)
RETURN VARCHAR2
IS
v_ret VARCHAR2 (32000) := '';
v_attr VARCHAR2 (32000) := '';
BEGIN v$_prog := 'XML_fnc_gera_tag_h';
IF p_attr_value IS NOT NULL
THEN
v_attr := ' encoding="' || p_attr_value || '"';
END IF;
v_ret := v_ret || '<?xml version="1.0"' || v_attr || '?>';--|| --CHR (13) || CHR (10);
RETURN v_ret;
v$_prog := 'PRC_GERA_XML_NFE';
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao formatar cabecalho do XML. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
END XML_fnc_gera_tag_h;
--/
--/Funcao para formatar conteudo XML 'by RFS'
FUNCTION XML_fnc_format (P_lnfe_tipo infe_leiaute_xml.lnfe_tipo%TYPE,
P_lnfe_dec infe_leiaute_xml.lnfe_dec%TYPE,
P_lnfe_tam_max infe_leiaute_xml.lnfe_tam_max%TYPE,
P_lnfe_car_direita infe_leiaute_xml.lnfe_car_direita%TYPE,
P_lnfe_car_esquerda infe_leiaute_xml.lnfe_car_esquerda%TYPE,
P_dado VARCHAR2
)
RETURN VARCHAR2
IS
vp_return VARCHAR2(200);
vp_mask VARCHAR2(200);
BEGIN v$_prog := 'FNC_FORMAT';
vp_return := P_dado;
--/Formata numero
IF P_lnfe_tipo = 'N' AND NVL(P_lnfe_dec,0) > 0 THEN
SELECT DECODE(P_lnfe_dec,1,'''9999999999999990D0''',
2,'''9999999999999990D00''',
3,'''9999999999999990D000''',
4,'''9999999999999990D0000''')
INTO vp_mask FROM DUAL;
EXECUTE IMMEDIATE 'SELECT TRIM(TO_CHAR(:1,'||vp_mask||')) FROM DUAL '
INTO vp_return
USING P_dado;
END IF;
--/Formata Caracter
IF P_lnfe_tipo = 'C' THEN
vp_return := TRIM(SUBSTR(vp_return,1,P_lnfe_tam_max));
END IF;
--/Adiciona caracter a direita
IF P_lnfe_car_direita IS NOT NULL THEN
vp_return := RPAD(vp_return, P_lnfe_tam_max, P_lnfe_car_direita);
END IF;
--/Adiciona caracter a esquerda
IF P_lnfe_car_esquerda IS NOT NULL THEN NULL;
vp_return := LPAD(vp_return, P_lnfe_tam_max, P_lnfe_car_esquerda);
END IF;
RETURN TRANSLATE(UPPER(TRIM(VP_return)),
'ÃãÀàÁáÂâÇçÉéÊêÈèÍíÎîÓóÔôÕõÒòÚúÛûÜüñÑ"!#$%¨&§]}º´`[{ª~^/°<>',
'AaAaAaAaCcEeEeEeIiIiOoOoOoOoUuUuUunN........))o..((a...o()');
v$_prog := 'PRC_GERA_XML_NFE';
EXCEPTION
WHEN OTHERS THEN
NULL;
END XML_fnc_format;
--/
--/Funcao para montar o corpo do XML 'by RFS'
FUNCTION XML_fnc_conteudo_tag (p_xml IN out tb_xml_struct, p_idx IN INTEGER, sc OUT ty_controle_rec)
RETURN BOOLEAN
IS
BEGIN v$_prog := 'XML_fnc_conteudo_tag';
IF ((p_xml (p_idx).LNFE_TIPO IN ('C','N','D','K')) OR
(p_xml (p_idx).LNFE_TIPO IN ('T') AND p_xml (p_idx).LNFE_ATRIBUTO_TAG IS NOT NULL))
THEN
p_xml (p_idx).ind_conteudo := 1;
RETURN TRUE;
ELSE
p_xml (p_idx).ind_conteudo := 0;
RETURN FALSE;
END IF;
v$_prog := 'PRC_GERA_XML_NFE';
END XML_fnc_conteudo_tag;
--/Procedimento para armazenar string XML em tempo de execução 'by RFS'
PROCEDURE XML_armazena_blob (p_str IN VARCHAR2, p_lob IN OUT BLOB, sc OUT ty_controle_rec)
IS
rawchar RAW (1);
rawbuffer RAW (32767);
itamanho NUMBER;
v_blob BLOB := p_lob;
BEGIN v$_prog := 'ARMAZENA_BLOB';
rawbuffer := UTL_RAW.cast_to_raw (NVL(p_str, ' '));
itamanho := UTL_RAW.LENGTH (rawbuffer);
DBMS_LOB.writeappend (v_blob, itamanho, rawbuffer);
p_lob := v_blob;
v$_prog := 'PRC_GERA_XML_NFE';
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao armaxenar conteudo XML em BLOB. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
END XML_armazena_blob;
--/Procedimento atualizar status de controle de envio NF-e 'by RFS'
PROCEDURE prc_atlz_st_controle (
p_id_control IN a02_in_req_nfe_HEADER.id_controle%TYPE,
sc OUT ty_controle_rec
) --a02_in_req_nfe_HEADER a where a.ID_CONTROLE
IS --Cursor de retorno do da estrutura do XML por estrutura
BEGIN
FOR cur_ctrl IN (select * from vw_infe_atlz_controle)
LOOP
UPDATE infe_req_control y
SET y.chave_acesso_nfe = cur_ctrl.chave_acesso_nfe,
y.codigo_situacao = cur_ctrl.codigo_situacao,
y.descricao_situacao = cur_ctrl.descricao_situacao,
y.protocolo = cur_ctrl.protocolo,
y.xml_out = cur_ctrl.XML_RETORNO,
y.st_proc = cur_ctrl.st_proc
WHERE y.chave_origem || y.acao = y.chave_origem || y.acao;
END LOOP;
COMMIT;
END prc_atlz_st_controle;
--/
--/Procedimento para geracao de XML para emissão de DNAFE (NF-e) 'by RFS'
PROCEDURE prc_gera_xml_nfe (
p_id_control IN a02_in_req_nfe_HEADER.id_controle%TYPE,
p_rec_xml_header tb_xml_struct,
P_col_header VARCHAR2,
p_rec_xml_detail tb_xml_struct,
P_col_detail VARCHAR2,
p_xml IN OUT VARCHAR2,
sc OUT ty_controle_rec
) --a02_in_req_nfe_HEADER a where a.ID_CONTROLE
IS --Cursor de retorno do da estrutura do XML por estrutura
CURSOR cur_estruct_xml (P_estruct IN Infe_leiaute_xml.lnfe_estr_id%TYPE)
IS
SELECT LEVEL ,
LNFE_ID ,
LNFE_ID_PAI ,
LNFE_ESTR_ID ,
LNFE_ESTR_ID_NEXT ,
LNFE_SEQ ,
LNFE_STATUS ,
LNFE_TAG_XML ,
LNFE_TAG_DESC ,
LNFE_ATRIBUTO_TAG ,
LNFE_VALOR_DEFAULT,
LNFE_COLUNA ,
LNFE_TAM_MAX ,
LNFE_TAM_ELE ,
LNFE_TIPO ,
LNFE_DEC ,
LNFE_OBRG ,
LNFE_OBS ,
LNFE_USR_INC ,
LNFE_USR_DT_INC ,
LNFE_USR_ATLZ ,
LNFE_USR_DT_ATLZ ,
LNFE_CAR_DIREITA ,
LNFE_CAR_ESQUERDA ,
' ' conteudo ,
0 ind_fecha_tag ,
DECODE(LNFE_TIPO,'C',1,'N',1,'D',1,'K',1,
CASE
WHEN LNFE_TIPO = 'T' AND LNFE_ATRIBUTO_TAG IS NOT NULL THEN
1
ELSE
0
END ) ind_conteudo ,
DECODE( DECODE(LNFE_TIPO,'C',1,'N',1,'D',1,'K',1,
CASE
WHEN LNFE_TIPO = 'T' AND LNFE_ATRIBUTO_TAG IS NOT NULL THEN
1
ELSE
0
END ), 1, 'pkg_infe_send_new08.xml_fnc_format('''||lnfe_tipo||''','||lnfe_dec||','||lnfe_tam_max||','||
NVL2(lnfe_car_direita ,''||lnfe_car_direita||'','NULL' )||','||
NVL2(lnfe_car_esquerda ,''||lnfe_car_esquerda||'','NULL' )||','||
'a.'||LNFE_COLUNA||') '|| LNFE_COLUNA ||
', ') col_select
FROM Infe_leiaute_xml a
WHERE a.LNFE_STATUS > 0 --/somente ativo
AND lnfe_estr_id = P_estruct --/Estrutura ID
AND EXISTS (SELECT 0 --/Verifica se o campo PAI esta ativo
FROM infe_leiaute_xml b
WHERE ((b.lnfe_id = a.lnfe_id_pai) OR (b.lnfe_id_pai = 1))
AND lnfe_status > 0)
CONNECT BY PRIOR lnfe_id = lnfe_id_pai
START WITH lnfe_id_pai = 1
ORDER SIBLINGS BY lnfe_id_pai, lnfe_seq; --lnfe_id;
v_string VARCHAR2 (32767); --/Armazenar String XML
v_blob BLOB; --/Armazenar String BLOB XML para manipulação
v_rot VARCHAR2(40) := 'PRC_GERA_XML_NFE';
--/Variaveis para cursor dinamico
vp_$cur_header INTEGER;
vp_$cur_detail INTEGER;
vp_$col_header INTEGER := 0;
vp_$col_detail INTEGER := 0;
vp_$temp NUMBER;
vp_$query VARCHAR2(32767);
vp_$return BOOLEAN := FALSE;
vp_$level INTEGER;
--*****************************************
-- B E G I N "N F E"
--*****************************************
BEGIN v$_prog := 'PRC_GERA_XML_NFE';
--/Monta curdor dinamico do Header
vp_$query := 'SELECT '||p_col_header||'0 END FROM VW_infe_req_header a where a.ID_CONTROLE = '||NVL(TO_CHAR(p_id_control),'a.ID_CONTROLE');
PCK_INFE_UTIL.prc_debug_sql_dinamico(NULL,vp_$query, 'CC','INFE'||'.'||v$_rot_glb||'.'||v_rot);
BEGIN
vp_$cur_header := DBMS_SQL.open_cursor;
DBMS_SQL.parse (vp_$cur_header, vp_$query, DBMS_SQL.native);
EXCEPTION
WHEN OTHERS THEN
PCK_INFE_UTIL.prc_debug_sql_dinamico(NULL,vp_$query, 'CC','INFE'||'.'||v$_rot_glb||'.'||v_rot);
sc.txt_ret := 'Erro ao carregar cursor dinamico Header. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO gera_erro;
END;
vp_$col_header := 0;
BEGIN
--/DBMS_SQL.DEFINE_COLUMN - Cursor Dinamico
FOR i IN rec_xml_header.FIRST .. rec_xml_header.LAST
LOOP
IF rec_xml_header (i).ind_conteudo = 1 THEN -- XML_fnc_conteudo_tag (rec_xml_header, i,sc) THEN
vp_$col_header := vp_$col_header+1;
DBMS_SQL.define_column (vp_$cur_header, vp_$col_header, rec_xml_header (i).conteudo, rec_xml_header (i).lnfe_tam_max);
END IF;
END LOOP;
vp_$temp := DBMS_SQL.EXECUTE (vp_$cur_header);
EXCEPTION
WHEN OTHERS THEN
PCK_INFE_UTIL.prc_debug_sql_dinamico(NULL,vp_$query, 'CC','INFE'||'.'||v$_rot_glb||'.'||v_rot);
sc.txt_ret := 'Erro ao setar colunas cursor dinamico Header. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO gera_erro;
END;
LOOP
IF DBMS_SQL.fetch_rows (vp_$cur_header) = 0 THEN
IF vp_$return = FALSE THEN
dbms_output.put_line('Header Registro Não Encontrado!');
END IF;
dbms_output.put_line('Header Saindo ...');
EXIT;
ELSE
v_string := NULL;
vp_$return := TRUE;
vp_$col_header := 0;
--/DBMS_SQL.COLUMN_VALUE - Cursor Dinamico
FOR i IN rec_xml_header.FIRST .. rec_xml_header.LAST
LOOP
BEGIN
IF rec_xml_header (i).ind_conteudo = 1 THEN -- XML_fnc_conteudo_tag (rec_xml_header, i,sc) THEN
vp_$col_header := vp_$col_header+1;
DBMS_SQL.column_value (vp_$cur_header, vp_$col_header, rec_xml_header (i).conteudo);
-- rec_xml_header (i).conteudo := fnc_format (rec_xml_header, i,sc);
IF sc.raise_ THEN GOTO gera_erro; END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao definir colunas cursor dinamico Header. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO gera_erro;
END;
v$_lnfe_id := rec_xml_header(i).lnfe_id ;
v$_lnfe_id_pai := rec_xml_header(i).lnfe_id_pai ;
v$_lnfe_tag_xml := rec_xml_header(i).lnfe_tag_xml;
v$_lnfe_tipo := rec_xml_header(i).lnfe_tipo ;
BEGIN
--/escreve XML HEADER
IF rec_xml_header(i).lnfe_estr_id_next >= rec_xml_header(i).lnfe_estr_id THEN
v_string := v_string || XML_fnc_mount (rec_xml_header, rec_xml_header(I).conteudo,i,rec_tag_header,sc);
IF sc.raise_ THEN GOTO gera_erro; END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao escrever Header XML. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO gera_erro;
END;
--************ D E T A I L ************--
--/Verifica se a proxima tag é proxima estrutura de DETAIL
IF rec_xml_header(i).lnfe_estr_id_next > rec_xml_header(i).lnfe_estr_id THEN
--/Monta curdor dinamico do Detail
vp_$query := 'SELECT '||p_col_detail||'0 END FROM VW_infe_req_detail a where a.id_req_header = '||rec_xml_header(I).conteudo|| 'order by a.id ';
--/Inicio processo de carga de dados nas variaveis dinamicas
BEGIN
vp_$cur_detail := DBMS_SQL.open_cursor;
DBMS_SQL.parse (vp_$cur_detail, vp_$query, DBMS_SQL.native);
EXCEPTION
WHEN OTHERS THEN
PCK_INFE_UTIL.prc_debug_sql_dinamico(NULL,vp_$query, 'CC','INFE'||'.'||v$_rot_glb||'.'||v_rot);
sc.txt_ret := 'Erro ao carregar cursor dinamico Detail. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO gera_erro;
END;
vp_$col_detail := 0;
BEGIN
--/DBMS_SQL.DEFINE_COLUMN - Cursor Dinamico
FOR j IN rec_xml_detail.FIRST .. rec_xml_detail.LAST
LOOP
IF rec_xml_detail (j).ind_conteudo = 1 THEN -- XML_fnc_conteudo_tag (rec_xml_detail, j,sc) THEN
vp_$col_detail := vp_$col_detail+1;
DBMS_SQL.define_column (vp_$cur_detail, vp_$col_detail, rec_xml_detail (j).conteudo, rec_xml_detail (j).lnfe_tam_max);
END IF;
END LOOP;
vp_$temp := DBMS_SQL.EXECUTE (vp_$cur_detail);
EXCEPTION
WHEN OTHERS THEN
PCK_INFE_UTIL.prc_debug_sql_dinamico(NULL,vp_$query, 'CC','INFE'||'.'||v$_rot_glb||'.'||v_rot);
sc.txt_ret := 'Erro ao setar colunas cursor dinamico Detail. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO gera_erro;
END;
LOOP
IF DBMS_SQL.fetch_rows (vp_$cur_detail) = 0 THEN
IF vp_$return = FALSE THEN
dbms_output.put_line('Detail Registro Não Encontrado!');
END IF;
dbms_output.put_line('Detail Saindo ...');
EXIT;
ELSE
vp_$return := TRUE;
vp_$col_detail := 0;
--/DBMS_SQL.COLUMN_VALUE - Cursor Dinamico
FOR j IN rec_xml_detail.FIRST .. rec_xml_detail.LAST
LOOP
BEGIN
IF rec_xml_detail (j).ind_conteudo = 1 THEN -- XML_fnc_conteudo_tag (rec_xml_detail, j,sc) THEN
vp_$col_detail := vp_$col_detail+1;
DBMS_SQL.column_value (vp_$cur_detail, vp_$col_detail, rec_xml_detail (j).conteudo);
-- rec_xml_detail (j).conteudo := fnc_format (rec_xml_detail, j,sc);
IF sc.raise_ THEN GOTO gera_erro; END IF;
END IF;
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao definir colunas cursor dinamico Detail. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO gera_erro;
END;
BEGIN
--/Identifica a sequencia do item da NF (Atributo de Tag)
IF rec_xml_detail.FIRST = j THEN
vp_$level := rec_xml_header(I).LEVEL;
rec_xml_header(I).LEVEL := rec_xml_DETAIL(j).LEVEL;
v_string := v_string || XML_fnc_mount (rec_xml_header, NULL,I,rec_tag_header,sc);
rec_xml_header(I).LEVEL := vp_$level;
IF sc.raise_ THEN GOTO gera_erro; END IF;
rec_xml_detail(j).lnfe_atributo_tag := ' nItem="'||rec_xml_detail (j).conteudo||'"';
END IF;
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao Identifica a sequencia do item da NF Detail. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO gera_erro;
END;
BEGIN
--/escreve XML DETAIL
v_string := v_string || XML_fnc_mount (rec_xml_detail, rec_xml_detail (j).conteudo, j,rec_tag_detail,sc);
IF sc.raise_ THEN GOTO gera_erro; END IF;
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao escrever Detail XML. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO gera_erro;
END;
END LOOP;
BEGIN
v_string := v_string || XML_close (rec_xml_detail,sc);
IF sc.raise_ THEN GOTO gera_erro; END IF;
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao fechar estrutura XML Detail. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO gera_erro;
END;
END IF;
END LOOP;
DBMS_SQL.close_cursor (vp_$cur_detail);
END IF;
END LOOP;
BEGIN
v_string := v_string || XML_close (rec_xml_header,sc);
IF sc.raise_ THEN GOTO gera_erro; END IF;
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao fechar estrutura XML Header. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO gera_erro;
END;
END IF;
BEGIN
v_string := v_string || XML_close (rec_xml_header,sc);
p_xml := v_string;
IF sc.raise_ THEN GOTO gera_erro; END IF;
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao fechar estrutura XML. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO gera_erro;
END;
END LOOP;
DBMS_SQL.close_cursor (vp_$cur_header);
v$_prog := 'PRC_REQ_DANFE';
<<gera_erro>>
p_xml := v_string;
rec_xml_header.DELETE;
rec_xml_detail.DELETE;
rec_tag_header.DELETE;
END prc_gera_xml_nfe;
--/Procedimento para requisitar emissão de DNAFE (NF-e) para o Conector Synchro 'by RFS'
PROCEDURE prc_req_danfe (
p_gera_arq IN VARCHAR2 DEFAULT 'N',
p_retcode IN VARCHAR2,
p_mensagem IN VARCHAR2,
p_nome_arq IN VARCHAR2
)
IS
--Cursor de retorno do da estrutura do XML por estrutura
CURSOR cur_estruct_xml (P_estruct IN Infe_leiaute_xml.lnfe_estr_id%TYPE)
IS
SELECT LEVEL ,
LNFE_ID ,
LNFE_ID_PAI ,
LNFE_ESTR_ID ,
LNFE_ESTR_ID_NEXT ,
LNFE_SEQ ,
LNFE_STATUS ,
LNFE_TAG_XML ,
LNFE_TAG_DESC ,
LNFE_ATRIBUTO_TAG ,
LNFE_VALOR_DEFAULT,
LNFE_COLUNA ,
LNFE_TAM_MAX ,
LNFE_TAM_ELE ,
LNFE_TIPO ,
LNFE_DEC ,
LNFE_OBRG ,
LNFE_OBS ,
LNFE_USR_INC ,
LNFE_USR_DT_INC ,
LNFE_USR_ATLZ ,
LNFE_USR_DT_ATLZ ,
LNFE_CAR_DIREITA ,
LNFE_CAR_ESQUERDA ,
' ' conteudo ,
0 ind_fecha_tag ,
DECODE(LNFE_TIPO,'C',1,'N',1,'D',1,'K',1,
CASE
WHEN LNFE_TIPO = 'T' AND LNFE_ATRIBUTO_TAG IS NOT NULL THEN
1
ELSE
0
END ) ind_conteudo ,
DECODE( DECODE(LNFE_TIPO,'C',1,'N',1,'D',1,'K',1,
CASE
WHEN LNFE_TIPO = 'T' AND LNFE_ATRIBUTO_TAG IS NOT NULL THEN
1
ELSE
0
END ), 1, 'pkg_infe_send_new08.xml_fnc_format('''||lnfe_tipo||''','||lnfe_dec||','||lnfe_tam_max||','||
NVL2(lnfe_car_direita ,''||lnfe_car_direita||'','NULL' )||','||
NVL2(lnfe_car_esquerda ,''||lnfe_car_esquerda||'','NULL' )||','||
'a.'||LNFE_COLUNA||') '|| LNFE_COLUNA ||
', ') col_select
FROM Infe_leiaute_xml a
WHERE a.LNFE_STATUS > 0 --/somente ativo
AND lnfe_estr_id = P_estruct --/Estrutura ID
AND EXISTS (SELECT 0 --/Verifica se o campo PAI esta ativo
FROM infe_leiaute_xml b
WHERE ((b.lnfe_id = a.lnfe_id_pai) OR (b.lnfe_id_pai = 1))
AND lnfe_status > 0)
CONNECT BY PRIOR lnfe_id = lnfe_id_pai
START WITH lnfe_id_pai = 1
ORDER SIBLINGS BY lnfe_id_pai, lnfe_seq; --lnfe_id;
v$xml VARCHAR2(32767);
TYPE xml_vt IS TABLE OF VARCHAR (5000)INDEX BY BINARY_INTEGER;
v$xml_vt xml_vt;
v$xml_qt INTEGER;
v$max_c INTEGER := TO_NUMBER(pck_infe_util.fnc_parametro (1, NULL, NULL, 'E'));
vp_id_seq INTEGER;
sc ty_controle_rec;
idx NUMBER := 1; --/Indice de controle PL/Table
v_col_header VARCHAR2(32767) := ' '; --/Colunas do Header para sql Dinamico
v_col_detail VARCHAR2(32767) := ' '; --/Colunas do Detail para sql Dinamico
BEGIN v$_prog := 'PRC_REQ_DANFE';
idx := 1;
BEGIN
FOR cur_xml IN cur_estruct_xml (1)
LOOP --/ popular PL/SQL
rec_xml_header (idx) := cur_xml;
v_col_header := v_col_header||rec_xml_header (idx).col_select;
idx := idx + 1; --/ incremento index
END LOOP;
--/Carrega etrutura DETAIL do XML
FOR cur_xml IN cur_estruct_xml (2)
LOOP --/ popular PL/SQL
rec_xml_detail (idx) := cur_xml;
v_col_detail := v_col_detail||rec_xml_detail (idx).col_select;
idx := idx + 1; --/ incremento index
END LOOP;
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro ao carregar estrutura (Header / Detail) XML. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
--GOTO gera_erro;
END;
--/Altera casa decimal para ponto(.)
EXECUTE IMMEDIATE 'alter session set NLS_NUMERIC_CHARACTERS=''.,''';
-- prc_atlz_st_controle (null,sc);
FOR cur_CTRL IN ( SELECT a.ID ,a.PRIORIDADE ,
a.CHAVE_ORIGEM ,a.PSSW_ID ,
a.STATUS ,a.ACAO ,
a.SISTEMA_ORIGEM ,a.TIPO_ENVIO ,
a.IMPRESSORA ,a.COPIAS ,
a.DH_ENVIO_CONECTOR ,a.TENTATIVAS_RESPOSTA ,
a.DH_RETORNO_CONECTOR ,a.CHAVE_ACESSO_NFE ,
a.PROTOCOLO ,a.CODIGO_SITUACAO ,
a.DESCRICAO_SITUACAO ,a.DT_EXPIRA ,
a.DT_INCL ,a.DT_ATLZ ,
NULL DH_RECEBIMENTO ,NULL ENVIADO_DFE
FROM infe_req_control a
WHERE --A.CODIGO_SITUACAO IS NULL
1=1
AND EXISTS (
SELECT '*'
FROM a02_in_req_nfe_HEADER b
WHERE b.id_controle = a.id
AND EXISTS (SELECT '*'
FROM a02_in_req_nfe_detail c
WHERE b.id = c.id_req_header))
/* and a.ID = 31*/ ORDER BY a.ID
)
LOOP
BEGIN
v$xml := NULL;
pkg_infe_send_new08.prc_gera_xml_nfe (cur_CTRL.ID, rec_xml_header, v_col_header, rec_xml_detail, v_col_detail, v$xml, sc);
IF sc.raise_ THEN GOTO next_nfe; END IF;
--/Verifica a quantidade de arquivos XML para gerar
/* v$xml_qt := CEIL(LENGTH (v$xml) / v$max_c);
--/Divide o arquivo XML
FOR i IN 0 .. v$xml_qt-1
LOOP
v$xml_vt(i) := SUBSTR(v$xml,(i*v$max_c),v$max_c-1);
END LOOP; */
EXCEPTION
WHEN OTHERS THEN
sc.txt_ret := 'Erro na geracao do arquivo XML. Entre em contato com o administrador do sistema.';
sc.v$errm := SQLERRM; sc.tip_ret := 'E'; sc.raise_ := TRUE;
GOTO next_nfe;
END;
sc.txt_ret := 'Sucesso no na requisição de emissão de NF-e (DANFE). Sistema Origem: ('||cur_CTRL.SISTEMA_ORIGEM||') Chave Origem: ('||cur_CTRL.CHAVE_ORIGEM||').';
sc.v$errm := null; sc.tip_ret := 'S'; sc.raise_ := FALSE;
<<next_nfe>>
BEGIN
UPDATE infe_req_control y
SET y.st_proc = 1,
y.xml_in = v$xml
WHERE y.chave_origem || y.acao = y.chave_origem || y.acao;
COMMIT;
END;
v$xml_vt.DELETE;
COMMIT;
END LOOP;
END prc_req_danfe;
END pkg_infe_send_new08;
/
-
- Rank: Programador Júnior
- Posts: 15
- Joined: Fri, 12 Mar 2010 3:11 pm
- Location: FLORIANOPOLIS - SC
Good afternoon guys, ball show that routine.
I ask you. I need to send the XML that I have already recorded in an XML (BLOB) field table for an email. I created a more email sending procedure I can not create an attachment with a table information.
Someone already made this routine to send DANFE XML to email?
Valeu
AT.
Jr
I ask you. I need to send the XML that I have already recorded in an XML (BLOB) field table for an email. I created a more email sending procedure I can not create an attachment with a table information.
Someone already made this routine to send DANFE XML to email?
Valeu
AT.
Jr
-
- Moderador
- Posts: 1177
- Joined: Thu, 15 Oct 2009 10:28 am
- Location: Recife
See the UTL_Mail package,
or Java class inside the bank for shipping,
or Java class inside the bank for shipping,
-
- Rank: Programador Júnior
- Posts: 15
- Joined: Fri, 12 Mar 2010 3:11 pm
- Location: FLORIANOPOLIS - SC
So, I'm using UTL_Mail
to make the attachment I'm creating a temporary file to be able to attach.
But giving problem in geracao.
The file comes empty.
Do not have a way to create the attachment already directly by SELECT COB?
Thanks
to make the attachment I'm creating a temporary file to be able to attach.
But giving problem in geracao.
The file comes empty.
BEGIN
select chavenfe,xml INTO P_FILE,P_DATA from TABNFE;
t_clob_len := DBMS_LOB.GetLength(p_data);
v_arquivo := utl_file.fopen('DUMP',chavenfe+'.xml', 'W');
WHILE t_pos < t_clob_len LOOP
DBMS_LOB.Read(p_data, t_amount, t_pos, t_buffer);
UTL_FILE.Put(v_arquivo, t_buffer);
UTL_FILE.fflush(v_arquivo);
t_pos := t_pos + t_amount;
END LOOP;
Thanks
-
- Rank: Estagiário Pleno
- Posts: 4
- Joined: Tue, 16 Sep 2008 6:21 pm
- Location: Patos de Minas MG
I saw that still has many companies with 6i Forms running, with a solution of the invoice of 3o and is not 100% aligned, or has performance problems. Our solution can help, already runs in companies with great stream (> 2500 diario). All integrated with PL / SQL.
We also have the similar solution for CT (E) electronic knowledge and service invoice knowledge!
We can help solve your problem faster. Contact us. Our phone has changed to 0xx34 3818 3800.
SJRAAR GBBELS
OBERS LTDA
sgubels@obers.com.br
We also have the similar solution for CT (E) electronic knowledge and service invoice knowledge!
We can help solve your problem faster. Contact us. Our phone has changed to 0xx34 3818 3800.
SJRAAR GBBELS
OBERS LTDA
sgubels@obers.com.br
SjraArgubbels wrote: has already had enough demand for the solution. The good of the solution that it can fit into which ERP, because it runs 100% inside the bank and does not need licenses from other software. Integration can be done with triggers / procedures.
If anyone has doubts:
Sjraar Gubbels
OBERS LTDA
Tel 0xx34 38231423
SguBels @ obers .com.br
-
- Information
-
Who is online
Users browsing this forum: No registered users and 13 guests