Árvore de páginas

Versões comparadas

Chave

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

Exemplo de rotina automática - Inclusão de contrato

A Rotina

A rotina CNTA300 foi desenvolvida em MVC

, portanto para realizar a inclusão, alteração e exclusão de um contrato, automaticamente

e para realizar as ações via rotina automática, deve-se fazer uso do

modelo de dados. A Seguir mostraremos um exemplo de como realizar a inclusão de um contrato utilizando o

modelo de dados

da rotina CNTA300

.

Para mais detalhes sobre a utilização do MVC, consulte

a pagina: 

http://tdn.totvs.com/display/public/mp/AdvPl+utilizando+MVC

.

A seguir mostraremos alguns exemplos de rotina automática relacionados ao contrato utilizando o modelo de dados da rotina CNTA300.


Produto:

TOTVS Backoffice

Linha de Produto:

Linha Protheus

Segmento:

Backoffice

Módulo:

TOTVS Backoffice (Linha Protheus) - Gestão de Contratos (SIGAGCT)

Função:

CNTA300 - Contratos

País:Todos
Banco(s) de Dados:Todos
Sistema(s) Operacional(is):Todos
Informações
titleLista de funções úteis
FunçãoUtilizaçãoReferente ao botão
A300STpRev("< TIPO_DE_REVISÃO >") 

Define o tipo de revisão que será realizada. São tipos de revisão válidos:

"1" - Aditivo
"2" - Reajuste
"3" - Realinhamento
"4" - Readequação
"5" - Paralisação
"6" - Reinício
"7" - Cláusulas
"8" - Contábil
"9" - Índice
"A" - Fornecedor/Cliente
"B" - Grupo de aprovação
"C" - Renovação
"D" - Multa/Bonificação
"E" - Caução
"F" - Orçamento de serviços GS
"G" - Aberta


A300GTpRev()

Retorna o tipo de revisão que está sendo realizada, definida pela função A300STpRev()


CN300PrCFFunção que processa a inclusão do cronograma financeiro/físicoIncluir cronograma financeiro/físico
CN300DelCrg()Exclui cronograma financeiro e físicoExcluir cronograma financeiro/físico
CN300PrcCC()Inclui cronograma contábilIncluir cronograma contábil
CN300DelCtb()Exclui cronograma contábilExcluir cronograma contábil
CN300RdSld(oModel)

Redistribui saldo do cronograma.

Redistribuir saldo
CN300AtCrs(oModel)Atualizar cronograma financeiro e físicoAtualizar cronograma financeiro/físico
CN300Reaju(oModel)Realiza reajuste baseado em índicesExecutar reajuste
CN300Aprov(lAuto)
Realiza aprovação de revisão posicionada.Aprovar revisão
A300GTMenuRetorna se está ocorrendo uma operação de inclusão de revisão, aprovação de revisão ou adiantamento

Possíveis retornos:

  • "AP" = durante a aprovação de uma revisão
  • "AD" = durante a operação de inclusão de adiantamento
  • Código do tipo de revisão = durante a operação de inclusão de revisão. Possíveis valores:
    • "1" - Aditivo
    • "2" - Reajuste
    • "3" - Realinhamento
    • "4" - Readequação
    • "5" - Paralisação
    • "6" - Reinício
    • "7" - Cláusulas
    • "8" - Contábil
    • "9" - Índice
    • "A" - Fornecedor/Cliente
    • "B" - Grupo de aprovação
    • "C" - Renovação
    • "D" - Multa/Bonificação
    • "E" - Caução
    • "F" - Orçamento de Serviços GS


Exemplos


Expandir
titleInclusão de contrato
Bloco de código
themeEclipse
#Include 'Protheus.ch'
#INCLUDE "FWMVCDEF.CH"
User Function CN300AUTO()

Local oModel := FWLoadModel("CNTA300") //Carrega o modelo

oModel:SetOperation(MODEL_OPERATION_INSERT) // Seta operação de inclusão

oModel:Activate() // Ativa o Modelo 

//Cabeçalho do contrato
oModel:SetValue( 'CN9MASTER'	, 'CN9_DTINIC'	, Ctod("24/02/2017")	)
oModel:SetValue( 'CN9MASTER'	, 'CN9_NUMERO'	, '000000000000069'	)
oModel:SetValue( 'CN9MASTER'	, 'CN9_UNVIGE'	, '3'	
Bloco de código
themeEclipse
#Include 'Protheus.ch' #INCLUDE "FWMVCDEF.CH" User Function CN300AUTO() Local oModel := FWLoadModel("CNTA300") //Carrega o modelo oModel:SetOperation(MODEL_OPERATION_INSERT) // Seta operação de inclusão oModel:Activate() // Ativa o Modelo //Cabeçalho do contrato oModel:SetValue( 'CN9MASTER' , 'CN9_DTINIC' , Ctod("24/02/2017") ) oModel:SetValue( 'CN9MASTER' , 'CN9_NUMERO' , '000000000000069' ) oModel:SetValue( 'CN9MASTER' , 'CN9_UNVIGE' , '3' ) oModel:SetValue( 'CN9MASTER' , 'CN9_VIGE' , 1 ) oModel:SetValue( 'CN9MASTER' , 'CN9_MOEDA' , 1 ) oModel:SetValue( 'CN9MASTER' , 'CN9_CONDPG' , '001' ) oModel:SetValue( 'CN9MASTER' , 'CN9_TPCTO' , '001' ) //Cliente/Fornecedor do Contrato oModel:SetValue( 'CNCDETAIL' , 'CNC_CODIGO' , '001 ' ) oModel:SetValue( 'CNCDETAIL' , 'CNC_LOJA' , '01' ) //Planilhas do Contrato oModel:LoadValue( 'CNADETAIL' , 'CNA_CONTRA' , '000000000000069' ) oModel:SetValue( 'CNADETAIL' , 'CNA_NUMERO' , '000001' ) oModel:SetValue( 'CNADETAIL' , 'CNA_FORNEC' , '001 ' ) oModel:SetValue( 'CNADETAIL' , 'CNA_LJFORN' , '01' ) oModel:SetValue( 'CNADETAIL' , 'CNA_TIPPLA' , '004' ) //Itens da Planilha do Contrato oModel:SetValue( 'CNBDETAIL' , 'CNB_ITEM' , '001'
				)
oModel:SetValue( '
CNBDETAIL
CN9MASTER'	, '
CNB
CN9_
PRODUT
VIGE'		, 
'001 '
1						)
oModel:SetValue( '
CNBDETAIL
CN9MASTER'	, '
CNB
CN9_
QUANT
MOEDA'		, 1						)
oModel:SetValue( '
CNBDETAIL
CN9MASTER'	, '
CNB
CN9_
VLUNIT
CONDPG'	, 
1000
'001'				)
oModel:SetValue( '
CNBDETAIL
CN9MASTER'	, '
CNB
CN9_
PEDTIT
TPCTO'		, '
1
001'				
)

//Cliente/
Cronograma
Fornecedor do 
Financeiro
Contrato
SetMVValue("CN300CRG","MV_PAR01",1) SetMVValue("CN300CRG","MV_PAR02",30) SetMVValue("CN300CRG","MV_PAR03",1) SetMVValue("CN300CRG","MV_PAR04","02/2017") SetMVValue("CN300CRG","MV_PAR05", cTod("24/02/2017")) SetMVValue("CN300CRG","MV_PAR06", 1) SetMVValue("CN300CRG","MV_PAR07", " ") SetMVValue("CN300CRG","MV_PAR08", 0) Pergunte("CN300CRG",.F.) CN300PrCF(.T.)   //Validação e Gravação do Modelo If oModel:VldData() oModel:CommitData() EndIf Return

Exemplo de Rotina Automática CNTA300

Características do Requisito

Linha de Produto:

Microsiga Protheus

Segmento:

Serviços

Módulo:

Gestão de Contratos

Rotina:

Rotina

Nome Técnico

CNTA300

Manutenção de Contratos

País(es):

Todos

Banco(s) de Dados:

Todos

Sistema(s) Operacional(is):

Todos

Informações
titleLista de funções úteis
FunçãoUtilizaçãoReferente ao botãoA300STpRev("< TIPO_DE_REVISÃO >") 

Define o tipo de revisão que será realizada. São tipos de revisão válidos:

"1" - Aditivo
"2" - Reajuste
"3" - Realinhamento
"4" - Readequação
"5" - Paralisação
"6" - Reinício
"7" - Cláusulas
"8" - Contábil
"9" - Índice
"A" - Fornecedor/Cliente
"B" - Grupo de Aprovação
"C" - Renovação
"D" - Multa/Bonificação
"E" - Caução
"F" - Orçamento de Serviços GS
"G" - Aberta

A300GTpRev()

Retorna o tipo de revisão que está sendo realizada, definida pela função A300STpRev()

CN300PrCFFunção que processa a inclusão do cronograma financeiro/físicoIncluir cronograma financeiro/físicoCN300DelCrg()Exclui cronograma financeiro e físicoExcluir cronograma financeiro/físicoCN300PrcCC()Inclui cronograma contábilIncluir cronograma contábilCN300DelCtb()Exclui cronograma contábilExcluir cronograma contábilCN300RdSld(oModel)

Redistribui saldo do cronograma.

Redistribuir SaldoCN300AtCrs(oModel)Atualizar cronograma financeiro e físicoAtualizar cronograma financeiro/físicoCN300Reaju(oModel)Realiza reajuste baseado em índicesExecutar reajuste
CN300Aprov(lAuto)
Realiza aprovação de revisão posicionada.Aprovar Revisão
oModel:SetValue( 'CNCDETAIL'	, 'CNC_CODIGO'	, '001   '	)
oModel:SetValue( 'CNCDETAIL'	, 'CNC_LOJA'		, '01'		)

//Planilhas do Contrato
oModel:LoadValue(	'CNADETAIL'	, 'CNA_CONTRA'	, '000000000000069'	)
oModel:SetValue( 	'CNADETAIL' 	, 'CNA_NUMERO'	, '000001'				)
oModel:SetValue(	'CNADETAIL' 	, 'CNA_FORNEC'	, '001   '				)
oModel:SetValue(	'CNADETAIL' 	, 'CNA_LJFORN'	, '01'					)
oModel:SetValue(	'CNADETAIL' 	, 'CNA_TIPPLA'	, '004'				)

//Itens da Planilha do Contrato
oModel:SetValue( 'CNBDETAIL'	, 'CNB_ITEM'		, '001'				)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_PRODUT'	, '001            '	)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_QUANT'		, 1						)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_VLUNIT'	, 1000					)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_PEDTIT'	, '1'					)

