Árvore de páginas

01. DADOS GERAIS

Produto:

TOTVS Backoffice

Linha de Produto:

Linha Protheus

Segmento:

Backoffice

Módulo:SIGAFAT - Faturamento
Função:MANFS2NFS - Geração de Documento Fiscal de Saída
Abrangências:Microsiga Protheus 12
Versões:Microsiga Protheus 12
Compatível Países:Todos
Sistemas Operacionais:Todos
Compatível com as Bases de Dados:Todos
Nível de Acesso:Nível 1 (Acesso Clientes)
Idiomas:Todos


02. DESCRIÇÃO

Função utilizada para a geração do Documento Fiscal de Saída a partir de um Documento Fiscal de Origem.

03. SINTAXE

MaNfs2Nfs( cSerOri, cNumORI, cClieFor, cLoja, cSerieNFS, lMostraCtb, lAglutCtb, lCtbOnLine, lCtbCusto, lReajusta, nCalAcrs, nArredPrcLis, lAtuSA7, lECF, bFilSD2, bSD2, bSF2, bTTS, aDocOri, aItemOri, aSF2, lNoFiscal, bFiscalSF2, bFiscalSD2, bFatSE1, cNumNFS )

04. PARÂMETROS

NomeTipoDescriçãoDefaultObrigatórioReferência
cSerOriCaractereSérie do Documento de Origem
Não
cNumORICaractereNúmero do Documento de Origem
Não
cClieForCaractereCliente/Fornecedor do Documento de Origem 
Não
cLojaCaractereLoja do Cliente/Fornecedor do Documento de Origem{}Não
cSerieNFSCaractereSérie do Documento a ser gerado
Sim
lMostraCtbLógicoMostra Lançamento Contábil.F.Não
lAglutCtbLógicoAglutina Lançamento Contábil.F.Não
lCtbOnLineLógicoContabiliza On-Line.F.Não
lCtbCustoLógicoContabiliza Custo On-Line.F.Não
lReajustaLógicoReajuste de Preço na Nota Fiscal.F.Não
nCalAcrsNuméricoTipo de Acréscimo Financeiro1Não
nArredPrcLisNuméricoTipo de Arredondamento1Não
lAtuSA7LógicoAtualiza Amarração de Cliente x Produto.F.Não
lECFLógicoCupom Fiscal.F.Não
bFilSD2Bloco de Código

Bloco de Código de Seleção do SD2

{|| .T. }Não
bSD2Bloco de CódigoBloco de Código a ser executado para o SD2{|| .T. }Não
bSF2Bloco de CódigoBloco de Código a ser executado para o SF2{|| .T. }Não
bTTSBloco de CódigoBloco de Código a ser executado no final da transação{|| .T. }Não
aDocOriArray de registrosArray com os recnos do SF2{}Não
aItemOriArray de registrosArray com os Itens do SD2{}Não
aSF2Array de registrosArray com os dados do SF2{}Não
lNoFiscalLógicoDesabilita o Cálculo Fiscal, pois as informações já foram passadas nos campos da SF2 e SD2.F.Não
bFiscalSF2Bloco de CódigoBloco de Código para tratamento do Fiscal - SF2NilNão
bFiscalSD2Bloco de CódigoBloco de Código para tratamento do Fiscal - SD2NilNão
bFatSE1Bloco de CódigoBloco de Código para tratamento do Fiscal - SE1{|| .T. }Não
cNumNFSCaractereNúmero do Documento Fiscal""Não

05. RETORNO

cNF - Tipo: Caractere - Número do Documento de Saída

06. EXEMPLO 1

#INCLUDE "PROTHEUS.CH"
#INCLUDE "TBICONN.CH"

USER Function MyNFS2NFS()

