🔵Pontos de Entrada da Central XML
Assim como o Protheus, o Facile XML-e tem seus próprios Pontos de Entrada que disponibilizamos para personalizações. Segue abaixo cada um e seus exemplos de utilização.
CHKDOCOK
Ponto de entrada para validar se o XML será analisado pelo CheckDoc.
Parâmetros:
- ParamIxb[1]: Object, Objeto com o XML a ser analisado pelo checkdoc
Retorno:
- lRet: Logical, permite processar o XML.
Segue exemplo de utilização.
User Function CHKDOCOK()
Local lRet := .T.
Local oXml := ParamIxb[1]
If XmlChildEx(oXML:_NFE:_INFNFE:_IDE,"_FINNFE") <> NIL
If oXML:_NFE:_INFNFE:_IDE:_FINNFE:TEXT == "2" //|NF-e complementar |
lRet := .F.
EndIf
EndIf
Return lRet
MT100TOK
Uso necessário para o correto funcionamento da ferramenta
Utilizamos esse ponto de entrada para realizar a validação dos impostos no momento da classificação do documento de entrada.
Sugerimos incluir o código abaixo no final do fonte, logo antes do RETURN (caso tenha o P.E. já aplicado no ERP).
If lValido .And. AllTrim( FunName() ) $ "MATA103/PTX0007/PTX0018/PTX0008/PTX0001"
lValido := U_PTX0010()
EndIf
Segue exemplo do ponto de entrada completo que poderá ser utilizado (caso **NÃO ** tenha o P.E. já aplicado ERP).
User Function MT100TOK()
Local aArea := GetArea()
local lValido := ParamIxb[1]
If lValido .And. AllTrim( FunName() ) $ "MATA103/PTX0007/PTX0018/PTX0008/PTX0001"
lValido := U_PTX0010()
EndIf
RestArea(aArea)
Return lValido
MT103PN
Uso necessário para o correto funcionamento da ferramenta
Utilizamos esse ponto de entrada para realizar a checagem da TES e do pedido de compra nos itens do documento de entrada.
Sugerimos incluir o código abaixo no final do fonte, logo antes do RETURN (caso tenha o P.E. já aplicado no ERP).
If FwIsInCallStack("U_PTX0001")
FWMsgRun(, {|| U_PTX0015(.T.) }, "Processando!", "Calculando impostos, aguarde...")
EndIf
Segue exemplo do ponto de entrada completo que poderá ser utilizado (caso **NÃO ** tenha o P.E. já aplicado no ERP).
User Function MT103PN()
If FwIsInCallStack("U_PTX0001")
FWMsgRun(, {|| U_PTX0015(.T.) }, "Processando!", "Calculando impostos, aguarde...")
EndIf
Return .T.
MT140PC
Esse ponto de entrada deverá ser utilizado exclusivamente na situação em que a empresa utilize o parâmetro **MV_PCNFE ** ativo.
Utilizamos o ponto de entrada para informar ao sistema que naquele momento da inclusão da Pré-Nota pela ferramenta não será necessário realizar a validação do pedido de compra.
Obs.: A utilização desse ponto de entrada não atrapalha no processo padrão adotado pelo MV_PCNFE.
Segue exemplo do ponto de entrada que poderá ser utilizado:
User Function MT140PC()
//|Apenas na rotina Facile XML-e |
If !FwIsInCallStack("U_PTX0001")
Return Nil
EndIf
Return .F.
P007CTE
Ponto de entrada para analisar se o CTE deve entrar via rotina de CTE MATA116 ou via documento de entrada MATA103.
Parâmetros:
- ParamIxb[1]: Object, Objeto XML do CTE
Retorno:
- lRet: Logical, True para MATA116 e false para MATA103.
Segue exemplo de utilização.
User Function P007CTE()
Local oObj := ParamIxb[1]
Local aArea := GetArea()
Local lCteCompra := .F.
Local cCnpjDest := ""
Local cTipoDocumento := ""
If !IsBlind()
lCteCompra := ( fTipoCTE(oObj) == "CTEC" )
Else
If XmlChildEx(oObj:_CTEPROC:_CTE:_INFCTE:_DEST, "_CNPJ") != Nil
cCnpjDest := oObj:_CTEPROC:_CTE:_INFCTE:_DEST:_CNPJ:TEXT
EndIf
If Empty(cCnpjDest) .And. XmlChildEx(oObj:_CTEPROC:_CTE:_INFCTE:_DEST, "_CPF") != Nil
cCnpjDest := oObj:_CTEPROC:_CTE:_INFCTE:_DEST:_CPF:TEXT
EndIf
If cCnpjDest == AllTrim(SM0->M0_CGC)
cTipoDocumento := "CTEC"
Else
cTipoDocumento := "CTEV"
EndIf
lCteCompra := (cTipoDocumento == "CTEC")
EndIf
RestArea(aArea)
Return lCteCompra
Static Function fTipoCTE(oObj)
Local cEstilo1 := ""
Local cEstBtn1 := ""
Local cEstSay2 := ""
Local cTipoCTE := ""
Local cNatureza := ""
Local cCfops := ""
Local nAux := 0
Local aCombo1 := {}
Local aAuxCombo1 := {}
Local aDados := {}
Local cRetPE := "CTEV"
Local oSay3 := Nil
Local oSay4 := Nil
Local oSay5 := Nil
Private oBox1
Private oBox2
Private oSay1
Private oSay2
aCombo1 := {"Frete Despesa (Cte Venda)","Frete Custo Produto (Cte Compra)"}
aAuxCombo1 := {"CTEV","CTEC"}
nAux := aScan(aAuxCombo1,cRetPE)
If !Empty(cRetPE) .And. nAux != 0
cTipoCTE := aCombo1[nAux]
EndIf
aDados := fDadosDocumento(oObj)
cNatureza := SubStr( aDados[1], 1, 52 ) + IIf( Len( aDados[1] ) > 60, "...", "" )
cCfops := SubStr( aDados[2], 1, 52 ) + IIf( Len( aDados[2] ) > 60, "...", "" )
oFont1 := TFont():New( "Courier New",0,-16,,.T.,0,,700,.F.,.F.,,,,,, )
oDlg1 := MSDialog():New( 091,243,380,650,"XML-e - Tipo Documento de Transporte",,,.F.,,,,,,.T.,,,.T. )
oPanel1 := TPanel():New( 000,000,"",oDlg1,,.F.,.F.,,,280,085,.T.,.F. )
oPanel1:align:= CONTROL_ALIGN_ALLCLIENT
cEstilo1 := " QLabel {"
cEstilo1 += " background-color: #3D86AB;"
cEstilo1 += "}"
oPanel1:SetCss(cEstilo1)
oSay3 := TSay():New( 005,005,{||"Nat. Operação: " + cNatureza },oPanel1,,,.F.,.F.,.F.,.T.,CLR_WHITE,CLR_WHITE,300,012)
oSay3:SetCss( " QLabel { color: #FFFFFF; }")
oSay4 := TSay():New( 015,005,{||"Cfop: " + cCfops },oPanel1,,,.F.,.F.,.F.,.T.,CLR_WHITE,CLR_WHITE,300,012)
oSay4:SetCss( " QLabel { color: #FFFFFF; }")
oSay5 := TSay():New( 022,000,{||Replicate("-",120) },oPanel1,,,.F.,.F.,.F.,.T.,CLR_WHITE,CLR_WHITE,300,012)
oSay1 := TSay():New( 030,016,{||"Tipo de CT-e"},oPanel1,,oFont1,.F.,.F.,.F.,.T.,CLR_WHITE,CLR_WHITE,072,012)
cEstSay2 := " QLabel { "
cEstSay2 += " font-family: cursive; "
cEstSay2 += " font-weight: bold; "
cEstSay2 += " font-size: large; "
cEstSay2 += " line-height: 100%; "
cEstSay2 += " word-spacing: 1ex; "
cEstSay2 += " letter-spacing: normal; "
cEstSay2 += " text-decoration: none; "
cEstSay2 += " text-transform: none; "
cEstSay2 += " text-align: left; "
cEstSay2 += " color: #FFFFFF; "
cEstSay2 += " text-indent: 0ex; "
cEstSay2 += " } "
oSay1:SetCss(cEstSay2)
@ 048,016 MSCOMBOBOX oBox1 VAR cTipoCTE ITEMS aCombo1 SIZE 150,100 OF oDlg1 PIXEL
oBtn1 := TButton():New( 108,068,"Confirmar",oPanel1,{|| TipoCombo(@cRetPE,aCombo1,cTipoCTE,aAuxCombo1,"1") },056,012,,,,.T.,,"",,,,.F. )
cEstBtn1 := "QPushButton {"
cEstBtn1 += " background-image: url(rpo:PTX_Refresh.png);"
cEstBtn1 += " background-repeat: none; "
cEstBtn1 += " background-attachment: fixed; "
cEstBtn1 += " background-position: left center; "
cEstBtn1 += " border-style: outset;"
cEstBtn1 += " border-width: 2px;"
cEstBtn1 += " border: 1px solid #C0C0C0;"
cEstBtn1 += " border-radius: 5px;"
cEstBtn1 += " border-color: #C0C0C0;"
cEstBtn1 += " font: bold 12px Arial;"
cEstBtn1 += " color: #ffffff; "
cEstBtn1 += " padding: 6px;"
cEstBtn1 += "} "
cEstBtn1 += "QPushButton:hover { "
cEstBtn1 += " background-color: #cecef6;"
cEstBtn1 += " border-style: inset;"
cEstBtn1 += " opacity: 0.2; "
cEstBtn1 += "} "
cEstBtn1 += "QPushButton:pressed {"
cEstBtn1 += " background-color: #e6e6f9;"
cEstBtn1 += " border-style: inset;"
cEstBtn1 += "} "
oBtn1:SetCss(cEstBtn1)
oDlg1:Activate(,,,.T.)
Return cRetPE
Static Function TipoCombo(cVariavel,aCombo,cCombo,aReferencia,cIdent)
Local nPos := aScan(aCombo,cCombo)
Local lRet := (nPos > 0)
If nPos > 0
cVariavel := aReferencia[nPos]
EndIf
oDlg1:End()
Return (lRet)
Static Function fDadosDocumento(oObj)
Local cCfops := ""
Local cNatureza := ""
If oObj != Nil
//|Pega a natureza da operação |
cNatureza := U_PTX_GetTagValue( oObj, "oObj:_CTEPROC:_CTE:_INFCTE:_IDE:_NATOP" )
cCfops := U_PTX_GetTagValue( oObj, "oObj:_CTEPROC:_CTE:_INFCTE:_IDE:_CFOP" )
EndIf
Return { cNatureza, cCfops }
P07GERAENT
Ponto de entrada chamado ao clicar no botão "Gerar Entrada" para tratamentos diversos está posicionado no XML selecionado (tabela ZZZ).
Segue exemplo de utilização.
User Function P07GERAENT()
If ZZZ->ZZZ_TIPO == "1" //|NFE |
If MsgYesNo("Deseja alterar a data do recebimento (D1_DTDIGIT) ?", "P07GERAENT")
dDataBase := CtoD( FWInputBox("Digite a data do recebimento (dd/mm/aaaa)") )
EndIf
EndIf
Return
P09ALTPN
Ponto de entrada após o execauto do MATA140 e quando não estiver para abrir pra classificação.
Retorno:
- lClassifica: Logical, True abre a tela de classificação.
Segue exemplo de utilização.
User Function P09ALTPN()
Local lClassifica := .F.
Local cSitua := U_VerifNF()
//|Altera a Legenda |
RecLock("ZZZ",.F.)
ZZZ->ZZZ_OK := cSitua
ZZZ->(MsUnLock())
//lClassifica => se for = .T. ele abre tela de classificação
If !lClassifica
//|Abre a pré-nota em modo de alteração |
U_PTX0057( 'PRE' , 'ALTERA' )
Else
lClassifica := .T.
EndIf
Return lClassifica
P011ITEM
Ponto de entrada para manipular o array de itens do CTE de Vendas antes do execauto.
Retorno:
- _aItensCols: array, array de itens para o execauto.
Segue exemplo de utilização.
User Function P011ITEM()
Local _aItensCols := ParamIxb[1] as Array
// Local _aCabececalho := ParamIxb[2] as Array
Local _oXml := ParamIxb[3] as Object
Local _nCont := 0 as Integer
Local _nI := 0 as Integer
Local _oCTE := _oXml as Object
Local _oIcms := Nil as Object
Local _oIpi := Nil as Object
Local _oPis := Nil as Object
Local _oCofins := Nil as Object
Local _oST := Nil as Object
Local c_FSBICM := "" as Character // BASE ICMS
Local c_FSVICM := "" as Character // VALOR ICMS
Local c_FSBIPI := "" as Character // BASE IPI
Local c_FSVIPI := "" as Character // VALOR IPI
Local c_FSBPIS := "" as Character // BASE PIS
Local c_FSVPIS := "" as Character // VALOR POS
Local c_FSBCOF := "" as Character // BASE COFINS
Local c_FSVCOF := "" as Character // VALOR COFINS
Local c_FSBIST := "" as Character // BASE ICMS ST
Local c_FSVIST := "" as Character // VALOR ICMS ST
Local c_FSCSTIC := "" as Character //- F4_SITTRIB <> CSTICMS - CST CLASSIFICAÇÃO FISCAL
Local c_FSCSTIP := "" as Character //- F4_CTIPI <> CST CLASSIFICAÇÃO FISCAL IPI
Local cExcept := "" as Character
Local bError as CodeBlock
bError := ErrorBlock({|e| cExcept := "<h3>"+e:Description+"</h3>"+e:ERRORSTACK})
BEGIN SEQUENCE
_nCont := Len( _aItensCols )
For _nI := 1 To _nCont
If XmlChildEx(_oCTE:_CTEPROC:_CTE, "_INFCTE") != Nil
_oCTE := _oCTE:_CTEPROC:_CTE:_INFCTE
EndIf
If XmlChildEx(_oCTE, "_IMP") != Nil
//|ICMS |
If XmlChildEx(_oCTE:_Imp, "_ICMS") != Nil
_oIcms := fBuscaIcms( _oCTE )
c_FSBICM := U_PTX_GetTagValue( _oIcms, "_oIcms:_VBC" ) // BASE ICMS
c_FSVICM := U_PTX_GetTagValue( _oIcms, "_oIcms:_VICMS" ) // VALOR ICMS
c_FSORIG := U_PTX_GetTagValue( _oIcms, "_oIcms:_ORIG" ) // B1_ORIGEM -- CST CLASSIFICAÇÃO FISCAL ICMS
c_FSCSTIC := U_PTX_GetTagValue( _oIcms, "_oIcms:_CST" ) //- F4_SITTRIB <> CSTICMS - CST CLASSIFICAÇÃO FISCAL
EndIf
//|IPI |
If XmlChildEx(_oCTE:_Imp, "_IPI") != Nil
_oIpi := fBuscaIpi( _oCTE )
c_FSBIPI := U_PTX_GetTagValue( _oIpi, "_oIpi:_VBC" ) // BASE IPI
c_FSVIPI := U_PTX_GetTagValue( _oIpi, "_oIpi:_VIPI" ) // VALOR IPI
c_FSCSTIP := U_PTX_GetTagValue( _oIpi, "_oIpi:_CST" ) //- F4_CTIPI <> CST CLASSIFICAÇÃO FISCAL IPI
EndIf
//|PIS |
If XmlChildEx(_oCTE:_Imp, "_PIS") != Nil
_oPis := fBuscaPis( _oCTE )
c_FSBPIS := U_PTX_GetTagValue( _oPis, "_oPis:_VBC" ) // BASE PIS
c_FSVPIS := U_PTX_GetTagValue( _oPis, "_oPis:_VPIS" ) // VALOR PIS
EndIf
//|COFINS |
If XmlChildEx(_oCTE:_Imp, "_COFINS") != Nil
_oCofins := fBuscaCofins( _oCTE )
c_FSBCOF := U_PTX_GetTagValue( _oCofins, "_oCofins:_VBC" ) // BASE COFINS
c_FSVCOF := U_PTX_GetTagValue( _oCofins, "_oCofins:_VCOFINS" ) // VALOR COFINS
EndIf
//|ICMS ST |
If XmlChildEx(_oCTE:_Imp, "_ICMS") != Nil
_oST := fBuscaIcms( _oCTE )
c_FSBIST := U_PTX_GetTagValue( _oST, "_oST:_VBCST" ) // BASE ICMS ST
c_FSVIST := U_PTX_GetTagValue( _oST, "_oST:_VICMSST" ) // VALOR ICMS ST
EndIf
EndIf
//|Adiciona ao aCols |
aadd(_aItensCols[_nI], {"D1_FSBICM ", Val(c_FSBICM), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSVICM ", Val(c_FSVICM), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSBIPI ", Val(c_FSBIPI), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSVIPI ", Val(c_FSVIPI), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSBPIS ", Val(c_FSBPIS), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSVPIS ", Val(c_FSVPIS), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSBCOF ", Val(c_FSBCOF), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSVCOF ", Val(c_FSVCOF), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSBIST ", Val(c_FSBIST), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSVIST ", Val(c_FSVIST), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSCSTIC", c_FSCSTIC , Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSCSTIP", c_FSCSTIP , Nil, Nil})
Next _nI
END SEQUENCE
ErrorBlock(bError)
If !Empty(cExcept)
ConOut(cExcept)
EndIf
Return _aItensCols
Static Function fBuscaIcms( _oCTE )
Local _oIcms as Object
Do Case
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMS00") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMS00
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMS10") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMS10
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMS20") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMS20
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMS30") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMS30
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMS40") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMS40
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMS41") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMS41
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMS45") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMS45
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMS50") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMS50
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMS51") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMS51
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMS60") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMS60
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMS70") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMS70
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMS90") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMS90
Case XmlChildEx(_oCTE:_Imp:_ICMS, "_ICMSST") != Nil
_oIcms := _oCTE:_Imp:_ICMS:_ICMSST
EndCase
Return _oIcms
Static Function fBuscaIpi( __oCTE )
Local _oImp as Object
Do Case
Case XmlChildEx(_oCTE:_Imp:_IPI, "_IPITRIB") != Nil
_oImp := _oCTE:_Imp:_IPI:_IPITRIB
Case XmlChildEx(_oCTE:_Imp:_IPI, "_IPINT") != Nil
_oImp := _oCTE:_Imp:_IPI:_IPINT
EndCase
Return _oImp
Static Function fBuscaPis( __oCTE )
Local _oImp as Object
Do Case
Case XmlChildEx(_oCTE:_Imp:_PIS, "_PISALIQ") != Nil
_oImp := _oCTE:_Imp:_PIS:_PISALIQ
EndCase
Return _oImp
Static Function fBuscaCofins( __oCTE )
Local _oImp as Object
Do Case
Case XmlChildEx(_oCTE:_Imp:_COFINS, "_COFINSALIQ") != Nil
_oImp := _oCTE:_Imp:_COFINS:_COFINSALIQ
EndCase
Return _oImp
P018COLS
Ponto de entrada para manipular o array de itens do documento de entrada antes do execauto.
Retorno:
- _aItensCols: array, array de itens para o execauto
Segue exemplo de utilização.
User Function P018COLS()
Local _aItensCols := ParamIxb[1] as Array
// Local _aCabecalho := ParamIxb[2] as Array
Local _oXml := ParamIxb[3] as Object
Local aProcessados := {} as Array
// Local _cProduto := "" as Character
// Local _cDocumento := "" as Character
Local _cItemXml := "" as Character
Local _nZ := 0 as Integer
Local _nI := 0 as Integer
Local _nPos := 0 as Integer
Local _nPosIemXml := 0 as Integer
Local _nCont := 0 as Integer
Local _oItem := Nil as Object
Local oDetXml := Nil as Variant
Local _oIcms := Nil as Object
Local _oIpi := Nil as Object
Local _oPis := Nil as Object
Local _oCofins := Nil as Object
Local _oST := Nil as Object
Local c_FSBICM := "" as Character // BASE ICMS
Local c_FSVICM := "" as Character // VALOR ICMS
Local c_FSBIPI := "" as Character // BASE IPI
Local c_FSVIPI := "" as Character // VALOR IPI
Local c_FSBPIS := "" as Character // BASE PIS
Local c_FSVPIS := "" as Character // VALOR POS
Local c_FSBCOF := "" as Character // BASE COFINS
Local c_FSVCOF := "" as Character // VALOR COFINS
Local c_FSBIST := "" as Character // BASE ICMS ST
Local c_FSVIST := "" as Character // VALOR ICMS ST
Local c_FSCEST := "" as Character // B1_CEST <> cest -- CÓDIGO CEST
Local c_FSORIG := "" as Character // B1_ORIGEM <> -- CST CLASSIFICAÇÃO FISCAL ICMS
Local c_FSCSTIC := "" as Character //- F4_SITTRIB <> CSTICMS - CST CLASSIFICAÇÃO FISCAL
Local c_FSCSTIP := "" as Character //- F4_CTIPI <> CST CLASSIFICAÇÃO FISCAL IPI
Local cExcept := "" as Character
Local bError as CodeBlock
bError := ErrorBlock({|e| cExcept := "<h3>"+e:Description+"</h3>"+e:ERRORSTACK})
BEGIN SEQUENCE
If ZZZ->ZZZ_TIPO == "1"
//|Pega campos necessários |
// If ( _nPos := aScan(_aCabecalho, { |x| Alltrim(x[1]) == "F1_DOC" }) ) > 0
// _cDocumento := _aCabecalho[ _nPos, 2 ]
// EndIf
// If ( _nPos := aScan(_aItensCols[1], { |x| Alltrim(x[1]) == "D1_COD" }) ) > 0
// _cProduto := _aItensCols[ 1, _nPos, 2 ]
// EndIf
oDetXml := _oXml:_InfNfe:_Det
oDetXml := IIf( ValType(oDetXml) == "O", {oDetXml}, oDetXml )
_nCont := Len( _aItensCols )
//|Percorre todos os itens do aCols SD1 |
For _nI := 1 To _nCont
_nPosIemXml := aScan( _aItensCols[_nI], { |x| Alltrim(x[1]) == "D1_ZITEXML" } )
_cItemXml := _aItensCols[_nI, _nPosIemXml, 2]
//|Variavel de controle para processar itens fracionados apenas uma vez |
If ( _nPos := aScan( aProcessados, _cItemXml ) ) > 0
Loop
Else
aAdd( aProcessados, _cItemXml )
EndIf
//|Encontra o respectivo item no XML |
For _nZ := 1 To Len( oDetXml )
If cValToChar( oDetXml[_nZ]:_NITEM:TEXT ) == cValToChar( _cItemXml )
_oItem := oDetXml[_nZ]
Exit
EndIf
Next _nZ
If XmlChildEx(_oItem, "_IMPOSTO") != Nil
//|ICMS |
If XmlChildEx(_oItem:_Imposto, "_ICMS") != Nil
_oIcms := fBuscaIcms( _oItem )
c_FSBICM := U_PTX_GetTagValue( _oIcms, "_oIcms:_VBC" ) // BASE ICMS
c_FSVICM := U_PTX_GetTagValue( _oIcms, "_oIcms:_VICMS" ) // VALOR ICMS
c_FSORIG := U_PTX_GetTagValue( _oIcms, "_oIcms:_ORIG" ) // B1_ORIGEM -- CST CLASSIFICAÇÃO FISCAL ICMS
c_FSCSTIC := U_PTX_GetTagValue( _oIcms, "_oIcms:_CST" ) //- F4_SITTRIB <> CSTICMS - CST CLASSIFICAÇÃO FISCAL
EndIf
//|IPI |
If XmlChildEx(_oItem:_Imposto, "_IPI") != Nil
_oIpi := fBuscaIpi( _oItem )
c_FSBIPI := U_PTX_GetTagValue( _oIpi, "_oIpi:_VBC" ) // BASE IPI
c_FSVIPI := U_PTX_GetTagValue( _oIpi, "_oIpi:_VIPI" ) // VALOR IPI
c_FSCSTIP := U_PTX_GetTagValue( _oIpi, "_oIpi:_CST" ) //- F4_CTIPI <> CST CLASSIFICAÇÃO FISCAL IPI
EndIf
//|PIS |
If XmlChildEx(_oItem:_Imposto, "_PIS") != Nil
_oPis := fBuscaPis( _oItem )
c_FSBPIS := U_PTX_GetTagValue( _oPis, "_oPis:_VBC" ) // BASE PIS
c_FSVPIS := U_PTX_GetTagValue( _oPis, "_oPis:_VPIS" ) // VALOR PIS
EndIf
//|COFINS |
If XmlChildEx(_oItem:_Imposto, "_COFINS") != Nil
_oCofins := fBuscaCofins( _oItem )
c_FSBCOF := U_PTX_GetTagValue( _oCofins, "_oCofins:_VBC" ) // BASE COFINS
c_FSVCOF := U_PTX_GetTagValue( _oCofins, "_oCofins:_VCOFINS" ) // VALOR COFINS
EndIf
//|ICMS ST |
If XmlChildEx(_oItem:_Imposto, "_ICMS") != Nil
_oST := fBuscaIcms( _oItem )
c_FSBIST := U_PTX_GetTagValue( _oST, "_oST:_VBCST" ) // BASE ICMS ST
c_FSVIST := U_PTX_GetTagValue( _oST, "_oST:_VICMSST" ) // VALOR ICMS ST
EndIf
EndIf
c_FSCEST := U_PTX_GetTagValue( _oItem, "_oItem:_PROD:_CEST" ) // CÓDIGO CEST
//|Adiciona ao aCols |
aadd(_aItensCols[_nI], {"D1_FSBICM ", Val(c_FSBICM), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSVICM ", Val(c_FSVICM), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSBIPI ", Val(c_FSBIPI), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSVIPI ", Val(c_FSVIPI), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSBPIS ", Val(c_FSBPIS), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSVPIS ", Val(c_FSVPIS), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSBCOF ", Val(c_FSBCOF), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSVCOF ", Val(c_FSVCOF), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSBIST ", Val(c_FSBIST), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSVIST ", Val(c_FSVIST), Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSCEST ", c_FSCEST , Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSORIG ", c_FSORIG , Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSCSTIC", c_FSCSTIC , Nil, Nil})
aadd(_aItensCols[_nI], {"D1_FSCSTIP", c_FSCSTIP , Nil, Nil})
Next _nI
EndIf
END SEQUENCE
ErrorBlock(bError)
If !Empty(cExcept)
ConOut(cExcept)
EndIf
Return _aItensCols
Static Function fBuscaIcms( _oItem )
Local _oIcms as Object
Do Case
Case XmlChildEx(_oItem:_Imposto:_ICMS, "_ICMS00") != Nil
_oIcms := _oItem:_Imposto:_ICMS:_ICMS00
Case XmlChildEx(_oItem:_Imposto:_ICMS, "_ICMS10") != Nil
_oIcms := _oItem:_Imposto:_ICMS:_ICMS10
Case XmlChildEx(_oItem:_Imposto:_ICMS, "_ICMS20") != Nil
_oIcms := _oItem:_Imposto:_ICMS:_ICMS20
Case XmlChildEx(_oItem:_Imposto:_ICMS, "_ICMS30") != Nil
_oIcms := _oItem:_Imposto:_ICMS:_ICMS30
Case XmlChildEx(_oItem:_Imposto:_ICMS, "_ICMS40") != Nil
_oIcms := _oItem:_Imposto:_ICMS:_ICMS40
Case XmlChildEx(_oItem:_Imposto:_ICMS, "_ICMS41") != Nil
_oIcms := _oItem:_Imposto:_ICMS:_ICMS41
Case XmlChildEx(_oItem:_Imposto:_ICMS, "_ICMS50") != Nil
_oIcms := _oItem:_Imposto:_ICMS:_ICMS50
Case XmlChildEx(_oItem:_Imposto:_ICMS, "_ICMS51") != Nil
_oIcms := _oItem:_Imposto:_ICMS:_ICMS51
Case XmlChildEx(_oItem:_Imposto:_ICMS, "_ICMS60") != Nil
_oIcms := _oItem:_Imposto:_ICMS:_ICMS60
Case XmlChildEx(_oItem:_Imposto:_ICMS, "_ICMS70") != Nil
_oIcms := _oItem:_Imposto:_ICMS:_ICMS70
Case XmlChildEx(_oItem:_Imposto:_ICMS, "_ICMS90") != Nil
_oIcms := _oItem:_Imposto:_ICMS:_ICMS90
Case XmlChildEx(_oItem:_Imposto:_ICMS, "_ICMSST") != Nil
_oIcms := _oItem:_Imposto:_ICMS:_ICMSST
EndCase
Return _oIcms
Static Function fBuscaIpi( _oItem )
Local _oImp as Object
Do Case
Case XmlChildEx(_oItem:_Imposto:_IPI, "_IPITRIB") != Nil
_oImp := _oItem:_Imposto:_IPI:_IPITRIB
Case XmlChildEx(_oItem:_Imposto:_IPI, "_IPINT") != Nil
_oImp := _oItem:_Imposto:_IPI:_IPINT
EndCase
Return _oImp
Static Function fBuscaPis( _oItem )
Local _oImp as Object
Do Case
Case XmlChildEx(_oItem:_Imposto:_PIS, "_PISALIQ") != Nil
_oImp := _oItem:_Imposto:_PIS:_PISALIQ
EndCase
Return _oImp
Static Function fBuscaCofins( _oItem )
Local _oImp as Object
Do Case
Case XmlChildEx(_oItem:_Imposto:_COFINS, "_COFINSALIQ") != Nil
_oImp := _oItem:_Imposto:_COFINS:_COFINSALIQ
EndCase
Return _oImp
P018CPO
Ponto de entrada para adicionar campos extras na SD1 antes do execauto. Esse ponto de entrada será chamado para cada item do documento de entrada.
Parâmetros:
- ParamIxb[1]: Array com os campos do item a ser gerado no Protheus.
- ParamIxb[2]: Array com o item do XML.
- ParamIxb[3]: Array com o cabeçalho do XML.
Retorno:
- aCpos: array, array com os campos extras na SD1 antes do execauto.
Segue exemplo de utilização.
User Function P018CPO()
Local aCpos := {}
Local _nPos := 0
Local _cProduto := ""
Local _cTipo := ""
Local aItProtheus := ParamIxb[1]
Local aItXml := ParamIxb[2]
Local aCabecXml := ParamIxb[3]
//|Pega o produto |
If ( _nPos := aScan(aItProtheus, { |x| Alltrim(x[1]) == "D1_COD" }) ) > 0
_cProduto := aItProtheus[ _nPos, 2 ]
EndIf
//|Pega o Tipo de NF |
If ( _nPos := aScan(aCabecXml, { |x| Alltrim(x[1]) == "F1_TIPO" }) ) > 0
_cTipo := aCabecXml[ _nPos, 2 ]
EndIf
aadd(aCpos, {"D1_XUMXML" , aItXml:_Prod:_uCom:TEXT , Nil, Nil})
aadd(aCpos, {"D1_XQTDXML", Val(aItXml:_Prod:_qCom:TEXT), Nil, Nil})
aadd(aCpos, {"D1_XDESXML", aItXml:_Prod:_XPROD:TEXT , Nil, Nil})
aadd(aCpos, {"D1_UM" , SB1->B1_UM , Nil, Nil})
Return aCpos
P018FIM
Ponto de entrada para manutenções diversas ao final da geração do documento, devido a isso, já se encontra posicionado na ZZZ e na SF1.
Segue exemplo de utilização.
User Function P018FIM()
MsgInfo("Nota Fiscal gerada: " + AllTrim(SF1->F1_DOC) + " / " + AllTrim(SF1->F1_SERIE))
Return
P018ITEM
Ponto de entrada para alterar informações do item antes do execauto.
Parâmetros:
- ParamIxb[1]: Array com os campos do item a ser gerado no Protheus.
- ParamIxb[2]: Array com o item do XML.
- ParamIxb[3]: Array com o cabeçalho do XML.
Retorno:
- aItemCols: array, array com a nova linha do item a ser gerado no Protheus.
Segue exemplo de utilização.
User Function P018ITEM()
Local aItemCols := ParamIxb[1]
Local _aCabec := ParamIxb[3]
Local aItemXML := ParamIxb[2]
Local nI := 0
Local nPos := 0
Local lDevolucao := .F.
If ( nPos := aScan( _aCabec, { |x| AllTrim( x[1] ) == "F1_TIPO" } ) )
lDevolucao := ( _aCabec[nPos, 2] == "D" )
EndIf
If lDevolucao
For nI := 1 To Len(aItemCols)
//|Nota de devolução? |
If AllTrim( aItemCols[nI,1] ) == "D1_UM"
Alert( "Devolução com o D1_UM = " + aItemCols[nI,2] )
aItemCols[nI,2] := "CX"
EndIf
Next nI
EndIf
Return aItemCols
P018PROD
Ponto de entrada para analisar os itens do XML no momento da entrada.
Parâmetros:
- ParamIxb[1]: Array com o objeto XML dos produtos da nota fiscal eletronica.
- ParamIxb[2]: Se .T. indica que é uma devolução de venda.
- ParamIxb[3]: Código do fornecedor no Protheus.
- ParamIxb[4]: Loja do fornecedor no Protheus.
Segue exemplo de utilização.
User Function P018PROD()
Local nCont := 0
Local aItensXml := ParamIxb[1]
Local lDevoluc := ParamIxb[2]
Local cFornece := ParamIxb[3]
Local cLoja := ParamIxb[4]
Local aArea := GetArea()
Local aAreaZZW := ZZW->( GetArea() )
//|Não processa para devolução |
If lDevoluc
Return
EndIf
dbselectarea('ZZW')
ZZW->(dbsetorder(1))
For nCont := 1 To Len(aItensXml)
cProdFornec := aItensXml[nCont]:_PROD:_CPROD:TEXT
cCodBarras := IIf( XmlChildEx(aItensXml[nCont]:_PROD, "_CEAN") <> NIL,aItensXml[nCont]:_PROD:_CEAN:TEXT,space(12) )
//|Nesse ponto procura o produto na SB1 |
//...
//...
//...
//|Deve adicionar o produto na ZZW quando não existir |
If !ZZW->( dbSeek( xFilial('ZZW') + cfornece + cLoja + PADR(AllTrim(cProdFornec),TamSX3("ZZW_CODPRF")[1]) + SB1->B1_COD) )
Reclock('ZZW',.T.)
ZZW->ZZW_FILIAL := xFilial('ZZW')
ZZW->ZZW_PRODUT := SB1->B1_COD
ZZW->ZZW_FORNEC := cfornece
ZZW->ZZW_LOJA := cLoja
ZZW->ZZW_CODPRF := cProdFornec
If ZZW->( FieldPos("ZZW_DPRODF") ) > 0
ZZW->ZZW_DPRODF := aItensXml[nCont]:_PROD:_XPROD:TEXT
EndIf
ZZW->(MsUnlock())
EndIf
Next nCont
RestArea(aAreaZZW)
RestArea(aArea)
Return
P018PROPRIO
Ponto de entrada para indicar formulário próprio na entrada.
Parâmetros:
- ParamIxb[1]: Se é formulário próprio. Identificado com "S" ou "N".
- ParamIxb[2]: Número da NF que está entrando no sistema.
- ParamIxb[3]: Série da NF que está entrando no sistema.
Retorno:
- aRetorno: array, array com dados para a NF-e.
Segue exemplo de utilização.
User Function P018PROPRIO()
Local cFormProprio := ParamIxb[1]
Local cNumNFe := ParamIxb[2]
Local cNumSerie := ParamIxb[3]
Local cSerieNF := ""
Local aRetorno := {}
cFormProprio := fFormProrio()
If cFormProprio == "S"
cNumero := ""
Sx5NumNota( @cSerieNF, SuperGetMV("MV_TPNRNFS") )
cNumNFe := cNumero
cNumSerie := cSerieNF
EndIf
aAdd(aRetorno, cFormProprio )
aAdd(aRetorno, cNumNFe )
aAdd(aRetorno, cNumSerie )
Return aRetorno
Static Function fFormProrio()
Local cRetorno := "N"
Local aCombo1 := {"Não","Sim"}
Local aAuxCombo1 := {"N","S"}
oDlg1 := MSDialog():New( 091,243,300,650,"XML-e - Formulário Próprio",,,.F.,,,,,,.T.,,,.T. )
oSay1 := TSay():New( 030,016,{||"Formulário Próprio?"},oDlg1,,,.F.,.F.,.F.,.T.,CLR_BLACK,CLR_WHITE,072,012)
@ 048,016 MSCOMBOBOX oBox1 VAR cRetorno ITEMS aCombo1 SIZE 150,100 OF oDlg1 PIXEL
oBtn1 := TButton():New( 088,068,"Confirmar",oDlg1,{|| TipoCombo(aCombo1,cRetorno,aAuxCombo1) },056,012,,,,.T.,,"",,,,.F. )
oDlg1:Activate(,,,.T.)
If Empty(cRetorno)
cRetorno := "N"
EndIf
cRetorno := SubStr(cRetorno, 1, 1)
Return cRetorno
Static Function TipoCombo(aCombo,cCombo,aReferencia)
Local nPos := aScan(aCombo,cCombo)
Local lRet := (nPos > 0)
If nPos > 0
cCombo := aReferencia[nPos]
EndIf
oDlg1:End()
Return (lRet)
P018SF1
Ponto de entrada para manipular o array de cabeçalho (SF1) do documento de entrada antes do execauto.
Parâmetros:
- ParamIxb[1]: Array com os campos do item a ser gerado no Protheus.
- ParamIxb[2]: Array com o cabeçalho do XML.
- ParamIxb[3]: Objeto do XML.
Retorno:
- _aCabecalho: array, novo array do cabeçalho.
Segue exemplo de utilização.
User Function P018SF1()
// Local _aItensCols := ParamIxb[1] as Array
Local _aCabecalho := ParamIxb[2] as Array
Local _oXml := ParamIxb[3] as Object
Local oTransp := Nil as Object
Local cVolume := "" as Character
Local cExcept := "" as Character
Local bError as CodeBlock
bError := ErrorBlock({|e| cExcept := "<h3>"+e:Description+"</h3>"+e:ERRORSTACK})
BEGIN SEQUENCE
If ZZZ->ZZZ_TIPO == "1" //|NF-e |
oTransp := _oXml:_InfNfe:_Transp
If XmlChildEx(oTransp, "_VOL") != Nil
cVolume := U_PTX_GetTagValue( oTransp, "oTransp:_VOL:_QVOL" )
If !Empty(cVolume)
aAdd(_aCabecalho,{"F1_VOLUME1", Val(cVolume), Nil, Nil})
EndIf
EndIf
EndIf
END SEQUENCE
ErrorBlock(bError)
If !Empty(cExcept)
ConOut(cExcept)
EndIf
Return _aCabecalho
P018TIPO
Ponto de entrada para modificar o tipo de nota fiscal.
Retorno:
- cRetPE: caracter, novo tipo do documento fiscal.
Segue exemplo de utilização.
User Function _P018TIPO()
Local cEstilo1 := ""
Local cEstBtn1 := ""
Local cEstSay2 := ""
Local c103Tipo := ""
Local nAux := 0
Local aCombo1 := {}
Local aAuxCombo1:= {}
Local cRetPE := "N"
Private oBox1
Private oSay1
aCombo1 := {"Normal","Devolução","Beneficiamento","Compl. ICMS","Compl. IPI","Compl. Preco/Frete"}
aAuxCombo1 := {"N","D","B","I","P","C"}
nAux := aScan(aAuxCombo1,cRetPE)
If !Empty(cRetPE) .And. nAux <> 0
c103Tipo := aCombo1[nAux]
EndIf
oFont1 := TFont():New( "Courier New",0,-16,,.T.,0,,700,.F.,.F.,,,,,, )
oDlg1 := MSDialog():New( 091,243,270,650,"XML-e - Tipo de Documento de Entrada",,,.F.,,,,,,.T.,,,.T. )
oPanel1 := TPanel():New( 000,000,"",oDlg1,,.F.,.F.,,,280,085,.T.,.F. )
oPanel1:align:= CONTROL_ALIGN_ALLCLIENT
cEstilo1 := " QLabel {"
cEstilo1 += " background-color: #3D86AB;"
cEstilo1 += "}"
oPanel1:SetCss(cEstilo1)
oSay1 := TSay():New( 012,016,{||"Tipo da Nota"},oPanel1,,oFont1,.F.,.F.,.F.,.T.,CLR_WHITE,CLR_WHITE,072,012)
cEstSay2 := " QLabel { "
cEstSay2 += " font-family: cursive; "
cEstSay2 += " font-weight: bold; "
cEstSay2 += " font-size: large; "
cEstSay2 += " line-height: 100%; "
cEstSay2 += " word-spacing: 1ex; "
cEstSay2 += " letter-spacing: normal; "
cEstSay2 += " text-decoration: none; "
cEstSay2 += " text-transform: none; "
cEstSay2 += " text-align: left; "
cEstSay2 += " color: #FFFFFF; "
cEstSay2 += " text-indent: 0ex; "
cEstSay2 += " } "
oSay1:SetCss(cEstSay2)
//oGet1 := TGet():New( 024,016,{|u| If(PCount()>0,cChvNfe:=u,cChvNfe)},oPanel1,240,008,'',,CLR_BLACK,CLR_WHITE,,,,.T.,"",,,.F.,.F.,,.F.,.F.,"","cChvNfe",,)
@ 032,016 MSCOMBOBOX oBox1 VAR c103Tipo ITEMS aCombo1 SIZE 150,100 OF oDlg1 PIXEL
oBtn1 := TButton():New( 056,068,"Confirmar",oPanel1,{|| TipoCombo(@cRetPE,aCombo1,c103Tipo,aAuxCombo1,"1") },056,012,,,,.T.,,"",,,,.F. )
cEstBtn1 := "QPushButton {"
cEstBtn1 += " background-image: url(rpo:PTX_Refresh.png);"
cEstBtn1 += " background-repeat: none; "
cEstBtn1 += " background-attachment: fixed; "
cEstBtn1 += " background-position: left center; "
cEstBtn1 += " border-style: outset;"
cEstBtn1 += " border-width: 2px;"
cEstBtn1 += " border: 1px solid #C0C0C0;"
cEstBtn1 += " border-radius: 5px;"
cEstBtn1 += " border-color: #C0C0C0;"
cEstBtn1 += " font: bold 12px Arial;"
cEstBtn1 += " color: #ffffff; "
cEstBtn1 += " padding: 6px;"
cEstBtn1 += "} "
cEstBtn1 += "QPushButton:hover { "
cEstBtn1 += " background-color: #cecef6;"
cEstBtn1 += " border-style: inset;"
cEstBtn1 += " opacity: 0.2; "
cEstBtn1 += "} "
cEstBtn1 += "QPushButton:pressed {"
cEstBtn1 += " background-color: #e6e6f9;"
cEstBtn1 += " border-style: inset;"
cEstBtn1 += "} "
oBtn1:SetCss(cEstBtn1)
oDlg1:Activate(,,,.T.)
If Empty(cRetPE)
cRetPE := "N"
EndIf
Return cRetPE
Static Function TipoCombo(cVariavel,aCombo,cCombo,aReferencia,cIdent)
Local nPos := aScan(aCombo,cCombo)
Local lRet := (nPos > 0)
If nPos > 0
cVariavel := aReferencia[nPos]
EndIf
oDlg1:End()
Return (lRet)
P018UM
Ponto de entrada que realiza a conversão de unidade de medida de acordo com a ZZW.
Parâmetros:
- ParamIxb[1]: Unidade de medida do XML.
- ParamIxb[2]: Quantidade do produto do XML.
- ParamIxb[3]: Total do item do XML.
- ParamIxb[4]: Valor unitário do item no XML.
- ParamIxb[5]: Número do Pedido de Compra.
- ParamIxb[6]: Item do Pedido de Compra.
Retorno:
O retorno é efetuado nas variáveis privadas abaixo.
- cUnMed1: caracter, Primeira Unidade de Medida D1_UM.
- nQtdUM1: caracter, Quantidade na primeira Unidade de Medida.
- cUnMed2: caracter, Segunda Unidade de Medida utilizada.
- nQtdUM2: caracter, Quantidade na Segunda Unidade de Medida utilizada.
- nVlrUM1: caracter, Valor Unitário na Primeira Unidade de Medida do Produto.
Segue exemplo de utilização.
User Function P018UM()
// Local cUmXml := ParamIxb[1]
Local nQtdXML := ParamIxb[2]
Local nTotalXml := ParamIxb[3]
// Local nUnitXml := ParamIxb[4]
Local nQtConv := 0
dbSelectArea("ZZW")
ZZW->(dbSetOrder(2)) //ZZW_FILIAL+ZZW_FORNEC+ZZW_LOJA+ZZW_PRODUT
If ZZW->(dbSeek(xFilial("ZZW") + SA2->A2_COD + SA2->A2_LOJA + SB1->B1_COD ))
If !Empty(ZZW->ZZW_SEGUM) .And. !Empty(ZZW->ZZW_CONV) .And. !Empty(ZZW->ZZW_TIPCON)
nQtConv := U_PTXConvUm( SB1->B1_COD, 0, nQtdXML, 1 )
If nQtConv > 0
//|Retorno |
cUnMed1 := SB1->B1_UM //|Primeira Unidade de Medida D1_UM |
nQtdUM1 := nQtConv //|Qtd UM 1 D1_QUANT |
cUnMed2 := ZZW->ZZW_SEGUM
nQtdUM2 := nQtdXML
//IF SAH->(dbSeek(xFilial("SAH") + cUnidMed )) //AH_FILIAL, AH_UNIMED, R_E_C_N_O_, D_E_L_E_T_
// cUnMed2 := cUnidMed //|Segunda Unidade de Medida D1_SEGUM |
// nQtdUM2 := nQuant //|Qtd UM 2 D1_QTSEGUM |
//ENDIF
nVlrUM1 := nTotalXml / nQtConv //|Valor Unit UM 1 D1_VUNIT |
EndIf
EndIf
EndIf
Return
P018ZZW
Ponto de entrada para manutenções após inclusão da ZZW. Nesse momento já está posicionado na ZZW incluída.
Segue exemplo de utilização.
User Function P018ZZW()
Local aArea := GetArea()
Local cQuery := ""
cQuery += " SELECT A5_FORNECE "
cQuery += " FROM " + RetSqlName("SA5") + " SA5 "
cQuery += " WHERE A5_FILIAL = " + ValToSql( xFilial("SA5") )
cQuery += " AND A5_FORNECE = " + ValToSql( ZZW->ZZW_FORNEC )
cQuery += " AND A5_LOJA = " + ValToSql( ZZW->ZZW_LOJA )
cQuery += " AND A5_PRODUTO = " + ValToSql( ZZW->ZZW_PRODUT )
cQuery += " AND A5_CODPRF = " + ValToSql( ZZW->ZZW_CODPRF )
cQuery += " AND SA5.D_E_L_E_T_ = '' "
If Select("__SA5") > 0
__SA5->( dbCloseArea() )
EndIf
cQuery := ChangeQuery(cQuery)
dbUseArea( .T., "TOPCONN", TCGenQry(,,cQuery), "__SA5", .T., .T. )
__SA5->( dbGoTop() )
//|Caso não exista cadastrado |
If __SA5->( EoF() )
RecLock("SA5", .T.)
SA5->A5_FILIAL := xFilial("SA5")
SA5->A5_FORNECE := ZZW->ZZW_FORNEC
SA5->A5_LOJA := ZZW->ZZW_LOJA
SA5->A5_PRODUTO := ZZW->ZZW_PRODUT
SA5->A5_CODPRF := ZZW->ZZW_CODPRF
SA5->( MsUnLock() )
EndIf
RestArea( aArea )
Return
PT006XML
Ponto de Entrada para realizar ações após a importação do CTE.
Segue exemplo de utilização.
user function PT006XML()
Local aArea := GetArea()
Local aAreaZZZ := ZZZ->(GetArea())
dbSelectArea("ZZZ")
ZZZ->(dbSetOrder(1))
ZZZ->(dbSeek(xFilial("ZZZ") + "32171001928075005835550020000243931464892230"))
If !Empty(ZZZ->ZZZ_XML)
//|Chama rotina para gerar o documento de entrada |
fClassDev()
EndIf
RestArea(aAreaZZZ)
RestArea(aArea)
return
Static Function fClassDev()
Local cError := ""
Local cWarning := ""
Local cCliente := ""
Local cLoja := ""
Local cEmissao := ""
Local cNumNf := ""
Local cSerie := ""
Local cCnpjEmi := ""
Local cCfoDev := SuperGetMV("MV_YCFODEV",.F.,"201/411/410")
Local aArea := GetArea()
Local aItTemp := {}
Local aItens := {}
Local nI := 0
Local lDevol := .F.
Local oXml := NIL
oXml := XmlParser( ZZZ->ZZZ_XML, "_", @cError, @cWarning )
If !Empty(alltrim(cError))
oXml := NIL
EndIf
If oXml <> NIL
//Tratamento caso o xml possua a tag NFEPROC
if XmlChildEx(oXml, "_NFEPROC") <> nil
oXml := XmlChildEx(oXml, "_NFEPROC")
endif
if XmlChildEx(oXml, "_NFE") == nil
oXml := NIL
elseIf ValType(oXml:_NFE:_INFNFE:_DET) <> "A"
XmlNode2Arr(oXml:_NFE:_INFNFE:_DET,"_DET")
EndIf
endif
If oXml <> nil
aItens := oXml:_NFE:_INFNFE:_DET
For nI := 1 To Len(aItens)
If XmlChildEx(aItens[1]:_PROD, "_CFOP") <> Nil
If SubStr(aItens[nI]:_PROD:_CFOP:TEXT,2,3) $ cCfoDev
lDevol := .T.
Exit
EndIf
EndIf
Next nI
//|Nota Fiscal de Devolução |
If lDevol
//|Valida cliente emissor da devolução |
cCnpjEmi := PadR(Alltrim(oXml:_NFE:_INFNFE:_EMIT:_CNPJ:TEXT),TamSX3("A1_CGC")[1])
dbSelectArea("SA1")
SA1->(dbSetOrder(3))
If SA1->(dbSeek(xFilial("SA2") + cCnpjEmi))
cCliente := SA2->A2_COD
cLoja := SA2->A2_LOJA
Else
ConOut("###### ERRO -> CLIENTE NAO ENCONTRADO - CNPJ: " + cCnpjEmi)
Return
EndIf
cEmissao := IIf(XmlChildEx(oXml:_NFE:_INFNFE:_IDE, "_DHEMI")<>nil,ConvDate(Substr(oXml:_NFE:_INFNFE:_IDE:_DHEMI:TEXT,1,10)),"")
cNumNf := PadL(AllTrim(oXml:_NFE:_INFNFE:_IDE:_NNF:TEXT),TamSX3("F1_DOC")[1],"0")
cSerie := AllTrim(oXml:_NFE:_INFNFE:_IDE:_SERIE:TEXT)
dbSelectArea("SF1")
SF1->(dbSetOrder(1))
If SF1->(dbSeek(xFilial("SF1")+ PadL(Alltrim(cNumNf),TamSX3("F1_DOC")[1]) + PadR(cSerie,TamSX3("F1_SERIE")[1]) + ;
PadR(Alltrim(cCliente),TamSX3("F1_FORNECE")[1]) + PadR(cLoja,TamSX3("F1_LOJA")[1])))
ConOut("###### ERRO -> Nota No.: "+ Alltrim(SF1->F1_DOC)+"/"+SF1->F1_SERIE+" do Fornec. "+SF1->F1_FORNECE+"/"+SF1->F1_LOJA+" Ja Existe. A Importacao sera interrompida!!")
Return
EndIf
If Type("oXml:_NfeProc")<> "U"
oNF := oXml:_NFeProc:_NFe
Else
If Type("oXml:_NFe")<> "U"
oNF := oXml:_NFe
Else
ConOut('O arquivo informado nao esta no formato XML ou esta corrompido.')
Return
EndIf
EndIf
//|Rotina para gerar o documento de entrada |
SFP001()
EndIf
EndIf
Return
Static Function SFP001()
Local aCabec := {}
Local aItens := {}
Local nX := 1
Private aXML := {}
Private oEmitente := oNF:_InfNfe:_Emit
Private oIdent := oNF:_InfNfe:_IDE
Private oDestino := oNF:_InfNfe:_Dest
Private oTotal := oNF:_InfNfe:_Total
Private oTransp := oNF:_InfNfe:_Transp
Private oDet := oNF:_InfNfe:_Det
If Type("oNF:_InfNfe:_ICMS")<> "U"
Private oICM := oNF:_InfNfe:_ICMS
Else
Private oICM := nil
Endif
Private oFatura := IIf(Type("oNF:_InfNfe:_Cobr")=="U",Nil,oNF:_InfNfe:_Cobr)
Private cEdit1 := Space(15)
Private _DESCdigit := space(55)
Private _NCMdigit := space(8)
Private cChave := oNFe:_NFeProc:_protNFe:_infProt:_chNFe:TEXT
oDet := IIf(ValType(oDet)=="O",{oDet},oDet)
aAdd(aCabec,{"F1_TIPO" ,"D" ,Nil,Nil})
aAdd(aCabec,{"F1_FORMUL" ,"N" ,Nil,Nil})
aAdd(aCabec,{"F1_DOC" ,Alltrim(oIdent:_nNF:TEXT) ,Nil,Nil})
aAdd(aCabec,{"F1_SERIE" ,oIdent:_serie:TEXT ,Nil,Nil})
If(Type("oNF:_InfNfe:_infAdic:_infCpl:TEXT")<>"U")
aAdd(aCabec,{"F1_MENNOTA",oNF:_InfNfe:_infAdic:_infCpl:TEXT ,Nil,Nil})
EndIf
cCodTrans := Transp()
Volumes()
If AllTrim(cCodTrans) != ""
aAdd(aCabec,{"F1_TRANSP", cCodTrans,Nil,Nil})
EndIf
If(Type("oTransp:_VeicTransp:_Placa:TEXT")<>"U")
aAdd(aCabec,{"F1_PLACA", oTransp:_VeicTransp:_Placa:TEXT,Nil,Nil})
Endif
cCgc := StrTran(cCnpjEmi,',','')
cCgc := StrTran(cCgc,'.','')
cCgc := StrTran(cCgc,'/','')
cCgc := StrTran(cCgc,'-','')
dbSelectArea("SA1")
SA1->(dbSetOrder(3))
SA1->(dbSeek(xFilial("SA1") + cCgc))
cData := ""
If Type('oIdent:_dEmi:TEXT') <> "U"
cData := Alltrim(oIdent:_dEmi:TEXT)
EndIf
If cData == "" .And. Type('oIdent:_dhEmi:TEXT') <> "U"
cData := SubStr(Alltrim(oIdent:_dhEmi:TEXT),1, 10)
EndIf
If Empty(cData)
cData := DToS(dDatabase)
EndIf
dData := CtoD(Right(cData,2)+'/'+Substr(cData,6,2)+'/'+Left(cData,4))
aAdd(aCabec,{"F1_EMISSAO",dData,Nil,Nil})
aAdd(aCabec,{"F1_FORNECE",SA1->A1_COD,Nil,Nil})
aAdd(aCabec,{"F1_LOJA" ,SA1->A1_LOJA,Nil,Nil})
aAdd(aCabec,{"F1_ESPECIE","SPED",Nil,Nil})
aAdd(aCabec,{"F1_CHVNFE",cChave,Nil,Nil})
For nX := 1 To Len(oDet)
cItemXml := oDet[nZ]:_NITEM:TEXT
aXML := {oDet[nZ]}
If Empty(aXML)
ConOut("##### ERRO -> Falha na estrutura do array!!")
Return .F.
EndIf
cProduto := PadR(AllTrim(aXML[nX]:_Prod:_cProd:TEXT),20)
cUnidMed := Right(AllTrim(aXML[nX]:_Prod:_uCom:TEXT),2)
dbSelectArea("SB1")
SB1->(dbSetOrder(1))
SB1->(dbSeek(xFilial("SB1")+ PadR(cProduto,TamSX3("B1_COD")[1])))
aLinha := {}
cNCM := IIf(Type("aXML[1]:_Prod:_NCM")=="U",space(12),aXML[1]:_Prod:_NCM:TEXT)
Chkproc := .F.
// DEFINIR AS QUANTIDADES / PREÇO UNITARIO / PRIMEIRA E SEGUNDA UM
nQtdOri := 0
If Val(aXML[nX]:_Prod:_qCom:TEXT) != 0
nQtdOri := Val(aXML[nX]:_Prod:_qCom:TEXT)
Else
nQtdOri := Val(aXML[nX]:_Prod:_qTrib:TEXT)
EndIf
nQtdUM1 := 0 // Qtd UM 1
nQtdUM2 := 0 // Qtd UM 2
nVlrUM1 := 0 // Valor Unit UM 1
If cUnidMed == SB1->B1_UM
nQtdUM1 := nQtdOri
nQtdUM2 := 0
nVlrUM1 := Val(aXML[nX]:_Prod:_vProd:TEXT) / nQtdOri
ElseIf SB1->B1_CONV > 0
nQtdUM1 := ConvUM(SB1->B1_COD, 0, nQtdOri, 1) // PRI UM
nQtdUM2 := nQtdOri // SEG UM
nVlrUM1 := Val(aXML[nX]:_Prod:_vProd:TEXT) / nQtdUM1 // nQtdUM2
lSegUM := .T.
Else
nQtdUM1 := nQtdOri
nQtdUM2 := 0
nVlrUM1 := Val(aXML[nX]:_Prod:_vProd:TEXT) / nQtdOri
EndIf
aAdd(aLinha,{"D1_COD" ,SB1->B1_COD,Nil,Nil})
aAdd(aLinha,{"D1_QUANT" ,nQtdUM1,Nil,Nil})
If nQtdUM2 > 0
aAdd(aLinha,{"D1_QTSEGUM",nQtdUM2,Nil,Nil})
EndIf
aAdd(aLinha,{"D1_VUNIT",Round(nVlrUM1,6),Nil,Nil})
nQdeOrig := nQtdOri
aAdd(aLinha,{"D1_TOTAL",Val(aXML[nX]:_Prod:_vProd:TEXT),Nil,Nil})
If Type('aXML[nX]:_Prod:_vOutro:TEXT') != 'U'
aadd(aLinha,{"D1_DESPESA",Val(aXML[nX]:_Prod:_vOutro:TEXT),Nil,Nil})
EndIf
If Type('aXML[nX]:_Prod:_vFrete:TEXT') != 'U'
aadd(aLinha,{"D1_VALFRE",Val(aXML[nX]:_Prod:_vFrete:TEXT),Nil,Nil})
EndIf
If Type('aXML[nX]:_Prod:_vSeg:TEXT') != 'U'
aadd(aLinha,{"D1_SEGURO",Val(aXML[nX]:_Prod:_vSeg:TEXT),Nil,Nil})
EndIf
If Type('aXML[nX]:_Prod:_vDesc:TEXT') != 'U'
aadd(aLinha,{"D1_VALDESC",Val(aXML[nX]:_Prod:_vDesc:TEXT),Nil,Nil})
EndIf
cItem := StrZero(nX, TamSX3("D1_ITEM"[1]))
aadd(aLinha,{"D1_TIPO", "D",Nil,Nil})
_cfop:=aXML[nX]:_Prod:_CFOP:TEXT
If Left(Alltrim(_cfop),1)="5"
_cfop:=Stuff(_cfop,1,1,"1")
Else
_cfop:=Stuff(_cfop,1,1,"2")
EndIf
If Type("oDet[nX]:_Prod:_vDesc")<> "U"
aadd(aLinha,{"D1_VALDESC",Val(aXML[nX]:_Prod:_vDesc:TEXT),Nil,Nil})
Else
aadd(aLinha,{"D1_VALDESC",0,Nil,Nil})
EndIf
If Type("aXML[nX]:_Imposto:_IPI:_IPITrib") != "U"
oIPI := aXML[nX]:_Imposto:_IPI:_IPITrib
aadd(aLinha,{"D1_VALIPI",VAL(oIPI:_vIPI:TEXT),,Nil})
If Type("aXML[nX]:_Imposto:_IPI:_IPITrib:_pIPI") <> "U"
aadd(aLinha,{"D1_IPI" ,VAL(oIPI:_pIPI:TEXT),,Nil})
EndIf
EndIf
Do Case
Case Type("aXML[nX]:_Imposto:_ICMS:_ICMS00")<> "U"
oICM:=aXML[nX]:_Imposto:_ICMS:_ICMS00
Case Type("aXML[nX]:_Imposto:_ICMS:_ICMS10")<> "U"
oICM:=aXML[nX]:_Imposto:_ICMS:_ICMS10
Case Type("aXML[nX]:_Imposto:_ICMS:_ICMS20")<> "U"
oICM:=aXML[nX]:_Imposto:_ICMS:_ICMS20
Case Type("aXML[nX]:_Imposto:_ICMS:_ICMS30")<> "U"
oICM:=aXML[nX]:_Imposto:_ICMS:_ICMS30
Case Type("aXML[nX]:_Imposto:_ICMS:_ICMS40")<> "U"
oICM:=aXML[nX]:_Imposto:_ICMS:_ICMS40
Case Type("aXML[nX]:_Imposto:_ICMS:_ICMS51")<> "U"
oICM:=aXML[nX]:_Imposto:_ICMS:_ICMS51
Case Type("aXML[nX]:_Imposto:_ICMS:_ICMS60")<> "U"
oICM:=aXML[nX]:_Imposto:_ICMS:_ICMS60
Case Type("aXML[nX]:_Imposto:_ICMS:_ICMS70")<> "U"
oICM:=aXML[nX]:_Imposto:_ICMS:_ICMS70
Case Type("aXML[nX]:_Imposto:_ICMS:_ICMS90")<> "U"
oICM:=aXML[nX]:_Imposto:_ICMS:_ICMS90
EndCase
If Type("oICM:_orig:TEXT")<> "U"
cOrigProd := oICM:_orig:TEXT
EndIf
aAdd(aLinha,{"AUTDELETA" ,"N",,Nil})
//|Vincula a NF de origem da devolução |
dbSelectArea("SD2")
SD2->(dbSetOrder(3))
If SD2->(dbSeek(xFilial("SD2") + PADL(Alltrim(oIdent:_nNF:TEXT),TamSX3("F2_DOC")[1]) + PADL(Alltrim(oIdent:_serie:TEXT),TamSX3("F2_DOC")[1]) +;
SA1->A1_COD + SA1->A1_LOJA + SB1->B1_COD))
aAdd(aLinha,{"D1_NFORI" ,SD2->D2_DOC,,Nil})
aAdd(aLinha,{"D1_SERIORI" ,SD2->D2_SERIE,,Nil})
aAdd(aLinha,{"D1_ITEMORI" ,SD2->D2_ITEM,,Nil})
Else
ConOut("##### ERRO -> NAO FOI POSSIVEL ENCONTRAR A NF ORIGINAL DA DEVOLUCAO NA SD2!")
Return
EndIf
aAdd(aItens,aLinha)
Next nX
If Len(aItens) > 0
Private lMsErroAuto := .F.
Private lMsHelpAuto := .T.
SB1->( dbSetOrder(1) )
SA2->( dbSetOrder(1) )
//|Gera o documento de entrada classificado |
Begin Transaction
nModulo := 4 //Estoque
MSExecAuto({|x,y,Z| MATA103(x,y,z)},aCabec,aItens,3,.F.)
If lMsErroAuto
DisarmTransaction()
ConOut(MostraErro())
Else
ConOut("-----> GERADO DOCUMENTO DE ENTRADA DA DEVOLUCAO COM SUCESSO <-----")
//|Altera o status para classificado |
RecLock("ZZZ",.F.)
ZZZ->ZZZ_OK := "C"
ZZZ->(MsUnLock())
EndIf
End Transaction
MsUnlockAll()
EndIf
Return
/*
------------------------------------------------------------------------------------------------------------
Função : Transp
Tipo : Função de Usuário
Descrição : Consulta o código da transportadora, caso a mesma esteja cadastrado
Parâmetros :
Retorno : Código da transportadora
------------------------------------------------------------------------------------------------------------
Atualizações:
- 20/07/2016 - Pontin - Construção inicial do fonte
------------------------------------------------------------------------------------------------------------
*/
Static Function Transp()
Local cDoc := ""
Local cCodigo := ""
If Type("oTransp:_Transporta:_CNPJ:TEXT")<>"U"
cDoc := oTransp:_Transporta:_CNPJ:TEXT
ElseIf Type("oTransp:_Transporta:_CPF:TEXT")<>"U"
cDoc := oTransp:_Transporta:_CPF:TEXT
EndIf
If AllTrim(cDoc) == ""
Return()
EndIf
cCodigo := Posicione("SA4", 3, XFILIAL("SA4")+cDoc, "A4_COD")
Return cCodigo
/*
------------------------------------------------------------------------------------------------------------
Função : Volumes
Tipo : Função de Usuário
Descrição : Cadastra os valores referentes ao volume da nota fiscal
Parâmetros :
Retorno :
------------------------------------------------------------------------------------------------------------
Atualizações:
- 30/07/2015 - Pontin - Construção inicial do fonte
------------------------------------------------------------------------------------------------------------
*/
Static Function Volumes()
If Type("oTransp:_Vol:_PesoL" )!="U"
aadd(aCabec,{"F1_PESOL" ,Val(oTransp:_Vol:_PesoL:TEXT) ,Nil,Nil})
EndIf
If Type("oTransp:_Vol:_PesoL" )!="U"
aadd(aCabec,{"F1_PLIQUI" ,Val(oTransp:_Vol:_PesoL:TEXT) ,Nil,Nil})
EndIf
If Type("oTransp:_Vol:_PesoB" )!="U"
aadd(aCabec,{"F1_PBRUTO" ,Val(oTransp:_Vol:_PesoB:TEXT) ,Nil,Nil})
EndIf
If Type("oTransp:_Vol:_Esp" )!="U"
aadd(aCabec,{"F1_ESPECI1" ,oTransp:_Vol:_Esp:TEXT ,Nil,Nil})
EndIf
If Type("oTransp:_Vol:_nVol" )!="U" .And. val(oTransp:_Vol:_nVol:TEXT) <= 999999
aadd(aCabec,{"F1_VOLUME1" ,val(oTransp:_Vol:_nVol:TEXT) ,Nil,Nil})
EndIf
Return
PT015ITE
Ponto de Entrada na abertura da tela de classificação do documento de entrada. Chamado para cada item do documento de entrada.
Parâmetros:
- ParamIxb[1]: Array de dados da Linha.
- ParamIxb[2]: Número da linha.
Segue exemplo de utilização.
User Function PT015ITE()
Local aDados := ParamIxb[1]
Local nLinha := ParamIxb[2]
Local aArea := GetArea()
Local nPOSTES := ASCAN(aHEADER,{|X|ALLTRIM(UPPER(X[2])) == "D1_TES"})
Local nPOSCFOP := ASCAN(aHEADER,{|X|ALLTRIM(UPPER(X[2])) == "D1_CF"})
Local cCodTES := ""
If !Empty(aCols[nLinha,nPOSTES]) .And. AllTrim(SF1->F1_ESPECIE) == "CTE"
cCodTES := aCols[nLinha,nPOSTES]
dbSelectArea("SF4")
SF4->(dbSetOrder(1))
SF4->(dbSeek(xFilial("SF4") + cCodTES))
aCols[nLinha,nPOSCFOP] := SF4->F4_CF
MaFisLoad("IT_TES","",nLinha)
MaFisAlt("IT_TES",cTes,nLinha)
MaFisLoad("IT_CF","",nLinha)
MaFisAlt("IT_CF",SF4->F4_CF,nLinha)
MaFisToCols(aHeader,aCols,nLinha,"MT100")
//A103Trigger("D1_COD")
EndIf
RestArea(aArea)
Return
PT024CTE
Ponto de Entrada para realizar ações após a importação do CTE.
Segue exemplo de utilização.
user function PT024CTE()
Private lJob := IsBlind()
If !Empty(ZZZ->ZZZ_XML)
//|Chama rotina para gerar o documento de entrada |
If !lJob
If MsgYesNo("Deseja gerar a entrada automática do frete selecionado?",FunName()) .And. ZZZ->ZZZ_TIPO == "2"
MsgRun("Gerando entrada do frete","Processando",{|| fClassCte() })
EndIf
Else
fClassCte()
EndIf
EndIf
return
Static Function fClassCte()
Local aArea := GetArea()
Local aCabNF := {}
Local aItem := {}
Local aTotItem := {}
Local aAreaSM0 := {}
Local aDadosCfo := {}
Local cAlias := ""
Local cProduto := ""
Local cTes := ""
Local cAviso := ""
Local cErro := ""
Local cDoc := ""
Local cSerie := ""
Local cDtCte := ""
Local cCNPJ := ""
Local cCnpjEmp := ""
Local cIdCte := ""
Local cNewFil := ""
Local cOldFil := ""
Local cChvCte := ""
Local cChvSF2 := ""
Local cMsg := ""
Local cCfop := ""
Local cProdXML := "ATHOS"
Local dDtCte := CtoD(" ")
Local nVlrFrete := 0
Local nBaseIcms := 0
Local nAliqIcms := 0
Local nVlrIcms := 0
Private oCTe := Nil
If Empty(ZZZ->ZZZ_XML)
cMsg := "------> ERRO: CTE SEM XML <------"
If lJob
//ConOut(cMsg)
Else
MsgStop(cMsg)
EndIf
Return
EndIf
oCTe := XmlParser( ZZZ->ZZZ_XML, "_", @cAviso, @cErro )
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_NCT" ) <> "U"
cDoc := Alltrim(oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_NCT:TEXT )
EndIf
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_SERIE" ) <> "U"
cSerie := oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_SERIE:TEXT
EndIf
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_DHEMI" ) <> "U"
cDtCte := oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_DHEMI:TEXT
dDtCte := Ctod( ( SubStr( cDtCte, 9, 2 ) + "/" + SubStr( cDtCte, 6, 2 ) + "/" + SubStr( cDtCte, 1, 4 ) ) )
EndIf
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_EMIT:_CNPJ" ) <> "U"
cCNPJ := oCTe:_CTEPROC:_CTE:_INFCTE:_EMIT:_CNPJ:TEXT
EndIf
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_VPREST:_VTPREST" ) <> "U"
nVlrFrete := Val( oCTe:_CTEPROC:_CTE:_INFCTE:_VPREST:_VTPREST:TEXT )
EndIf
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_IMP:_ICMS:_ICMS00:_VBC" ) <> "U"
nBaseIcms := Val( oCTe:_CTEPROC:_CTE:_INFCTE:_IMP:_ICMS:_ICMS00:_VBC:TEXT )
EndIf
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_IMP:_ICMS:_ICMS00:_PICMS" ) <> "U"
nAliqIcms := Val( oCTe:_CTEPROC:_CTE:_INFCTE:_IMP:_ICMS:_ICMS00:_PICMS:TEXT )
EndIf
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_IMP:_ICMS:_ICMS00:_VICMS" ) <> "U"
nVlrIcms := Val( oCTe:_CTEPROC:_CTE:_INFCTE:_IMP:_ICMS:_ICMS00:_VICMS:TEXT )
EndIf
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_ID" ) <> "U"
cIdCte := StrTran( ( oCTe:_CTEPROC:_CTE:_INFCTE:_ID:TEXT ), "CTe", "" )
EndIf
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_INFCTENORM:_INFDOC:_INFNFE:_CHAVE" ) <> "U"
cChvSF2 := oCTe:_CTEPROC:_CTE:_INFCTE:_INFCTENORM:_INFDOC:_INFNFE:_CHAVE:TEXT
EndIf
/*
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA03:_TOMA" ) <> "U"
If oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA03:_TOMA:TEXT == "0"
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_REM:_CNPJ" ) <> "U"
cCnpjEmp := oCTe:_CTEPROC:_CTE:_INFCTE:_REM:_CNPJ:TEXT
EndIf
ElseIf oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA03:_TOMA:TEXT == "1"
MsgInfo("Problema na importação do CTE " + cDoc)
ElseIf oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA03:_TOMA:TEXT == "2"
MsgInfo("Problema na importação do CTE " + cDoc)
ElseIf oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA03:_TOMA:TEXT == "3"
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_DEST:_CNPJ" ) <> "U"
cCnpjEmp := oCTe:_CTEPROC:_CTE:_INFCTE:_DEST:_CNPJ:TEXT
EndIf
EndIf
EndIf
*/
//|Informações do destinatário |
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA03:_TOMA" ) <> "U"
If oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA03:_TOMA:TEXT == "0"
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_REM:_CNPJ" ) <> "U"
cCnpjEmp := oCTe:_CTEPROC:_CTE:_INFCTE:_REM:_CNPJ:TEXT
EndIf
ElseIf oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA03:_TOMA:TEXT == "1"
MsgInfo("Problema na importação do CTE " + cDoc)
ElseIf oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA03:_TOMA:TEXT == "2"
MsgInfo("Problema na importação do CTE " + cDoc)
ElseIf oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA03:_TOMA:TEXT == "3"
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_DEST:_CNPJ" ) <> "U"
cCnpjEmp := oCTe:_CTEPROC:_CTE:_INFCTE:_DEST:_CNPJ:TEXT
EndIf
EndIf
Else
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA3:_TOMA" ) <> "U"
If oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA3:_TOMA:TEXT == "0"
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_REM:_CNPJ" ) <> "U"
cCnpjEmp := oCTe:_CTEPROC:_CTE:_INFCTE:_REM:_CNPJ:TEXT
EndIf
ElseIf oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA3:_TOMA:TEXT == "1"
MsgInfo("Problema na importação do CTE " + cDoc)
ElseIf oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA3:_TOMA:TEXT == "2"
MsgInfo("Problema na importação do CTE " + cDoc)
ElseIf oCTe:_CTEPROC:_CTE:_INFCTE:_IDE:_TOMA3:_TOMA:TEXT == "3"
If Type( "oCTe:_CTEPROC:_CTE:_INFCTE:_DEST:_CNPJ" ) <> "U"
cCnpjEmp := oCTe:_CTEPROC:_CTE:_INFCTE:_DEST:_CNPJ:TEXT
EndIf
EndIf
EndIf
EndIf
//|Tratamentos de segurança |
If Empty( cDoc )
cMsg := "------> ERRO: Numero do Documento não preenchido <------"
If lJob
//ConOut(cMsg)
Else
MsgStop(cMsg)
EndIf
Return
ElseIf Empty( cSerie )
cMsg := "------> ERRO: Serie do Documento não preenchido <------"
If lJob
//ConOut(cMsg)
Else
MsgStop(cMsg)
EndIf
Return
ElseIf Empty( cCNPJ )
cMsg := "------> ERRO: CNPJ do fornecedor não preenchido <------"
If lJob
//ConOut(cMsg)
Else
MsgStop(cMsg)
EndIf
Return
ElseIf nVlrFrete == 0
cMsg := "------> ERRO: Valor do frete zerado <------"
If lJob
//ConOut(cMsg)
Else
MsgStop(cMsg)
EndIf
Return
EndIf
dbSelectArea( "SF1" )
SF1->(dbSetOrder(1))
//|Busca o Fornecedor |
cAlias := GetNextAlias()
If Select(cAlias) > 0
dbSelectArea(cAlias)
(cAlias)->(dbCloseArea())
EndIf
BeginSql Alias cAlias
SELECT R_E_C_N_O_ AS REC
FROM %Table:SA2% SA2
WHERE A2_FILIAL = %xFilial:SA2%
AND A2_CGC = %Exp:cCNPJ%
AND A2_MSBLQL <> '1'
AND SA2.%NotDel%
EndSql
(cAlias)->(dbGoTop())
If (cAlias)->(EoF())
cMsg := "------> ERRO: NAO FOI POSSIVEL ENCONTRAR O FORNECEDOR PARA O CTE <------"
If lJob
//ConOut(cMsg)
Else
MsgStop(cMsg)
EndIf
Return
Else
dbSelectArea("SA2")
SA2->(dbSetOrder(1))
SA2->(dbGoTo((cAlias)->REC))
(cAlias)->(dbCloseArea())
EndIf
cProduto := SFP001(cProdXML)
cTes := SA2->A2_YTESCTE
If Empty(cProduto) .Or. Empty(cTes) .Or. Empty(SA2->A2_COND)
cMsg := "------> ERRO: NAO FOI POSSIVEL ENCONTRAR O PRODUTO, TES OU CONDICAO DE PAGAMENTO PARA O CTE <------"
If lJob
//ConOut(cMsg)
Else
MsgStop(cMsg)
EndIf
Return
EndIf
lMsErroAuto := .F.
//|Monta array cabecalho do CTE |
aCabNF := { {"F1_TIPO" , "N" , NIL},;
{"F1_FORMUL" , "" , NIL},;
{"F1_ESPECIE" , "CTE" , NIL},;
{"F1_DOC" , cDoc , NIL},;
{"F1_SERIE" , cSerie , NIL},;
{"F1_FORNECE" , SA2->A2_COD , NIL},;
{"F1_LOJA" , SA2->A2_LOJA , NIL},;
{"F1_EMISSAO" , dDtCte , NIL},;
{"F1_DTDIGIT" , dDtCte , NIL},;
{"F1_VALICM" , nVlrIcms , NIL},;
{"F1_CHVNFE" , cIdCte , NIL},;
{"F1_YCHVSF2" , cChvSF2 , NIL},;
{"F1_TPCTE" , "N" , NIL},;
{"F1_VALBRUT", nVlrFrete , NIL}}
dbSelectArea("SF4")
SF4->( dbSetOrder(1) )
If SF4->( dbSeek( xFilial("SF4") + cTes ) )
aDadosCfo := {}
aadd(aDadosCfo, {"OPERNF" , "E"})
aadd(aDadosCfo, {"TPCLIFOR", SA2->A2_TIPO})
aadd(aDadosCfo, {"UFDEST" , SA2->A2_EST})
aadd(aDadosCfo, {"INSCR" , SA2->A2_INSCR})
aadd(aDadosCfo, {"CONTR" , ""})
cCfop := MaFisCfo( , SF4->F4_CF, aDadosCfo )
EndIf
//|Array com o item do frete |
aItem := { {"D1_COD" , cProduto ,NIL},;
{"D1_QUANT" , 1 ,NIL},;
{"D1_VUNIT" , nVlrFrete ,NIL},;
{"D1_TOTAL" , nVlrFrete ,NIL},;
{"D1_FORNECE" , SA2->A2_COD ,NIL},;
{"D1_LOJA" , SA2->A2_LOJA ,NIL},;
{"D1_DOC" , cDoc ,NIL},;
{"D1_SERIE" , cSerie ,NIL},;
{"D1_TES" , cTes ,NIL},;
{"D1_CF" , cCfop ,NIL},;
{"D1_LOCAL" , SB1->B1_LOCPAD ,NIL},;
{"D1_BASEICM" , nBaseIcms ,NIL},;
{"D1_PICM" , nAliqIcms ,NIL},;
{"D1_VALICM" , nVlrIcms ,NIL},;
{"D1_TIPO" ,"N" ,NIL},;
{"D1_ITEM" ,"0001" ,Nil},;
{"AUTDELETA" ,"N" ,Nil}}
aAdd(aTotItem, aItem)
cNewFil := ""
cOldFil := cFilAnt
aAreaSM0 := SM0->(GetArea())
dbSelectArea("SM0")
SM0->(dbSetOrder(1))
SM0->( dbSeek( cEmpAnt ) )
While !SM0->( EoF() ) .And. AllTrim(SM0->M0_CODIGO) == cEmpAnt
If AllTrim(SM0->M0_CGC) == AllTrim(cCnpjEmp)
cNewFil := SM0->M0_CODFIL
Exit
EndIf
SM0->(dbSkip())
EndDo
RestArea(aAreaSM0)
If Empty(cNewFil)
cMsg := "------> ERRO: NAO FOI POSSIVEL ENCONTRAR FILIAL DE DESTINO DO CT-E <------"
If lJob
//ConOut(cMsg)
Else
MsgStop(cMsg)
EndIf
Return
EndIf
cFilAnt := cNewFil
cChvCte := cFilAnt + cDoc + Space(TamSx3("F1_DOC")[1]-Len(cDoc)) + cSerie + Space(TamSx3("F1_SERIE")[1]-Len(cSerie))+SA2->A2_COD+SA2->A2_LOJA
If !SF1->(dbSeek(cChvCte))
lGerou := .F.
//|Gera o documento de entrada classificado |
Begin Transaction
nModulo := 4 //Estoque
MSExecAuto({|x,y,Z| MATA103(x,y,z)},aCabNF,aTotItem,3,.F.)
If lMsErroAuto
DisarmTransaction()
If lJob
//ConOut(MostraErro())
Else
MostraErro()
EndIf
Else
cMsg := "-----> GERADO DOCUMENTO DE ENTRADA DO FRETE COM SUCESSO <-----"
If lJob
//ConOut(cMsg)
Else
MsgInfo(cMsg)
EndIf
//|Altera o status para classificado |
RecLock("ZZZ",.F.)
ZZZ->ZZZ_OK := "C"
ZZZ->(MsUnLock())
lGerou := .T.
//|Grava a chave de nota referenciada no CTe |
U_fChvOrig(oCTe,cChvCte)
EndIf
End Transaction
MsUnlockAll()
/*If lGerou
//|Preenche campo do tipo de CTE |
RecLock("SF1",.F.)
SF1->F1_TPCTE := "N"
SF1->(MsUnLock())
EndIf */
EndIf
RestArea(aArea)
Return
//|Função para busca o produto |
Static Function SFP001(cProdXML)
Local cProduto := ""
dbSelectArea("SA5")
SA5->(dbSetOrder(14)) //|FILIAL + FORNECEDOR + LOJA + CODIGO PRODUTO NO FORNECEDOR |
If SA5->(dbSeek(xFilial("SA5") + SA2->A2_COD + SA2->A2_LOJA + cProdXML))
dbSelectArea("SB1")
SB1->(dbSetOrder(1))
SB1->(dbSeek(xFilial("SB1") + SA5->A5_PRODUTO))
cProduto := SB1->B1_COD
EndIf
If Empty(cProduto)
cProduto := "DA.3127.20.001 "
EndIf
Return cProduto
User Function Forcado()
Local aTotItem := {}
Local aCabNF := {}
Local aItem := {}
lMsErroAuto := .F.
dbSelectArea("SA2")
SA2->(dbSetOrder(1))
SA2->(dbSeek(xFilial("SA2") + "00029901"))
//|Monta array cabecalho do CTE |
aCabNF := { {"F1_TIPO" , "N" , NIL},;
{"F1_FORMUL" , "" , NIL},;
{"F1_ESPECIE" , "CTE" , NIL},;
{"F1_DOC" , "998999" , NIL},;
{"F1_SERIE" , "1" , NIL},;
{"F1_FORNECE" , SA2->A2_COD , NIL},;
{"F1_LOJA" , SA2->A2_LOJA , NIL},;
{"F1_EMISSAO" , dDataBase , NIL},;
{"F1_DTDIGIT" , dDataBase , NIL},;
{"F1_VALICM" , 0 , NIL},;
{"F1_CHVNFE" , "32170401125797001198570120001917711168219529" , NIL},;
{"F1_TPCTE" , "N" , NIL},;
{"F1_VALBRUT", 100 , NIL}}
cCodTES := "001"
dbSelectArea("SF4")
SF4->(dbSetOrder(1))
SF4->(dbSeek(xFilial("SF4") + cCodTES))
//|Array com o item do frete |
aItem := { {"D1_COD" , "500021 " ,NIL},;
{"D1_QUANT" , 1 ,NIL},;
{"D1_VUNIT" , 100 ,NIL},;
{"D1_TOTAL" , 100 ,NIL},;
{"D1_FORNECE" , SA2->A2_COD ,NIL},;
{"D1_LOJA" , SA2->A2_LOJA ,NIL},;
{"D1_DOC" , "998899" ,NIL},;
{"D1_SERIE" , "1" ,NIL},;
{"D1_TES" , cCodTES ,NIL},;
{"D1_CF" , SF4->F4_CF ,NIL},;
{"D1_LOCAL" , "01" ,NIL},;
{"D1_BASEICM" , 0 ,NIL},;
{"D1_PICM" , 0 ,NIL},;
{"D1_VALICM" , 0 ,NIL},;
{"D1_TIPO" ,"N" ,NIL},;
{"D1_ITEM" ,"0001" ,Nil},;
{"AUTDELETA" ,"N" ,Nil}}
aAdd(aTotItem, aItem)
//|Gera o documento de entrada classificado |
Begin Transaction
nModulo := 4 //Estoque
MSExecAuto({|x,y,Z| MATA103(x,y,z)},aCabNF,aTotItem,3,.F.)
If lMsErroAuto
DisarmTransaction()
//ConOut(MostraErro())
Else
Alert("FOIIII")
EndIf
End Transaction
Return
PTCLIFOR
Ponto de entrada para retornar o cliente/fornecedor a ser utilizado.
Parâmetros:
- ParamIxb[1]: Array com Código, Loja e UF do cliente/fornecedor.
- ParamIxb[2]: CGC do cliente/fornecedor.
- ParamIxb[3]: Tabela que foi utilizada para pesquisar o cliente/fornecedor.
- ParamIxb[4]: Objeto com o XML a ser utilizado.
Retorno:
- aCliFor: array, código/loja/UF do cliente/fornecedor.
Segue exemplo de utilização.
User Function PTCLIFOR()
Local aCliFor := ParamIxb[1]
Local cCgc := ParamIxb[2]
Local cTipo := ParamIxb[3]
Local oObj := ParamIxb[4]
Local cQuery := ""
Local cInscEst := ""
Local cAlias := "__TBA1"
If Select(cAlias) > 0
(cAlias)->(dbCloseArea())
EndIf
If ZZZ->ZZZ_TIPO == "1" .And. Valtype(oObj) == "O"
cInscEst := IIf( XmlChildEx( oObj:_InfNfe:_EMIT, "_IE") != Nil, oObj:_InfNfe:_EMIT:_IE:TEXT, "" )
If cTipo == "SA1"
cQuery += " SELECT A1_CGC AS CGC,A1_MSBLQL AS BLOQUEIO,A1_COD AS CODIGO,A1_LOJA AS LOJA,A1_NOME AS NOME, A1_EST AS UF "
cQuery += " FROM " + RetSqlName("SA1") + " SA1 "
cQuery += " WHERE SA1.A1_FILIAL = " + ValToSql( xFilial("SA1") )
cQuery += " AND SA1.A1_CGC = " + ValToSql( cCgc )
If !Empty(cInscEst)
cQuery += " AND SA1.A1_INSCR = " + ValToSql(cInscEst)
EndIf
cQuery += " AND SA1.D_E_L_E_T_ = ' ' "
Else
cQuery += " SELECT A2_CGC AS CGC,A2_MSBLQL AS BLOQUEIO,A2_COD AS CODIGO,A2_LOJA AS LOJA,A2_NOME AS NOME, A2_EST AS UF "
cQuery += " FROM " + RetSqlName("SA2") + " SA2 "
cQuery += " WHERE SA2.A2_FILIAL = " + ValToSql( xFilial("SA2") )
cQuery += " AND SA2.A2_CGC = " + ValToSql( cCgc )
If !Empty(cInscEst)
cQuery += " AND SA2.A2_INSCR = " + ValToSql(cInscEst)
EndIf
cQuery += " AND SA2.D_E_L_E_T_ = ' ' "
EndIf
cQuery := ChangeQuery(cQuery)
dbUseArea(.T.,"TOPCONN",TCGenQry(,,cQuery),cAlias,.T.,.T.)
dbSelectArea(cAlias)
(cAlias)->(dbGoTop())
//|Alimenta array com as informacoes |
While !(cAlias)->( EoF() )
If (cAlias)->BLOQUEIO != "1"
aCliFor[1, 1] := (cAlias)->CODIGO
aCliFor[1, 2] := (cAlias)->LOJA
aCliFor[1, 3] := (cAlias)->UF
Exit
EndIf
(cAlias)->( dbSkip() )
EndDo
If Select(cAlias) > 0
(cAlias)->(dbCloseArea())
EndIf
EndIf
/*
aCliFor[1, 1] := Código cliente/fornecedor
aCliFor[1, 2] := Loja cliente/fornecedor
aCliFor[1, 3] := UF cliente/fornecedor
*/
Return aCliFor
PTCTEDAD
Ponto de entrada para manipular o objeto com os dados do CTE importados do XML.
Deverá retornar o objeto recebido no ParamIxb[1] na mesma estrutura que foi recebido.
Parâmetros:
- ParamIxb[1]: Objeto do CTE tratado e estruturado pela Ferramenta.
- ParamIxb[2]: Objeto do XML do CTE.
Retorno:
- oObj: object, Objeto do CTE com os dados a serem processados.
Segue exemplo de utilização.
User Function PTCTEDAD()
Local oObj := ParamIxb[1]
// Local oXml := ParamIxb[2] //|XML do CTE em formato objeto |
Local aArea := GetArea()
Local lImportaAuto := .T.
If oObj:lCteVenda
//|Possui chave vinculada |
If Len(oObj:aChavesVinculadas) > 0
If fIgnoraPorCFOP(oObj)
lImportaAuto := .F.
Else
oObj:cItemContabil := "999"
//|Grupo do produto deve utilizar o da NF de saída referenciada |
oObj:cGrupoProduto := fBuscaGrupoProduto(oObj)
//|Atualiza o centro de custo de acordo com o grupo do produto da NF de saída referenciada |
oObj:cCentroCusto := fBuscaCentroCusto(oObj)
//|Conta Contabil |
oObj:cContaContabil := fBuscaContaContabil(oObj)
EndIf
Else
lImportaAuto := .F.
EndIf
If !lImportaAuto
//|Limpar a variavel cCondPagamento quando quiser forçar a entrada via tela |
oObj:cCondPagamento := ""
EndIf
EndIf
RestArea(aArea)
Return oObj
Static Function fBuscaGrupoProduto(oObj)
Local cQuery := ""
Local cGrupo := ""
cQuery += " SELECT TOP 1 B1_GRUPO "
cQuery += " FROM " + RetSqlName("SF2") + " SF2 "
cQuery += " JOIN " + RetSqlName("SD2") + " SD2 "
cQuery += " ON D2_FILIAL = F2_FILIAL "
cQuery += " AND D2_DOC = F2_DOC "
cQuery += " AND D2_SERIE = F2_SERIE "
cQuery += " AND D2_CLIENTE = F2_CLIENTE "
cQuery += " AND D2_LOJA = F2_LOJA "
cQuery += " AND SD2.D_E_L_E_T_ = '' "
cQuery += " JOIN " + RetSqlName("SB1") + " SB1 "
cQuery += " ON B1_FILIAL = " + ValToSql( xFilial("SB1") )
cQuery += " AND B1_COD = D2_COD "
cQuery += " AND SB1.D_E_L_E_T_ = '' "
cQuery += " WHERE F2_FILIAL = " + ValToSql( oObj:cCodigoFilial )
cQuery += " AND F2_CHVNFE = " + ValToSql( oObj:aChavesVinculadas[1] )
cQuery += " AND SF2.D_E_L_E_T_ = '' "
If Select("__GRP") > 0
__GRP->( dbCloseArea() )
EndIf
TcQuery cQuery New Alias "__GRP"
__GRP->( dbGoTop() )
If !__GRP->( EoF() )
cGrupo := __GRP->B1_GRUPO
EndIf
Return cGrupo
Static Function fIgnoraPorCFOP(oObj)
Local cQuery := ""
Local lExisteCfop := .F.
Local cCFOPs := "5915,6915,5901,6901,5949,6949"
cQuery += " SELECT TOP 1 F2_DOC "
cQuery += " FROM " + RetSqlName("SF2") + " SF2 "
cQuery += " JOIN " + RetSqlName("SD2") + " SD2 "
cQuery += " ON D2_FILIAL = F2_FILIAL "
cQuery += " AND D2_DOC = F2_DOC "
cQuery += " AND D2_SERIE = F2_SERIE "
cQuery += " AND D2_CLIENTE = F2_CLIENTE "
cQuery += " AND D2_LOJA = F2_LOJA "
cQuery += " AND SD2.D_E_L_E_T_ = '' "
cQuery += " WHERE F2_FILIAL = " + ValToSql( oObj:cCodigoFilial )
cQuery += " AND F2_CHVNFE = " + ValToSql( oObj:aChavesVinculadas[1] )
cQuery += " AND D2_CF IN " + FormatIN( cCFOPs, "," )
cQuery += " AND SF2.D_E_L_E_T_ = '' "
If Select("__GRP") > 0
__GRP->( dbCloseArea() )
EndIf
TcQuery cQuery New Alias "__GRP"
__GRP->( dbGoTop() )
If !__GRP->( EoF() )
lExisteCfop := .T.
EndIf
Return lExisteCfop
Static Function fBuscaContaContabil(oObj)
Local cContaContabil := oObj:cContaContabil
//|Busca Natureza |
oObj:cNatureza := fBuscaNatureza(oObj)
If !Empty( oObj:cNatureza )
cContaContabil := Posicione( "SED", 1, xFilial("SED") + oObj:cNatureza, "SED->ED_DEBITO" )
EndIf
Return cContaContabil
Static Function fBuscaNatureza(oObj)
Local cEmpProc := "" as Character
Local cFilProc := "" as Character
Local cTipoDcto := "" as Character
Local cCodProduto := "" as Character
Local cGrupoProduto := "" as Character
Local cClieFor := "" as Character
Local cLoja := "" as Character
Local cCstIcms := "" as Character
Local cUF := "" as Character
Local cCfop := "" as Character
Local cTribProd := "" as Character
Local cTribCliFor := "" as Character
Local cTipoCliFor := "" as Character
Local cTemIcms := "" as Character
Local cTipoProd := "" as Character
Local cResposta := "" as Character
cEmpProc := oObj:cCodigoEmpresa
cFilProc := oObj:cCodigoFilial
cTipoDcto := IIf( oObj:lCteVenda, "CTEV", "CTEC" )
cClieFor := oObj:cCodigoFornecCliente
cLoja := oObj:cLojaFornecCliente
cUF := oObj:cUF_FornecCliente
cTribCliFor := oObj:cTrib_FornecCliente
cTipoCliFor := oObj:cTipo_FornecCliente
cCodProduto := oObj:cCodigoProduto
cGrupoProduto := oObj:cGrupoProduto
cTribProd := oObj:cGrupoTribProd
cTipoProd := oObj:cTipoProduto
cTemIcms := IIf( oObj:nValorIcms > 0, "S", "N" )
cCstIcms := oObj:cCstIcms
cCfop := oObj:cCfop
cResposta := U_PTXRegraProcesso(cEmpProc,cFilProc,cTipoDcto,"NATU",cCodProduto,cGrupoProduto,cClieFor,cLoja,cCstIcms,cUF,cCfop,cTribProd,cTribCliFor,cTipoCliFor,cTemIcms,cTipoProd)
Return cResposta
Static Function fBuscaCentroCusto(oObj)
Local cEmpProc := "" as Character
Local cFilProc := "" as Character
Local cTipoDcto := "" as Character
Local cCodProduto := "" as Character
Local cGrupoProduto := "" as Character
Local cClieFor := "" as Character
Local cLoja := "" as Character
Local cCstIcms := "" as Character
Local cUF := "" as Character
Local cCfop := "" as Character
Local cTribProd := "" as Character
Local cTribCliFor := "" as Character
Local cTipoCliFor := "" as Character
Local cTemIcms := "" as Character
Local cTipoProd := "" as Character
Local cResposta := "" as Character
cEmpProc := oObj:cCodigoEmpresa
cFilProc := oObj:cCodigoFilial
cTipoDcto := IIf( oObj:lCteVenda, "CTEV", "CTEC" )
cClieFor := oObj:cCodigoFornecCliente
cLoja := oObj:cLojaFornecCliente
cUF := oObj:cUF_FornecCliente
cTribCliFor := oObj:cTrib_FornecCliente
cTipoCliFor := oObj:cTipo_FornecCliente
cCodProduto := oObj:cCodigoProduto
cGrupoProduto := oObj:cGrupoProduto
cTribProd := oObj:cGrupoTribProd
cTipoProd := oObj:cTipoProduto
cTemIcms := IIf( oObj:nValorIcms > 0, "S", "N" )
cCstIcms := oObj:cCstIcms
cCfop := oObj:cCfop
cResposta := U_PTXRegraProcesso(cEmpProc,cFilProc,cTipoDcto,"CCUS",cCodProduto,cGrupoProduto,cClieFor,cLoja,cCstIcms,cUF,cCfop,cTribProd,cTribCliFor,cTipoCliFor,cTemIcms,cTipoProd)
Return cResposta
PTX01FIL
Ponto de entrada para filtrar o browse da Central XML-e (tabela ZZZ).
Retorno:
- cFiltro: character, expressão SQL de filtro da ZZZ.
Segue exemplo de utilização.
User Function PTX01FIL()
Local cFiltro as Character
Local cUsersNFSe as Character
cUsersNFSe := SuperGetMV("MV_YUSRNFS", .F., "")
If !Empty(cUsersNFSe) .And. !AllTrim(__cUserID) $ cUsersNFSe
cFiltro := " ZZZ_TIPO <> '3' "
EndIf
Return cFiltro
PTX0001MNU
Ponto de entrada para inserir opções no menu da rotina XML-e.
Retorno:
- aRet: array, array com os menus personalizados.
Segue exemplo de utilização.
User Function PTX0001MNU()
Local aRet := {}
Local aBotoes := {}
//|Adiciona os botões customizados |
aAdd(aBotoes, {"Botão 01", "Alert('Botão 01')", 0, 1, 0, Nil})
aAdd(aBotoes, {"Botão 02", "Alert('Botão 02')", 0, 1, 0, Nil})
//Retorno pra rotina
aAdd(aRet, "# Personalizados")
aAdd(aRet, aBotoes)
aAdd(aRet, 0)
aAdd(aRet, 1)
aAdd(aRet, 0)
aAdd(aRet, nil)
Return aRet
PTXF1DOC
Ponto de entrada para customizar o F1_DOC.
Parâmetros:
- ParamIxb[1]: Numero do documento fiscal processado.
- ParamIxb[2]: Objeto do documento fiscal (se for nfe, é o XML em forma de objeto).
- ParamIxb[3]: Indica que se trata de uma NFe.
Retorno:
- cRetorno: character, valor do F1_DOC a ser retornado.
Segue exemplo de utilização.
User Function PTXF1DOC()
Local cNumeroDoc := ParamIxb[1] //|Numero do documento fiscal processado |
Local oObj := ParamIxb[2] //|Objeto do documento fiscal (se for nfe, é o XML em forma de objeto) |
Local lNFe := ParamIxb[3] //|Indica que se trata de uma NFe |
Local cRetorno := cNumeroDoc //|Valor do F1_DOC a ser retornado |
If lNFe .And. ValType(oObj) == "O"
//|PERSONALIZE O cRetorno CONFORME SUA REGRA |
EndIf
Return cRetorno
PTXF1SER
Ponto de entrada para customizar o F1_SERIE.
Parâmetros:
- ParamIxb[1]: Serie do documento fiscal processado.
- ParamIxb[2]: Objeto do documento fiscal (se for nfe, é o XML em forma de objeto).
- ParamIxb[3]: Indica que se trata de uma NFe.
Retorno:
- cRetorno: character, valor do F1_SERIE a ser retornado.
Segue exemplo de utilização.
User Function PTXF1SER()
Local cSerieDoc := ParamIxb[1] //|Serie do documento fiscal processado |
Local oObj := ParamIxb[2] //|Objeto do documento fiscal (se for nfe, é o XML em forma de objeto) |
Local cTipoDoc := ParamIxb[3] //|Indica que se trata de uma NFe |
Local cRetorno := cSerieDoc //|Valor do F1_SERIE a ser retornado |
Local cCnpjFornec := ""
If cTipoDoc == "NFE" .And. ValType(oObj) == "O"
//|PERSONALIZE O cRetorno CONFORME SUA REGRA |
IIf(XmlChildEx(oObj:_INFNFE:_EMIT, "_CNPJ") <> Nil, cCnpjFornec := oObj:_INFNFE:_EMIT:_CNPJ:TEXT, '')
If Empty(cCnpjFornec)
IIf(XmlChildEx(oObj:_INFNFE:_EMIT, "_CPF") <> Nil, cCnpjFornec := oObj:_INFNFE:_EMIT:_CPF:TEXT, '')
EndIf
//|Verifica se é filial |
If SubStr( cCnpjFornec, 1, 8 ) == SubStr( SM0->M0_CGC, 1, 8 )
//|Muda a série para 2 digitos |
cRetorno := StrZero( Val(cRetorno), 2 )
EndIf
EndIf
Return cRetorno
PX011CTE
Ponto de entrada para alterar informações após a importação do CTE.
Parâmetros:
- ParamIxb[1]: Chave do índice utilizado no banco de dados para localizar o CTE.
- ParamIxb[2]: Objeto do XML do CTE.
Segue exemplo de utilização.
User Function PX011CTE()
Local cSeekSF1 := ParamIxb[1]
Private oXMLCTE := ParamIxb[2]
//|Grava a chave de nota referenciada no CTe |
U_fChvOrig(oXMLCTE,cSeekSF1)
Return
PX041VLD
Ponto de entrada que verifica se o CTE pode manifestar desacordo.
Parâmetros:
- ParamIxb[1]: Chave do CTE.
- ParamIxb[2]: Status do CTE na ferramenta. Referente ao campo ZZZ_OK.
Retorno:
- lValido: logical, retorna se deve seguir com o processo de manifestação de desacordo.
Segue exemplo de utilização.
User Function PX041VLD()
Local cChave := Paramixb[1]
Local cStatus := Paramixb[2]
Local cMsgErro := ""
Local lValido := .T.
If AllTrim(cStatus) $ "C/P"
cMsgErro := "Não é possível manifestar desacordo pois esse documento possui entrada." + CR
lValido := .F.
MsgStop(cMsgErro)
Endif
Return lValido
SAVEZZZ
Ponto de entrada para manipular a ZZZ após gravação. Nesse momento a ZZZ já está gravada e após o MsUnLock.
Parâmetros:
- ParamIxb[1]: Variável lógica para identificar se o documento é novo (.F.) e está sendo salvo pela primeira vez ou se é uma alteração de status no documento já gravado (.T.).
Segue exemplo de utilização.
User Function SAVEZZZ()
Local cTipoDocumento := ""
Local cError := ""
Local cTipoCTE := ""
Local oError := Nil
Local bError := ErrorBlock({|oError| cError := oError:Description})
Begin Sequence
If !Empty(ZZZ->ZZZ_XML) //|Em alguns casos (NF-e resumida) o XML chega depois |
If AllTrim(ZZZ->ZZZ_TIPO) == "2" .And. ZZZ->ZZZ_SITDOC == "1" //|CT-E autorizado |
cTipoDocumento := U_PTXTipoDocumento()
cTipoCTE := SuperGetMV("MC_YTPCTE", .F., "CTEV/CTEC")
If cTipoDocumento $ cTipoCTE //|CTEV = CTE de Venda / CTEC = CTE de compra |
//|Grava o XML em arquivo |
Exporta_XML_Disco(cTipoDocumento)
EndIf
EndIf
EndIf
End Sequence
ErrorBlock(bError)
If !Empty(cError)
ConOut( "### ERRO PONTO DE ENTRADA SAVEZZZ " + CRLF + CRLF + cError )
EndIf
Return
Static Function Exporta_XML_Disco(cTipoDocumento)
Local cDiretorio as Character
Local cNomeArquivo as Character
cDiretorio := SuperGetMV( "MC_YXMLDIR", .F., "\facile\cte\" )
If !Empty( cDiretorio )
If Right(cDiretorio,1) != "\"
cDiretorio += "\"
EndIf
If !ExistDir(cDiretorio)
FWMakeDir( cDiretorio )
EndIf
cNomeArquivo := AllTrim(ZZZ->ZZZ_CHAVE) + "-" + "prot" + cTipoDocumento + ".xml"
If File( cDiretorio + cNomeArquivo )
fErase(cDiretorio + cNomeArquivo)
EndIf
nHandle := FCreate( cDiretorio + cNomeArquivo )
If nHandle > 0
FWrite( nHandle, AllTrim(ZZZ->ZZZ_XML) )
FClose(nHandle)
EndIf
Else
ConOut( "FACILE - PE SAVEZZZ -> Parametro MC_YXMLDIR nao existe ou esta vazio, nao foi possivel salvar o XML no disco" )
EndIf
Return
XCarregDados
Ponto de entrada para manipular valores antes de salvar a ZZZ.
Retorno:
- oDados: object, Objeto com os dados a serem salvos na ZZZ.
Segue exemplo de utilização.
User Function XCarregDados()
Local oDados := ParamIxb[1] as Object
Local cFilNova := "" as Character
If !Empty(oDados:cIEDestinatario) .And. oDados:cCodigoFilial == "AAPES001" //|Só processa na filial 1 |
//|Código para identificar a filial onde vai salvar o XML |
// bla bla bla
// bla bla bla
// bla bla bla
cFilNova := "AAPES002"
oDados:cCodigoFilial := cFilNova
EndIf
Return oDados