//Cronograma Financeiro
SetMVValue("CN300CRG","MV_PAR01",1)
SetMVValue("CN300CRG","MV_PAR02",30)
SetMVValue("CN300CRG","MV_PAR03",1)
SetMVValue("CN300CRG","MV_PAR04","02/2017")
SetMVValue("CN300CRG","MV_PAR05", cTod("24/02/2017"))
SetMVValue("CN300CRG","MV_PAR06", 1)
SetMVValue("CN300CRG","MV_PAR07", "   ")
SetMVValue("CN300CRG","MV_PAR08", 0)

Pergunte("CN300CRG",.F.)
CN300PrCF(.T.)

//Validação e Gravação do Modelo
If oModel:VldData() 
	oModel:CommitData() 
EndIf

Return
Expandir
titleInclusão de contrato de vendas

Para contratos de vendas deve-se carregar o modelo CNTA301 ao invés do CNTA300.

Bloco de código
themeEclipse
#Include 'Protheus.ch'
#Include "FWMVCDEF.CH"
#INCLUDE "RWMAKE.CH"
#INCLUDE "TBICONN.CH"

User Function CN300AUTO()    
    Local nRet      :=  0
        
    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10"               
        ConOut("INICIO TESTE")
		
		ExCtrVenda()
        
        ConOut("FIM TESTE") 
    RESET ENVIRONMENT
Return nRet

Static Function ExCtrVenda()
	Local aErro		:= {}
    Local oModel	:= Nil
	Local cContrat	:= "EXCTRVENDA"

	oModel := FWLoadModel('CNTA301')
	oModel:SetOperation(MODEL_OPERATION_INSERT)
	oModel:Activate()
	
	//Cabeçalho do Contrato
	oModel:SetValue('CN9MASTER','CN9_NUMERO', cContrat)
	oModel:SetValue('CN9MASTER','CN9_DTINIC', dDataBase)
	oModel:SetValue('CN9MASTER','CN9_UNVIGE', '2')
	oModel:SetValue('CN9MASTER','CN9_VIGE', 	 6	)
	oModel:SetValue('CN9MASTER','CN9_MOEDA',	 1)
	oModel:SetValue('CN9MASTER','CN9_TPCTO',	 "031")
	oModel:SetValue('CN9MASTER','CN9_CONDPG', "000")
	oModel:SetValue('CN9MASTER','CN9_AUTO',	 '1')	
	
	//Cliente/Fornecedor do Contrato
	oModel:SetValue('CNCDETAIL','CNC_CLIENT'	, "CN300R")
	oModel:SetValue('CNCDETAIL','CNC_LOJACL'	, "01")
	
	//Planilhas do Contrato	
	oModel:SetValue('CNADETAIL','CNA_NUMERO', PadL("1", Len(CNA->CNA_NUMERO),"0"))
	oModel:SetValue('CNADETAIL','CNA_CLIENT', "CN300R")
	oModel:SetValue('CNADETAIL','CNA_LOJACL', "01")
	oModel:SetValue('CNADETAIL','CNA_TIPPLA', "Z0F")
	
	//Itens da Planilha do Contrato
	oModel:SetValue('CNBDETAIL','CNB_ITEM', PadL("1", Len(CNB->CNB_ITEM),"0"))
	oModel:SetValue('CNBDETAIL','CNB_PRODUT'	,'GCT000000000000000000000000001')
	oModel:SetValue('CNBDETAIL','CNB_QUANT'	,6)
	oModel:SetValue('CNBDETAIL','CNB_TS'		, '501')

	If (oModel:VldData()) /*Valida o modelo como um todo*/
		oModel:CommitData()//--Grava Contrato
	EndIf

	CN9->(DbSetOrder(1))
	If(oModel:HasErrorMessage())
		aErro := oModel:GetErrorMessage()
		AEval( aErro, { | x |  ConOut( x ) + CRLF   } )
	ElseIf(CN9->(DbSeek(xFilial("CN9") + cContrat)))
		ConOut("Contrato gravado com sucesso.")
	EndIf

Return
Expandir
titleInclusão de contrato com rateios
Bloco de código
firstline1
titleExemplo com Rateios
linenumberstrue
#Include 'Protheus.ch'
#Include "FWMVCDEF.CH"
#INCLUDE "RWMAKE.CH"
#INCLUDE "TBICONN.CH"
 
User Function CN300AUTO()   
    Local nRet      :=  0
         
    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10"              
        ConOut("INICIO TESTE")
         
        IncCtrRateio()
         
        ConOut("FIM TESTE")
    RESET ENVIRONMENT
Return nRet

/*Exemplo de inclusão de contrato com rateios(CNZ)*/ 
Static Function IncCtrRateio()
    Local aErro     := {}
    Local oModel    := Nil
    Local oModelCNB := Nil
    Local oModelCNZ := Nil
    Local cContrat  := "CONTRARATEIO"
 
    oModel := FWLoadModel('CNTA300')
    oModel:SetOperation(MODEL_OPERATION_INSERT)
    oModel:Activate()
     
    //Cabeçalho do Contrato
    oModel:SetValue('CN9MASTER','CN9_NUMERO', cContrat)
    oModel:SetValue('CN9MASTER','CN9_DTINIC', dDataBase)
    oModel:SetValue('CN9MASTER','CN9_UNVIGE', '2')
    oModel:SetValue('CN9MASTER','CN9_VIGE',      6  )
    oModel:SetValue('CN9MASTER','CN9_MOEDA',     1)
    oModel:SetValue('CN9MASTER','CN9_TPCTO',     "001")
    oModel:SetValue('CN9MASTER','CN9_CONDPG', "000")
    oModel:SetValue('CN9MASTER','CN9_AUTO'  ,  '1')  
     
    //Cliente/Fornecedor do Contrato
    oModel:SetValue('CNCDETAIL','CNC_CODIGO', "GCT001")
    oModel:SetValue('CNCDETAIL','CNC_LOJA'  , "01")    
     
    //Planilhas do Contrato
    oModel:SetValue('CNADETAIL','CNA_NUMERO'    , PadL("1", Len(CNA->CNA_NUMERO),"0"))
    oModel:SetValue('CNADETAIL','CNA_FORNEC'    , oModel:GetValue('CNCDETAIL','CNC_CODIGO'))    
    oModel:SetValue('CNADETAIL','CNA_TIPPLA'    , "Z0F")     

    oModelCNB := oModel:GetModel("CNBDETAIL")
    oModelCNZ := oModel:GetModel("CNZDETAIL")
    
    //Primeiro produto
    oModelCNB:SetValue('CNB_ITEM'      , StrZero(1, Len(CNB->CNB_ITEM)))
    oModelCNB:SetValue('CNB_PRODUT'    ,'GCT000000000000000000000000001')
    oModelCNB:SetValue('CNB_QUANT'     ,6)
    oModelCNB:SetValue('CNB_VLUNIT'    ,500)
    //Rateio do primeiro item
    oModelCNZ:SetValue('CNZ_ITEM'   ,StrZero(1, Len(CNZ->CNZ_ITEM)))
    oModelCNZ:SetValue('CNZ_PERC'   ,50)
    oModelCNZ:SetValue('CNZ_CC'     ,'GCT000001')
    oModelCNZ:AddLine()
    oModelCNZ:SetValue('CNZ_ITEM'   ,StrZero(2, Len(CNZ->CNZ_ITEM)))
    oModelCNZ:SetValue('CNZ_PERC'   ,50)
    oModelCNZ:SetValue('CNZ_CC'     ,'GCT000002')

    //Segundo produto 
    oModelCNB:AddLine()
    oModelCNB:SetValue('CNB_ITEM'      , StrZero(2, Len(CNB->CNB_ITEM)))
    oModelCNB:SetValue('CNB_PRODUT'    ,'GCT000000000000000000000000002')
    oModelCNB:SetValue('CNB_QUANT'     ,6)
    oModelCNB:SetValue('CNB_VLUNIT'    ,500)
    //Rateio do segundo item
    oModelCNZ:SetValue('CNZ_ITEM'   ,StrZero(1, Len(CNZ->CNZ_ITEM)))
    oModelCNZ:SetValue('CNZ_PERC'   ,70)
    oModelCNZ:SetValue('CNZ_CC'     ,'GCT000003')
    oModelCNZ:AddLine()
    oModelCNZ:SetValue('CNZ_ITEM'   ,StrZero(2, Len(CNZ->CNZ_ITEM)))
    oModelCNZ:SetValue('CNZ_PERC'   ,30)
    oModelCNZ:SetValue('CNZ_CC'     ,'GCT000005')

 
    If (oModel:VldData()) /*Valida o modelo como um todo*/
        oModel:CommitData()//--Grava Contrato
    EndIf
 
    CN9->(DbSetOrder(1))
    If(oModel:HasErrorMessage())
        aErro := oModel:GetErrorMessage()
        AEval( aErro, { | x |  ConOut( x ) } )
    ElseIf(CN9->(DbSeek(xFilial("CN9") + cContrat)))
        ConOut("Contrato gravado com sucesso.")
    EndIf
Return
Expandir
titleInclusão de adiantamentos em um contrato
Bloco de código
firstline1
titleExemplo com Adiantamentos
linenumberstrue
#Include 'Protheus.ch'
#Include "FWMVCDEF.CH"
#INCLUDE "RWMAKE.CH"
#INCLUDE "TBICONN.CH"

User Function CN300AUTO()         
    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10"              
        ConOut("INICIO TESTE")
         
        ExemploAdt()
         
        ConOut("FIM TESTE")
    RESET ENVIRONMENT
Return

