Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

  • 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 reentrega por NFou 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.

Exemplo:

Bloco de código
languagejava
themeMidnight
//-- 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


  • 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 funcionalidade de complemento, é obrigatório que sejam enviados todos os 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 componente a ser complementado.
    - DT8_VALTOT (Obrigatório): Valor do complemento para o componente.

Exemplo:

Bloco de código
languagejava
themeMidnight
//-- 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

...

  • 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.

Exemplo:

Bloco de código
languagejava
themeMidnight
//-- 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

...

  • Opção 8 - Aliança
    * 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 Aliança, 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 Aliança, assim como numero 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

Exemplo:

Bloco de código
languagejava
themeMidnight
//-- 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

...

  • 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, exemplo: "1"-Coleta, "2"-Transporte; "3"-Entrega.
    Para esta opção, enviar 1 item com a constante "CSERTMSDOC" preenchida com a informação desejada.
    - 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 desejada.

Exemplo:

Bloco de código
languagejava
themeMidnight
//-- 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

...

  • 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.

Exemplo:

Bloco de código
languagejava
themeMidnight
//-- 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

...

  • 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.

Exemplo:

Bloco de código
languagejava
themeMidnight
//-- 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


  • 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

Exemplo:

Bloco de código
languagejava
themeMidnight
//-- 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


  • 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.

Exemplo:

Bloco de código
languagejava
themeMidnight
//-- 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


  • 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.

Exemplo:

Bloco de código
languagejava
themeMidnight
//-- 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


  • 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 mais informações sobre esta arquitetura, clique no link: http://tdn.totvs.com/pages/viewpage.action?pageId=28574107
    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 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.

Exemplo:

Bloco de código
languagejava
themeMidnight
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


Observações Gerais dos Argumentos 

Cabeçalho - aCab

Para todas as opções, deve-se enviar DT6_FILDOC, DT6_DOC e DT6_SERIE

Itens - aItens

Este array possui um formato diferente para cada uma das opções, possuindo campos reais e virtuais esperados, de acordo com a opção escolhida.

Segue um resumo de todos os campos e em qual funcionalidade ele é esperado:

[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 Armazenagem                   (Armzenagem)

[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 FIscais - 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

Exemplo Completo:

Bloco de código
languagejava
themeMidnight
#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

04. ASSUNTOS RELACIONADOS

...