Árvore de páginas

Versões comparadas

Chave

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

A rotina CNTA300 foi desenvolvida em MVC e para realizar as ações via rotina automática, deve-se fazer uso do modelo de dados. Para mais detalhes sobre a utilização do MVC, consulte 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

aprovação
"C" - Renovação
"D" - Multa/Bonificação
"E" - Caução
"F" - Orçamento de

Serviços

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
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
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" -
Reinicio
    • Reinício
    • "7" -
Clausulas
    • Cláusulas
    • "8" - Contábil
    • "9" - Índice
    • "A" - Fornecedor/Cliente
    • "B" - Grupo de
Aprovação
    • 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'					)
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

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

Expandir
titleInclusão de contrato com geração de cronograma
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

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


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

#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   := "NÚMERO_DA_REVISAO_ABERTA" Local cJustific := "Justificativa da revisão aberta do contrato" 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("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.
 
=======================================================================================
    oMdlCNX:SetValue('CNX_CLIENT', oModel:GetValue('CNCDETAIL', 'CNC_CLIENT'))
      
//==
 
Cabeçalho
         
oMdlCNX:SetValue('CNX_LOJACL', oModel:
SetValue
GetValue(
'
CN9MASTER
CNCDETAIL'
, '
CN9
CNC_
TIPREV' , cTipRev)
LOJACL'))
       
//-
 
É
 
obrigatório
 
o
 
preenchimento
 
do
Else//Compra
 
tipo
 
de
 
revisão do
 
contrato.
            
oModel
oMdlCNX:SetValue('CNX_FORNEC', oModel:GetValue('
CN9MASTER
CNCDETAIL'
, '
CN9
CNC_
JUSTIF' , cJustific)
CODIGO'))
    
//-
 
É
 
obrigatório
 
o
 
preenchimento
 
da
 
justificativa
 
de
 
revisão
 
do
 
contrato.
  oMdlCNX:SetValue('CNX_LJFORN', oModel:
SetValue
GetValue(
'
CN9MASTER
CNCDETAIL'
, '
CN9
CNC_
CONDPG
LOJA'))
  
,
 
cCond)
       
//-
 
Nesse
 
exemplo,
EndIf

 
estamos
 
utilizando
 
a
 
revisão
 
aberta
 
para
 
alterar
 
a
 
condição
 
de
 
pagamento
 oMdlCNX:SetValue('CNX_VLADT', 1000)
            
oModel
oMdlCNX:SetValue(
'
CXMDETAIL
CNX_BANCO', 
,
'
CXM_VLMAX'   , 1000)
000')//gatilhará agência(CNX_AGENCI) e conta(CNX_CONTA)
    
//-
 
Alterando
 
o
 
valor
 
máximo
 
do
 
agrupador
 
de
 
estoque

            
//== Validação e Gravação do Modelo
If oModel:VldData()
            
lRet := oModel:VldData() .And.
    oModel:CommitData()
        
endif
    EndIf
    
If
 
!lRet
 
.And.
 
oModel:HasErrorMessage() //Operação falhou
 EndIf


        if oModel:HasErrorMessage()
   
         aErro := 
aEval
aClone(oModel:GetErrorMessage())
,{|x| cLog+= IIF(ValType(x) == 'C', x, '')+ Chr(13)+Chr(10) })

        endif

        If oModel:IsActive()
       
if !IsBlind
     oModel:DeActivate()
        EndIf
        
GCTLog
FreeObj(
cLog
oModel)

        A300lAdian(.F.) //Desativa operação adiantamento
 
else
       
        If 
ConOut
!Empty(
cLog
aErro)
            VarInfo('Erro 
endif
apresentado:', aErro)        
EndIf
    
        EndIf
Return
 
lRet
 
 
 
 
 
EndIf
Return
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
Revisão de realinhamento
Expandir
title
Inclusão de contrato com múltiplas planilhas
#Include 'Protheus.ch' #Include "FWMVCDEF
.CH"

User Function CN300AUTO() 
Local
 
oModel :=
 
Nil

Local
  
cContra :=
 
'
 
< NÚMERO_DO_CONTRATO > ' Local cRevisa
Local nRet      := 
'
 
<
0
 
REVISÃO
 
DO
 
CONTRATO
 
>' Local
 
cTipRev :=
 
'
 
<
 
TIPO_DE_REVISÃO >
 
'

Local
 
cJustific :=
 
'Justificativa
 
da
 
revisão
PREPARE 
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
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
Bloco de código
firstline1
titleExemplo múltiplas planilhas
linenumberstrue
#INCLUDE "PROTHEUS.CH"
#INCLUDE "FWMVCDEF.CH"
#INCLUDE "TBICONN
themeEclipse
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

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 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
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.
        
        A300STpRev("1")                                 //- Tipo de revisão aditivo
        
        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 de aditivo.
        // Cabeçalho
        oModelCN9:= oModel:GetModel("CN9MASTER")
        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')
        
        // Adiciona planilha
        For nX := 1 to nQtdPlan
            
            oModelCNA:AddLine()
 		    nLinPlan := oModelCNA:GetLine()	
            //Planilhas do Contrato
            oModelCNA:LoadValue('CNA_NUMERO'   , StrZero(nLinPlan, Len(CNA->CNA_NUMERO)))
            oModelCNA:SetValue('CNA_FORNEC'    , oModel:GetValue('CNCDETAIL','CNC_CODIGO'))   
            oModelCNA:SetValue('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)))
            oModelCNB:SetValue('CNB_PRODUT'    , cProd2)
            oModelCNB'	)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_QUANT'     		, 6)
            oModelCNB:SetValue(1						)
oModel:SetValue( 'CNBDETAIL'	, 'CNB_VLUNIT'	, 1000					)
oModel:SetValue(   , 500)

            //Adiciona cronograma financeiro as planilhas
            '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"   , "0502/20242018") // Competência Inicio?
            SetMVValue("CN300CRG","MV_PAR05"   , cTod("1520/0502/20242018")) // Data prevista 1º Medição
            SetMVValue("CN300CRG","MV_PAR06"   , 31) // 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
            
            //indica que não exibirá a tela do pergunte CN300CRG por se tratar de rotina automática             
            Pergunte("CN300CRG",.F.)
            //Gera automaticamente o cronograma financeiro/físico pela rotina automática
            CN300PrCF(.T.) 
        Next nX 

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

        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
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
        lRet := .T.
    Else
        VarInfo("","Erro ao aprovar o contrato "+cContra+" "+cMsgErro)
    EndIf
EndIf
 
Return lRet
Expandir
titleMudança de situação de um contrato
 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   := " < NÚMERO_DO_CONTRATO > "
     Local cRevisa   := ' < REVISÃO DO CONTRATO >'
     Local cTipRev   := "NÚMERO_DA_REVISAO_ABERTA"
     Local cJustific := "Justificativa da revisão aberta do contrato"
     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.

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:

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
 A300STpRev("G")                    
cRevisa
 
:=
 
CnUltRev(cContra,
 
cFilAnt)
        
AprovRev(cContra,
 
cRevisa)
 //
Aprova
- Define o tipo de revisão 
de paralisação
que será realizado.
        
        
dDatabase
oModel := 
DaySum(dDatabase, 1)
FWLoadModel("CNTA300")        
IncluiRev(cContra,
 
cRevisa,"006")//Inclui
 
revisão
 
de
 
reinicio
    //- Carrega o modelo 
cRevisa
de 
:= CnUltRev(cContra, cFilAnt)
dados do contrato.
        
AprovRev(cContra, cRevisa)
oModel:SetOperation(MODEL_OPERATION_INSERT)     //
Aprova revisão RESET ENVIRONMENT Return Nil Static Function IncluiRev(cContra, cRevisao, cTipRev)
- Define operação do modelo. Será INSERIDA uma revisão.


        
Local
if 
aErro
(lRet :=
{}
 
Local
oModel:
= Nil CN0->(DbSetOrder(1
Activate(.T.))//
CN0_FILIAL+CN0_CODIGO CN9->(DBSetOrder(1)) If (CN9->(DbSeek(xFilial("CN9") + cContra + cRevisao)) .And. CN0->( DbSeek(xFilial("CN0") + cTipRev) ))
- Ativa o modelo. É necessária a utilização do parâmetro como true (.T.) para realizar uma copia.
            
        
    //=== Preenchimento das 
A300STpRev(CN0->CN0_TIPO) //Define o tipo de revisão a ser realizado
alterações da revisão. =======================================================================================
            //== Cabeçalho
            oModel
:
=
SetValue( 
FWLoadModel(
'
CNTA300
CN9MASTER'
)
  
//CNTA300
 
=
 
Compras
, 
pra vendas usar CNTA301
'CN9_TIPREV' , cTipRev)       //- 
oModel:SetOperation(MODEL_OPERATION_INSERT) oModel:Activate(.T.)
É obrigatório o preenchimento do tipo de revisão do contrato.
    
        oModel:SetValue( 'CN9MASTER'    , 'CN9_
TIPREV' , cTipRev)
JUSTIF' , cJustific)    //- É obrigatório o preenchimento da justificativa de revisão do contrato.
            oModel:SetValue( 'CN9MASTER'    , 'CN9_
JUSTIF
CONDPG'
 , 
"Teste revisão"
cCond)
       
If CN0->CN0_TIPO == "5" //paralisacao
//- Nesse exemplo, estamos utilizando a revisão aberta para alterar a condição de pagamento  

            oModel:SetValue( '
CN9MASTER
CXMDETAIL' ,'
CN9
CXM_
MOTPAR
VLMAX'
   , 
"001"
1000)
    //- Alterando o valor máximo do agrupador de 
oModel:SetValue('CN9MASTER','CN9_DTFIMP' , DaySum(dDatabase, 1))
estoque

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

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

            if 
Endif
!IsBlind()
        
        
oModel:DeActivate
GCTLog(cLog)
        
oModel:Destroy()
    
EndIf Return Static Function AprovRev(cContra, cRevisa)
else
         
Local
 
aArea
     
:=
 
CN9->(GetArea()
ConOut(cLog)
   
Local
 
lResult
   
:=
 
.F.
    endif
    
CN9->(DBSetOrder(1))
    
if CN9->(DbSeek(xFilial("CN9") + cContra + cRevisa))
EndIf    
    EndIf
Return lRet     
lResult := (CN300Aprov(.T.) == 0) 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"               
        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

Exemplo de inclusão de contrato com rateios

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

    //Preparação do contrato para revisão
    
CN9->(DBSetOrder(1))
    
ConOut("INICIO TESTE") IncCtrRateio()
If CN9->(DbSeek(xFilial("CN9")+cContra+cRevisa))     //- Posicionamento no contrato 
que 
ConOut("FIM TESTE")
será revisado.
       
RESET
 
ENVIRONMENT

Return nRet /*Exemplo de inclusão de contrato com rateios(CNZ)*/ Static Function IncCtrRateio()
        A300STpRev("1")       
Local
 
aErro
     
:=
 
{}
    
Local
 
oModel
    
:=
 
Nil
    
Local
 
oModelCNB
 
:=
 
Nil
  //- Tipo 
Local
de 
oModelCNZ := Nil
revisão aditivo
    
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)
- Carrega o modelo de dados do contrato.
        oModel:
SetValue('CN9MASTER','CN9_UNVIGE', '2') oModel:SetValue('CN9MASTER','CN9_VIGE', 6 ) oModel:SetValue('CN9MASTER','CN9_MOEDA', 1)
SetOperation(MODEL_OPERATION_INSERT)     //- Define operação do modelo. Será INSERIDA uma revisão.
        
        oModel:
SetValue('CN9MASTER','CN9_TPCTO',
Activate(.T.)    
"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")
- Ativa o modelo. É necessária a utilização do parâmetro como true (.T.) para realizar uma copia.
    
    
    //
Planilhas
 Preenchimento 
do
das 
Contrato
alterações da revisão 
oModel:SetValue('CNADETAIL','CNA_NUMERO'
de aditivo.
       
, PadL("1", Len(CNA->CNA_NUMERO),"0"))
 // Cabeçalho
    
oModel:SetValue('CNADETAIL','CNA_FORNEC'
    
,
oModelCN9:= oModel:
GetValue('CNCDETAIL','CNC_CODIGO'))
GetModel("CN9MASTER")
    
    
oModel
oModelCN9:SetValue( '
CNADETAIL','CNA_TIPPLA'
CN9_TIPREV' , 
"Z0F"
cTipRev)     
  //- É 
oModelCNB
obrigatório 
:= oModel:GetModel("CNBDETAIL") oModelCNZ := oModel:GetModel("CNZDETAIL")
o preenchimento do tipo de revisão do contrato.
    
   
//Primeiro
 
produto
    
oModelCNB
oModelCN9:SetValue( '
CNB
CN9_
ITEM' , StrZero(1, Len(CNB->CNB_ITEM)))
JUSTIF' , cJustific)    //- É obrigatório o preenchimento da justificativa de revisão do contrato.
    
oModelCNB:SetValue('CNB_PRODUT'
    
,'GCT000000000000000000000000001')

        oModelCNA:= 
oModelCNB
oModel:
SetValue
GetModel('
CNB_QUANT'
CNADETAIL')
    
,6)
    oModelCNB:= oModel:
SetValue
GetModel('
CNB_VLUNIT'
CNBDETAIL')
        
,500)

    
//Rateio
 
do
 
primeiro
 
item
 // 
oModelCNZ:SetValue('CNZ_ITEM'
Adiciona planilha
     
,StrZero(1,
 
Len(CNZ->CNZ_ITEM)))
  For nX 
oModelCNZ:SetValue('CNZ_PERC' ,50)
:= 1 to nQtdPlan
       
oModelCNZ:SetValue('CNZ_CC'
     
,'GCT000001')

    
oModelCNZ:AddLine()
    
oModelCNZ:SetValue('CNZ_ITEM'
   
,StrZero(2, Len(CNZ->CNZ_ITEM))
 oModelCNA:AddLine()
 		   
oModelCNZ:SetValue('CNZ_PERC' ,50)
 nLinPlan := oModelCNA:GetLine()	
    
oModelCNZ:SetValue('CNZ_CC'
    
,'GCT000002')
    //
Segundo
Planilhas 
produto
do Contrato
        
oModelCNB:AddLine()
    
oModelCNB
oModelCNA:
SetValue
LoadValue('
CNB
CNA_
ITEM
NUMERO'
   , StrZero(
2
nLinPlan, Len(
CNB
CNA-
>CNB
>CNA_
ITEM
NUMERO)))
            
oModelCNB
oModelCNA:SetValue('
CNB
CNA_
PRODUT
FORNEC'    ,
'GCT000000000000000000000000002')
 oModel:GetValue('CNCDETAIL','CNC_CODIGO'))   
            
oModelCNB
oModelCNA:SetValue('
CNB
CNA_
QUANT
TIPPLA'    , 
,6
cTipPlan)
        
oModelCNB:SetValue('CNB_VLUNIT'
    
,500)

            //
Rateio
Primeiro produto 
do
da 
segundo
planilha 
item
adicionada
            
oModelCNZ
oModelCNB:
SetValue
LoadValue('
CNZ
CNB_ITEM'     , StrZero(1, Len(
CNZ
CNB-
>CNZ
>CNB_ITEM)))
     
oModelCNZ:SetValue('CNZ_PERC'
   
,70)
    
oModelCNZ
oModelCNB:SetValue('
CNZ
CNB_
CC
PRODUT'    , 
,'GCT000003'
cProd)
        
oModelCNZ:AddLine()
    
oModelCNZ
oModelCNB:SetValue('
CNZ
CNB_
ITEM
QUANT'     ,
StrZero(2, Len(CNZ->CNZ_ITEM))
 6)
     
oModelCNZ:SetValue('CNZ_PERC'
   
,30)
    
oModelCNZ
oModelCNB:SetValue('
CNZ
CNB_
CC
VLUNIT'    , 
,'GCT000005'
500)


If
 
(oModel:VldData()) /*Valida o modelo como um todo*/
           
oModel:CommitData()
//
--Grava Contrato
Segundo produto da planilha adicionada
    
EndIf
 
    
CN9->(DbSetOrder(1))
   
If(oModel:HasErrorMessage()
oModelCNB:AddLine()
          
aErro
 
:=
 
oModel
oModelCNB:
GetErrorMessage()
LoadValue('CNB_ITEM'     , 
AEval( aErro, { | x | ConOut( x ) } ) ElseIf(CN9->(DbSeek(xFilial("CN9") + cContrat))) ConOut("Contrato gravado com sucesso.") EndIf Return

Exemplo de inclusã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()
StrZero(2, Len(CNB->CNB_ITEM)))
            oModelCNB:SetValue('CNB_PRODUT'    , cProd2)
            oModelCNB:SetValue('CNB_QUANT'     , 6)
         
   
PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10"
oModelCNB:SetValue('CNB_VLUNIT'    , 500)

            //Adiciona cronograma financeiro as 
planilhas
     
       
ConOut("INICIO TESTE")
SetMVValue("CN300CRG","MV_PAR01"   , 1)  // Periodicidade : 
1= 
       ExemploAdt()
Mensal, 2=Quinzenal, 3= Diário, 4= Cond. Pag.
      
      
ConOut
SetMVValue("
FIM TESTE")
CN300CRG","MV_PAR02"   , 
RESET ENVIRONMENT Return /*Exemplo da utilização dos adiantamentos sem interface gráfica*/ Static Function ExemploAdt()
30) // Dia(s)?
    
Local
 
oModel
    
:=
 
NIL Local cModelId := ""
  SetMVValue("CN300CRG","MV_PAR03"   , 
Local
1) 
cContra
 // Ultimo 
:= "CONTRATOADT" Local cChave := xFilial("CN9") + cContra
dia do mês? 1 = sim, 2 = não
      
Local
 
aErro
     
:= {} Local oMdlCNX := NIL
SetMVValue("CN300CRG","MV_PAR04"   , "05/2024") // Competência Inicio?
       
Local
 
cNumero
   
:= ""
 SetMVValue("CN300CRG","MV_PAR05"   , 
CN9->(DbSetOrder(1
cTod("15/05/2024"))
 // Data prevista 
If CN9->(DbSeek(cChave))
1º Medição
            
A300lAdian(.T.
SetMVValue("CN300CRG","MV_PAR06"   , 3) //
Ativa
 Quantidade 
operação
de 
adiantamento
parcelas
           
cModelId:= CN9->(IIF(CN9_ESPCTR == '1', 'CNTA300', 'CNTA301'))
 SetMVValue("CN300CRG","MV_PAR07"   , "   ") // Condição de Pagamento?
         
oModel
  
:=
 
FwLoadModel(cModelId) oModel:SetOperation(MODEL_OPERATION_UPDATE)
SetMVValue("CN300CRG","MV_PAR08"   , 0) // Taxa de Juros para cálculo do valor presente
         
If
 
oModel:Activate()
  
            //indica que não exibirá 
oMdlCNX
a 
:= oModel:GetModel("CNXDETAIL") cNumero := StrZero(oMdlCNX:Length(), GetSx3Cache('CNX_NUMERO','X3_TAMANHO'))
tela do pergunte CN300CRG por se tratar de rotina automática             
            
oMdlCNX:SetValue('CNX_NUMERO', cNumero) If cModelId == 'CNTA301'//Venda
Pergunte("CN300CRG",.F.)
            //Gera automaticamente o cronograma financeiro/físico pela rotina automática
            CN300PrCF(.T.) 
       
 Next nX 

        
     
oMdlCNX:SetValue('CNX_CLIENT',
 
oModel:GetValue('CNCDETAIL',
 
'CNC_CLIENT'))
 //Validação e Gravação do Modelo 
        lRet := 
oMdlCNX
oModel:
SetValue('CNX_LOJACL',
VldData() .And. oModel:
GetValue('CNCDETAIL', 'CNC_LOJACL'))
CommitData()

        If !lRet .And. oModel:HasErrorMessage() 
Else
//
Compra
Operação falhou          
oMdlCNX:SetValue('CNX_FORNEC', oModel:GetValue('CNCDETAIL', 'CNC_CODIGO'))

             
            
oMdlCNX
aEval(oModel:
SetValue('CNX_LJFORN', oModel:GetValue('CNCDETAIL', 'CNC_LOJA'))
GetErrorMessage(),{|x| cLog+= IIF(ValType(x) == 'C', x, '')+ Chr(13)+Chr(10) })
 
            
EndIf
If !IsBlind()
            
oMdlCNX:SetValue('CNX_VLADT',
 
1000)
   GCTLog(cLog)
         
oMdlCNX:SetValue('CNX_BANCO',
 
'000')//gatilhará
 
agência(CNX_AGENCI) e conta(CNX_CONTA)
 Else
                ConOut(cLog)
            
If oModel:VldData()
Endif
        EndIf   
    
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)
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
        
VarInfo('Erro
lRet 
apresentado
:
', aErro)
= .T.
    Else
        
EndIf
VarInfo("","Erro ao aprovar o contrato "+cContra+" "+cMsgErro)
    EndIf
EndIf
 
Return

Exemplo de inclusão de contrato com múltiplas planilhas

 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 ###
#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
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]'
    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) ))        
    
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")
A300STpRev(CN0->CN0_TIPO) //Define o tipo de revisão a ser realizado	
        
        oModel := FWLoadModel('CNTA300') //
Primeiro produto
CNTA300 = Compras, pra vendas usar CNTA301
        
oModelCNB
oModel:
SetValue('CNB_ITEM'
SetOperation(MODEL_OPERATION_INSERT)
      
,
 
StrZero(1, Len(CNB->CNB_ITEM)))
 oModel:Activate(.T.)
        
        
oModelCNB
oModel:SetValue('
CNB_PRODUT'
CN9MASTER','
GCT000000000000000000000000001'
CN9_TIPREV'	, cTipRev)
        
oModelCNB
oModel:SetValue('CN9MASTER','
CNB
CN9_
QUANT
JUSTIF'	, 
,6
"Teste revisão")
        
oModelCNB:SetValue('CNB_VLUNIT'

    
,500)
    If CN0->CN0_TIPO == "5" //
Segundo
paralisacao
   
produto
 
        
oModelCNB
oModel:
AddLine()
SetValue('CN9MASTER','CN9_MOTPAR'	, "001")
            
oModelCNB
oModel:SetValue('CN9MASTER','
CNB
CN9_
ITEM'
DTFIMP'	, DaySum(dDatabase, 1))
      
,
 
StrZero(2, Len(CNB->CNB_ITEM)))
 EndIf        
oModelCNB:SetValue('CNB_PRODUT'


    
,'GCT000000000000000000000000002')
    lResult := (oModel:VldData() .And. 
oModelCNB
oModel:
SetValue('CNB_QUANT'
CommitData())
     
,6)
   
     
oModelCNB:SetValue('CNB_VLUNIT'
   If 
,500
(!lResult)
       
next
 
nX
 
   aErro 
If
:= 
(
oModel:
VldData
GetErrorMessage()
) /*Valida o modelo como um todo*/
//Obtem a mensagem de erro
        Endif
   
oModel:CommitData()//--Grava
 
Contrato
    
EndIf

    
    
CN9->(DbSetOrder(1))
oModel:DeActivate()
        
If(
oModel:
HasErrorMessage
Destroy()
    EndIf
Return


Static Function AprovRev(cContra, cRevisa)
    Local aArea    
aErro
 := 
oModel:GetErrorMessage(
CN9->(GetArea())
    Local lResult   
AEval( aErro, { | x | ConOut( x ) } ) ElseIf(
:= .F.
    
    CN9->(DBSetOrder(1))
    if CN9->(DbSeek(xFilial("CN9") + cContra + 
cContrat)
cRevisa))
        lResult := 
ConOut("Contrato gravado com sucesso.")
(CN300Aprov(.T.) == 0)        
    
EndIf
endif

    RestArea(aArea)
Return lResult