Subversion Repositories public

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
43 root 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; either version 2 of the License, or     *
8
 *   (at your option) any later version.                                   *
9
 *                                                                         *
10
 *   This program is distributed in the hope that it will be useful,       *
11
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
12
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
13
 *   GNU General Public License for more details.                          *
14
 *                                                                         *
15
 *   You should have received a copy of the GNU General Public License     *
16
 *   along with this program; if not, write to the                         *
17
 *   Free Software Foundation, Inc.,                                       *
18
 *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
19
 ***************************************************************************/
20
 
21
 
22
#include "helper.h"
23
#include "tprech.h"
24
#include <stdio.h>
25
#include <string.h>
26
#include <math.h>
27
#include <sys/stat.h>
28
#include <fcntl.h>
29
#include <unistd.h>
30
 
31
#include <kmessagebox.h>
32
#include <qstring.h>
33
#include <qfile.h>
34
#include <qdir.h>
35
 
36
// #include <iostream.h>
37
 
38
char AbschlPlan[12];
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
/***************************************************************************
43
 * TILGPL: Modul zur Berechnung eines Tilgungsplans                        *
44
 *         Die errechneten Daten werden in einer Datei zwischengespeichert *
45
 *         und können so auf jede beliebige Art ausgegeben werden.         *
46
 ***************************************************************************/
47
 
