Subversion Repositories public

Rev

Rev 60 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
53 andreas 1
/***************************************************************************
2
 *   Copyright (C) 2007 by Andreas Theofilu                                *
3
 *   andreas@TheoSys.at                                                    *
4
 *                                                                         *
5
 *   This program is free software; you can redistribute it and/or modify  *
6
 *   it under the terms of the GNU General Public License as published by  *
7
 *   the Free Software Foundation version 3 of the License.                *
8
 *                                                                         *
9
 *   This program is distributed in the hope that it will be useful,       *
10
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
11
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
12
 *   GNU General Public License for more details.                          *
13
 *                                                                         *
14
 *   You should have received a copy of the GNU General Public License     *
15
 *   along with this program; if not, write to the                         *
16
 *   Free Software Foundation, Inc.,                                       *
17
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
18
 ***************************************************************************/
19
 
20
// TILGRECH.CPP
21
// Modul zur Berechnung eines Tilgungsplans.
22
// Die errechneten Daten werden in einer Datei zwischengespeichert und
23
// können so auf jede beliebige Art verwendet werden.
24
#include <klocale.h>
25
#include <kmessagebox.h>
26
#include <qfile.h>
27
#include <qstring.h>
28
#include <qdir.h>
29
 
30
#include <stdio.h>
31
#include <math.h>
32
#include <string.h>
33
#include <sys/stat.h>
34
#include <iostream.h>
35
 
36
#include "tilgplan.h"
37
#include "helper.h"
38
 
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 */;
41
 
42
// Klassendefinition: DLG_ZIAEND ------------------------------------------
43
 
44
// Wenn dieses Modul mit dem Flag "_ZINSAENDERUNG" compiliert wurde, kann
45
// eine Zinssatzänderung definiert werden. Dazu ist ein eigenes Dialog-
46
// fenster notwendig. Die Klasse dafür ist hier definiert.
47
// Das Dialogfenster kann nur dann aufgerufen werden, wenn das Mutter-
48
// modul den Zeiger auf sich selbst übergeben hat (SetParent).
49
 
50
 
51
// Funktionen -------------------------------------------------------------
52
 
53
// Hauptprogramm
54
// Druch aufrufen dieser Routine wird ein Tilgungsplan auf Grund der
55
// übergebenen Parameter errechnet und in einer Datei abgelegt.
56
// Diese kann dann weiter bearbeitet werden.
57
 
58
int TRech::tilgpl ()
59
{
60
int day, mon, year, akt_mon, akt_year, i, j;
61
 
62
	// initialisieren
63
	init_global_vars ();
64
 
65
	if (TpPars->dvon == 0L)
66
	   return 2;			// 1. Einschränkung nicht vorhanden
67
 
68
        // Datum der ersten Einschränkung korrigieren falls notwendig
69
	date_int (&day, &mon, &year, TpPars->dvon);
70
 
71
	if (TpPars->ultimo)		// Wenn Ultimo Datum korrigieren
72
	{
73
	   set_feb (year);
74
	   day = MonLeiste[mon-1];
75
	   TpPars->dvon = make_date (day, mon, year);
76
	}
77
 
78
	// Auszahlungsdatum überprüfen
79
 
80
	if (TpPars->ragab == 0L)
81
	   return 8;			// Auszahlungsdatum nicht vorhanden
82
 
83
	// Auszahlungsdatum auf Gültigkeit überprüfen
84
 
85
	if (TpPars->ragab > TpPars->dvon)
86
	   return 3;			// Auszahlungsdatum > 1. Einschränkung
87
 
88
	// Abschlußrhythmus überprüfen
89
 
90
	if (TpPars->abschlry != 1 && TpPars->abschlry != 3 && TpPars->abschlry != 6 &&
91
	    TpPars->abschlry != 12 && TpPars->abschlry != 41 && TpPars->abschlry != 43 &&
92
	    TpPars->abschlry != 46 && TpPars->abschlry != 47 && TpPars->abschlry != 48 &&
93
	    TpPars->abschlry != 52)
94
	   return 11;			// ungültiger Abschlußrythmus
95
 
96
	if (TpPars->abschlry > 40)	// Abschlüsse auf Ultimo rechnen?
97
	   TpPars->abschl = 0L;		// Ja, Abschlußdatum initialisieren
98
 
99
	// Abschlußdatum überprüfen
100
 
101
	if (TpPars->abschl > 0L && TpPars->abschl < TpPars->ragab)
102
	   return 4;			// Abschlußdatum < Auszahlungsdatum
103
 
104
	if (TpPars->abschl == 0L && TpPars->abschlry < 41)
105
	   return 10;			// Abschlußdatum muß angegeben werden
106
 
107
	// Abschlußplan erstellen;
108
 
109
	for (i = 0; i < 12; i++)
110
	   AbschlPlan[i] = 0;
111
 
112
	switch (TpPars->abschlry)
113
	{
114
	   case  1:
115
           case 41: for (i = 0; i < 12; i++)
116
		       AbschlPlan[i] = 1;
117
	   break;
118
 
119
	   case  3:
120
           case 43: AbschlPlan[2] = 1;
121
		    AbschlPlan[5] = 1;
122
		    AbschlPlan[8] = 1;
123
		    AbschlPlan[11] = 1;
124
	   break;
125
 
126
	   case  6:
127
           case 46: AbschlPlan[5] = 1;
128
		    AbschlPlan[11] = 1;
129
	   break;
130
 
131
	   case 12:
132
	   case 52: AbschlPlan[11] = 1;
133
	   break;
134
 
135
	   case 47: AbschlPlan[2] = 1;
136
		    AbschlPlan[8] = 1;
137
	   break;
138
 
139
	   case 48: AbschlPlan[1] = 1;
140
		    AbschlPlan[7] = 1;
141
	   break;
142
	}
143
 
144
	// Ratenvorgabe?
145
 
146
	if (TpPars->fixrate)
147
	{
148
	   if (TpPars->rate < 0.0)
149
	      return 16;		// Ratenvorgabe negativ
150
	   else if (TpPars->rate == 0.0)
151
	      return 15;		// keine Ratenvorgabe
152
 
153
	   // Datum der letzten Einschränkung initialisieren
154
	   TpPars->dbis = 0.0;
155
        }
156
	else				// Rate initialisieren
157
	   TpPars->rate = 0.0;
158
 
159
	// Datum der letzten Einschränkung überprüfen
160
 
161
	if (!TpPars->fixrate)		// Nur wenn keine Ratenvorgabe
162
	{
163
	   date_int (&i, &akt_mon, &akt_year, TpPars->dvon);
164
	   date_int (&day, &akt_mon, &akt_year, TpPars->dbis);
165
	   set_feb (akt_year);
166
 
167
	   // Da das Datum der letzten Einschränkung nur aus Monat und
168
	   // Jahr besteht, muß noch der Tag hinzugefügt werden, um
169
	   // damit rechnen zu können.
170
 
171
	   if (i > MonLeiste[akt_mon-1])
172
	      i = MonLeiste[akt_mon-1];
173
 
174
	   TpPars->dbis = make_date (i, akt_mon, akt_year);
175
 
176
	   // Datum mit 1.Einschränkung gegenprüfen
177
 
178
	   if (TpPars->dvon > TpPars->dbis)
179
              return 5;			// 1. Einschränkung > letzte Einschränkung
180
 
181
	   // letzte Einschränkung mit Ratenleiste gegenprüfen
182
 
183
	   if (TpPars->raplan[akt_mon-1] <= 0)
184
              return 19;		// letzte Einschränkung oder Ratenleiste ungültig
185
	}
186
 
187
	// Endfälligkeitsdatum überprüfen (falls vorhanden)
188
 
189
	if (TpPars->endfaell > 0L && TpPars->dbis > TpPars->endfaell)
190
	   return 6;			// letzte Einschränkung > Endfälligkeit
191
 
192
	// Ratenleiste berprüfen
193
 
194
	i = j = 0;
195
 
196
	while (i < 12)
197
	{
198
	   if (TpPars->raplan[i] > 0)
199
	   {
200
	      j = 1;
201
	      break;
202
	   }
203
 
204
	   i++;
205
	}
206
 
207
	if (!j)
208
	   return 7;			// Es wurde keine Rate definiert
209
 
210
	// 1. Einschränkung mit Ratenleiste gegenprüfen
211
 
212
	date_int (&day, &mon, &year, TpPars->dvon);
213
 
214
	if (TpPars->raplan[mon-1] <= 0)
215
	   return 18;			// 1. Einschränkung oder Ratenleiste ungültig
216
 
217
	// Verzinsungsart überprüfen
218
 
219
	if (TpPars->verzart == 0 || TpPars->verzart == 2 || TpPars->verzart == 8)
220
	   verzinsung = 0;		// Permanent dekursiv
221
	else if (TpPars->verzart == 3)
222
	   verzinsung = 1;		// Antizipativ
223
	else if (TpPars->verzart == 7)
224
	   verzinsung = 2;		// Dekursiv
225
	else if (TpPars->verzart == 4)
226
	   verzinsung = 3;		// Quasiantizipativ
227
	else
228
	   return 12;			// ungültige Verzinsungsart
229
 
230
	// Verzinsungsart mit Abschlußrhythmus gegenprüfen
231
 
232
	if (TpPars->verzart == 1 && TpPars->abschlry != 43 &&
233
		TpPars->abschlry != 46 && TpPars->abschlry != 52)
234
	   return 9;			// Verzinsung in Bezug auf Abschlußrhythmus ungültig
235
 
236
#ifdef _ZINSAENDERUNG
237
	// Zinssatzänderung mit Verzinsungsart gegenprüfen
238
 
239
	if (TpPars->ziaend && (verzinsung == 1 || verzinsung == 3))
240
	   return 23;			// Zinssatzänderung unter Antizipativ nicht möglich
241
#endif
242
	// Ratenart überprüfen
243
 
244
	if (TpPars->ratenart < 0 || TpPars->ratenart > 3)
245
	   return 13;			// ungültige Ratenart
246
 
247
	if (TpPars->ratenart == 0)
248
	   reh = 1;			// Kapitalraten
249
	else if (TpPars->ratenart == 1)
250
	   reh = 2;			// Pauschalraten
251
	else
252
	   reh = 0;			// Pauschalraten
253
 
254
	// Divisor setzen
255
 
256
	if (TpPars->tageb == 1 || TpPars->tageb == 2 || TpPars->tageb == 7 ||
257
	    TpPars->tageb == 8)
258
	   divisor = 36000.0;
259
	else
260
	   divisor = 36500.0;
261
 
262
	// Erstellen einer Datumstabelle
263
 
264
	if (verzinsung == 0 || verzinsung == 2)	// Dekursiv?
265
	{
266
	   if ((i = DekursivTable ()) != 0)
267
	      return i;
268
	}
269
	else					// Antizipativ
270
	{
271
	   if ((i = AntizipativTable ()) != 0)
272
	      return i;
273
	}
274
 
275
	// Berechnung der Rate
276
 
277
	a_ind = r_ind = 0;
278
 
279
	if (TpPars->fixrate == TRUE)	// Besteht eine Ratenvorgabe?
280
	{
281
	   TpPars->ergrate = rat = TpPars->rate;
282
	   return Ratenplan ();
283
	}
284
 
285
	// Erstellen eines Ratenplans
286
 
287
        GetRate (TpPars->rahmen, TpPars->ragab, TpPars->dvon);
288
 
289
	TpPars->ergrate = rat;
290
	return Ratenplan ();
291
}
292
 
