Árvore de páginas

01. DADOS GERAIS

Produto:

TOTVS Backoffice

Linha de Produto:

Linha Protheus

Segmento:

Backoffice

Módulo:Gestão de Contratos
Função:

CNTA121 - Medições

Ticket:

15814349

Issue:

DMANMAT02-40860


02. SITUAÇÃO/REQUISITO

Algumas customizações possíveis de serem realizadas através do CNTA120, por exemplo a utilização de contratos sem planilhas(CNA), não eram permitidas na nova rotina de medições(CNTA121).

03. SOLUÇÃO

O sistema foi ajustado para possibilitar que essas customizações sejam migradas para a nova versão. O ponto de entrada CN300RST também foi modificado para receber parâmetros adicionais.

04. DEMAIS INFORMAÇÕES

Exemplo
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"

/*Exemplo customização com tabelas de usuário que substituem as tabelas do padrão.*/
User Function TstInsCtr()    
    Local cContrato := "CODIGO_DO_CONTRATO"    

    CN9->(DbSetOrder(1))
    If CN9->(DbSeek(xFilial("CN9") + cContrato))
        
        GenZNAxZNB()
        IncMedicao()
        
    EndIf
Return Nil


Static Function GenZNAxZNB()
    Local cChaveZNA := CN9->(xFilial("ZNA", CN9_FILCTR) + CN9_NUMERO + CN9_REVISA)
    Local cChavCNC  := CN9->(xFilial("CNC", CN9_FILCTR) + CN9_NUMERO + CN9_REVISA)
    Local cChaveZNB := ""    
    Local cTipo     := "Z0F" //Tipo flexivel com itens
    Local cCodProd  := "GCT001                        "
    
    aEval({'ZNA','ZNB'},{|x| CHKFILE(x) })

    CNC->(DbSetOrder(1))//CNC_FILIAL+CNC_NUMERO+CNC_REVISA+CNC_CODIGO+CNC_LOJA
    ZNA->(DbSetOrder(1))//ZNA_FILIAL+ZNA_CONTRA+ZNA_REVISA+ZNA_NUMERO
    if !(ZNA->(DbSeek( cChaveZNA ))) .And. CNC->(DbSeek(cChavCNC))
        
        RecLock("ZNA", .T.)
        
        ZNA->ZNA_FILIAL:= xFilial("ZNA", CN9->CN9_FILCTR)
        ZNA->ZNA_CONTRA:= CN9->CN9_NUMERO
        ZNA->ZNA_REVISA:= CN9->CN9_REVISA
        ZNA->ZNA_NUMERO:= StrZero(1, GetSx3Cache('CNA_NUMERO','X3_TAMANHO'))
        ZNA->ZNA_FORNEC:= CNC->CNC_CODIGO
        ZNA->ZNA_LOJA  := CNC->CNC_LOJA
        ZNA->ZNA_TIPO  := cTipo
        
        ZNA->(MsUnlock())

        cChaveZNB := ZNA->(ZNA_FILIAL+ZNA_CONTRA+ZNA_REVISA+ZNA_NUMERO)
        ZNB->(DbSetOrder(1))
        If !(ZNB->(DbSeek(cChaveZNB)))
            RecLock("ZNB", .T.)
            
            ZNB->ZNB_FILIAL := ZNA->ZNA_FILIAL
            ZNB->ZNB_CONTRA := ZNA->ZNA_CONTRA
            ZNB->ZNB_REVISA := ZNA->ZNA_REVISA
            ZNB->ZNB_NUMERO := ZNA->ZNA_NUMERO
            ZNB->ZNB_PRODUT := cCodProd
            ZNB->ZNB_VLUNIT := 1000.00
            
            ZNB->(MsUnlock())
        EndIf        
        
    endif

Return

