Cálculo de juros com Relatório Diário
Enviado: 04 Nov 2015 08:42
Amigos, bom dia!
Tenho o seguinte fonte e preciso saber onde está o problema que está ocasionando diferenças nos juros quando o programa calcula os valores.
Estou fazendo os JUROS MENSAIS dividido por 30 (o que é normal a meu ver) - assim obtenho os juros diários.
Fazendo o mesmo cálculo no Excel, alguns diferenças aparecem em relação aos juros diários.
O fonte está pronto pra compilar no Xharbour. Quem quiser testar, por favor.
Vejam a partir da linha 170 do código fonte que anexei; É a parte que "joga" na tela o resultado.
Inclusive pra quem quiser testar com o mesmo valor pra tela e pra arquio (imprimindo em PDF Impressora), verá as diferenças que ocorrem também nas duas "procedures".
Aguardo amigos!
Anexo o CLC.BC para compilar com HBMAKE (extensão BC o sistema não aceita - por isso anexei como TXT - altere para compilar).
OBS.: Das linhas 222 a 228 - desconsidere por ser teste por enquanto.
ERASMO ANDRIOLI
Tenho o seguinte fonte e preciso saber onde está o problema que está ocasionando diferenças nos juros quando o programa calcula os valores.
Estou fazendo os JUROS MENSAIS dividido por 30 (o que é normal a meu ver) - assim obtenho os juros diários.
Fazendo o mesmo cálculo no Excel, alguns diferenças aparecem em relação aos juros diários.
O fonte está pronto pra compilar no Xharbour. Quem quiser testar, por favor.
Vejam a partir da linha 170 do código fonte que anexei; É a parte que "joga" na tela o resultado.
Inclusive pra quem quiser testar com o mesmo valor pra tela e pra arquio (imprimindo em PDF Impressora), verá as diferenças que ocorrem também nas duas "procedures".
Aguardo amigos!
Anexo o CLC.BC para compilar com HBMAKE (extensão BC o sistema não aceita - por isso anexei como TXT - altere para compilar).
OBS.: Das linhas 222 a 228 - desconsidere por ser teste por enquanto.
ERASMO ANDRIOLI
Código: Selecionar todos
Function Main
sbGuiSupport := .T.
sbGuiSupportEx := .T.
/*
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒ Modulo Principal..........: CLC.PRG - SISTEMA CALC ▒▒
▒▒ Linguagem de Programacao..: CLIPPER 5.2e -> XHARBOUR ▒▒
▒▒ Programador...............: ERASMO ANDRIOLI SANTOS - 9629-9454 ▒▒
▒▒ Iniciado em...............: 01/03/1994 ▒▒
▒▒ Ultima Alteracao em.......: 19/08/2015 ▒▒
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
*/
#include "common.ch"
#include "gtinfo.ch"
#include "hbdll.ch"
#include "Inkey.ch"
#include "ORD.CH"
#include "visual2.ch"
#include "windows.ch"
REQUEST HB_LANG_PT
REQUEST HB_CODEPAGE_PT850
HB_LANGSELECT("PT")
HB_SETCODEPAGE( "PT850" )
REQUEST WVT_SETCODEPAGE
WVT_Core() // Inicializa lib wvtgui
WVT_Utils()
WVT_SETTITLE("CLC 1.0")
WVT_SetFont('Courier New',10,0)
WVT_SETICON("dolar.ico")
WVT_SETCODEPAGE(255) // habilitar essa linha para usar GTWVL
SET EVENTMASK TO 159
Do case // Identifica a resolucao do video
case Gtinfo(GTI_DESKTOPWIDTH) > 1365
Gtinfo(GTI_FONTWIDTH, 14) // largura 12 anterior // 13 // 12
Gtinfo(GTI_FONTSIZE, 28) // altura 29 anterior // 29 // 27
case Gtinfo(GTI_DESKTOPWIDTH) > 1023
Gtinfo(GTI_FONTWIDTH, 12) // largura 12 anterior // 13 // 12
Gtinfo(GTI_FONTSIZE, 27) // altura 29 anterior // 29 // 27
case Gtinfo(GTI_DESKTOPWIDTH) > 799
Gtinfo(GTI_FONTWIDTH, 10 ) // 10 anterior
Gtinfo(GTI_FONTSIZE, 20 ) // 20 anterior
otherwise
Gtinfo(GTI_FONTWIDTH, 8) // anterior 8
Gtinfo(GTI_FONTSIZE, 17) // anterior 17
Endcase
* Comandos de configuracao de ambiente
SET DATE BRITISH && Coloca variaveis data no formato dd/mm/aa
SET CURSOR ON && Liga a apresentacao do cursor na tela
SET CONSOLE OFF && Desliga a apresentacao de saidas de comandos
SET WRAP ON && Aceita deslizamento das setas de direcao
SET CENTURY ON && Transforma data para formato dd/mm/aaaa
SET SCOREBOARD OFF && Desliga avisos na primeira linha da tela
SET EPOCH TO 2000 && Acertar data ate 31/12/2100
SET EXACT ON && Ignora diferencas de Maiusculas/Minusculas
SET DELETED ON && Ignora registros excluidos
SET SOFTSEEK ON
* Torna Publica as Variaveis para todo o sistema...
PUBLIC empresa,eu,mfone,sistema,m_i,tipo_e
PUBLIC usuario_m,senhacrpt,nivel_usu,integra,cli_int
eu ="Desenvolvido em Xharbour por Erasmo Andrioli - "
mfone ="(66) 9629-9454"
sistema="CLC * Sistema de Cálculo de Juros"
tlinpag=63
DESKTOP("SISTEMA CLC")
DESKTOP("CLC * Sistema Calc │ Programado por Erasmo Andrioli │ V.1.0 (C) 1994-2015")
VLMouseON() // (VISUAL LIB)
cl2="R+" // Cor de fundo da 2ª Linha do Menu...
empresa="ICC CONTABILIDADE"
SET COLOR TO N+/&cl2
@1,0 CLEAR TO 1,79
SET COLOR TO GR+/&cl2
@1,1 SAY empresa
SHOWTIME(1,59,.F.,"BG/&cl2",.F.,.F.) // CHAMA O RELOGIO NA TELA
SET COLOR TO BG/&cl2
@1,68 SAY CHR(254)
@1,70 say date()
* Papel de Parede...
for l := 2 to 22 step 2
@ l ,00 say "─┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴─┬─" color "bg/w"
@ l+1,00 say "─┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬──┴──┬─┴─" color "bg/w"
end
CLC()
*****************
PROCEDURE CLC
*****************
WIN(9,10,17,65,"CALCULO DE JUROS CAPITALIZADOS")
SET CURSOR ON
SET COLOR TO "N*/W,W/BG+"
DO WHILE .T.
VALOR =0
JUROS_M=0
INICIO =DATE()
FIM =DATE()
MULTA =0
OBSERVA=SPACE(30)
@11,15 SAY "VALOR DO CAPITAL..:"
@12,15 SAY "DATA DE ORIGEM....:"
@13,15 SAY "DATA DE VENCIMENTO:"
@14,15 SAY "TAXA DE JUROS (M).: %"
@15,15 SAY "MULTA NO FINAL....: %"
@16,15 SAY "OBSERVACOES.......:"
@11,35 GET VALOR PICT "9,999,999.99"
@12,37 GET INICIO
@13,37 GET FIM
@14,41 GET JUROS_M PICT "99.999"
@15,42 GET MULTA PICT "99.99"
@16,35 GET OBSERVA
TEL=SAVENV()
READ
IF LastKey()=27
RETURN
ENDIF
IF Date() > CToD("31/12/2020") .OR. FIM > CToD("31/12/2020")
MSGBOX1("SISTEMA BLOQUEADO A PARTIR DESTA DATA!","ATENÇ╟O",10)
QUIT
ENDIF
IF VALOR < 0
TPMOV="D" // Debito
ELSEIF VALOR >= 0
TPMOV="C" // Credito
ENDIF
JUROS_D = JUROS_M/30 // Obtendo Juros Diarios
DTINI1 = INICIO+1 // Nao corrigir o Dia Inicial
DTINI2 = 0
ACUMVAL2= 0
ACUMVAL1= 0
ACUMVAL = 0
SALDO = 0
VALORJU = 0
JUR_ACUM= 0
nOpc := MsgBox3("ONDE DESEJA IMPRIMIR?",,12,"TELA","IMPRESSORA","CANCELAR")
IF nOpc == 1
WIN(12,13,17,64,"AGUARDE!!! IMPRIMINDO...","GR+/N","N+/W")
FRAME(14,14,16,63)
DO IMP_CLC_T
ELSEIF nOpc == 2
DO IMP_CLC_I
ELSEIF nOpc == 3
LOOP //RETURN
ENDIF
RSTENV(TEL)
LOOP
ENDDO
*----------------------
PROCEDURE IMP_CLC_T // IMPRIMINDO EM TELA...
*----------------------
SET DEVICE TO PRINTER
SET PRINTER TO EXTRA1.PRN
IF PROW() = 0
@PROW()+1,00 SAY "TAXA DE JUROS MENSAL:"
@PROW(),22 SAY JUROS_M PICT "99.999"
@PROW(),28 SAY "%"
@PROW(),38 SAY "OBS.: "+OBSERVA
@PROW()+1,00 SAY "PERIODO DE..........: "+DTOC(INICIO)+" A "+DTOC(FIM)
@PROW(),60 SAY "MULTA:"
@PROW(),67 SAY MULTA PICT "99.99"
@PROW(),72 SAY "%"
@PROW()+1,00 SAY REPL("-",75)
ENDIF
@PROW()+1,5 SAY "DATA HISTORICO VALORES SALDO"
@PROW()+1,0 SAY REPL("-",75)
@PROW()+1,5 SAY INICIO
@PROW(),20 SAY "Movimento"
@PROW(),30 SAY VALOR PICT "999,999,999.99"
@PROW(),45 SAY TPMOV
@PROW(),47 SAY "*"
@PROW(),52 SAY VALOR PICT "999,999,999.99"
DATAF=DTINI1-1
ACUMVAL = VALOR + VALORJU
DO WHILE DATAF < FIM
MES = MONTH(DTINI1)
DTINI1 = DTINI1 + 1
JUR_ACUM=JUR_ACUM + JUROS_D
VALORJU = ACUMVAL*JUR_ACUM / 100
@PROW()+1,5 SAY DTINI1 - 1 // Ultimo dia do Mes...
@PROW(),20 SAY "Juros"
@PROW(),30 SAY VALORJU PICT "999,999,999.99"
@PROW(),45 SAY TPMOV
ACUMVAL = VALOR + VALORJU
@PROW(),52 SAY ACUMVAL PICT "999,999,999.99"
DATAF=DATAF+1
IF DATAF=CTOD("15/01/2015")
@PROW()+1,5 SAY DATAF
@PROW(),20 SAY "Amortizacao"
@PROW(),34 SAY 1000 PICT "999,999.99"
@PROW(),45 SAY "D"
@PROW(),47 SAY "#"
ENDIF
ENDDO
@PROW()+2,20 SAY "Saldo Atualizado:"
@PROW(),52 SAY ACUMVAL PICT "999,999,999.99"
@PROW()+1,0 SAY REPL("-",75)
@PROW()+1,5 SAY "TOTAL DE VALOR ORIGINAL:"
@PROW(),32 SAY VALOR PICT "999,999,999.99"
@PROW()+1,5 SAY "TOTAL DOS JUROS........:"
@PROW(),32 SAY ACUMVAL-VALOR PICT "999,999,999.99"
IF MULTA <> 0
TOTMUL=0
TOTMUL=ACUMVAL*MULTA/100
@PROW()+1,5 SAY "TOTAL DA MULTA.........:"
@PROW(),32 SAY TOTMUL PICT "999,999,999.99"
ENDIF
@PROW()+1,0 SAY REPL("-",75)
@PROW()+1,0 SAY "* = Lancamento de Movimento"
SETPRC(0,0)
SET DEVICE TO SCREEN
SET PRINTER TO
WIN(3,1,22,78,"DEMONSTRATIVO DE CALCULO DE JUROS","GR+/R","R*/W")
MOSTRA("EXTRA1.PRN")
ERASE EXTRA1.PRN
RETURN
*----------------------
PROCEDURE IMP_CLC_I // ENVIANDO P/ IMPRESSORA...
*----------------------
WIN(12,13,17,64,"AGUARDE!!! IMPRIMINDO...","GR+/N","N+/W")
FRAME(14,14,16,63)
arq_x ="C:\TEMP\"+LEFT(TIME(),2)+RIGHT(LEFT(TIME(),5),2)+RIGHT(TIME(),2)+"BA"
SET DEVICE TO PRINTER
SET PRINTER TO &arq_x
termom:= 53 / RECCOUNT()
porce := 100 / RECCOUNT()
control= 0
PAGINA=1
IF PROW() = 0
@PROW()+1,0 SAY "SISTEMA CALC - DEMONSTRATIVO DE CALCULO DE JUROS"
@PROW(),65 SAY DATE()
@PROW()+1,0 SAY "Desenvolvido por Erasmo Andrioli / Sorriso-MT"
@PROW(),67 SAY TIME()
@PROW()+1,00 SAY REPL("-",75)
@PROW()+1,00 SAY "TAXA DE JUROS MENSAL:"
@PROW(),22 SAY JUROS_M PICT "99.999"
@PROW(),28 SAY "%"
@PROW(),39 SAY "OBS.: "+OBSERVA
@PROW()+1,00 SAY "PERIODO DE..........: "+DTOC(INICIO)+" A "+DTOC(FIM)
@PROW(),60 SAY "MULTA:"
@PROW(),67 SAY MULTA PICT "99.99"
@PROW(),72 SAY "%"
@PROW()+1,00 SAY REPL("-",75)
ENDIF
DO WHILE .T.
DO WHILE .T.
MES = MONTH(DTINI1)
DTINI1 = DTINI1 + 1
JUR_ACUM = JUR_ACUM + JUROS_D
IF MONTH(DTINI1) <> MES
EXIT
ELSE
LOOP
ENDIF
EXIT
ENDDO
@PROW()+1,5 SAY "DATA HISTORICO VALORES SALDO"
@PROW()+1,0 SAY REPL("-",75)
@PROW()+1,5 SAY INICIO
@PROW(),20 SAY "Movimento"
@PROW(),34 SAY VALOR PICT "999,999.99"
@PROW(),45 SAY TPMOV
@PROW(),47 SAY "*"
@PROW(),52 SAY VALOR PICT "999,999,999.99"
VALORJU = VALOR * JUR_ACUM / 100
@PROW()+1,5 SAY DTINI1 - 1 // Ultimo dia do Mes...
@PROW(),20 SAY "Juros"
@PROW(),34 SAY VALORJU PICT "999,999.99"
@PROW(),45 SAY TPMOV
ACUMVAL = VALOR + VALORJU
@PROW(),52 SAY ACUMVAL PICT "999,999,999.99"
EXIT
ENDDO
JUR_ACUM=0
DATAF=DTINI1-1
DO WHILE DATAF < FIM
IF PROW() = 0
@PROW()+1,0 SAY "SISTEMA CALC - DEMONSTRATIVO DE CALCULO DE JUROS"
@PROW()+1,00 SAY REPL("-",75)
@PROW()+1,5 SAY "DATA HISTORICO VALORES SALDO"
@PROW()+1,00 SAY REPL("-",75)
ENDIF
SET DEVICE TO SCREEN
control++
@15,15+(control*termom) SAY "▒" COLOR("BG+/W")
SET DEVICE TO PRINTER
DATAF=DATAF+1
MES=MONTH(DATAF+1)
JUR_ACUM=JUR_ACUM + JUROS_D
IF MONTH(DATAF) < MES .OR. MONTH(DATAF) > MES
@PROW()+1,5 SAY DATAF
@PROW(),20 SAY "Juros"
VALORJU=ACUMVAL*JUR_ACUM/100
@PROW(),34 SAY VALORJU PICT "999,999.99"
@PROW(),45 SAY TPMOV
ACUMVAL1=ACUMVAL1+VALORJU
@PROW(),52 SAY ACUMVAL+VALORJU PICT "999,999,999.99"
JUR_ACUM=0
IF PROW() = TLINPAG .OR. PROW() > TLINPAG
@PROW()+1,0 SAY REPL("-",75)
@PROW()+1,0 SAY eu+mfone
@prow(),66 SAY "Pag.: "+ STRZERO(PAGINA,3,0)
@prow()+1,0 SAY repl("-",75)
PAGINA++
SETPRC(0,0)
ENDIF
ELSE
LOOP
ENDIF
ACUMVAL=ACUMVAL+VALORJU
LOOP
ENDDO
DO WHILE .T.
IF DAY(DATAF) = DAY(FIM)
@PROW()+1,5 SAY FIM
@PROW(),20 SAY "Juros"
VALORJU=ACUMVAL*JUR_ACUM/100
@PROW(),34 SAY VALORJU PICT "999,999.99"
@PROW(),45 SAY TPMOV
ACUMVAL1=ACUMVAL1+VALORJU
@PROW(),52 SAY ACUMVAL+VALORJU PICT "999,999,999.99"
JUR_ACUM=0
ACUMVAL=ACUMVAL+VALORJU
ENDIF
EXIT
ENDDO
IF PROW() = TLINPAG .OR. PROW() > TLINPAG
@PROW()+1,0 SAY REPL("-",75)
@PROW()+1,0 SAY eu+mfone
@prow(),66 SAY "Pag.: "+ STRZERO(PAGINA,3,0)
@prow()+1,0 SAY repl("-",75)
PAGINA++
SETPRC(0,0)
ENDIF
@PROW()+2,20 SAY "Saldo Atualizado:"
@PROW(),52 SAY ACUMVAL PICT "999,999,999.99"
@PROW()+1,0 SAY REPL("-",75)
@PROW()+1,5 SAY "TOTAL DE VALOR ORIGINAL:"
@PROW(),32 SAY VALOR PICT "999,999,999.99"
@PROW()+1,5 SAY "TOTAL DOS JUROS........:"
@PROW(),32 SAY ACUMVAL-VALOR PICT "999,999,999.99"
IF MULTA <> 0
TOTMUL=0
TOTMUL=ACUMVAL*MULTA/100
@PROW()+1,5 SAY "TOTAL DA MULTA.........:"
@PROW(),32 SAY TOTMUL PICT "999,999,999.99"
ENDIF
@PROW()+1,0 SAY REPL("-",75)
@PROW()+1,0 SAY "* = Lancamento de Movimento"
DO WHILE PROW() < TLINPAG - 1
@PROW()+1,0 SAY ""
ENDDO
@PROW()+1,0 SAY REPL("-",75)
@PROW()+1,0 SAY eu+mfone
@prow(),66 SAY "Pag.: "+ STRZERO(PAGINA,3,0)
@prow()+1,0 SAY repl("-",75)
FIMIMP()
RETURN
*************
FUNC CHAMAIMP
*************
LOCAL aINCCLI
Private nPrn := 1
Private aPrn := GetPrinters() // Detecta impressoras instaladas
PARA COP // S = IMPRESSAO EM 136 COL. N = IMPRESSAO EM 79COL.
TAM = "N"
If Empty(aPrn)
wvt_messagebox("Nao foi encontrada nenhuma impressora instalada, Favor verificar !!!","ATENCAO !!!",48)
Return
else
aINCCLI:= nbox(10,39,24,68,"n+/b",.F.)
@ 11,43 say "Selecione a impressora" colo "w+/b"
@ 23,50 say "ESC - VOLTA" colo "n+/b"
SETCOLOR( "w/b,n/gr*,,,n*/w" )
nPrn:= ACHOICE(13,40,22,67,aPrn,.T.,,nPrn) // LISTA DE IMPRESSORAS
EndIf
if lastkey() = K_ESC
RstEnv(aINCCLI)
RETURN NIL
endif
IF TAM="S"
IF !EMPTY(nPrn)
Imprime(ARQ_X+".PRN",136,aPrn[nPrn])
ENDIF
ELSE
IF !EMPTY(nPrn)
Imprime(ARQ_X+".PRN",80,aPrn[nPrn])
ENDIF
ENDIF
RstEnv(aINCCLI)
RETURN NIL
****************************
STATIC FUNC Imprime( cArq, tamrel ,cPrinter )
****************************
local cTexto, nLinhas, nA, cLinha
LOCAL oPrinter := Win32prn():New(cPrinter)
cText := memoread ( cArq )
oPrinter:Landscape := .F.
oPrinter:FormType := 9 // Usar 9 para A4
oPrinter:SetPrintQuality(-1) // qualidade da impressao
oPrinter:Copies := 1
IF !oPrinter:Create()
wvt_messagebox("Nao foi encontrada nenhuma impressora instalada, Favor verificar !!!","ATENCAO !!!",48)
return NIL
ELSEIF !oPrinter:StartDoc("CLC - Calculo") // MENSAGEM NO SPOOL
wvt_messagebox("Problema ao Imprimir....Favor Verificar a Impressora "+ aPrn[nPrn] ,"ATENCAO !!!",48)
return NIL
endif
FOR TT=1 TO 2
oPrinter:newline()
NEXT
IF tamrel > 80
oPrinter:setfont('Courier New',13,{3,-50},0,.F.,.F.)
nLines2 := 150
else
oPrinter:setfont('Courier New',,12,,,,255)
nLines2 := 85
endif
oPrinter:Bold(0) // normal
nLines := mlcount( cText, nLines2 )
nConta := 0
for nA := 1 to nLines
cLine := memoline ( cText, nLines2, nA, 1, .F. )
oPrinter:TextOut ( cLine, .T. )
oPrinter:Bold(0) // Normal
IF nConta = tlinpag+3 // QUANDO CHEGAR NO FINAL DA PAGINA
oPrinter:NewPage()
FOR TT = 1 TO 3
oPrinter:newline()
NEXT
nConta=0
endif
nConta=nConta+1
next
oPrinter:EndDoc()
oPrinter:Destroy()
RETURN NIL
*----------------
FUNC FIMIMP()
*----------------
SETPRC(0,0)
SET DEVICE TO SCREEN
SET PRINTER TO
* Salvar o caminho...
csDir:=CURDRIVE()+":\"+CURDIR()
CHAMAIMP() // somente para Xharbour
DIRCHANGE(csDir)
DELETEFILE(arq_x+".PRN")
RETURN