/*Exemplo da utilização dos adiantamentos sem interface gráfica*/
Static Function ExemploAdt()
    Local oModel    := NIL
    Local cModelId  := ""
    Local cContra   := "CONTRATOADT"
    Local cChave    := xFilial("CN9") + cContra
    Local aErro     := {}
    Local oMdlCNX   := NIL
    Local cNumero   := ""

    CN9->(DbSetOrder(1))
    If CN9->(DbSeek(cChave))
        A300lAdian(.T.) //Ativa operação adiantamento

        cModelId:= CN9->(IIF(CN9_ESPCTR == '1', 'CNTA300', 'CNTA301'))
        oModel  := FwLoadModel(cModelId)
        oModel:SetOperation(MODEL_OPERATION_UPDATE)
        If oModel:Activate()
            oMdlCNX := oModel:GetModel("CNXDETAIL")

            cNumero := StrZero(oMdlCNX:Length(), GetSx3Cache('CNX_NUMERO','X3_TAMANHO'))
            oMdlCNX:SetValue('CNX_NUMERO', cNumero)

            If cModelId == 'CNTA301'//Venda                
                oMdlCNX:SetValue('CNX_CLIENT', oModel:GetValue('CNCDETAIL', 'CNC_CLIENT'))
                oMdlCNX:SetValue('CNX_LOJACL', oModel:GetValue('CNCDETAIL', 'CNC_LOJACL'))
            Else//Compra
                oMdlCNX:SetValue('CNX_FORNEC', oModel:GetValue('CNCDETAIL', 'CNC_CODIGO'))
                oMdlCNX:SetValue('CNX_LJFORN', oModel:GetValue('CNCDETAIL', 'CNC_LOJA'))
            EndIf

            oMdlCNX:SetValue('CNX_VLADT', 1000)
            oMdlCNX:SetValue('CNX_BANCO', '000')//gatilhará agência(CNX_AGENCI) e conta(CNX_CONTA)
            
            If oModel:VldData()
                oModel:CommitData()
            EndIf
        EndIf


        if oModel:HasErrorMessage()
            aErro := aClone(oModel:GetErrorMessage())
        endif

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

        A300lAdian(.F.) //Desativa operação adiantamento
        
        If !Empty(aErro)
            VarInfo('Erro apresentado:', aErro)            
        EndIf
    EndIf
Return
Expandir
titleInclusão de contrato com múltiplas planilhas
Bloco de código
firstline1
titleExemplo múltiplas planilhas
linenumberstrue
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
#INCLUDE "TBICONN.CH"

User Function CN300AUTO()   
    Local nRet      :=  0
         
    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10"              
        ConOut("INICIO TESTE")
         
        IncMultPlan()
         
        ConOut("FIM TESTE")
    RESET ENVIRONMENT
Return nRet

/*Exemplo de inclusão de contrato com múltiplas planilhas*/ 
Static Function IncMultPlan()
    Local aErro     := {}
    Local oModel    := Nil
    Local oModelCNB := Nil
    Local oModelCNA := Nil
    Local cContrat  := "CTRMULTIPLAN"
    Local nX        := 0
    Local nQtdPlan  := 3

    oModel := FWLoadModel('CNTA300')
    oModel:SetOperation(MODEL_OPERATION_INSERT)
    oModel:Activate()
     
    //Cabeçalho do Contrato
    oModel:SetValue('CN9MASTER','CN9_NUMERO', cContrat)
    oModel:SetValue('CN9MASTER','CN9_DTINIC', dDataBase)
    oModel:SetValue('CN9MASTER','CN9_UNVIGE', '2')
    oModel:SetValue('CN9MASTER','CN9_VIGE',      6  )
    oModel:SetValue('CN9MASTER','CN9_MOEDA',     1)
    oModel:SetValue('CN9MASTER','CN9_TPCTO',     "001")
    oModel:SetValue('CN9MASTER','CN9_CONDPG', "000")
    oModel:SetValue('CN9MASTER','CN9_AUTO'  ,  '1')  
     
    //Cliente/Fornecedor do Contrato
    oModel:SetValue('CNCDETAIL','CNC_CODIGO', "GCT001")
    oModel:SetValue('CNCDETAIL','CNC_LOJA'  , "01") 
    oModelCNB := oModel:GetModel("CNBDETAIL")
    oModelCNA := oModel:GetModel("CNADETAIL")

    for nX := 1 to nQtdPlan
        If !(Empty(oModelCNA:GetValue('CNA_NUMERO')))
            oModelCNA:AddLine()
        EndIf
        //Planilhas do Contrato
        oModelCNA:LoadValue('CNA_NUMERO'    , StrZero(nX, Len(CNA->CNA_NUMERO)))
        oModelCNA:SetValue('CNA_FORNEC'    , oModel:GetValue('CNCDETAIL','CNC_CODIGO'))    
        oModelCNA:SetValue('CNA_TIPPLA'    , "Z0F")
        
        //Primeiro produto
        oModelCNB:SetValue('CNB_ITEM'      , StrZero(1, Len(CNB->CNB_ITEM)))
        oModelCNB:SetValue('CNB_PRODUT'    ,'GCT000000000000000000000000001')
        oModelCNB:SetValue('CNB_QUANT'     ,6)
        oModelCNB:SetValue('CNB_VLUNIT'    ,500)
        //Segundo produto 
        oModelCNB:AddLine()
        oModelCNB:SetValue('CNB_ITEM'      , StrZero(2, Len(CNB->CNB_ITEM)))
        oModelCNB:SetValue('CNB_PRODUT'    ,'GCT000000000000000000000000002')
        oModelCNB:SetValue('CNB_QUANT'     ,6)
        oModelCNB:SetValue('CNB_VLUNIT'    ,500)
    next nX
 
    If (oModel:VldData()) /*Valida o modelo como um todo*/
        oModel:CommitData()//--Grava Contrato
    EndIf
 
    CN9->(DbSetOrder(1))
    If(oModel:HasErrorMessage())
        aErro := oModel:GetErrorMessage()
        AEval( aErro, { | x |  ConOut( x ) } )
    ElseIf(CN9->(DbSeek(xFilial("CN9") + cContrat)))
        ConOut("Contrato gravado com sucesso.")
    EndIf
 
Return
Expandir
titleInclusão de contrato com geração de cronograma

A função CN300PrCF(.T.) permite que se gere automaticamente o cronograma financeiro/físico pela rotina automática da mesma maneira que se faz pela tela(pelo botão Outras Ações → Incluir cronograma financeiro/físico).

A função recebe como argumento a variável lógica .T. para efetuar a inclusão do cronograma financeiro/físico


UtilidadeValor
1Periodicidade(tipo numérico)1=Mensal, 2=Quinzenal, 3=Diário, 4=Condição Pagamento
2Dias(tipo numérico) Número de dias para avançar nas parcelas do cronograma
3Último dia do mês?(Tipo numérico)

1 = SIM ou 2= NÃO

Indica se a data prevista de medição deve ser ajustada para o último dia do mês de competência

4Competência de início?(tipo caractere)Deve ser composta por mês/ano no formato MM/AAAA(Exemplo: 12/2018)
5Data prevista da 1º medição(tipo data)

Data prevista para que ocorra a primeira medição(exemplo:  )

6Quantidade de parcelas(tipo numérico)Número de parcelas do cronograma
7Condição de Pagamento(tipo caractere)Código da condição de pagamento que as parcelas do cronograma devem ser geradas
8Taxa de Juros(tipo numérico)

Taxa de Juros para cálculo do valor presente

Exemplo de rotina automática - Inclusão de contrato

A Rotina CNTA300 foi desenvolvida em MVC, portanto para realizar a inclusão, alteração e exclusão de um contrato, automaticamente, deve-se fazer uso do modelo de dados. A Seguir mostraremos um exemplo de como realizar a inclusão de um contrato utilizando o modelo de dados da rotina CNTA300.

Para mais detalhes sobre a utilização do MVC, consulte a pagina: http://tdn.totvs.com/display/public/mp/AdvPl+utilizando+MVC

Bloco de código
themeEclipse
#Include 'Protheus.ch'
#INCLUDE "FWMVCDEF.CH"
User Function CN300AUTO()

Local oModel := FWLoadModel("CNTA300") //Carrega o modelo

oModel:SetOperation(MODEL_OPERATION_INSERT) // Seta operação de inclusão

oModel:Activate() // Ativa o Modelo 

//Cabeçalho do contrato
oModel:SetValue( 'CN9MASTER'	, 'CN9_DTINIC'	, Ctod("24/02/2017")	)
oModel:SetValue( 'CN9MASTER'	, 'CN9_NUMERO'	, '000000000000069'	)
oModel:SetValue( 'CN9MASTER'	, 'CN9_UNVIGE'	, '3'					)
oModel:SetValue( 'CN9MASTER'	, 'CN9_VIGE'		, 1						)
oModel:SetValue( 'CN9MASTER'	, 'CN9_MOEDA'		, 1						)
oModel:SetValue( 'CN9MASTER'	, 'CN9_CONDPG'	, '001'				)
oModel:SetValue( 'CN9MASTER'	, 'CN9_TPCTO'		, '001'				)

//Cliente/Fornecedor do Contrato
oModel:SetValue( 'CNCDETAIL'	, 'CNC_CODIGO'	, '001   '	)
oModel:SetValue( 'CNCDETAIL'	, 'CNC_LOJA'		, '01'		)

//Planilhas do Contrato
oModel:LoadValue(	'CNADETAIL'	, 'CNA_CONTRA'	, '000000000000069'	)
oModel:SetValue( 	'CNADETAIL' 	, 'CNA_NUMERO'	, '000001'				)
oModel:SetValue(	'CNADETAIL' 	, 'CNA_FORNEC'	, '001   '				)
oModel:SetValue(	'CNADETAIL' 	, 'CNA_LJFORN'	, '01'					)
oModel:SetValue(	'CNADETAIL' 	, 'CNA_TIPPLA'	, '004'				)

//Itens da Planilha do Contrato
oModel:SetValue( 'CNBDETAIL'	, 'CNB_ITEM'		, '001'				)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_PRODUT'	, '001            '	)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_QUANT'		, 1						)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_VLUNIT'	, 1000					)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_PEDTIT'	, '1'					)

//Cronograma Financeiro
SetMVValue("CN300CRG","MV_PAR01",1)
SetMVValue("CN300CRG","MV_PAR02",30)
SetMVValue("CN300CRG","MV_PAR03",1)
SetMVValue("CN300CRG","MV_PAR04","02/2017")
SetMVValue("CN300CRG","MV_PAR05", cTod("24/02/2017"))
SetMVValue("CN300CRG","MV_PAR06", 1)
SetMVValue("CN300CRG","MV_PAR07", "   ")
SetMVValue("CN300CRG","MV_PAR08", 0)

Pergunte("CN300CRG",.F.)
CN300PrCF(.T.)

//Validação e Gravação do Modelo
If oModel:VldData() 
	oModel:CommitData() 
EndIf

Return

Exemplo de rotina automática - Inclusão de contrato com geração do cronograma financeiro/físico, inclusão de contrato com geração do cronograma financeiro e contábil