293
#ifdef _ZINSAENDERUNG
294
 
295
int TRech::GetZiaend ()
296
{
297
QString hdir = QDir::homeDirPath ();
298
QFile tmpFile;
299
int fd;
300
struct stat sbuf;
301
ZIAEND Zi;
302
 
303
	// Plausibilitätsprüfung der eingebenen Daten
304
	hdir.append("/.zinsaend.dat");
305
	tmpFile.setName(hdir);
306
 
307
	if (tmpFile.open(IO_ReadWrite) == FALSE)
308
	{
309
	   KMessageBox::error(0, QString("Could not open file for reading: %1").arg(tmpFile.errorString()));
310
	   return 23;
311
	}
312
 
313
	fd = tmpFile.handle();
314
	fstat (fd, &sbuf);
315
 
316
	if (sbuf.st_size == 0L)
317
	{
318
	   tmpFile.close ();
319
	   return 0;
320
	}
321
 
322
	while (read (fd, &Zi, sizeof(ZIAEND)) == sizeof(ZIAEND))
323
	{
324
	   if (Zi.Datum <= TpPars->dvon)
325
	   {
326
	      tmpFile.close ();
327
	      return 24;
328
	   }
329
 
330
	   if (Zi.Datum >= TpPars->dbis)
331
	   {
332
	      tmpFile.close ();
333
	      return 25;
334
	   }
335
	}
336
 
337
	tmpFile.close ();
338
	return 0;
339
}
340
 
341
#endif
342
 
