Faturando um pedido através da MaPvlNfs – Maratona AdvPL e TL++ 339

Nesse vídeo demonstraremos a utilização da função MaPvlNfs, que serve para faturar (gerar um documento de saída na SF2 e SD2) através do pedido de venda.

Abaixo o código fonte desenvolvido para o exemplo em vídeo acima:

//Bibliotecas
#Include "Totvs.ch"

/*/{Protheus.doc} User Function zExe339
Efetua a geração do documento de saída pelo pedido de venda liberado
@type Function
@author Atilio
@since 12/03/2023
@see https://tdn.totvs.com/pages/releaseview.action?pageId=578374528
@obs 

    Função MaPvlNfs
    Parâmetros
        + aPvlNfs       , Array           , Array com os itens a serem gerados
        + cSerieNFS     , Caractere       , Serie da Nota Fiscal
        + lMostraCtb    , Lógico          , Mostra Lançamento Contábil
        + lAglutCtb     , Lógico          , Aglutina Lançamento Contábil
        + lCtbOnLine    , Lógico          , Contabiliza On-Line
        + lCtbCusto     , Lógico          , Contabiliza Custo On-Line
        + lReajuste     , Lógico          , Reajuste de preço na Nota Fiscal
        + nCalAcrs      , Numérico        , Tipo de Acréscimo Financeiro
        + nArredPrcLis  , Numérico        , Tipo de Arredondamento
        + lAtuSA7       , Lógico          , Atualiza Amarração Cliente x Produto
        + lECF          , Lógico          , Cupom Fiscal
        + cEmbExp       , Caractere       , Número do Embarque de Exportação
        + bAtuFin       , Bloco de Código , Bloco de Código para complemento de atualização dos títulos financeiros
        + bAtuPGerNF    , Bloco de Código , Bloco de Código para complemento de atualização dos dados após a geração da Nota Fiscal
        + bAtuPvl       , Bloco de Código , Bloco de Código de atualização do Pedido de Venda antes da geração da Nota Fiscal
        + bFatSE1       , Bloco de Código , Bloco de Código para indicar se o valor do Titulo a Receber será gravado no campo F2_VALFAT quando o parâmetro MV_TMSMFAT estiver com o valor igual a "2".
        + dDataMoe      , Data            , Data da cotação para conversão dos valores da Moeda do Pedido de Venda para a Moeda Forte
        + lJunta        , Lógico          , Aglutina Pedido Iguais
    Retorno
        + cNumNFS       , Caractere       , Número da NF gerada

    **** Apoie nosso projeto, se inscreva em https://www.youtube.com/TerminalDeInformacao ****
/*/

