Árvore de páginas

Ponto-de-Entrada: OFX01OSV - Retorna os campos do VO1 que terão possibilidade de alteração no momento da exportação do Orçamento para a OS.
Abrangências: Microsiga Protheus 10 , Microsiga Protheus 11
Versões: Microsiga Protheus 10 , Microsiga Protheus 11
Compatível Países: Todos
Sistemas Operacionais: Todos
Compatível às Bases de Dados: Todos
Idiomas: Português (Brasil)
Descrição:
Este ponto de entrada tem como finalidade selecionar campos para serem alterados na OS durante a exportação de um orçamento por fases.
Eventos

/*
===============================================================================
###############################################################################
##+----------+------------+-------+-----------------------+------+----------+##
##|Função    |OX001FAT    |Autor  |  Luis Delorme         | Data | 20/05/09 |##
##+----------+------------+-------+-----------------------+------+----------+##
##|Descrição | Faturamento do Orcamento                                     |##
##+----------+--------------------------------------------------------------+##
##|Uso       | Veiculos                                                     |##
##+----------+--------------------------------------------------------------+##
###############################################################################
===============================================================================
*/
Function OX001FAT(nOpc, lSoGravar)
// ############################################################
// # Verifica se trata-se de CANCELAMENTO DE ORCAMENTO        #
// ############################################################
Local cOrcAtu := VS1->VS1_NUMORC
Local nCntFor2
Local lret    := .t.
Local lAbortProc
Local aInconv
Local lOk        := .f.
Local cMotCancel := ""
Local aSrvcAdic := {} // Servicos adicionais de 1ª Revisao (Orc. Oficina com Inc. de Revisao)
Local cCpoAlt   := "" // Lista dos campos que poderão ser alterados
Local aCpoAlt   := {} // Controla os Campos que poderão sofrer alteracoes na VO1
Local nPos      := 0
Local nCol      := 42
Local nLin      := 4
Local nDisLin   := 11
Local nTamGet   := 0
Local lOkOSV    := .f.
Local cObjGName := ""
Local cMsgErroInc := "" // Critica retornada pelo OM420VALINC
Local lRetT := .t.
Local cAlias := VAI->(GetArea())
Local lPedApr := .t. //exibe a janela que pede autorizacao de aprovacao
Local lAprUsr := .f. //informa se inconveniente foi aprovado ou nao
Private cMotivo := "000004"  //Filtro da consulta do motivo de Cancelamentos (Orcamento)
Private cNumOrd := "" //numero do orcamento
//
if ExistBlock("OXA001DBFAT")  // <<<--- O B S O L E T O
    if !ExecBlock("OXA001DBFAT",.f.,.f.)
        Return(.f.)
    Endif
Endif
//
if ExistBlock("OX001FAT")
    if !ExecBlock("OX001FAT",.f.,.f.)
        Return(.f.)
    Endif