343
int TRech::DekursivTable ()
344
{
345
long tage;
346
int vday, day, mon, year, akt_day, akt_mon;
347
int at, am, aj;
348
BOOL abschluss, r_yet;
349
long lab;
350
 
351
	// Wurde eine fixe Rate vorgegeben und ein Enfälligkeitsdatum
352
	// angegeben, muß die letzte Einschränkung gleich dem
353
	// Endfälligkeitsdatum sein.
354
 
355
	if (TpPars->fixrate && TpPars->endfaell > 0L)
356
	   TpPars->dbis = TpPars->endfaell;
357
 
358
	// Wurde eine fixe Rate vorgegeben und keine letzte Einschränkung
359
	// und keine Endfälligkeit, werden 100 Jahre im voraus gesetzt.
360
	// Das ist die maximale Laufzeit.
361
 
362
	if (TpPars->dbis == 0L)
363
	{
364
	   tage = (99L * 365L) + (99L / 4L);	// 99 Jahre ist maximale Laufzeit
365
	   TpPars->dbis = DayToDate (tage + DateToDay (TpPars->ragab));
366
	}
367
 
368
	// Wenn auf Ultimo gerechnet wird, muß der Tag der letzten
369
	// Einschränkung auf den letzten des Monats gesetzt werden.
370
	// Einzige Ausnahme: Verzinsungsart 7. Hier muß der Tag auf den
371
	// 1. eines Monats gesetzt werden.
372
 
373
	if (TpPars->ultimo)
374
	{
375
	   date_int (&day, &mon, &year, TpPars->dbis);
376
 
377
	   if (TpPars->verzart == 7)
378
	      day = 1;
379
	   else
380
	      day = MonLeiste[mon-1];
381
 
382
	   TpPars->dbis = make_date (day, mon, year);
383
	}
384
 
385
	// überprüfen der Laufzeit auf Grund der eingegebenen Daten
386
 
387
	if (TpPars->endfaell > 0L)
388
	   tage = DateToDay (TpPars->endfaell) - DateToDay (TpPars->ragab);
389
	else
390
	   tage = DateToDay (TpPars->dbis) - DateToDay (TpPars->ragab);
391
 
392
	if (tage > 36524L)
393
	   return 14;			// Laufzeit über 100 Jahre
394
 
395
	if (TpPars->abschl == 0L)
396
	   TpPars->abschl = TpPars->ragab;
397
 
398
	date_int (&vday, &mon, &year, TpPars->dvon);
399
	date_int (&day, &mon, &year, TpPars->ragab);
400
	date_int (&at, &am, &aj, TpPars->abschl);
401
	akt_mon = mon - 1;
402
	a_ind = r_ind = 0;
403
	pos = 0;
404
	abschluss = FALSE;
405
	r_yet = FALSE;			// Nur TRUE wenn "a_dat" < TpPars->dvon
406
	lab = 0L;
407
 
408
	while (pos < tage && a_ind < 1200 && r_ind < 1200)
409
	{
410
	   set_feb (year);
411
 
412
	   // Abschlußdatum
413
 
414
	   if (TpPars->abschlry > 40)
415
	      akt_day = MonLeiste[akt_mon];
416
	   else
417
	   {
418
	      if (at > MonLeiste[akt_mon])
419
		 akt_day = MonLeiste[akt_mon];
420
	      else
421
		 akt_day = at;
422
	   }
423
 
424
	   a_dat = make_date (akt_day, akt_mon + 1, year);
425
 
426
	   if (test_abschl (akt_mon+1) && AbschlPlan[akt_mon] && a_dat > TpPars->ragab)
427
	   {
428
	      ab_dat[a_ind] = a_dat;
429
	      lab = a_dat;
430
 
431
	      if (a_dat < TpPars->dvon)
432
		 r_yet = TRUE;
433
 
434
	      if (!abschluss)
435
	      {
436
		 TpPars->abschl = TpPars->ragab;
437
		 abschluss = TRUE;
438
	      }
439
 
440
	      a_ind++;
441
	   }
442
 
443
	   // Einschränkungsdatum
444
 
445
	   if (TpPars->ultimo)
446
	      akt_day = MonLeiste[akt_mon];
447
	   else
448
           {
449
	      if (vday > MonLeiste[akt_mon])
450
		 akt_day = MonLeiste[akt_mon];
451
	      else
452
		 akt_day = vday;
453
	   }
454
 
455
	   r_dat = make_date (akt_day, akt_mon+1, year);
456
 
457
	   if ((TpPars->raplan[akt_mon] && r_dat >= TpPars->dvon &&
458
	       r_dat <= TpPars->dbis) || r_yet)
459
	   {
460
	      rat_dat[r_ind] = r_dat;
461
	      ldat = r_dat;
462
	      rat_anz[r_ind] = TpPars->raplan[akt_mon];
463
	      r_ind++;
464
	      r_yet = FALSE;
465
	   }
466
 
467
	   akt_mon++;
468
 
469
	   if (akt_mon >= 12)		// Jahreswechsel
470
	   {
471
	      akt_mon = 0;
472
	      year++;
473
	   }
474
 
475
	   pos = DateToDay (r_dat) - DateToDay (TpPars->ragab);
476
	}
477
 
478
	if (r_ind >= 1200 || a_ind >= 1200)
479
	   return 20;			// Rechenfehler
480
 
481
	if (lab != a_dat)
482
	{
483
	   ab_dat[a_ind] = TpPars->dbis;
484
	   a_ind++;
485
	}
486
 
487
	TpPars->dbis = ldat;
488
	max_abs = a_ind;
489
        max_rat = r_ind;
490
	return 0;
491
}
492
 
493
int TRech::AntizipativTable ()
494
{
495
long tage;
496
int vday, day, mon, year, akt_day, akt_mon;
497
int at, am, aj;
498
BOOL abschluss, r_yet;
499
long lab;
500
 
501
	// Wurde eine fixe Rate vorgegeben und ein Enfälligkeitsdatum
502
	// angegeben, muß die letzte Einschränkung gleich dem
503
	// Endfälligkeitsdatum sein.
504
 
505
	if (TpPars->fixrate && TpPars->endfaell > 0L)
506
	   TpPars->dbis = TpPars->endfaell;
507
 
508
	// Wurde eine fixe Rate vorgegeben und keine letzte Einschränkung
509
	// und keine Endfälligkeit, werden 100 Jahre im voraus gesetzt.
510
	// Das ist die maximale Laufzeit.
511
 
512
	if (TpPars->dbis == 0L)
513
	{
514
	   tage = (99L * 365L) + (99L / 4L);	// 99 Jahre ist maximale Laufzeit
515
	   TpPars->dbis = DayToDate (tage + DateToDay (TpPars->ragab));
516
	}
517
 
518
	// Wenn auf Ultimo gerechnet wird, muß der Tag der letzten
519
	// Einschränkung auf den letzten des Monats gesetzt werden.
520
	// Einzige Ausnahme: Verzinsungsart 7. Hier muß der Tag auf den
521
	// 1. eines Monats gesetzt werden.
522
 
523
	if (TpPars->ultimo)
524
	{
525
	   if (TpPars->verzart == 3)
526
	      day = 1;
527
	   else
528
	   {
529
	      date_int (&day, &mon, &year, TpPars->dbis);
530
	      day = MonLeiste[mon-1];
531
	   }
532
 
533
	   TpPars->dbis = make_date (day, mon, year);
534
	}
535
	else
536
	{
537
	   date_int (&day, &mon, &year, TpPars->dbis);
538
	   day = 1;
539
	   TpPars->dbis = make_date (day, mon, year);
540
	}
541
 
542
	// überprüfen der Laufzeit auf Grund der eingegebenen Daten
543
 
544
	if (TpPars->endfaell > 0L)
545
	   tage = DateToDay (TpPars->endfaell) - DateToDay (TpPars->ragab);
546
	else
547
	   tage = DateToDay (TpPars->dbis) - DateToDay (TpPars->ragab);
548
 
549
	if (tage > 36525L)
550
	   return 14;			// Laufzeit �ber 100 Jahre
551
 
552
	if (TpPars->abschl == 0L)
553
	   TpPars->abschl = TpPars->ragab;
554
 
555
	date_int (&vday, &mon, &year, TpPars->dvon);
556
	date_int (&day, &mon, &year, TpPars->ragab);
557
	date_int (&at, &am, &aj, TpPars->abschl);
558
	akt_mon = mon - 1;
559
	a_ind = r_ind = 0;
560
	pos = 0;
561
	abschluss = FALSE;
562
	r_yet = FALSE;			// Nur TRUE wenn "a_dat" < TpPars->dvon
563
	lab = 0L;
564
 
565
	while (pos < tage)
566
	{
567
	   set_feb (year);
568
 
569
	   // Abschlußdatum
570
 
571
	   if (TpPars->abschlry > 40)
572
	      akt_day = MonLeiste[akt_mon];
573
	   else
574
	   {
575
	      if (at > MonLeiste[akt_mon])
576
		 akt_day = MonLeiste[akt_mon];
577
	      else
578
		 akt_day = at;
579
	   }
580
 
581
	   a_dat = make_date (akt_day, akt_mon + 1, year);
582
 
583
	   if (!abschluss)
584
	   {
585
	      ab_dat[a_ind] = TpPars->ragab;
586
	      lab = TpPars->ragab;
587
	      TpPars->abschl = TpPars->ragab;
588
	      abschluss = TRUE;
589
	      a_ind++;
590
           }
591
	   else if (test_abschl (akt_mon+1) && a_dat < TpPars->dbis)
592
	   {
593
	      a_dat = DateToDay (a_dat);
594
	      a_dat = DayToDate (a_dat + 1L);
595
	      ab_dat[a_ind] = a_dat;
596
	      lab = a_dat;
597
	      a_ind++;
598
           }
599
 
600
	   // Einschränkungsdatum
601
 
602
	   if (TpPars->ultimo)
603
	      akt_day = MonLeiste[akt_mon];
604
	   else
605
           {
606
	      if (vday > MonLeiste[akt_mon])
607
		 akt_day = MonLeiste[akt_mon];
608
	      else
609
		 akt_day = vday;
610
	   }
611
 
612
	   r_dat = make_date (akt_day, akt_mon+1, year);
613
 
614
	   if ((TpPars->raplan[akt_mon] && r_dat >= TpPars->dvon &&
615
	       r_dat <= TpPars->dbis) || r_yet)
616
	   {
617
	      rat_dat[r_ind] = r_dat;
618
	      ldat = r_dat;
619
	      rat_anz[r_ind] = TpPars->raplan[akt_mon];
620
	      r_ind++;
621
	      r_yet = FALSE;
622
	   }
623
 
624
	   akt_mon++;
625
 
626
	   if (akt_mon >= 12)		// Jahreswechsel
627
	   {
628
	      akt_mon = 0;
629
	      year++;
630
	   }
631
 
632
	   pos = DateToDay (r_dat) - DateToDay (TpPars->ragab);
633
	}
634
 
635
	if (lab != a_dat)
636
	{
637
	   ab_dat[a_ind] = TpPars->dbis;
638
	   a_ind++;
639
	}
640
 
641
	TpPars->dbis = ldat;
642
	max_abs = a_ind;
643
        max_rat = r_ind;
644
	return 0;
645
}
646
 