Local aCabs 	:=	{}	
Local aItens	:=	{}	
Local aStruSF2 	:= 	{}	
Local aStruSD2 	:= 	{}	
Local nX		:=	1	
Local aDocOri	:=	{}
Local bFiscalSF2:= {|| .T.}
Local bFiscalSD2:= {|| .T.}
Local cNF       := ""	
Local cDoc 	   	:= ""
Local cSerie    := "A  "
Local cTipoNF   := "N"
Local cCliente  := "000001"
Local cLoja     := "01"
Local cProd     := "IPI1"
Local cTES      := "802"
Local cCondPgto := "001"

PRIVATE lMsErroAuto := .F.	

PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "FAT" TABLES "SF2","SD2","SA1","SA2","SB1","SB2","SF4","SED","SE1"

aStruSF2 	:= 	SF2->(dbStruct())		

//Montagem do cabeçalho do Documento Fiscal	
nF2FILIAL 	:= Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_FILIAL"})	
nF2TIPO 	:= Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_TIPO"})	
nF2DOC 		:= Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_DOC"})	
nF2SERIE 	:= Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_SERIE"})	
nF2EMISSAO 	:= Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_EMISSAO"})	
nF2CLIENTE 	:= Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_CLIENTE"})
nF2LOJA 	:= Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_LOJA"})
nF2CLIENT   := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_CLIENT"})
nF2LOJENT 	:= Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_LOJENT"})
nF2TIPOCLI  := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_TIPOCLI"})
nF2COND 	:= Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_COND"})	
nF2DTDIGIT 	:= Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_DTDIGIT"})	
nF2EST 		:= Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_EST"})
nF2UFORIG   := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_UFORIG"})
nF2UFDEST   := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_UFDEST"})	
nF2VALMERC 	:= Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_VALMERC"})

For nX := 1 To Len(aStruSF2)
    If aStruSF2[nX][2] $ "C/M"
        Aadd(aCabs,"")
    ElseIf aStruSF2[nX][2] == "N"
        Aadd(aCabs,0)
    ElseIf aStruSF2[nX][2] == "D"
        Aadd(aCabs,CtoD("  /  /  "))
    ElseIf aStruSF2[nX][2] == "L"
        Aadd(aCabs,.F.)
    EndIf
Next nX

dbSelectArea("SA1")
dbSetOrder(1)
dbSeek(xFilial("SA1") + cCliente + cLoja)

aCabs[nF2FILIAL]	:= xFilial("SF2")
aCabs[nF2TIPO]		:= cTipoNF
aCabs[nF2DOC]		:= cDoc
aCabs[nF2SERIE]		:= cSerie
aCabs[nF2EMISSAO]	:= dDataBase
aCabs[nF2CLIENTE]	:= SA1->A1_COD
aCabs[nF2LOJA]		:= SA1->A1_LOJA
aCabs[nF2CLIENT]	:= SA1->A1_COD
aCabs[nF2LOJENT]	:= SA1->A1_LOJA
aCabs[nF2TIPOCLI]   := SA1->A1_TIPO
aCabs[nF2COND]		:= cCondPgto
aCabs[nF2DTDIGIT]	:= dDataBase
aCabs[nF2EST]		:= SA1->A1_EST
aCabs[nF2UFORIG]	:= SA1->A1_EST
aCabs[nF2UFDEST]	:= SA1->A1_EST
aCabs[nF2VALMERC]	:= 1000

aStruSD2 	:= 	SD2->(dbStruct())

//Montagem dos itens do Documento Fiscal
nD2FILIAL 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_FILIAL"})
nD2DOC 		:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_DOC"})
nD2SERIE 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_SERIE"})
nD2CLIENTE 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_CLIENTE"})
nD2LOJA 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_LOJA"})
nD2EMISSAO 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_EMISSAO"})
nD2TIPO 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_TIPO"})
nD2ITEM 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_ITEM"})
nD2CF 		:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_CF"})
nD2COD 		:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_COD"})
nD2UM 		:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_UM"})
nD2QUANT 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_QUANT"})
nD2PRCVEN 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_PRCVEN"})
nD2PRUNIT 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_PRUNIT"})
nD2TOTAL 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_TOTAL"})
nD2LOCAL 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_LOCAL"})
nD2TES	 	:= Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_TES"})