48
int TRech::tilgpl ()
49
{
50
int fd, day, mon, year, akt_mon, index, akt_day, akt_year, i, j, a;
51
int vday, at, am, aj, zwat;
52
long tage, pos, ldat, r_dat, a_dat, tg, lab, t1, t2;
53
long tg_per;
54
double zins, tilg, zi1, zi2, kzi, sumrat;
55
long offset;
56
char buf[255];
57
BOOL abschluss, r_yet;
58
 
59
	init_global_vars ();
60
	rund_fakt = (TpPars->runden) ? 0 : 2;
61
	date_int (&day, &mon, &year, TpPars->dvon);
62
 
63
	if (TpPars->ultimo)              /* Wenn Ultimo Datum korrigieren */
64
	{
65
	   set_feb (year);
66
	   day = MonLeiste[mon-1];
67
	   TpPars->dvon = make_date (day, mon, year);
68
	}
69
 
70
/* Überprüfen der Daten */
71
 
72
	if (TpPars->dvon == 0L)
73
	   return 2;
74
 
75
	if (TpPars->ragab <= 0L)
76
	   return 8;
77
 
78
	if (DateToDay (TpPars->ragab) > DateToDay (TpPars->dvon))
79
	   return 3;
80
 
81
	if (TpPars->abschlry != 1 && TpPars->abschlry != 3 && TpPars->abschlry != 6 &&
82
	    TpPars->abschlry != 12 && TpPars->abschlry != 41 && TpPars->abschlry != 43 &&
83
	    TpPars->abschlry != 46 && TpPars->abschlry != 47 && TpPars->abschlry != 48 &&
84
	    TpPars->abschlry != 52)
85
	   return 11;
86
 
87
	if (TpPars->abschlry > 40)
88
	   TpPars->abschl = 0L;
89
 
90
	if (TpPars->abschl > 0L && DateToDay (TpPars->abschl) < DateToDay (TpPars->ragab))
91
	   return 4;
92
 
93
	// Abschlußplan erstellen
94
 
95
	for (i = 0; i < 12; i++)
96
	   AbschlPlan[i] = 0;
97
 
98
	switch (TpPars->abschlry)
99
	{
100
	   case  1:
101
           case 41: for (i = 0; i < 12; i++)
102
		       AbschlPlan[i] = 1;
103
	   break;
104
 
105
	   case  3:
106
           case 43: AbschlPlan[2] = 1;
107
		    AbschlPlan[5] = 1;
108
		    AbschlPlan[8] = 1;
109
		    AbschlPlan[11] = 1;
110
	   break;
111
 
112
	   case  6:
113
           case 46: AbschlPlan[5] = 1;
114
		    AbschlPlan[11] = 1;
115
	   break;
116
 
117
	   case 12:
118
	   case 52: AbschlPlan[11] = 1;
119
	   break;
120
 
121
	   case 47: AbschlPlan[2] = 1;
122
		    AbschlPlan[8] = 1;
123
	   break;
124
 
125
	   case 48: AbschlPlan[1] = 1;
126
		    AbschlPlan[7] = 1;
127
	   break;
128
	}
129
 
130
	if (TpPars->fixrate == TRUE)
131
	{
132
	   if (TpPars->rate < 0.0)
133
	      return 16;
134
	   else if (TpPars->rate == 0.0)
135
	      return 15;
136
 
137
	   TpPars->dbis = 0L;
138
	}
139
	else
140
	   TpPars->rate = 0.0;
141
 
142
	if (TpPars->dbis > 0L)
143
	{
144
	   date_int (&i, &akt_mon, &akt_year, TpPars->dvon);
145
	   date_int (&day, &akt_mon, &akt_year, TpPars->dbis);
146
	   set_feb (akt_year);
147
 
148
	   if (i > MonLeiste[akt_mon-1])
149
	      i = MonLeiste[akt_mon-1];
150
 
151
	   TpPars->dbis = make_date (i, akt_mon, akt_year);
152
	}
153
 
154
	if (TpPars->dbis > 0L && DateToDay (TpPars->dvon) > DateToDay (TpPars->dbis))
155
	   return 5;
156
 
157
	if (TpPars->endfaell > 0L && DateToDay (TpPars->dbis) > DateToDay (TpPars->endfaell))
158
	   return 6;
159
 
160
	i = j = 0;
161
 
162
	while (i < 12)
163
	{
164
	   if (TpPars->raplan[i] > 0)
165
	   {
166
	      j = 1;
167
	      break;
168
	   }
169
 
170
	   i++;
171
	}
172
 
173
	if (!j)
174
	   return 7;
175
 
176
	date_int (&day, &mon, &year, TpPars->dvon);
177
 
178
	if (TpPars->raplan[mon-1] <= 0)
179
	   return 18;		// Ungültiges Datum "Von"
180
 
181
	if (!TpPars->fixrate)
182
        {
183
	   date_int (&day, &mon, &year, TpPars->dbis);
184
 
185
	   if (TpPars->raplan[mon-1] <= 0)
186
	      return 19;		// Ungültiges Datum "Bis"
187
	}
188
 
189
	if (TpPars->verzart == 1 && TpPars->abschlry != 43 && TpPars->abschlry != 46 &&
190
	    TpPars->abschlry != 52)
191
	   return 9;
192
 
193
	if (TpPars->abschl == 0L && TpPars->abschlry < 41)
194
	   return 10;
195
 
196
/* Verzinsung */
197
 
198
	if (TpPars->verzart == 0 || TpPars->verzart == 2 || TpPars->verzart == 8)
199
	   verzinsung = 0;
200
	else if (TpPars->verzart == 3)
201
	   verzinsung = 1;
202
	else if (TpPars->verzart == 7)
203
	   verzinsung = 2;
204
	else if (TpPars->verzart == 4)
205
	   verzinsung = 3;
206
	else
207
	   return 12;
208
 
209
/* Ratenart */
210
 
211
	if (TpPars->ratenart < 0 || TpPars->ratenart > 3)
212
	   return 13;
213
 
214
	if (TpPars->ratenart == 0)
215
	   reh = 1;
216
	else if (TpPars->ratenart == 1)
217
	   reh = 2;
218
	else
219
	   reh = 0;
220
 
221
/* Divisor: */
222
 
223
	if (TpPars->tageb == 1 || TpPars->tageb == 2 || TpPars->tageb == 7 || TpPars->tageb == 8)
224
	   divisor = 36000.0;
225
	else
226
	   divisor = 36500.0;
227
 
228
/* Berechnung der Laufzeit, Abschlußdaten und   */
229
/* Erstellen einer Datumstabelle */
230
 
231
	if (TpPars->fixrate == TRUE && TpPars->endfaell > 0L)
232
	   TpPars->dbis = TpPars->endfaell;
233
 
234
	if (TpPars->dbis == 0L)
235
	{
236
	   tage = (99L * 365L) + (99L / 4L);          /* 99 Jahre = Maximallaufzeit */
237
	   TpPars->dbis = DayToDate (tage + DateToDay (TpPars->ragab));
238
	}
239
 
240
	if (TpPars->ultimo)
241
	{
242
	   if (TpPars->verzart == 3 || TpPars->verzart == 7)
243
	      day = 1;
244
	   else
245
	   {
246
	      date_int (&day, &mon, &year, TpPars->dbis);
247
	      day = MonLeiste[mon-1];
248
	      TpPars->dbis = make_date (day, mon, year);
249
	   }
250
	}
251
	else if (verzinsung == 1 || verzinsung == 2)	/* Antizipativ */
252
	{
253
	   date_int (&day, &mon, &year, TpPars->dbis);
254
	   day = 1;
255
	   TpPars->dbis = make_date (day, mon, year);
256
	}
257
 
258
	if (TpPars->endfaell > 0L)
259
	   tage = DateToDay (TpPars->endfaell) - DateToDay (TpPars->ragab);
260
	else
261
	   tage = DateToDay (TpPars->dbis) - DateToDay (TpPars->ragab);
262
 
263
	if (tage > 36525L)
264
	   return 14;		/* Laufzeit über 100 Jahre!! */
265
 
266
	if (TpPars->abschl == 0L)
267
	   TpPars->abschl = TpPars->ragab;
268
 
269
	date_int (&vday, &mon, &year, TpPars->dvon);
270
	date_int (&day, &mon, &year, TpPars->ragab);
271
	date_int (&at, &am, &aj, TpPars->abschl);
272
	akt_mon = mon - 1;
273
	a_ind = r_ind = 0;
274
	pos = 0;
275
	abschluss = FALSE;
276
	r_yet = FALSE;		/* Nur TRUE wenn "a_dat" < TpPars->dvon */
277
	lab = 0L;
278
 
279
	while (pos < tage)
280
	{
281
	   set_feb (year);
282
 
283
	   /* Abschlußdatum */
284
 
285
	   if (TpPars->abschlry > 40)
286
	      akt_day = MonLeiste[akt_mon];
287
	   else
288
	   {
289
	      if (at > MonLeiste[akt_mon])
290
		 akt_day = MonLeiste[akt_mon];
291
	      else
292
		 akt_day = at;
293
	   }
294
 
295
	   a_dat = make_date (akt_day, akt_mon+1, year);
296
 
297
	   if (!abschluss && (verzinsung == 1 || verzinsung == 2))	/* Antizipativ */
298
	   {
299
	      ab_dat[a_ind] = TpPars->ragab;
300
	      lab = TpPars->ragab;
301
 
302
	      if (!abschluss)
303
	      {
304
		 TpPars->abschl = TpPars->ragab;
305
		 abschluss = TRUE;
306
	      }
307
 
308
	      a_ind++;
309
	   }
310
	   else if ((verzinsung == 1 || verzinsung == 2) &&  	/* Antizipativ */
311
		    test_abschl (akt_mon+1) && a_dat < TpPars->dbis)
312
	   {
313
	      a_dat = DateToDay (a_dat);
314
	      a_dat = DayToDate (a_dat + 1L);
315
	      ab_dat[a_ind] = a_dat;
316
	      lab = a_dat;
317
 
318
	      if (!abschluss)
319
	      {
320
		 TpPars->abschl = TpPars->ragab;
321
		 abschluss = TRUE;
322
	      }
323
 
324
	      a_ind++;
325
	   }
326
	   else if (test_abschl (akt_mon+1) &&  	/* Dekursiv */
327
		    verzinsung != 1 && verzinsung != 2 &&
328
		    AbschlPlan[akt_mon] && a_dat > TpPars->ragab)
329
	   {
330
	      ab_dat[a_ind] = a_dat;
331
	      lab = a_dat;
332
 
333
	      if (a_dat < TpPars->dvon)
334
		 r_yet = TRUE;
335
 
336
	      if (!abschluss)
337
	      {
338
		 TpPars->abschl = TpPars->ragab;
339
		 abschluss = TRUE;
340
	      }
341
 
342
	      a_ind++;
343
	   }
344
 
345
	   /* Einschränkungsdatum */
346
 
347
	   if (TpPars->ultimo == TRUE)
348
	      akt_day = MonLeiste[akt_mon];
349
	   else
350
	   {
351
	      if (vday > MonLeiste[akt_mon])
352
		 akt_day = MonLeiste[akt_mon];
353
	      else
354
		 akt_day = vday;
355
	   }
356
 
357
	   r_dat = make_date (akt_day, akt_mon+1, year);
358
 
359
	   if ((TpPars->raplan[akt_mon] && r_dat >= TpPars->dvon &&
360
	       r_dat <= TpPars->dbis) || r_yet)
361
	   {
362
	      rat_dat[r_ind] = r_dat;
363
	      ldat = r_dat;
364
	      rat_anz[r_ind] = TpPars->raplan[akt_mon];
365
	      r_ind++;
366
	      r_yet = FALSE;
367
	   }
368
 
369
	   akt_mon++;
370
 
371
	   if (akt_mon >= 12)
372
	   {
373
	      akt_mon = 0;
374
	      year++;
375
	   }
376
 
377
	   pos = DateToDay (r_dat) - DateToDay (TpPars->ragab);
378
	}
379
 
380
	if (lab != a_dat)
381
	{
382
	   ab_dat[a_ind] = TpPars->dbis;
383
	   a_ind++;
384
	}
385
 
386
	TpPars->dbis = ldat;
387
	max_abs = a_ind;
388
	max_rat = r_ind;
389
 
390
/* Start der Berechnungen
391
	Ratenberechnung */
392
 
393
	a_ind = r_ind = 0;
394
 
395
	if (TpPars->fixrate == TRUE)	// Besteht eine Ratenvorgabe?
396
	{
397
	   TpPars->ergrate = rat = TpPars->rate;
398
	   return gesamt1 ();
399
	}
400
 
401
/*	if (rat_dat[r_ind] < TpPars->dvon)
402
	   while (rat_dat[r_ind] <= ab_dat[a_ind])
403
	      r_ind++;
404
*/
405
	if (rat_dat[r_ind] < TpPars->dvon)
406
	   while (rat_dat[r_ind] < TpPars->dvon)
407
	      r_ind++;
408
 
409
	dat_par = TpPars->ragab;
410
	tageber (dat_par);
411
	kap = TpPars->rahmen;
412
	rat = 0.0;
413
	ab_tag = tg_par;
414
	vorrech ();
415
 
416
	while (r_ind < max_rat && a_ind < max_abs)
417
	{
418
	   if (rat_dat[r_ind] > ab_dat[a_ind])
419
	   {
420
	      abschlus ();
421
	      vorrech ();
422
	   }
423
	   else if (rat_dat[r_ind] < ab_dat[a_ind])
424
	      einschr ();
425
	   else if (verzinsung == 1 || verzinsung == 2)
426
	   {
427
	      abschlus ();
428
	      vorrech ();
429
	      einschr ();
430
	   }
431
	   else
432
	   {
433
	      einschr ();
434
	      abschlus ();
435
	      vorrech ();
436
	   }
437
	}
438
 
439
	if (verzinsung == 1 || verzinsung == 2)
440
	{
441
	   abschlus ();
442
	   einschr ();
443
	}
444
	else
445
	{
446
	   einschr ();
447
	   abschlus ();
448
	}
449
 
450
	if (rat != 0.0)
451
        {
452
           rat = (kap - TpPars->kapital) / rat;
453
	   TpPars->ergrate = runden (rat, rund_fakt);
454
 
455
	   if (TpPars->ergrate != rat && rund_fakt > 0)
456
              rat = TpPars->ergrate + (1.0 / pow (10.0, (double)rund_fakt));
457
	   else if (rund_fakt == 0 && TpPars->ergrate != rat)
458
	      rat = TpPars->ergrate + 1.0;
459
	}
460
 
461
	TpPars->ergrate = rat;
462
	return gesamt1 ();
463
}
464
 