647
double TRech::runden (double zahl, int komma)
648
{
649
double vork, nachk;
650
long nk, nk1, splitter;
651
 
652
	if (zahl == 0.0)
653
	   return 0.0;
654
 
655
	nk = 0L;
656
	modf (zahl, &vork);
657
	nachk = zahl - vork;
658
 
659
        if (komma)
660
	   nk = (long)((double)(nachk * pow (10.0, (double)komma)));
661
 
662
	nk1 = (long)((double)(nachk * pow (10.0, (double)komma+1.0)));
663
	splitter = nk1 - (nk * 10L);
664
 
665
	if (splitter >= 5L)
666
	   nk++;
667
 
668
	if (komma == 0)
669
	{
670
	   if (splitter >= 5)
671
	      return vork+1.0;
672
 
673
	   return vork;
674
	}
675
 
676
	nachk = (double)nk / pow (10.0, (double)komma);
677
	vork += nachk;
678
	return vork;
679
}
680
 
681
BOOL TRech::test_abschl (int am)
682
{
683
BOOL t1,t2,t3,t4,t5,t6;
684
 
685
	t1 = (TpPars->abschlry == 1 || TpPars->abschlry == 41);
686
	t2 = ((TpPars->abschlry == 3 || TpPars->abschlry == 43) && (am == 3 || am == 6 || am == 9 || am == 12));
687
	t3 = ((TpPars->abschlry == 6 || TpPars->abschlry == 46) && (am == 6 || am == 12));
688
	t4 = ((TpPars->abschlry == 12 || TpPars->abschlry == 52) && am == 12);
689
	t5 = (TpPars->abschlry == 47 && (am == 3 || am == 9));
690
	t6 = (TpPars->abschlry == 48 && (am == 2 || am == 8));
691
 
692
	if (t1 || t2 || t3 || t4 || t5 || t6)
693
	   return TRUE;
694
 
695
	return FALSE;
696
}
697
 
698
long TRech::tageber (long date)
699
{
700
int tt_par, mm_par, jj_par;
701
 
702
	date_int (&tt_par, &mm_par, &jj_par, date);
703
 
704
	if (TpPars->tageb == 1 || TpPars->tageb == 4 || TpPars->tageb == 6)
705
	{
706
	   if (TpPars->abschlry > 40 || TpPars->ultimo)
707
	      if (tt_par >= 28 && mm_par == 2)
708
		 tt_par = 30;
709
 
710
	   if (tt_par > 30)
711
	      tg_par = (long)jj_par * 360L + (long)mm_par * 30L;
712
	   else
713
	      tg_par = (long)jj_par * 360L + ((long)mm_par - 1L) * 30L + (long)tt_par;
714
	}
715
	else
716
	   tg_par = DateToDay (date);
717
 
718
	return tg_par;
719
}
720
 
721
void TRech::vorrech ()
722
{
723
long tg;
724
 
725
	dat_par = ab_dat[a_ind];
726
	tg_par = tageber (dat_par);
727
	tg = tg_par - ab_tag;
728
	ab_tag = tg_par;
729
 
730
	if (verzinsung != 1)
731
	{
732
	   zi_kap = kap * (double)tg * TpPars->zssoll / divisor;
733
	   zi_rat = rat * (double)tg * TpPars->zssoll / divisor;
734
	}
735
	else
736
	{
737
	   zi_kap = kap * (double)tg * TpPars->zssoll / (divisor - (double)tg * TpPars->zssoll);
738
	   zi_rat = rat * (double)tg * TpPars->zssoll / (divisor - (double)tg * TpPars->zssoll);
739
	}
740
}
741
 
742
/* Einschränkung */
743
 
744
void TRech::einschr ()
745
{
746
long tg;
747
 
748
	rat = rat + (double)rat_anz[r_ind];
749
 
750
	if (TpPars->valuta == 0)
751
	{
752
	   dat_par = rat_dat[r_ind];
753
	   tg_par = tageber (dat_par);
754
	   tg = ab_tag - tg_par;
755
 
756
	   if (verzinsung == 1)
757
	      zi_rat = zi_rat + (double)rat_anz[r_ind] * (double)tg *
758
		       TpPars->zssoll / (divisor - (double)tg *
759
		       TpPars->zssoll);
760
	   else
761
	      zi_rat = zi_rat + (double)rat_anz[r_ind] * (double)tg *
762
		       TpPars->zssoll / divisor;
763
	}
764
 
765
	r_ind++;
766
}
767
 
768
/* Abschlußberechnung */
769
 
770
void TRech::abschlus ()
771
{
772
	switch (reh)
773
	{
774
	   case 0: kap += zi_kap;
775
		   rat += zi_rat;
776
	   break;
777
 
778
	   case 2: kap += (zi_kap + TpPars->spesen);
779
		   rat += zi_rat;
780
	   break;
781
	}
782
 
783
	a_ind++;
784
}
785
 
786
// Erstellen eines Ratenplans
787
 
