Incluir um Item Contábil após cadastrar algum Cliente/Fornecedor

Hoje vou mostrar uma forma de criar automaticamente um Item Contábil através da inclusão de um fornecedor.

Pessoal, o tutorial abaixo, eu usei como base a SA2 (cadastro de Fornecedor), porém você consegue adaptar e usar a SA1 (cadastro de Cliente), basta você modificar os campos e o ponto de entrada.

A ideia aqui seria +- assim:

  1. Ao incluir um fornecedor, chamar o ponto de entrada ( M020INC )
  2. Incluir um registro na CTD, com o prefixo ‘F’
  3. Chamar uma rotina via ExecAuto para incluir CT1 e CVD

Então, tendo essa premissa, foi criado o exemplo abaixo (lembre-se de alterar os campos como Conta Superior, Conta Referência, etc conforme a sua base).

User Function M020INC()
	Local aArea  := GetArea()
	Local lRet   := .T.
	
	//Abre a tabela CTD
	DbSelectarea("CTD")
	CTD->(DbSetOrder(1))
	
	//Se nao conseguir posicionar, registro sera criado
	If ! CTD->(DbSeek(FWxFilial("CTD") + 'F' + SA2->A2_COD + SA2->A2_LOJA))
		
		RecLock("CTD", .T.)
			CTD->CTD_FILIAL := XFILIAL("CTD")
			CTD->CTD_ITEM   := 'F' + SA2->A2_COD + SA2->A2_LOJA
			CTD->CTD_DESC01 := SA2->A2_NOME
			CTD->CTD_CLASSE := "2"
			CTD->CTD_NORMAL := "0"
			CTD->CTD_BLOQ   := "2"
			CTD->CTD_DTEXIS := CTOD("01/01/1980")
			CTD->CTD_ITLP   := 'F' + SA2->A2_COD + SA2->A2_LOJA
			CTD->CTD_CLOBRG := "2"
			CTD->CTD_ACCLVL := "1"
		CTD->(MsUnLock())
		
		Processa({|| fIncConta()})
	Endif
	
	RestArea(aArea)
Return lRet

Static Function fIncConta()
	Local aArea := GetArea()
	Local cConta                                              
	Local cContaSup := "211001"
	Local oModelCTB
	Local nOpcAuto
	Local oCT1
	Local oCVD
	//Local oCTS
	Local aLog
	Local cLog := ""
	Local nAtual

	//Monta a conta
	cConta := cContaSup + SA1->A2_COD
	
	DbSelectArea("CT1")
	CT1->(DbSetOrder(1))
	
	//Se nao conseguir posicionar no Plano de Contas, sera incluida
	If ! CT1->(DbSeek(FWxFilial("CT1") + cConta))
		
		//Faz o carregamento do modelo
		If oModelCTB == Nil
			oModelCTB := FWLoadModel('CTBA020')
		EndIf
	
		//Setando a operação como Inclusão e ativando o modelo
		nOpcAuto:=3
		oModelCTB:SetOperation(nOpcAuto)
		oModelCTB:Activate()
	
		//Setando os valores da CT1 (Plano de Contas)
		oCT1 := oModelCTB:GetModel('CT1MASTER') 
		oCT1:SetValue('CT1_CONTA',   cConta)
		oCT1:SetValue('CT1_DESC01',  Alltrim(SA2->A2_NOME))
		oCT1:SetValue('CT1_CLASSE', '2')
		oCT1:SetValue('CT1_NORMAL', '2')
		oCT1:SetValue('CT1_NTSPED', '02')
		oCT1:SetValue('CT1_NATCTA', '02')
		oCT1:SetValue('CT1_INDNAT', '2')
		
		//Setando os dados da CVD (Plano de Contas Referencial)
		oCVD := oModelCTB:GetModel('CVDDETAIL')
		oCVD:SetValue('CVD_FILIAL', FWxFilial('CVD'))
		oCVD:SetValue('CVD_ENTREF', "10")
		oCVD:SetValue('CVD_CODPLA', "100")
		oCVD:SetValue('CVD_VERSAO', "0001")
		oCVD:SetValue('CVD_CTAREF', "2.01.01.03.01")
		oCVD:SetValue('CVD_CUSTO' , "")
		oCVD:SetValue('CVD_CLASSE', "2")
		oCVD:SetValue('CVD_TPUTIL', "A")
		oCVD:SetValue('CVD_NATCTA', "02")
		oCVD:SetValue('CVD_CTASUP', "2.01.01.03")
		
		//Setando os dados da CTS (Visão Gerencial)
		/*
		oCTS := oModelCTB:GetModel('CTSDETAIL')
		oCTS:SetValue('CTS_FILIAL', FWxFilial('CTS')) 
		oCTS:SetValue('CTS_CODPLA', '001')
		oCTS:SetValue('CTS_CONTAG', '211')
		oCTS:SetValue('CTS_TPSALD', '1')
		*/
		
		//Se tiver tudo ok, confirma a gravação
		If oModelCTB:VldData()
			oModelCTB:CommitData()
			
			//Grava a conta contábil no Fornecedor
			RecLock("SA2", .F.)
				SA2->A2_CONTA := cConta
			SA2->(MsUnlock())	
	
		Else
			
			//Pega o Log completo
			aLog := oModelCTB:GetErrorMessage()
	
			//Percore todas as linhas do Log
			For nAtual := 1 to Len(aLog)
				
				//Se tiver log, incrementa variável
				If ! Empty(aLog[nAtual])
					cLog  + = Alltrim(aLog[nAtual]) + Chr(13) + Chr(10)
				EndIf
			Next nAtual
			
			//Mostra o erro na tela
			lMsErroAuto := .T.
			AutoGRLog(cLog)
			MostraErro()
	
		EndIf
		
		//Desativa o modelo de dados
		oModelCTB:DeActivate()
	EndIf

	RestArea(aArea)
Return

Bom pessoal, por hoje é só.

Abraços e até a próxima.

Dan (Daniel Atilio)
Cristão de ramificação protestante. Especialista em Engenharia de Software pela FIB, graduado em Banco de Dados pela FATEC Bauru e técnico em informática pelo CTI da Unesp. Entusiasta de soluções Open Source e blogueiro nas horas vagas. Autor e mantenedor do portal Terminal de Informação.

2 Responses

  1. Robson disse:

    teria um exemplo disso com o novo ponto de entrada CRMA980?
    apartir de 04/04/2022 será desataivado o mata030 entao nao vai mais passar por esse ponto de entrada

    • Boa noite Robson.
      No caso, o ponto de entrada é no padrão MVC, segue um exemplo:

      User Function CRMA980()
      	Local aArea := FWGetArea()
      	Local aParam := PARAMIXB 
      	Local xRet := .T.
      	Local oObj := Nil
      	Local cIdPonto := ""
      	Local cIdModel := ""
      	
      	//Se tiver parametros
      	If aParam != Nil
      		
      		//Pega informacoes dos parametros
      		oObj := aParam[1]
      		cIdPonto := aParam[2]
      		cIdModel := aParam[3]
      			
      		//Apos a gravacao total do modelo e dentro da transacao 
      		If cIdPonto == "MODELCOMMITTTS"
                  nOper := oObj:nOperation
      
      			//Se for inclusão
                  If nOper == 3
                      /* aqui você faz sua tratativa*/
                  EndIf
      			
      		EndIf
      		
      	EndIf
      	
      	FWRestArea(aArea)
      Return xRet
      

Deixe uma resposta para RobsonCancelar resposta

Terminal de Informação