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
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
4
Competência de início?(tipo caractere)
Deve ser composta por mês/ano no formato MM/AAAA(Exemplo: 12/2018)
5
Data prevista da 1º medição(tipo data)
Data prevista para que ocorra a primeira medição(exemplo: )
6
Quantidade de parcelas(tipo numérico)
Número de parcelas do cronograma
7
Condição de Pagamento(tipo caractere)
Código da condição de pagamento que as parcelas do cronograma devem ser geradas
8
Taxa de Juros(tipo numérico)
Taxa de Juros para cálculo do valor presente
Exemplo de rotina automática - Inclusão de contrato
A Rotina CNTA300 foi desenvolvida em MVC, portanto para realizar a inclusão, alteração e exclusão de um contrato, automaticamente, deve-se fazer uso do modelo de dados. A Seguir mostraremos um exemplo de como realizar a inclusão de um contrato utilizando o modelo de dados da rotina CNTA300.
Exemplo de rotina automática - Inclusão de contrato com geração do cronograma financeiro/físico, inclusão de contrato com geração do cronograma financeiro e contábil
A função CN300PrCF(.T.) permite que se gere automaticamente o cronograma financeiro/físico pela rotina automática da mesma maneira que se faz pela tela(pelo botão Outras Ações → Incluir cronograma financeiro/físico).
A função recebe como argumento a variável lógica .T. para efetuar a inclusão do cronograma financeiro/físico
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
4
Competência de início?(tipo caractere)
Deve ser composta por mês/ano no formato MM/AAAA(Exemplo: 12/2018)
5
Data prevista da 1º medição(tipo data)
Data prevista para que ocorra a primeira medição(exemplo: )
6
Quantidade de parcelas(tipo numérico)
Número de parcelas do cronograma
7
Condição de Pagamento(tipo caractere)
Código da condição de pagamento que as parcelas do cronograma devem ser geradas
8
Taxa de Juros(tipo numérico)
Taxa de Juros para cálculo do valor presente
Bloco de código
theme
Eclipse
#Include 'Protheus.ch'
#INCLUDE "FWMVCDEF.CH"
User Function CN300AUTO()
Local aErro := {}
Local oModel := FWLoadModel("CNTA300") //Carrega o modelo
oModel:SetOperation(MODEL_OPERATION_INSERT) // Seta operação de inclusão
oModel:Activate() // Ativa o Modelo
//Cabeçalho do contrato
oModel:SetValue( 'CN9MASTER' , 'CN9_DTINIC' , Ctod("24/02/2017") )
oModel:SetValue( 'CN9MASTER' , 'CN9_NUMERO' , '000000000000069' )
oModel:SetValue( 'CN9MASTER' , 'CN9_UNVIGE' , '3' )
oModel:SetValue( 'CN9MASTER' , 'CN9_VIGE' , 1 )
oModel:SetValue( 'CN9MASTER' , 'CN9_MOEDA' , 1 )
oModel:SetValue( 'CN9MASTER' , 'CN9_CONDPG' , '001' )
oModel:SetValue( 'CN9MASTER' , 'CN9_TPCTO' , '001' )
//Cliente/Fornecedor do Contrato
oModel:SetValue( 'CNCDETAIL' , 'CNC_CODIGO' , '001 ' )
oModel:SetValue( 'CNCDETAIL' , 'CNC_LOJA' , '01' )
//Planilhas do Contrato
oModel:LoadValue( 'CNADETAIL' , 'CNA_CONTRA' , '000000000000069' )
oModel:SetValue( 'CNADETAIL' , 'CNA_NUMERO' , '000001' )
oModel:SetValue( 'CNADETAIL' , 'CNA_FORNEC' , '001 ' )
oModel:SetValue( 'CNADETAIL' , 'CNA_LJFORN' , '01' )
oModel:SetValue( 'CNADETAIL' , 'CNA_TIPPLA' , '004' )
//Itens da Planilha do Contrato
oModel:SetValue( 'CNBDETAIL' , 'CNB_ITEM' , '001' )
oModel:SetValue( 'CNBDETAIL' , 'CNB_PRODUT' , '001 ' )
oModel:SetValue( 'CNBDETAIL' , 'CNB_QUANT' , 1 )
oModel:SetValue( 'CNBDETAIL' , 'CNB_VLUNIT' , 1000 )
oModel:SetValue( 'CNBDETAIL' , 'CNB_PEDTIT' , '1' )
//Cronograma Financeiro
SetMVValue("CN300CRG","MV_PAR01",1) // Periodicidade : 1= Mensal, 2=Quinzenal, 3= Diário, 4= Cond. Pag.
SetMVValue("CN300CRG","MV_PAR02",30) // Dia(s)?
SetMVValue("CN300CRG","MV_PAR03",1) // Ultimo dia do mês? 1 = sim, 2 = não
SetMVValue("CN300CRG","MV_PAR04","02/2018") // Competência Inicio?
SetMVValue("CN300CRG","MV_PAR05", cTod("20/02/2018")) // Data prevista 1º Medição
SetMVValue("CN300CRG","MV_PAR06", 1) // Quantidade de parcelas
SetMVValue("CN300CRG","MV_PAR07", " ") // Condição de Pagamento?
SetMVValue("CN300CRG","MV_PAR08", 0) // Taxa de Juros para cálculo do valor presente
Pergunte("CN300CRG",.F.)
CN300PrCF(.T.)
//Validação e Gravação do Modelo
If oModel:VldData()
oModel:CommitData()
else
aErro := oModel:GetErrorMessage()
TmsMsgErr(aErro)
EndIf
Return
Bloco de código
firstline
1
title
Exemplo cronograma contábil
linenumbers
true
//Exemplo de rotina automática - inclusão de contrato com cronograma financeiro e contábil
Expandir
title
Inclusão de contrato com geração do cronograma financeiro/físico
Bloco de código
theme
Eclipse
#Include 'Protheus.ch'
#INCLUDE "FWMVCDEF.CH"
User Function CN300AUTO()
Local
oModel
aErro
:=
FWLoadModel("CNTA300") //Carrega o modelo
Local cFornec1 := "GCT001"
oModel:SetOperation(MODEL_OPERATION_INSERT) // Seta operação de inclusão
oModel:Activate(
A Rotina CNTA300 foi desenvolvida em MVC, portanto para realizar a revisão automaticamente, deve-se fazer uso do modelo de dados. A Seguir mostraremos um exemplo de como realizar a revisão do tipo aberta de um contrato utilizando o modelo de dados da rotina CNTA300.
Neste exemplo, é feita a revisão do tipo aberta de um contrato com tipo de planilha semi fixo por agrupador.
Para mais detalhe sobre os tipos de planilha, consulte a página: Tipos de Planilha
#Include "Protheus.CH"
#Include "FWMVCDEF.CH"
User Function CN300AUTO()
Local oModel := Nil
Local cContra := " < NÚMERO_DO_CONTRATO > "
Local cTipRev := "NÚMERO_DA_REVISAO_ABERTA"
Local cJustific := "Justificativa da revisão aberta do contrato"
Local cCond := "CONDICAO_DE_PAGAMENTO"
Local lRet := .F.
//=== Preparação do contrato para revisão =============================================================================================
CN9->(DBSetOrder(1))
If CN9->(DbSeek(xFilial("CN9")+cContra)) //- Posicionamento no contrato que será revisado.
A300STpRev("G") //- Define o tipo de revisão que será realizado.
oModel := FWLoadModel("CNTA300") //- Carrega o modelo de dados do contrato.
oModel:SetOperation(MODEL_OPERATION_INSERT) //- Define operação do modelo. Será INSERIDA uma revisão.
oModel:Activate(.T.) //- Ativa o modelo. É necessária a utilização do parâmetro como true (.T.) para realizar uma copia.
//=== Preenchimento das alterações da revisão. =======================================================================================
//== Cabeçalho
oModel:SetValue( 'CN9MASTER' , 'CN9_TIPREV' , cTipRev) //- É obrigatório o preenchimento do tipo de revisão do contrato.
oModel:SetValue( 'CN9MASTER' , 'CN9_JUSTIF' , cJustific) //- É obrigatório o preenchimento da justificativa de revisão do contrato.
oModel:SetValue( 'CN9MASTER' , 'CN9_CONDPG' , cCond) //- Nesse exemplo, estamos utilizando a revisão aberta para alterar a condição de pagamento
//== Qualquer alteração possível na execução manual pode ser automatizada.
oModel:SetValue( 'CXMDETAIL' ,'CXM_VLMAX' , 1000) //- Alterando o valor máximo do agrupador de estoque
//== Validação e Gravação do Modelo
lRet := oModel:VldData() .And. oModel:CommitData()
EndIf
Return lRet
Exemplo de rotina automática - Revisão de realinhamento
A Rotina CNTA300 foi desenvolvida em MVC, portanto para realizar a revisão automaticamente, deve-se fazer uso do modelo de dados. A Seguir mostraremos um exemplo de como realizar a revisão de um contrato utilizando o modelo de dados da rotina CNTA300.
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 := "
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
"
Local cRevisa := ' <
TIPO_DE_REVISÃO
REVISÃO DO CONTRATO >
'
Local cTipRev :=
cJustific
"NÚMERO_DA_REVISAO_ABERTA"
Local cJustific :=
'
"Justificativa da revisão aberta do contrato
'
Local lRet
"
Local cCond := "CONDICAO_DE_PAGAMENTO"
Local cLog := ""
Local lRet := .F.//=== Preparação do contrato para revisão =============================================================================================
CN9->(DBSetOrder(1))
If CN9->(DbSeek(xFilial("CN9")+cContra
))
+cRevisa)) //- Posicionamento no contrato que será revisado.
A300STpRev("
3")
G") //- Define o tipo de revisão que será realizado.
oModel := FWLoadModel("CNTA300")
//- Carrega o modelo de dados do contrato.
oModel:SetOperation(MODEL_OPERATION_INSERT)
//- Define operação do modelo. Será INSERIDA uma revisão.
if (lRet := oModel:Activate(.T.)
)//- Ativa o modelo. É necessária a utilização do parâmetro como true (.T.) para realizar uma copia.
//=== Preenchimento das alterações da revisão. =======================================================================================
//- É obrigatório o preenchimento da justificativa de revisão do contrato.
//== Qualquer alteração possível na execução manual pode ser automatizada.
oModel:SetValue( '
CNBDETAIL
CN9MASTER' , '
CNB
CN9_
VLUNIT
CONDPG'
,
0.0010)
cCond) //-
Alteração do valor unitário do item.
CN300RdSld(oModel) //- Realiza a redistribuição do saldo da planilha
//== Validação e Gravação do Modelo
lRet := oModel:VldData() .And. oModel:CommitData()
EndIf
Return lRet
Exemplo de rotina automática - Aprovação de revisão (sem alçadas)
A Rotina CNTA300 foi desenvolvida em MVC, portanto para realizar a aprovação, deve-se fazer uso do modelo de dados. A Seguir mostraremos um exemplo de como realizar a aprovação de uma revisão de um contrato utilizando o modelo de dados da rotina CNTA300.
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
theme
Eclipse
### 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
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
Exemplo de paralisação/reinicio de contrato
Abaixo um exemplo de como é possível paralisar e dar reinicio a um contrato:
Nesse exemplo, estamos utilizando a revisão aberta para alterar a condição de pagamento
oModel:SetValue( 'CXMDETAIL' ,'CXM_VLMAX' , 1000) //- Alterando o valor máximo do agrupador de estoque
//== Validação e Gravação do Modelo
lRet := oModel:VldData() .And. oModel:CommitData()
endif
If !lRet .And. oModel:HasErrorMessage() //Operação falhou
aEval(oModel:GetErrorMessage(),{|x| cLog+= IIF(ValType(x) == 'C', x, '')+ Chr(13)+Chr(10) })
if !IsBlind()
GCTLog(cLog)
else
ConOut(cLog)
endif
EndIf
EndIf
Return lRet
Expandir
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.
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
A300STpRev("1")
oModel:SetValue('CN9MASTER','CN9_MOTPAR' ,
"001")
oModel:SetValue('CN9MASTER','CN9_DTFIMP' ,
DaySum(dDatabase,
1))
//-Tipoderevisão
EndIf
aditivo
lResult
oModel :=
(oModel:VldData() .And. oModel:CommitData())
FWLoadModel("CNTA300")
If (!lResult)
//- Carrega o modelo de dados do contrato.
aErro
:=
oModel:
GetErrorMessage
SetOperation(
)//Obtem a mensagem de erro
Endif
MODEL_OPERATION_INSERT) //- Define operação do modelo. Será INSERIDA uma revisão.
oModel:
DeActivate
Activate(.T.)
oModel:Destroy()
EndIf
Return
Static
Function
AprovRev(cContra,
cRevisa)
Local
aArea
:=
CN9->(GetArea())
Local lResult := .F
//- Ativa o modelo. É necessária a utilização do parâmetro como true (.T.) para realizar uma copia.
CN9->(DBSetOrder(1))
if CN9->(DbSeek(xFilial("CN9") + cContra + cRevisa))
// Preenchimento das alterações da revisão de aditivo.
Para contratos de vendas deve-se carregar o modelo CNTA301 ao invés do CNTA300, abaixo um exemplo:
Bloco de código
theme
Eclipse
### Exemplo de inclusão de uma contrato de venda ###
#Include 'Protheus.ch'
#Include "FWMVCDEF.CH"
#INCLUDE "RWMAKE.CH"
#INCLUDE "TBICONN.CH"
User Function CN300AUTO()
Local nRet := 0
PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10"
oModelCN9:SetValue( 'CN9_TIPREV' , cTipRev) //- É obrigatório o preenchimento do tipo de revisão do contrato.
oModelCN9:SetValue( 'CN9_JUSTIF' , cJustific) //- É obrigatório o preenchimento da justificativa de revisão do contrato.
oModelCNA:= oModel:GetModel('CNADETAIL')
oModelCNB:= oModel:GetModel('CNBDETAIL')
oModelCNB:SetValue('CNB_PRODUT' ,'GCT000000000000000000000000002')
oModelCNB:SetValue('CNB_QUANT' ,6)
oModelCNB:SetValue('CNB_VLUNIT' ,500)
//Rateio do segundo item
oModelCNZ:SetValue('CNZ_ITEM' ,StrZero(1, Len(CNZ->CNZ_ITEM)))
oModelCNZ:SetValue('CNZ_PERC' ,70)
oModelCNZ:SetValue('CNZ_CC' ,'GCT000003')
oModelCNZ:AddLine()
oModelCNZ:SetValue('CNZ_ITEM' ,StrZero(2, Len(CNZ->CNZ_ITEM)))
oModelCNZ:SetValue('CNZ_PERC' ,30)
oModelCNZ:SetValue('CNZ_CC' ,'GCT000005')
If (oModel:VldData()) /*Valida o modelo como um todo*/
oModel:CommitData()//--Grava Contrato
EndIf
CN9->(DbSetOrder(1))
If(oModel:HasErrorMessage())
EndIf
Return lRet
Expandir
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
aErro
lRet :=
oModel:GetErrorMessage()
.T.
Else
AEval(
aErro,
{
|
x | ConOut( x ) }
VarInfo("","Erro ao aprovar o contrato "+cContra+" "+cMsgErro)
ElseIf(CN9->(DbSeek(xFilial("CN9") + cContrat)))
ConOut("Contrato gravado com sucesso.")
EndIf
Return
Exemplo de inclusão de adiantamentos em um contrato
EndIf
EndIf
Return lRet
Expandir
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 ###
FWMVCDEF.CH"
/* É possível mudar para as situações conforme abaixo:
"01"=Cancelado
"03"=Emitido
"05"=Vigente
"06"=Paralisado
"07"=Sol Fina.
"08"=Finalizado
"11"=Rejeitado
*/
User Function
CN300AUTO
CN300SITU()
LocalcFilCont:=' < 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]'
PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10"
ConOut("INICIO TESTE")
ExemploAdt()
ConOut("FIM TESTE")
RESET ENVIRONMENT
Return
/*Exemplo da utilização dos adiantamentos sem interface gráfica*/
Static Function ExemploAdt()
Local oModel := NIL
Local
cModelId
cRevisa
:=
""
Local cContra := "CONTRATOADT"
Local cChave := xFilial("CN9") + cContra
Local aErro
Space(3)//Deve ser substituído pela revisão
PREPARE ENVIRONMENT EMPRESA "T1" FILIAL "D MG 01 " MODULO "GCT" TABLES "CN9T10"
:=
{}
Local
oMdlCNX
:=
NIL
Local
cNumero
dDatabase := CToD("20/04/2020"
CN9->(DbSetOrder(1))
If CN9->(DbSeek(cChave))
)
IncluiRev(cContra, cRevisa,"005") //Inclui revisão de paralisação