465
/************************************************************************
466
   Erstellung eines Tilgungsplans.
467
 
468
   Dieser wird in eine Datei ausgegeben. Die Datei besteht aus einem
469
   Kopf (Übergabestruktur) und einzelnen Datensätzen.
470
*************************************************************************/
471
 
472
int TRech::gesamt1 ()
473
{
474
QString hdir = QDir::homeDirPath ();
475
QFile tmpFile;
476
int fd, day, mon, year, akt_mon, index, akt_day, akt_year, i, j, a;
477
int vday, at, am, aj, zwat, real_rat, Abzug;
478
long tage, pos, ldat, r_dat, a_dat, tg, lab, t1, t2;
479
long tg_per;
480
double zins, tilg, zi1, zi2, kzi, sumrat;
481
long offset, loff;
482
char buf[255];
483
BOOL stop;
484
DTABLE old_tab;
485
 
486
	/* Planerstellung */
487
	hdir.append("/.date_tbl.dat");
488
	tmpFile.setName(hdir);
489
 
490
	if (tmpFile.open(IO_ReadWrite | IO_Truncate) == FALSE)
491
	{
492
	   KMessageBox::error(0, QString("Could not open file for reading: %1").arg(tmpFile.errorString()));
493
	   return 1;
494
	}
495
 
496
//	if ((fd = open ("~/.date_tbl.dat", O_RDWR | O_CREAT | O_TRUNC, 0644)) == -1)
497
//	   return 1;           /* keine Temporärdatei */
498
	fd = tmpFile.handle();
499
	offset = 0L;
500
 
501
	if (verzinsung == 1 || verzinsung == 2)
502
	   index = max_abs - 1 + max_rat;
503
	else
504
	   index = max_abs + max_rat;
505
 
506
	/* Ausgangsdaten schreiben */
507
	write (fd, &TpPars, sizeof (TPPARS));
508
	tmpFile.flush();
509
	offset += (long)sizeof (TPPARS);
510
 
511
	/* Initialisierung der Schleife */
512
 
513
	a_ind = r_ind = 0;
514
	kap = TpPars->rahmen;
515
	zins = 0.0;
516
	TpPars->gesamt = kap;
517
	tilg = kzi = 0.0;
518
	tg = 0;
519
	TpPars->abschl = ab_dat[0];
520
	stop = FALSE;			// TRUE wenn Laufzeitende bei Ratenvorgabe
521
	real_rat = max_rat;
522
        Abzug = 0;			// wird nur bei Ratenvorgabe verwendet
523
 
524
	/* Schleife zur Berechnung der Gesamtbelastung (Dekursiv) */
525
 
526
	if (verzinsung != 1 && verzinsung != 2)
527
	{
528
	   for (i = 0; i < index; i++)
529
	   {
530
	      if ((rat_dat[r_ind] <= ab_dat[a_ind] && r_ind < max_rat) || a_ind >= max_abs)
531
	      {
532
		 DTable.datum = rat_dat[r_ind];
533
		 DTable.kz = 'R';
534
		 DTable.kapital = runden (kap, rund_fakt);
535
 
536
		 if (r_ind > 0)
537
		 {
538
		    if (ab_dat[a_ind-1] > rat_dat[r_ind-1])
539
		       ldat = ab_dat[a_ind-1];
540
		    else
541
		       ldat = rat_dat[r_ind-1];
542
 
543
//		    if (a_ind > 0 && ab_dat[a_ind-1] < rat_dat[r_ind])
544
//		       tg = tageber (rat_dat[r_ind]) - tageber (ab_dat[a_ind-1]);
545
//                  else
546
//		       tg = tageber (rat_dat[r_ind]) - tageber (rat_dat[r_ind-1]);
547
                    tg = tageber (rat_dat[r_ind]) - tageber (ldat);
548
		 }
549
		 else
550
		    tg = tageber (rat_dat[r_ind]) - tageber (TpPars->ragab);
551
 
552
		 zi1 = kap * (double)tg * TpPars->zssoll / divisor;
553
		 zins += zi1;
554
		 kzi += runden (zi1, rund_fakt);
555
		 zins = runden (zins, rund_fakt);
556
 
557
		 if (TpPars->fixrate == TRUE)	/* Ratenvorgabe */
558
		 {
559
		    if (!stop && r_ind > 0 && DTable.rkapi < rat)
560
		    {
561
		       max_rat = r_ind + 1;
562
		       max_abs = a_ind + 1;
563
		       real_rat = max_rat - Abzug;
564
		       ab_dat[a_ind] = rat_dat[r_ind];
565
		       index = max_rat + max_abs;
566
		       stop = TRUE;
567
		    }
568
		 }
569
 
570
		 if (r_ind == (max_rat - 1)) 		/* letzte Rate */
571
		 {
572
		    if (reh != 1)
573
		       zi2 = rat + ((TpPars->gesamt + zins) - (rat * (double)real_rat));
574
		    else
575
		       zi2 = rat - ((rat * (double)real_rat) - TpPars->rahmen);
576
 
577
		    rat = zi2 + TpPars->spesen;
578
		 }
579
 
580
		 TpPars->lrate = rat;
581
		 tilg += rat;				/* Tilgung */
582
 
583
		 if (DTable.datum >= TpPars->dvon)	/* Restkapital */
584
		    kap -= rat;
585
 
586
		 DTable.rkapi = (kap >= 0.0) ? kap : 0.0;
587
		 DTable.tilg = 0.0;
588
		 DTable.rate = rat;
589
		 DTable.zinsen = zi1;
590
		 r_ind++;
591
	      }
592
	      else
593
	      {
594
		 DTable.datum = ab_dat[a_ind];
595
		 DTable.kz = 'A';
596
 
597
		 if (r_ind > 0 && rat_dat[r_ind-1] <= ab_dat[0])
598
		    DTable.kapital = TpPars->rahmen;
599
		 else
600
		    DTable.kapital = (kap >= 0.0) ? kap : 0.0;
601
 
602
		 kap += TpPars->spesen;
603
		 DTable.rate = 0.0;
604
 
605
		 if (r_ind > 0)
606
                 {
607
		    if (ab_dat[a_ind-1] > rat_dat[r_ind-1])
608
		       ldat = ab_dat[a_ind-1];
609
		    else
610
		       ldat = rat_dat[r_ind-1];
611
 
612
		    tg = tageber (ab_dat[a_ind]) - tageber (ldat);
613
 
614
		    if (tg > 0)
615
                    {
616
		       zi1 = kap * (double)tg * TpPars->zssoll / divisor;
617
		       zins += zi1;
618
		       kzi += runden (zi1, rund_fakt);
619
		       zins = runden (zins, rund_fakt);
620
                    }
621
		 }
622
 
623
		 DTable.zinsen = zins;
624
		 TpPars->gesamt += zins + TpPars->spesen;	/* Gesamtbelastung */
625
 
626
		 if (reh != 2)
627
		    tilg -= zins;      		/* Tilgung - Zinsen */
628
 
629
		 if (DTable.datum < TpPars->dvon)
630
		    DTable.tilg = 0.0;
631
		 else
632
		    DTable.tilg = tilg;
633
 
634
		 if (reh != 1)
635
		    kap += zins;
636
 
637
		 DTable.rkapi = (kap >= 0.0) ? kap : 0.0;
638
		 zins = 0.0;
639
		 tilg = 0.0;
640
		 a_ind++;
641
	      } /* end if */
642
 
643
/*	      if (DTable.datum <= ab_dat[0] && DTable.datum < TpPars->dvon &&
644
		  DTable.kz == 'R') */
645
	      if (DTable.datum < TpPars->dvon && DTable.kz == 'R')
646
	      {
647
                 if (TpPars->fixrate)
648
		    Abzug++;
649
		 else
650
		    real_rat--;
651
 
652
		 continue;
653
	      }
654
 
655
	      write (fd, &DTable, sizeof (DTABLE));
656
	      offset += (long)sizeof (DTABLE);
657
	   } /* end for */
658
	} /* end if "Dekursiv" */
659
 
660
	if (verzinsung == 1 || verzinsung == 2)	/* Gesamtbelastung Antizipativ */
661
	{
662
	   a_ind++;			/* Start bei 1! */
663
	   ab_tag = tageber (ab_dat[a_ind]);
664
	   tageber (TpPars->ragab);
665
	   tg_alt = tg_par;
666
	   sumrat = 0.0;
667
	   DTable.rkapi = runden (kap, rund_fakt);
668
	   DTable.kapital = runden (kap, rund_fakt);
669
	   loff = offset;
670
	   old_tab.datum = ab_dat[0];
671
	   old_tab.kz = 'A';
672
	   old_tab.kapital = TpPars->rahmen;
673
	   write (fd, &old_tab, sizeof (DTABLE));	/* Platzhalter */
674
	   offset += (long)sizeof (DTABLE);
675
 
676
	   for (i = 0; i < index-1; i++)
677
	   {
678
	      if ((rat_dat[r_ind] < ab_dat[a_ind] && r_ind < max_rat) || a_ind >= max_abs)
679
	      {
680
		 DTable.datum = rat_dat[r_ind];
681
		 DTable.kz = 'R';
682
 
683
		 tageber (rat_dat[r_ind+1]);
684
		 t1 = ab_tag - tg_alt;
685
		 t2 = ab_tag - tg_par;
686
 
687
		 if (rat > (DTable.rkapi - TpPars->kapital))
688
		    rat = runden (DTable.rkapi - TpPars->kapital, rund_fakt);
689
 
690
		 sumrat += rat;
691
		 kap -= rat;
692
 
693
		 if (verzinsung == 1)
694
		 {
695
		    kzi = kap * TpPars->zssoll * ((double)t1 *
696
			  (divisor - (double)t2 * TpPars->zssoll) -
697
			  (double)t2 * (divisor - (double)t1 * TpPars->zssoll)) /
698
			  ((divisor - (double)t1 * TpPars->zssoll) *
699
			  (divisor - (double)t2 * TpPars->zssoll));
700
		 }
701
		 else
702
		    kzi = kap * (tg_par - tg_alt) * TpPars->zssoll / divisor;
703
 
704
		 kzi = runden (kzi, rund_fakt);
705
		 tg_alt = tg_par;
706
		 zins += kzi;
707
		 DTable.rkapi = DTable.kapital + zins - sumrat;
708
 
709
		 if (TpPars->fixrate == TRUE)	/* Ratenvorgabe */
710
		 {
711
		    if (!stop && r_ind > 0 && DTable.rkapi < rat)
712
		    {
713
		       max_rat = r_ind + 1;
714
		       max_abs = a_ind + 1;
715
		       ab_dat[a_ind] = rat_dat[r_ind];
716
                       real_rat = max_rat - Abzug;
717
		       index = max_rat + max_abs;
718
		       stop = TRUE;
719
		    }
720
		 }
721
 
722
		 DTable.tilg = rat - kzi;
723
		 tilg += DTable.tilg;
724
		 TpPars->lrate = rat;
725
 
726
		 DTable.rate = rat;
727
		 DTable.zinsen = kzi;
728
		 r_ind++;
729
	      }
730
	      else			/* Abschluß */
731
	      {
732
		 DTable.datum = ab_dat[a_ind];
733
 
734
		 if (i == (index-2))
735
		 {
736
		    DTable.kz = 'R';
737
		    max_rat++;
738
		    TpPars->lrate = DTable.kapital - tilg;
739
		 }
740
		 else
741
		    DTable.kz = 'A';
742
 
743
		 DTable.kapital -= tilg;
744
 
745
		 if (i == (index - 2))
746
		 {
747
		    DTable.rate = DTable.kapital;
748
		    DTable.zinsen = 0.0;
749
		    DTable.tilg = DTable.kapital;
750
		    DTable.rkapi = 0.0;
751
		 }
752
		 else
753
		 {
754
		    DTable.rate = runden (sumrat, rund_fakt);
755
		    DTable.zinsen = zins;
756
		    DTable.tilg = tilg;
757
		 }
758
 
759
		 TpPars->gesamt += zins;		/* Gesamtbelastung */
760
 
761
		 tmpFile.flush();
762
		 lseek (fd, loff, 0);
763
		 /* Füllen der Struktur */
764
		 old_tab.tilg = tilg;
765
		 old_tab.rate = 0.0;
766
		 old_tab.zinsen = zins;
767
		 old_tab.rkapi = old_tab.kapital + zins;
768
		 write (fd, &old_tab, sizeof (DTABLE));
769
		 old_tab.kapital = DTable.kapital;
770
		 old_tab.datum = DTable.datum;
771
		 tmpFile.flush();
772
		 lseek (fd, offset, 0);
773
		 loff = offset;
774
		 kap = DTable.kapital;
775
		 zins = 0.0;
776
		 tilg = 0.0;
777
		 sumrat = 0.0;
778
		 a_ind++;
779
		 ab_tag = tageber (ab_dat[a_ind]);
780
	      } /* end if */
781
 
782
	      if (DTable.datum <= ab_dat[0] && DTable.datum < TpPars->dvon &&
783
		  DTable.kz == 'R')
784
	      {
785
		 if (TpPars->fixrate)
786
		    Abzug++;
787
                 else
788
		    real_rat--;
789
 
790
		 continue;
791
              }
792
 
793
	      write (fd, &DTable, sizeof (DTABLE));
794
	      offset += (long)sizeof (DTABLE);
795
	   } /* end for */
796
	} /* end if "Antizipativ" */
797
 
798
	if (TpPars->fixrate == TRUE)
799
	   TpPars->dbis = rat_dat[r_ind-1];
800
 
801
	TpPars->anzraten = real_rat;
802
	DTable.datum = (long)real_rat;		/* Laufzeit */
803
	DTable.kz = 'E';			/* Ergebnis */
804
	DTable.kapital = TpPars->rahmen;
805
	DTable.tilg = TpPars->gesamt;
806
	DTable.rate = 0.0;
807
	TpPars->ezins = TpPars->gesamt - TpPars->rahmen;
808
 
809
	if (TpPars->zuschprz > 0.0)
810
	   TpPars->zuschuss = runden (TpPars->ezins / 100 * TpPars->zuschprz, rund_fakt);
811
	else
812
	   TpPars->zuschuss = 0.0;
813
 
814
//	if (verzinsung == 1 || verzinsung == 2)
815
	if (verzinsung != 1 && verzinsung != 2)
816
	   DTable.zinsen = TpPars->gesamt - TpPars->rahmen;
817
	else
818
	   DTable.zinsen = kzi;
819
 
820
	TpPars->gesamt -= TpPars->zuschuss;
821
 
822
	// Annuitätenzuschuß berechnen und anzeigen
823
 
824
	if (TpPars->zuschannu > 0.0 && TpPars->gesamt > 0.0)
825
	{
826
	   TpPars->anzuschuss = TpPars->ergrate / 100.0 * TpPars->zuschannu;
827
	   TpPars->antotal = TpPars->anzuschuss * ((double)real_rat - 1.0) + (TpPars->lrate / 100.0 * TpPars->zuschannu);
828
	   TpPars->antotal -= TpPars->zuschuss;
829
	}
830
	else
831
	   TpPars->anzuschuss = TpPars->antotal = 0.0;
832
 
833
	DTable.rkapi = TpPars->lrate;
834
	write (fd, &DTable, sizeof (DTABLE));
835
	tmpFile.flush();
836
	lseek (fd, 0L, 0);
837
	tmpFile.flush();
838
	write (fd, &TpPars, sizeof (TPPARS));
839
	tmpFile.close ();
840
	return 0;
841
}
842
 