Static Function IncMedicao()
    Local oModel := FwLoadModel("CNTA121")
    Local cChaveZNA := CN9->(xFilial("ZNA", CN9_FILCTR) + CN9_NUMERO + CN9_REVISA)
    Local cChaveZNB := ""
    Local aErros := {}
    Local bTrueWhen := FwBuildFeature( STRUCT_FEATURE_WHEN, ".T.")

    oModel:SetOperation(MODEL_OPERATION_INSERT)

    If oModel:Activate()
        oModel:SetValue("CNDMASTER","CND_CONTRA", CN9->CN9_NUMERO)

        if oModel:HasErrorMessage()
            /*
                Ao setar CND_CONTRA, normalmente o sistema carregaria as planilhas(CXN) da CNA,
                por conta disso é possível que o erro <CNTA120COMPET> seja apresentado, se isso ocorrer, 
                limpar o erro do modelo com oModel:GetErrorMessage(.T.).
                Outra alternativa seria utilizar o P.E CN120QCP p/ utilizar a ZNA na consulta das competências.
            */
            oModel:GetErrorMessage(.T.)            
        endif
        
        oModelCXN := oModel:GetModel("CXNDETAIL")
        oModelCNE := oModel:GetModel("CNEDETAIL")        

        ZNA->(DbSetOrder(1))//ZNA_FILIAL+ZNA_CONTRA+ZNA_REVISA+ZNA_NUMERO
        If (ZNA->(DbSeek( cChaveZNA )))            
            CNTA300BlMd(oModelCXN, .F.) //Libera p/ edição	
            oModelCXN:GetStruct():SetProperty('*',MODEL_FIELD_WHEN, bTrueWhen)

            ZNB->(DbSetOrder(1))//ZNB_FILIAL+ZNB_CONTRA+ZNB_REVISA+ZNB_NUMERO
            While ZNA->(!Eof() .And. ZNA_FILIAL+ZNA_CONTRA+ZNA_REVISA == cChaveZNA)

                If !oModelCXN:SeekLine( {{ 'CXN_NUMPLA' , ZNA->ZNA_NUMERO }} )

                    if !Empty(oModelCXN:GetValue('CXN_NUMPLA'))
                        oModelCXN:AddLine()
                    endif

                    oModelCXN:LoadValue("CXN_FILIAL", xFilial("CXN"))
                    oModelCXN:LoadValue("CXN_CONTRA", ZNA->ZNA_CONTRA)
                    oModelCXN:LoadValue("CXN_REVISA", ZNA->ZNA_REVISA)
                    oModelCXN:LoadValue("CXN_NUMMED", oModel:GetValue("CNDMASTER", "CND_NUMMED"))                    
                    oModelCXN:LoadValue("CXN_NUMPLA", ZNA->ZNA_NUMERO)
                    oModelCXN:LoadValue("CXN_DTINI ", CN9->CN9_DTINIC)
                    oModelCXN:LoadValue("CXN_VLTOT ", 0)
                    oModelCXN:LoadValue("CXN_DTFIM ", CN9->CN9_DTFIM)                    
                    oModelCXN:LoadValue("CXN_TIPPLA", ZNA->ZNA_TIPO)
                    oModelCXN:LoadValue("CXN_DESCRI", Posicione( "CNL" , 1 , xFilial("CNL", CN9->CN9_FILCTR) + ZNA->ZNA_TIPO , "CNL_DESCRI" ) )
                    oModelCXN:LoadValue("CXN_VLSALD", CN9->CN9_SALDO )

                    oModelCXN:LoadValue("CXN_FORCLI", ZNA->ZNA_FORNEC )
				    oModelCXN:LoadValue("CXN_LOJA"  , ZNA->ZNA_LOJA )
                    oModelCXN:LoadValue("CXN_VLPREV", 1000.00 )
                    oModelCXN:LoadValue("CXN_DTVENC", dDataBase )
                    oModelCXN:LoadValue("CXN_ZERO"  , "0" )

                    if oModelCXN:SetValue("CXN_CHECK", .T.)
                        CNTA300BlMd(oModelCNE, .F.) //Libera p/ edição
                        oModelCNE:GetStruct():SetProperty('*',MODEL_FIELD_WHEN,bTrueWhen)

                        cChaveZNB := ZNA->(ZNA_FILIAL+ZNA_CONTRA+ZNA_REVISA+ZNA_NUMERO)
                        While ZNB->(!Eof() .And. ZNB_FILIAL+ZNB_CONTRA+ZNB_REVISA+ZNB_NUMERO == cChaveZNB)
                            
                            if !Empty(oModelCNE:GetValue('CNE_PRODUT'))
                                oModelCNE:AddLine()
                            endif                            

                            oModelCNE:LoadValue('CNE_CONTRA',ZNB->ZNB_CONTRA)
                            oModelCNE:LoadValue('CNE_REVISA',ZNB->ZNB_REVISA)
                            oModelCNE:LoadValue('CNE_NUMERO',ZNB->ZNB_NUMERO)
                            oModelCNE:LoadValue('CNE_ITEM'	,StrZero(1, GetSx3Cache('CNB_ITEM','X3_TAMANHO')))
                            oModelCNE:LoadValue('CNE_DTENT'	,dDataBase)
                            oModelCNE:LoadValue('CNE_QTAMED',1)
                            oModelCNE:LoadValue('CNE_SDAMED',1)
                            oModelCNE:LoadValue('CNE_QTDSOL',1)
                            
                            oModelCNE:SetValue('CNE_PRODUT' , ZNB->ZNB_PRODUT)
						    oModelCNE:LoadValue('CNE_DESCRI', 'XPTO')
                            oModelCNE:SetValue('CNE_QUANT'  , 1)
                            oModelCNE:SetValue('CNE_VLUNIT' , ZNB->ZNB_VLUNIT)

                            ZNB->(DbSkip())
                        endDo
                        
                    endif

                EndIf                
                ZNA->(DbSkip())
            endDo            

            if oModel:VldData()                
                oModel:CommitData()
            endif
        EndIf        
    EndIf

    If oModel:HasErrorMessage()
        aErros := oModel:GetErrorMessage()
    EndIf

    If oModel:IsActive()
        oModel:DeActivate()
        FreeObj(oModel)
    EndIf

Return


05. ASSUNTOS RELACIONADOS