From 654157f1749962d4ec5c32cb6915ebf4d90071fc Mon Sep 17 00:00:00 2001 From: Borgal Date: Wed, 19 Nov 2025 20:40:09 +0100 Subject: [PATCH] v1.3.1 - Zahlerlogik verbessert --- backups/DoMiLi_Backup_2025-10.pdf | Bin 34650 -> 35880 bytes export.php | 19 ++++- history.php | 14 +++- kasse.php | 5 +- participant.php | 111 ++++++++++++++++-------------- zahler.php | 64 ++++++++++++----- 6 files changed, 136 insertions(+), 77 deletions(-) diff --git a/backups/DoMiLi_Backup_2025-10.pdf b/backups/DoMiLi_Backup_2025-10.pdf index 168d89152d83b438dcf2d15a67f4a5e994dd8ca8..fd4761ad2912c8995e3e7373a65e8d9aa098f661 100755 GIT binary patch delta 20885 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 B0z3c! delta 19670 zcmagEV|1j!zlA%oZQHhO+qP|XY}>}fww+8ku`|)cwr}Qt&OP^>Pq$b1s#>*rb=Qk} z_TImGe`Wx$#{t)u070-bu`z#tlBPr95Zj3{TbK_0_zhrJxj8N0tLSm)Eb9mOzf2^XdEU$xQS;OF zQbk>zGYHU+Ss$&(sinKIY&3*5W?yKEti`XG_&tzHTU(6bOo^+cPHP&CHYq$;v96V; z)m+he)Y&CXme^#QD!ub0_ZV4ER@7$pRGvH4lQA4V)Q~l%$SO_!5jPx<%segZC* z*z!jXHxTIaSEIkyz1|;1rmZwEUR|b7m@^CQCJS?;3aQ=-sn&aOUy-QnYN4+4)0Cg_ z|2o&>@-qCbsHSy-!>N0jT2~$?5zjw?sz}b z7VhiglUtQp$jNfHf174KYKig{ZvhCgXp5bt*v@ITFq47G%U0BOE{W`<%59kby=Rgy zREOL#r#h*mziZ8>1F{*Q1Nb=cAmyn28s;@PnU|#%sq9QuWlgKI&*G@i6mMZSn*}4W zNMeeuie%jT8@W~ z-YMst2C^g*GhuWf>YQbzZ5J{DwJ^}OU7fb_xO|k(;lT~^H#JE~W4dL_nti>HF1s+< z)^(_zD$j-lGmT_w9SV^vG1lE{WshWPbjU5x%U!RP(kNWtw&0V z12zr0w4C5nE-7t-zPR=yjS65SsyvU-8YY*;DL!*Q*Pu5Y7Wp>+w}!6Mg+L3&a3jSui~`Mc4q{cFE?9jjs`S(S(cbWWH4CqpzfNwu?-gbE#!bC=U_144OyfQ{5>fHq8v8+i=ts;e0 zV3;clW@^z_h5yPtNe5K`6*n5hAqC1Qz#6c#p z&p}ufB0ZuYCYM+81CWOKOU67q@&AEH+?oJlvM7;)EtQH<2YWHpDjAo@9v+^*OT>^) z#z=JMCX9`c=E1`Z9q)BSVQ3ftVdyDssue#11KKU^E9*wm59_UdbDy1DO=;z{P!;IX zPwd;i+gtx5HWCRjjIxyxk?|rTM)0?waJ*|CGcf1d>4;DQZxu+9V=xN zX^WqQtQAOBW~Qm%^GHo}LnZ0D1!J>tPX5_IGS#!$DlAxWqFv?CVYjs6!Zo{}mt{`- z);aOh-zZ=19OX3-!#WuQi2@%{LU8!%7Fp}pjWEXnKx~r}uYO2!RAF2uqX?GaUPOO5 zegQ}z##RB|i;GB3pHfc0nOYKJ5;(Dj)eEYWrCTwpJED03$Vyyv{iL5#+&vUVUpRP7 zt*k+T!-S-}L~zdxYk@A6d(y%mG=<7%V>NbWk-4m@oKHo4+-1Wohi{eo{`U6WTchXN z7#`XYkaNMJ)y0>yJ(!?#6OfETmczWjI&Kjq#I5#YvZ5?N{(*i#3D_BQff)*Y67w*R zNt!R&I!m1Ni2Hz-*A8puBr7M{CdPRMv$S@CUyr1bhQ>V@1$+(8GGR;5hCkLh7_+6q z+ZB@G4RsC6bQTg0ek@NY_#Dd^v3QeEyh7*^fP^h73fCC#h)V3^`&(2%dWntQdHmwJXNesH z!0cp_J*hIVOj%(_VoHz6l^nB(y>H6voJ}J?t7GfZAiHNruK>?ePa6J__8&UUrR^VV zZvE}lql;hvE6i+f=ix8`nD;#ml|e9Z<-x-c zs&CYMH^rD-3nB}ZC={2&>?`|#q%gCA&FR?9AkqJ@g&w9RHh0Y4V`4*X@{VH3q_snL zD?4|x$wY)7O!afy%+iwD1?$wlyQ>}NDziRVaz3_s(k^%NmO<7WQbDq5ikPdJ!5KNR@Rc* zeqn9_4rF8w6)Q(E6%+iyb)I2W-kNi^372n}J=r1@6NQ2pK|=T+l9)v}aS)1caT5IJ z))ke_DcYA{egZLGjKBM@dpClM1kP9&d)T%z$hV#raZNfn17|)n)(8WFiTcu4@E^+f z|Dg)OG%i)bVP^eg7PWI%}XW?wvACK)90u`-;MM90e6Q8)`%F$?#&!+hz^l%z40 z9HQ|42E9Zk894DV>-#Ij7i{rLG3URKP(uLV@u>HDT4xtxpeevG55c_3i>>Ub?%OJJ z>t^OVI~&K`F2PP)(3`l|k8tAo;DJeA2?SFhK$&A(WRzKY_E1GQ%H;MrRI5g$`xLrC zgSHlFgs(*2dt*Yu1mdknna8;aRHF3^9x9P(kOh1?sJ6G5t0BN zOU#k+IG_RyY~CUZ2~6vbx6pthi$brYE(1HZ)FH*I-&Ns__%5>^pj~FQa{8jW*P0_p zh&Nr`qG`_Eb8ucr9MWUf;fXQ%3F(YtSo+7|-4O((CJ#g7j|U0qDDwxQ^9N#8!pD+k zf#3h$9Wsygk0_$rCz_>LNLHmL0KAd$TE_ty%j(q z@eYd^Q!tq zG~1A=f957|8IycJ5l7F-d)v4;+6>vj)ysJ`kc{iRO%|SnB59}QFtvjNUz*DDXPRXNV;E6w~g>qx8i%E@HLDKmG`eB zcXo$P5fV<(7M8N-WES@ME18c?wew!*e8HQ#7yl0?>d`206TSbo_P~I^qq(CNOnrL^ z+z=E2|2bzX$8RZrNH900k%N~9NCtzXgF|GyOjjOFi2oZhKACz3-E`~l@1(%5tYI+F#jT$9Ykt-NFH8P441(uqG_}4*DFydM&tsqx&23m^E%ft%Bg3a0v_JxZw2?y-F z4baIe!tKMahA#gO)5*l#3G;D20%sGO=)ZzV?J^?A@FK(bb3r}#+UHw38N>^jZjk_e zpe)Z3%&ZYiCYjqm=z%d?kRyy^V`kCrKt-z~nCl~$4KmC|7=afP5S0`;fvVgfKedyr zU~`RP(8`nhW=YIDbjIE(L37a;N5TKGju-%$`aNK|ZtX%&)3t!CI$OH)?g3m!r(=IG_ zACxM~e0&M~J`@{9pcYC9I_f`%Z35xRepk8})aw}*!S<46QSg$dVX!JsUP)fqD(+18 z-9$awu`*Zl$cy*=TUCjnWuAJq;|uZQf4xw?`}V7|Eg0YJAA{;A zFP9~{q z0I%Q4P;gzvmLO%-8CH^+u*OIbko-B0YVq3RZQE$k5!EnvZf}RMb7uTeDfM_Pwb5*+ zb9R=UpWiG8cv&*Y|J({vsRq<-yq>*wb$$-`Ki^DXcmUimvs!V^tnjl6FHXA%&iZ_p zmh?7;UoXY<08ds+8im%CwbmCcZ7aP|YI*?GrKP^gol1%vtw&Nwjpz4?CB7{tG5pPH}W_?JY$y83jaHm zk3A?`c>sHULyf`G?^;A8GmmTKYt(b`gC*Fr)lFfSMkZk5dSnRHx~>1L33$#OY2}+s6Z5z z)Aij`BKYaeCkU5UXp0z^-)&mbX=a?B8{Xnq3;+v{kCTTBQAc$ul*xJ8h4zVI?vjh3 zlA<C$0$_AORT`--gUW{GS>4RUZcDlx`oN z1D!{_O62OH3$3!RYyhLggAgY(qg7H1KE-t7l> zCjbH~&=d_>vCUfiqLj6^16r)MkvJ_jUnvBqK(EhEo#dsV@d;<%?p`YXI3pOh%{+dnc3+Z zGKYM}R}ZmmARt;-<@@%r%p{qtoRsq2TTXxG{|J_T|N8XzG2`YWfI|T2;o#YiveagiWB(1ImLB2# ze-S#Od4*S;DJhkNk`jBf2E6#hZHpMSBtY4)aDe_WCy0o33)2O?o-ej8G9Vs$_*rHhDgZ`3IOPkeY*L__IN^ufpaI2^DT zL0|#ukGYmdto)rb78SD=E$tGJ(Ek&XRZ{r1`E+wOBidDf|6LNQf$vKK49;QEnB3k# zGAx8|NK~+?X?b!0w7lBp&ck%LdGE5IC3U6N*V2XBrLlwbpOOXexEd}Hl7!u8s{nbK z=}B@hS*X2aOuG_)tveXDv(@=D6xhV06X{>0kEQi?#_Ub1Wy}ocoQw%5p_jtZEff5kRFZ0ouh;z> zPYT5Y^YD>T`hv^vI$Y8o@fhu{y>H1WSX2SlI0a{zlI@stkdQc22-tg&5U5lLxKb=b zyhA8vJ%y;y46jVmJOL8}4qumko{$JV81oRENg9rO^`GT+t!IKx%%LdI&j~BOd{cDt zORuR9e*-8^hM$Y@b?FL!`a|{dbfKWV^=76!nov-Wc4&FqaZwS{QH++Jq>E|C;kDun zX6F9H934%%3BM3E5beAYc8Tg2&My%-;9j%vDR0>Y$NPlP1dK)0MF`?WP0J(}I#} z5Z>9z&ND7E*88hG;Fo}FxCX16WB8GMb60=t<5U%%Xxuw$mnD*9I(9ztj+CNOT}8|uG|VXb$uGHj!wGdyYm zJ8zxuzYJ@R0O7%aaHp0(r<6Yz%~^FqZJ0b2Fw$skAG2>f1>o@v(1U??v9X3K)kmKl zfga)VWdE5b;G3bcHT~a7xwyptnszu8DjbprTG5;|8609H@`|HTHw!nSS%a?xYfU;i z_&Xs6%pVBOvQ_0#;C!zdE=uXEeA#wZDnzR~FG&{S@1h&#h@^U4L4l>CLLi<|)?qO~ z1d@_s!D=M>22)xGW`FCAi8{%^7h~C2>j>&Qw&i_w19%Mzbl@bpj{O9hk$)SNJ+J!7F6u#M7w? z=m`evjz1s;w8{OAv5GfY#49X_r4}M^JLrY9XPyV-kn~WL|2rSE4V2o5Hb(vUWdVz9 zhE4iQyVmL(AwT5?fF0^qQ72%5p8<^nX7N05$R11)|AO-(q0SFD;v(=hV9sw?bT6X* zTDUGVd~zXLe9g*xDHCU$Y8AXgY$Dj3eDJUAG^iuJIP0xsKp_6I-s!ULwoP#B6>_g1 zG6&^wl8k2y#(#0)8QnSG8GCp;HF@jRud5vcczbPnIrM#`eJZT@JsiEGLRH4aZ~~>JhTC5$dq8GwBhsGZE@=vT!C_(26Iw(TXM` z(3RUWvHu^BJu?X%%!mj!SJ=|JtbTF#C9tF@j6tvJNEGPu$9yov2)W@m(IMxFTHjqW zqgLIvQ=VUsD9VcJMvBg+OPkEeonM3m@BTx+XWcgJ|8mm*x+&*PPY~bs*$(PQ0p$)7 z(%g@arV9E%asUfED>Q?wnZ1RpB_TT}E7SjR(@S1HzNliY0JZ$uOD~04Q}f%5iKzo7 zFGNBnA}F8`BrvZ?B}AZ5IYLn1AAyh&iE!~UgEAn*N=*Gf`-urh$Bls_3V=k%>FNK} zYPh3C1lfb$7quHHyC`@>>}_}T?eqWuAN+lp6_=H#-Z@84Ia%Z>h{ohFPzi%pDp4}B z2EP^Rk7(1ntyYb;Nd*)j-3)oWZtwS)MHWmZRxe{O0Qu}6kraThSQ$c5#rzdH2LDD` zU;V7m3vb)Ea(@24d%m@c!AB`!-NG>od3y5u3vprN$!jl5@tb?9EsgEpf|5CaAQQ>8 zsap!-=y6YB-Y9Os?Iy+hLEjsJG4Hiz z9|<#afmM<^iX?9g_c&5&he6TJ_=FwJw+}&I?iOkJo_wUsPJ=H}-a%&hy4x!LlJy_m zzZSfBiO~H&k{{n__w66QZl#t0;(^N!#KbQk+bR(RHc8T4CsMBoLI?QH3|Mke6Q;`2 z_(UudxByjaRcqH066D|NN@Hfb?Yjc;*}`RsV-x2(V`4KBGotbm{86}ZtP=3z?h@N^ ztfJdd-B@1xFo!A|<>*PD20!0c2!O26p+u<74m1>Cha>K@BSSSKg>8oc@c(26tO-?9!f_2i2N|5U=rPL zh$|3fCTJUCr;z!{GpFPqp}`Ikv=8=8>(r4UZ_BlxjA|rX1%_%3QBDk*9KicbTKSch-yV0w_9}#K7Dz>;dpkdvxc(n*7q0{gY zWDk>F++W%^YT8X>>=!YT$q47~XiBkrHZmr%mH0<5~8`X}fGea?pg> zP2QxP{J)RVQqn00o1d%{IV3{huvsab=E~gXa^6@>Qc)|ElhbyfP zJN)srCoCVKfWkX#h;6UE)^nLFf$mb;yf3}|K6p3%xcBnJMni?Y7-rQIKef-F2@AOM zb*a2WU+X1o^VCN+C-e%aKoZpyBXyqry9+WWm6*E4U8Dsoqyfb3%VEAnuqmy}HZ^v? zG}6&7qMav-g#04gRyEEUq!1@SPfO*)GrmPJ>r6}?aGOvEo3)|!f)>nZIBoMz+Q)ix zTwE-W$wyYrnuFv-JS@QpGWKp9nz+jnT&fT&K|*5Q zNA4+WY)+XwoF7c40xPwm94f&?WTlC04cS>}5BRX-eJaxg4@Ha67f5@MYr``F-LK%p zlH~L!s8u`#O0bl1j%}6l-o9`nNeL|n3{m4apj&$TJoZr$#4|!Dv0FN0yAn&x>`&P& zW#w!^Qp(@SN}MYH80fv}+}B89oTdt83VDc^RAW`YcQj)j;jJ-uhw_Pc);{K&V5@xu z{>M=Xf*z+Gn&P$0i+8T7RD;jIJfFckfcMsFJ~ua?Bo)?_TA^1PHeD%lli&#@WG0PF zfaEw?C~qyD^msF`Q>=wrf6C9NVeewzgg-72h?a8++H60q;MzWog@wkPoO4E?*> zEylVZBI(vzcL zJ(x~j@zGln&?rLfX#(L4mI?D!q?RD%D`?s#o)c6M%{|DmO^4>l+8`$*KYIKXeTp6MNK~!cV>WrZq|$CCH(ezT8+T4;D5-X;fgZ?^ECp+m zdnc;97Eb4@;MEfwdJ&YJ-|L{TOiYW=VIn2@5lJdu9)hH^c)a4={ zp)A^8=(|;9Bdn_5d<@;yU6h<;b1XdvVVap({e)wJ*pmsJ6JEynlgZA9vt?Txxk^zhr5Q$b8f*6K!PAjDnkmwn6&R5r&LjX0IcCp?c978XQW_u2J5? z7ySllnT^y{<6_AP838If^9}JKv8v~eBDh}-Bu6CfWhNbrbtaO}LDyq(8{@Oyiig9J zgqF&wgvto_L`5aU>Dc7!jX|%p9g6ypFk(m}b%#Xl*ZD(zMiz_bB03_syV&Hn`t=yA zrn$7MKMPbG2#?{stywVdLEsvHaHF=*jNfx3QnEg$l-WT%*e2rwSHfF7Q_3%6T`FqG#bS)^(xLu|-ZQzHwQ!!&Zbe!du z=vSmQcR5~kmY zdX*leJF%Q_6Lpu&O7PrX*iMDWhvrClQn5r0pqX=>u>r;LVOwij5i8(mb#B=DXA!k9 zb;S|e5~!7s{93;u9?V|lygxt{{ouaUP5-3bw|k$tQ|k>2tp-dvuzgviT95!H;UmNC zHRiWBj2EA_b>r&0T5nHYS&8^Yr6o#a7-o~c#eLum6D8Q8)1Ir2ySoLWm33gO=>^4O#VVhZweBx(s5#Nt#c3GgpFKE3d#mO;$iE)nu7kbHx3u- z03hJHb>9t3e6r1)8xRnJNyGP4o7&1ubSf-86c!(SJTP6)*Z!INC^dhMae_>fNDtv; z@;65|N7bNIXEdiyW!bdo%{c2kwoDDbO=XVD&9vRH4gS_Lyxjc4w;*XPb5Zv!M&Sfx zZ*ouMhGM^NbU)DL2Oc4;BfMkNrE?j*3Sei8F?p(lB{Xv;)BYnwi<$;X+qleWx9J8=QVt=%+_|{kZ0(gin$hV!u(-$j;&eIpu?!qr?CJnu z=Wp~>8(Ue;lGu<>3XzvJ2F52_NWOK3Ttm*FS@Ho+1dW2qw~$#giUiMg$MN%|1fV2G z5x%0++?i$mXaoObW8Z2+zMh3AK0Bg|EJt!*T^8pZ_!1b9a?PUOOEj1;-oWV8YC5*DWf-uK>82&8 zB*A#rh{_1%m_dxC4QoiSI8iwfJ^)Cm))~RLR9w0~w@9*B1%V!W3zdcbwj*3_V%tkk z&DD0R{lICwrKDn${gfn{$~c5V#lQQ#*3~nDrksSmVvi=(%aNwnvkjeWF_I3dAH9kO zA-%J#)hohJh2rlKVjRLr`!;I5ebwpD@Loa%+|18ME}nDM^@KF0V%0HvW&q_Q;`V@p zX9=8>ltA40$27@N2o=&U{!!@?&o!&cxF?ZfA3!xRO14^gGPE7HO(BIi1_!4Unj~io zkT6f;^K0j?_@3jI|rb@U~c+}=_-E^m+<{8rgujyak|&SS;QR@pFW z--B>IBlLCOC(dXkXbV=6Kz%5!SK2$TXjRRqmPJFCx-4BfuWp1e0??0b`FI_^sp=E> zmA}(rvbCPev!Y+>?*DS?@ebWGaD)+$*X4OKRBW(vgW!epg^t(s<72k)lhrZxD+lB!-4$8f>|h3ed@9%c)bbgDE(?FVs^CFWn8^`1)) zIXS;a`qkoNE6_Cp^^c9N zd8Em{KEN`uDEo$tn%&n}hm;&xm1mw`?VXa2(l``XG zEjTo?IHuDt6%-`pYnWBBs$|v7yM6@{N`g;7k~0Q_RTl`-4hQ1!8h7)vvG@tTI?U57 zV3gI#Ba|A*#SfsGEi*h{Eqr<6-z*blWTVNG?OJ5!A2dvbm2vBP&~?Z&n-zEgJsNk`D(zW~S&DZ*awyEFK$XL)79Cg76L zD>TcH*ZNEFi3eNm*aCiE^1gjQe(4&9`=XNV&B7!5g!gBs4r-BEd7#Omxo3Hos)tW; z!_7?FU)SA5xB%+kI(0KKmvN*=LKZ{>_QqnTAz$Rway)i3VI{c=s)`KtgQMR=6>+TD zYr-aV_jQk5$j=ThdB^3=j z+-trDu@h$)dQN4WW63ZcpVI=wT2oBSPm#;z^Y@RGBiJ<@8+`sE+p87|!}U#3$m#p7 zTwA}7UOXgfIc0x0&?gU7t?n=9zX#QgpZ)FVnX@ zg@Lx^cRmz3k);i_PP*9;eb<84^U7ti?~7$J3IP$jdhdS~ z^x*-Y$8^~m*|9%Lo7ebx^tF4{S;`wH#$r<1>GSdPQ61njh?FYQzRAj`bbEefrHy;{k6KdNT|g^sS0;H0z%QQ+#b0ehqkBV*t0o^a>XHN;Gj2X{ z#(kwg9bn_hx$k3xVg80Ol_K4fbZYbLTcy-T)sgJgq;HK7Gv=BO)L6r8MUw%-ML$2l zyh#*)<(lur=ncbNW!NUu9zU7`-k3;lhgs*pR1#rNhAtTqvPhCH6mBQ*iEBh}#P4Id z@q*csR3LKmIYD*~>xL|146y~2SR~Z#A4oKUio>K@zH$ju%>z(ZtOs7sq&g&5v8)Mo z$NTw9@Sn0u^!5uOc#8e%lB74iSl4KcsHrJ-=_`j@=MgNko6|zZsXQ^w2P|AGGDz)F z!V|LOp#+gC23l6CTuPL=3A{A=&`wVWc^e|^#}X7t6$V=ns&IGnx0%=}J zLA(#8GDcj=mHe?3bhnI5C`bFyx4;Kk37H91S{`6)V%U-hKgrnIlSb=OX8ngV-S)T+ zI>Pu#-X*pF(BCI3-!T8e1}T31dxWQDObnUg`b6^}Y-lOvcir3Yi7-ZXfBdN+*GK$z zCS}y))!WB}OodC+xz-Nw{#y|qP^%A1n){}KF#B-K-|bl4*K0DT$Dx6z>Wc9giyf`j z61uf2a7=%Z*=fZG^T)wbsRwY&`UPz!rks!VD}|p=vbdfRvtyue3+M~7Ut!I$2i?E9 z9|5=4={f#~uS4LK^{(}g+UoXTy$A}>z_$wy>XaBAq{2SN#e*Fr#oEp&baN$j^Uv=UTj}Ljh$KwDG%m`l}LOmZ! z5Yj3NDu5th3wOIV6dc~c>F3ckdAJ_gbr_iYC1iarS-nYD?geDOJ5P6=!QfmL?8QP;WZMDW9 zGLY`^-B4{7pFoistmWMjx0dU7Z5SVZxMl4>9qyV<-UK>BMsCxft=}_cH~|)%)!J*xHGB1q6xD+48k<0q=~!#d5VS+81U!{81<+(_XaS|{&m8bF=o_oZ z@X>bl5ktZN_*C4W#2tFge*a0M0btKgP-<}=EwLYYdyM%*$>3L%Wggln&u* z7mQVSzc{B37=wrQp{_B*CG0@fii`gs!7rfqtJN6aM_M4sy7Xb?2et}=^!n?ggO}h%{)+L!#AzXp% z=}s^Kgq?51&}I+WiI4wcZKP!}#V)i!;5(}jMBsCs4U4e{N>c*fn!l*l`7wWykcMq& zu9^8eu2QEy@Zp<~D zBFHLDofQm2(P2C=F)%PuM!#tGyTNMcPTdkmxsG#JP}pHwe@m%>Lv?P97>P^I><9|D&jrTRTOqY?1cCx8(Ib;HG%L(f;cId=h)i| zn!87E8~~j2{TO=_vlBcJfP1p7)V#r6t+gp&RbMg(dj zti?fUO}Mkd2|rp^Oy~-dO?nlf@4Pd$?qDjMAIcB+L4R*_oL-n8nuoxL;mv+8dwepd zQaDpJN#v}#(D#5MDS^akDJb)JGVnuuegzi2J_wXu_<~rqDu@T@nlp!DY!krX3s07n z>=@c6()tXB>P#_(T2&}}9?o2;@Yg+q{-EFWFp9;fGXs?VUKpokB|5V(dlRj*2nVL8 zGLAk6PAViI(lwD#(EEorD2r9Gp&Fe>#L_#WRYj;0Q1UagrM@{gzZfD>&6Dz1524;^ z-(vn{y_cH*(&DFQ}sE?Kz%F%PLnH}XizoxCs{UF ztUNa6vnJNjXvk-btNGo$q&^M|KANw@%i+MJaFVjB!#2azu**AlAu~?`ZDuU0l6MVd z1UKy=yGli%7W%pyImjs+yD4SB5;gXNdebPqUe;Xt4HKG1-1OxyC2~NQXw$>v0-SX@ z3(LZ*l{!CpsF{mS*>wET!ACW@#-%=u$5A7;7l58da}s*E${|n3TWEU}n}L?^$@~y( znbM)F;8cCE7WyrOz0pZokU=$w@`s30=e@mrT$B>`#5#`bPO<)B`&B6u~LSOhAiSXPFU_W04LYNRtO(tNheO7>kfKS@C2Auyk=9Uuqjs6cT6sz?Hu|oucVfgCr+)XbSk@-E|#N~$V&fayba*k z80@|&9*YG$kTsr1%HD`~i_5ggF2QJ9hjI`v%Gg6HPH-|;^jYwEDuP;sjKxi_q1K<=MHJlTPY)=t9m-+Z@q zf|(N=jDCXFKp$Y%q?_$&=&Ue2JGoy5+rjN@ z@bCjHP7SY8q94ZSZFTuRWaacU!pg%-A0Wrv39j{PLJ<8|DB^ zjLE#YgmH?q{p?d{kmyYFFX9)v5hLV+6e?ppqSjL+Uey-6v9j}M z=GhopAL7Bwm6xMRX++WD)<%6jgX)t$md;2aOlwS3Jj%No3>+k=BW&ex_>x19!{Mw( zGT^K~2}X7}d~-ASEG>0lp`b8>ib5P+Gc3Y zd9b^6V4o!)hVFSS#aB2|E27SJLqC<2Ku_3*`q(BJmQN$enh#hiJyXPC|7H?at-fVl z!9FufGwotmu$aQ=5fz zrS#Q$+IzpJ_`w*wE>cW;dkp<{!BLm@=`o+)74?`%gJbEOScdC9LI4toc9O-{y7PU3H5^SJM(BV4UcUQ%$DE%>*_rb&=?<7SjD zShtTW1xk_Gv$Sc$iVHdHp;wI2HT$p=m^Uh@MwXsne}fQwd` zkUf7Qj?@UEthDv4mvK~UHaTn)%1P-lq(OnGM(&CgRI7y>rMY>A{YhSBPQmg1RF>)9 zxbiXlDKRCtYsB$6Fn9u3<`_KfWJzp_-{3%v^})GJ(#`eZ+)eKUz3>50?s^@@d_i9} zm;_Sg5wD^Kc^vy-93{#g>wv!c7dBl=#{|xXVm))>6h9@a<0V5g$5g9^hf++W+JEC&l zmr}rUkM9xLe~qeRT*l?)wI7-6WaY(sceBv54*wnfLsjMaaR0}v;oVcL#{Kx>m)Itp zsSfZvFJq)KZdD|pYv0uy#5$ID1}_~42g8bWq(cln4TGP8c}MF@4C!QFCiNP75lyzrk~O7lSt?7}8z)jY$XLpf zQbG>Wki1Usmvi{=KA)cJzJ9;^{{8Oj`S4uN^1ZJa@;)TKtD2~w(63`moMGP)x_4Mm zpT^`}O7?~`J6I$ORW2qF= zME*+F`6R7A2a4_8fD{K4sBu?<{F|Qp^!@2eag1<>DXqN^ofig=B*^v5qwm){gU4^z zR!)u2viC=XHz32g32YTzg~2ZX4kUgx`!f3r+XDZ9VOKJ{dDC(BbNTO=FgkyxCf1`! zZ=Tv0XFZ&JSifjudln_d6zlw)KN8$Re4{@C&i5647v^_}X3 z((GADLD00)jWld7*)xkOe(HklBT}qmAwmA&CJ?qtjIm21szIM?tAb@e28N!7%>LQr2^DuN z%<0TAi_4Ue`~}{qxR1|z;8R^gqulRoxrz`?1s@S>FS}$6SX4??<#>*7DGt6mQMfKR z8oj8nWE1mO#N>F=7_&|%q$#lFs{bLhZ#d{2sXHKJ-4a)o!FdsUz=^>hsl3`Lf?@#v z0VTvp#$>VHrGDF!Zt~1X)1_g{FAR!ja_9~1@mV4&Nh3CNy2!L8%qf>sW=qEU`UR0| z-hK$}BKGoUtU@N{j*!Ze=lDV(meBdwo79iL`TH*!`d8U7U0rUlDBQF86E5R2opF$(TGRL5UJu?EmbpdkW!2`*Qht@w#IgB))x+a>Y8 z%XpEfp7S!y4zg;V$9;9@wA>;7X@!4ta*$x*@Qv>y4 z;CBhIdY{t@Q`J4HYAAO#C66<(0*%e*Zc9LQYn?^IiM$W2*_EQ13b} zVWrOn^zG@W^-+#dc?Peuv$B$5Iwv!VQle44lmI zH*@e)V>wWi?6~@w;Xd02CU8g5)_WB&VZ+fFKiQ}s2cz2dQ*J|rWnuGz9TgClTAmcsCfC=`pSK> z^U(rKdBL?l!LuIPgN7RA#p|s7rE#W>bi=|Y_F)#f40Y-RJQ48u8F0$S~DT+4#FHdS)9l}~kB z#C+=9)VaB${#v09%t)Age4ehr*dz!#sd$v4T{jmr_iU}f*9}YcKYOgX?Y2h6C{4u4&{{Y6m>mJAnsOC%JmvS zi!iH+7$)v?IK?k@^OmRWslQxp9^VcPH!*tL&_5vo0v}Gae^Q@g9=>zMsIkF(njiVP z!`2~f1(Y;CQKgHbF$OPn-|c(KH6xrRh2$(6pp^I`;xwZBdJtio%OxVZZ=z3-z7S*M zWqVqoRNYTq#~`|&yFTcAX~_BZ*+y4!#x{5v2FrihS{b`?-bp|vca6sYE1Tcldi)ln zfS2jniifR_1-c9C2TJNt$E}!$F1Q4+k_|@nQnpL^!fiWT7wj+INM5l2W&&f%&CDPc zGXlH55_cBDLiINyzhC@$FCQNl8&|?qoEu;L?sskNV z{B=`OTsm!}wk|rT_<=4aU)Sa&T@^(ON?gxAf>C2-z|I^kBt(UNst- zzVH#2b%-z4nDgded}Wxg60=F_>j`dfVl#Z7<>SPjUnuI6_I~H5_FHG(fsmv?T=J0D z?}o{#Kz3)b4sf5>+-!qes+yeqV8y}!H_{JY{7@+XjI%rtCut$$rcD}YW3;;d(nl5< z)Vgk;LZ-O7w9g%(UJV~acD>3kDaxonN{h`KMF+3d<8XM#FXY4blxlG@a_2l_8Vk1LD- diff --git a/export.php b/export.php index 0b394ca..b5363c8 100755 --- a/export.php +++ b/export.php @@ -36,7 +36,7 @@ $userIds = array_keys($alleBenutzer); $bisDatum = $berichtsMonatEnde->format('Y-m-d'); $stmt = mysqli_prepare($conn, " SELECT m.id AS meeting_id, m.meeting_date, - mt.user_id, mt.wore_color, mt.paid + mt.user_id, mt.wore_color, mt.paid, mt.birthday_pay FROM meetings m LEFT JOIN meeting_teilnehmer mt ON m.id = mt.meeting_id AND mt.attended = 1 WHERE m.meeting_date <= ? AND m.is_completed = 1 @@ -107,12 +107,15 @@ foreach ($berichtsMeetingsMeta as $meta) { $teilgenommen = false; $wore_color = null; $paid_this = false; + $paid_this_birthday = false; // NEU + // Finde Teilnahme-Daten für dieses Meeting foreach ($alleMeetingsMitTeilnehmern as $mt) { if ($mt['meeting_id'] == $mid && $mt['user_id'] == $uid) { $teilgenommen = true; $wore_color = !empty($mt['wore_color']); - $paid_this = !empty($mt['paid']); + $paid_this = ($mt['paid'] == 1); + $paid_this_birthday = ($mt['birthday_pay'] == 1); // Explizit prüfen break; } } @@ -135,14 +138,22 @@ foreach ($berichtsMeetingsMeta as $meta) { $offeneStrafen++; } } - if (!empty($mt['paid'])) { + + // 🔹 NUR normale Zahlungen zählen (birthday_pay = 0) + $is_paid = ($mt['paid'] == 1); + $is_birthday = ($mt['birthday_pay'] == 1); + if ($is_paid && !$is_birthday) { $rechnungenGesamt++; } } + // Name mit Symbolen $userNameAnzeige = htmlspecialchars($username); if ($paid_this) { $userNameAnzeige .= ' '; + if ($paid_this_birthday) { + $userNameAnzeige .= ' (G)'; + } } if (!$teilgenommen) { @@ -196,6 +207,7 @@ $html = ' th, td { border: 1px solid #333; padding: 4pt 6pt; text-align: left; } th { background-color: #f0f0f0; font-weight: bold; } .paid-symbol { color: red; font-weight: bold; } + .birthday-symbol { color: #d63384; font-size: 0.85em; } .color-ok { color: green; } .color-fail { color: red; } .page-break { page-break-after: always; } @@ -260,6 +272,7 @@ $html .= '

