Á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 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'				)
oModel:SetValue( 'CN9MASTER'	, 'CN9_FLGREJ'	, '2'					)
oModel:SetValue( 'CN9MASTER'	, 'CN9_FLGCAU'	, '2'					)
oModel:SetValue( 'CN9MASTER'	, 'CN9_ASSINA'	, Ctod("24/02/2017")	)

//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'				)
oModel:SetValue(	'CNADETAIL' 	, 'CNA_FLREAJ'	, '2'					)

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

oModel:GetModel('CNFDETAIL'):SetNoInserLine(.F.)
oModel:GetModel('CNFDETAIL'):SetNoUpdateLine(.F.)

oModel:LoadValue( 'CNFDETAIL'	, 'CNF_NUMERO' 	, '000071'				)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_PARCEL' 	, '01'					)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_COMPET'	, '02/2017'			)
oModel:SetValue( 'CNFDETAIL'	, "CNF_VLPREV"	, 500					)
oModel:SetValue( 'CNFDETAIL'	, "CNF_VLREAL"	, 0						)
oModel:SetValue( 'CNFDETAIL'	, "CNF_SALDO"		, 500					)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_PRUMED'	, Ctod("24/02/2017")	)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_DTVENC'	, Ctod("24/02/2017")	)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_TXMOED'	, 1						)

oModel:GetModel('CNFDETAIL'):AddLine()

oModel:LoadValue( 'CNFDETAIL'	, 'CNF_NUMERO' 	, '000071'				)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_PARCEL' 	, '02'					)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_COMPET'	, '02/2017'			)
oModel:SetValue( 'CNFDETAIL'	, "CNF_VLPREV"	, 500					)
oModel:SetValue( 'CNFDETAIL'	, "CNF_VLREAL"	, 0						)
oModel:SetValue( 'CNFDETAIL'	, "CNF_SALDO"		, 500					)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_PRUMED'	, Ctod("24/02/2017")	)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_DTVENC'	, Ctod("24/02/2017")	)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_TXMOED'	, 1						)

//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ã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()


CN300AddCrg(aPergunte)Inclui cronograma financeiro e 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

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'				)
oModel:SetValue( 'CN9MASTER'	, 'CN9_FLGREJ'	, '2'					)
oModel:SetValue( 'CN9MASTER'	, 'CN9_FLGCAU'	, '2'					)
oModel:SetValue( 'CN9MASTER'	, 'CN9_ASSINA'	, Ctod("24/02/2017")	)

//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'				)
oModel:SetValue(	'CNADETAIL' 	, 'CNA_FLREAJ'	, '2'					)

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

oModel:GetModel('CNFDETAIL'):SetNoInserLine(.F.)
oModel:GetModel('CNFDETAIL'):SetNoUpdateLine(.F.)

oModel:LoadValue( 'CNFDETAIL'	, 'CNF_NUMERO' 	, '000071'				)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_PARCEL' 	, '01'					)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_COMPET'	, '02/2017'			)
oModel:SetValue( 'CNFDETAIL'	, "CNF_VLPREV"	, 500					)
oModel:SetValue( 'CNFDETAIL'	, "CNF_VLREAL"	, 0						)
oModel:SetValue( 'CNFDETAIL'	, "CNF_SALDO"		, 500					)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_PRUMED'	, Ctod("24/02/2017")	)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_DTVENC'	, Ctod("24/02/2017")	)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_TXMOED'	, 1						)

oModel:GetModel('CNFDETAIL'):AddLine()

oModel:LoadValue( 'CNFDETAIL'	, 'CNF_NUMERO' 	, '000071'				)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_PARCEL' 	, '02'					)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_COMPET'	, '02/2017'			)
oModel:SetValue( 'CNFDETAIL'	, "CNF_VLPREV"	, 500					)
oModel:SetValue( 'CNFDETAIL'	, "CNF_VLREAL"	, 0						)
oModel:SetValue( 'CNFDETAIL'	, "CNF_SALDO"		, 500					)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_PRUMED'	, Ctod("24/02/2017")	)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_DTVENC'	, Ctod("24/02/2017")	)
oModel:SetValue( 'CNFDETAIL'	, 'CNF_TXMOED'	, 1						)

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


A função CN300AddCrg(aPergunte) 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 o vetor aPergunte, que é composto conforme abaixo:


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 lógico)

.T. = SIM ou .F.=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
8
Variável do tipo lógico

Variável de controle interno, deve ser composta conforma abaixo:

Taxa de Juros(tipo numérico)

Taxa de Juros para cálculo do valor presente

Se for Periodicidade mensal e Ultimo dia do Mês=SIM, então seu valor deve ser .T., caso contrario deve ser .F.

Bloco de código
themeEclipse
#Include 'Protheus.ch'
#INCLUDE "FWMVCDEF.CH"
User Function CN300AUTO()
Local aPergunte := {}
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'				)
oModel:SetValue( 'CN9MASTER'	, 'CN9_FLGREJ'	, '2'					)
oModel:SetValue( 'CN9MASTER'	, 'CN9_FLGCAU'	, '2'					)
oModel:SetValue( 'CN9MASTER'	, 'CN9_ASSINA'	, Ctod("24/02/2017")	)

//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'				)
oModel:SetValue(	'CNADETAIL' 	, 'CNA_FLREAJ'	, '2'					)

//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
aAdd(aPergunte,1)//Periodicidade: 1=Mensal, 2=Quinzenal, 3=Diario, 4=Cond. Pag.
aAdd(aPergunte,30)//Dia(s)?
aAdd(aPergunte,.T.)//Ultimo dia do mes? .T.=SIM, .F.=NAO
aAdd(aPergunte,"12/2018")//Competencia de inicio?
aAdd(aPergunte,CToD("20/12/2018"))//Data prevista 1º medicao
aAdd(aPergunte,12)//Quantidade de parcelas
aAdd(aPergunte,"   ")//Condicao de Pagamento?
aAdd(aPergunte,.F.0)//SeTaxa for mensal(Periodicidade: 1=Mensal) e Ultimo dia do Mes=SIM, entao deve ser .T., caso contrario .F.de Juros para cálculo do valor presente
	
//Gera cronograma de forma automatica
CN300AddCrg(aPergunte)

//Validação e Gravação do Modelo
If oModel:VldData() 
	oModel:CommitData()
else
	aErro := oModel:GetErrorMessage()
	TmsMsgErr(aErro)
EndIf

Return

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


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	:= ' < 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))				//- 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


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:

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
            oModel:SetValue('CN9MASTER','CN9_MOTPAR'	, "001")
            oModel:SetValue('CN9MASTER','CN9_DTFIMP'	, DaySum(dDatabase, 1))
        EndIf        

        lResult := (oModel:VldData() .And. oModel:CommitData())
        
        If (!lResult)
            aErro := oModel:GetErrorMessage()//Obtem a mensagem de erro
        Endif
        
        oModel:DeActivate()
        oModel:Destroy()
    EndIf
Return


Static Function AprovRev(cContra, cRevisa)
    Local aArea     := CN9->(GetArea())
    Local lResult   := .F.
    
    CN9->(DBSetOrder(1))
    if CN9->(DbSeek(xFilial("CN9") + cContra + cRevisa))
        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