788
double TRech::GetRate (double rahmen, long ragab, long dvon)
789
{
790
double ergrate;
791
 
792
	ab_tag = 0L;
793
	zi_rat = 0.0;
794
	zi_kap = 0.0;
795
	dat_par = 0L;
796
 
797
	if (rat_dat[r_ind] < dvon)
798
	   while (rat_dat[r_ind] < dvon && r_ind < max_rat)
799
	      r_ind++;
800
 
801
	dat_par = ragab;
802
	tageber (dat_par);
803
	kap = rahmen;
804
	rat = 0.0;
805
	ab_tag = tg_par;
806
	vorrech ();
807
 
808
	while (r_ind < max_rat && a_ind < max_abs)
809
	{
810
	   if (rat_dat[r_ind] > ab_dat[a_ind])
811
	   {
812
	      abschlus ();
813
	      vorrech ();
814
	   }
815
	   else if (rat_dat[r_ind] < ab_dat[a_ind])
816
	      einschr ();
817
	   else if (verzinsung == 1 || verzinsung == 2)
818
	   {
819
	      abschlus ();
820
	      vorrech ();
821
	      einschr ();
822
	   }
823
	   else
824
	   {
825
	      einschr ();
826
	      abschlus ();
827
	      vorrech ();
828
	   }
829
	}
830
 
831
	if (verzinsung == 1 || verzinsung == 2)
832
	{
833
	   abschlus ();
834
	   einschr ();
835
	}
836
	else
837
	{
838
	   einschr ();
839
	   abschlus ();
840
	}
841
 
842
	if (rat != 0.0)
843
        {
844
           rat = (kap - TpPars->kapital) / rat;
845
	   ergrate = runden (rat, rund_fakt);
846
 
847
	   if (ergrate != rat && rund_fakt > 0)
848
              rat = ergrate + (1.0 / pow (10.0, (double)rund_fakt));
849
	   else if (rund_fakt == 0 && ergrate != rat)
850
	      rat = ergrate + 1.0;
851
	}
852
 
853
        return rat;
854
}
855
 
856
/************************************************************************
857
   Erstellung eines Tilgungsplans.
858
 
859
   Dieser wird in eine Datei ausgegeben. Die Datei besteht aus einem
860
   Kopf (Übergabestruktur) und einzelnen Datensätzen.
861
*************************************************************************/
862
 
863
// #$10100
864
int TRech::Ratenplan ()
865
{
866
	if (verzinsung == 0 || verzinsung == 2)
867
	   return DekursivPlan ();
868
 
869
	return AntizipativPlan ();
870
}
871
 