A função CN300PrCF(.T.) permite que se gere automaticamente o cronograma financeiro/físico pela rotina automática da mesma maneira que se faz pela tela(pelo botão Outras Ações → Incluir cronograma financeiro/físico).

A função recebe como argumento a variável lógica .T. para efetuar a inclusão do cronograma financeiro/físico

UtilidadeValor1Periodicidade(tipo numérico)1=Mensal, 2=Quinzenal, 3=Diário, 4=Condição Pagamento2Dias(tipo numérico) Número de dias para avançar nas parcelas do cronograma3Último dia do mês?(Tipo numérico)

1 = SIM ou 2= NÃO

Indica se a data prevista de medição deve ser ajustada para o último dia do mês de competência

4Competência de início?(tipo caractere)Deve ser composta por mês/ano no formato MM/AAAA(Exemplo: 12/2018)5Data prevista da 1º medição(tipo data)

Data prevista para que ocorra a primeira medição(exemplo:  )

6Quantidade de parcelas(tipo numérico)Número de parcelas do cronograma7Condição de Pagamento(tipo caractere)Código da condição de pagamento que as parcelas do cronograma devem ser geradas8Taxa de Juros(tipo numérico)

Taxa de Juros para cálculo do valor presente

Bloco de código
themeEclipse
#Include 'Protheus.ch'
#INCLUDE "FWMVCDEF.CH"
User Function CN300AUTO()
Local aErro := {}
Local oModel := FWLoadModel("CNTA300") //Carrega o modelo

oModel:SetOperation(MODEL_OPERATION_INSERT) // Seta operação de inclusão

oModel:Activate() // Ativa o Modelo 

//Cabeçalho do contrato
oModel:SetValue( 'CN9MASTER'	, 'CN9_DTINIC'	, Ctod("24/02/2017")	)
oModel:SetValue( 'CN9MASTER'	, 'CN9_NUMERO'	, '000000000000069'	)
oModel:SetValue( 'CN9MASTER'	, 'CN9_UNVIGE'	, '3'					)
oModel:SetValue( 'CN9MASTER'	, 'CN9_VIGE'		, 1						)
oModel:SetValue( 'CN9MASTER'	, 'CN9_MOEDA'		, 1						)
oModel:SetValue( 'CN9MASTER'	, 'CN9_CONDPG'	, '001'				)
oModel:SetValue( 'CN9MASTER'	, 'CN9_TPCTO'		, '001'				)

//Cliente/Fornecedor do Contrato
oModel:SetValue( 'CNCDETAIL'	, 'CNC_CODIGO'	, '001   '	)
oModel:SetValue( 'CNCDETAIL'	, 'CNC_LOJA'		, '01'		)

//Planilhas do Contrato
oModel:LoadValue(	'CNADETAIL'	, 'CNA_CONTRA'	, '000000000000069'	)
oModel:SetValue( 	'CNADETAIL' 	, 'CNA_NUMERO'	, '000001'				)
oModel:SetValue(	'CNADETAIL' 	, 'CNA_FORNEC'	, '001   '				)
oModel:SetValue(	'CNADETAIL' 	, 'CNA_LJFORN'	, '01'					)
oModel:SetValue(	'CNADETAIL' 	, 'CNA_TIPPLA'	, '004'				)

//Itens da Planilha do Contrato
oModel:SetValue( 'CNBDETAIL'	, 'CNB_ITEM'		, '001'				)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_PRODUT'	, '001            '	)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_QUANT'		, 1						)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_VLUNIT'	, 1000					)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_PEDTIT'	, '1'					)

//Cronograma Financeiro

SetMVValue("CN300CRG","MV_PAR01",1)  // Periodicidade : 1= Mensal, 2=Quinzenal, 3= Diário, 4= Cond. Pag.
SetMVValue("CN300CRG","MV_PAR02",30) // Dia(s)?
SetMVValue("CN300CRG","MV_PAR03",1)  // Ultimo dia do mês? 1 = sim, 2 = não
SetMVValue("CN300CRG","MV_PAR04","02/2018") // Competência Inicio?
SetMVValue("CN300CRG","MV_PAR05", cTod("20/02/2018")) // Data prevista 1º Medição
SetMVValue("CN300CRG","MV_PAR06", 1) // Quantidade de parcelas
SetMVValue("CN300CRG","MV_PAR07", "   ") // Condição de Pagamento?
SetMVValue("CN300CRG","MV_PAR08", 0) // Taxa de Juros para cálculo do valor presente

Pergunte("CN300CRG",.F.)
CN300PrCF(.T.)  
//Validação e Gravação do Modelo
If oModel:VldData() 
	oModel:CommitData()
else
	aErro := oModel:GetErrorMessage()
	TmsMsgErr(aErro)
EndIf

Return


Bloco de código
firstline1
titleExemplo cronograma contábil
linenumberstrue
//Exemplo de rotina automática - inclusão de contrato com cronograma financeiro e contábil
Expandir
titleInclusão de contrato com geração do cronograma financeiro/físico
Bloco de código
themeEclipse
#Include 'Protheus.ch'
#INCLUDE "FWMVCDEF.CH"
User Function CN300AUTO()

Local 
oModel
aErro 
:= 
FWLoadModel("CNTA300") //Carrega o modelo Local cFornec1 := "GCT001" oModel:SetOperation(MODEL_OPERATION_INSERT) // Seta operação de inclusão oModel:Activate(
{}
Local oModel := FWLoadModel("CNTA300") //
Ativa
Carrega o 
Modelo
modelo

//Cabeçalho do contrato
oModel:
SetValue( 'CN9MASTER' , 'CN9_NUMERO' , '780000000000088' ) oModel:SetValue( 'CN9MASTER' , 'CN9_DTINIC' , Ctod("20/04/2022") ) oModel:SetValue( 'CN9MASTER' , 'CN9_UNVIGE' , '2' ) oModel:SetValue( 'CN9MASTER' , 'CN9_VIGE' , 12 ) oModel:SetValue( 'CN9MASTER' , 'CN9_MOEDA' , 1 )
SetOperation(MODEL_OPERATION_INSERT) // Seta operação de inclusão

oModel:Activate() // Ativa o Modelo 

//Cabeçalho do contrato
oModel:SetValue( 'CN9MASTER'	, 'CN9_
TPCTO
DTINIC'
	, 
'001'
Ctod("24/02/2017")	)
oModel:SetValue( 'CN9MASTER'	, 'CN9_
CONDPG
NUMERO'	, '
000
000000000000069'
	
)
oModel:SetValue( 'CN9MASTER'	, 'CN9_
AUTO
UNVIGE'	, '
1
3'					
)
//Cliente/Fornecedor do Contrato

oModel:SetValue( '
CNCDETAIL
CN9MASTER'	, '
CNC
CN9_
CODIGO
VIGE'		, 
cFornec1
1						)
oModel:SetValue( '
CNCDETAIL
CN9MASTER'	, '
CNC
CN9_
LOJA
MOEDA'		, 
"01"
1						)
//Planilhas do Contrato

oModel:SetValue( '
CNADETAIL
CN9MASTER'	, '
CNA
CN9_
NUMERO
CONDPG'
, PadL("1", Len(CNA->CNA_NUMERO),"0")
	, '001'				)
oModel:SetValue(
 '
CNADETAIL
CN9MASTER'
	, '
CNA
CN9_
FORNEC
TPCTO'		, 
cFornec1
'001'				
)

//Cliente/Fornecedor do Contrato
oModel:SetValue(
 '
CNADETAIL
CNCDETAIL'
	, '
CNA
CNC_
LJFORN
CODIGO'	, 
"01"
'001   '	)
oModel:SetValue(
 '
CNADETAIL
CNCDETAIL'
	, '
CNA
CNC_
TIPPLA
LOJA'		, 
"Z06"
'01'		
)

//
Itens da Planilha
Planilhas do Contrato
oModel:
SetValue
LoadValue(	'
CNBDETAIL
CNADETAIL'	, '
CNB
CNA_
ITEM
CONTRA'	, 
PadL("1", Len(CNB->CNB_ITEM),"0")
'000000000000069'	)
oModel:SetValue( 	'CNADETAIL' 	, 'CNA_NUMERO'	, '000001'				)
oModel:SetValue(
	'
CNBDETAIL
CNADETAIL' 	, '
CNB
CNA_
PRODUT
FORNEC'	,
"GCT000000000000000000000000001"
 '001   '				)