aAdd(aItens, {})
nPos := Len(aItens)

For nX := 1 To Len(aStruSD2)
    If	aStruSD2[nX][2]$"C/M"
        aAdd(aItens[nPos],"")
    ElseIf aStruSD2[nX][2]=="D"
        aAdd(aItens[nPos],CToD(""))
    ElseIf aStruSD2[nX][2]=="N"
        aAdd(aItens[nPos],0)
    ElseIf aStruSD2[nX][2]=="L"
        aAdd(aItens[nPos],.T.)
    EndIf
Next nX

For nX := 1 to Len(aItens)
    AADD(aDocOri,0)
Next

dbSelectArea("SF4")
dbSetOrder(1)
dbSeek(xFilial("SF4") + cTES)

dbSelectArea("SB1")
dbSetOrder(1)
dbSeek(xFilial("SB1") + cProd)

aItens[Len(aItens),nD2FILIAL]	:=	xFilial("SD2")
aItens[Len(aItens),nD2DOC]		:=	cDoc
aItens[Len(aItens),nD2SERIE]	:=	cSerie
aItens[Len(aItens),nD2CLIENTE]	:=	SA1->A1_COD
aItens[Len(aItens),nD2LOJA]		:=	SA1->A1_LOJA
aItens[Len(aItens),nD2EMISSAO]	:=	dDataBase
aItens[Len(aItens),nD2TIPO]		:=	cTipoNF
aItens[Len(aItens),nD2ITEM]		:=	"01"
aItens[Len(aItens),nD2CF]		:=	SF4->F4_CF
aItens[Len(aItens),nD2COD]		:=	SB1->B1_COD
aItens[Len(aItens),nD2UM]		:=	SB1->B1_UM
aItens[Len(aItens),nD2QUANT]	:=	1
aItens[Len(aItens),nD2PRCVEN]	:=	1000
aItens[Len(aItens),nD2TOTAL]	:=	1000
aItens[Len(aItens),nD2PRUNIT]   :=  1000
aItens[Len(aItens),nD2LOCAL]	:=	SB1->B1_LOCPAD
aItens[Len(aItens),nD2TES]		:=	SF4->F4_CODIGO

//ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿	
//³Parametros da funcao automatica:                             ³
//³ExpC1: Serie do Documento de Origem                          ³
//³ExpC2: Numero do Documento de Origem                         ³
//³ExpC3: Cliente/Fornecedor do documento do origem             ³
//³ExpC4: Loja do Documento de origem                           ³
//³ExpC5: Serie do Documento a ser gerado                       ³
//³ExpL6: Mostra Lct.Contabil                             (OPC) ³
//³ExpL7: Aglutina Lct.Contabil                           (OPC) ³
//³ExpL8: Contabiliza On-Line                             (OPC) ³
//³ExpL9: Contabiliza Custo On-Line                       (OPC) ³
//³ExpLA: Reajuste de preco na nota fiscal                (OPC) ³
//³ExpNB: Tipo de Acrescimo Financeiro                    (OPC) ³
//³ExpNC: Tipo de Arredondamento                          (OPC) ³
//³ExpLD: Atualiza Amarracao Cliente x Produto            (OPC) ³
//³ExplE: Cupom Fiscal                                    (OPC) ³
//³ExpBF: CodeBlock de Selecao do SD2                     (OPC) ³
//³       Parametros do codeblock                               ³
//³       ExpC1: Alias do arquivo SD2                           ³
//³       ExpC2: Alias do arquivo SF4                           ³
//³ExpBG: CodeBlock a ser executado para o SD2            (OPC) ³
//³       Parametros do codeblock                               ³
//³       ExpN1:[1] Apos a copia do item do documento de saida  ³
//³             [2] Apos a checagem da atualizacoes anteriores  ³
//³       ExpA2:Array com o conteudo dos campos do SD2          ³
//³       ExpC3:Alias do SD2                              (OPC) ³
//³       ExpC4:Alias do SF4                              (OPC) ³
//³       ExpC5:Alias do SB1                              (OPC) ³
//³ExpBH: CodeBlock a ser executado para o SF2            (OPC) ³
//³       ExpN1:[1] Apos a copia do item do documento de saida  ³
//³             [2] Apos a checagem da atualizacoes anteriores  ³
//³ExpBI: CodeBlock a ser executado no final da transacao (OPC) ³
//³ExpAJ: Array com os Recnos do SF2                      (OPC) ³
//³       Deve possuir o mesmo tamanho da ExpAl           (OPC) ³
//³ExpAL: Array com os itens do SD2                       (OPC) ³
//³       [1] Item do SD2                                 (OPC) ³
//³       [2] Conteudo dos campos na ordem da estrutura   (OPC) ³
//³ExpAM: Array com os dados do SF2                       (OPC) ³
//³       [n] Conteudo posicional do campo                    ) ³
//³       Somente é necessario se não houver um documento de    ³
//³       origem.                                               ³
//³ExpAN: Calculo Fiscal                                  (OPC) ³
//³       Desabilita o calculo fiscal pois as informacoes ja    ³
//³       foram passadas nos campos do SD2 e SF2.               ³
//³ExpAO: Codigo do cliente de Entrega para calculo dos impostos³
//³ExpAP: Codigo da loja de Entrega para calculo dos impostos   ³
//ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
cNF := MaNfs2Nfs(/*cSerOri*/        "",;        //Serie do Documento de Origem
    			/*cNumORI*/         "",;        //Numero do Documento de Origem
                /*cClieFor*/        "",;        //Cliente/Fornecedor do documento do origem
                /*cLoja*/           "",;        //Loja do Documento de origem
                /*cSerieNFS*/       cSerie,;    //Serie do Documento a ser gerado
                /*lMostraCtb*/      NIL,;       //Mostra Lct.Contabil (OPC)
                /*lAglutCtb*/       NIL,;       //Aglutina Lct.Contabil (OPC)
                /*lCtbOnLine*/      NIL,;       //Contabiliza On-Line (OPC)
                /*lCtbCusto*/       NIL,;       //Contabiliza Custo On-Line (OPC)
                /*lReajusta*/       NIL,;       //Reajuste de preco na nota fiscal (OPC)
                /*nCalAcrs*/        NIL,;       //Tipo de Acrescimo Financeiro (OPC)
                /*nArredPrcLis*/    NIL,;       //Tipo de Arredondamento (OPC)
                /*lAtuSA7*/         NIL,;       //Atualiza Amarracao Cliente x Produto (OPC)
                /*lECF*/            NIL,;       //Cupom Fiscal (OPC)
                /*bFilSD2*/         NIL,;       //CodeBlock de Selecao do SD2 (OPC)
                /*bSD2*/            NIL,;       //CodeBlock a ser executado para o SD2 (OPC)
                /*bSF2*/            NIL,;       //CodeBlock a ser executado para o SF2 (OPC)
                /*bTTS*/            NIL,;       //CodeBlock a ser executado no final da transacao (OPC)
                /*aDocOri*/         aDocOri,;   //Array com os Recnos do SF2 (OPC)
                /*aItemOri*/        aItens,;    //Array com os itens do SD2 (OPC)
                /*aSF2*/            aCabs,;     //Array com os dados do SF2 (OPC)
                /*lNoFiscal*/       .F.,;       //Calculo Fiscal - Desabilita o calculo fiscal pois as informacoes ja foram passadas nos campos do SD2 e SF2 (OPC)
                /*bFiscalSF2*/      bFiscalSF2,;//CodeBlock para tratamento do fiscal - SF2 (OPC)
                /*bFiscalSD2*/      bFiscalSD2,;//CodeBlock para tratamento do fiscal - SD2 (OPC)
                /*bFatSE1*/         NIL,;       //CodeBlock para tratamento do fiscal - SE1 (OPC)
                /*cNumNFS*/         cDoc)       //Numero do documento fiscal (OPC)