843
void TRech::init_global_vars ()
844
{
845
int i;
846
 
847
	ab_tag = 0L;
848
	zi_rat = 0.0;
849
	zi_kap = 0.0;
850
	dat_par = 0L;
851
 
852
	for (i = 0; i < 1200; i++)
853
	{
854
	   rat_dat[i] = 0L;
855
	   ab_dat[i] = 0L;
856
	   rat_anz[i] = 0L;
857
	}
858
}
859
 
860
BOOL TRech::test_abschl (int am)
861
{
862
BOOL t1,t2,t3,t4,t5,t6;
863
 
864
	t1 = (TpPars->abschlry == 1 || TpPars->abschlry == 41);
865
	t2 = ((TpPars->abschlry == 3 || TpPars->abschlry == 43) && (am == 3 || am == 6 || am == 9 || am == 12));
866
	t3 = ((TpPars->abschlry == 6 || TpPars->abschlry == 46) && (am == 6 || am == 12));
867
	t4 = ((TpPars->abschlry == 12 || TpPars->abschlry == 52) && am == 12);
868
	t5 = (TpPars->abschlry == 47 && (am == 3 || am == 9));
869
	t6 = (TpPars->abschlry == 48 && (am == 2 || am == 8));
870
 
871
	if (t1 || t2 || t3 || t4 || t5 || t6)
872
	   return TRUE;
873
 
874
	return FALSE;
875
}
876
 