Endif
//
if EXCLUI
    if lOX001Auto .or. MsgYesNo(STR0064,STR0025)
        BEGIN TRANSACTION
        //
        if ExistBlock("OX01CANCEL") // <<<--- O B S O L E T O
            if !ExecBlock("OX01CANCEL",.f.,.f.)
                Return(.f.)
            Endif
        Endif
        if ExistBlock("OX001CAN")
            if !ExecBlock("OX001CAN",.f.,.f.)
                Return(.f.)
            Endif
        Endif
       
        If !lOX001Auto
            If VS1->(FieldPos("VS1_MOTIVO")) > 0
                //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
                //³ Motivo do Cancelamento do Orcamento
                //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ
                While !lOk
                    lOk := PERGUNTE("OFI151",.t.)
                EndDo
                cMotCancel := MV_PAR01
            EndIf
        EndIf
       
        If OXI001REVF(VS1->VS1_NUMORC, "0")
            DBSelectArea("VS1")
            DBSetOrder(1)
            DBSeek(xFilial("VS1")+VS1->VS1_NUMORC)
            //
            DBSelectArea("VS1")
            reclock("VS1",.f.)
            VS1->VS1_STATUS := "C"
            If !Empty(cMotCancel)
                VS1->VS1_MOTIVO := cMotCancel
            EndIf
            msunlock()
           
            If FindFunction("FM_GerLog")
                //grava log das alteracoes das fases do orcamento
                FM_GerLog("F",VS1->VS1_NUMORC)
            EndIF
           
            //
            OX001CEV("C",VS1->VS1_NUMORC) // Gerar CEV no Cancelamento do Orcamento
            //
            If FindFunction("OM350STATUS")
                OM350STATUS(VS1->VS1_NUMAGE,"2","4")
            EndIf
            //
            oDlgXX001:End()
            DBSelectArea("VS3")
            DBSetOrder(1)
            if DBSeek(xFilial("VS3")+VS1->VS1_NUMORC)
                cCont := 1
                While !Eof() .and. VS3->VS3_FILIAL == xFilial("VS3") .and. VS1->VS1_NUMORC == VS3->VS3_NUMORC
                   
                    DBSelectArea("VPJ")
                    DBSetOrder(1)
                    if !DBSeek(xFilial("VPJ") + VS3->VS3_NUMORC + VS3->VS3_GRUITE + VS3->VS3_CODITE)
                        dbSelectArea("VPJ")
                        RecLock("VPJ",.t.)
                        VPJ->VPJ_FILIAL := xFilial("VPJ")
                        VPJ->VPJ_NUMORC := VS3->VS3_NUMORC
                        VPJ->VPJ_DATCAN := dDataBase
                        VPJ->VPJ_HORCAN := val(left(time(),2)+substr(time(),4,2))
                        VPJ->VPJ_GRUITE := VS3->VS3_GRUITE
                        VPJ->VPJ_CODITE := VS3->VS3_CODITE
                        VPJ->VPJ_QTDITE := VS3->VS3_QTDITE
                        VPJ->VPJ_VALTOT := VS3->VS3_VALTOT
                        dbSelectArea("VS0")
                        dbSetOrder(1)
                        dbSeek(xFilial("VS0")+cMotCancel)
                        VPJ->VPJ_MOTIVO := VS0->VS0_DESMOT
                        VPJ->VPJ_ORDEM  := STRZERO(cCont,3)
                        If VPJ->(FieldPos("VPJ_NOMCLI")) <> 0
                            VPJ->VPJ_NOMCLI:= M->VS1_NCLIFT
                        EndIf
                        MsUnlock()
                        cCont += 1
                    Endif
                   
                    dbSelectArea("VS3")
                    dbSkip()
                Enddo
            Endif
            DBSelectArea("VS4")
            DBSetOrder(1)
            if DBSeek(xFilial("VS4")+VS1->VS1_NUMORC)
                cCont := 1
                While !Eof() .and. VS4->VS4_FILIAL == xFilial("VS4") .and. VS1->VS1_NUMORC == VS4->VS4_NUMORC
                   
                    DBSelectArea("VPM")
                    DBSetOrder(1)
                    if !DBSeek(xFilial("VPM") + VS4->VS4_NUMORC + VS4->VS4_GRUSER + VS4->VS4_CODSER)
                        dbSelectArea("VPM")
                        RecLock("VPM",.t.)
                        VPM->VPM_FILIAL := xFilial("VPJ")
                        VPM->VPM_NUMORC := VS4->VS4_NUMORC
                        VPM->VPM_DATCAN := dDataBase
                        VPM->VPM_HORCAN := val(left(time(),2)+substr(time(),4,2))
                        VPM->VPM_GRUSER := VS4->VS4_GRUSER
                        VPM->VPM_CODSER := VS4->VS4_CODSER
                        VPM->VPM_TIPSER := VS4->VS4_TIPSER
                        VPM->VPM_VALVEN := VS4->VS4_VALSER
                        dbSelectArea("VS0")
                        dbSetOrder(1)
                        dbSeek(xFilial("VS0")+cMotCancel)
                        VPM->VPM_MOTIVO := VS0->VS0_DESMOT
                        VPM->VPM_ORDEM  := STRZERO(cCont,3)
                        If VPM->(FieldPos("VPM_NOMCLI")) <> 0
                            VPM->VPM_NOMCLI:= M->VS1_NCLIFT
                        EndIf
                        MsUnlock()
                        cCont += 1
                    Endif
                   
                    dbSelectArea("VS4")
                    dbSkip()
                Enddo
            Endif
            if ExistBlock("OX001DCN")
                ExecBlock("OX001DCN",.f.,.f.)
            Endif
        else
            DisarmTransaction()
            MsgInfo(STR0065,STR0025)
            lRetT := .f.
        endif
        End Transaction()
        return lRetT
    else
        return .f.
    endif
    return .t.
