/[lohnrechner]/trunk/LST2005.py
ViewVC logotype

Contents of /trunk/LST2005.py

Parent Directory Parent Directory | Revision Log Revision Log


Revision 60 - (show annotations)
Fri Mar 24 11:28:43 2006 UTC (19 years, 1 month ago) by wilde
File MIME type: text/x-python
File size: 20535 byte(s)
Moved everything in the new subdirectory "trunk" to conform to
repository standard layout.

1 # -*- coding: iso-8859-1 -*-
2 # --------------------------------------------------------------------
3 # LST2005 -- Python Modul zur Berechnung der Deutschen Lohnsteuer 2005
4 # $Id$
5 # --------------------------------------------------------------------
6 #
7 # Copyright (c) 2005 by Intevation GmbH
8 # Authors:
9 # Sascha Wilde <[email protected]>
10 #
11 # This program is free software under the GPL (>=v2)
12 # Read the file COPYING coming with this package for details.
13
14 """Lohnsteuerberechnung nach dem offiziellen Programmablaufplan
15 wie im offiziellen Programmablaufplan des Bundesfinanzministerium
16 dokumentiert.
17 http://www.bundesfinanzministerium.de/Service/Interaktiver-Steuerrechner-.577.htm"""
18
19 __version__ = "$Revision$"
20 # $Source$
21
22 def _ModulVersion():
23 return __version__[11:-2]
24
25 # Die Variablen Namen sind hässlich, die Algorithmen nicht
26 # dokumentiert, der Code grausam -- dafür entspricht alles Zeile für
27 # Zeile obigem Dokument. Jedenfalls sollte es so sein...
28
29 from math import ceil, floor
30
31 # Wir brauchen eigene Rundungsfunktionen mit definierter Präzision
32 def FixedPointFloor(value, precision=2):
33 i = 10.0 ** precision
34 return floor(value * i) / i
35
36 def FixedPointCeil(value, precision=2):
37 i = 10.0 ** precision
38 return ceil(value * i) / i
39
40 # Ein paar Konstanten um das ganze etwas Benutzbarer zu machen:
41 JAHR = 1
42 MONAT = 2
43 WOCHE = 3
44 TAG = 4
45 I = 1
46 II = 2
47 III = 3
48 IV = 4
49 V = 5
50 VI = 6
51
52 class LST:
53 def __init__(self,
54 RE4=0,
55 ALTER1=0,
56 HINZUR=0,
57 JFREIB=0,
58 JHINZU=0,
59 JRE4 =0,
60 JVBEZ =0,
61 KRV =0,
62 LZZ =2,
63 R =0,
64 SONSTB=0,
65 STKL =1,
66 VBEZ =0,
67 VBEZM =0,
68 VBEZS =0,
69 VBS =0,
70 VMT =0,
71 WFUNDF=0,
72 ZKF =0,
73 ZMVB =0):
74 self.Set_RE4(RE4)
75 self.Set_ALTER1(ALTER1)
76 self.Set_HINZUR(HINZUR)
77 self.Set_JFREIB(JFREIB)
78 self.Set_JHINZU(JHINZU)
79 self.Set_JRE4(JRE4)
80 self.Set_JVBEZ(JVBEZ)
81 self.Set_KRV(KRV)
82 self.Set_LZZ(LZZ)
83 self.Set_R(R)
84 self.Set_SONSTB(SONSTB)
85 self.Set_STKL(STKL)
86 self.Set_VBEZ(VBEZ)
87 self.Set_VBEZM(VBEZM)
88 self.Set_VBEZS(VBEZS)
89 self.Set_VBS(VBS)
90 self.Set_VMT(VMT)
91 self.Set_WFUNDF(WFUNDF)
92 self.Set_ZKF(ZKF)
93 self.Set_ZMVB(ZMVB)
94 # Vorgegebene Ausgangsparameter
95 self.BK = 0
96 self.BKS = 0
97 self.BKV = 0
98 self.LSTLZZ = 0
99 self.SOLZLZZ = 0
100 self.SOLZS = 0
101 self.SOLZV = 0
102 self.STS = 0
103 self.STV = 0
104
105 def Calc(self):
106 """Berechnet die Lohnsteuer,
107 setzt BK, BKS, BKV, LSTLZZ, SOLZLZZ, SOLZS, SOLZV, STS und STV"""
108 # Interne Felder
109 # Laut Dokumentation sollen diese vor der Berechnung gelöscht werden,
110 # es ist mir nicht klar, ob das wirklich nötig ist...
111 self._ALTE = 0
112 self._ANP = 0
113 self._ANTEIL1 = 0
114 self._ANTEIL2 = 0
115 self._BMG = 0
116 self._DIFF = 0
117 self._EFA = 0
118 self._FVB = 0
119 self._FVBZ = 0
120 self._JBMG = 0
121 self._JW = 0
122 self._KENNZ = 0
123 self._KFB = 0
124 self._KZTAB = 1
125 self._LSTJAHR = 0
126 self._LST1 = 0
127 self._LST2 = 0
128 self._LST3 = 0
129 self._MIST = 0
130 self._RE4LZZ = 0
131 self._RE4LZZV = 0
132 self._RW = 0.0
133 self._SAP = 0
134 self._SOLZFREI = 0
135 self._SOLZJ = 0.0 # 2 Dezimalstellen
136 self._SOLZMIN = 0.0 # 2 Dezimalstellen
137 self._ST = 0
138 self._ST1 = 0
139 self._ST2 = 0
140 self._VBEZB = 0
141 self._VHB = 0
142 self._VSP = 0.0 # 2 Dezimalstellen
143 self._VSPN = 0
144 self._VSP1 = 0.0 # 2 Dezimalstellen
145 self._VSP2 = 0.0 # 2 Dezimalstellen
146 self._VSPKURZ = 0
147 self._VSPMAX1 = 0
148 self._VSPMAX2 = 0
149 self._VSPO = 0.0 # 2 Dezimalstellen
150 self._VSPREST = 0.0 # 2 Dezimalstellen
151 self._VSPVOR = 0.0 # 2 Dezimalstellen
152 self._X = 0.0 # 2 Dezimalstellen
153 self._Y = 0.0 # 6 Dezimalstellen
154 self._ZRE4 = 0.0 # 2 Dezimalstellen
155 self._ZRE4VP = 0.0 # 2 Dezimalstellen
156 self._ZRE4VP1 = 0.0 # 2 Dezimalstellen
157 self._ZTABFB = 0
158 self._ZVE = 0
159 self._ZX = 0
160 self._ZZX = 0
161 self._HOCH = 0
162 self._VERGL = 0
163 # ------------------------------------------------------------
164 # Anfang der Berechnung
165 self._MRE4LZZ()
166 self._RE4LZZ = self.RE4 - self._FVB \
167 - self._ALTE - self.WFUNDF \
168 + self.HINZUR
169 self._RE4LZZV = self.RE4 - self._FVB - self._ALTE
170 self._MRE4()
171 self._MZTABFB()
172 self._MLSTJAHR()
173 self._LSTJAHR = self._ST
174 self._JW = self._LSTJAHR * 100
175 self._UPANTEIL()
176 self.LSTLZZ = self._ANTEIL1
177 if self.ZKF > 0:
178 self._ZTABFB += self._KFB
179 self._MLSTJAHR()
180 self._JBMG = self._ST
181 else:
182 self._JBMG = self._LSTJAHR
183 self._MSOLZ()
184 self._MSONST()
185 self._MVMT()
186
187 # Benutzte Unterprogramme:
188 def _MRE4LZZ(self):
189 if self.VBEZ == 0:
190 self._FVBZ = 0
191 self._FVB = 0
192 else:
193 if self.LZZ == 1:
194 self._VBEZB = self.VBEZM * self.ZMVB + self.VBEZS
195 self._FVBZ = 75 * self.ZMVB
196 else:
197 self._VBEZB = self.VBEZM * 12 + self.VBEZS
198 self._FVBZ = 900
199 self._FVB = ceil(self._VBEZB * 0.4)
200 if self._FVB > 300000:
201 self._FVB = 300000
202 self._JW = self._FVB
203 self._UPANTEIL()
204 self._FVB = self._ANTEIL2
205 if self.ALTER1 == 0:
206 self._ALTE = 0
207 else:
208 self._BMG = self.RE4 - self.VBEZ
209 self._ALTE = ceil(self._BMG * 0.4)
210 self._JW = 190000
211 self._UPANTEIL()
212 if self._ALTE > self._ANTEIL2:
213 self._ALTE = self._ANTEIL2
214
215 def _MRE4(self):
216 if self.LZZ == 1:
217 self._ZRE4 = FixedPointFloor(self._RE4LZZ / 100.0)
218 self._ZRE4VP = FixedPointFloor(self._RE4LZZV / 100.0)
219 elif self.LZZ == 2:
220 self._ZRE4 = FixedPointFloor((self._RE4LZZ + 0.67) * 0.12)
221 self._ZRE4VP = FixedPointFloor((self._RE4LZZV + 0.67) * 0.12)
222 elif self.LZZ == 3:
223 self._ZRE4 = FixedPointFloor((self._RE4LZZ + 0.89) * 3.6 / 7)
224 self._ZRE4VP = FixedPointFloor((self._RE4LZZV + 0.89) * 3.6 / 7)
225 else:
226 self._ZRE4 = FixedPointFloor((self._RE4LZZ + 0.56) * 3.6)
227 self._ZRE4VP = FixedPointFloor((self._RE4LZZV + 0.56) * 3.6)
228 if self._ZRE4 < 0:
229 self._ZRE4 = 0.0
230
231 def _MZTABFB(self):
232 self._KZTAB = 1
233 if self.STKL < 6:
234 if self.VBEZ > 0:
235 self._ANP = 102
236 if self.RE4 > self.VBEZ:
237 self._ANP += 920
238 else:
239 self._ANP = 0
240 if self.STKL == 1:
241 self._SAP = 36
242 self._KFB = self.ZKF * 5808
243 elif self.STKL == 2:
244 self._EFA = 1308
245 self._SAP = 36
246 self._KFB = self.ZKF * 5808
247 elif self.STKL == 3:
248 self._KZTAB = 2
249 self._SAP = 72
250 self._KFB = self.ZKF * 5808
251 elif self.STKL == 4:
252 self._SAP = 36
253 self._KFB = self.ZKF * 2904
254 else:
255 self._KFB = 0
256 self._ZTABFB = self._EFA + self._ANP + self._SAP + self._FVBZ
257 self._KENNZ = 0
258
259 def _MLSTJAHR(self):
260 if self.STKL < 5:
261 self._UPEVP()
262 else:
263 self._VSP = 0.0
264 self._ZVE = self._ZRE4 - self._ZTABFB - self._VSP
265 if self._ZVE < 1:
266 self._ZVE = self._X = 0.0
267 else:
268 self._X = floor(float(self._ZVE) / self._KZTAB)
269 if self.STKL < 5:
270 self._UPTAB05()
271 else:
272 self._MST5_6()
273
274 def _UPEVP(self):
275 if self.KRV == 1:
276 self._VSP1 = 1.0
277 else:
278 if self._ZRE4VP > 62400:
279 self._ZRE4VP = 62400
280 self._VSP1 = 0.2 * self._ZRE4VP
281 self._VSP1 = FixedPointFloor(self._VSP1 * 0.0975)
282 self._VSP2 = FixedPointFloor(0.11 * self._ZRE4VP)
283 self._VHB = 1500 * self._KZTAB
284 if self._VSP2 > self._VHB:
285 self._VSP2 = self._VHB
286 self._VSPN = ceil(self._VSP1 + self._VSP2)
287 self._MVSP()
288 if self._VSPN > self._VSP:
289 self._VSP = self._VSPN
290
291 def _MVSP(self):
292 self._VSPO = self._ZRE4VP * 0.2
293 self._VSPVOR = 3068 * self._KZTAB
294 self._VSPMAX1 = 1334 * self._KZTAB
295 self._VSPMAX2 = 667 * self._KZTAB
296 self._VSPKURZ = 1134 * self._KZTAB
297 if self.KRV == 1:
298 if self._VSPO > self._VSPKURZ:
299 self._VSP = self._VSPKURZ
300 else:
301 self._VSP = ceil(self._VSPO)
302 else:
303 self._UMVSP()
304
305 def _UMVSP(self):
306 if self._KENNZ == 1:
307 self._VSPVOR = self._VSPVOR - self._ZRE4VP1 * 0.16
308 else:
309 self._VSPVOR = self._VSPVOR - self._ZRE4VP * 0.16
310 if self._VSPVOR < 0:
311 self._VSPVOR = 0.0
312 if self._VSPO > self._VSPVOR:
313 self._VSP = self._VSPVOR
314 self._VSPREST = self._VSPO - self._VSPVOR
315 if self._VSPREST > self._VSPMAX1:
316 self._VSP += self._VSPMAX1
317 self._VSPREST = FixedPointCeil((self._VSPREST - self._VSPMAX1) / 2.0)
318 if self._VSPREST > self._VSPMAX2:
319 self._VSP = ceil(self._VSP + self._VSPMAX2)
320 else:
321 self._VSP = ceil(self._VSP + self._VSPREST)
322 else:
323 self._VSP = ceil(self._VSP + self._VSPREST)
324 else:
325 self._VSP = ceil(self._VSPO)
326
327 def _MST5_6(self):
328 self._ZZX = self._X
329 if self._ZZX > 25812:
330 self._ZX = 25812
331 self._UP5_6()
332 self._ST = floor(self._ST + (self._ZZX - 25812) * 0.42)
333 else:
334 self._ZX = self._ZZX
335 self._UP5_6()
336 if self._ZZX > 9144:
337 self._VERGL = self._ST
338 self._ZX = 9144
339 self._UP5_6()
340 self._HOCH = floor(self._ST + (self._ZZX - 9144) * 0.42)
341 if self._HOCH < self._VERGL:
342 self._ST = self._HOCH
343 else:
344 self._ST = self._VERGL
345
346 def _UP5_6(self):
347 self._X = self._ZX * 1.25
348 self._UPTAB05()
349 self._ST1 = self._ST
350 self._X = self._ZX * 0.75
351 self._UPTAB05()
352 self._ST2 = self._ST
353 self._DIFF = (self._ST1 - self._ST2) * 2
354 self._MIST = floor(self._ZX * 0.15)
355 if self._MIST > self._DIFF:
356 self._ST = self._MIST
357 else:
358 self._ST = self._DIFF
359
360 def _MSOLZ(self):
361 self._SOLZFREI = 972 * self._KZTAB
362 if self._JBMG > self._SOLZFREI:
363 self._SOLZJ = FixedPointFloor(self._JBMG * 5.5 / 100.0)
364 self._SOLZMIN = (self._JBMG - self._SOLZFREI) * 20 / 100.0
365 if self._SOLZMIN < self._SOLZJ:
366 self._SOLZJ = self._SOLZMIN
367 self._JW = self._SOLZJ * 100
368 self._UPANTEIL()
369 self.SOLZLZZ = self._ANTEIL1
370 else:
371 self.SOLZLZZ = 0
372 if self.R > 0:
373 self._JW = self._JBMG * 100
374 self._UPANTEIL()
375 self.BK = self._ANTEIL1
376 else:
377 self.BK = 0
378
379 def _UPANTEIL(self):
380 if self.LZZ == 1:
381 self._ANTEIL1 = self._JW
382 self._ANTEIL2 = self._JW
383 elif self.LZZ == 2:
384 self._ANTEIL1 = floor(self._JW / 12.0)
385 self._ANTEIL2 = ceil(self._JW / 12.0)
386 elif self.LZZ == 3:
387 self._ANTEIL1 = floor(self._JW * 7 / 360.0)
388 self._ANTEIL2 = ceil(self._JW * 7 / 360.0)
389 else:
390 self._ANTEIL1 = floor(self._JW / 360.0)
391 self._ANTEIL2 = ceil(self._JW / 360.0)
392
393 def _UPTAB05(self):
394 if self._X < 7665:
395 self._ST = 0
396 elif self._X < 12740:
397 self._Y = (self._X - 7664) / 10000.0
398 self._RW = self._Y * 883.74
399 self._RW += 1500
400 self._ST = floor(self._RW * self._Y)
401 elif self._X < 52152:
402 self._Y = (self._X - 12739) / 10000.0
403 self._RW = self._Y * 228.74
404 self._RW += 2397
405 self._RW *= self._Y
406 self._ST = floor(self._RW + 989)
407 else:
408 self._ST = floor(self._X * 0.42 - 7914)
409 self._ST *= self._KZTAB
410
411 def _MSONST(self):
412 if self.SONSTB > 0:
413 # ------------------------------
414 # Nicht im offiziellen Programm-
415 # ablaufplan: Attribute sichern
416 old_lzz = self.LZZ
417 old_vbez = self.VBEZ
418 old_re4 = self.RE4
419 # ------------------------------
420 self.LZZ = 1
421 self.VBEZ = self.JVBEZ
422 self.RE4 = self.JRE4
423 self._MRE4LZZ()
424 self._MRE4LZZ2()
425 self._MRE4()
426 self._MZTABFB()
427 self._MLSTJAHR()
428 self._LST1 = self._ST * 100
429 self.VBEZ = self.JVBEZ + self.VBS
430 self.RE4 = self.JRE4 + self.SONSTB
431 self._MRE4LZZ()
432 self._MRE4LZZ2()
433 self._MRE4()
434 self._MLSTJAHR()
435 self._LST2 = self._ST * 100
436 self.STS = self._LST2 - self._LST1
437 self.SOLZS = self.STS * 5.5 / 100
438 if self.R > 0:
439 self.BKS = self.STS
440 else:
441 self.BKS = 0
442 # ------------------------------
443 # Nicht im offiziellen Programm-
444 # ablaufplan: Attribute
445 # wiederherstellen
446 self.LZZ = old_lzz
447 self.VBEZ = old_vbez
448 self.RE4 = old_re4
449 # ------------------------------
450 else:
451 self.STS = 0
452 self.SOLZS = 0
453 self.BKS = 0
454
455 def _MRE4LZZ2(self):
456 self._RE4LZZ = self.RE4 - self._FVB - self._ALTE \
457 - self.JFREIB + self.JHINZU
458 self._RE4LZZV = self.RE4 - self._FVB - self._ALTE
459
460 def _MVMT(self):
461 if self.VMT > 0:
462 # ------------------------------
463 # Nicht im offiziellen Programm-
464 # ablaufplan: Attribute sichern
465 old_lzz = self.LZZ
466 old_vbez = self.VBEZ
467 old_re4 = self.RE4
468 # ------------------------------
469 self.LZZ = 1
470 self.VBEZ = self.JVBEZ + self.VBS
471 self.RE4 = self.JRE4 + self.SONSTB
472 self._MRE4LZZ()
473 self._MRE4LZZ2()
474 self._MRE4()
475 self._MZTABFB()
476 self._MLSTJAHR()
477 self._LST1 = self._ST * 100
478 self.RE4 = self.JRE4 + self.SONSTB + self.VMT
479 self._MRE4LZZ()
480 self._MRE4LZZ2()
481 self._MRE4()
482 self._KENNZ = 1
483 self._ZRE4VP1 = self._ZRE4VP
484 self._MLSTJAHR()
485 self._LST3 = self._ST * 100
486 self.RE4 = self.JRE4 + self.SONSTB
487 self._MRE4LZZ()
488 self.RE4 = self.JRE4 + self.SONSTB + self.VMT / 5
489 self._MRE4LZZ2()
490 self._MRE4()
491 self._MLSTJAHR()
492 self._LST2 = self._ST * 100
493 self.STV = (self._LST2 - self._LST1) * 5
494 self._LST3 -= self._LST1
495 if self._LST3 < self.STV:
496 self.STV = self._LST3
497 self.SOLZV = floor(self.STV * 5.5 / 100)
498 if self.R > 0:
499 self.BKV = self.STV
500 else:
501 self.BKV = 0
502 # ------------------------------
503 # Nicht im offiziellen Programm-
504 # ablaufplan: Attribute
505 # wiederherstellen
506 self.LZZ = old_lzz
507 self.VBEZ = old_vbez
508 self.RE4 = old_re4
509 # ------------------------------
510 else:
511 self.STV = 0
512 self.SOLZV = 0
513 self.BKV = 0
514
515 # Methoden zum geprüften setzen der Wert
516 # FIX ME: Prüfung _sehr_ unvollständig
517 def Set_RE4(self, value):
518 assert value >= 0, "must not be negative"
519 self.RE4 = value
520
521 def Set_ALTER1(self, value):
522 assert value in (0,1), "must be 0 or 1"
523 self.ALTER1 = value
524
525 def Set_HINZUR(self, value):
526 self.HINZUR = value
527
528 def Set_JFREIB(self, value):
529 self.JFREIB = value
530
531 def Set_JHINZU(self, value):
532 self.JHINZU = value
533
534 def Set_JRE4(self, value):
535 self.JRE4 = value
536
537 def Set_JVBEZ(self, value):
538 self.JVBEZ = value
539
540 def Set_KRV(self, value):
541 assert value in (0,1), "must be 0 or 1"
542 self.KRV = value
543
544 def Set_LZZ(self, value):
545 assert value in (1,2,3,4), \
546 "must be in range 1-4 (JAHR, MONAT, WOCHE, TAG)"
547 self.LZZ = value
548
549 def Set_R(self, value):
550 assert value >= 0.0 and value <= 100.0, \
551 "must be in range 0.0-100.0 (Percent)"
552 self.R = value
553
554 def Set_SONSTB(self, value):
555 self.SONSTB = value
556
557 def Set_STKL(self, value):
558 assert value in (1,2,3,4,5,6), \
559 "must be in range 1-6 (I II III IV V VI)"
560 self.STKL = value
561
562 def Set_VBEZ(self, value):
563 self.VBEZ = value
564
565 def Set_VBEZM(self, value):
566 self.VBEZM = value
567
568 def Set_VBEZS(self, value):
569 self.VBEZS = value
570
571 def Set_VBS(self, value):
572 self.VBS = value
573
574 def Set_VMT(self, value):
575 self.VMT = value
576
577 def Set_WFUNDF(self, value):
578 self.WFUNDF = value
579
580 def Set_ZKF(self, value):
581 assert float(value) == float("%.1f" % value) and \
582 value >= 0, \
583 "must be positive, and must not have more than one decimal digit"
584 self.ZKF = value
585
586 def Set_ZMVB(self, value):
587 self.ZMVB = value
588
589 # --------------------------------------------------------------------
590 # Eine etwas schönere API
591 #
592 # FIX ME: Diese API berücksichtigt nicht alle Möglichen Parameter und
593 # Berechnungen, es fehlen insbesondere die Berechnungen zu Mehrjährigen
594 # Bezügen und Sonstigen Leistungen.
595
596 class LStRechner2005(LST):
597 def __init__(self):
598 LST.__init__(self)
599
600 def SetLohn(self, lohn):
601 """Setzt Lohn in Euro.Cent"""
602 self.Set_RE4(round (lohn * 100.0))
603
604 def GetLohn(self):
605 """Liefert Lohn in Euro.Cent"""
606 return self.RE4 / 100.0
607
608 def SetZeitraum(self, lzz):
609 """Setzt Berechnungszeitraum (JAHR, MONAT, WOCHE, TAG)"""
610 self.Set_LZZ(lzz)
611
612 def GetZeitraum(self):
613 """Liefert Berechnungszeitraum (JAHR, MONAT, WOCHE, TAG)"""
614 return self.LZZ
615
616 def SetSteuerklasse(self, stkl):
617 """Setzt Steuerklasse (I, II, III, IV, V, VI)"""
618 self.Set_STKL(stkl)
619
620 def GetSteuerklasse(self):
621 """Liefert Steuerklasse (I, II, III, IV, V, VI)"""
622 return self.STKL
623
624 def SetKirchensteuerProzent(self, prozent):
625 """Setzt Kirchensteuer in Prozent,
626 0 wenn keine Kirchensteuer zu zahlen ist."""
627 self.Set_R(prozent)
628
629 def GetKirchensteuerProzent(self):
630 """Liefert Kirchensteuer in Prozent
631 oder 0 wenn keine Kirchensteuer zu zahlen ist."""
632 return self.R
633
634 def SetKinderfreibetrag(self, kfb):
635 """Setzt Kinderfreibetrag lt. Lohnsteuerkarte"""
636 self.Set_ZKF(kfb)
637
638 def GetKinderfreibetrag(self):
639 """Liefert Kinderfreibetrag lt. Lohnsteuerkarte"""
640 return self.ZFK
641
642 def GetLohnsteuer(self):
643 """Liefert Lohnsteuer in Euro.Cent"""
644 return round(self.LSTLZZ / 100, 2)
645
646 def GetSoli(self):
647 """Liefert Solidaritätszuschlag in Euro.Cent"""
648 return FixedPointFloor(self.SOLZLZZ / 100, 2)
649
650 def GetKirchensteuer(self):
651 """Liefert Kirchensteuer in Euro.Cent"""
652 return FixedPointFloor(self.BK * self.R / 10000, 2)

Properties

Name Value
svn:eol-style native
svn:keywords Author Date Id Revision

[email protected]
ViewVC Help
Powered by ViewVC 1.1.26