User Function zExe339()
    Local aArea     := FWGetArea()
    Local cPedido   := FWInputBox("Digite um número de pedido:")
    Local aPvlDocS  := {}
    Local cDocument := ""
    Local cSerie    := "B"
    Local cFunBkp   := ""
    Local lAbortar

    //Somente se não tiver sido abortado
    If ! lAbortar

        DbSelectArea("SC5")
        SC5->(DbSetOrder(1)) // C5_FILIAL + C5_NUM

        //Somente se encontrar o pedido e ele não tiver tido nota emitida ainda
        If SC5->(MsSeek(FWxFilial("SC5") + cPedido)) .And. Empty(SC5->C5_NOTA)

            DbSelectArea('SC6')
            SC6->(DbSetOrder(1)) // C6_FILIAL+C6_NUM+C6_ITEM+C6_PRODUTO
            SC6->(DbGoTop())
            SC6->( MsSeek( SC5->C5_FILIAL + SC5->C5_NUM ) )

            //É necessário carregar a pergunta em memória
            Pergunte("MT460A", .F.)

            //Abre as tabelas que serão usadas
            DbSelectArea("SC9")
            SC9->(DbSetOrder(1)) //C9_FILIAL + C9_PEDIDO + C9_ITEM + C9_SEQUEN + C9_PRODUTO + C9_BLEST + C9_BLCRED
            DbSelectArea("SE4")
            SE4->(DbSetOrder(1)) //E4_FILIAL + E4_CODIGO
            DbSelectArea("SB1")
            SB1->(DbSetOrder(1)) //B1_FILIAL + B1_COD
            DbSelectArea("SB2")
            SB2->(DbSetOrder(1)) //B2_FILIAL + B2_COD + B2_LOCAL
            DbSelectArea("SF4")
            SF4->(DbSetOrder(1)) //F4_FILIAL + F4_CODIGO

            //Percorre todos os itens do pedido para pode carregar o array que irá gerar a NF
            While ! SC6->(Eof()) .And. SC6->C6_FILIAL == SC5->C5_FILIAL .And. SC6->C6_NUM == SC5->C5_NUM

                //Posiciona nas tabelas
                SC9->(MsSeek(FWxFilial("SC9")+SC6->(C6_NUM+C6_ITEM)))
                SE4->(MsSeek(FWxFilial("SE4")+SC5->C5_CONDPAG) )
                SB1->(MsSeek(FWxFilial("SB1")+SC6->C6_PRODUTO))
                SB2->(MsSeek(FWxFilial("SB2")+SC6->(C6_PRODUTO+C6_LOCAL)))
                SF4->(MsSeek(FWxFilial("SF4")+SC6->C6_TES))

                //Se tiver liberado o BLEST e BLCRED
                If Empty(SC9->C9_BLEST) .And. Empty(SC9->C9_BLCRED)
                    aAdd(aPvlDocS,{ SC9->C9_PEDIDO,;
                                    SC9->C9_ITEM,;
                                    SC9->C9_SEQUEN,;
                                    SC9->C9_QTDLIB,;
                                    SC9->C9_PRCVEN,;
                                    SC9->C9_PRODUTO,;
                                    .F.,;
                                    SC9->(RecNo()),;
                                    SC5->(RecNo()),;
                                    SC6->(RecNo()),;
                                    SE4->(RecNo()),;
                                    SB1->(RecNo()),;
                                    SB2->(RecNo()),;
                                    SF4->(RecNo())})
                EndIf

                SC6->(DbSkip())
            EndDo

            If Len(aPvlDocS) > 0
                cFunBkp := FunName()
                SetFunName("MATA461")
                cDocument := MaPvlNfs(;
                    aPvlDocS,;  // 01 - aPvlNfs      - Array com os itens a serem gerados
                    cSerie,;    // 02 - cSerieNFS   - Serie da Nota Fiscal
                    .F.,;       // 03 - lMostraCtb   - Mostra Lançamento Contábil
                    .F.,;       // 04 - lAglutCtb    - Aglutina Lançamento Contábil
                    .F.,;       // 05 - lCtbOnLine   - Contabiliza On-Line
                    .T.,;       // 06 - lCtbCusto    - Contabiliza Custo On-Line
                    .F.,;       // 07 - lReajuste    - Reajuste de preço na Nota Fiscal
                    0,;         // 08 - nCalAcrs     - Tipo de Acréscimo Financeiro
                    0,;         // 09 - nArredPrcLis - Tipo de Arredondamento
                    .T.,;       // 10 - lAtuSA7      - Atualiza Amarração Cliente x Produto
                    .F.,;       // 11 - lECF         - Cupom Fiscal
                    "",;        // 12 - cEmbExp      - Número do Embarque de Exportação
                    {||},;      // 13 - bAtuFin      - Bloco de Código para complemento de atualização dos títulos financeiros
                    {||},;      // 14 - bAtuPGerNF   - Bloco de Código para complemento de atualização dos dados após a geração da Nota Fiscal
                    {||},;      // 15 - bAtuPvl      - Bloco de Código de atualização do Pedido de Venda antes da geração da Nota Fiscal
                    {|| .T. },; // 16 - bFatSE1      - Bloco de Código para indicar se o valor do Titulo a Receber será gravado no campo F2_VALFAT quando o parâmetro MV_TMSMFAT estiver com o valor igual a "2".
                    Date(),;    // 17 - dDataMoe     - Data da cotação para conversão dos valores da Moeda do Pedido de Venda para a Moeda Forte
                    .F.;        // 18 - lJunta       - Aglutina Pedido Iguais
                )
                SetFunName(cFunBkp)
                
                If Empty(cDocument)
                    lAbortar := .T.
                Else
                    FWAlertSuccess("Documento gerado: " + cDocument, "Teste MaPvlNfs")
                EndIf
            Else
                lAbortar := .T.
            EndIf
        EndIf

        If lAbortar
            FWAlertError("Não foi possível gerar o Documento de Saída!", "Atenção")
        EndIf
    EndIf

    FWRestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

Deixe uma resposta

Terminal de Informação