endif
// ############################################################
// # Verifica se trata-se de VISUALIZACAO DE ORCAMENTO        #
// ############################################################
if !lOX001Auto
    if VISUALIZA
        oDlgXX001:end()
        return .t.
    endif
    // ############################################################
    // # Pergunta se deseja faturar realmente                     #
    // ############################################################
    if M->VS1_TIPORC == "1"
        if !MsgYesNo(STR0067,STR0025)
            return .f.
        endif
    endif
endif
// ############################################################
// # Grava o orcamento (VS1,VS3,VS4)                          #
// ############################################################
if !(cVS1Status $ "234")
    if !OX001GRV(nOpc,.t.)
        return .f.
    endif
    cOrcAtu := VS1->VS1_NUMORC
endif
// ############################################################
// # A fase 4 (conferencia deve ser realizada pelo estoque    #
// ############################################################
if cVS1Status == "4"
    if !lOX001Auto
        MsgInfo(STR0068,STR0025)
    endif
    return .f.
endif
// ##########################################################################
// # I N I C I A   O   P R O C E S S O   D E   F A T U R A M E N T O        #
// ##########################################################################
if M->VS1_TIPORC == "2"
    // Dar o tratamento aqui para verificar pendência de O.S.
    if ExistBlock("OX001VPO") // Antes da Exportacao
        lRet := ExecBlock("OX001VPO",.f.,.f.)
        If !lRet
            Return (lRet)
        Endif
    Endif
    if VS1->VS1_STATUS == "P"
        MsgStop("O orçamento está pendente. Impossível continuar.","Atencao")
        oDlgXX001:end()
        return .f.
    endif
    // ##############################
    // #  VERIFICA  INCONVENIENTES  #
    // ##############################
    // PECAS //
    DbSelectArea("VS3")
    DbSetOrder(1)
    DbSeek(xFilial("VS3")+VS1->VS1_NUMORC)
    While !Eof() .and. xFilial("VS3")==VS3->VS3_FILIAL .and. VS3->VS3_NUMORC==VS1->VS1_NUMORC
        // #  VERIFICA  INCONVENIENTES  #
        //            If lInconveniente .and. !OX001VALINC("P",VS3->VS3_GRUINC,VS3->VS3_CODINC,VS1->VS1_CHAINT,VS1->VS1_KILOME,VS1->VS1_TIPTEM)
        cMsgErroInc := ""
        If lInconveniente .and. !Empty(VS3->VS3_SEQINC) .and. !OM420VALINC("P",,,VS1->VS1_CHAINT,VS1->VS1_KILOME,VS1->VS1_TIPTEM,VS1->VS1_NUMORC,"1",VS3->VS3_SEQINC,@cMsgErroInc)
            aInconv := OM420CONSINC( "1" , VS1->VS1_NUMORC, VS3->VS3_SEQINC )
            if !lOX001Auto
                MsgStop(cMsgErroInc+CHR(13)+CHR(10)+CHR(13)+CHR(10)+STR0070+aInconv[1]+"-"+aInconv[2]+CHR(13)+CHR(10)+STR0071+VS1->VS1_TIPTEM,STR0025)
            //
                //verificar se o usuario tem permissao para utilizar inconveniente

                If lPedApr//primeiro item a pedir aprovacao   .t.
                    lPedApr := .f.
                       DbSelectArea("VAI")
                    Dbsetorder(4)
                    DbSeek(xFilial("VAI")+__cUserID)
                    If VAI->VAI_INCFPV<>"0" //usuario sem permissao para utilizar inconveniente fora da validade
                        If VAI->VAI_INCFPV=="1"//solicitar aprovacao (usuario e senha do usuario autorizado)
                            If !OFX001USR(aInconv[1],aInconv[2])
                                RestArea(cAlias)
                                return .f.
                            EndIF
                        else //nao autorizado
                            RestArea(cAlias)
                            return .f.
                        Endif
                    EndIf
                EndIF           
            //
            endif
        EndIf
        If VS3->VS3_VALPEC <= 0
            if !lOX001Auto
                MsgStop(STR0072,STR0025)
            endif
            Return .f.
        EndIf
        DbSelectArea("VS3")
        DbSkip()
    EndDo
    // SERVICOS //
    DbSelectArea("VS4")
    DbSetOrder(1)
    DbSeek(xFilial("VS4")+VS1->VS1_NUMORC)
    While !Eof() .and. xFilial("VS4")==VS4->VS4_FILIAL .and. VS4->VS4_NUMORC==VS1->VS1_NUMORC
        // #  VERIFICA  INCONVENIENTES  #
        cMsgErroInc := ""
        If lInconveniente .and. !Empty(VS4->VS4_SEQINC) .and. !OM420VALINC("S",,,VS1->VS1_CHAINT,VS1->VS1_KILOME,VS1->VS1_TIPTEM,VS1->VS1_NUMORC,"1",VS4->VS4_SEQINC,@cMsgErroInc)
            aInconv := OM420CONSINC( "1" , VS1->VS1_NUMORC, VS4->VS4_SEQINC )
            if !lOX001Auto
                MsgStop(cMsgErroInc+CHR(13)+CHR(10)+CHR(13)+CHR(10)+STR0074+aInconv[1]+"-"+aInconv[2]+CHR(13)+CHR(10)+STR0075+VS1->VS1_TIPTEM,STR0025)
                //verificar se o usuario tem permissao para utilizar inconveniente

                If lPedApr//primeiro item a pedir aprovacao   .t.
                    lPedApr := .f.
                       DbSelectArea("VAI")
                    Dbsetorder(4)
                    DbSeek(xFilial("VAI")+__cUserID)
                    If VAI->VAI_INCFPV<>"0" //usuario sem permissao para utilizar inconveniente fora da validade
                        If VAI->VAI_INCFPV=="1"//solicitar aprovacao (usuario e senha do usuario autorizado)
                            If !OFX001USR(aInconv[1],aInconv[2])
                                RestArea(cAlias)
                                return .f.
                            EndIF
                        else //nao autorizado
                            RestArea(cAlias)
                            return .f.
                        Endif
                    EndIf
                EndIF
            endif
        EndIf
        If VS4->VS4_VALSER <= 0
            MsgStop(STR0076,STR0025)
            Return .f.
        EndIf
        DbSelectArea("VS4")
        DbSkip()
    EndDo
    //    EndIf
    if !MsgYesNo(STR0077,STR0025)
        return .f.
    endif
    //
    if ExistBlock("OX001AEX") // Antes da Exportacao
        lRet := ExecBlock("OX001AEX",.f.,.f.)
        If !lRet
            Return (lRet)
        Endif
    Endif
    // ##############################
    // # VERIFICA LIMITE DE CREDITO #
    // ##############################
    if VS1->VS1_STATUS != "F" .and. VS1->VS1_STATUS != "2"
        DBSelectArea("VOI")
        DBSetOrder(1)
        DBSeek(xFilial("VOI") + VS1->VS1_TIPTEM)
        if VOI->VOI_SITTPO == "1"
            cTipPag := VS1->VS1_FORPAG
            if Empty(GetNewPar("MV_CPNCLC","")) .or. !alltrim(cTipPag) $ GetMv("MV_CPNCLC") .or. Empty(cTipPag)
                If "I" $ GetMv("MV_CHKCRE")
                    DBSelectArea("SA1")
                    DBSetOrder(1)
                    if GetMv("MV_CREDCLI") == "C"
                        if !DBSeek(xFilial("SA1")+VS1->VS1_CLIFAT + "01")
                            DBSeek(xFilial("SA1")+VS1->VS1_CLIFAT + VS1->VS1_LOJA)
                        endif
                    else
                        DBSeek(xFilial("SA1")+VS1->VS1_CLIFAT + VS1->VS1_LOJA)
                    endif
                    If !MaAvalCred(SA1->A1_COD, SA1->A1_LOJA, (VS1->VS1_VTOTNF+FG_AVALCRED(SA1->A1_COD, SA1->A1_LOJA)) ,1,.T.)
                        if !lOX001Auto
                            MsgInfo(STR0078,STR0025)
                        endif
                        OI001ATU(VS1->VS1_NUMORC,"3")
                        return .f.
                    EndIf
                EndIf
            Endif
        endif
        //
    endif
   
    if VS1->VS1_STATUS != "F" .and. !(OX001LDOFI(VS1->VS1_NUMORC))
        return .f.
    endif
    //
    //ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿
    //³ Verifica se deve adicionar servicos para o inconveniente ( REVISAO ) ³
    //³ quando o orcamento nao foi gerado pelo agendamento                   ³
    //ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ
    IF lInconveniente
        if VS1->(FieldPos("VS1_NUMAGE")) == 0 .or. (VS1->(FieldPos("VS1_NUMAGE")) <> 0 .and. Empty(VS1->VS1_NUMAGE))
            aSrvcAdic := {}
            if !OX001SRVAD(@aSrvcAdic)
                Return .f.
            endif
        EndIf
    EndIf
    // ########################
    // # ORCAMENTO DE OFICINA #
    // ########################
    // ------------------------------------------------------------------------------------------------------------
    BEGIN TRANSACTION // --------I-N-I-C-I-O---D-A---T-R-A-N-S-A-C-A-O---------------------------------------------
    // ------------------------------------------------------------------------------------------------------------
    // ##########################################################################
    // # VERIFICA SE EH O CASO O CASO DE ABRIR UMA NOVA O.S. OU NAO             #
    // ##########################################################################
    if lOX001Auto .or. MsgYesNo(STR0088  ,STR0025)
        If !OX001VERQMX(cNumOrd)
            DisarmTransaction()
               Return .f.
        EndIF
        cNumOrd := FM_ABREOSV( @aCodErro ,,M->VS1_CHAINT , M->VS1_KILOME , M->VS1_CLIFAT, M->VS1_LOJA , M->VS1_OBSMEM, If(Type("M->VS1_DATENT")<>"U",M->VS1_DATENT,Ctod("")) )
        if Empty(cNumOrd)
            if !lOX001Auto
                MsgInfo(aCodErro[2],STR0025 +" - "+aCodErro[1])
            endif
            DisarmTransaction()
            return .f.
        else

            dbSelectArea("VO1")
            dbSetOrder(1)
            if !dbSeek(xFilial("VO1")+cNumOrd)
                if !lOX001Auto
                    MsgStop(STR0089)
                endif
                Return(.f.)
            else
                reclock("VO1",.f.)
                VO1->VO1_NATURE := VS1->VS1_NATURE
                msunlock()
            endif
            If ExistBlock("OFX01OSV")
                cCpoAlt := ExecBlock("OFX01OSV",.f.,.f.)
            EndIf
 