Erstellt am: ' . date('d.m.Y') . '

* = "€" hat Restaurant-Rechnung bezahlt

+

(G) = Geburtstagszahlung (zählt nicht zur Rechnungsanzahl)

diff --git a/history.php b/history.php index 0ed034f..dede289 100755 --- a/history.php +++ b/history.php @@ -57,7 +57,8 @@ function get_all_meeting_details($conn) u.username, mt.attended, mt.wore_color, - mt.paid + mt.paid, + mt.birthday_pay FROM meetings m JOIN colors c ON m.color_id = c.id LEFT JOIN meeting_teilnehmer mt ON m.id = mt.meeting_id @@ -91,7 +92,8 @@ function get_all_meeting_details($conn) 'username' => $row['username'], 'attended' => $row['attended'], 'wore_color' => $row['wore_color'], - 'paid' => $row['paid'] + 'paid' => $row['paid'], + 'birthday_pay' => $row['birthday_pay'] ]; } } @@ -215,7 +217,13 @@ include('inc/header.php'); $status_icon = $participant['wore_color'] ? '✅' : '🔴'; $status_text = $participant['wore_color'] ? 'Farbe getragen' : 'Falsche Farbe'; } - $paid_icon = $participant['paid'] ? '💰' : ''; + $paid_icon = ''; + if ($participant['paid']) { + $paid_icon = '💰'; + if ($participant['birthday_pay']) { + $paid_icon .= ' 🎂'; + } + } ?> diff --git a/kasse.php b/kasse.php index b0e536e..eb5dc9a 100755 --- a/kasse.php +++ b/kasse.php @@ -263,10 +263,13 @@ $sql_paid = " FROM meeting_teilnehmer mt JOIN meetings m ON mt.meeting_id = m.id JOIN users u ON mt.user_id = u.id - WHERE mt.paid = 1 AND m.is_completed = 1 + WHERE mt.paid = 1 + AND mt.birthday_pay = 0 + AND m.is_completed = 1 GROUP BY u.username ORDER BY paid_count ASC, u.username ASC "; + $result_paid = mysqli_query($conn, $sql_paid); while ($row = mysqli_fetch_assoc($result_paid)) { $paid_stats[] = $row; diff --git a/participant.php b/participant.php index 499e425..bdb6ad5 100755 --- a/participant.php +++ b/participant.php @@ -38,7 +38,7 @@ while ($row = mysqli_fetch_assoc($users_result)) { } $existing_feedback = []; -$stmt = mysqli_prepare($conn, "SELECT user_id, attended, wore_color, paid FROM meeting_teilnehmer WHERE meeting_id = ?"); +$stmt = mysqli_prepare($conn, "SELECT user_id, attended, wore_color, paid, birthday_pay FROM meeting_teilnehmer WHERE meeting_id = ?"); mysqli_stmt_bind_param($stmt, "i", $meeting_id); mysqli_stmt_execute($stmt); $result = mysqli_stmt_get_result($stmt); @@ -72,68 +72,75 @@ if ($_SERVER["REQUEST_METHOD"] === "POST") { // Neue Daten speichern if (isset($_POST['user_id']) && is_array($_POST['user_id'])) { - $stmt_insert = mysqli_prepare($conn, "INSERT INTO meeting_teilnehmer (meeting_id, user_id, attended, wore_color, paid) VALUES (?, ?, ?, ?, ?)"); + $stmt_insert = mysqli_prepare($conn, " + INSERT INTO meeting_teilnehmer + (meeting_id, user_id, attended, wore_color, paid, birthday_pay) + VALUES (?, ?, ?, ?, ?, ?) + "); + + $meeting_year = (int)date('Y', strtotime($meeting['meeting_date'])); + $meeting_month = (int)date('n', strtotime($meeting['meeting_date'])); + $meeting_day = (int)date('j', strtotime($meeting['meeting_date'])); foreach ($_POST['user_id'] as $user_id) { $user_id = intval($user_id); $attended = isset($_POST['attended'][$user_id]) ? 1 : 0; $wore_color = isset($_POST['wore_color'][$user_id]) ? 1 : 0; $paid = isset($_POST['paid'][$user_id]) ? 1 : 0; + $birthday_pay = 0; - mysqli_stmt_bind_param($stmt_insert, "iiiii", $meeting_id, $user_id, $attended, $wore_color, $paid); + if ($paid) { + // Hole Geburtstag des Users + $user_stmt = mysqli_prepare($conn, "SELECT birthday FROM users WHERE id = ?"); + mysqli_stmt_bind_param($user_stmt, "i", $user_id); + mysqli_stmt_execute($user_stmt); + $user_row = mysqli_fetch_assoc(mysqli_stmt_get_result($user_stmt)); + mysqli_stmt_close($user_stmt); + + if ($user_row && $user_row['birthday'] && $user_row['birthday'] !== '0000-00-00') { + $bday_month = (int)date('n', strtotime($user_row['birthday'])); + $bday_day = (int)date('j', strtotime($user_row['birthday'])); + + // War Geburtstag in diesem Jahr bereits? + $birthday_passed = ($bday_month < $meeting_month || + ($bday_month == $meeting_month && $bday_day <= $meeting_day)); + + if ($birthday_passed) { + // Prüfen: Hat er in DIESEM JAHR schon als Geburtstagszahler gezahlt? + $check_stmt = mysqli_prepare($conn, " + SELECT 1 FROM meeting_teilnehmer mt + JOIN meetings m ON mt.meeting_id = m.id + WHERE mt.user_id = ? + AND mt.birthday_pay = 1 + AND YEAR(m.meeting_date) = ? + LIMIT 1 + "); + mysqli_stmt_bind_param($check_stmt, "ii", $user_id, $meeting_year); + mysqli_stmt_execute($check_stmt); + $already_birthday_paid = mysqli_num_rows(mysqli_stmt_get_result($check_stmt)) > 0; + mysqli_stmt_close($check_stmt); + + if (!$already_birthday_paid) { + $birthday_pay = 1; + } + } + } + } + + mysqli_stmt_bind_param( + $stmt_insert, + "iiiiii", + $meeting_id, + $user_id, + $attended, + $wore_color, + $paid, + $birthday_pay + ); mysqli_stmt_execute($stmt_insert); } mysqli_stmt_close($stmt_insert); - // 🔹 GEBURTSTAGS-ZAHLUNG BEHANDELN – MIT last_birthday_year - $meeting_year = (int)date('Y', strtotime($meeting['meeting_date'])); - $meeting_month = (int)date('n', strtotime($meeting['meeting_date'])); - $meeting_day = (int)date('j', strtotime($meeting['meeting_date'])); - - foreach ($_POST['user_id'] as $user_id) { - $user_id = (int)$user_id; - $paid = isset($_POST['paid'][$user_id]) && $_POST['paid'][$user_id] == 1; - - if (!$paid) continue; - - $user_stmt = mysqli_prepare($conn, "SELECT birthday, last_birthday_year FROM users WHERE id = ?"); - mysqli_stmt_bind_param($user_stmt, "i", $user_id); - mysqli_stmt_execute($user_stmt); - $user_row = mysqli_fetch_assoc(mysqli_stmt_get_result($user_stmt)); - mysqli_stmt_close($user_stmt); - - if (!$user_row || !$user_row['birthday'] || $user_row['birthday'] === '0000-00-00') { - // Kein Geburtstag → normale Zahlung - $update = mysqli_prepare($conn, "UPDATE users SET regular_paid_count = regular_paid_count + 1 WHERE id = ?"); - mysqli_stmt_bind_param($update, "i", $user_id); - mysqli_stmt_execute($update); - mysqli_stmt_close($update); - continue; - } - - $last_bday_year = (int)($user_row['last_birthday_year'] ?? 0); - $bday_month = (int)date('n', strtotime($user_row['birthday'])); - $bday_day = (int)date('j', strtotime($user_row['birthday'])); - - $birthday_passed = ($bday_month < $meeting_month || - ($bday_month == $meeting_month && $bday_day <= $meeting_day)); - $birthday_not_paid_yet = ($last_bday_year < $meeting_year); - - if ($birthday_passed && $birthday_not_paid_yet) { - // 🎂 Geburtstags-Zahlung - $update = mysqli_prepare($conn, "UPDATE users SET last_birthday_year = ? WHERE id = ?"); - mysqli_stmt_bind_param($update, "ii", $meeting_year, $user_id); - mysqli_stmt_execute($update); - mysqli_stmt_close($update); - } else { - // 🔢 Normale Zahlung - $update = mysqli_prepare($conn, "UPDATE users SET regular_paid_count = regular_paid_count + 1 WHERE id = ?"); - mysqli_stmt_bind_param($update, "i", $user_id); - mysqli_stmt_execute($update); - mysqli_stmt_close($update); - } - } - // Meeting abschließen (nur im Index-Modus) if ($source_page === 'index') { $stmt_complete = mysqli_prepare($conn, "UPDATE meetings SET is_completed = 1 WHERE id = ?"); diff --git a/zahler.php b/zahler.php index a919003..d89269b 100755 --- a/zahler.php +++ b/zahler.php @@ -23,14 +23,12 @@ function get_next_payer_info($conn, $meeting_id) $meeting_month = (int)date('n', $meeting_ts); $meeting_day = (int)date('j', $meeting_ts); - // Alle ZUSAGENDEN Teilnehmer – mit last_birthday_year + // Alle ZUSAGENDEN Teilnehmer $sql = " SELECT u.id, u.username, - u.birthday, - u.last_birthday_year, - u.regular_paid_count + u.birthday FROM meeting_teilnehmer mt JOIN users u ON mt.user_id = u.id WHERE mt.meeting_id = ? AND mt.rsvp_status = 'accepted' @@ -47,23 +45,36 @@ function get_next_payer_info($conn, $meeting_id) return null; } - // 🔹 Geburtstagskandidaten: Geburtstag war + noch nicht in diesem Jahr gezahlt - $birthday_candidates = array_filter($candidates, function ($c) use ($meeting_year, $meeting_month, $meeting_day) { + // 🔹 Geburtstagskandidaten: Geburtstag war + noch nicht in diesem Jahr als Geburtstagszahler gezahlt + $birthday_candidates = array_filter($candidates, function ($c) use ($conn, $meeting_year, $meeting_month, $meeting_day) { if (!$c['birthday'] || $c['birthday'] === '0000-00-00') { return false; } - $last_bday_year = (int)($c['last_birthday_year'] ?? 0); - if ($last_bday_year >= $meeting_year) { - return false; // Bereits in diesem Jahr gezahlt - } - $bday_month = (int)date('n', strtotime($c['birthday'])); $bday_day = (int)date('j', strtotime($c['birthday'])); - // War der Geburtstag in diesem Jahr bereits? - return ($bday_month < $meeting_month || - ($bday_month == $meeting_month && $bday_day <= $meeting_day)); + // War Geburtstag in diesem Jahr bereits? + if (!($bday_month < $meeting_month || + ($bday_month == $meeting_month && $bday_day <= $meeting_day))) { + return false; + } + + // Hat er in diesem Jahr schon als Geburtstagszahler gezahlt? + $check_stmt = mysqli_prepare($conn, " + SELECT 1 FROM meeting_teilnehmer mt + JOIN meetings m ON mt.meeting_id = m.id + WHERE mt.user_id = ? + AND mt.birthday_pay = 1 + AND YEAR(m.meeting_date) = ? + LIMIT 1 + "); + mysqli_stmt_bind_param($check_stmt, "ii", $c['id'], $meeting_year); + mysqli_stmt_execute($check_stmt); + $already_paid = mysqli_num_rows(mysqli_stmt_get_result($check_stmt)) > 0; + mysqli_stmt_close($check_stmt); + + return !$already_paid; }); if (!empty($birthday_candidates)) { @@ -75,11 +86,28 @@ function get_next_payer_info($conn, $meeting_id) ]; } - // 🔹 Normale Rotation - $min_paid = min(array_column($candidates, 'regular_paid_count')); - $regular_candidates = array_filter($candidates, fn($c) => $c['regular_paid_count'] == $min_paid); + // 🔹 Normale Rotation: Zähle paid=1 UND birthday_pay=0 + $user_paid_counts = []; + foreach ($candidates as $c) { + $count_stmt = mysqli_prepare($conn, " + SELECT COUNT(*) + FROM meeting_teilnehmer + WHERE user_id = ? AND paid = 1 AND birthday_pay = 0 + "); + mysqli_stmt_bind_param($count_stmt, "i", $c['id']); + mysqli_stmt_execute($count_stmt); + $count = (int)mysqli_fetch_row(mysqli_stmt_get_result($count_stmt))[0]; + mysqli_stmt_close($count_stmt); + $user_paid_counts[$c['id']] = $count; + } + + $min_paid = min($user_paid_counts); + $regular_candidates = array_filter($candidates, function ($c) use ($user_paid_counts, $min_paid) { + return $user_paid_counts[$c['id']] === $min_paid; + }); + usort($regular_candidates, fn($a, $b) => strcmp($a['username'], $b['username'])); - $first = $regular_candidates[0]; + $first = reset($regular_candidates); return [ 'username' => $first['username'], 'is_birthday_payer' => false