872
// #$10110
873
int TRech::DekursivPlan ()
874
{
875
QString hdir = QDir::homeDirPath ();
876
QFile tmpFile, zaf;
877
int fd, index, i;
878
int real_rat, Abzug;
879
long tg;
880
double zins, tilg, zi1, zi2, kzi;
881
long offset;
882
BOOL stop;
883
#ifdef _ZINSAENDERUNG
884
   int fdZins;
885
   long zoff, LastAend;
886
   ZIAEND Zi;
887
   double aZins;
888
   struct stat sbuf;
889
#endif
890
 
891
	/* Planerstellung */
892
	hdir.append("/.date_tbl.dat");
893
	tmpFile.setName(hdir);
894
 
895
	if (tmpFile.open(IO_ReadWrite | IO_Truncate) == FALSE)
896
	{
897
	   KMessageBox::error(0, QString("Could not open file for reading: %1").arg(tmpFile.errorString()));
898
	   return 1;
899
	}
900
 
901
	fd = tmpFile.handle();
902
#ifdef _ZINSAENDERUNG
903
	// Wenn eine Zinssatzänderung gewünscht wurde, muß die Änderungs-
904
	// datei geöffnet werden.
905
 
906
	zoff = 0L;
907
        LastAend = 0L;		// Beinhaltet Datum der letzten Zinssatzänderung
908
	aZins = 0.0;
909
	memset (&Zi, 0, sizeof(ZIAEND));
910
 
911
	if (TpPars->ziaend)
912
        {
913
           hdir = QDir::homeDirPath ();
914
           hdir.append("/.zinsaend.dat");
915
           zaf.setName(hdir);
916
           fdZins = -1;
917
 
918
           if (zaf.open(IO_ReadOnly) == FALSE)
919
	      TpPars->ziaend = FALSE;
920
	   else
921
           {
922
	      fdZins = zaf.handle();
923
	      fstat (fdZins, &sbuf);
924
 
925
	      if (sbuf.st_size == 0L)
926
		 TpPars->ziaend = FALSE;
927
	      else
928
              {
929
		 read (fdZins, &Zi, sizeof(ZIAEND));
930
                 zoff += (long)sizeof(ZIAEND);
931
              }
932
	   }
933
 
934
	   if (!TpPars->ziaend && fdZins != -1)
935
              zaf.close ();
936
	}
937
#endif
938
 
939
	offset = 0L;
940
	index = max_abs + max_rat;
941
 
942
	/* Ausgangsdaten schreiben */
943
	write (fd, TpPars, sizeof (TPPARS));
944
	offset += (long)sizeof (TPPARS);
945
 
946
	/* Initialisierung der Schleife */
947
 
948
	a_ind = r_ind = 0;
949
	kap = TpPars->rahmen;
950
	zins = 0.0;
951
	TpPars->gesamt = kap;
952
	tilg = kzi = 0.0;
953
	tg = 0;
954
	TpPars->abschl = ab_dat[0];
955
	stop = FALSE;			// TRUE wenn Laufzeitende bei Ratenvorgabe
956
	real_rat = max_rat;
957
        Abzug = 0;			// wird nur bei Ratenvorgabe verwendet
958
 
959
	/* Schleife zur Berechnung der Gesamtbelastung (Dekursiv) */
960
 
961
	for (i = 0; i < index; i++)
962
	{
963
#ifdef _ZINSAENDERUNG
964
	   // Ist eine Zinssatzänderung gewünscht?
965
 
966
	   if ((Zi.Datum < rat_dat[r_ind-1] || Zi.Datum < ab_dat[a_ind]) &&
967
	       zoff <= sbuf.st_size && TpPars->ziaend)
968
	   {
969
	      DTable.datum = Zi.Datum;
970
	      DTable.kz = 'Z';
971
	      DTable.kapital = kap;
972
	      index++;
973
 
974
	      if (a_ind > 0)
975
	      {
976
		 if (ab_dat[a_ind-1] < Zi.Datum)
977
		    ldat = ab_dat[a_ind-1];
978
		 else
979
		    ldat = Zi.Datum;
980
 
981
		 tg = tageber (Zi.Datum) - tageber (ldat);
982
	      }
983
	      else
984
	         tg = tageber (Zi.Datum) - tageber (TpPars->ragab);
985
 
986
	      aZins = kap * (double)tg * TpPars->zssoll / divisor;
987
	      kap += runden (aZins, rund_fakt);
988
              LastAend = Zi.Datum;
989
	      DekZiAend (fdZins, &zoff, sbuf.st_size, &Zi);
990
	      kap = DTable.kapital;
991
	      DTable.rate = Zi.Zins;
992
	   }
993
	   else if ((rat_dat[r_ind] <= ab_dat[a_ind] && r_ind < max_rat) || a_ind >= max_abs)
994
#else
995
	   if ((rat_dat[r_ind] <= ab_dat[a_ind] && r_ind < max_rat) || a_ind >= max_abs)
996
#endif
997
	   {
998
	      DTable.datum = rat_dat[r_ind];
999
	      DTable.kz = 'R';
1000
	      DTable.kapital = runden (kap, rund_fakt);
1001
 
1002
	      if (r_ind > 0)
1003
	      {
1004
		 if (ab_dat[a_ind-1] > rat_dat[r_ind-1])
1005
		    ldat = ab_dat[a_ind-1];
1006
		 else
1007
		    ldat = rat_dat[r_ind-1];
1008
#ifdef _ZINSAENDERUNG
1009
		 if (LastAend && LastAend > ldat)
1010
		    ldat = LastAend;
1011
#endif
1012
		 tg = tageber (rat_dat[r_ind]) - tageber (ldat);
1013
	      }
1014
	      else
1015
	         tg = tageber (rat_dat[r_ind]) - tageber (TpPars->ragab);
1016
 
1017
	      zi1 = kap * (double)tg * TpPars->zssoll / divisor;
1018
#ifdef _ZINSAENDERUNG
1019
	      if (LastAend)
1020
	      {
1021
		 LastAend = 0L;
1022
		 zi1 += aZins;
1023
	      }
1024
#endif
1025
              zi1 = runden (zi1, rund_fakt);
1026
	      zins += zi1;
1027
	      kzi += zi1;
1028
 
1029
	      if (TpPars->fixrate == TRUE)	/* Ratenvorgabe */
1030
	      {
1031
	         if (!stop && r_ind > 0 && DTable.rkapi < rat)
1032
	         {
1033
	            max_rat = r_ind + 1;
1034
	            max_abs = a_ind + 1;
1035
	            real_rat = max_rat - Abzug;
1036
	            ab_dat[a_ind] = rat_dat[r_ind];
1037
	            index = max_rat + max_abs;
1038
	            stop = TRUE;
1039
	         }
1040
	      }
1041
 
1042
	      if (r_ind == (max_rat - 1)) 		/* letzte Rate */
1043
	      {
1044
		 if (reh != 1)
1045
		 {
1046
		    zi2 = (kap < rat) ? rat - kap : kap - rat;
1047
		    zi2 = rat - zi2 + zins;
1048
//	            zi2 = rat + ((TpPars->gesamt + zins) - (rat * (LFLOAT)real_rat));
1049
		 }
1050
	         else
1051
	            zi2 = rat - ((rat * (double)real_rat) - TpPars->rahmen);
1052
 
1053
	         rat = zi2 + TpPars->spesen;
1054
	      }
1055
 
1056
	      TpPars->lrate = rat;
1057
	      tilg += rat;				/* Tilgung */
1058
 
1059
	      if (DTable.datum >= TpPars->dvon)		/* Restkapital */
1060
	         kap -= rat;
1061
 
1062
	      DTable.rkapi = (kap >= 0.0) ? kap : 0.0;
1063
	      DTable.tilg = 0.0;
1064
	      DTable.rate = rat;
1065
	      DTable.zinsen = zi1;
1066
	      r_ind++;
1067
	   }
1068
	   else
1069
	   {
1070
	      DTable.datum = ab_dat[a_ind];
1071
	      DTable.kz = 'A';
1072
 
1073
	      if (r_ind > 0 && rat_dat[r_ind-1] <= ab_dat[0])
1074
	         DTable.kapital = TpPars->rahmen;
1075
	      else
1076
	         DTable.kapital = (kap >= 0.0) ? kap : 0.0;
1077
 
1078
	      kap += TpPars->spesen;
1079
	      DTable.rate = 0.0;
1080
 
1081
	      if (r_ind > 0)
1082
              {
1083
	         if (ab_dat[a_ind-1] > rat_dat[r_ind-1])
1084
	            ldat = ab_dat[a_ind-1];
1085
	         else
1086
	            ldat = rat_dat[r_ind-1];
1087
#ifdef _ZINSAENDERUNG
1088
		 if (LastAend && LastAend > ldat)
1089
		    LastAend = 0L;
1090
#endif
1091
		 tg = tageber (ab_dat[a_ind]) - tageber (ldat);
1092
 
1093
	         if (tg > 0)
1094
                 {
1095
		    zi1 = kap * (double)tg * TpPars->zssoll / divisor;
1096
#ifdef _ZINSAENDERUNG
1097
	            if (LastAend)
1098
	            { 
1099
		       LastAend = 0L;
1100
		       zi1 += aZins;
1101
	            }
1102
#endif
1103
		    zins += zi1;
1104
	            kzi += runden (zi1, rund_fakt);
1105
	            zins = runden (zins, rund_fakt);
1106
		 }
1107
#ifdef _ZINSAENDERUNG
1108
		 else if (LastAend)
1109
		    LastAend = 0L;
1110
#endif
1111
	      }
1112
 
1113
	      DTable.zinsen = zins;
1114
	      TpPars->gesamt += zins + TpPars->spesen;	/* Gesamtbelastung */
1115
 
1116
	      if (reh != 2)
1117
	         tilg -= zins;      		/* Tilgung - Zinsen */
1118
 
1119
	      if (DTable.datum < TpPars->dvon)
1120
	         DTable.tilg = 0.0;
1121
	      else
1122
	         DTable.tilg = tilg;
1123
 
1124
	      if (reh != 1)
1125
	         kap += zins;
1126
 
1127
	      DTable.rkapi = (kap >= 0.0) ? kap : 0.0;
1128
	      zins = 0.0;
1129
	      tilg = 0.0;
1130
	      a_ind++;
1131
	   } /* end if */
1132
 
1133
	   if (DTable.datum < TpPars->dvon && DTable.kz == 'R')
1134
	   {
1135
              if (TpPars->fixrate)
1136
	         Abzug++;
1137
	      else
1138
	         real_rat--;
1139
 
1140
	      continue;
1141
	   }
1142
 
1143
	   write (fd, &DTable, sizeof (DTABLE));
1144
	   offset += (long)sizeof (DTABLE);
1145
	} /* end for */
1146
 
1147
	if (TpPars->fixrate == TRUE)
1148
	   TpPars->dbis = rat_dat[r_ind-1];
1149
 
1150
	TpPars->anzraten = real_rat;
1151
	DTable.datum = (long)real_rat;		/* Laufzeit */
1152
	DTable.kz = 'E';			/* Ergebnis */
1153
	DTable.kapital = TpPars->rahmen;
1154
	DTable.tilg = TpPars->gesamt;
1155
	DTable.rate = 0.0;
1156
	TpPars->ezins = TpPars->gesamt - TpPars->rahmen;
1157
 
1158
	if (TpPars->zuschprz > 0.0)
1159
	   TpPars->zuschuss = runden (TpPars->ezins / 100 * TpPars->zuschprz, rund_fakt);
1160
	else
1161
	   TpPars->zuschuss = 0.0;
1162
 
1163
	DTable.zinsen = TpPars->gesamt - TpPars->rahmen;
1164
	TpPars->gesamt -= TpPars->zuschuss;
1165
 
1166
	// Annuitätenzuschuß berechnen und anzeigen
1167
 
1168
	if (TpPars->zuschannu > 0.0 && TpPars->gesamt > 0.0)
1169
	{
1170
	   TpPars->anzuschuss = TpPars->ergrate / 100.0 * TpPars->zuschannu;
1171
	   TpPars->antotal = TpPars->anzuschuss * ((double)real_rat - 1.0) + (TpPars->lrate / 100.0 * TpPars->zuschannu);
1172
	   TpPars->antotal -= TpPars->zuschuss;
1173
	}
1174
	else
1175
	   TpPars->anzuschuss = TpPars->antotal = 0.0;
1176
 
1177
	DTable.rkapi = TpPars->lrate;
1178
	write (fd, &DTable, sizeof (DTABLE));
1179
#ifdef _ZINSAENDERUNG
1180
	if (TpPars->gewicht > 0.0)
1181
	   TpPars->zssoll = TpPars->gewicht;
1182
 
1183
	zaf.close();
1184
#endif
1185
	tmpFile.flush();
1186
	lseek (fd, 0L, 0);
1187
	write (fd, TpPars, sizeof (TPPARS));
1188
	tmpFile.close ();
1189
	return 0;
1190
}
1191
 