oModel:SetValue(
	'
CNBDETAIL
CNADETAIL' 	, '
CNB
CNA_
QUANT' , 1
LJFORN'	, '01'					)
oModel:SetValue(
	'
CNBDETAIL
CNADETAIL' 	, '
CNB
CNA_
VLUNIT
TIPPLA'	, 
1000
'004'				
)

//
cronograma financeiro SetMVValue("CN300CRG","MV_PAR01",1) SetMVValue("CN300CRG","MV_PAR02",30) SetMVValue("CN300CRG","MV_PAR03",1) SetMVValue("CN300CRG","MV_PAR04","04/2022") SetMVValue("CN300CRG","MV_PAR05", cTod("20/04/2022")) SetMVValue("CN300CRG","MV_PAR06", 1) SetMVValue("CN300CRG","MV_PAR07", " ") SetMVValue("CN300CRG","MV_PAR08", 0) Pergunte("CN300CRG",.F.) //Gera Cronograma Financeiro CN300PrCF(.T.) //Cronograma contábil SetMVValue("CN300CTB","MV_PAR01", cTod("20/04/2022")) SetMVValue("CN300CTB","MV_PAR02",1) SetMVValue("CN300CTB","MV_PAR03",'H-CT004-PL01') SetMVValue("CN300CTB","MV_PAR04",1) SetMVValue("CN300CTB","MV_PAR05", 30) Pergunte("CN300CTB",.F.) //Gera Cronograma Contábil CN300PrcCC(.T.) //Validação e Gravação do Modelo If oModel:VldData() oModel:CommitData() EndIf Return

Exemplo de rotina automática - Revisão aberta

A Rotina CNTA300 foi desenvolvida em MVC, portanto para realizar a revisão automaticamente, deve-se fazer uso do modelo de dados. A Seguir mostraremos um exemplo de como realizar a revisão do tipo aberta de um contrato utilizando o modelo de dados da rotina CNTA300.

Neste exemplo, é feita a revisão do tipo aberta de um contrato com tipo de planilha semi fixo por agrupador.

Para mais detalhe sobre os tipos de planilha, consulte a página: Tipos de Planilha

Para mais detalhes sobre a utilização do MVC, consulte a pagina: http://tdn.totvs.com/display/public/mp/AdvPl+utilizando+MVC

Bloco de código
titleExemplo Revisão Aberta
#Include "Protheus.CH"
#Include "FWMVCDEF.CH"
 
User Function CN300AUTO()
Local oModel    := Nil
Local cContra   := " < NÚMERO_DO_CONTRATO > "
 
Local cTipRev   := "NÚMERO_DA_REVISAO_ABERTA"
Local cJustific := "Justificativa da revisão aberta do contrato"
Local cCond     := "CONDICAO_DE_PAGAMENTO"
 
Local lRet      := .F.
 
//=== Preparação do contrato para revisão =============================================================================================
CN9->(DBSetOrder(1))
If CN9->(DbSeek(xFilial("CN9")+cContra))             //- Posicionamento no contrato que será revisado.
     
    A300STpRev("G")                                 //- Define o tipo de revisão que será realizado.
     
    oModel := FWLoadModel("CNTA300")                //- Carrega o modelo de dados do contrato.
    oModel:SetOperation(MODEL_OPERATION_INSERT)     //- Define operação do modelo. Será INSERIDA uma revisão.
      
    oModel:Activate(.T.)                            //- Ativa o modelo. É necessária a utilização do parâmetro como true (.T.) para realizar uma copia.
 
 
    //=== Preenchimento das alterações da revisão. =======================================================================================
    //== Cabeçalho
    oModel:SetValue( 'CN9MASTER'    , 'CN9_TIPREV' , cTipRev)       //- É obrigatório o preenchimento do tipo de revisão do contrato.
 
    oModel:SetValue( 'CN9MASTER'    , 'CN9_JUSTIF' , cJustific)    //- É obrigatório o preenchimento da justificativa de revisão do contrato.

    oModel:SetValue( 'CN9MASTER'    , 'CN9_CONDPG' , cCond)       //- Nesse exemplo, estamos utilizando a revisão aberta para alterar a condição de pagamento
     
    //== Qualquer alteração possível na execução manual pode ser automatizada.

    oModel:SetValue( 'CXMDETAIL'    ,'CXM_VLMAX'   , 1000)       //- Alterando o valor máximo do agrupador de estoque
     
    //== Validação e Gravação do Modelo
    lRet := oModel:VldData() .And. oModel:CommitData()
EndIf
  
Return lRet      
 

Exemplo de rotina automática - Revisão de realinhamento

A Rotina CNTA300 foi desenvolvida em MVC, portanto para realizar a revisão automaticamente, deve-se fazer uso do modelo de dados. A Seguir mostraremos um exemplo de como realizar a revisão de um contrato utilizando o modelo de dados da rotina CNTA300.

Para mais detalhes sobre a utilização do MVC, consulte a pagina: http://tdn.totvs.com/display/public/mp/AdvPl+utilizando+MVC

Itens da Planilha do Contrato
oModel:SetValue( 'CNBDETAIL'	, 'CNB_ITEM'		, '001'				)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_PRODUT'	, '001            '	)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_QUANT'		, 1						)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_VLUNIT'	, 1000					)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_PEDTIT'	, '1'					)

//Cronograma Financeiro

SetMVValue("CN300CRG","MV_PAR01",1)  // Periodicidade : 1= Mensal, 2=Quinzenal, 3= Diário, 4= Cond. Pag.
SetMVValue("CN300CRG","MV_PAR02",30) // Dia(s)?
SetMVValue("CN300CRG","MV_PAR03",1)  // Ultimo dia do mês? 1 = sim, 2 = não
SetMVValue("CN300CRG","MV_PAR04","02/2018") // Competência Inicio?
SetMVValue("CN300CRG","MV_PAR05", cTod("20/02/2018")) // Data prevista 1º Medição
SetMVValue("CN300CRG","MV_PAR06", 1) // Quantidade de parcelas
SetMVValue("CN300CRG","MV_PAR07", "   ") // Condição de Pagamento?
SetMVValue("CN300CRG","MV_PAR08", 0) // Taxa de Juros para cálculo do valor presente

Pergunte("CN300CRG",.F.)
CN300PrCF(.T.)  
//Validação e Gravação do Modelo
If oModel:VldData() 
	oModel:CommitData()
else
	aErro := oModel:GetErrorMessage()
	TmsMsgErr(aErro)
EndIf

Return
Expandir
titleInclusão de contrato com geração do cronograma financeiro e contábil
Bloco de código
firstline1
titleExemplo cronograma contábil
linenumberstrue
#Include 'Protheus.ch'
#INCLUDE "FWMVCDEF.CH"
User Function CN300AUTO()

Local oModel 	:= FWLoadModel("CNTA300") //Carrega o modelo
Local cFornec1	:= "GCT001"

oModel:SetOperation(MODEL_OPERATION_INSERT) // Seta operação de inclusão

oModel:Activate() // Ativa o Modelo 

//Cabeçalho do contrato
oModel:SetValue( 'CN9MASTER'	, 'CN9_NUMERO'	, '780000000000088'					)
oModel:SetValue( 'CN9MASTER'	, 'CN9_DTINIC'	, Ctod("20/04/2022")				)
oModel:SetValue( 'CN9MASTER'	, 'CN9_UNVIGE'	, '2'								)
oModel:SetValue( 'CN9MASTER'	, 'CN9_VIGE'		, 12							)
oModel:SetValue( 'CN9MASTER'	, 'CN9_MOEDA'		, 1								)
oModel:SetValue( 'CN9MASTER'	, 'CN9_TPCTO'		, '001'							)
oModel:SetValue( 'CN9MASTER'	, 'CN9_CONDPG'	, '000'								)
oModel:SetValue( 'CN9MASTER'	, 'CN9_AUTO'	, '1'								)

//Cliente/Fornecedor do Contrato
oModel:SetValue( 'CNCDETAIL'	, 'CNC_CODIGO'	, cFornec1							)
oModel:SetValue( 'CNCDETAIL'	, 'CNC_LOJA'		, "01"							)

//Planilhas do Contrato
oModel:SetValue('CNADETAIL','CNA_NUMERO', PadL("1", Len(CNA->CNA_NUMERO),"0")		)
oModel:SetValue(	'CNADETAIL' , 'CNA_FORNEC'	, cFornec1							)
oModel:SetValue(	'CNADETAIL' , 'CNA_LJFORN'	, "01"								)
oModel:SetValue(	'CNADETAIL' , 'CNA_TIPPLA'	, "Z06"								)

//Itens da Planilha do Contrato
oModel:SetValue('CNBDETAIL','CNB_ITEM', PadL("1", Len(CNB->CNB_ITEM),"0")			)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_PRODUT'	, "GCT000000000000000000000000001"	)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_QUANT'		, 1								)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_VLUNIT'	, 1000								)

//cronograma financeiro
SetMVValue("CN300CRG","MV_PAR01",1)
SetMVValue("CN300CRG","MV_PAR02",30)
SetMVValue("CN300CRG","MV_PAR03",1)
SetMVValue("CN300CRG","MV_PAR04","04/2022")
SetMVValue("CN300CRG","MV_PAR05", cTod("20/04/2022"))
SetMVValue("CN300CRG","MV_PAR06", 1)
SetMVValue("CN300CRG","MV_PAR07", "   ")
SetMVValue("CN300CRG","MV_PAR08", 0)

Pergunte("CN300CRG",.F.)
//Gera Cronograma Financeiro
CN300PrCF(.T.)

//Cronograma contábil
SetMVValue("CN300CTB","MV_PAR01", cTod("20/04/2022"))
SetMVValue("CN300CTB","MV_PAR02",1)
SetMVValue("CN300CTB","MV_PAR03",'H-CT004-PL01')
SetMVValue("CN300CTB","MV_PAR04",1)
SetMVValue("CN300CTB","MV_PAR05", 30)
Pergunte("CN300CTB",.F.)

//Gera Cronograma Contábil
CN300PrcCC(.T.)

//Validação e Gravação do Modelo
If oModel:VldData() 
	oModel:CommitData() 
EndIf

Return
Expandir
titleRevisões
Aviso
titleRevisão do Contrato

Atente-se para o fato que apenas a última revisão do contrato pode ser revisada, tal qual ocorre em tela, por isso é imprescindível que se posicione na revisão vigente. 

Expandir
titleRevisão aberta

Neste exemplo, é feita a revisão do tipo aberta de um contrato com tipo de planilha semi fixo por agrupador.

Para mais detalhe sobre os tipos de planilha, consulte a página: Tipos de Planilha

Bloco de código
titleExemplo Revisão Aberta
#Include "Protheus.CH"
#Include "FWMVCDEF.CH"
 
User Function CN300AUTO()
     Local oModel    := Nil
     Local cContra   := "
Bloco de código
themeEclipse
#Include 'Protheus.ch' #Include "FWMVCDEF.CH" User Function CN300AUTO() Local oModel := Nil Local cContra := '
 < NÚMERO_DO_CONTRATO > 
' Local cTipRev
"
     Local cRevisa   := ' < 
TIPO_DE_REVISÃO
REVISÃO DO CONTRATO >
'
     Local cTipRev   := 
cJustific
"NÚMERO_DA_REVISAO_ABERTA"
     Local cJustific := 
'
"Justificativa da revisão aberta do contrato
' Local lRet
"
     Local cCond     := "CONDICAO_DE_PAGAMENTO"
 	 Local cLog := ""
     Local lRet      := .F.   
     
	 //=== Preparação do contrato para revisão =============================================================================================
     CN9->(DBSetOrder(1))
     If CN9->(DbSeek(xFilial("CN9")+cContra
))
+cRevisa))             //- Posicionamento no contrato que será revisado.
        

        A300STpRev("
3")
G")                                 //- Define o tipo de revisão que será realizado.
 
       
        oModel := FWLoadModel("CNTA300")
                //- Carrega o modelo de dados do contrato.
        oModel:SetOperation(MODEL_OPERATION_INSERT)
     //- Define operação do modelo. Será INSERIDA uma revisão.


        if (lRet := oModel:Activate(.T.)
)//- Ativa o modelo. É necessária a utilização do parâmetro como true (.T.) para realizar uma copia.
            
            //=== Preenchimento das alterações da revisão. =======================================================================================
//== Cabeçalho
            //== Cabeçalho
            oModel:SetValue( 'CN9MASTER'    , 'CN9_TIPREV' , cTipRev)
       //- É obrigatório o preenchimento do tipo de revisão do contrato.
            oModel:SetValue( 'CN9MASTER'    , 'CN9_JUSTIF' , cJustific
'
)
    //- É obrigatório o preenchimento da justificativa de revisão do contrato.
//== Qualquer alteração possível na execução manual pode ser automatizada.
            oModel:SetValue( '
CNBDETAIL
CN9MASTER'    , '
CNB
CN9_
VLUNIT
CONDPG'
 , 
0.0010)
cCond)       //- 
Alteração do valor unitário do item. CN300RdSld(oModel) //- Realiza a redistribuição do saldo da planilha //== Validação e Gravação do Modelo lRet := oModel:VldData() .And. oModel:CommitData() EndIf Return lRet