Programa Fonte
OFIXX001, OFX01OSV
Sintaxe

OFX01OSV - Retorna os campos do VO1 que terão possibilidade de alteração no momento da exportação do Orçamento para a OS. ( [ ] ) --> cCamposVO1

Parâmetros:
Nome Tipo Descrição Default Obrigatório Referência
Array of Record
Retorno
    cCamposVO1(caracter)
  • Campos que serão alterados.
Exemplos
#include "Protheus.ch"/*===============================================================================#################################################################################+----------+------------+-------+-----------------------+------+----------+####|Funcao    | OFX01OSV   | Autor | Andre Luis Almeida    | Data | 06/10/10 |####+----------+------------+-------+-----------------------+------+----------+####|Descricao | Ponto de Entrada para retornar os campos do VO1 que terao    |####|          | possibilidade de alteracao no momento da exportacao do Orcto |####|          | para a OS                                                    |####+----------+--------------------------------------------------------------+####|Uso       | Oficina                                                      |####+----------+--------------------------------------------------------------+#################################################################################===============================================================================*/User Function OFX01OSV()Local cCamposVO1 := ""/////////////////////////////////////////////////// Informe os campos que poderao ser alterados ///////////////////////////////////////////////////cCamposVO1 := "VO1_CODCOR/VO1_PRISMA/"/////////////////////////////////////////////////Return cCamposVO1
Variáveis
Nome Tipo Escopo Pode Alterar descrição
Array of Record Global Não