877
/* Runden */
878
 
879
double TRech::runden (double zahl, int komma)
880
{
881
double vork, nachk;
882
long nk, nk1, splitter;
883
 
884
	if (zahl == 0.0)
885
	   return 0.0;
886
 
887
	modf (zahl, &vork);
888
	nachk = zahl - vork;
889
 
890
        if (komma)
891
	   nk = (double)(nachk * pow (10.0, (double)komma));
892
 
893
	nk1 = (double)(nachk * pow (10.0, (double)komma+1.0));
894
	splitter = nk1 - (nk * 10L);
895
 
896
	if (splitter >= 5L)
897
	   nk++;
898
 
899
	if (komma == 0)
900
	{
901
	   if (splitter >= 5)
902
	      return vork+1.0;
903
 
904
	   return vork;
905
	}
906
 
907
	nachk = (double)nk / pow (10.0, (double)komma);
908
	vork += nachk;
909
	return vork;
910
}
911
 
912
/* Tageberechnung */
913
 
914
long TRech::tageber (long date)
915
{
916
int tt_par, mm_par, jj_par;
917
 
918
	date_int (&tt_par, &mm_par, &jj_par, date);
919
 
920
	if (TpPars->tageb == 1 || TpPars->tageb == 4 || TpPars->tageb == 6)
921
	{
922
	   if (TpPars->abschlry > 40 || TpPars->ultimo)
923
	      if (tt_par >= 28 && mm_par == 2)
924
		 tt_par = 30;
925
 
926
	   if (tt_par > 30)
927
	      tg_par = (long)jj_par * 360L + (long)mm_par * 30L;
928
	   else
929
	      tg_par = (long)jj_par * 360L + ((long)mm_par - 1L) * 30L + (long)tt_par;
930
	}
931
	else
932
	   tg_par = DateToDay (date);
933
 
934
	return tg_par;
935
}
936
 
