|
Bem Vindo, Visitante
|
Todos os Fórums
ADVPL
|
Imprimir
Enviar Para um Amigo Precisa estar Logado
|
|
|
Assunto: |
Troca de filial na MATA103 |
|
Versão: |
12.1.17 |
|
Plataforma: |
Microsoft |
Complemento: |
|
|
DB: |
SQL Server |
Complemento: |
|
|
|
|
|
Mensagem do
IGORDS
em 25/07/2019, 18:40 h
Local: SC Registro: 06/05/2016 Postagens: 12 |
Olá, pessoal!
Tenho uma rotina de importação de documento de entrada com o ExecAuto na MATA103.
Ocorre que, quando uma filial que compra, mas quem paga é a matriz, eu tenho que pegar os produtos para cadastrar da filial destinatária que fez a compra.
A regra, é quando o tomador é a matriz mas quem comprou foi alguma filial, o produto a ser cadastrado é da filial e não da matriz.
Alguém sabe me dizer como que faço pra trocar a filial somente dos itens?
Tentei usar o cFilAnt, fazendo backup da filial anterior, depois setar a filial que comprou e retornar a filial anterior.
Segue código:
Static Function GeraConhec(lLote)
Local aCabec := {}
Local aItens := {}
Local cEst := ""
Local cDoc := ""
Local cProdFrete := AllTrim(GetNewPar("MV_XGTFRTE", ""))
Local cTpCTEnt := AllTrim(GetNewPar("MV_XSNTPCT", "C"))
Local lConfAtu := .T. //lConfere
Local lSucess := .T.
Local nItem := 0
Local nPosAgt := AScan(aCab, {|x| x[1] == "MV_PAR17"})
Local nPosCod := 0
Local nPosCon := AScan(aCab, {|x| x[1] == "MV_PAR31"})
Local nPosEsp := AScan(aCab, {|x| x[1] == "F1_ESPECIE"})
Local nPosNat := AScan(aCab, {|x| x[1] == "Natureza"})
Local nPosTes := AScan(aCab, {|x| x[1] == "MV_PAR27"})
Local nTamItem := TamSX3("D1_ITEM")[1]
Local nTotPond := 0
Local nTotProd := 0
Local nVlConhe := 0
Local nVlPonde := 0
Local aSF8 := {}
Local nI
Local aIcms
Local cTpCte := "N"
//Local cDTpCTe := "N - Normal"
Local cDTpCTe := "N"
Local cforPag := ""
Local nPosVUnit := 4
Local nPosVTot := 5
Local cTransp := ""
Local cLojTran := ""
Local lAchouSF8 := .F.
//Filiais
Private cFilAtu := cFilAnt //Grava a Filial corrente
Private _aItemOri := {}
Private lAutoErrNoFile := .T.
Private lMsErroAuto := .F.
Private lMsHelpAuto := .F.
Private cXDForPag := "F-FOB"
Default lLote := .F.
//Pega CGC do Emitente e destinatário
If IsNodeCTe(oXml, "_InfCte:_emit:_CNPJ")
cCGCEmit := AllTrim(GetNodeCTe(oXml, "_InfCte:_emit:_CNPJ:Text"))
Else
cCGCEmit := AllTrim(GetNodeCTe(oXml, "_InfCte:_emit:_CPF:Text"))
EndIf
If !IsCteOS(oXml)
If IsNodeCTe(oXml, "_InfCte:_dest:_CNPJ")
cCGCDest := AllTrim(GetNodeCTe(oXml, "_InfCte:_dest:_CNPJ:Text"))
Else
cCGCDest := AllTrim(GetNodeCTe(oXml, "_InfCte:_dest:_CPF:Text"))
EndIf
EndIf
// TIPO DE CTE
If IsNodeCTe(oXml, "_infCte:_ide:_tpCTe")
cTpCte := GetNodeCTe(oXml, "_infCte:_ide:_tpCTe:Text")
Do Case
Case cTpCte == "0"
//cDTpCTe := "N - Normal"
cDTpCTe := "N"
Case cTpCte == "1"
//cDTpCTe := "C - Complemen.Valores"
cDTpCTe := "C"
Case cTpCte == "2"
//cDTpCTe := "A - Anula.Valores"
cDTpCTe := "A"
Case cTpCte == "3"
//cDTpCTe := "S - Substituto"
cDTpCTe := "S"
EndCase
EndIf
// SE É FOB OU CIF
/*If IsNodeCTe(oXml, "_infCte:_ide:_forPag")
cforPag := GetNodeCTe(oXml, "_infCte:_ide:_forPag:Text")
If cforPag == "0" //.Or. cforPag == "1" .Or. cforPag == "2"
cXDForPag := "C-CIF"
EndIf
EndIf*/
// SE FOR GERAÇÃO DE LOTE, NÃO ABRE TELA DE CONFERÊNCIA
If lLote
lConfAtu := GetNewPar("MV_XGTCOLT", .T.)
Else
//-- Valida existencia da TES a utilizar no CTe
If Empty(M->&(_cCmp1 + "_TES")) .Or. !SF4->( dbSeek(xFilial("SF4") + M->&(_cCmp1 + "_TES")) )
Aviso("Aviso", "Deve ser informado um TES válido.", {"Ok"}, 2)
Return .F.
EndIf
//-- Se TES gera dulp., valida existencia da cond. pgto a utilizar no CTe
If SF4->F4_DUPLIC == "S" .And. (Empty(M->&(_cCmp1 + "_CONDPG")) .Or. !SE4->( dbSeek(xFilial("SE4") + M->&(_cCmp1 + "_CONDPG")) ))
Aviso("Aviso", "O TES gera duplicata, portanto, deve-se informar uma condição de pagamento válida.", {"Ok"}, 2)
Return .F.
EndIf
If Empty(M->&(_cCmp1 + "_CONDPG")) .Or. !SED->( dbSeek(xFilial("SED") + M->&(_cCmp1 + "_NATFIN")) )
Aviso("Aviso", "Deve ser informada uma natureza fiscal válida.", {"Ok"}, 2)
Return .F.
EndIf
cTes := M->&(_cCmp1 + "_TES")
cCond := M->&(_cCmp1 + "_CONDPG")
cNatur := M->&(_cCmp1 + "_NATFIN")
EndIf
//lMsHelpAuto := .T.
lConfirm := .T.
If IsNodeCTe(oXml, "_infCte:_ide:_UFIni") .And. !(cFilAnt $ GetNewPar("MV_ZGOFESC", ""))
cEst := GetNodeCTe(oXml, "_infCte:_ide:_UFIni:Text")
Else
cEst := Posicione("SA2", 1, xFilial("SA2") + (_cTab1)->&(_cCmp1 + "_CODEMI") + (_cTab1)->&(_cCmp1 + "_LOJEMI"), "A2_EST")
EndIf
/* ####################################################################### *\
|| # CABEÇALHO DA NOTA # ||
\* ####################################################################### */
aCabec := {{"F1_DOC" , (_cTab1)->&(_cCmp1 + "_DOC") , Nil, Nil}, ;
{"F1_SERIE" , (_cTab1)->&(_cCmp1 + "_SERIE") , Nil, Nil}, ;
{"F1_FORNECE", (_cTab1)->&(_cCmp1 + "_CODEMI"), Nil, Nil}, ;
{"F1_LOJA" , (_cTab1)->&(_cCmp1 + "_LOJEMI"), Nil, Nil}, ;
{"F1_COND" , cCond , Nil, Nil}, ;
{"F1_EMISSAO", (_cTab1)->&(_cCmp1 + "_DTEMIS"), Nil, Nil}, ;
{"F1_DTDIGIT", dDataBase , Nil, Nil}, ;
{"F1_TIPO" , cTpCTEnt , Nil, Nil}, ;
{"F1_ESPECIE", cEspCTe , Nil, Nil}, ;
{"F1_FORMUL" , IIf((_cTab1)->&(_cCmp1 + "_FORMP"), "S", "N") , Nil, Nil}, ;
{"F1_CHVNFE" , (_cTab1)->&(_cCmp1 + "_CHAVE") , Nil, Nil}, ;
{"F1_TPFRETE", cXDForPag , Nil, Nil}, ;
{"F1_TPCTE" , cDTpCTe , Nil, Nil}, ;
{"F1_MODAL" , "01" , Nil, Nil}, ;
{"E2_NATUREZ", cNatur , Nil, Nil}, ;
{"F1_EST" , cEst , Nil, Nil} ;
}
If lZTpCompl .And. cTpCTEnt == "C"
AAdd(aCabec, {})
AIns(aCabec, 9)
aCabec[9] := {"F1_TPCOMPL", IIf(cTpCte == "C", "1", "3") , Nil, Nil}
EndIf
If SF1->( FieldPos("F1_MUORITR") ) > 0
//(_cTab1)->&(_cCmp1 + "_CHAVE")
AAdd(aCabec, {"F1_UFORITR", GFE065RUF(Left((_cTab1)->&(_cCmp1 + "_CIDINI"), 2), 2), Nil, Nil})
AAdd(aCabec, {"F1_UFDESTR", GFE065RUF(Left((_cTab1)->&(_cCmp1 + "_CIDFIM"), 2), 2), Nil, Nil})
AAdd(aCabec, {"F1_MUORITR", Right((_cTab1)->&(_cCmp1 + "_CIDINI"), 5), Nil, Nil})
AAdd(aCabec, {"F1_MUDESTR", Right((_cTab1)->&(_cCmp1 + "_CIDFIM"), 5), Nil, Nil})
EndIf
nPosVal := AScan(aCab, {|x| x[1] == "MV_PAR21"}) // VALOR DO CONHECIMENTO
//Define filial
//If cCgcEmit <> cCgcDest
//cFilAnt := RetFili(cCgcDest)
//EndIf
// VALIDA PRODUTO PASSADO POR PARÂMETRO
dbSelectArea("SB1")
SB1->( dbSetOrder(1) )
If !Empty(cProdFrete) .And. !SB1->( dbSeek(xFilial("SB1") + cProdFrete) )
Aviso("Produto padrão de Frete", "Deve ser informado no parâmetro MV_XGTFRTE o produto padrão que será utilizado para a geração dos itens do conhecimento de frete.", {"Ok"}, 2)
Return .F.
EndIf
aIcms := XmlCteIcms(oXml)
// NOTAS SELECIONADAS
For nA := 1 To Len(aNotasAux)
/* ####################################################################### *\
|| # SF1 # ||
|| # CABECALHO DAS NF DE ENTRADA # ||
\* ####################################################################### */
dbSelectArea("SF1")
// Numero + Serie + Fornecedor + Loja + Tipo da Nota
SF1->( dbSetOrder(1) )
If SF1->( dbSeek(aNotasAux[nA][1][2]) )
AAdd(aSF8, {SF1->F1_DTDIGIT, SF1->F1_DOC, SF1->F1_SERIE, SF1->F1_FORNECE, SF1->F1_LOJA})
// *Num. Docto. *Serie *Cliente *Loja
cDoc := (SF1->F1_FILIAL + SF1->F1_DOC + SF1->F1_SERIE + SF1->F1_FORNECE + SF1->F1_LOJA)
If Left(SF1->F1_ESPECIE, 3) $ "CTE" .And. !Empty(SF1->F1_TPFRETE)
If SF1->F1_TPFRETE == "C"
cXDForPag := "C-CIF"
aCabec[AScan(aCabec, {|x| x[1] == "F1_TPFRETE"})][2] := cXDForPag
EndIf
EndIf
/* ####################################################################### *\
|| # SD1 # ||
|| # ITENS DAS NF DE ENTRADA # ||
\* ####################################################################### */
dbSelectArea("SD1")
SD1->( dbSetOrder(1) )
If SD1->( dbSeek(cDoc) )
While SD1->( !Eof() ) .And. (SD1->D1_FILIAL + SD1->D1_DOC + SD1->D1_SERIE + SD1->D1_FORNECE + SD1->D1_LOJA) == cDoc
// BUSCA PRODUTO NO ARRAY
nPosCod := aScan(aItens, {|x| x[2][2] == SD1->D1_COD})
/* ####################################################################### *\
|| # ITENS DA NOTA # ||
\* ####################################################################### */
If Empty(cProdFrete) .Or. (!Empty(cProdFrete) .And. Empty(aItens))
AAdd(aItens, {{"D1_ITEM" , STRZERO(++nItem, nTamItem), Nil}, ;
{"D1_COD" , SD1->D1_COD , Nil}, ;
{"D1_UM" , SD1->D1_UM , Nil}, ;
{"D1_QUANT" , 1 , Nil}, ;
{"D1_VUNIT" , SD1->D1_TOTAL , Nil}, ;
{"D1_TOTAL" , SD1->D1_TOTAL , Nil}, ;
{"D1_TIPO" , cTpCTEnt , Nil}, ;
{"D1_SERIE" , SD1->D1_SERIE , Nil}, ;
{"D1_TES" , cTes , Nil}, ;
{"D1_PICM" , aIcms[3] , Nil}, ;
{"AUTDELETA" , "N" , Nil} ;
})
//{"D1_NFORI" , SD1->D1_DOC , Nil}, ;
//{"D1_SERIORI", SD1->D1_SERIE , Nil}, ;
If cTpCTEnt == "C"
If GetNewPar("MV_ZSNCTCE", .F.)
AAdd(ATail(aItens), {"D1_CONTA", SD1->D1_CONTA, Nil})
AAdd(ATail(aItens), {"D1_CC" , SD1->D1_CC, Nil})
EndIf
ADel(ATail(aItens), 4)
ASize(ATail(aItens), Len(ATail(aItens)) - 1)
AAdd(ATail(aItens), {"D1_NFORI", SD1->D1_DOC, Nil})
AAdd(ATail(aItens), {"D1_SERIORI", SD1->D1_SERIE, Nil})
AAdd(_aItemOri, PADR(SD1->D1_ITEM, nTamItem))
ElseIf cTpCTEnt == "N"
If GetNewPar("MV_ZSNCTCS", .F.)
AAdd(ATail(aItens), {"D1_CONTA", SD1->D1_CONTA, Nil})
AAdd(ATail(aItens), {"D1_CC" , SD1->D1_CC, Nil})
EndIf
nPosVUnit := 5
nPosVTot := 6
If GetNewPar("MV_XGTCTSO", .F.)
AAdd(ATail(aItens), {"D1_NFORI", SD1->D1_DOC, Nil})
AAdd(ATail(aItens), {"D1_SERIORI", SD1->D1_SERIE, Nil})
AAdd(_aItemOri, PADR(SD2->D2_ITEM, nTamItem))
EndIf
EndIf
EndIf
// SÓ ADICIONA UM ITEM CASO TIVER O PRODUTO PADRÃO POR PARÂMETRO E O PRODUTO FOR VÁLIDO
If !Empty(cProdFrete)
// DADOS DO PRODUTO PADRÃO
ATail(aItens)[2][2] := SB1->B1_COD
ATail(aItens)[3][2] := SB1->B1_UM
ATail(aItens)[nPosVUnit][2] := SF1->F1_VALMERC
ATail(aItens)[nPosVTot][2] := SF1->F1_VALMERC
nTotProd += SF1->F1_VALMERC
Exit
Else
// SOMA O TOTAL DOS PRODUTOS
nTotProd += SD1->D1_TOTAL
EndIf
SD1->( dbSkip() )
EndDo
EndIf
SD1->( dbCloseArea() )
EndIf
SF1->( dbCloseArea() )
Next nA
/* ####################################################################### *\
|| # RATEIA O VALOR # ||
\* ####################################################################### */
nVlConhe := aCab[nPosVal][2]
If Empty(nVlConhe)
nVlConhe := aIcms[4]
aCabec[8][2] := "I"
EndIf
For nA := 1 To Len(aItens)
If nA > Len(aItens)
Exit
EndIf
// VALOR DO FRETE VALOR TOTAL TOTAL DOS ITENS
nVlPonde := Round(nVlConhe * aItens[nA][5][2] / nTotProd, 2) // (VALOR * CRITÉRIO / TOTAL DO CRITÉRIO = VALOR PONDERADO)
aItens[nA][nPosVUnit][2] := nVlPonde // VALOR UNITÁRIO
aItens[nA][nPosVTot][2] := nVlPonde // VALOR TOTAL
nTotPond += nVlPonde
If nVlPonde == 0
aDel(aItens, nA)
aSize(aItens, Len(aItens) - 1)
nA--
EndIf
Next nA
If (nTotPond - nVlConhe) > 0
ATail(aItens)[nPosVUnit][2] -= nTotPond - nVlConhe
ATail(aItens)[nPosVTot][2] -= nTotPond - nVlConhe
ElseIf (nTotPond - nVlConhe) < 0
ATail(aItens)[nPosVUnit][2] += Abs(nTotPond - nVlConhe)
ATail(aItens)[nPosVTot][2] += Abs(nTotPond - nVlConhe)
EndIf
SB1->( dbCloseArea() )
oSenLog:NewLine()
oSenLog:Add("-Cabeçalho do Conhecimento de Transporte enviado para a tentativa de importação:", 1)
PrintArrLog(aCabec)
oSenLog:Add("-Notas Fiscais vinculadas ao Conhecimento de Transporte para tentativa de importação:", 1)
PrintArrNF(aItens)
/* ####################################################################### *\
|| # IMPORTANDO... # ||
\* ####################################################################### */
//Begin Transaction
//**************************************************************************
MsAguarde({|| MsExecAuto({|x, y, z, w| MATA103(x, y, z, w)}, aCabec, aItens, 3, lConfAtu)}, "Importação", ;
"Importando Compl. de " + IIf(aCabec[8][2]=="C", "Preço/Frete...", "ICMS..."))
//Volta filial corrente
//cFilAnt := cFilAtu
//**************************************************************************
dbSelectArea("SF1")
SF1->( dbSetOrder(1) )
If !lMsErroAuto .And. !SF1->( dbSeek(xFilial("SF1") + (_cTab1)->&(_cCmp1 + "_DOC") + (_cTab1)->&(_cCmp1 + "_SERIE") + (_cTab1)->&(_cCmp1 + "_CODEMI") + (_cTab1)->&(_cCmp1 + "_LOJEMI")) )
lConfirm := .F.
lSucess := .F.
ElseIf lMsErroAuto .And. !SF1->( dbSeek(xFilial("SF1") + (_cTab1)->&(_cCmp1 + "_DOC") + (_cTab1)->&(_cCmp1 + "_SERIE") + (_cTab1)->&(_cCmp1 + "_CODEMI") + (_cTab1)->&(_cCmp1 + "_LOJEMI")) )
//DisarmTransaction()
RecLock(_cTab1, .F.)
(_cTab1)->&(_cCmp1 + "_SIT") := "3"
(_cTab1)->&(_cCmp1 + "_ERRO") := MontaErro(GetAutoGrLog())
(_cTab1)->( MsUnlock() )
oSenLog:Add("-Erro ao importar Conhecimento de Transporte: " + (_cTab1)->&(_cCmp1 + "_ERRO"), 1)
If !lLote
ExibeErro()
EndIf
lSucess := .F.
Else
RecLock(_cTab1, .F.)
(_cTab1)->&(_cCmp1 + "_SIT") := "2"
(_cTab1)->&(_cCmp1 + "_ERRO") := ""
(_cTab1)->&(_cCmp1 + "_ESPECI") := cEspCTe
(_cTab1)->&(_cCmp1 + "_TES") := cTes
(_cTab1)->&(_cCmp1 + "_NATFIN") := cNatur
(_cTab1)->&(_cCmp1 + "_CONDPG") := cCond
(_cTab1)->&(_cCmp1 + "_DTIMP") := dDataBase
(_cTab1)->&(_cCmp1 + "_HRIMP") := Time()
(_cTab1)->&(_cCmp1 + "_USUIMP") := cUserName
(_cTab1)->( MsUnlock() )
// FORÇA A GRAVAÇÃO DO TIPO DE CTE
/*RecLock("SF1", .F.)
SF1->F1_TPCTE := cTpCte
SF1->F1_TPFRETE := cforPag
SF1->( MsUnlock() )*/
For nI := 1 To Len(aSF8)
cTransp := aCab[AScan(aCab, {|x| x[1] == "MV_PAR25"})][2]
cLojTran := aCab[AScan(aCab, {|x| x[1] == "MV_PAR26"})][2]
lAchouSF8 := .F.
dbSelectArea("SF8")
SF8->( dbSetOrder(1) )
If SF8->( dbSeek(xFilial("SF8") + (_cTab1)->&(_cCmp1 + "_DOC") + (_cTab1)->&(_cCmp1 + "_SERIE") + cTransp + cLojTran) )
While !SF8->( Eof() ) .And. SF8->F8_FILIAL == xFilial("SF8") .And. SF8->F8_NFDIFRE == (_cTab1)->&(_cCmp1 + "_DOC") .And. ;
SF8->F8_SEDIFRE == (_cTab1)->&(_cCmp1 + "_SERIE") .And. SF8->F8_TRANSP == cTransp .And. SF8->F8_LOJTRAN == cLojTran
If SF8->F8_NFORIG == aSF8[nI][2] .And. SF8->F8_SERORIG == aSF8[nI][3] .And. SF8->F8_FORNECE == aSF8[nI][4] .And. SF8->F8_LOJA == aSF8[nI][5]
lAchouSF8 := .T.
Exit
EndIf
SF8->( dbSkip() )
EndDo
EndIf
If !lAchouSF8
RecLock("SF8", .T.)
SF8->F8_FILIAL := xFilial("SF8")
// Informação do conhecimento
SF8->F8_NFDIFRE := (_cTab1)->&(_cCmp1 + "_DOC")
SF8->F8_SEDIFRE := (_cTab1)->&(_cCmp1 + "_SERIE")
SF8->F8_TRANSP := cTransp
SF8->F8_LOJTRAN := cLojTran
SF8->F8_TIPO := "F"
// Informações da nota fiscal filha
SF8->F8_DTDIGIT := aSF8[nI][1]
SF8->F8_NFORIG := aSF8[nI][2]
SF8->F8_SERORIG := aSF8[nI][3]
SF8->F8_FORNECE := aSF8[nI][4]
SF8->F8_LOJA := aSF8[nI][5]
SF8->( MsUnlock() )
EndIf
Next nI
oSenLog:Add("-Conhecimento de Transporte importado com sucesso." + (_cTab1)->&(_cCmp1 + "_ERRO"), 1)
If !lLote
//Aviso("Aviso", "Conhecimento de Transporte importado com sucesso.", {"Ok"}, 2)
oDlgCTe:End()
EndIf
EndIf
//End Transaction
Return lSucess
Analista de Si |
|
|
Mensagem do
ALVESSGU
em 26/07/2019, 08:31 h
Local: SP Registro: 23/10/2013 Postagens: 8 |
Olá.
Neste caso não seria no próprio cadastro da Filial, cadastrar a pagadora como a matriz na SM0? |
|
|
Mensagem do
IGORDS
em 30/07/2019, 13:00 h
Local: SC Registro: 06/05/2016 Postagens: 12 |
ALVESSGU,
O pagador por ser tanto a matriz como uma filial. |
|
|
Mensagem do
CJCAMPOS
em 30/07/2019, 14:10 h
Local: SP Registro: 09/09/2009 Postagens: 143 |
Não seria entao o caso de vc compartilhar o Financeiro com todas as filiais ?
Existe varios campos para colocar a filial ..
e1_filial
e1_filorig
etc...
Já que o financeiro de um pode pagar o do outro..
Mas recomendo deixar a contabilidade exclusiva.. e o fiscal tb.
|
|
Para postar no Fórum você precisa efetuar o seu login ou se registrar
|
|