Exemplo de rotina automática - Aprovação de revisão (sem alçadas)

A Rotina CNTA300 foi desenvolvida em MVC, portanto para realizar a aprovação, deve-se fazer uso do modelo de dados. A Seguir mostraremos um exemplo de como realizar a aprovação de uma revisão de um contrato utilizando o modelo de dados da rotina CNTA300.

Para mais detalhes sobre a utilização do MVC, consulte a pagina: http://tdn.totvs.com/display/public/mp/AdvPl+utilizando+MVC

Informações
titleImportante

A utilização da aprovação de modo automático está vinculada ao fonte CNTA300 posterior a data de 29/05/2018.

Bloco de código
themeEclipse
### Exemplo de aprovação utilizando a função CN300Aprov ###


#Include 'Protheus.ch'
#Include "FWMVCDEF.CH"

User Function CN300AUTO() 
Local cFilCont := ' < FILIAL_DO_CONTRATO > '
Local cContra  := ' < NÚMERO_DO_CONTRATO > '
Local cRevisa  := ' <NÚMERO_DA_REVISÃO> '
Local nRet	   := 0 
Local cMsgErro := ""
Local lRet     := .F.

//=== Preparação do contrato para revisão =============================================================================================
CN9->(DBSetOrder(1))
If CN9->( DbSeek( cFilCont + cContra + cRevisa ))
	nRet := CN300Aprov(.T.,,@cMsgErro) //- Função retorna 0 em caso de falha e 1 em caso de sucesso, também retorna a mensagem de erro por referência através do parâmetro cMsgErro.
	If nRet == 1
        lRet := .T.
    Else
        VarInfo("","Erro ao aprovar o contrato "+cContra+" "+cMsgErro)
    EndIf
EndIf
 
Return lRet

Exemplo de mudança de situação de um contrato

Para mudar a situação de um contrato não é necessário instanciar o modelo de dados, pois a rotina de mudança de situação(função CN100Situac) carrega sozinha o modelo e realiza as alterações necessários. Abaixo um exemplo:

Bloco de código
themeEclipse
### Exemplo de alteração de situação utilizando a função CN100Situac ###
#Include 'Protheus.ch'
#Include "FWMVCDEF.CH"

/* É possível mudar para as situações conforme abaixo:
	"01"=Cancelado
	"03"=Emitido
	"05"=Vigente
	"06"=Paralisado
	"07"=Sol Fina.
	"08"=Finalizado
	"11"=Rejeitado
*/
User Function CN300SITU() 
Local cFilCont     := ' < FILIAL_DO_CONTRATO > '
Local cContra	:= ' < NÚMERO_DO_CONTRATO > '
Local cRevisa  := ' <NÚMERO_DA_REVISÃO> '

CN9->(DBSetOrder(1))
If CN9->( DbSeek( cFilCont + cContra + cRevisa ))//Deve se posicionar no contrato que terá sua situação alterada

	CN100Situac('CN9',CN9->(Recno()),4, "05",.T.)//Muda a situação do contrato para vigente

EndIf
 
Return lRet

Exemplo de paralisação/reinicio de contrato

Abaixo um exemplo de como é possível paralisar e dar reinicio a um contrato:

Nesse exemplo, estamos utilizando a revisão aberta para alterar a condição de pagamento  

            oModel:SetValue( 'CXMDETAIL' ,'CXM_VLMAX'   , 1000)    //- Alterando o valor máximo do agrupador de estoque

            //== Validação e Gravação do Modelo
            lRet := oModel:VldData() .And. oModel:CommitData()
        endif

        If !lRet .And. oModel:HasErrorMessage() //Operação falhou           
            aEval(oModel:GetErrorMessage(),{|x| cLog+= IIF(ValType(x) == 'C', x, '')+ Chr(13)+Chr(10) })

            if !IsBlind()
                GCTLog(cLog)
            else
                ConOut(cLog)
            endif
        EndIf    
    EndIf
Return lRet      
Expandir
titleRevisão de realinhamento
Bloco de código
themeEclipse
#Include 'Protheus.ch'
#Include "FWMVCDEF.CH"

User Function CN300AUTO() 
Local oModel	:= Nil
Local cContra	:= ' < NÚMERO_DO_CONTRATO > '
Local cRevisa   := ' < REVISÃO DO CONTRATO >'
Local cTipRev	:= ' < TIPO_DE_REVISÃO > '
Local cJustific	:= 'Justificativa da revisão do contrato'

Local lRet		:= .F.

//=== Preparação do contrato para revisão =============================================================================================
CN9->(DBSetOrder(1))
If CN9->(DbSeek(xFilial("CN9")+cContra+cRevisa))				//- Posicionamento no contrato que será revisado.
 	
 	A300STpRev("3")									//- Define o tipo de revisão que será realizado.
 	
 	oModel := FWLoadModel("CNTA300")				//- Carrega o modelo de dados do contrato.
	oModel:SetOperation(MODEL_OPERATION_INSERT)		//- Define operação do modelo. Será INSERIDA uma revisão.
	 
	oModel:Activate(.T.) 							//- Ativa o modelo. É necessária a utilização do parâmetro como true (.T.) para realizar uma copia.


	//=== Preenchimento das alterações da revisão. =======================================================================================
	//== Cabeçalho
	oModel:SetValue( 'CN9MASTER'    , 'CN9_TIPREV' , cTipRev)		//- É obrigatório o preenchimento do tipo de revisão do contrato.

	oModel:SetValue( 'CN9MASTER'    , 'CN9_JUSTIF' , cJustific')	//- É obrigatório o preenchimento da justificativa de revisão do contrato.
	
	//== Qualquer alteração possível na execução manual pode ser automatizada.
	oModel:SetValue( 'CNBDETAIL'    , 'CNB_VLUNIT'  , 0.0010)		//- Alteração do valor unitário do item.
	
	CN300RdSld(oModel)							//- Realiza a redistribuição do saldo da planilha
	//== Validação e Gravação do Modelo
	lRet := oModel:VldData() .And. oModel:CommitData()
EndIf
 
Return lRet
Expandir
titleRevisão de aditivo

O exemplo abaixo demonstra uma revisão do tipo Aditivo, neste caso em questão, é adicionada na revisão duas planilhas, em que é informado dois produtos em cada e onde é incluído o cronograma financeiro para cada planilha.

Bloco de código
themeEclipse
#Include 'Protheus.ch'
#Include "FWMVCDEF.CH"
#INCLUDE "TBICONN.CH"
 
User Function CN300AUTO()
    Local oModel    := Nil
    Local oModelCN9 := Nil
    Local oModelCNA := Nil
    Local oModelCNB := Nil
    Local cContra   := ' < NÚMERO_DO_CONTRATO > '
    Local cRevisa   := ' < REVISÃO_DO_CONTRATO >'
    Local cTipRev   := ' < TIPO_DE_REVISÃO > '
    Local cProd     := ' < SEU_PRODUTO > '
    Local cProd2    := ' < SEU_SEGUNDO_PRODUTO >'
    Local cJustific := 'Justificativa da revisão do contrato'
    Local nQtdPlan  := 2 // Quantidade de planilhas que serão adicionadas
    Local cTipPlan  := '< SEU TIPO DE PLANILHA que permita cronograma financeiro >'
    Local nX        := 0
	Local nLinPlan	:= 0
    Local cLog      := ''
    Local lRet      := .F.

    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10"

    //Preparação do contrato para revisão
    CN9->(DBSetOrder(1))
    If CN9->(DbSeek(xFilial("CN9")+cContra+cRevisa))     //- Posicionamento no contrato que será revisado.
Bloco de código
themeEclipse
### Exemplo de paralisação de uma contrato e seu reinicio ### #Include 'Protheus.ch' #Include "FWMVCDEF.CH" User Function TsRVPar() Local cContra := '[NUMERO DO CONTRATO]' Local cRevisa := Space(3)//Deve ser substituído pela revisão PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10" dDatabase := CToD("20/04/2020") IncluiRev(cContra, cRevisa,"005") //Inclui revisão de paralisação cRevisa := CnUltRev(cContra, cFilAnt) AprovRev(cContra, cRevisa) //Aprova revisão de paralisação dDatabase := DaySum(dDatabase, 1) IncluiRev(cContra, cRevisa,"006")//Inclui revisão de reinicio cRevisa := CnUltRev(cContra, cFilAnt) AprovRev(cContra, cRevisa) //Aprova revisão RESET ENVIRONMENT Return Nil Static Function IncluiRev(cContra, cRevisao, cTipRev) Local aErro := {} Local oModel:= Nil CN0->(DbSetOrder(1))//CN0_FILIAL+CN0_CODIGO CN9->(DBSetOrder(1)) If (CN9->(DbSeek(xFilial("CN9") + cContra + cRevisao)) .And. CN0->( DbSeek(xFilial("CN0") + cTipRev) )) A300STpRev(CN0->CN0_TIPO) //Define o tipo de revisão a ser realizado oModel := FWLoadModel('CNTA300') //CNTA300 = Compras, pra vendas usar CNTA301 oModel:SetOperation(MODEL_OPERATION_INSERT) oModel:Activate(.T.) oModel:SetValue('CN9MASTER','CN9_TIPREV' , cTipRev) oModel:SetValue('CN9MASTER','CN9_JUSTIF' , "Teste revisão")

        
        
If CN0->CN0_TIPO == "5" //paralisacao
A300STpRev("1")              
oModel:SetValue('CN9MASTER','CN9_MOTPAR' ,
 
"001")
            
oModel:SetValue('CN9MASTER','CN9_DTFIMP' ,
 
DaySum(dDatabase,
 
1))
    //- Tipo de revisão 
EndIf
aditivo
        
        
lResult
oModel := 
(oModel:VldData() .And. oModel:CommitData())
FWLoadModel("CNTA300")        
        
If (!lResult)
//- Carrega o modelo de dados do contrato.
      
aErro
 
:=
 oModel:
GetErrorMessage
SetOperation(
)//Obtem a mensagem de erro Endif
MODEL_OPERATION_INSERT)     //- Define operação do modelo. Será INSERIDA uma revisão.
        
        oModel:
DeActivate
Activate(.T.)
          
oModel:Destroy()
    
EndIf Return Static
 
Function
 
AprovRev(cContra,
 
cRevisa)
    
Local
 
aArea
     
:=
 
CN9->(GetArea()) Local lResult := .F
//- Ativa o modelo. É necessária a utilização do parâmetro como true (.T.) para realizar uma copia.
    
    
CN9->(DBSetOrder(1))
    
if CN9->(DbSeek(xFilial("CN9") + cContra + cRevisa))
// Preenchimento das alterações da revisão de aditivo.
      
lResult
 
:= (CN300Aprov(.T.) == 0)
 // Cabeçalho
        oModelCN9:= oModel:GetModel("CN9MASTER")
    
endif
    
RestArea(aArea) Return lResult

Exemplo de inclusão de contrato de vendas

Para contratos de vendas deve-se carregar o modelo CNTA301 ao invés do CNTA300, abaixo um exemplo:

Bloco de código
themeEclipse
### Exemplo de inclusão de uma contrato de venda ### #Include 'Protheus.ch' #Include "FWMVCDEF.CH" #INCLUDE "RWMAKE.CH" #INCLUDE "TBICONN.CH" User Function CN300AUTO() Local nRet := 0 PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10"
oModelCN9:SetValue( 'CN9_TIPREV' , cTipRev)       //- É obrigatório o preenchimento do tipo de revisão do contrato.
    
        oModelCN9:SetValue( 'CN9_JUSTIF' , cJustific)    //- É obrigatório o preenchimento da justificativa de revisão do contrato.
        
        oModelCNA:= oModel:GetModel('CNADETAIL')
        oModelCNB:= oModel:GetModel('CNBDETAIL')
        
        
ConOut("INICIO TESTE") ExCtrVenda()
// Adiciona planilha
        For 
nX := 1 to nQtdPlan
    
