*************************************************************************** FUNCTION INCCCE() // CADASTRO DE NOTA FISCAL LOCAL cTela := SAVESCREEN() LOCAL GetList := {} IF !ABREARQ(,{"NF"}) BEEP() MENSAGEMD("N„o foi poss¡vel abrir o arquivo de dados, abortando !",3) RETURN NIL ENDIF cCORRECAO1 := SPACE(60) cCORRECAO2 := SPACE(60) cCORRECAO3 := SPACE(60) cCORRECAO4 := SPACE(60) cCORRECAO5 := SPACE(60) cNUMERO := SPACE(6) WHILE ( .T. ) SETCURSOR(1) RESTSCREEN( ,,,,cTela ) JANELA( 04,08,16,71, "Carta de Correcao NFE" ) SELE NF FOR nI = 1 TO FCOUNT() ; &(TYPE(FIELD(nI))+FIELD(nI)) := IF(TYPE(FIELD(nI))=="C",SPACE(LEN(&(FIELD(nI)))),IF(TYPE(FIELD(nI))=="N",0,IF(TYPE(FIELD(nI))=="L",.F.,IF(TYPE(FIELD(nI))=="D",CTOD(""),""))) ) ; NEXT COR("GETS") @ 06,10 SAY 'NUMERO DA NFE:' GET cNUMERO PICT '999999' VALID !EMPTY(cNUMERO) .AND. MUDACOD( @cNUMERO ) READ IF ESC() EXIT ENDIF SELE NF DBSETORDER(2) DBGOTOP() IF !DBSEEK( cNUMERO ) BEEP() ALERT('NOTA FISCAL NAO ENCONTRADA !!!') LOOP ENDIF // PEGA CODIGO DO CLIENTE PARA PESQUISA CPF/CGC // IMPLEMENTAR PARA SALVAR NA NOTAF O CGC/CPF cXML := SUBSTR(NF->XML,0,44) @ 07,10 SAY NF->CODIGO+'-'+NF->NOMCLI @ 08,10 SAY cXML @ 10,10 GET cCORRECAO1 VALID LEN( cCORRECAO1 ) > 15 @ 11,10 GET cCORRECAO2 @ 12,10 GET cCORRECAO3 @ 13,10 GET cCORRECAO4 @ 14,10 GET cCORRECAO5 READ IF ESC() .OR. ALERT('CONFIRMA AS CORRECOES ?',{'SIM','NAO'})=2 EXIT ENDIF MOSTRA(" AGUARDE... GERANDO CARTA DE CORRECAO ... ") ARQNFE := "CCE\CCE"+STRZERO(VAL(cNUMERO),5)+".TXT" SET PRINTER TO &ARQNFE SET DEVICE TO PRINT SETPRC(0,0) // IDENTIFICACAO DA CARTA DE CORRECAO @ PROW() ,00 SAY 'NFE.CartadeCorrecao("[CCE]' @ PROW()+1,00 SAY 'idLote=' +cNUMERO // Numero do lote mesmo numero da nota @ PROW()+1,00 SAY '[EVENTO001]' @ PROW()+1,00 SAY 'chNFe=' +cXML @ PROW()+1,00 SAY 'cOrgao=51' @ PROW()+1,00 SAY 'CNPJ=' +TIRAPONTO( PERS->CGC ) @ PROW()+1,00 SAY "dhEvento=" +DTOC(DATASIS)+' '+TIME() @ PROW()+1,00 SAY "nSeqEvento=1" @ PROW()+1,00 SAY "xCorrecao=" +ALLTRIM(cCORRECAO1)+' ' ; +ALLTRIM(cCORRECAO2)+' ' ; +ALLTRIM(cCORRECAO3)+' ' ; +ALLTRIM(cCORRECAO4)+' ' ; +ALLTRIM(cCORRECAO5)+' ' @ PROW()+1,00 SAY ')' SET PRINTER TO SET DEVICE TO SCREEN // GERANDO XML E ENVIANDO CCE IF FILE(ARQNFE) // LE O ARQUIVO cTXTNFE := MEMOREAD( ARQNFE ) // ENVIA TEXTO INI PARA GERACAO DO ARQUIVO XML cRETORNO := COMANFE( cTXTNFE ) // VERIFICA SE O MONITOR RETORNOU ERRO IF AT( 'Inativo ou Inoperante', cRETORNO ) > 0 .OR. LEFT( cRETORNO,5 ) = 'ERRO:' BEEP() MOSTRACBR( cRETORNO ) LOOP ELSE // SENAO PEGA STATUS cCSTAT := PEGACSTAT( cRETORNO, '[EVENTO001]' ) IF cCSTAT = '135' .OR. cCSTAT = '136' // ENVIADO cIDNFC := '[EVENTO001]' cNPROTCCE:= ALLTRIM( PEGATEXTO( cRETORNO, 'nProt=' , cIDNFC ) ) cXMLCCE := ALLTRIM( PEGATEXTO( cRETORNO, 'chNFe=' , cIDNFC ) ) dDATAH := ALLTRIM( PEGATEXTO( cRETORNO, 'dhRegEvento=',cIDNFC ) ) cTPEVENTO:= ALLTRIM( PEGATEXTO( cRETORNO, 'tpEvento=', cIDNFC ) ) cSEQ := ALLTRIM( PEGATEXTO( cRETORNO, 'nSeqEvento=', cIDNFC ) ) cDATACCE := LEFT( dDATAH, 10 ) cHORACCE := SUBSTR( dDATAH, 12, 8 ) SELE NF WHILE(.T.) IF RLOCK() _FIELD->NF->XMLCCE := cXMLCCE _FIELD->NF->DATACCE := CTOD(cDATACCE) _FIELD->NF->HORACCE := cHORACCE _FIELD->NF->NPROTCCE := cNPROTCCE _FIELD->NF->CSTATCCE := cCSTAT EXIT ENDIF ENDDO MOSTRACBR(SUBSTR( cRETORNO, AT( '[EVENTO001]',cRETORNO ), LEN( cRETORNO) - AT( 'EVENTO001',cRETORNO ) )) * C:\ACBRNFE2\RETORNO\511408074070050001825500100000267610000267651101101-procEventoNFe.xml * C:\ACBrNfe2\EVENTOS\201602\Evento\CCe\1101105116020740700500018255001000003625100003625301-procEventoNFe.xml cANO := '20'+SUBSTR( cXMLCCERET,3,2 ) cMES := SUBSTR( cXMLCCERET, 5,2 ) cANOMES := cANO+cMES cXMLCCERET := cDIRNFE+'\EVENTOS\'+cANOMES+'\Evento\CCe\110110'+cXMLCCE+'01-procEventoNFe.xml' IF ALERT( 'IMPRIME A CARTA DE CORRECAO ?',{'SIM','NAO'}) = 1 cRETORNO := COMANFE('NFE.ImprimirEventoPDF',cXMLCCERET) cRETORNO := COMANFE('NFE.ImprimirEvento',cXMLCCERET) MOSTRACBR( cRETORNO ) ENDIF EXIT ELSE BEEP() MOSTRACBR( cRETORNO ) LOOP ENDIF ENDIF ELSE BEEP() ALERT('Nao foi possivel gerar o xml da CCE!!!') LOOP ENDIF ENDDO RESTSCREEN(,,,,cTela ) ABREARQ(,.F.) RETURN NIL ******************************************************************************** FUNCTION IMPCCE() LOCAL cXMLCCERET := LEFT( NF->XMLCCE,44 ) LOCAL cRETORNO := '' IF ALERT('Confirma ImpressÆo da Carta de Corre‡Æo?',aSIMNAO)=1 cANO := '20'+SUBSTR( cXMLCCERET,3,2 ) cMES := SUBSTR( cXMLCCERET, 5,2 ) cANOMES := cANO+cMES cXMLCCERET := cDIRNFE+'\EVENTOS\'+cANOMES+'\Evento\CCe\110110'+LEFT(XMLCCE,44)+'01-procEventoNFe.xml' cRETORNO := COMANFE('NFE.ImprimirEvento',cXMLCCERET) cRETORNO := COMANFE('NFE.ImprimirEventoPDF',cXMLCCERET) MOSTRACBR( cRETORNO ) ENDIF RETURN NIL ***************************************** * lBAIXAEST // BAIXA ESTOQUE ? .T. .F. FUNCTION APAGANF( cNUMERO, lBAIXAEST ) LOCAL cTELA := SAVESCREEN( 0,0,24,79 ) LOCAL nRECNF := RECNO()-1 IF NIVEL<"9" TONE(500,1) ; TONE(400,1) ALERT2(" !!! ATENCAO !!! | VOCE NAO ESTA AUTORIZADO A EXECUTAR ESTA OPERACAO!!!| SOMENTE O SUPERVISOR DO SISTEMA !!!|",{" Enter "},,,"Mensagem de Advertencia") RETURN(NIL) ENDIF IF !EMPTY(DATAENVIO) .AND. NF->CSTAT = "100" BEEP() ALERT("NFE JA FOI ENVIADA!!! ; VOCE SO PODE EXCLUIR NOTAS QUE NAO FORAM ENVIADAS... ; USE A OPCAO CANCELA NFE PARA CANCELAR ESTA NFE.") RETURN(NIL) ENDIF IF NF->CSTAT= "101" .OR. NF->CSTAT = "102" BEEP() ALERT("NFE JA FOI "+IF(NF->CSTAT="101","CANCELADA","INUTILIZADA")+" !!!") RETURN(NIL) ENDIF IF RECNO() < LASTREC() BEEP() ALERT("VOCE SO PODE APAGAR A ULTIMA NOTA QUE NAO FOI ENVIADA") RETURN NIL ENDIF IF ALERT("TEM CERTEZA QUE DESEJA EXCLUIR ESTA NOTA FISCAL?",{"SIM","NAO"})== 2 .or. ESC() RETURN(NIL) ENDIF // SE A NOTA NAO FOI GERADA POR PEDIDO IF ! EMPTY(NF->PEDIDO) MOSTRA("EXCLUINDO VENDA ...") APAGAVENDA( cNUMERO, 3, .F. ) ENDIF MOSTRA(" EXCLUINDO ITENS NOTA FISCAL... ") SELE INF WHILE (.T.) IF FLOCK() DELE ALL FOR INF->NUMERO == cNUMERO UNLOCK EXIT ENDIF ENDDO MOSTRA(" EXCLUINDO ITENS NOTA FISCAL... ") SELE NF WHILE (.T.) IF RLOCK() DELETE UNLOCK EXIT ENDIF ENDDO RESTSCREEN( 0,0,24,79, cTELA ) SELE NF DBGOTO( nRECNF ) ESTABL() CLEAR GETS RETURN NIL ******************************************************************************** // FUNCAO CRIANFE - CRIA A NOTA FISCAL ELETRONICA FUNCTION CRIANFE() LOCAL cTela := SAVESCREEN(00,00,24,79) LOCAL GetList := {},cCODIGO:=SPACE(6),cCODPRO:=SPACE(5) LOCAL nRecno, nLocalRecno := RECNO() LOCAL cDADO6 := "PROCON-MT-Fone 151 Av.Hist.Rubens Mendonca - Nr 917 - Araes - Ed.Eld.Exec.Center CEP:78-008-000 - Cuiaba-MT " LOCAL lJAGEROU := .F. WHILE( .T. ) IF PERS->LIBCUPOM='N' IF MONTH( NF->DATAEMIS ) != MONTH( DATASIS ) BEEP() ALERT(' NAO E POSSIVEL GERAR UM XML DE UM MES DIFERENTE DO MES ATUAL !!!') EXIT ENDIF ENDIF // VERIFICA SE A NOTA Jµ FOI ENVIADA cCSTAT := NF->CSTAT cESTANF := IF( cCSTAT='100','ENVIADA',IF(cCSTAT='102','CANCELA',IF(cCSTAT='103','INUTILIZADA','CANCELADA'))) IF cCSTAT$'100102103135' BEEP() ALERT('NOTA FISCAL ESTA &cESTANF !!! NAO E POSSIVEL GERA-LA NOVAMENTE ... ') EXIT ENDIF IF !EMPTY( NF->DATACRIA ) BEEP() IF ALERT("NOTA FISCAL FOI JA FOI GERADA EM "+DTOC(NF->DATACRIA)+" COM O XML ;"+NF->XML+" ; DESEJA GERA-LA NOVAMENTE ?",{"SIM","NAO"} )=2 EXIT ENDIF ELSE TONE(500,2) IF PERGUNTA("GERA NFE ?")=="N" .or. esc() EXIT ENDIF ENDIF SELE NF cNUMERO := NF->NUMERO cFOP := NF->FOP SELE CLI // PROCURANDO DADOS DO CLIENTE DBSETORDER( 2 ) IF !DBSEEK( cCODIGO := NF->CODIGO ) BEEP() ALERT("CLIENTE NAO ENCONTRADO, VERIFIQUE !!!") EXIT ENDIF MOSTRA(" AGUARDE... GERANDO NOTA FISCAL ... ") ARQNFE := "\DATASAC\TXT\NF"+STRZERO(VAL(cNUMERO),6)+".TXT" ARQNFE := "NFE.TXT" SET PRINTER TO &ARQNFE SET DEVICE TO PRINT SETPRC(0,0) cTpa := PERS->TIPAMB // IDENTIFICACAO DA NOTA FISCAL @ PROW() ,00 SAY 'NFE.CriarNFe("[Identificacao]' @ PROW()+1,00 SAY "NaturezaOperacao="+NF->NATUREZA // NATUREZA DA OPERACAO (VENDA,ENTRADA) // idDest = 1 - Op interna 2 - Operacao com outro estado @ PROW()+1,00 SAY 'idDest=' + IF( CLI->UFCOB='MT','1','2') // DEFINE FORMA DE PAGAMENTO cFORMPAG := IF( EMPTY(NF->NUMDUP1),"2","1") // 0-VISTA 1-PRAZO 2-OUTRAS @ PROW()+1,00 SAY "FormaPag=" + cFORMPAG @ PROW()+1,00 SAY "Modelo=55" // FIXO SEMPRE 55 @ PROW()+1,00 SAY "Serie=1" // FIXO SEMPRE 1 @ PROW()+1,00 SAY "Codigo=" +cNUMERO // CODIGO DA NOTA @ PROW()+1,00 SAY "Numero=" +cNUMERO // MESMO CODIGO DA NOTA @ PROW()+1,00 SAY "Emissao=" +DTOC(NF->DATAEMIS) IF cFOP = '5102' .OR. cFOP = '6102' @ PROW()+1,00 SAY "Saida=" +DTOC(NF->DATAEMIS) @ PROW()+1,00 SAY "hSaiEnt=" +TIME() ENDIF @ PROW()+1,00 SAY "Tipo=" +NF->TIPOMOV // 0-ENTRADA 1-SAIDA @ PROW()+1,00 SAY "TpAmb=" +cTpa // VERIFICA SE E NOTA DE DEVOLUCAO // Finalidade 1-Normal 2-Complementar 3-Ajuste 4-Devolucao/Retorno IF cFOP = '5202' .OR. cFOP = '6202' .OR. cFOP = '5920' .OR. cFOP = '6920' .OR. cFOP = '5921' .OR. cFOP = '6921' .OR. cFOP = '5411' .OR. cFOP = '6411' @ PROW()+1,00 SAY 'Finalidade='+IIF(cFOP = '5920' .OR. cFOP = '6920','1','4') @ PROW()+1,00 SAY '[NFRef001]' @ PROW()+1,00 SAY 'Tipo=NFe' @ PROW()+1,00 SAY 'refNFe='+NF->XMLCCE FOR X=2 TO 8 cCAMPO := 'NF->NFREF'+ALLTRIM(STR(X)) IF LEFT(&cCAMPO,1)=' ' EXIT ELSE @ PROW()+1,00 SAY '[NFRef00'+ALLTRIM(STR(X))+']' @ PROW()+1,00 SAY 'Tipo=NFe' @ PROW()+1,00 SAY 'refNFe='+&cCAMPO ENDIF NEXT ELSE @ PROW()+1,00 SAY "Finalidade="+IF(NF->TIPONF="N","1","2") ENDIF // DADOS DO EMITENTE @ PROW()+1,00 SAY "[Emitente]" @ PROW()+1,00 SAY "CNPJ=" +TIRAPONTO(PERS->CGC) // CNPJ SO NUMEROS @ PROW()+1,00 SAY "IE=" +PERS->INSCRICAO // IE SO NUMEROS @ PROW()+1,00 SAY "Razao=" +ALLTRIM(PERS->RAZAO) @ PROW()+1,00 SAY "Fantasia=" +ALLTRIM(PERS->EMPRESA) @ PROW()+1,00 SAY "Fone=" +RETIRACH(PERS->TELEFONE,"-") // SO NUMEROS @ PROW()+1,00 SAY "CEP=" +TIRAPONTO(PERS->CEP) // SO NUMEROS @ PROW()+1,00 SAY "CRT=" +PERS->CRT @ PROW()+1,00 SAY "Logradouro="+TIRAPONTO(ALLTRIM(PERS->ENDERECO)) @ PROW()+1,00 SAY "Numero=" +ALLTRIM(PERS->NUMERO) @ PROW()+1,00 SAY "Complemento=" @ PROW()+1,00 SAY "Bairro=" +PERS->BAIRRO @ PROW()+1,00 SAY "CidadeCod="+PERS->CODCIDADE // CODIGO DA CIDADE CONF IBGE @ PROW()+1,00 SAY "Cidade=" +ALLTRIM(PERS->CIDADE) @ PROW()+1,00 SAY "UF=" +ALLTRIM(PERS->ESTADO) //DADOS DO DESTINATARIO cFONE := RETIRACH(CLI->FONCOB,"(") cFONE := RETIRACH(cFONE,")") cFONE := RETIRACH(cFONE,"-") cFONE := RIGHT( cFONE,10 ) cPJ := CLI->JURIDICA @ PROW()+1,00 SAY "[Destinatario]" cINDIEDEST := '1' IF EMPTY(CLI->INSCRICAO) .OR. ALLTRIM( CLI->INSCRICAO )='ISENTO' @ PROW()+1,00 SAY 'indIEDest=9' // ISENTO cINDIEDEST := '9' ELSE IF ALLTRIM( CLI->INSCRICAO)='ISENTO' @ PROW()+1,00 SAY 'indIEDest=9' // PODE TER OU NAO INSCRICAO cINDIEDEST := '9' ELSE @ PROW()+1,00 SAY 'indIEDest=1' ENDIF ENDIF @ PROW()+1,00 SAY "CNPJ=" +IF( cTpa="1",TIRAPONTO( IF(cPJ="J",CLI->CGC,CLI->CPF) ),"99.999.999/0001-91" ) @ PROW()+1,00 SAY "IE=" +IF( cINDIEDEST="1",ALLTRIM(CLI->INSCRICAO),"") @ PROW()+1,00 SAY "NomeRazao=" +IF( cTpa="1",ALLTRIM(CLI->NOME),"NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL") @ PROW()+1,00 SAY "Fone=" +cFONE @ PROW()+1,00 SAY "CEP=" +TIRAPONTO(CLI->CEPCOB) @ PROW()+1,00 SAY "Logradouro=" +TIRAPONTO(ALLTRIM(CLI->ENDCOB)) @ PROW()+1,00 SAY "Numero=" +IF( !EMPTY(CLI->NUMERO),CLI->NUMERO,"S/N" ) @ PROW()+1,00 SAY "Complemento=" @ PROW()+1,00 SAY "Bairro=" +IF( !EMPTY( ALLTRIM(CLI->BAICOB) ), ALLTRIM(CLI->BAICOB) , "CENTRO" ) @ PROW()+1,00 SAY "CidadeCod=" +CLI->CODCIDADE // CODIGO CONFORME IBGE @ PROW()+1,00 SAY "Cidade=" +ALLTRIM(CLI->CIDCOB) @ PROW()+1,00 SAY "UF=" +IF( !EMPTY( ALLTRIM(CLI->UFCOB) ), ALLTRIM(CLI->UFCOB) , "MT" ) @ PROW()+1,00 SAY "Email=" +ALLTRIM(CLI->EMAIL) // SE NOTA FISCAL COMPLEMENTAR IF NF->TIPONF="C" @ PROW()+1,00 SAY "[NFRef001]" @ PROW()+1,00 SAY "refNFe :="+ NF->XML // CHAVE DA NFE @ PROW()+1,00 SAY "UF :="+ ALLTRIM(PERS->ESTADO) @ PROW()+1,00 SAY "AAMM :="+ SUBSTR( DTOC( NF->DATACRIA ),9,2 )+SUBSTR( DTOC( NF->DATACRIA ),4,2 ) @ PROW()+1,00 SAY "CNPJ :="+ TIRAPONTO(PERS->CGC) @ PROW()+1,00 SAY "Modelo :=55" @ PROW()+1,00 SAY "Serie :=1" @ PROW()+1,00 SAY "nNF :="+ NF->NUMERO ENDIF nBICMS := 0.00 // BASE DE CALCULO DO ICMS nVLBICMS := 0.00 // VALOR DO ICMS nBICMSST := 0.00 // BASE DE CALCULO DO ICMS COM SUBSTITUICAO nBICMSTOT := 0.00 // TOTAL BASE CALCULO ICMS nVLICMSTOT := 0.00 // VALOR TOTAL DO ICMS nBICMSTOTST := 0.00 // BASE CALCULO ICMS ST nVICMSTOTST := 0.00 // VALOR DO ICMS ST nVLTOTPIS := 0.00 // VALOR TOTAL DO PIS nVLTOTCOF := 0.00 // VALOR TOTAL DO COFINS nTOTIPI := 0.00 // VALOR DO IPI nVOUTRO := 0.00 // VALOR DE OUTRAS DESPESAS POR PRODUTO nOUTRASDE := 0.00 // VALOR TOTAL DE OUTRAS DESPESAS DBSelectArea('NAT') DBSETORDER(1) DBGOTOP() nVLDESC := 0.00 // SOMA DOS DESCONTOS DO BD nIMPOSTOE := 0.00 nIMPOSTOF := 0.00 DBSelectArea('INF') DBSETORDER( 3 ) DBGOTOP() IF DBSEEK( cNUMERO ) X := 0 WHILE (INF->NUMERO = cNUMERO ) X++ DBSKIP() ENDDO DBGOTOP() DBSEEK( cNUMERO ) Y := 0 nIMPOSTOE := 0.00 nIMPOSTOF := 0.00 cCHAVEIBPT:= '' cFONTEIBPT:= '' cVERSAOIBPT:='' // VERIFICA SE TEM OUTRAS DESPESAS // DADOS DE OUTRAS DESPESAS ACESSÓRIAS lOUTRASDE := .F. nOUTRASDE:= NF->OUTRASDE IF nOUTRASDE > 0.00 // X = QTDE DE ITENS nVLPARC := nOUTRASDE/X // VALOR DA PARCELA nRESTO := nOUTRASDE-(nVLPARC * X) // FAZ OP INVER PARA VER DIFERENCA nVOUTRO1 := nVLPARC+nRESTO nVOUTRO := nVLPARC lOUTRASDE:= .T. // CONTROLE DA IMPRESSAO DA PRIMEIRA PARCELA DE OUTRASDE ENDIF FIRSTIMPO := .T. WHILE (INF->NUMERO = cNUMERO ) Y++ nVT := INF->VT DBSelectArea('PRO') DBSETORDER(1) DBGOTOP() DBSEEK(INF->CODPRO) cNCM := ALLTRIM(PRO->NCM) IF LEN( cNCM ) < 8 cNCM := PERS->NCM ENDIF DBSelectArea('LTI') DBGOTOP() IF !DBSEEK( cNCM ) cNCM := PERS->NCM DBGoTop() DBSEEK( cNCM ) ENDIF nPORIMPOF := LTI->FEDERALNAC nPORIMPOE := LTI->ESTADUAL IF FIRSTIMPO cCHAVEIBPT:= LTI->CHAVE cFONTEIBPT:= LTI->FONTE cVERSAOIBPT:=LTI->VERSAO FIRSTIMPO := .F. ENDIF nIMPOSTOF += nVT * nPORIMPOF / 100 nIMPOSTOE += nVT * nPORIMPOE / 100 // DADOS DOS PRODUTOS - UM CABECALHO PARA CADA PRODUTO @ PROW()+1,00 SAY "[Produto"+STRZERO(Y,3)+"]" @ PROW()+1,00 SAY "Item=" +ALLTRIM(STR(Y,2)) DBSelectArea('INF') WHILE(.T.) IF RECLOCK() // BUSCA NOME DO CADASTRO DE PRODUTOS IF INF->NOME != PRO->NOMPRO_ _FIELD->INF->NOME := PRO->NOMPRO_ ENDIF // BUSCA CFOP CONFORME A NATUREZA DE OPERACAO IF NAT->FOPNAT='N' _FIELD->INF->CFOP := PRO->CFOP_ ENDIF EXIT ENDIF ENDDO cCFOP := INF->CFOP @ PROW()+1,00 SAY "CFOP=" +cCFOP @ PROW()+1,00 SAY "Codigo=" +INF->CODPRO @ PROW()+1,00 SAY "Descricao=" +TIRAVIRG(INF->NOME) // TAMANHO DO NCM nTNCM := LEN( ALLTRIM( PRO->NCM ) ) IF nTNCM = 8 .AND. PRO->NCM != '00000000' .AND. PRO->NCM!='99999999' @ PROW()+1,00 SAY "NCM=" +PRO->NCM ELSE @ PROW()+1,00 SAY "NCM=" +PERS->NCM ENDIF @ PROW()+1,00 SAY "EAN=" +IF( VALIDAEAN(PRO->CODBARRA,.F.), PRO->CODBARRA, "" ) nVLDESC += INF->DESC nDESC := INF->DESC @ PROW()+1,00 SAY "uCom=" +PRO->UND_ nINTEIRO := IF( INF->QTDE/INF->QTDE=1,.T.,.F.) @ PROW()+1,00 SAY "qCom=" +ALLTRIM(STR( INF->QTDE,10,3 )) @ PROW()+1,00 SAY "vUnCom=" +ALLTRIM(STR( INF->VU ,10,2)) @ PROW()+1,00 SAY "vProd=" +ALLTRIM(STR( nVT ,10,2 )) @ PROW()+1,00 SAY "ValorDesconto=" +ALLTRIM(STR( nDESC ,10,2 )) IF PERS->UNDTRIB = 'S' .AND. PRO->QTDETRIB_ > 0.000 @ PROW()+1,00 SAY "uTrib=" +PRO->UNDTRIB_ nQTDETRIB := PRO->QTDETRIB_ * INF->QTDE @ PROW()+1,00 SAY "qTrib=" +ALLTRIM(STR( nQTDETRIB,8,2 )) nVUNTRIB := nVT / nQTDETRIB @ PROW()+1,00 SAY "vUnTrib=" +ALLTRIM(STR( nVUNTRIB ,10,6 )) ENDIF *********************************************************************** IF nOUTRASDE > 0.00 IF lOUTRASDE lOUTRASDE := .F. @ PROW()+1,00 SAY "vOutro="+ALLTRIM(STR( nVOUTRO1,10,2 )) ELSE @ PROW()+1,00 SAY "vOutro="+ALLTRIM(STR( nVOUTRO,10,2 )) ENDIF ENDIF @ PROW()+1,00 SAY "IndTot=1" @ PROW()+1,00 SAY "[ICMS"+STRZERO(Y,3)+"]" @ PROW()+1,00 SAY "Origem=0" cCSOSN := PRO->CSOSN_ IF PERS->ST400 = 'N' IF PERS->CRT = '1' // SIMPLES IF cINDIEDEST == '1' cCSOSN := IF( (cCFOP="5102" .OR. cCFOP="6102"),"900","500") ELSE cCSOSN := IF( (cCFOP="5102" .OR. cCFOP="6102"),"400","500") ENDIF ELSE IF cINDIEDEST == '1' cCSOSN := IF( (cCFOP="5102" .OR. cCFOP="6102"),"90","60" ) ELSE cCSOSN := IF( (cCFOP="5102" .OR. cCFOP="6102"),"40","60" ) ENDIF ENDIF IF (cFOP = '5202' .OR. cFOP = '6202' .OR. cFOP='1949' .OR. cFOP = '5411' .OR. cFOP = '6411') IF cCRT = '3' cCSOSN:= '90' ELSE cCSOSN:='900' ENDIF ENDIF IF (cFOP = '5920' .OR. cFOP = '6920' .OR. cFOP = '5921' .OR. cFOP = '6921' ) IF cCRT = '3' cCSOSN:= '40' ELSE cCSOSN:='400' ENDIF ENDIF ENDIF @ PROW()+1,00 SAY IF( cCRT='3','CST=','CSOSN=')+cCSOSN // VERIFICA SE TEM CODIGO ANP IF !EMPTY(PRO->ANP_) @ PROW()+1,00 SAY '[Combustivel'+STRZERO(Y,3)+']' @ PROW()+1,00 SAY 'cProdANP='+PRO->ANP_ @ PROW()+1,00 SAY 'UFCONS='+PERS->ESTADO ENDIF IF (cFOP='6202' .OR. cFOP='6411' ) // .AND. cCRT='3' // ICMS NORMAL nBICMS := nVT nVLICMS := TRUNCANFE( VAL(STR(nVT*NF->ICMSD/100,10,2)),2) @ PROW()+1,00 SAY 'MODALIDADE=3' @ PROW()+1,00 SAY 'VALORBASE='+ALLTRIM(STR( nVT,10,2 )) @ PROW()+1,00 SAY 'ALIQUOTA='+TRAN(NF->ICMSD,'99') @ PROW()+1,00 SAY 'VALOR='+ALLTRIM(STR(nVLICMS,10,2)) nBICMSTOT += nBICMS nVLICMSTOT += nVLICMS ENDIF IF NF->ST > 0.00 .AND. cCRT='3' // ICMS ST nBICMSST := nBICMS + TRUNCANFE( VAL( STR( nBICMS * NF->ST / 100,10,2 ) ), 2 ) * nDIFICMS := nBICMSST - nBICMS nVLICMSST:= nBICMSST * NF->ICMSD/100 // TRUNCANFE(nBICMSST*NF->ICMSD/100,2) // - nVLICMS nVLICMSST:= TRUNCANFE(nBICMSST*NF->ICMSD/100,2) // - nVLICMS @ PROW()+1,00 SAY 'MODALIDADEST=5' @ PROW()+1,00 SAY 'VALORBASEST='+ALLTRIM(STR(nBICMSST,10,2)) @ PROW()+1,00 SAY 'ALIQUOTAST='+TRAN(NF->ICMSD,'99') @ PROW()+1,00 SAY 'VALORST='+ALLTRIM(STR(nVLICMSST,10,2)) nBICMSTOTST+= nBICMSST // BASE CALCULO ICMS ST nVICMSTOTST+= nVLICMSST // VALOR DO ICMS ST ENDIF IF cCRT='3' // PIS @ PROW()+1,00 SAY '[PIS'+STRZERO(Y,3)+']' @ PROW()+1,00 SAY 'CST=01' @ PROW()+1,00 SAY 'VALORBASE='+ALLTRIM(STR( nBICMS,10,2 )) @ PROW()+1,00 SAY 'ALIQUOTA='+TRAN(PERS->PIS,'99.99') @ PROW()+1,00 SAY 'VALOR='+ALLTRIM(STR((nBICMS*PERS->PIS/100),10,2)) // COFINS @ PROW()+1,00 SAY '[COFINS'+STRZERO(Y,3)+']' @ PROW()+1,00 SAY 'CST=01' @ PROW()+1,00 SAY 'VALORBASE='+ALLTRIM(STR( nBICMS,10,2 )) @ PROW()+1,00 SAY 'ALIQUOTA='+TRAN(PERS->COFINS,'99.99') @ PROW()+1,00 SAY 'VALOR='+ALLTRIM(STR((nBICMS*PERS->COFINS/100),10,2)) IF INF->IPI > 0 // IPI nVIPI := (INF->VU*INF->QTDE)*INF->IPI/100 @ PROW()+1,00 SAY '[IPI'+STRZERO(Y,3)+']' @ PROW()+1,00 SAY 'cEnq=999' @ PROW()+1,00 SAY 'CST=50' @ PROW()+1,00 SAY 'vBC=' +ALLTRIM(STR( INF->VU ,10,2 )) @ PROW()+1,00 SAY 'pIPI=' +ALLTRIM(STR( INF->IPI ,5,2 )) @ PROW()+1,00 SAY 'vIPI=' +ALLTRIM(STR( nVIPI ,10,2 )) nTOTIPI += nVIPI nVIPI := 0.00 ENDIF nVLTOTPIS += (nBICMS*PERS->PIS/100) // VALOR TOTAL DO PIS nVLTOTCOF += (nBICMS*PERS->COFINS/100) // VALOR TOTAL DO COFINS ENDIF SELE INF DBSKIP() ENDDO ENDIF SELE NF nTOTAL := NF->TOTAL // TOTAL DA NOTA FISCAL COM CALCULOS DE IMPOSTOS @ PROW()+1,00 SAY "[Total]" @ PROW()+1,00 SAY "ValorProduto=" +ALLTRIM(STR( nTOTAL,10,2 )) @ PROW()+1,00 SAY "ValorDesconto=" +ALLTRIM(STR( NF->VAL_DESCON, 10,2 )) nTOTGERAL := nTOTAL - NF->VAL_DESCON IF cFOP='6202'.or. cFOP='6411' IF NF->ICMSD > 0.0 @ PROW()+1,00 SAY 'BaseIcms='+ALLTRIM(STR( nBICMSTOT,10,2 )) @ PROW()+1,00 SAY 'ValorIcms='+ALLTRIM(STR( nVLICMSTOT,10,2 )) ENDIF IF NF->ST > 0.00 @ PROW()+1,00 SAY 'BaseIcmsSubstituicao='+ALLTRIM(STR( nBICMSTOTST,10,2 )) @ PROW()+1,00 SAY 'ValorIcmsSubstituicao='+ALLTRIM(STR( nVICMSTOTST,10,2 )) nTOTGERAL += nVICMSTOTST ENDIF ENDIF IF cCRT='3' @ PROW()+1,00 SAY 'ValorPis='+ALLTRIM(STR( nVLTOTPIS,10,2 )) @ PROW()+1,00 SAY 'ValorCofins='+ALLTRIM(STR( nVLTOTCOF,10,2 )) ENDIF // VERIFICA SE TEM IPI IF nTOTIPI != 0.00 @ PROW()+1,00 SAY 'ValorIpi='+ALLTRIM(STR(nTOTIPI,10,2)) nTOTGERAL := nTOTGERAL + nTOTIPI ENDIF // SE TIVER DEPESAS ACESSORIAS nTOTGERAL += nOUTRASDE @ PROW()+1,00 SAY 'ValorOutrasDespesas='+ALLTRIM(STR( nOUTRASDE,10,2 )) @ PROW()+1,00 SAY "ValorNota=" +ALLTRIM(STR( nTOTGERAL,10,2 )) IF cFORMPAG = "1" // 1-A PRAZO 2-OUTRAS FOR nDUP = 1 TO 6 @ PROW()+1,00 SAY "[Duplicata"+STRZERO(nDUP,3)+"]" cNUMDUP := "NF->NUMDUP" + STR(nDUP,1) cVCTODUP := "NF->VCTODUP" + STR(nDUP,1) cVLDUP := "NF->VLDUP" + STR(nDUP,1) @ PROW()+1,00 SAY "Numero=" + ALLTRIM( &cNUMDUP ) @ PROW()+1,00 SAY "DataVencimento=" + DTOC( &cVCTODUP ) @ PROW()+1,00 SAY "Valor=" + STR( &cVLDUP, 10, 2 ) NEXT ENDIF //DADOS DA TRANSPORTADORA @ PROW()+1,00 SAY "[Transportador]" @ PROW()+1,00 SAY "FretePorConta=" +NF->FRETEPC IF NF->CODTRA!="001" SELE TRA DBSETORDER(2) DBGOTOP() IF DBSEEK(NF->CODTRA) @ PROW()+1,00 SAY "NomeRazao="+TIRAVIRG(ALLTRIM(TRA->NOME)) @ PROW()+1,00 SAY "CnpjCpf=" +ALLTRIM(TRA->CGC) @ PROW()+1,00 SAY "IE=" +TIRAPONTO(ALLTRIM(TRA->INSC_EST)) @ PROW()+1,00 SAY "Endereco=" +TIRAVIRG(ALLTRIM(TRA->ENDERECO)) @ PROW()+1,00 SAY "Cidade=" +ALLTRIM(TRA->CIDADE) @ PROW()+1,00 SAY "UF=" +TRA->ESTADO @ PROW()+1,00 SAY "Placa=" +TIRAPONTO(NF->PLACA) @ PROW()+1,00 SAY "UFPlaca=" +NF->UFPLACA //DADOS DO FRETE @ PROW()+1,00 SAY "[Volume1]" @ PROW()+1,00 SAY "Quantidade=" +STRZERO(NF->QTDECG,3) @ PROW()+1,00 SAY "Especie=" +NF->ESPECIE @ PROW()+1,00 SAY "Marca=" +NF->MARCA @ PROW()+1,00 SAY "Numeracao=" +NF->NUMEROCG @ PROW()+1,00 SAY "PesoLiquido="+STR(NF->PESOL,8,3) @ PROW()+1,00 SAY "PesoBruto=" +STR(NF->PESOB,8,3) ELSE @ PROW()+1,00 SAY "NomeRazao=" ENDIF ELSE @ PROW()+1,00 SAY "NomeRazao=" ENDIF cDADOLEI := ';' nPORIMPOTF := nIMPOSTOF / ( NF->TOTAL / 100 ) nPORIMPOTE := nIMPOSTOE / ( NF->TOTAL / 100 ) SELE NAT DBSETORDER(1) DBGOTOP() IF DBSEEK( NF->FOP ) cDADOLEI := IF( NAT->LEI='S', "Tributos aproximados - Federais: R$ "+ALLTRIM(TRAN(nIMPOSTOF,"@E9,999.99"))+" e Estaduais R$ "+ALLTRIM(TRAN(nIMPOSTOE,"@E9,999.99"))+" Fonte: "+ALLTRIM(cFONTEIBPT)+" (v"+cVERSAOIBPT+') Chave: '+cCHAVEIBPT+" ;",'' ) ENDIF SELE NF // DADOS ADICIONAIS @ PROW()+1,00 SAY "[DadosAdicionais]" // VERIFICAR SE NAO ESTA EM BRANCO INF ADICIONAIS cDADO5 := NF->DADO5 IF cFOP = '5202' .OR. cFOP = '6202' .OR. cFOP = '5920' .OR. cFOP = '6920' .OR. cFOP='5921' .OR. cFOP = '6921' cDADOSCHNFE := 'Chave da NFE Referenciada: ' +NF->XMLCCE+; IF(EMPTY(ALLTRIM(NF->NFREF2)),'',', '+NF->NFREF2)+; IF(EMPTY(ALLTRIM(NF->NFREF3)),'',', '+NF->NFREF3)+; IF(EMPTY(ALLTRIM(NF->NFREF4)),'',', '+NF->NFREF4)+; IF(EMPTY(ALLTRIM(NF->NFREF5)),'',', '+NF->NFREF5)+; IF(EMPTY(ALLTRIM(NF->NFREF6)),'',', '+NF->NFREF6)+; IF(EMPTY(ALLTRIM(NF->NFREF7)),'',', '+NF->NFREF7)+; IF(EMPTY(ALLTRIM(NF->NFREF8)),'',', '+NF->NFREF8) IF EMPTY(NF->DADO5) cDADO5 := cDADOSCHNFE ELSE cDADO5 := NF->DADO5 + ';' + cDADOSCHNFE ENDIF ENDIF @ PROW()+1,00 SAY "Fisco=" @ PROW()+1,00 SAY "Complemento=" +; IF(EMPTY(ALLTRIM(NF->DADO1)),'',ALLTRIM(NF->DADO1)+";")+; IF(EMPTY(ALLTRIM(NF->DADO2)),'',ALLTRIM(NF->DADO2)+";")+; IF(EMPTY(ALLTRIM(NF->DADO3)),'',ALLTRIM(NF->DADO3)+";")+; IF(EMPTY(ALLTRIM(NF->DADO4)),'',ALLTRIM(NF->DADO4)+";")+; IF(EMPTY(ALLTRIM(cDADO5)) ,'',ALLTRIM(cDADO5) +";")+; IF(EMPTY(ALLTRIM(cDADOLEI)) ,'',ALLTRIM(cDADOLEI) +";")+; IF(EMPTY(ALLTRIM(cDADO6)) ,'',ALLTRIM(cDADO6) +";")+; IF(EMPTY(ALLTRIM(cDADO7)) ,'',ALLTRIM(cDADO7) +" ")+; IF(EMPTY(ALLTRIM(cDADO8)) ,'',ALLTRIM(cDADO8) ) IF !EMPTY(NF->INFADIC1) //INFORMACOES ADICIONAIS @ PROW()+1,00 SAY "[InfAdic001]" @ PROW()+1,00 SAY "Campo="+NF->INFADIC1 @ PROW()+1,00 SAY "Texto="+NF->TEXTOIA1 @ PROW()+1,00 SAY "[InfAdic002]" @ PROW()+1,00 SAY "Campo="+NF->INFADIC2 @ PROW()+1,00 SAY "Texto="+NF->TEXTOIA2 @ PROW()+1,00 SAY "[InfAdic003]" @ PROW()+1,00 SAY "Campo="+NF->INFADIC3 @ PROW()+1,00 SAY "Texto="+ALLTRIM(NF->TEXTOIA3) ENDIF @ PROW(),PCOL()+1 SAY '")' SET PRINTER TO SET DEVICE TO SCREEN IF FILE(ARQNFE) cTXTNFE := MEMOREAD( ARQNFE ) COMANFE( 'NFe.SetModeloDF','55') COMANFE( 'NFe.SetVersaoDF','3.10') cRETORNO := COMANFE( cTXTNFE ) IF OKACBR( cRETORNO ) MOSTRA( cRETORNO ) cXML := SUBSTR(cRETORNO,25,48) SELE NF WHILE(.T.) IF RLOCK() _FIELD->XML := cXML _FIELD->DATACRIA := DATASIS _FIELD->ARQTXT := SUBSTR(ARQNFE,14,12) _FIELD->NFE := cNUMERO EXIT ENDIF ENDDO SELE INF DBSETORDER( 3 ) DBGOTOP() DBSEEK( cNUMERO ) WHILE (INF->NUMERO = cNUMERO ) MOSTRA('ATUALIZANDO ITEM -> ' + INF->CODPRO+'-'+INF->NOME) IF RLOCK() REPLACE INF->DATAEMIS WITH DATASIS UNLOCK DBSKIP() ENDIF ENDDO MOSTRA(" XML: "+cXML ) cXML := cDIRNFE+"\RETORNO\"+cXML+".XML" MOSTRA( " AGUARDE ... ASSINANDO NOTA FISCAL ... ") cRETORNO := ASSINARNFE( cXML ) IF OKACBR(cRETORNO) SELE NF WHILE(.T.) IF RLOCK() _FIELD->ASSINAR := "S" EXIT ENDIF ENDDO MOSTRA( " NOTA FISCAL ASSINADA COM SUCESSO !!! " ) MILLISEC(20) ELSE ALERT( "NAO FOI POSSIVEL ASSINAR A NFE !!! TENTE DE NOVO... " ) EXIT ENDIF MOSTRA( " AGUARDE ... VALIDANDO NOTA FISCAL ... ") cRETORNO := VALIDARNFE( cXML ) IF OKACBR(cRETORNO) SELE NF WHILE(.T.) IF RLOCK() _FIELD->VALIDAR := "S" EXIT ENDIF ENDDO ELSE ALERT( "NAO FOI POSSIVEL VALIDAR A NFE !!! TENTE NOVAMENTE ..." ) EXIT ENDIF ALERT("NOTA FISCAL GERADA COM SUCESSO !!!") EXIT ELSE BEEP() MOSTRACBR( cRETORNO ) EXIT ENDIF ELSE BEEP() MOSTRACBR( cRETORNO ) EXIT ENDIF EXIT ENDDO SETCURSOR(0) RESTSCREEN(,,,,cTela) SELE NF DBGOTO( nLOCALRECNO ) ESTABL() CLEAR GETS RETURN NIL ******************************************************************************* FUNCTION SEFAZSTATUS() // VERIFICA STATUS DO SERVICO LOCAL cRETORNO := "", cTELA := SAVESCREEN( 0,0,24,79 ) cRETORNO := STATUSSERVICO() RESTSCREEN( 0,0,24,79, cTELA ) RETURN(.T.) ******************************************************************************* FUNCTION ENVNFE() // ENVIAR NOTA FISCAL PRA SEFAZ LOCAL cTela := SAVESCREEN(00,00,24,79), RETORNO := .F. LOCAL GetList := {} , nRECNO := RECNO() WHILE( .T. ) // VERIFICA SE FOI GERADO O XML IF EMPTY( NF->XML ) BEEP() ALERT(" AINDA NAO FOI GERADO O XML DESSA NOTA!!!") EXIT ENDIF // VERIFICA SE FOI ASSINADA A NOTA IF EMPTY( NF->ASSINAR ) BEEP() ALERT(" ESTA NOTA AINDA NAO FOI ASSINADA!!!") EXIT ENDIF // VERIFICA SE FOI VALIDADA A NOTA IF EMPTY( NF->VALIDAR ) BEEP() ALERT(" ESSA NOTA AINDA NAO FOI VALIDADA!!!") EXIT ENDIF cNUMERO := NF->NUMERO cXML := cDIRNFE+"\RETORNO\"+NF->XML+".XML" nLOTE := VAL(cNUMERO) cCSTAT := " " cRETORNO := ENVIARNFE( cXML, nLOTE ) // VERIFICA RETORNO lACHOURET := AT('[RETORNO]',cRETORNO) cRETORNO := IF( lACHOURET>0, SUBSTR( cRETORNO,lACHOURET,LEN(cRETORNO)-lACHOURET), cRETORNO ) ACHACSTAT( cRETORNO ) IF cCSTAT != "100" // VERIFICA SE E NOTA DE ENTRADA IF LEFT( NF->FOP,1 ) = '1' // FILTRA ITENS DA NOTA DBSelectArea('INF') DBGoTop() ORDSETFOCUS(3) ORDSCOPE(0,NF->NUMERO ) ORDSCOPE(1,NF->NUMERO ) DBGoTop() WHILE !EOF() DBSelectArea('PRO') MOSTRA('GRAVANDO ENTRADA NO ESTOQUE... PRODUTO-> '+INF->CODPRO) // DA ENTRADA NO ESTOQUE * SELECIONA ARQUIVO DE PRODUTOS E DA BAIXA NO ESTOQUE DBSelectArea('PRO') ORDSETFOCUS(1) DBGOTOP() IF DBSEEK( INF->CODPRO ) WHILE(.T.) IF RLOCK() _FIELD->PRO->ESTOQUE_:= PRO->ESTOQUE_ + INF->QTDE _FIELD->PRO->ULTVENDA:= DATASIS _FIELD->PRO->HORA := TIME() EXIT ENDIF MILLISEC( 200 ) ENDDO ENDIF MOSTRA("GRAVANDO DADOS DA FICHA KARDEX - PRODUTO-> "+INF->CODPRO) // SELECIONA O ARQUIVO DE FICHA KARDEX E SALVA LANCAMENTOS DBSelectArea('HIST') WHILE(.T.) IF ADDREC() _FIELD->HIST->CODPRO_ := INF->CODPRO _FIELD->HIST->CODFUN_ := "DEV" _FIELD->HIST->CODCLI_ := ALLTRIM( SUBSTR( NF->DADO1,1,6 ) ) _FIELD->HIST->NOMCLI_ := ALLTRIM( SUBSTR( NF->DADO1,8,40 ) ) _FIELD->HIST->QTDE_ := INF->QTDE _FIELD->HIST->DATA_ := DATASIS _FIELD->HIST->NUMVEN_ := NF->NUMERO _FIELD->HIST->LANCA_ := "C" _FIELD->HIST->HORA_ := TIME() _FIELD->HIST->DOCUME_ := NF->NUMERO EXIT ENDIF MILLISEC( 200 ) ENDDO DbSelectArea('INF') DbSkip() ENDDO DBSelectArea('INF') ORDSCOPE( 0, ) ORDSCOPE( 1, ) ENDIF MOSTRACBR( cRETORNO ) ELSEIF cCSTAT = "100" nLINHAS := MLCOUNT( cRETORNO ) aLINHA := {} cNREC := "" cNPROT := "" cCHNFE := "" cDIGVAL := "" cDHRECBTO := "" cXMOTIVO := "" cHORA := "" // RECUPERA VARIAVEIS DE CONTROLE FOR X = 1 TO nLINHAS AADD( aLINHA, MEMOLINE(cRETORNO,79,X) ) DO CASE CASE AT("NRec",aLINHA[X])>0 cNREC := SubStr(Alltrim(aLinha[X]),At("=",aLinha[X])+1,Len(aLinha[X])) CASE AT("NProt",aLINHA[X])>0 cNPROT := SubStr(Alltrim(aLinha[X]),At("=",aLinha[X])+1,Len(aLinha[X])) CASE AT("ChNFe",aLINHA[X])>0 cCHNFE := SubStr(Alltrim(aLinha[X]),At("=",aLinha[X])+1,Len(aLinha[X])) CASE AT("DigVal",aLINHA[X])>0 cDIGVAL:= SubStr(Alltrim(aLinha[X]),At("=",aLinha[X])+1,Len(aLinha[X])) CASE AT("DhRecbto",aLINHA[X])>0 cDHRECBTO := SubStr(Alltrim(aLinha[X]),10,10) cHORA := SUBSTR(ALLTRIM(aLINHA[X]),21,8) CASE AT("XMotivo",aLINHA[X])>0 cXMOTIVO := SubStr(Alltrim(aLinha[X]),At("=",aLinha[X])+1,Len(aLinha[X])) ENDCASE NEXT // GRAVA DADOS NA NOTA FISCAL WHILE(.T.) IF RLOCK() _FIELD->NF->NREC := cNREC _FIELD->NF->NPROT := cNPROT _FIELD->NF->DIGVAL := cDIGVAL _FIELD->NF->DATAENVIO:= CTOD(LEFT( cDHRECBTO,10) ) _FIELD->NF->CSTAT := cCSTAT EXIT ENDIF ENDDO BEEP() COMANFE2( "NFE.ImprimirDANFEPDF", ["]+cXML+["] ) IF ALERT( "NFE AUTORIZADA PELA SEFAZ !!! ; IMPRIME O DANFE ?", {"SIM","NAO"} )=1 cRETORNO := IMPRIMIRDANFE( cXML ) ENDIF ENDIF EXIT ENDDO DBCOMMITALL() CLEAR GETS RESTSCREEN( 0,0,24,79, cTELA ) SELE NF DBGOTO( nRECNO ) ESTABL() RETURN NIL ******************************************************************************* FUNCTION CANCELNFE() // CANCELAR NFE // A NFE SO PODE SER CANCELADA // SE JA TIVER SIDO ENVIADA // E A HORA DE CANCELAMENTO FOR MENOR DO QUE 2 HORAS LOCAL cTela := SAVESCREEN(00,00,24,79), RETORNO := .F. LOCAL GetList := {} , nRECNO := RECNO() IF NF->CSTAT='101' .OR. NF->CSTAT='135' .OR. NF->CSTAT='155' BEEP() ALERT('NFE já foi cancelada !!!') RETURN NIL ENDIF WHILE( .T. ) SETCURSOR(1) RESTSCREEN( ,,,,cTela ) * cANOMES := ANOMES( DATAENVIO ) * cXML := cDIRNFE+"\NFE\"+cANOMES+"\NFE\"+NF->XML+".XML" cXML := LEFT(NF->XML,44) JANELA( 05,10,10,60,"Dados para o cancelamento da NFE") cMOTIVO := SPACE(40) @ 07,12 SAY "MOTIVO:" GET cMOTIVO PICT "@!" VALID !EMPTY(cMOTIVO) READ IF ESC() EXIT ENDIF COMANFE( 'NFe.SetModeloDF(55)') COMANFE( 'NFe.SetVersaoDF(3.10)') //ENVIA COMANDO PARA CANCELAR A NFE E JA PEGA O RETORNO cRETORNO := COMANFE( 'NFE.CancelarNFE','"'+cXML+'","'+ALLTRIM(cMOTIVO)+'"' ) IF !OKACBR( cRETORNO ) MOSTRACBR( cRETORNO ) EXIT ENDIF nLINHAS := MLCOUNT( cRETORNO ) aLINHA := {} lAUTORIZA := .F. cNPROT := "" cDHRECBTO := "" cXMOTIVO := "" cCSTAT := "" cHORA := "" FOR X = 1 TO nLINHAS AADD( aLINHA, MEMOLINE(cRETORNO,79,X) ) DO CASE CASE AT("CStat",aLINHA[X])>0 // VERIFICA SE TEM UMA LINHA STATUS cCSTAT := SubStr(Alltrim(aLinha[X]),At("=",aLinha[X])+1,Len(aLinha[X])) // SE cCSTAT = 101 - AUTORIZADO O CANCELAMENTO DA NFE IF cCSTAT="101" .OR. cCSTAT='135' .OR. cCSTAT='155' lAUTORIZA := .T. ENDIF CASE AT("NProt",aLINHA[X])>0 cNPROT := SubStr(Alltrim(aLinha[X]),At("=",aLinha[X])+1,Len(aLinha[X])) CASE AT("DhRecbto",aLINHA[X])>0 cDHRECBTO := SubStr(Alltrim(aLinha[X]),10,10) cHORA := SUBSTR(ALLTRIM(aLINHA[X]),21,08) CASE AT("XMotivo",aLINHA[X])>0 cXMOTIVO := SubStr(Alltrim(aLinha[X]),At("=",aLinha[X])+1,Len(aLinha[X])) ENDCASE NEXT // SE FOI AUTORIZADO O CANCELAMENTO IF lAUTORIZA IF ALERT('Entra com as mercadorias no Estoque?',{'SIM','NAO'})=1 WHILE(.T.) IF RLOCK() _FIELD->NF->CSTAT := cCSTAT _FIELD->NF->NPROTCANC:= cNPROT _FIELD->NF->DATACANC := CTOD(LEFT( cDHRECBTO,10) ) _FIELD->NF->HORACANC := cHORA UNLOCK EXIT ENDIF ENDDO DbSelectArea('NAT') DbSetOrder(1) DbGoTop() cMOVEST := 'S' IF DbSeek( NF->FOP ) cMOVEST := NAT->MOVEST ENDIF DbSelectArea('INF') DbSetOrder(1) DbGoTop() INF->(OrdScope( 0, NF->NUMERO )) INF->(OrdScope( 0, NF->NUMERO )) DbGoTop() WHILE !EOF() WHILE (.T.) IF RLOCK() _FIELD->INF->CANCELADA := "S" DbUnlock() EXIT ENDIF ENDDO IF cMOVEST='S' // SELECIONA ARQUIVO DE PRODUTOS E DA BAIXA NO ESTOQUE DBSelectArea('PRO') DBSetOrder(1) DBGoTop() IF DBSeek( INF->CODPRO_ ) WHILE(.T.) MOSTRA('Devolvendo itens para o Estoque...') IF RLOCK() _FIELD->PRO->ESTOQUE_ := PRO->ESTOQUE_ + INF->QTDE DBUnlock() EXIT ENDIF ENDDO ENDIF // SELECIONA O ARQUIVO DE FICHA KARDEX E SALVA LANCAMENTOS DBSelectArea('HIST') WHILE(.T.) IF ADDREC() _FIELD->HIST->CODPRO_ := INF->CODPRO _FIELD->HIST->CODFUN_ := '' _FIELD->HIST->CODCLI_ := INF->CODIGO _FIELD->HIST->NOMCLI_ := 'NFE CANCELADA' _FIELD->HIST->QTDE_ := INF->QTDE _FIELD->HIST->DATA_ := DATASIS _FIELD->HIST->NUMVEN_ := NF->NUMERO _FIELD->HIST->LANCA_ := 'C' _FIELD->HIST->HORA_ := TIME() _FIELD->HIST->DOCUME_ := 'NF '+NF->NUMERO DBUnlock() EXIT ENDIF ENDDO ENDIF DbSelectArea('INF') DbSkip() ENDDO INF->(OrdScope( 0, )) INF->(OrdScope( 0, )) DbSelectArea('NF') ENDIF ALERT( "AUTORIZADO O CANCELAMENTO DA NFE !!!") ENDIF EXIT ENDDO RESTSCREEN( 0,0,24,79, cTELA ) DBGOTO( nRECNO ) ESTABL() CLEAR GETS RETURN NIL ******************************************************************************* FUNCTION INUTILNFE() // INUTILIZAR NFE // A NFE SO PODE SER CANCELADA // SE JA TIVER SIDO ENVIADA LOCAL cTela := SAVESCREEN(00,00,24,79), RETORNO := .F. LOCAL GetList := {} , nRECNO := RECNO() IF NF->CSTAT = '102' BEEP() ALERT('NFE já inutilizada !!!') RETURN NIL ENDIF WHILE( .T. ) SETCURSOR(1) RESTSCREEN( ,,,,cTela ) JANELA( 05,10,10,70,"Inutilizacao de NFE") cMOTIVO := "NUMERO DE NOTA FISCAL NAO UTILIZADO " @ 07,12 SAY "MOTIVO:" GET cMOTIVO PICT "@!" VALID !EMPTY(cMOTIVO) READ IF ESC() EXIT ENDIF COMANFE( 'NFe.SetModeloDF(55)') COMANFE( 'NFe.SetVersaoDF(3.10)') //ENVIA COMANDO PARA CANCELAR A NFE E JA PEGA O RETORNO cRETORNO := COMANFE( 'NFE.InutilizarNFE','"'+TIRAPONTO(PERS->CGC)+'","'+ALLTRIM(cMOTIVO)+'",'+STR(YEAR(DATASIS),4)+','+'55,1,'+NF->NUMERO+','+NF->NUMERO ) nLINHAS := MLCOUNT( cRETORNO ) aLINHA := {} lAUTORIZA := .F. cNPROT := "" cDHRECBTO := "" cXMOTIVO := "" cCSTAT := "" cHORA := "" FOR X = 1 TO nLINHAS AADD( aLINHA, MEMOLINE(cRETORNO,79,X) ) DO CASE CASE AT("CStat",aLINHA[X])>0 // VERIFICA SE TEM UMA LINHA STATUS cCSTAT := SubStr(Alltrim(aLinha[X]),At("=",aLinha[X])+1,Len(aLinha[X])) // SE cCSTAT = 102 - AUTORIZADO AINUTILIZACAO DA NFE IF cCSTAT="102" lAUTORIZA := .T. ENDIF CASE AT("NProt",aLINHA[X])>0 cNPROT := SubStr(Alltrim(aLinha[X]),At("=",aLinha[X])+1,Len(aLinha[X])) CASE AT("DhRecbto",aLINHA[X])>0 cDHRECBTO := SubStr(Alltrim(aLinha[X]),10,10) cHORA := SUBSTR(ALLTRIM(aLINHA[X]),21,08) CASE AT("XMotivo",aLINHA[X])>0 cXMOTIVO := SubStr(Alltrim(aLinha[X]),At("=",aLinha[X])+1,Len(aLinha[X])) OTHERWISE IF AT("inutilizada",aLINHA[X])>0 cCSTAT := "102" ENDIF ENDCASE NEXT IF cCSTAT = "102" IF ALERT('Entra com as mercadorias no Estoque?',{'SIM','NAO'})=1 WHILE(.T.) IF RLOCK() _FIELD->NF->CSTAT := cCSTAT _FIELD->NF->NPROTCANC := cNPROT _FIELD->NF->DATACANC := CTOD(LEFT( cDHRECBTO,10) ) _FIELD->NF->HORACANC := cHORA UNLOCK EXIT ENDIF ENDDO // VERIFICA PARA DAR BAIXA NOS PRODUTOS DbSelectArea('NAT') DbSetOrder(1) DbGoTop() cMOVEST := 'S' IF DbSeek( NF->FOP ) cMOVEST := NAT->MOVEST ENDIF DbSelectArea('INF') DbSetOrder(1) DbGoTop() INF->(OrdScope( 0, NF->NUMERO )) INF->(OrdScope( 0, NF->NUMERO )) DbGoTop() nITEMS := 0 WHILE !EOF() nITEMS++ DbSkip() ENDDO IF nITEMS > 0 // TEM ITENS WHILE !EOF() WHILE (.T.) IF RLOCK() _FIELD->INF->CANCELADA := "S" DbUnlock() EXIT ENDIF ENDDO IF cMOVEST='S' // SELECIONA ARQUIVO DE PRODUTOS E DA BAIXA NO ESTOQUE DBSelectArea('PRO') DBSetOrder(1) DBGoTop() IF DBSeek( INF->CODPRO_ ) WHILE(.T.) MOSTRA('Devolvendo itens para o Estoque...') IF RLOCK() _FIELD->PRO->ESTOQUE_ := PRO->ESTOQUE_ + INF->QTDE DBUnlock() EXIT ENDIF ENDDO ENDIF // SELECIONA O ARQUIVO DE FICHA KARDEX E SALVA LANCAMENTOS DBSelectArea('HIST') WHILE(.T.) IF ADDREC() _FIELD->HIST->CODPRO_ := INF->CODPRO _FIELD->HIST->CODFUN_ := '' _FIELD->HIST->CODCLI_ := INF->CODIGO _FIELD->HIST->NOMCLI_ := 'NFE INUTILIZADA' _FIELD->HIST->QTDE_ := INF->QTDE _FIELD->HIST->DATA_ := DATASIS _FIELD->HIST->NUMVEN_ := NF->NUMERO _FIELD->HIST->LANCA_ := 'C' _FIELD->HIST->HORA_ := TIME() _FIELD->HIST->DOCUME_ := 'NF '+NF->NUMERO DBUnlock() EXIT ENDIF ENDDO ENDIF DbSelectArea('INF') DbSkip() ENDDO ENDIF INF->(OrdScope( 0, )) INF->(OrdScope( 0, )) DbSelectArea('NF') ENDIF ALERT("NOTA FISCAL INUTILIZADA COM SUCESSO...") ELSE ALERT("NOTA FISCAL NAO FOI INUTILIZADA...") ENDIF EXIT ENDDO RESTSCREEN( 0,0,24,79, cTELA ) SELE NF DBGOTO( nRECNO ) ESTABL() RETURN NIL ************************************************************************ FUNCTION IMPNFE() // IMPRIMIR DANFE DE NFE LOCAL cTela := SAVESCREEN(00,00,24,79) LOCAL GetList := {} LOCAL nRECNO := RECNO() IF !EMPTY(NF->DATAENVIO) cANOMES := ANOMES( NF->DATAENVIO) cXML := cDIRNFE+"\NFE\"+cANOMES+"\NFE\"+NF->XML+".XML" ELSE cXML := cDIRNFE+"\RETORNO\"+NF->XML+".XML" ENDIF IMPRIMIRDANFE( cXML ) RESTSCREEN( 0,0,24,79, cTELA ) DBGOTO( nRECNO ) ESTABL() RETURN NIL ************************************************************************ FUNCTION GERAPDF() // IMPRIMIR DANFE DE NFE LOCAL cTela := SAVESCREEN(00,00,24,79) LOCAL GetList := {} LOCAL nRECNO := RECNO() IF !EMPTY(NF->DATAENVIO) cANOMES := ANOMES( NF->DATAENVIO) cXML := cDIRNFE+"\NFE\"+cANOMES+"\NFE\"+NF->XML+".XML" ELSE cXML := cDIRNFE+"\RETORNO\"+NF->XML+".XML" ENDIF cRETORNO := COMANFE2( "NFE.ImprimirDANFEPDF", ["]+cXML+["] ) cPDF := cDIRNFE+"\PDF\"+NF->XML+".PDF" IF( HB_FileExists( cPDF ) ) IF ALERT( 'PDF Gerado em '+HB_EOL()+ cPDF + HB_EOL() + 'Deseja visualizar o PDF ?',asimnao)=1 HB_RUN( 'START /MAX ' + cPDF ) ENDIF ELSE Alert( cRETORNO ) ENDIF RESTSCREEN( 0,0,24,79, cTELA ) DBGOTO( nRECNO ) ESTABL() RETURN NIL ************************************************************************ Function RETIRACH(vString,CHARACTER) vString:=STRTRAN(vString,CHARACTER,"") Return vString ************************************************************************ Function TiraPonto(vString) vString:=vString vString:=STRTRAN(vString,".","") vString:=STRTRAN(vString,"-","") vString:=STRTRAN(vString,"/","") vString:=STRTRAN(vString,"(","") vString:=STRTRAN(vString,")","") vString:=STRTRAN(vString,"x","") vString:=STRTRAN(vString,","," ") vString:=TIRAVIRG(vSTRING) Return vString ************************************************************************ Function TiraVirg(vString) vString:=vString vString:=STRTRAN(vString,",",".") vString:=STRTRAN(vString,"("," ") vString:=STRTRAN(vString,")"," ") Return vString ************************************************************************* Function TIRACENTO(vString) vString:=vString vString:=STRTRAN(vString,"Á","A") vString:=STRTRAN(vString,"É","E") vString:=STRTRAN(vString,"Í","I") vString:=STRTRAN(vString,"Ó","O") vString:=STRTRAN(vString,"Ú","U") vString:=STRTRAN(vString,"Ç","C") vString:=STRTRAN(vString,"À","A") vString:=STRTRAN(vString,"Ç","C") vString:=STRTRAN(vString,"Ã","A") vString:=STRTRAN(vString,"Â","A") vString:=STRTRAN(vString,"Ê","E") vString:=STRTRAN(vString,"Ô","O") vString:=STRTRAN(vString,"Û","U") vString:=STRTRAN(vString,"Õ","O") Return vString ****************************************** FUNCTION APAGAARQ() LOCAL RETORNO := .F. // APAGANDO ENTRADA E SAIDA MOSTRA("LIMPANDO ARQUIVOS DE RETORNO!!!") WHILE(.T.) IF FILE(cDIRNFE+"\ENTNFE.TXT") .OR. FILE(cDIRNFE+"\SAINFE.TXT") FERASE( cDIRNFE+"\ENTNFE.TXT" ) FERASE( cDIRNFE+"\SAINFE.TXT" ) LOOP ELSE RETORNO := .T. EXIT ENDIF ENDDO RETURN(RETORNO) ***************************************** FUNCTION NUMERONFE() SELE NF DBSETORDER(2) DBGOBOTTOM() cNUMERO := STRZERO( VAL(NF->NUMERO)+1,6 ) RETURN(cNUMERO)