#Include "Protheus.ch"
#Include "FWMVCDEF.CH"
/*/{Protheus.doc} TSTA500
// Programa de exemplo de uso da manutenção de doctos TMS (TMSA500.PRW) via MsExecAuto e CCe (MVC)
@author Daniel Leme
@since 15/06/2016
@version 1.0
/*/
User Function TSTA500()
Private cCadastro := 'Teste MsExecAuto Manutenção de Documentos'
Private aRotina := {}
AAdd( aRotina, {"TST Anulação" , "U_Aut500(12)", 0 ,12 } )
AAdd( aRotina, {"TST Substituição" , "U_Aut500(13)", 0 ,13 } )
AAdd( aRotina, {"TST Can.Anul" , "U_Aut500(14)", 0 ,14 } )
AAdd( aRotina, {"TST Cancelamento" , "U_Aut500(07)", 0 ,07 } )
AAdd( aRotina, {"TST Complemento" , "U_Aut500(06)", 0 ,06 } )
AAdd( aRotina, {"TST Compl.Impost" , "U_Aut500(10)", 0 ,10 } )
AAdd( aRotina, {"TST Devolução " , "U_Aut500(04)", 0 ,04 } )
AAdd( aRotina, {"TST Reentrega " , "U_Aut500(05)", 0 ,05 } )
AAdd( aRotina, {"TST Manut. Transp", "U_Aut500(09)", 0 ,09 } )
AAdd( aRotina, {"TST Aliança" , "U_Aut500(08)", 0 ,08 } )
AAdd( aRotina, {"TST Armazenagem" , "U_Aut500(11)", 0 ,11 } )
AAdd( aRotina, {"TST CCe" , "U_Aut500(99)", 0 ,99 } )
mBrowse( 6,1,22,75,'DT6')
Return
/*/{Protheus.doc} Aut500
// Função de chamada à MsExecAuto e carta de correção (nOpcAut = 99)
Resumo dos argumentos aceitos pela MsExecAuto do TMSA500
Opções disponíveis - nOpcAut
04-Devolução
05-Reentrega
06-Complemento
07-Cancelamento
08-Aliança
09-Manut. Transp
10-Compl.Impost
11-Armazenagem
12-Anulação
13-Substituição
14-Can.Anul
Cabeçalho - aCab
Para todas as opções, deve-se enviar DT6_FILDOC, DT6_DOC e DT6_SERIE
Itens - aItens - Campos previstos (reais e virtuais)
[Campos Virtuais]
NVLRDOC - Valor do documento (Devolução,Reentrega,Complemento de Imposto e Substituição)
NPERCDOC - Percentual do documento (Devolução,Reentrega,Complemento de Imposto e Substituição)
NPERCURDOC - Tp.Percurso: 1º ou 2º (Aliança)
CFILDPCDOC - Filial aliança (Aliança)
CCTRDPCDOC - Ctrc Aliança (Aliança)
NPARCEIDOC - Número do parceiro (Aliança)
CSERTMSDOC - Serv.Transp (Manut.Transp)
CTIPTRADOC - Tipo Transp (Manut.Transp)
NDIASDOC - Dias Armazemagem (Armzengagem)
[Campos Reais]
DT8_CODPAS - Código do Componente (Complemento)
DT8_VALTOT - Valor do Componente (Complemento)
F1_DOC - Número Nf (Anulação)
F1_SERIE - Série Nf (Anulação)
F1_EMISSAO - Emissão Nf (Anulação)
F1_ESPECIE - Espécie Nf (Anulação)
F1_CHVNFE - Chave Nfe (Anulação)
F1_MENNOTA - Mensagem Anulação (Anulação)
Notas - aNfs
Este array é considerado apenas se a opção de manutenção por NF estiver selecionada (3ª pergunta do <F12> do TMSA500).
Apenas as opções Devolução e Reentrega são compatíveis com manutenção por NF
DTC_NUMNFC - Doc.Cliente
DTC_SERNFC - Serie Docto. Cliente
DTC_CLIREM - Remetente
DTC_LOJREM - Loja Remetente
DTC_CODPRO - Codigo do Produto
DTC_FILORI - Filial de Origem
DTC_LOTNFC - No.Lote
@author Daniel Leme
@since 15/06/2016
@version 1.0
@param nOpcAut, Int, opção de chamada à MsExecAuto
@type function
/*/
User Function Aut500(nOpcAut)
Local aCab := {}
Local aItens := {}
Local aNfs := {}
Default nOpcAut := 0
SaveInter()
If nOpcAut == 4 //--Devolucao
/*
Opção 4 - Devolução
* Cabeçalho - Documento a receber a manutenção
Em todas as opções de chamadas, o TMSA500 espera os campos DT6_FILDOC, DT6_DOC e DT6_SERIE como cabeçalho.
* Opção de devolução por Documento ou Nf:
A opção por devolução por NF ou por documento (3ª pergunta da tecla de função <F12>) será respeitada na execução automática.
Caso a opção seja de devolução por Docto, o array de NF não será necessário.
Caso a opção de devolução por NF esteja ativa, um array com as NF's a serem devolvidas será obrigatório para o sucesso.
Os campos obrigatórios para cada NF serão os seguintes:
- DTC_NUMNFC
- DTC_SERNFC
- DTC_CLIREM
- DTC_LOJREM
- DTC_CODPRO
- DTC_FILORI
- DTC_LOTNFC
* Valor do documento:
Para a chamada da devolução, pode-se gerá-la de 3 formas para o cálculo do Valor do documento:
- Calculado:
O Sistema calculará, baseado nas condições comerciais cadastradas, o valor do documento de devolução.
Para efetivar uma devolução nesta condição, o array aItens deverá conter uma linha vazia.
- Valor Informado:
Um valor líquido será informado para a rotina, que acatará este valor para o documento
Para esta opção, enviar 1 item com a constante "NVLRDOC" preenchida com o valor desejado
- Percentual informado:
Um percentual sobre o Documento original será informado à rotina, que fará o cálculo e o gravará no documento
Para esta opção, enviar 1 item com a constante "NPERCDOC" preenchida com o percentual desejado
*/
//-- Montagem do Cabeçalho
aCab := {}
AAdd( aCab, { "DT6_FILDOC" , DT6->DT6_FILDOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_DOC" , DT6->DT6_DOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_SERIE" , DT6->DT6_SERIE , Nil } ) //-- Obrigatorio
//-- Montagem dos Itens
aItens := {}
aAdd( aItens, {})
//-- Para que o valor da devolução seja calculada, enviar uma linha com array vazio
If !MsgYesNo("No teste, deseja calcular valor da devolução? ")
If MsgYesNo("Deseja testar por valor ($150)? Se a oção for 'Não', o percentual será de 30%")
//-- Exemplo de opção de Valor informado em $150,00
AAdd( aItens[1], { "NVLRDOC" , 150 , Nil } )
Else
//-- Exemplo de opção de percentual informado em 30%
AAdd( aItens[1], { "NPERCDOC" , 30 , Nil } )
EndIf
EndIf
//-- Montagem das Nfs - Este array será apenas avaliado se a opção de devolução seja por NF (3ª pergunta do <F12> da rotina)
aNfs := {}
aAdd( aNfs, {})
DTC->(DbSetOrder(3)) //-- DTC_FILIAL+DTC_FILDOC+DTC_DOC+DTC_SERIE+DTC_SERVIC+DTC_CODPRO
If DTC->(MsSeek(xFilial("DTC") + DT6->(DT6_FILDOC+DT6_DOC+DT6_SERIE)))
AAdd( aNfs[Len(aNfs)], { "DTC_NUMNFC" , DTC->DTC_NUMNFC , Nil } ) //-- Obrigatorio, quando selecionado por NF (3º pergunte do F12 do TMSA500)
AAdd( aNfs[Len(aNfs)], { "DTC_SERNFC" , DTC->DTC_SERNFC , Nil } ) //-- Obrigatorio, quando selecionado por NF (3º pergunte do F12 do TMSA500)
AAdd( aNfs[Len(aNfs)], { "DTC_CLIREM" , DTC->DTC_CLIREM , Nil } ) //-- Obrigatorio, quando selecionado por NF (3º pergunte do F12 do TMSA500)
AAdd( aNfs[Len(aNfs)], { "DTC_LOJREM" , DTC->DTC_LOJREM , Nil } ) //-- Obrigatorio, quando selecionado por NF (3º pergunte do F12 do TMSA500)
AAdd( aNfs[Len(aNfs)], { "DTC_CODPRO" , DTC->DTC_CODPRO , Nil } ) //-- Obrigatorio, quando selecionado por NF (3º pergunte do F12 do TMSA500)
AAdd( aNfs[Len(aNfs)], { "DTC_FILORI" , DTC->DTC_FILORI , Nil } ) //-- Obrigatorio, quando selecionado por NF (3º pergunte do F12 do TMSA500)
AAdd( aNfs[Len(aNfs)], { "DTC_LOTNFC" , DTC->DTC_LOTNFC , Nil } ) //-- Obrigatorio, quando selecionado por NF (3º pergunte do F12 do TMSA500)
EndIf
//-- Chamada à MsExecAuto, os dois primeiros argumentos são de uso interno e serão ignorados, se passado algum conteúdo
Private lMsErroAuto := .F. //-- Utilizada na funcao MsExecAuto()
MsExecAuto({|a,b,c,d,e,f| TMSA500(a,b,c,d,e,f)},Nil,Nil,nOpcAut,aCab,aItens,aNfs)
If lMsErroAuto
MostraErro()
Else
MsgAlert("TESTE OK")
EndIf
ElseIf nOpcAut == 5 //--Reentrega
/*
Opção 5 - Reentrega
* Cabeçalho - Documento a receber a manutenção
Em todas as opções de chamadas, o TMSA500 espera os campos DT6_FILDOC, DT6_DOC e DT6_SERIE como cabeçalho.
* Opção de Reentrega por Documento ou Nf:
A opção por reentrega por NF ou por documento (3ª pergunta da tecla de função <F12>) será respeitada na execução automática.
Caso a opção seja de reentrega por Docto, o array de NF não será necessário.
Caso a opção de reentrega por NF esteja ativa, um array com as NF's a serem devolvidas será obrigatório para o sucesso.
Os campos obrigatórios para cada NF serão os seguintes:
- DTC_NUMNFC
- DTC_SERNFC
- DTC_CLIREM
- DTC_LOJREM
- DTC_CODPRO
- DTC_FILORI
- DTC_LOTNFC
* Valor do documento:
Para a chamada da reentrega, pode-se gerá-la de 3 formas para o cálculo do Valor do documento:
- Calculado:
O Sistema calculará, baseado nas condições comerciais cadastradas, o valor do documento de reentrega.
Para efetivar uma reentrega nesta condição, o array aItens deverá conter uma linha vazia.
- Valor Informado:
Um valor líquido será informado para a rotina, que acatará este valor para o documento
Para esta opção, enviar 1 item com a constante "NVLRDOC" preenchida com o valor desejado
- Percentual informado:
Um percentual sobre o Documento original será informado à rotina, que fará o cálculo e o gravará no documento
Para esta opção, enviar 1 item com a constante "NPERCDOC" preenchida com o percentual desejado
*/
//-- Montagem do Cabeçalho
aCab := {}
AAdd( aCab, { "DT6_FILDOC" , DT6->DT6_FILDOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_DOC" , DT6->DT6_DOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_SERIE" , DT6->DT6_SERIE , Nil } ) //-- Obrigatorio
//-- Montagem dos Itens
aItens := {}
aAdd( aItens, {})
//-- Para que o valor da reentrega seja calculada, enviar uma linha com array vazio
If !MsgYesNo("No teste, deseja calcular valor da Reentrega? ")
If MsgYesNo("Deseja testar por valor ($250)? Se a oção for 'Não', o percentual será de 70%")
//-- Exemplo de opção de Valor informado em $250,00
AAdd( aItens[1], { "NVLRDOC" , 250 , Nil } )
Else
//-- Exemplo de opção de percentual informado em 70%
AAdd( aItens[1], { "NPERCDOC" , 70 , Nil } )
EndIf
EndIf
//-- Montagem das Nfs
//-- Diferente do exemplo da devolução (acima), este demonstra a chamada por documento, sem envio ou citação do array de NFs
//-- Chamada à MsExecAuto, os dois primeiros argumentos são de uso interno e serão ignorados, se passado algum conteúdo
Private lMsErroAuto := .F. //-- Utilizada na funcao MsExecAuto()
MsExecAuto({|a,b,c,d,e| TMSA500(a,b,c,d,e)},Nil,Nil,nOpcAut,aCab,aItens)
If lMsErroAuto
MostraErro()
Else
MsgAlert("TESTE OK")
EndIf
ElseIf nOpcAut == 06 //-- Complemento
/*
Opção 6 - Complemento
* Cabeçalho - Documento a receber a manutenção
Em todas as opções de chamadas, o TMSA500 espera os campos DT6_FILDOC, DT6_DOC e DT6_SERIE como cabeçalho.
* Valor do documento:
Para a chamada da complemento é obrigatório que enviar itens com os componentes e os valores a serem complementados.
Como trata-se de complemento de um documento, apenas componentes do documento original poderão ser complementados.
IMPORTANTE: NÃO poderá complementar o documento pelo total do frete (internamente tratado como componente "TF")
Os campos a serem enviados no array de itens são:
- DT8_CODPAS (Obrigatório): Código do compomente a ser complementado
- DT8_VALTOT (Obrigatório): Valor do complemento para o componente
*/
//-- Montagem do Cabeçalho
aCab := {}
AAdd( aCab, { "DT6_FILDOC" , DT6->DT6_FILDOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_DOC" , DT6->DT6_DOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_SERIE" , DT6->DT6_SERIE , Nil } ) //-- Obrigatorio
//-- Montagem dos Itens
aItens := {}
If MsgYesNo("Testar com erro?")
//-- "Maus" exemplos de uso da rotina, deve-se enviar ao menos um componente e ele deve ser válido e com valor positivo.
aAdd( aItens, {})
If !MsgYesNo("Zerado?")
AAdd( aItens[Len(aItens)], { "DT8_CODPAS", 'XX' , Nil } ) //-- Código do Componente: Obrigatório
AAdd( aItens[Len(aItens)], { "DT8_VALTOT", 100 , Nil } ) //-- Valor do Componente: Obrigatório
EndIf
Else
//-- Exemplo complementando todos os componentes do documento por 15% do seu valor original
DT8->(DbSetOrder(2)) //-- DT8_FILIAL+DT8_FILDOC+DT8_DOC+DT8_SERIE+DT8_CODPRO+DT8_CODPAS
DT8->(MsSeek(xFilial("DT8")+DT6->(DT6_FILDOC+DT6_DOC+DT6_SERIE)))
Do While DT8->(!Eof()) .And. DT8->(DT8_FILIAL+DT8_FILDOC+DT8_DOC+DT8_SERIE) == xFilial("DT8")+DT6->(DT6_FILDOC+DT6_DOC+DT6_SERIE)
//-- O Total do Frete é ignorado pela rotina, se passado
If AllTrim(DT8->DT8_CODPAS) != "TF"
aAdd( aItens, {})
AAdd( aItens[Len(aItens)], { "DT8_CODPAS", DT8->DT8_CODPAS , Nil } ) //-- Código do Componente: Obrigatório
AAdd( aItens[Len(aItens)], { "DT8_VALTOT", DT8->DT8_VALTOT * 0.15 , Nil } ) //-- Valor do Componente: Obrigatório
EndIf
DT8->(DbSkip())
EndDo
EndIf
//-- Montagem das Nfs
//-- Apenas a opção de devolução e reentrega possuem esta opção e não é necessário seu envio
//-- Chamada à MsExecAuto, os dois primeiros argumentos são de uso interno e serão ignorados, se passado algum conteúdo
Private lMsErroAuto := .F. //-- Utilizada na funcao MsExecAuto()
MsExecAuto({|a,b,c,d,e| TMSA500(a,b,c,d,e)},Nil,Nil,nOpcAut,aCab,aItens)
If lMsErroAuto
MostraErro()
Else
MsgAlert("TESTE OK")
EndIf
ElseIf nOpcAut == 07 //-- Cancelamento
/*
Opção 7 - Cancelamento
* Cabeçalho - Documento a receber a manutenção
Em todas as opções de chamadas, o TMSA500 espera os campos DT6_FILDOC, DT6_DOC e DT6_SERIE como cabeçalho.
Na opção de Cancelamento, apenas o Cabeçalho é necessário, onde informa-se o documento a ser cancelado
*/
//-- Montagem do Cabeçalho
aCab := {}
AAdd( aCab, { "DT6_FILDOC" , DT6->DT6_FILDOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_DOC" , DT6->DT6_DOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_SERIE" , DT6->DT6_SERIE , Nil } ) //-- Obrigatorio
//-- Montagem dos Itens
//-- Não há itens para a opção de cancelamento.
aItens := {}
aAdd( aItens, {})
//-- Montagem das Nfs
//-- Apenas a opção de devolução e reentrega possuem esta opção e não é necessário seu envio
//-- Chamada à MsExecAuto, os dois primeiros argumentos são de uso interno e serão ignorados, se passado algum conteúdo
Private lMsErroAuto := .F. //-- Utilizada na funcao MsExecAuto()
MsExecAuto({|a,b,c,d,e| TMSA500(a,b,c,d,e)},Nil,Nil,nOpcAut,aCab,aItens)
If lMsErroAuto
MostraErro()
Else
MsgAlert("TESTE OK")
EndIf
ElseIf nOpcAut == 08 //--Alianca
/*
Opção 8 - Alianca
* Cabeçalho - Documento a receber a manutenção
Em todas as opções de chamadas, o TMSA500 espera os campos DT6_FILDOC, DT6_DOC e DT6_SERIE como cabeçalho.
* Itens:
Para a chamada da manutenção Alianca, será observado, assim como na tela, se o TMS está com o serviço de Aliança ativo.
Existem 3 ações que podem ser executadas nesta opção:
- Documento Aliança ser alterado para Documento Normal
Neste caso, não é necessário envio de qualquer informação no Item.
- Documento Normal para Aliança 1º percurso
Indicar apenas que é 1º percurso, não havendo outras informações a serem enviadas
Para esta opção, enviar 1 item com a constante "NPERCURDOC" preenchida com número 1 (um)
- Documento Normal para Aliança 2º percurso
Deve-se indicar a filial e o Ctrc Alianca, assim como nro do parceiro (de acordo com a tabela MI do cadastro de tabelas - SX5)
Para esta opção, enviar 1 item com as seguintes constantes:
* "NPERCURDOC" - fixo 2
* "CFILDPCDOC" - Filial aliança
* "CCTRDPCDOC" - Ctrc Aliança
* "NPARCEIDOC" - Número do parceiro de acordo com a ordem na tabela "MI" do cadastro de tabelas - SX5
*/
//-- Montagem do Cabeçalho
aCab := {}
AAdd( aCab, { "DT6_FILDOC" , DT6->DT6_FILDOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_DOC" , DT6->DT6_DOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_SERIE" , DT6->DT6_SERIE , Nil } ) //-- Obrigatorio
//-- Montagem dos Itens
aItens := {}
aAdd( aItens, {})
If TmsDocAli(DT6->DT6_FILDOC,DT6->DT6_DOC,DT6->DT6_SERIE)
MsgAlert("Neste teste, o Documento é aliança, será retornado para transporte ou entrega normal")
ElseIf !MsgYesNo("Deseja testar com erro? ")
If MsgYesNo("1º percurso?")
AAdd( aItens[1], { "NPERCURDOC", 1 , Nil } )
Else
AAdd( aItens[1], { "NPERCURDOC", 2 , Nil } )
AAdd( aItens[1], { "CFILDPCDOC", "02" , Nil } )
AAdd( aItens[1], { "CCTRDPCDOC", "123456" , Nil } )
AAdd( aItens[1], { "NPARCEIDOC", 1 , Nil } )
EndIf
EndIf
//-- Montagem das Nfs
//-- Apenas a opção de devolução e reentrega possuem esta opção e não é necessário seu envio
//-- Chamada à MsExecAuto, os dois primeiros argumentos são de uso interno e serão ignorados, se passado algum conteúdo
Private lMsErroAuto := .F. //-- Utilizada na funcao MsExecAuto()
MsExecAuto({|a,b,c,d,e,f| TMSA500(a,b,c,d,e,f)},Nil,Nil,nOpcAut,aCab,aItens,aNfs)
If lMsErroAuto
MostraErro()
Else
MsgAlert("TESTE OK")
EndIf
ElseIf nOpcAut == 09 //--Manut.Transp
/*
Opção 9 - Manutenção Transporte
* Cabeçalho - Documento a receber a manutenção
Em todas as opções de chamadas, o TMSA500 espera os campos DT6_FILDOC, DT6_DOC e DT6_SERIE como cabeçalho.
* Itens:
Para a chamada da manutenção de Transporte do documento, pode-se alterar apenas 2 informações:
- Serviço de transporte:
Indicar o serviço de transposte, ex: "1"-Coleta, "2"-Transporte; "3"-Entrega
Para esta opção, enviar 1 item com a constante "CSERTMSDOC" preenchida com a informação desejado
- Tipo de transporte:
Um percentual sobre o Documento original será informado à rotina, que fará o cálculo e o gravará no documento
Para esta opção, enviar 1 item com a constante "NPERCDOC" preenchida com a informação desejado
*/
//-- Montagem do Cabeçalho
aCab := {}
AAdd( aCab, { "DT6_FILDOC" , DT6->DT6_FILDOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_DOC" , DT6->DT6_DOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_SERIE" , DT6->DT6_SERIE , Nil } ) //-- Obrigatorio
//-- Montagem dos Itens
aItens := {}
aAdd( aItens, {})
If !MsgYesNo("Deseja testar com erro?")
AAdd( aItens[1], { "CSERTMSDOC" , Iif(DT6->DT6_SERTMS=="3","2","3") , Nil } )
AAdd( aItens[1], { "CTIPTRADOC" , Iif(DT6->DT6_TIPTRA=="1","2","1") , Nil } )
EndIf
//-- Montagem das Nfs
//-- Apenas a opção de devolução e reentrega possuem esta opção e não é necessário seu envio
//-- Chamada à MsExecAuto, os dois primeiros argumentos são de uso interno e serão ignorados, se passado algum conteúdo
Private lMsErroAuto := .F. //-- Utilizada na funcao MsExecAuto()
MsExecAuto({|a,b,c,d,e| TMSA500(a,b,c,d,e)},Nil,Nil,nOpcAut,aCab,aItens)
If lMsErroAuto
MostraErro()
Else
MsgAlert("TESTE OK")
EndIf
ElseIf nOpcAut == 10 //--Complemento Imposto
/*
Opção 10 - Complemento de Imposto
* Cabeçalho - Documento a receber a manutenção
Em todas as opções de chamadas, o TMSA500 espera os campos DT6_FILDOC, DT6_DOC e DT6_SERIE como cabeçalho.
* Valor do documento:
Para a chamada do complemento de imposto, pode-se gerá-la de 2 formas para o cálculo do Valor do documento:
- Valor Informado:
Um valor líquido será informado para a rotina, que acatará este valor para o documento
Para esta opção, enviar 1 item com a constante "NVLRDOC" preenchida com o valor desejado
- Percentual informado:
Um percentual sobre o Documento original será informado à rotina, que fará o cálculo e o gravará no documento
Para esta opção, enviar 1 item com a constante "NPERCDOC" preenchida com o percentual desejado
*/
//-- Montagem do Cabeçalho
aCab := {}
AAdd( aCab, { "DT6_FILDOC" , DT6->DT6_FILDOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_DOC" , DT6->DT6_DOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_SERIE" , DT6->DT6_SERIE , Nil } ) //-- Obrigatorio
//-- Montagem dos Itens
aItens := {}
aAdd( aItens, {})
If MsgYesNo("Deseja testar por valor ($150)? Se a oção for 'Não', o percentual será de 30%")
AAdd( aItens[1], { "NVLRDOC" , 150 , Nil } )
Else
AAdd( aItens[1], { "NPERCDOC" , 30 , Nil } )
EndIf
//-- Montagem das Nfs
//-- Apenas a opção de devolução e reentrega possuem esta opção e não é necessário seu envio
//-- Chamada à MsExecAuto, os dois primeiros argumentos são de uso interno e serão ignorados, se passado algum conteúdo
Private lMsErroAuto := .F. //-- Utilizada na funcao MsExecAuto()
MsExecAuto({|a,b,c,d,e| TMSA500(a,b,c,d,e)},Nil,Nil,nOpcAut,aCab,aItens)
If lMsErroAuto
MostraErro()
Else
MsgAlert("TESTE OK")
EndIf
ElseIf nOpcAut == 11 //--Armazenagem
/*
Opção 11 - Armazenagem
* Cabeçalho - Documento a receber a manutenção
Em todas as opções de chamadas, o TMSA500 espera os campos DT6_FILDOC, DT6_DOC e DT6_SERIE como cabeçalho.
* Valor do documento:
Para a chamada do documento de armazenagem, é necessário informar a quantidade de dias de armazenagem
Para esta opção, enviar 1 item com a constante "NDIASDOC" preenchida com a quantidade de dias de armazenagem
*/
//-- Montagem do Cabeçalho
aCab := {}
AAdd( aCab, { "DT6_FILDOC" , DT6->DT6_FILDOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_DOC" , DT6->DT6_DOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_SERIE" , DT6->DT6_SERIE , Nil } ) //-- Obrigatorio
//-- Montagem dos Itens
aItens := {}
aAdd( aItens, {})
If !MsgYesNo("Testar com erro?")
AAdd( aItens[1], { "NDIASDOC" , 3 , Nil } )
EndIf
//-- Montagem das Nfs
//-- Apenas a opção de devolução e reentrega possuem esta opção e não é necessário seu envio
//-- Chamada à MsExecAuto, os dois primeiros argumentos são de uso interno e serão ignorados, se passado algum conteúdo
Private lMsErroAuto := .F. //-- Utilizada na funcao MsExecAuto()
MsExecAuto({|a,b,c,d,e| TMSA500(a,b,c,d,e)},Nil,Nil,nOpcAut,aCab,aItens)
If lMsErroAuto
MostraErro()
Else
MsgAlert("TESTE OK")
EndIf
ElseIf nOpcAut == 12 //-- Anulação
/*
Opção 12- Anulação
* Cabeçalho - Documento a receber a manutenção
Em todas as opções de chamadas, o TMSA500 espera os campos DT6_FILDOC, DT6_DOC e DT6_SERIE como cabeçalho.
* Itens - Dados para Anulação
Quando contribuinte, deve-se informar os dados da NF de Anulação emitida pelo contribuinte, para que se faça a entrada desta no sistema.
No caso de não-contribuintes, será emitida uma NF de entrada com formulário próprio e, por esta razão, os dados de NF não são necessários e serão desconsiderados.
Campos necessários à rotina:
- F1_DOC - Numero da NF : Obrigatório, se contribuinte
- F1_SERIE - Serie da NF : Obrigatório, se contribuinte
- F1_EMISSAO - Emissao da NF : Obrigatório
- F1_ESPECIE - Especie
- F1_CHVNFE - Chave da DANFE : Esta informação deve ser exigida pela Sefaz, no caso de contribuinte, mas não é obrigatória pela rotina.
- F1_MENNOTA - Mensagem para nota : Obrigatório
*/
//-- Montagem do Cabeçalho
aCab := {}
AAdd( aCab, { "DT6_FILDOC" , DT6->DT6_FILDOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_DOC" , DT6->DT6_DOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_SERIE" , DT6->DT6_SERIE , Nil } ) //-- Obrigatorio
//-- Montagem dos Itens
//-- Teste para não contribuinte (campos da NF em branco - geração em formulário próprio)
aItens := {}
aAdd( aItens, {})
AAdd( aItens[1], { "F1_DOC" , Space(Len(SF1->F1_DOC)) , Nil } ) // Numero da NF : Obrigatorio, se contribuinte
AAdd( aItens[1], { "F1_SERIE" , Space(Len(SF1->F1_SERIE)) , Nil } ) // Serie da NF : Obrigatorio, se contribuinte
AAdd( aItens[1], { "F1_EMISSAO", dDatabase , Nil } ) // Emissao da NF : Obrigatorio
AAdd( aItens[1], { "F1_ESPECIE", Space(Len(SF1->F1_ESPECIE)) , Nil } ) // Especie
AAdd( aItens[1], { "F1_CHVNFE" , Space(Len(SF1->F1_CHVNFE)) , Nil } ) // Chave da DANFE
AAdd( aItens[1], { "F1_MENNOTA", "TESTE Anulação Automática" , Nil } ) // Mensagem para nota : Obrigatorio
//-- Montagem das Nfs
//-- Apenas a opção de devolução e reentrega possuem esta opção e não é necessário seu envio
//-- Chamada à MsExecAuto, os dois primeiros argumentos são de uso interno e serão ignorados, se passado algum conteúdo
Private lMsErroAuto := .F. //-- Utilizada na funcao MsExecAuto()
MsExecAuto({|a,b,c,d,e| TMSA500(a,b,c,d,e)},Nil,Nil,nOpcAut,aCab,aItens)
If lMsErroAuto
MostraErro()
Else
MsgAlert("TESTE OK")
EndIf
ElseIf nOpcAut == 13 //--Substituição
/*
Opção 13 - Substituição
* Cabeçalho - Documento a receber a manutenção
Em todas as opções de chamadas, o TMSA500 espera os campos DT6_FILDOC, DT6_DOC e DT6_SERIE como cabeçalho.
* Valor do documento:
Para a geração da substituição, existem 2 formas para o cálculo do Valor do documento:
- Valor Informado:
Um valor líquido será informado para a rotina, que acatará este valor para o documento
Para esta opção, enviar 1 item com a constante "NVLRDOC" preenchida com o valor desejado
- Percentual informado:
Um percentual sobre o Documento original será informado à rotina, que fará o cálculo e o gravará no documento
Para esta opção, enviar 1 item com a constante "NPERCDOC" preenchida com o percentual desejado
*/
//-- Montagem do Cabeçalho
aCab := {}
AAdd( aCab, { "DT6_FILDOC" , DT6->DT6_FILDOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_DOC" , DT6->DT6_DOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_SERIE" , DT6->DT6_SERIE , Nil } ) //-- Obrigatorio
//-- Montagem dos Itens
aItens := {}
aAdd( aItens, {})
If MsgYesNo("Deseja testar por valor ($1000)? Se a oção for 'Não', o percentual será de 130%")
AAdd( aItens[1], { "NVLRDOC" , 1000, Nil } )
Else
AAdd( aItens[1], { "NPERCDOC" , 130 , Nil } )
EndIf
//-- Montagem das Nfs
//-- Apenas a opção de devolução e reentrega possuem esta opção e não é necessário seu envio
//-- Chamada à MsExecAuto, os dois primeiros argumentos são de uso interno e serão ignorados, se passado algum conteúdo
Private lMsErroAuto := .F. //-- Utilizada na funcao MsExecAuto()
MsExecAuto({|a,b,c,d,e| TMSA500(a,b,c,d,e)},Nil,Nil,nOpcAut,aCab,aItens)
If lMsErroAuto
MostraErro()
Else
MsgAlert("TESTE OK")
EndIf
ElseIf nOpcAut == 14 //-- Cancelamento Anulação
/*
Opção 14 - Cancelamento da anulação
* Cabeçalho - Documento a receber a manutenção
Em todas as opções de chamadas, o TMSA500 espera os campos DT6_FILDOC, DT6_DOC e DT6_SERIE como cabeçalho.
Na opção de Cancelamento da anulação, apenas o Cabeçalho é necessário, onde informa-se o documento a ter a anulação cancelada
*/
//-- Montagem do Cabeçalho
aCab := {}
AAdd( aCab, { "DT6_FILDOC" , DT6->DT6_FILDOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_DOC" , DT6->DT6_DOC , Nil } ) //-- Obrigatorio
AAdd( aCab, { "DT6_SERIE" , DT6->DT6_SERIE , Nil } ) //-- Obrigatorio
//-- Montagem dos Itens
//-- Não é esperado itens para a ação de cancelamento da anulação.
aItens := {}
aAdd( aItens, {})
//-- Montagem das Nfs
//-- Apenas a opção de devolução e reentrega possuem esta opção e não é necessário seu envio
//-- Chamada à MsExecAuto, os dois primeiros argumentos são de uso interno e serão ignorados, se passado algum conteúdo
Private lMsErroAuto := .F. //-- Utilizada na funcao MsExecAuto()
MsExecAuto({|a,b,c,d,e| TMSA500(a,b,c,d,e)},Nil,Nil,nOpcAut,aCab,aItens)
If lMsErroAuto
MostraErro()
Else
MsgAlert("TESTE OK")
EndIf
ElseIf nOpcAut == 99 //-- Carta de correção Eletrônica
/*
Carta de Correção Eletrônica
Apesar de estar no Sub-Menu do TMSA500, esta rotina trata-se de um programa à parte, desenvolvido sob Arquitetura MVC
Para maiores informações sobre esta arquitetura, pode-se pesquisar no site tdn.totvs.com
Abaixo, apenas fora escrito um exemplo desta chamada sem interface, que é uma opção da arquitetura MVC e não desta rotina, apenas.
Conforme exigência, a CC-e é um evento na Sefaz e, assim sendo, os campos que são alterados o são apenas no XML e não no sistema.
No exemplo, alteramos a tag "XNOME" do grupo "dest" do CT-e.
IMPORTANTE: Esta alteração do exemplo NÂO altera o cadastro de clientes, assim como qualquer outro campo que seja escolhido para o envio.
*/
oModel := FwLoadModel("TMSAE90")
oModel:SetOperation(MODEL_OPERATION_UPDATE)
oModel:Activate()
oModel:SetValue( "TMSAE90_01", "DEST_XNOME" , "TESTE DO SISTEMA" /*uValue*/)
If !oModel:VldData() .Or. !oModel:CommitData()
aErro := oModel:GetErrorMessage()
AutoGrLog( 'Id do formulário de origem:' + ' [' + AllToChar( aErro[1] ) + ']' ) //-- "Id do formulário de origem:"
AutoGrLog( 'Id do campo de origem: ' + ' [' + AllToChar( aErro[2] ) + ']' ) //-- "Id do campo de origem: "
AutoGrLog( 'Id do formulário de erro: ' + ' [' + AllToChar( aErro[3] ) + ']' ) //-- "Id do formulário de erro: "
AutoGrLog( 'Id do campo de erro: ' + ' [' + AllToChar( aErro[4] ) + ']' ) //-- "Id do campo de erro: "
AutoGrLog( 'Id do erro: ' + ' [' + AllToChar( aErro[5] ) + ']' ) //-- "Id do erro: "
AutoGrLog( 'Mensagem do erro: ' + ' [' + AllToChar( aErro[6] ) + ']' ) //-- "Mensagem do erro: "
AutoGrLog( 'Mensagem da solução: ' + ' [' + AllToChar( aErro[7] ) + ']' ) //-- "Mensagem da solução: "
AutoGrLog( 'Valor atribuído: ' + ' [' + AllToChar( aErro[8] ) + ']' ) //-- "Valor atribuído: "
AutoGrLog( 'Valor anterior: ' + ' [' + AllToChar( aErro[9] ) + ']' ) //-- "Valor anterior: "
MostraErro()
Else
MsgAlert("TESTE OK")
EndIf
oModel:DeActivate()
oModel := Nil
EndIf
RestInter()
Return
|