If !Empty(cNF)
    Conout("Nota Fiscal: " + cNF + ", gerada com sucesso!!!")
EndIf

RESET ENVIRONMENT

Return .T.

07. EXEMPLO 2 

//Informando TES com poder de terceiro//

#INCLUDE "PROTHEUS.CH"
#INCLUDE "TBICONN.CH"

USER Function MyNFS2NFS()

    Local aCabs     := {}
    Local aItens    := {}
    Local aStruSF2  := {}
    Local aStruSD2  := {}
    Local aDocOri   := {}
    Local nItemNF   := 1
    Local nX        := 1
    Local bFiscalSF2:= {|| .T.}
    Local bFiscalSD2:= {|| .T.}
    Local cNF       := "" 
    Local cDoc      := "" 
    Local cSerie    := "1  "
    Local cTipoNf   := "B "
    Local nTotNF    := 9100
    Local cForn     := "0001  " 
    Local cLoja     := "01" 
    Local cCondPg   := "000"
    Local cTes      := "502"
    Local cDocD     := "FAT007"
    Local cDocAt    := "FAT009"
    Local cFiltro   := ""

    //-- Variáveis utilizadas para o controle de erro da rotina automática
    Private lMsErroAuto     := .F.
    Private lAutoErrNoFile  := .T.

    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "FAT" TABLES "SF2","SD2","SA2","SA2","SB1","SB2","SF4","SED","SE1"

    DbSelectArea('SA2')
    SA2->(DbSetOrder(1))
    IF !SA2->(DbSeek(xFilial("SA2") + cForn + cLoja  ))
        MsgInfo("SA2 NAO ENCONTRADO")
    ENDIF
    //MONTAGEM DA ESTRUTURA DO ARRAY CABECALHO
    aStruSF2    :=  SF2->(dbStruct())

    //Montagem do cabeçalho do Documento Fiscal 
    nF2FILIAL   := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_FILIAL"})
    nF2TIPO     := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_TIPO"})
    nF2DOC      := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_DOC"})
    nF2SERIE    := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_SERIE"})
    nF2EMISSAO  := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_EMISSAO"})
    nF2CLIENTE  := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_CLIENTE"})
    nF2LOJA     := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_LOJA"})
    nF2CLIENT   := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_CLIENT"})
    nF2LOJENT   := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_LOJENT"})
    nF2TIPOCLI  := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_TIPOCLI"})
    nF2COND     := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_COND"})
    nF2DTDIGIT  := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_DTDIGIT"})
    nF2EST      := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_EST"})
    nF2UFORIG   := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_UFORIG"})
    nF2UFDEST   := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_UFDEST"})
    nF2VALMERC  := Ascan(aStruSF2,{|x| AllTrim(x[1]) == "F2_VALMERC"})
    
    For nX := 1 To Len(aStruSF2)
        If aStruSF2[nX][2] $ "C/M"
            Aadd(aCabs,"")
        ElseIf aStruSF2[nX][2] == "N"
            Aadd(aCabs,0)
        ElseIf aStruSF2[nX][2] == "D"
            Aadd(aCabs,CtoD("  /  /  "))
        ElseIf aStruSF2[nX][2] == "L"
            Aadd(aCabs,.F.)
        EndIf
    Next nX

    aCabs[nF2FILIAL]    := xFilial("SF2")
    aCabs[nF2TIPO]      := cTipoNf
    aCabs[nF2DOC]       := cDoc
    aCabs[nF2SERIE]     := cSerie
    aCabs[nF2EMISSAO]   := DATE()
    aCabs[nF2CLIENTE]   := SA2->A2_COD
    aCabs[nF2LOJA]      := SA2->A2_LOJA
    aCabs[nF2CLIENT]    := SA2->A2_COD
    aCabs[nF2LOJENT]    := SA2->A2_LOJA
    aCabs[nF2TIPOCLI]   := SA2->A2_TIPO
    aCabs[nF2COND]      := cCondPg
    aCabs[nF2DTDIGIT]   := DATE()
    aCabs[nF2EST]       := "SP"
    aCabs[nF2UFORIG]    := "SP"
    aCabs[nF2UFDEST]    := "SP"
    aCabs[nF2VALMERC]   := nTotNF

    //MONTAGEM DA ESTRUTURA DO ARRAY DOS ITENS  
    aStruSD2    :=  SD2->(dbStruct())
    nD2FILIAL   := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_FILIAL"})
    nD2DOC      := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_DOC"})
    nD2SERIE    := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_SERIE"})
    nD2CLIENTE  := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_CLIENTE"})
    nD2LOJA     := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_LOJA"})
    nD2EMISSAO  := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_EMISSAO"})
    nD2TIPO     := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_TIPO"})
    nD2ITEM     := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_ITEM"})
    nD2CF       := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_CF"})
    nD2COD      := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_COD"})
    nD2UM       := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_UM"})
    nD2QUANT    := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_QUANT"})
    nD2PRCVEN   := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_PRCVEN"})
    nD2PRUNIT   := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_PRUNIT"})
    nD2TOTAL    := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_TOTAL"})
    nD2LOCAL    := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_LOCAL"})
    nD2TES      := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_TES"})
    //ADD INFORMACOES ORIGEM
    nD2Pedido   := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_PEDIDO"})
    nD2NfOri    := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_NFORI"})
    nD2SeOri    := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_SERIORI"})
    nD2ItOri    := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_ITEMORI"})
    nD2IdB6     := Ascan(aStruSD2,{|x| AllTrim(x[1]) == "D2_IDENTB6"})
        
   
    SD1->(DbgoTop())
    SD1->(DbSetOrder(4))
    cFiltro :=  "SD1->D1_FILIAL         == '" +xFilial("SD1")+ "'"   
    cFiltro+="  .And. SD1->D1_DOC  >= '"+cDocD+"'"
    cFiltro+="  .And. SD1->D1_DOC  <= '"+cDocAt+"'"

    SD1->(DbSetFilter({|| &cFiltro}, cFiltro))
    SD1->(DbGotop())
    
    
    While (!SD1->(EOF()))

        aAdd(aItens, {})
        For nX := 1 To Len(aStruSD2)
            If  aStruSD2[nX][2]$"C/M"
                aAdd(aItens[nItemNF],"")
            ElseIf aStruSD2[nX][2]=="D"
                aAdd(aItens[nItemNF],CToD(""))
            ElseIf aStruSD2[nX][2]=="N"
                aAdd(aItens[nItemNF],0)
            ElseIf aStruSD2[nX][2]=="L"
                aAdd(aItens[nItemNF],.T.)
            EndIf
        Next nX

        AADD(aDocOri,0)
        
        aItens[nItemNF,nD2FILIAL]       :=  SD1->D1_FILIAL
        aItens[nItemNF,nD2DOC]          :=  cDoc
        aItens[nItemNF,nD2SERIE]        :=  cSerie
        aItens[nItemNF,nD2CLIENTE]      :=  SA2->A2_COD
        aItens[nItemNF,nD2LOJA]         :=  SA2->A2_LOJA
        aItens[nItemNF,nD2EMISSAO]      :=  DATE()
        aItens[nItemNF,nD2TIPO]         :=  cTipoNf
        aItens[nItemNF,nD2ITEM]         :=  PadR(STRZERO(nItemNF,3),GetSx3Cache("D2_SERIE","X3_TAMANHO"))
        aItens[nItemNF,nD2CF]           :=  SD1->D1_CF
        aItens[nItemNF,nD2COD]          :=  SD1->D1_COD
        aItens[nItemNF,nD2UM]           :=  SD1->D1_UM
        aItens[nItemNF,nD2QUANT]        :=  SD1->D1_QUANT
        aItens[nItemNF,nD2PRCVEN]       :=  SD1->D1_VUNIT
        aItens[nItemNF,nD2TOTAL]        :=  SD1->D1_TOTAL
        aItens[nItemNF,nD2PRUNIT]       :=  SD1->D1_VUNIT
        aItens[nItemNF,nD2LOCAL]        :=  SD1->D1_LOCAL
        aItens[nItemNF,nD2TES]          :=  cTes
        aItens[nItemNF,nD2Pedido]       :=  SD1->D1_PEDIDO
        //ADD INFORMACOES ORIGEM
        aItens[nItemNF,nD2NfOri]        :=  SD1->D1_DOC
        aItens[nItemNF,nD2SeOri]        :=  SD1->D1_SERIE
        aItens[nItemNF,nD2ItOri]        :=  SD1->D1_ITEM
        aItens[nItemNF,nD2IdB6]         :=  SD1->D1_IDENTB6
        SD1->(DbSkip())
        nItemNF++
    END 

    cNF := MaNfs2Nfs(/*cSerOri*/      ""  ,;        //Serie do Documento de Origem
                /*cNumORI*/         "",;        //Numero do Documento de Origem
                /*cClieFor*/        cForn,;        //Cliente/Fornecedor do documento do origem
                /*cLoja*/           cLoja,;        //Loja do Documento de origem
                /*cSerieNFS*/       cSerie,;    //Serie do Documento a ser gerado
                /*lMostraCtb*/      NIL,;       //Mostra Lct.Contabil (OPC)
                /*lAglutCtb*/       NIL,;       //Aglutina Lct.Contabil (OPC)
                /*lCtbOnLine*/      NIL,;       //Contabiliza On-Line (OPC)
                /*lCtbCusto*/       NIL,;       //Contabiliza Custo On-Line (OPC)
                /*lReajusta*/       NIL,;       //Reajuste de preco na nota fiscal (OPC)
                /*nCalAcrs*/        NIL,;       //Tipo de Acrescimo Financeiro (OPC)
                /*nArredPrcLis*/    NIL,;       //Tipo de Arredondamento (OPC)
                /*lAtuSA7*/         NIL,;       //Atualiza Amarracao Cliente x Produto (OPC)
                /*lECF*/            NIL,;       //Cupom Fiscal (OPC)
                /*bFilSD2*/         NIL,;       //CodeBlock de Selecao do SD2 (OPC)
                /*bSD2*/            NIL,;       //CodeBlock a ser executado para o SD2 (OPC)
                /*bSF2*/            NIL,;       //CodeBlock a ser executado para o SF2 (OPC)
                /*bTTS*/            NIL,;       //CodeBlock a ser executado no final da transacao (OPC)
                /*aDocOri*/         aDocOri,;   //Array com os Recnos do SF2 (OPC)
                /*aItemOri*/        aItens,;    //Array com os itens do SD2 (OPC)
                /*aSF2*/            aCabs,;     //Array com os dados do SF2 (OPC)
                /*lNoFiscal*/       .F.,;       //Calculo Fiscal - Desabilita o calculo fiscal pois as informacoes ja foram passadas nos campos do SD2 e SF2 (OPC)
                /*bFiscalSF2*/      bFiscalSF2,;//CodeBlock para tratamento do fiscal - SF2 (OPC)
                /*bFiscalSD2*/      bFiscalSD2,;//CodeBlock para tratamento do fiscal - SD2 (OPC)
                /*bFatSE1*/         NIL,;       //CodeBlock para tratamento do fiscal - SE1 (OPC)
                /*cNumNFS*/         cDoc)       //Numero do documento fiscal (OPC)

    If !Empty(cNF)
        Conout("Nota Fiscal: " + cNF + ", gerada com sucesso!!!")
    EndIf

    RESET ENVIRONMENT

Return .T.

08. DEMAIS INFORMAÇÕES

Não há.

09. ASSUNTOS RELACIONADOS