Subversion Repositories public

Rev

Rev 53 | Rev 64 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 53 Rev 60
Line 24... Line 24...
24
#include <klocale.h>
24
#include <klocale.h>
25
#include <kmessagebox.h>
25
#include <kmessagebox.h>
26
#include <qfile.h>
26
#include <qfile.h>
27
#include <qstring.h>
27
#include <qstring.h>
28
#include <qdir.h>
28
#include <qdir.h>
-
 
29
#include <qdatetime.h>
29
 
30
 
30
#include <stdio.h>
31
#include <stdio.h>
31
#include <math.h>
32
#include <math.h>
32
#include <string.h>
33
#include <string.h>
33
#include <sys/stat.h>
34
#include <sys/stat.h>
34
#include <iostream.h>
-
 
35
 
35
 
36
#include "tilgplan.h"
36
#include "tilgplan.h"
37
#include "helper.h"
37
#include "helper.h"
38
 
38
 
39
int MonLeiste[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
39
int MonLeiste[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
40
		 /*  Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez */;
40
		 /*  Jan Feb Mär Apr Mai Jun Jul Aug Sep Okt Nov Dez */;
41
 
41
 
42
// Klassendefinition: DLG_ZIAEND ------------------------------------------
-
 
43
 
-
 
44
// Wenn dieses Modul mit dem Flag "_ZINSAENDERUNG" compiliert wurde, kann
42
// Wenn dieses Modul mit dem Flag "_ZINSAENDERUNG" compiliert wurde, kann
45
// eine Zinssatzänderung definiert werden. Dazu ist ein eigenes Dialog-
43
// eine Zinssatzänderung definiert werden. Dazu ist ein eigenes Dialog-
46
// fenster notwendig. Die Klasse dafür ist hier definiert.
44
// fenster notwendig.
47
// Das Dialogfenster kann nur dann aufgerufen werden, wenn das Mutter-
-
 
48
// modul den Zeiger auf sich selbst übergeben hat (SetParent).
-
 
49
 
-
 
50
 
45
 
51
// Funktionen -------------------------------------------------------------
46
// Funktionen -------------------------------------------------------------
52
 
47
 
53
// Hauptprogramm
48
// Hauptprogramm
54
// Druch aufrufen dieser Routine wird ein Tilgungsplan auf Grund der
49
// Durch aufrufen dieser Routine wird ein Tilgungsplan auf Grund der
55
// übergebenen Parameter errechnet und in einer Datei abgelegt.
50
// übergebenen Parameter errechnet und in einer Datei abgelegt.
56
// Diese kann dann weiter bearbeitet werden.
51
// Diese kann dann weiter bearbeitet werden.
-
 
52
//
-
 
53
// Die übergebenen Parameter enthalten auch Steuerkennzeichen. So kann auch
-
 
54
// der Effektivzinssatz berechnet werden. Dazu muss der Kredit zunächst
-
 
55
// normal durchgerechnet werden. Anschliessen wird mit der errechneten Rate,
-
 
56
// jedoch ohne Spesen, Gebühren etc. der Plan für ein Jahr noch einmal
-
 
57
// gerechnet. Die so ermittelten Zinsen ergeben den Effektivzinssatz.
-
 
58
//
57
 
59
 
58
int TRech::tilgpl ()
60
int TRech::tilgpl ()
59
{
61
{
60
int day, mon, year, akt_mon, akt_year, i, j;
62
int day, mon, year, akt_mon, akt_year, i, j;
61
 
63
 
Line 83... Line 85...
83
	// Auszahlungsdatum auf Gültigkeit überprüfen
85
	// Auszahlungsdatum auf Gültigkeit überprüfen
84
 
86
 
85
	if (TpPars->ragab > TpPars->dvon)
87
	if (TpPars->ragab > TpPars->dvon)
86
	   return 3;			// Auszahlungsdatum > 1. Einschränkung
88
	   return 3;			// Auszahlungsdatum > 1. Einschränkung
87
 
89
 
-
 
90
	if (TpPars->effekt && TpPars->rate <= 0.0)
-
 
91
	   return 29;			// Keine Rate, kein Effektivzins!
-
 
92
 
88
	// Abschlußrhythmus überprüfen
93
	// Abschlußrhythmus überprüfen
89
 
94
 
-
 
95
	if (TpPars->effekt && TpPars->abschlry != 12 && TpPars->abschlry != 52)
-
 
96
	   return 26;			// Für Effektivzinssatzberechnung nur jährlicher Abschluss erlaubt
-
 
97
 
90
	if (TpPars->abschlry != 1 && TpPars->abschlry != 3 && TpPars->abschlry != 6 &&
98
	if (TpPars->abschlry != 1 && TpPars->abschlry != 3 && TpPars->abschlry != 6 &&
91
	    TpPars->abschlry != 12 && TpPars->abschlry != 41 && TpPars->abschlry != 43 &&
99
	    TpPars->abschlry != 12 && TpPars->abschlry != 41 && TpPars->abschlry != 43 &&
92
	    TpPars->abschlry != 46 && TpPars->abschlry != 47 && TpPars->abschlry != 48 &&
100
	    TpPars->abschlry != 46 && TpPars->abschlry != 47 && TpPars->abschlry != 48 &&
93
	    TpPars->abschlry != 52)
101
	    TpPars->abschlry != 52)
94
	   return 11;			// ungültiger Abschlußrythmus
102
	   return 11;			// ungültiger Abschlußrythmus
Line 225... Line 233...
225
	else if (TpPars->verzart == 4)
233
	else if (TpPars->verzart == 4)
226
	   verzinsung = 3;		// Quasiantizipativ
234
	   verzinsung = 3;		// Quasiantizipativ
227
	else
235
	else
228
	   return 12;			// ungültige Verzinsungsart
236
	   return 12;			// ungültige Verzinsungsart
229
 
237
 
-
 
238
	if (TpPars->effekt && (verzinsung == 1 || verzinsung == 3))
-
 
239
	   return 28;			// Effektivzinss. nur bei dekursiv möglich
-
 
240
 
230
	// Verzinsungsart mit Abschlußrhythmus gegenprüfen
241
	// Verzinsungsart mit Abschlußrhythmus gegenprüfen
231
 
242
 
232
	if (TpPars->verzart == 1 && TpPars->abschlry != 43 &&
243
	if (TpPars->verzart == 1 && TpPars->abschlry != 43 &&
233
		TpPars->abschlry != 46 && TpPars->abschlry != 52)
244
		TpPars->abschlry != 46 && TpPars->abschlry != 52)
234
	   return 9;			// Verzinsung in Bezug auf Abschlußrhythmus ungültig
245
	   return 9;			// Verzinsung in Bezug auf Abschlußrhythmus ungültig
Line 341... Line 352...
341
#endif
352
#endif
342
 
353
 
343
int TRech::DekursivTable ()
354
int TRech::DekursivTable ()
344
{
355
{
345
long tage;
356
long tage;
346
int vday, day, mon, year, akt_day, akt_mon;
357
int vday, day, mon, year, akt_day, akt_mon, iday, imon, iyear;
347
int at, am, aj;
358
int at, am, aj;
348
BOOL abschluss, r_yet;
359
BOOL abschluss, r_yet;
349
long lab;
360
long lab;
-
 
361
QDate dat1, dat2;
350
 
362
 
351
	// Wurde eine fixe Rate vorgegeben und ein Enfälligkeitsdatum
363
	// Wurde eine fixe Rate vorgegeben und ein Enfälligkeitsdatum
352
	// angegeben, muß die letzte Einschränkung gleich dem
364
	// angegeben, muß die letzte Einschränkung gleich dem
353
	// Endfälligkeitsdatum sein.
365
	// Endfälligkeitsdatum sein.
354
 
366
 
Line 359... Line 371...
359
	// und keine Endfälligkeit, werden 100 Jahre im voraus gesetzt.
371
	// und keine Endfälligkeit, werden 100 Jahre im voraus gesetzt.
360
	// Das ist die maximale Laufzeit.
372
	// Das ist die maximale Laufzeit.
361
 
373
 
362
	if (TpPars->dbis == 0L)
374
	if (TpPars->dbis == 0L)
363
	{
375
	{
-
 
376
	   QDate dt;
364
	   tage = (99L * 365L) + (99L / 4L);	// 99 Jahre ist maximale Laufzeit
377
	   date_int(&day, &mon, &year, TpPars->ragab);
-
 
378
	   dt.setYMD(year, mon, day);
-
 
379
	   dt = dt.addYears(99);
365
	   TpPars->dbis = DayToDate (tage + DateToDay (TpPars->ragab));
380
	   TpPars->dbis = dt.year() * 10000L + dt.month() * 100L + dt.day();
366
	}
381
	}
367
 
382
 
368
	// Wenn auf Ultimo gerechnet wird, muß der Tag der letzten
383
	// Wenn auf Ultimo gerechnet wird, muß der Tag der letzten
369
	// Einschränkung auf den letzten des Monats gesetzt werden.
384
	// Einschränkung auf den letzten des Monats gesetzt werden.
370
	// Einzige Ausnahme: Verzinsungsart 7. Hier muß der Tag auf den
385
	// Einzige Ausnahme: Verzinsungsart 7. Hier muß der Tag auf den
Line 383... Line 398...
383
	}
398
	}
384
 
399
 
385
	// überprüfen der Laufzeit auf Grund der eingegebenen Daten
400
	// überprüfen der Laufzeit auf Grund der eingegebenen Daten
386
 
401
 
387
	if (TpPars->endfaell > 0L)
402
	if (TpPars->endfaell > 0L)
-
 
403
	{
-
 
404
	   QDate dt1, dt2;
-
 
405
	   date_int(&day, &mon, &year, TpPars->endfaell);
-
 
406
	   dt1.setYMD(year, mon, day);
-
 
407
	   date_int(&day, &mon, &year, TpPars->ragab);
-
 
408
	   dt2.setYMD(year, mon, day);
-
 
409
	   tage = dt2.daysTo(dt1);
388
	   tage = DateToDay (TpPars->endfaell) - DateToDay (TpPars->ragab);
410
//	   tage = DateToDay (TpPars->endfaell) - DateToDay (TpPars->ragab);
-
 
411
	}
389
	else
412
	else
-
 
413
	{
-
 
414
	   QDate dt1, dt2;
-
 
415
	   date_int(&day, &mon, &year, TpPars->dbis);
-
 
416
	   dt1.setYMD(year, mon, day);
-
 
417
	   date_int(&day, &mon, &year, TpPars->ragab);
-
 
418
	   dt2.setYMD(year, mon, day);
-
 
419
	   tage = dt2.daysTo(dt1);
390
	   tage = DateToDay (TpPars->dbis) - DateToDay (TpPars->ragab);
420
//	   tage = DateToDay (TpPars->dbis) - DateToDay (TpPars->ragab);
-
 
421
	}
391
 
422
 
392
	if (tage > 36524L)
423
	if (tage > 36524L)
393
	   return 14;			// Laufzeit über 100 Jahre
424
	   return 14;			// Laufzeit über 100 Jahre
394
 
425
 
395
	if (TpPars->abschl == 0L)
426
	if (TpPars->abschl == 0L)
Line 470... Line 501...
470
	   {
501
	   {
471
	      akt_mon = 0;
502
	      akt_mon = 0;
472
	      year++;
503
	      year++;
473
	   }
504
	   }
474
 
505
 
-
 
506
	   date_int(&iday, &imon, &iyear, r_dat);
-
 
507
	   dat1.setYMD(iyear, imon, iday);
-
 
508
	   date_int(&iday, &imon, &iyear, TpPars->ragab);
-
 
509
	   dat2.setYMD(iyear, imon, iday);
-
 
510
	   pos = dat2.daysTo(dat1);
475
	   pos = DateToDay (r_dat) - DateToDay (TpPars->ragab);
511
//	   pos = DateToDay (r_dat) - DateToDay (TpPars->ragab), r_dat, TpPars->ragab);
476
	}
512
	}
477
 
513
 
478
	if (r_ind >= 1200 || a_ind >= 1200)
514
	if (TpPars->effekt && (r_ind >= 1200 || a_ind >= 1200))
479
	   return 20;			// Rechenfehler
515
	   return 20;			// Rechenfehler
480
 
516
 
481
	if (lab != a_dat)
517
	if (lab != a_dat)
482
	{
518
	{
483
	   ab_dat[a_ind] = TpPars->dbis;
519
	   ab_dat[a_ind] = TpPars->dbis;
Line 874... Line 910...
874
{
910
{
875
QString hdir = QDir::homeDirPath ();
911
QString hdir = QDir::homeDirPath ();
876
QFile tmpFile, zaf;
912
QFile tmpFile, zaf;
877
int fd, index, i;
913
int fd, index, i;
878
int real_rat, Abzug;
914
int real_rat, Abzug;
879
long tg;
915
long tg, effend;
880
double zins, tilg, zi1, zi2, kzi;
916
double zins, tilg, zi1, zi2, kzi;
881
long offset;
917
long offset;
882
BOOL stop;
918
BOOL stop;
883
#ifdef _ZINSAENDERUNG
919
#ifdef _ZINSAENDERUNG
884
   int fdZins;
920
   int fdZins;
Line 890... Line 926...
890
 
926
 
891
	/* Planerstellung */
927
	/* Planerstellung */
892
	hdir.append("/.date_tbl.dat");
928
	hdir.append("/.date_tbl.dat");
893
	tmpFile.setName(hdir);
929
	tmpFile.setName(hdir);
894
 
930
 
895
	if (tmpFile.open(IO_ReadWrite | IO_Truncate) == FALSE)
931
	if (!TpPars->effekt)
896
	{
932
	{
-
 
933
	   if (tmpFile.open(IO_ReadWrite | IO_Truncate) == FALSE)
-
 
934
	   {
897
	   KMessageBox::error(0, QString("Could not open file for reading: %1").arg(tmpFile.errorString()));
935
	      KMessageBox::error(0, QString("Could not open file for reading: %1").arg(tmpFile.errorString()));
-
 
936
	      return 1;
-
 
937
	   }
-
 
938
	}
-
 
939
	else
-
 
940
	{
-
 
941
	   if (tmpFile.open(IO_ReadOnly) == FALSE)
-
 
942
	   {
-
 
943
	      KMessageBox::error(0, QString("Could not open file for reading: %1").arg(tmpFile.errorString()));
898
	   return 1;
944
	      return 1;
-
 
945
	   }
899
	}
946
	}
900
 
947
 
901
	fd = tmpFile.handle();
948
	fd = tmpFile.handle();
902
#ifdef _ZINSAENDERUNG
949
#ifdef _ZINSAENDERUNG
903
	// Wenn eine Zinssatzänderung gewünscht wurde, muß die Änderungs-
950
	// Wenn eine Zinssatzänderung gewünscht wurde, muß die Änderungs-
Line 938... Line 985...
938
 
985
 
939
	offset = 0L;
986
	offset = 0L;
940
	index = max_abs + max_rat;
987
	index = max_abs + max_rat;
941
 
988
 
942
	/* Ausgangsdaten schreiben */
989
	/* Ausgangsdaten schreiben */
-
 
990
	if (!TpPars->effekt)
-
 
991
	{
943
	write (fd, TpPars, sizeof (TPPARS));
992
	   write (fd, TpPars, sizeof (TPPARS));
944
	offset += (long)sizeof (TPPARS);
993
	   offset += (long)sizeof (TPPARS);
-
 
994
	}
945
 
995
 
946
	/* Initialisierung der Schleife */
996
	/* Initialisierung der Schleife */
947
 
997
 
948
	a_ind = r_ind = 0;
998
	a_ind = r_ind = 0;
949
	kap = TpPars->rahmen;
999
	kap = TpPars->rahmen;
Line 954... Line 1004...
954
	TpPars->abschl = ab_dat[0];
1004
	TpPars->abschl = ab_dat[0];
955
	stop = FALSE;			// TRUE wenn Laufzeitende bei Ratenvorgabe
1005
	stop = FALSE;			// TRUE wenn Laufzeitende bei Ratenvorgabe
956
	real_rat = max_rat;
1006
	real_rat = max_rat;
957
        Abzug = 0;			// wird nur bei Ratenvorgabe verwendet
1007
        Abzug = 0;			// wird nur bei Ratenvorgabe verwendet
958
 
1008
 
-
 
1009
	if (TpPars->effekt)
-
 
1010
	   effend = TpPars->dvon + 10000L;	// 1 Jahr für Effektivzinsberechnung
-
 
1011
	else
-
 
1012
	   effend = 0L;
-
 
1013
 
959
	/* Schleife zur Berechnung der Gesamtbelastung (Dekursiv) */
1014
	/* Schleife zur Berechnung der Gesamtbelastung (Dekursiv) */
960
	
1015
	
961
	for (i = 0; i < index; i++)
1016
	for (i = 0; i < index; i++)
962
	{
1017
	{
963
#ifdef _ZINSAENDERUNG
1018
#ifdef _ZINSAENDERUNG
Line 1138... Line 1193...
1138
	         real_rat--;
1193
	         real_rat--;
1139
 
1194
 
1140
	      continue;
1195
	      continue;
1141
	   }
1196
	   }
1142
 
1197
 
-
 
1198
	   if (!TpPars->effekt)
-
 
1199
	   {
1143
	   write (fd, &DTable, sizeof (DTABLE));
1200
	      write (fd, &DTable, sizeof (DTABLE));
1144
	   offset += (long)sizeof (DTABLE);
1201
	      offset += (long)sizeof (DTABLE);
-
 
1202
	   }
-
 
1203
	   else if (DTable.datum > effend)
-
 
1204
	      break;
1145
	} /* end for */
1205
	} /* end for */
1146
 
1206
 
1147
	if (TpPars->fixrate == TRUE)
1207
	if (TpPars->fixrate == TRUE)
1148
	   TpPars->dbis = rat_dat[r_ind-1];
1208
	   TpPars->dbis = rat_dat[r_ind-1];
1149
 
1209
 
Line 1173... Line 1233...
1173
	}
1233
	}
1174
	else
1234
	else
1175
	   TpPars->anzuschuss = TpPars->antotal = 0.0;
1235
	   TpPars->anzuschuss = TpPars->antotal = 0.0;
1176
 
1236
 
1177
	DTable.rkapi = TpPars->lrate;
1237
	DTable.rkapi = TpPars->lrate;
-
 
1238
 
-
 
1239
	if (!TpPars->effekt)
1178
	write (fd, &DTable, sizeof (DTABLE));
1240
	   write (fd, &DTable, sizeof (DTABLE));
1179
#ifdef _ZINSAENDERUNG
1241
#ifdef _ZINSAENDERUNG
1180
	if (TpPars->gewicht > 0.0)
1242
	if (TpPars->gewicht > 0.0)
1181
	   TpPars->zssoll = TpPars->gewicht;
1243
	   TpPars->zssoll = TpPars->gewicht;
1182
 
1244
 
1183
	zaf.close();
1245
	zaf.close();
1184
#endif
1246
#endif
-
 
1247
	if (!TpPars->effekt)
-
 
1248
	{
1185
	tmpFile.flush();
1249
	   tmpFile.flush();
1186
	lseek (fd, 0L, 0);
1250
	   lseek (fd, 0L, 0);
1187
	write (fd, TpPars, sizeof (TPPARS));
1251
	   write (fd, TpPars, sizeof (TPPARS));
-
 
1252
	}
-
 
1253
 
1188
	tmpFile.close ();
1254
	tmpFile.close ();
1189
	return 0;
1255
	return 0;
1190
}
1256
}
1191
 
1257
 
1192
#ifdef _ZINSAENDERUNG
1258
#ifdef _ZINSAENDERUNG