937
/* Vorrechnen */
938
 
939
void TRech::vorrech ()
940
{
941
long tg;
942
 
943
	dat_par = ab_dat[a_ind];
944
	tg_par = tageber (dat_par);
945
	tg = tg_par - ab_tag;
946
	ab_tag = tg_par;
947
 
948
	if (verzinsung != 1)
949
	{
950
	   zi_kap = kap * (double)tg * TpPars->zssoll / divisor;
951
	   zi_rat = rat * (double)tg * TpPars->zssoll / divisor;
952
	}
953
	else
954
	{
955
	   zi_kap = kap * (double)tg * TpPars->zssoll / (divisor - (double)tg * TpPars->zssoll);
956
	   zi_rat = rat * (double)tg * TpPars->zssoll / (divisor - (double)tg * TpPars->zssoll);
957
	}
958
}
959
 
960
/* Einschränkung */
961
 
962
void TRech::einschr ()
963
{
964
long tg;
965
 
966
	rat = rat + (double)rat_anz[r_ind];
967
 
968
	if (TpPars->valuta == 0)
969
	{
970
	   dat_par = rat_dat[r_ind];
971
	   tg_par = tageber (dat_par);
972
	   tg = ab_tag - tg_par;
973
 
974
	   if (verzinsung == 1)
975
	      zi_rat = zi_rat + (double)rat_anz[r_ind] * (double)tg *
976
		       TpPars->zssoll / (divisor - (double)tg *
977
		       TpPars->zssoll);
978
	   else
979
	      zi_rat = zi_rat + (double)rat_anz[r_ind] * (double)tg *
980
		       TpPars->zssoll / divisor;
981
	}
982
 
983
	r_ind++;
984
}
985
 
986
/* Abschlußberechnung */
987
 
988
void TRech::abschlus ()
989
{
990
	switch (reh)
991
	{
992
	   case 0: kap += zi_kap;
993
		   rat += zi_rat;
994
	   break;
995
 
996
	   case 2: kap += (zi_kap + TpPars->spesen);
997
		   rat += zi_rat;
998
	   break;
999
	}
1000
 
1001
	a_ind++;
1002
}
1003