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
Exemplo de Rotina Automática CNTA300
Características do Requisito
Linha de Produto:
Microsiga
Linha Protheus
Segmento:
Serviços
Backoffice
Módulo:
Gestão de Contratos
Rotina:
Rotina
Nome Técnico
CNTA300
Manutenção de Contratos
País(es)
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
Descrição
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.
Retorna o tipo de revisão que está sendo realizada, definida pela função A300STpRev()
CN300PrCF
Função que processa a inclusão do cronograma financeiro/físico
Incluir cronograma financeiro/físico
CN300DelCrg()
Exclui cronograma financeiro e físico
Excluir cronograma financeiro/físico
CN300PrcCC()
Inclui cronograma contábil
Incluir cronograma contábil
CN300DelCtb()
Exclui cronograma contábil
Excluir cronograma contábil
CN300RdSld(oModel)
Redistribui saldo do cronograma.
Redistribuir saldo
CN300AtCrs(oModel)
Atualizar cronograma financeiro e físico
Atualizar cronograma financeiro/físico
CN300Reaju(oModel)
Realiza reajuste baseado em índices
Executar reajuste
CN300Aprov(lAuto)
Realiza aprovação de revisão posicionada.
Aprovar revisão
A300GTMenu
Retorna 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
title
Inclusão de contrato
Bloco de código
theme
Eclipse
#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")
)
//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
title
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 contratos de vendas deve-se carregar o modelo CNTA301 ao invés do CNTA300.
Bloco de código
theme
Eclipse
#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
title
Inclusão de contrato com rateios
Bloco de código
firstline
1
title
Exemplo com Rateios
linenumbers
true
#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
title
Inclusão de adiantamentos em um contrato
Bloco de código
firstline
1
title
Exemplo com Adiantamentos
linenumbers
true
#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
title
Inclusão de contrato com múltiplas planilhas
Bloco de código
firstline
1
title
Exemplo múltiplas planilhas
linenumbers
true
#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
title
Inclusã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
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
title
Revisã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
title
Exemplo 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.
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. =======================================================================================
//== 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
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
title
Revisão de realinhamento
Bloco de código
theme
Eclipse
#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
title
Revisã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
theme
Eclipse
#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: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)?
SetMVValue("CN300CRG","MV_PAR03" , 1) // Ultimo dia do mês? 1 = sim, 2 = não
SetMVValue("CN300CRG","MV_PAR04" , "05/2024") // Competência Inicio?
SetMVValue("CN300CRG","MV_PAR05" , cTod("15/05/2024")) // Data prevista 1º Medição
SetMVValue("CN300CRG","MV_PAR06" , 3) // 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
title
Aprovação de revisão (sem alçadas)
Bloco de código
theme
Eclipse
#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
title
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
theme
Eclipse
### 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
title
Paralisação/reinício de contrato
Abaixo um exemplo de como é possível paralisar e dar reinicio a um contrato:
Bloco de código
theme
Eclipse
### 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
Informações
title
Lista de funções úteis
Função
Utilização
Referente 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:
Retorna o tipo de revisão que está sendo realizada, definida pela função A300STpRev()
CN300PrCF()
Inclui cronograma financeiro e físico
Incluir cronograma financeiro/físico
CN300DelCrg()
Exclui cronograma financeiro e físico
Excluir cronograma financeiro/físico
CN300PrcCC()
Inclui cronograma contábil
Incluir cronograma contábil
CN300DelCtb()
Exclui cronograma contábil
Excluir cronograma contábil
CN300RdSld(oModel)
Redistribui saldo do cronograma.
Redistribuir Saldo
CN300AtCrs(oModel)
Atualizar cronograma financeiro e físico
Atualizar cronograma financeiro/físico
CN300Reaju(oModel)
Realiza reajuste baseado em indices
Executar reajuste
Bloco de código
theme
Eclipse
#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