1192
#ifdef _ZINSAENDERUNG
1193
void TRech::DekZiAend (int fdZins, long *zoff, long size, ZIAEND *Zi)
1194
{
1195
int old_rind, old_aind;
1196
long datum;
1197
double old_kap;
1198
 
1199
	TpPars->gewicht = TpPars->zssoll;
1200
	TpPars->zssoll = Zi->Zins;
1201
 
1202
	if (Zi->Rate)
1203
        {
1204
	   old_kap = kap;
1205
	   old_rind = r_ind;
1206
	   old_aind = a_ind;
1207
 
1208
	   if (rat_dat[r_ind] > ab_dat[a_ind])
1209
	      datum = ab_dat[a_ind];
1210
	   else
1211
	      datum = rat_dat[r_ind];
1212
 
1213
	   GetRate (kap, Zi->Datum, datum);
1214
	   kap = old_kap;
1215
	   r_ind = old_rind;
1216
	   a_ind = old_aind;
1217
	   TpPars->ergrate = rat;
1218
	}
1219
	else if (Zi->FixRate)
1220
        {
1221
	   rat = Zi->NewRate;
1222
	   TpPars->ergrate = rat;
1223
	}
1224
 
1225
	if (*zoff < size)
1226
	   read (fdZins, Zi, sizeof(ZIAEND));
1227
	else
1228
	   close (fdZins);
1229
 
1230
        *zoff += (long)sizeof(ZIAEND);
1231
}
1232
 