ConOut("FIM
 
TESTE")
 
    
RESET
 
ENVIRONMENT Return
 
nRet

Static
 
Function
 
ExCtrVenda() Local
 
aErro :=
 
{}
   
Local
 
oModel :=
 
Nil Local
 
cContrat :=
 
"EXCTRVENDA" oModel
 oModelCNA:
= FWLoadModel('CNTA301'
AddLine()
oModel:SetOperation(MODEL_OPERATION_INSERT) oModel:Activate() //Cabeçalho do Contrato oModel:SetValue('CN9MASTER','CN9_NUMERO', cContrat) oModel:SetValue('CN9MASTER','CN9_DTINIC', dDataBase) oModel:SetValue('CN9MASTER','CN9_UNVIGE', '2') oModel:SetValue('CN9MASTER','CN9_VIGE', 6 ) oModel:SetValue('CN9MASTER','CN9_MOEDA', 1) oModel:SetValue('CN9MASTER','CN9_TPCTO', "031") oModel:SetValue('CN9MASTER','CN9_CONDPG', "000") oModel:SetValue('CN9MASTER','CN9_AUTO', '1') //Cliente/Fornecedor do Contrato oModel:SetValue
 		    nLinPlan := oModelCNA:GetLine()	
            //Planilhas do Contrato
            oModelCNA:LoadValue('CNA_NUMERO'   , StrZero(nLinPlan, Len(CNA->CNA_NUMERO)))
            oModelCNA:SetValue('CNA_FORNEC'    , oModel:GetValue('CNCDETAIL','CNC_
CLIENT' , "CN300R") oModel
CODIGO'))   
            oModelCNA:SetValue('
CNCDETAIL','CNC_LOJACL' , "01") //Planilhas do Contrato oModel:SetValue('CNADETAIL','CNA_NUMERO', PadL("1", Len(CNA->CNA_NUMERO),"0")) oModel:SetValue('CNADETAIL','CNA_CLIENT', "CN300R") oModel:SetValue('CNADETAIL','CNA_LOJACL', "01") oModel:SetValue('CNADETAIL','CNA_TIPPLA', "Z0F") //Itens da Planilha do Contrato oModel:SetValue('CNBDETAIL','CNB_ITEM', PadL("1"
CNA_TIPPLA'    , cTipPlan)
            
            //Primeiro produto da planilha adicionada
            oModelCNB:LoadValue('CNB_ITEM'     , StrZero(1, Len(CNB->CNB_ITEM)))
            oModelCNB:SetValue('CNB_PRODUT'    , cProd)
            oModelCNB:SetValue('CNB_QUANT'     , 6)
            oModelCNB:SetValue('CNB_VLUNIT'    , 500)

            //Segundo produto da planilha adicionada
            oModelCNB:AddLine()
            oModelCNB:LoadValue('CNB_ITEM'     , StrZero(2, Len(CNB->CNB_ITEM
),"0")) oModel:SetValue('CNBDETAIL','CNB_PRODUT' ,'GCT000000000000000000000000001') oModel:SetValue('CNBDETAIL','CNB_QUANT' ,6) oModel:SetValue('CNBDETAIL','CNB_TS' , '501') If (oModel:VldData()) /*Valida o modelo como um todo*/ oModel:CommitData()//--Grava Contrato EndIf CN9->(DbSetOrder(1)) If(oModel:HasErrorMessage()) aErro := oModel:GetErrorMessage() AEval( aErro, { | x | ConOut( x ) + CRLF } ) ElseIf(CN9->(DbSeek(xFilial("CN9") + cContrat))) ConOut("Contrato gravado com sucesso.") EndIf Return

Exemplo de inclusão de contrato com rateios

Bloco de código
firstline1
titleExemplo com Rateios
linenumberstrue
#Include 'Protheus.ch' #Include "FWMVCDEF.CH" #INCLUDE "RWMAKE.CH" #INCLUDE "TBICONN.CH" User Function CN300AUTO() Local nRet := 0 PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10"
)))
            oModelCNB:SetValue('CNB_PRODUT'    , cProd2)
            oModelCNB:SetValue('CNB_QUANT'     , 6)
            oModelCNB:SetValue('CNB_VLUNIT'    , 500)

            //Adiciona cronograma financeiro as planilhas
            SetMVValue("CN300CRG","MV_PAR01"   , 1)  // Periodicidade : 1= Mensal, 2=Quinzenal, 3= Diário, 4= Cond. Pag.
            SetMVValue("CN300CRG","MV_PAR02"   , 30) // Dia(s)?
        
ConOut("INICIO TESTE")
    SetMVValue("CN300CRG","MV_PAR03"   , 1)  // Ultimo dia 
do mês? 1 = sim, 2 = 
IncCtrRateio()
não
         
   SetMVValue("CN300CRG","MV_PAR04"   
, 
ConOut("FIM TESTE") RESET ENVIRONMENT Return nRet /*Exemplo de inclusão de contrato com rateios(CNZ)*/ Static Function IncCtrRateio()
"05/2024") // Competência Inicio?
    
Local
 
aErro
     
:=
 
{}
 SetMVValue("CN300CRG","MV_PAR05"   
Local oModel := Nil
, cTod("15/05/2024")) // Data prevista 1º Medição
    
Local
 
oModelCNB
 
:=
 
Nil
    
Local oModelCNZ := Nil
 SetMVValue("CN300CRG","MV_PAR06"   , 
Local
3) 
cContrat
// Quantidade 
:= "CONTRARATEIO"
de parcelas
      
oModel
 
:=
 
FWLoadModel('CNTA300')
    
oModel:SetOperation(MODEL_OPERATION_INSERT)
SetMVValue("CN300CRG","MV_PAR07"   
oModel:Activate()
, "   
") //
Cabeçalho
 Condição 
do
de 
Contrato
Pagamento?
   
oModel:SetValue('CN9MASTER','CN9_NUMERO', cContrat)
    
oModel:SetValue('CN9MASTER','CN9_DTINIC',
 
dDataBase)
    
oModel:SetValue('CN9MASTER','CN9_UNVIGE', '2') oModel:SetValue('CN9MASTER','CN9_VIGE', 6 ) oModel:SetValue('CN9MASTER','CN9_MOEDA',
SetMVValue("CN300CRG","MV_PAR08"   , 0) // Taxa de Juros para cálculo do valor presente
            
1)

     
oModel:SetValue('CN9MASTER','CN9_TPCTO', "001") oModel:SetValue('CN9MASTER','CN9_CONDPG', "000") oModel:SetValue('CN9MASTER','CN9_AUTO' , '1')
       //indica que não exibirá a tela do pergunte CN300CRG por se tratar de rotina automática             
    
//Cliente/Fornecedor do Contrato
        
oModel:SetValue('CNCDETAIL','CNC_CODIGO', "GCT001"
Pergunte("CN300CRG",.F.)
     
oModel:SetValue('CNCDETAIL','CNC_LOJA' , "01") //Planilhas do Contrato oModel:SetValue('CNADETAIL','CNA_NUMERO' , PadL("1", Len(CNA->CNA_NUMERO),"0")) oModel:SetValue('CNADETAIL','CNA_FORNEC' , oModel:GetValue('CNCDETAIL','CNC_CODIGO')) oModel:SetValue('CNADETAIL','CNA_TIPPLA' , "Z0F") oModelCNB
       //Gera automaticamente o cronograma financeiro/físico pela rotina automática
            CN300PrCF(.T.) 
        Next nX 

        
        //Validação e Gravação do Modelo 
        lRet := oModel:
GetModel
VldData(
"CNBDETAIL"
)
oModelCNZ :=
 .And. oModel:
GetModel
CommitData(
"CNZDETAIL"
)

   
    
//Primeiro
 
produto
If !lRet .And. 
oModelCNB
oModel:
SetValue('CNB_ITEM'
HasErrorMessage() //Operação falhou    
,
 
StrZero(1, Len(CNB->CNB_ITEM)))
   
oModelCNB:SetValue('CNB_PRODUT'
  
,'GCT000000000000000000000000001')

    
oModelCNB:SetValue('CNB_QUANT'
     
,6)
    
oModelCNB:SetValue('CNB_VLUNIT' ,500)

     
//Rateio
 
do
 
primeiro
 
item
    
oModelCNZ
aEval(oModel:
SetValue('CNZ_ITEM' ,StrZero(1, Len(CNZ->CNZ_ITEM))) oModelCNZ:SetValue('CNZ_PERC' ,50
GetErrorMessage(),{|x| cLog+= IIF(ValType(x) == 'C', x, '')+ Chr(13)+Chr(10) })
 
            If !IsBlind()
    
oModelCNZ:SetValue('CNZ_CC'
        
,'GCT000001')
    
oModelCNZ:AddLine
GCTLog(cLog)
      
oModelCNZ:SetValue('CNZ_ITEM'
     
,StrZero(2, Len(CNZ->CNZ_ITEM)))
 Else
    
oModelCNZ:SetValue('CNZ_PERC'
   
,50)
    
oModelCNZ:SetValue('CNZ_CC'
     
,'GCT000002'
ConOut(cLog)
      
//Segundo
 
produto
 
    
oModelCNB:AddLine()
Endif
    
oModelCNB:SetValue('CNB_ITEM'
    EndIf  
,
 
StrZero(2, Len(CNB->CNB_ITEM)))

    
oModelCNB:SetValue('CNB_PRODUT' ,'GCT000000000000000000000000002') oModelCNB:SetValue('CNB_QUANT' ,6) oModelCNB:SetValue('CNB_VLUNIT' ,500) //Rateio do segundo item oModelCNZ:SetValue('CNZ_ITEM' ,StrZero(1, Len(CNZ->CNZ_ITEM))) oModelCNZ:SetValue('CNZ_PERC' ,70) oModelCNZ:SetValue('CNZ_CC' ,'GCT000003') oModelCNZ:AddLine() oModelCNZ:SetValue('CNZ_ITEM' ,StrZero(2, Len(CNZ->CNZ_ITEM))) oModelCNZ:SetValue('CNZ_PERC' ,30) oModelCNZ:SetValue('CNZ_CC' ,'GCT000005') If (oModel:VldData()) /*Valida o modelo como um todo*/ oModel:CommitData()//--Grava Contrato EndIf CN9->(DbSetOrder(1)) If(oModel:HasErrorMessage())
EndIf
Return lRet
Expandir
titleAprovação de revisão (sem alçadas)
Bloco de código
themeEclipse
#Include 'Protheus.ch'
#Include "FWMVCDEF.CH"

User Function CN300AUTO() 
Local cFilCont := ' < FILIAL_DO_CONTRATO > '
Local cContra  := ' < NÚMERO_DO_CONTRATO > '
Local cRevisa  := ' <NÚMERO_DA_REVISÃO> '
Local nRet	   := 0 
Local cMsgErro := ""
Local lRet     := .F.

//=== Preparação do contrato para revisão =============================================================================================
CN9->(DBSetOrder(1))
If CN9->( DbSeek( cFilCont + cContra + cRevisa ))
	nRet := CN300Aprov(.T.,,@cMsgErro) //- Função retorna 0 em caso de falha e 1 em caso de sucesso, também retorna a mensagem de erro por referência através do parâmetro cMsgErro.
	If nRet == 1
        
aErro
lRet := 
oModel:GetErrorMessage()
.T.
    Else
   
AEval(
 
aErro,
 
{
 
|
 
x | ConOut( x ) }
 VarInfo("","Erro ao aprovar o contrato "+cContra+" "+cMsgErro)
    
ElseIf(CN9->(DbSeek(xFilial("CN9") + cContrat))) ConOut("Contrato gravado com sucesso.") EndIf Return

Exemplo de inclusão de adiantamentos em um contrato

EndIf
EndIf
 
Return lRet
Expandir
titleMudança de situação de um contrato

Para mudar a situação de um contrato não é necessário instanciar o modelo de dados, pois a rotina de mudança de situação(função CN100Situac) carrega sozinha o modelo e realiza as alterações necessários. Abaixo um exemplo:


Bloco de código
themeEclipse
### Exemplo de alteração de situação utilizando a função CN100Situac ###
Bloco de código
firstline1
titleExemplo com Adiantamentos
linenumberstrue
#Include 'Protheus.ch'
#Include "
FWMVCDEF.CH" #INCLUDE "RWMAKE.CH" #INCLUDE "TBICONN.CH"
FWMVCDEF.CH"

/* É possível mudar para as situações conforme abaixo:
	"01"=Cancelado
	"03"=Emitido
	"05"=Vigente
	"06"=Paralisado
	"07"=Sol Fina.
	"08"=Finalizado
	"11"=Rejeitado
*/
User Function 
CN300AUTO
CN300SITU() 
Local cFilCont     := ' < FILIAL_DO_CONTRATO > '
Local cContra	:= ' < NÚMERO_DO_CONTRATO > '
Local cRevisa  := ' <NÚMERO_DA_REVISÃO> '

CN9->(DBSetOrder(1))
If CN9->( DbSeek( cFilCont + cContra + cRevisa ))//Deve se posicionar no contrato que terá sua situação alterada

	CN100Situac('CN9',CN9->(Recno()),4, "05",.T.)//Muda a situação do contrato para vigente

EndIf
 
Return lRet
Expandir
titleParalisação/reinício de contrato

Abaixo um exemplo de como é possível paralisar e dar reinicio a um contrato:

Bloco de código
themeEclipse
### Exemplo de paralisação de uma contrato e seu reinicio ###
#Include 'Protheus.ch'
#Include "FWMVCDEF.CH"


User Function TsRVPar()    
    Local cContra := '[NUMERO DO CONTRATO]'
PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10" ConOut("INICIO TESTE")        ExemploAdt() ConOut("FIM TESTE") RESET ENVIRONMENT Return /*Exemplo da utilização dos adiantamentos sem interface gráfica*/ Static Function ExemploAdt() Local oModel := NIL

    Local 
cModelId
cRevisa 
:= 
"" Local cContra := "CONTRATOADT" Local cChave := xFilial("CN9") + cContra Local aErro
Space(3)//Deve ser substituído pela revisão

    PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10"              
:=
 
{}

    
Local
 
oMdlCNX
   
:=

 
NIL
    
Local
 
cNumero
  dDatabase := CToD("20/04/2020"
CN9->(DbSetOrder(1)) If CN9->(DbSeek(cChave))
)
		IncluiRev(cContra, cRevisa,"005") //Inclui revisão de paralisação
        
A300lAdian(.T.) //Ativa operação adiantamento
cRevisa := CnUltRev(cContra, cFilAnt)
        
cModelId:= CN9->(IIF(CN9_ESPCTR == '1', 'CNTA300', 'CNTA301'))
AprovRev(cContra, cRevisa) //Aprova revisão de paralisação

        
oModel
dDatabase := 
FwLoadModel(cModelId
DaySum(dDatabase, 1)
        
oModel:SetOperation(MODEL_OPERATION_UPDATE)
IncluiRev(cContra, cRevisa,"006")//Inclui revisão de reinicio
        
If
cRevisa 
oModel
:
Activate(
= CnUltRev(cContra, cFilAnt)
        AprovRev(cContra, cRevisa) //Aprova revisão

    RESET 
oMdlCNX := oModel:GetModel("CNXDETAIL")
ENVIRONMENT
Return Nil

Static Function IncluiRev(cContra, cRevisao, cTipRev)
    Local aErro := {}
    Local oModel:= Nil

   
cNumero := StrZero(oMdlCNX:Length(), GetSx3Cache('CNX_NUMERO','X3_TAMANHO'))
 CN0->(DbSetOrder(1))//CN0_FILIAL+CN0_CODIGO
    CN9->(DBSetOrder(1))    
    
oMdlCNX:SetValue('CNX_NUMERO', cNumero) If cModelId == 'CNTA301'//Venda
If (CN9->(DbSeek(xFilial("CN9") + cContra + cRevisao)) .And. CN0->( DbSeek(xFilial("CN0") + cTipRev) ))        
      
  
        A300STpRev(CN0->CN0_TIPO) //Define o tipo de 
oMdlCNX:SetValue('CNX_CLIENT', oModel:GetValue('CNCDETAIL', 'CNC_CLIENT'))
revisão a ser realizado	
        
        
oMdlCNX:SetValue('CNX_LOJACL', oModel:GetValue('CNCDETAIL', 'CNC_LOJACL')) Else//Compra
oModel := FWLoadModel('CNTA300') //CNTA300 = Compras, pra vendas usar CNTA301
        oModel:SetOperation(MODEL_OPERATION_INSERT)
       
oMdlCNX:SetValue('CNX_FORNEC',
 oModel:
GetValue('CNCDETAIL', 'CNC_CODIGO')
Activate(.T.)
        
        
oMdlCNX
oModel:SetValue('CN9MASTER'
CNX
,'CN9_
LJFORN
TIPREV'	, cTipRev)
        oModel:
GetValue
SetValue('
CNCDETAIL
CN9MASTER',
'
CNC
CN9_
LOJA'))
JUSTIF'	, "Teste revisão")
        
EndIf

        If CN0->CN0_TIPO == 
oMdlCNX:SetValue('CNX_VLADT', 1000)
"5" //paralisacao
            
oMdlCNX
oModel:SetValue('
CNX_BANCO
CN9MASTER',
'
000')//gatilhará agência(CNX_AGENCI) e conta(CNX_CONTA)
CN9_MOTPAR'	, "001")
            oModel:SetValue('CN9MASTER','CN9_DTFIMP'	, DaySum(dDatabase, 1))
        EndIf    
If
 
oModel:VldData()
   

        lResult := (oModel:VldData() .And. 
oModel:CommitData())
        
    
EndIf
    If (!lResult)
     
EndIf
       aErro 
if
:= oModel:
HasErrorMessage
GetErrorMessage()
//Obtem a mensagem de erro
        
aErro := aClone(oModel:GetErrorMessage())
Endif
        
endif

       
If
 oModel:
IsActive
DeActivate()
        oModel:Destroy()
    EndIf
Return


Static Function 
oModel:DeActivate(
AprovRev(cContra, cRevisa)
    Local aArea   
EndIf
  
FreeObj(oModel)
:= CN9->(GetArea())
    Local lResult   := 
A300lAdian(
.F.
) //Desativa operação adiantamento

    
    CN9->(DBSetOrder(1))
    if CN9->(DbSeek(xFilial("CN9") + cContra 
If !Empty(aErro
+ cRevisa))
        lResult 
VarInfo('Erro apresentado:', aErro
:= (CN300Aprov(.T.) == 0)        
    
EndIf
endif

    
EndIf
RestArea(aArea)
Return lResult