#INCLUDE "PROTHEUS.CH"
#INCLUDE "TBICONN.CH"
USERUser Function MyNFS2NFSMyPVLNFS()
Local aCabsaPvlDocS := {}
Local aItens nPrcVen := {}
Local aStruSF2 := {}
Local aStruSD2 := {}
Local nX := 1
Local aDocOri := {}
Local bFiscalSF2:= {|| .T.}
Local bFiscalSD2:= {|| .T.}
Local cNF 0
Local cC5Num := "pcpAO9"
Local cSerie := "001"
Local cEmbExp := ""
Local cDoc := ""
Local cDoc PREPARE ENVIRONMENT :=EMPRESA "T1"
Local cSerieFILIAL "D MG 01 := "A MODULO "
LocalFAT" 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] == "NTABLES "SF2","SD2","SA1","SA2","SB1","SB2","SF4","SED","SE1"
SC5->(DbSetOrder(1))
SC5->(MsSeek(xFilial("SC5")+cC5Num))
SC6->(dbSetOrder(1))
SC6->(MsSeek(xFilial("SC6")+SC5->C5_NUM))
//É necessário carregar o grupo de perguntas MT460A, se não será executado com os valores default.
Pergunte("MT460A",.F.)
// Obter os dados de cada item do pedido de vendas liberado para gerar o Documento de Saída
While SC6->(!Eof() .And. C6_FILIAL == xFilial("SC6")) .And. SC6->C6_NUM == SC5->C5_NUM
SC9->(DbSetOrder(1))
SC9->(MsSeek(xFilial("SC9")+SC6->(C6_NUM+C6_ITEM))) //FILIAL+NUMERO+ITEM
SE4->(DbSetOrder(1))
SE4->(MsSeek(xFilial("SE4")+SC5->C5_CONDPAG) ) //FILIAL+CONDICAO PAGTO
SB1->(DbSetOrder(1))
SB1->(MsSeek(xFilial("SB1")+SC6->C6_PRODUTO)) //FILIAL+PRODUTO
SB2->(DbSetOrder(1))
SB2->(MsSeek(xFilial("SB2")+SC6->(C6_PRODUTO+C6_LOCAL))) //FILIAL+PRODUTO+LOCAL
SF4->(DbSetOrder(1))
SF4->(MsSeek(xFilial("SF4")+SC6->C6_TES)) //FILIAL+TES
nPrcVen := SC9->C9_PRCVEN
If ( SC5->C5_MOEDA <> 1 )
nPrcVen := xMoeda(nPrcVen,SC5->C5_MOEDA,1,dDataBase)
EndIf
If AllTrim(SC9->C9_BLEST) == "" .And. AllTrim(SC9->C9_BLCRED) == ""
Aadd AAdd(aCabsaPvlDocS,0)
{ SC9->C9_PEDIDO,;
ElseIf aStruSF2[nX][2] == "D"
Aadd(aCabs,CtoD(" / / "))
SC9->C9_ITEM,;
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"
SC9->C9_SEQUEN,;
SC9->C9_QTDLIB,;
nPrcVen,;
SC9->C9_PRODUTO,;
.F.,;
SC9->(RecNo()),;
SC5->(RecNo()),;
aAdd(aItens[nPos],"")
SC6->(RecNo()),;
ElseIf aStruSD2[nX][2]=="D"
aAdd(aItens[nPos],CToD(""))
SE4->(RecNo()),;
ElseIf aStruSD2[nX][2]=="N"
aAdd(aItens[nPos],0)
ElseIf aStruSD2[nX][2]=="L"
SB1->(RecNo()),;
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: SB2->(RecNo()),;
SF4->(RecNo())})
EndIf
SC6->(DbSkip())
EndDo
SetFunName("MATA461")
cDoc := MaPvlNfs( /*aPvlNfs*/ aPvlDocS,; // 01 - Array com os itens a serem gerados
/*cSerieNFS*/ cSerie,; // 02 - Serie da Nota Fiscal
/*lMostraCtb*/ .F.,; // 03 - Mostra Lançamento Contábil
/*lAglutCtb*/ .F.,; // 04 - Aglutina Lançamento Contábil
/*lCtbOnLine*/ .F.,; // 05 - Contabiliza On-Line
/*lCtbCusto*/ .T.,; // 06 - Contabiliza Custo On-Line
/*lReajuste*/ .F.,; // 07 - Reajuste de preço na Nota Fiscal
/*nCalAcrs*/ 0,; // 08 - Tipo de Acréscimo Financeiro
/*nArredPrcLis*/ 0,; ³
//³ExpC1: Serie09 do- DocumentoTipo de OrigemArredondamento
³
//³ExpC2: Numero do Documento de Origem /*lAtuSA7*/ .T.,; // 10 - Atualiza Amarração Cliente x Produto
³
//³ExpC3: Cliente/Fornecedor do documento do origem /*lECF*/ ³
//³ExpC4: Loja do Documento de origem .F.,; // 11 - Cupom Fiscal
³
//³ExpC5: Serie do Documento a ser gerado /*cEmbExp*/ cEmbExp,; ³
//³ExpL6: Mostra12 Lct.Contabil- Número do Embarque de Exportação
(OPC) ³
/*bAtuFin*/³ExpL7: Aglutina Lct.Contabil {||},; // 13 - Bloco de Código para complemento de atualização dos títulos financeiros
(OPC) ³
//³ExpL8: Contabiliza On-Line /*bAtuPGerNF*/ {||},; (OPC) ³
//³ExpL9: Contabiliza14 Custo On-Line Bloco de Código para complemento de atualização dos dados após a geração da Nota Fiscal
(OPC) ³
//³ExpLA: Reajuste de preco na nota fiscal /*bAtuPvl*/ (OPC) ³
//³ExpNB: Tipo de Acrescimo Financeiro (OPC) ³
//³ExpNC: Tipo de Arredondamento {||},; // 15 - Bloco de Código de atualização do Pedido de Venda antes da geração da Nota Fiscal
/*bFatSE1*/ (OPC) ³
//³ExpLD: Atualiza Amarracao Cliente x Produto (OPC) ³
//³ExplE: Cupom Fiscal {|| .T. },; // 16 - Bloco de Código para indicar se o valor do Titulo a Receber será gravado no campo F2_VALFAT quando o parâmetro MV_TMSMFAT estiver com o valor igual a "2".
(OPC) ³
//³ExpBF: CodeBlock de Selecao do SD2 (OPC) ³
//³/*dDataMoe*/ dDatabase,; // 17 - Data da cotação para conversão dos valores da Moeda do Pedido de Venda para a Moeda Forte
Parametros do codeblock /*lJunta*/ .F.) ³
//³ 18 - Aglutina Pedido Iguais
ExpC1: Alias do
arquivo SD2 If !Empty(cDoc)
Conout("Documento de Saída: " + cSerie + "-" + cDoc + ", gerado ³
//³com sucesso!!!")
EndIf
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. |