1233
#endif
1234
int TRech::AntizipativPlan ()
1235
{
1236
QString hdir = QDir::homeDirPath ();
1237
QFile tmpFile;
1238
int fd, index, i;
1239
int real_rat, Abzug;
1240
long t1, t2, r_dat, old_par, r_tg, a_tg;
1241
double zins, tilg, kzi, sumrat;
1242
long offset, loff;
1243
BOOL stop;
1244
DTABLE old_tab;
1245
 
1246
	/* Planerstellung */
1247
	hdir.append("/.date_tbl.dat");
1248
	tmpFile.setName(hdir);
1249
 
1250
	if (tmpFile.open(IO_ReadWrite | IO_Truncate) == FALSE)
1251
	{
1252
	   KMessageBox::error(0, QString("Could not open file for reading: %1").arg(tmpFile.errorString()));
1253
	   return 1;
1254
	}
1255
 
1256
 
1257
	fd = tmpFile.handle();
1258
	offset = 0L;
1259
	index = max_abs - 1 + max_rat;
1260
 
1261
	/* Ausgangsdaten schreiben */
1262
	write (fd, TpPars, sizeof (TPPARS));
1263
	offset += (long)sizeof (TPPARS);
1264
 
1265
	/* Initialisierung der Schleife */
1266
 
1267
	a_ind = r_ind = 0;
1268
	kap = TpPars->rahmen;
1269
	zins = 0.0;
1270
	TpPars->gesamt = kap;
1271
	tilg = kzi = 0.0;
1272
	TpPars->abschl = ab_dat[0];
1273
	stop = FALSE;			// TRUE wenn Laufzeitende bei Ratenvorgabe
1274
	real_rat = max_rat;
1275
        Abzug = 0;			// wird nur bei Ratenvorgabe verwendet
1276
 
1277
	/* Schleife zur Berechnung der Gesamtbelastung (Antizipativ) */
1278
 
1279
	a_ind++;			/* Start bei 1! */
1280
	ab_tag = tageber (ab_dat[a_ind]);
1281
	tageber (TpPars->ragab);
1282
	tg_alt = tg_par;
1283
	sumrat = 0.0;
1284
	DTable.rkapi = runden (kap, rund_fakt);
1285
	DTable.kapital = runden (kap, rund_fakt);
1286
	loff = offset;
1287
	old_tab.datum = ab_dat[0];
1288
	old_tab.kz = 'A';
1289
	old_tab.kapital = TpPars->rahmen;
1290
	write (fd, &old_tab, sizeof (DTABLE));	/* Platzhalter */
1291
	offset += (long)sizeof (DTABLE);
1292
	r_dat = 0L;
1293
 
1294
	for (i = 0; i < index-1; i++)
1295
	{
1296
	   if ((rat_dat[r_ind] < ab_dat[a_ind] && r_ind < max_rat) || a_ind >= max_abs)
1297
	   {
1298
	      DTable.datum = rat_dat[r_ind];
1299
	      DTable.kz = 'R';
1300
 
1301
	      tageber (rat_dat[r_ind+1]);
1302
	      t1 = ab_tag - tg_alt;
1303
	      t2 = ab_tag - tg_par;
1304
 
1305
	      if (t2 < 0L)
1306
		 t2 = 0L;
1307
 
1308
              // Berechnung der letzten Rate
1309
	      if (rat > (DTable.rkapi - TpPars->kapital))
1310
	         rat = runden (DTable.rkapi - TpPars->kapital, rund_fakt);
1311
 
1312
	      sumrat += rat;
1313
 
1314
//              if (reh == 1)		// Kapitalraten
1315
	         kap -= rat;
1316
 
1317
	      if (reh != 1)		// Pauschalraten
1318
	      {
1319
	         kzi = kap * TpPars->zssoll * ((double)t1 *
1320
	               (divisor - (double)t2 * TpPars->zssoll) -
1321
		       (double)t2 * (divisor - (double)t1 * TpPars->zssoll)) /
1322
		       ((divisor - (double)t1 * TpPars->zssoll) *
1323
		       (divisor - (double)t2 * TpPars->zssoll));
1324
	      }
1325
	      else			// Kapitalraten
1326
//	         kzi = kap * (tg_par - tg_alt) * TpPars->zssoll / divisor;
1327
		 kzi = kap * (t1 - t2) * TpPars->zssoll / divisor;
1328
 
1329
	      kzi = runden (kzi, rund_fakt);
1330
	      tg_alt = tg_par;
1331
	      zins += kzi;
1332
 
1333
              if (reh == 1)		// Kapitalraten
1334
		 DTable.rkapi = DTable.kapital - sumrat;
1335
	      else			// Pauschalraten
1336
		 DTable.rkapi = DTable.kapital + zins - sumrat;
1337
 
1338
	      if (TpPars->fixrate == TRUE)	/* Ratenvorgabe */
1339
	      {
1340
		 if (!stop && r_ind > 0 && DTable.rkapi < rat)
1341
	         {
1342
	            max_rat = r_ind + 1;
1343
	            max_abs = a_ind + 1;
1344
	            ab_dat[a_ind] = rat_dat[r_ind];
1345
                    real_rat = max_rat - Abzug;
1346
	            index = max_rat + max_abs;
1347
	            stop = TRUE;
1348
	         }
1349
	      }
1350
 
1351
              if (reh == 1)		// Kapitalraten
1352
		 DTable.tilg = rat;
1353
	      else                 	// Pauschalraten
1354
		 DTable.tilg = rat - kzi;
1355
 
1356
	      tilg += DTable.tilg;
1357
	      TpPars->lrate = rat;
1358
 
1359
	      DTable.rate = rat;
1360
	      DTable.zinsen = kzi;
1361
	      r_ind++;
1362
	   }
1363
	   else			/* Abschluß */
1364
	   {
1365
	      DTable.datum = ab_dat[a_ind];
1366
 
1367
	      if (i == (index-2))
1368
	      {
1369
		 DTable.kz = 'R';
1370
		 max_rat++;
1371
//		 TpPars->lrate = DTable.kapital - tilg;
1372
	      }
1373
	      else
1374
	         DTable.kz = 'A';
1375
 
1376
	      if (a_ind > 1)
1377
              {
1378
                 old_par = tg_par; 
1379
 
1380
		 if (reh == 1)			// Kapitalraten
1381
                 {
1382
		    r_tg = tageber (r_dat);
1383
                    a_tg = tageber (ab_dat[a_ind-1]);
1384
		    t1 = r_tg - a_tg;
1385
		    t2 = 0L;
1386
		 }
1387
		 else
1388
		 {
1389
		    a_tg = tageber (ab_dat[a_ind]);
1390
		    tageber (ab_dat[a_ind-1]);
1391
		    t1 = a_tg - tg_par;
1392
		    tageber (r_dat);
1393
		    t2 = ab_tag - tg_par;
1394
		 }
1395
 
1396
		 tg_par = old_par;
1397
 
1398
		 if (reh != 1)			// Pauschalraten
1399
                 {
1400
		    kzi = DTable.kapital * TpPars->zssoll * ((double)t1 *
1401
	                  (divisor - (double)t2 * TpPars->zssoll) -
1402
		          (double)t2 * (divisor - (double)t1 * TpPars->zssoll)) /
1403
		          ((divisor - (double)t1 * TpPars->zssoll) *
1404
			  (divisor - (double)t2 * TpPars->zssoll));
1405
                 }
1406
		 else                           // Kapitalraten
1407
		    kzi = DTable.kapital * t1 * TpPars->zssoll / divisor;
1408
 
1409
		 kzi = runden (kzi, rund_fakt);
1410
		 zins += kzi;
1411
 
1412
		 if (reh != 1)
1413
		 {
1414
                    tilg -= kzi;
1415
		    DTable.rkapi = DTable.kapital - tilg;
1416
                 }
1417
	      }
1418
 
1419
	      DTable.kapital -= tilg;
1420
	      r_dat = rat_dat[r_ind];
1421
 
1422
	      if (i == (index - 2))
1423
	      {
1424
	         DTable.rate = DTable.kapital;
1425
		 TpPars->lrate = DTable.rate;
1426
	         DTable.zinsen = 0.0;
1427
	         DTable.tilg = DTable.kapital;
1428
	         DTable.rkapi = 0.0;
1429
	      }
1430
	      else
1431
	      {
1432
	         DTable.rate = runden (sumrat, rund_fakt);
1433
	         DTable.zinsen = zins;
1434
	         DTable.tilg = tilg;
1435
	      }
1436
 
1437
	      TpPars->gesamt += zins;		/* Gesamtbelastung */
1438
 
1439
	      tmpFile.flush();
1440
	      lseek (fd, loff, 0);
1441
	      /* Füllen der Struktur */
1442
	      old_tab.tilg = tilg;
1443
	      old_tab.rate = 0.0;
1444
	      old_tab.zinsen = zins;
1445
 
1446
              if (reh == 1)
1447
		 old_tab.rkapi = old_tab.kapital;
1448
              else
1449
		 old_tab.rkapi = old_tab.kapital + zins;
1450
 
1451
	      write (fd, &old_tab, sizeof (DTABLE));
1452
	      old_tab.kapital = DTable.kapital;
1453
	      old_tab.datum = DTable.datum;
1454
	      lseek (fd, offset, 0);
1455
	      loff = offset;
1456
 
1457
//              if (reh == 1)			// Kapitalraten
1458
		 kap = DTable.kapital;
1459
 
1460
	      zins = 0.0;
1461
	      tilg = 0.0;
1462
	      sumrat = 0.0;
1463
	      a_ind++;
1464
	      ab_tag = tageber (ab_dat[a_ind]);
1465
	   } /* end if */
1466
 
1467
	   if (DTable.datum <= ab_dat[0] && DTable.datum < TpPars->dvon &&
1468
	       DTable.kz == 'R')
1469
	   {
1470
	      if (TpPars->fixrate)
1471
		 Abzug++;
1472
	      else
1473
	         real_rat--;
1474
 
1475
	      continue;
1476
           }
1477
 
1478
	   write (fd, &DTable, sizeof (DTABLE));
1479
	   offset += (long)sizeof (DTABLE);
1480
	} /* end for */
1481
 
1482
	if (TpPars->fixrate == TRUE)
1483
	   TpPars->dbis = rat_dat[r_ind-1];
1484
 
1485
	TpPars->anzraten = real_rat;
1486
	DTable.datum = (long)real_rat;		/* Laufzeit */
1487
	DTable.kz = 'E';			/* Ergebnis */
1488
	DTable.kapital = TpPars->rahmen;
1489
	DTable.tilg = TpPars->gesamt;
1490
	DTable.rate = 0.0;
1491
	TpPars->ezins = TpPars->gesamt - TpPars->rahmen;
1492
 
1493
	if (TpPars->zuschprz > 0.0)
1494
	   TpPars->zuschuss = runden (TpPars->ezins / 100 * TpPars->zuschprz, rund_fakt);
1495
	else
1496
	   TpPars->zuschuss = 0.0;
1497
 
1498
	DTable.zinsen = kzi;
1499
	TpPars->gesamt -= TpPars->zuschuss;
1500
 
1501
	// Annuitätenzuschuß berechnen und anzeigen
1502
 
1503
	if (TpPars->zuschannu > 0.0 && TpPars->gesamt > 0.0)
1504
	{
1505
	   TpPars->anzuschuss = TpPars->ergrate / 100.0 * TpPars->zuschannu;
1506
	   TpPars->antotal = TpPars->anzuschuss * ((double)real_rat - 1.0) + (TpPars->lrate / 100.0 * TpPars->zuschannu);
1507
	   TpPars->antotal -= TpPars->zuschuss;
1508
	}
1509
	else
1510
	   TpPars->anzuschuss = TpPars->antotal = 0.0;
1511
 
1512
	DTable.rkapi = TpPars->lrate;
1513
	write (fd, &DTable, sizeof (DTABLE));
1514
	tmpFile.flush();
1515
	lseek (fd, 0L, 0);
1516
	write (fd, TpPars, sizeof (TPPARS));
1517
	tmpFile.close ();
1518
	return 0;
1519
}
1520
 
1521
void TRech::init_global_vars ()
1522
{
1523
int i;
1524
 
1525
	ab_tag = 0L;
1526
	zi_rat = 0.0;
1527
	zi_kap = 0.0;
1528
	dat_par = 0L;
1529
 
1530
	for (i = 0; i < 1200; i++)
1531
	{
1532
	   rat_dat[i] = 0L;
1533
	   ab_dat[i] = 0L;
1534
	   rat_anz[i] = 0L;
1535
	}
1536
}