From a15a687e52c245e4c6ba0890f6f1b045e2e16000 Mon Sep 17 00:00:00 2001 From: MrWaradana Date: Mon, 17 Nov 2025 16:40:11 +0700 Subject: [PATCH] fix bep year None --- .../__pycache__/router.cpython-311.pyc | Bin 11560 -> 11591 bytes .../__pycache__/schema.cpython-311.pyc | Bin 11642 -> 11744 bytes .../__pycache__/service.cpython-311.pyc | Bin 17696 -> 16805 bytes .../equipment/__pycache__/Eac.cpython-311.pyc | Bin 15203 -> 15306 bytes .../equipment/__pycache__/run.cpython-311.pyc | Bin 2817 -> 2474 bytes .../__pycache__/router.cpython-311.pyc | Bin 5735 -> 5741 bytes .../__pycache__/service.cpython-311.pyc | Bin 8119 -> 8601 bytes src/plant_transaction_data/router.py | 6 +-- src/plant_transaction_data/service.py | 44 +++++++++++++----- 9 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/equipment/__pycache__/router.cpython-311.pyc b/src/equipment/__pycache__/router.cpython-311.pyc index d38b233f9a0a1cf7a370263009427ffe0e228264..bd93b86fa28f8d4c5f77bec1edb3aeb70c4abb04 100644 GIT binary patch delta 442 zcmZ1xbv%l9IWI340}w<%kjjkR$ZICU#RKFu1M%l`lMhHqPEM1N7v^AKsAaBYsb#HY zt7Wg{sO7BXnmkP=fvbjV4a+j1JxSFYvbr}Uls^b^@^O7+01{t7#0L=uLA?*+JUnb48GytW z5b=S5XYzl!9gKyOcgXv(6#^|ODw@orV9Ht!WbWVWrZAI{tqdeuIQglf8)M029VImZ zh%%695{M|9oTQ}2S`B2L+uW;kkCCxva*j$OTMb0+vWhZmJ&^fo^KX@GCTWm|Zm|^P z7nc-)thmKoP+C$1(pywNxlvt~YZ8#j2*kyen^&l-v6#v+vMuoZzyPE!xQ0XMewIYglIWI340}$k#lgd=s$ZICU#SP>&1M%lmlMhHqPEM1N7i4E(sAaBYsb#HY zt7Wg{sO6kILnc9B4a+j1#A+ahfXU|-#V0Gu+Ay+Dj+1qsyk6Fmk!$i#StHhBkPVZ~ zengk+BCpRdmu~q?@XEv`^y2r>^ zJ-JIIk*yjc_fbWewGPO9u~||zn@Jkvm0K(Y`NbtgAS-S$7nGJ1f%F#DO`fkV%QX?m zWCY^kip|H=)mThq7}*wheqaDn7hJ<3baEP)Mi3vF8JN5ouP}OjU;?W9V7FOOM~x8x DjNWY{ diff --git a/src/equipment/__pycache__/schema.cpython-311.pyc b/src/equipment/__pycache__/schema.cpython-311.pyc index 0d1857c6fa60aa04b863772889b374d4c2eb2efe..e6d58d5f1fef088daed31a36f4c6fb08b472fb35 100644 GIT binary patch delta 500 zcmewr^&pyeIWI340}$9fkjix2$XhJSXfe4_b_XNRBG@L@0rXTo9o=`GUH*N>LGrT?`^rK!hrYPy-PeFd}~Q2jzu~ z%s~F+i;Uu%SF8SFRLlfPW&sJmkRl!sTMR@XtPz-Os3FS+GFww*a;~y5ZWm0xs4U7= z3epWC@;9ez)G;!aPJX6Yp<4kGWr0Z*DS%jLjw}a>frzHb-CAah<&zI-6>@`J4mPrU mvYoapW9{Y`?MOx=4n}9j4-DAJ3Em&UGGCD8#U?-3nG67tiFC~X delta 434 zcmaD5{VR%hIWI340|=a#%4FKeTP(}SF}YE82P6MvD>-dVfmH5Pwp2k$unG`?V5PF8 zaN7VyQdoi+GhfNVEQIs-yjl4SJ`N>!08z(!m>1YSb|@mQ421s^BgMiL!vD zCZE@m;3@+#K}6%^k6LDoWs^0u3pK&61?vY(qZ<5+!zMRBr8FniuBc}7A?-*;BX&k- X#t#hG$qC*c!7^WvP`j#GYnkU diff --git a/src/equipment/__pycache__/service.cpython-311.pyc b/src/equipment/__pycache__/service.cpython-311.pyc index 568b31ff13ded01e4d57d50cdd7d4dbf959cef39..6e7deaad6cec2ac75a93636ce9702d71e76bb688 100644 GIT binary patch delta 1274 zcmZWoO>7%Q6!zHO^(Ic%ZEcq{zpP_7F$s}V*7<3Yl0e%ODXB^&!U2R?vP)#TcG9D(6xvXsDlnC(8nudA6$rFa+U0_Zgp><8aM*(-EDKc;5_cnUDm^gIc0wygnor;R z-g`6i=FO~KBDc>I@tgYkS{EDgc4NA8^q%;K$30a;OWnulMt>ch>#wyZz5n=hO8}oG zyw`%EII=_~3z4eYTG6U%dsS_FN{y=ZmV4Euiq}00F>`Fk=W1@do%E%n?&fyzWk^^lg_3y zxlBq^ri+0mjFh3BE$(?znAa45Mz&*7$S8Aj>FkUVkK0qh4HBzoakxV2eMQe{MIV}& zU$>)UE*%Za-Z;yr=fV-X686zs;a2|)6P{tycNNoY|V>3j@Yy1T^uhAoN$7tonU)DC_6!UOI@6xfu@fGp@Ps*5W=OsHFbQ+ zRbyXkdY;5ju=U|EgE$XO$gw9yk8xH96&Vkjk<(3>qNV0;PG`~uTWa}f1o$9VXsm|I_$@zSfJik@`VEH@vpD}dJncn5&hmX8g1s`9EJA?rZE;vNaZnOQZbYe(Q``^wns zEM+`2AalLAKN0Kd9+KISg`>T3|3Psh z_cm(K&{ACki4Y!=vw`AJJkiJR@Sc7gly%^TeFg)4iIAKHCf$hKG}WMkWXn`Ww0T9^ zK3d*FzxZQTd@-+9RsI{tXbf}w?70Qi70tS+NTx_WmRn zleif9CBJ0MIAdKml}n~WNllfcsd}QJjt@NVmn_s=sbBXtN#2$fZ_?f_+1rz*4$0J! z)O1Rk&L<0pP>C@Nj$I+usPaNZnQeW7KJojU!IaW<0V3MH;^l`H%qm{KyVDWztpP+y&i zPDPga@mI(-%UF(elQX9bT#h=$aAK9U9HEosO4Gc(2zL2|9b@*CLPYVt;5ufhd`_D>5oMEquaH}&rSz>p88irohzS3qr~H@XpnR1 z^@byfNczTyLIF&lQJ_22hby5@9n?_;L-8Jb9PC2?4FDI&gfDMjde)qt1jeB#-v#M( zs%78tY(h0p=@;)Nv5HmkVaWqk)&**};djX8^6Ixnp~fV@6o3n08bA#&1Mn`uEWmCn zxSpD__PLhv90>OI2EO+IE|Q9hm)H*}{YyMkaYuT132#I zG8wht-cFmSKgQms_LBIh{u|_6gwR=l^r@!zQD(9-Pk?-W*v8(af_vi1;fDxKl8+m` zjqu0A@Srffob)S@mEkCl;chXUJBE2NOow3(46S0=7~dt&8Xf4qXnXl}RCpF4^=4jS eN|`1#$F@o5Ym|`LBZXG*rviW zW7n`vVw7j)spYI;nS6mmeDYg)IY#lxJPPVS(gaM#fXNmGZ$_TU2lZ5#fC>xs#3o;0 z2T;_iGz7W^6vJUCGLrJlWQ8C1b|q=Z1bjwwaMKW9jB7 zqxsAN$v`g_<${Pj5RpHb)69&uC=tk>>}ux8Rtgf#oIJ%$L$4Ub)BzECAfg0BD1iu9 a5CJyF9K_lk>pjF$M3*7db>HUtr^7V`QjdS-?Gcqn-$i%Z%W10cF{O8I&1HBqsMM z$}>uDUZ=R7jgfD1nuh=6LmGP-EjKr48Zt6{VB35~OOR2DpWz^rD~}sL!!dp?cSh!8 zlCo|#%*Sk4-5Do;*EVKM+pMiq$;y~Gd8y$_#UNc<~}R{*&$a& diff --git a/src/modules/equipment/__pycache__/run.cpython-311.pyc b/src/modules/equipment/__pycache__/run.cpython-311.pyc index 7c85b9b35acdf52dbe15c3a72782d45f066e04f0..3d6de871f7c67ff459659bd3fd62dfe8609699cf 100644 GIT binary patch delta 666 zcmZWn&ubGw6n?X_Gn-Ab-K0N~rirXkQS3o!L8}1`ws;95h~U9Xl+FsP?HV>yk-DoX zf`p!0CJ-d#s-l;QM?p*ef(rHELQY;h_Ts^tlf*WLzQ;Ts?|t7lZyvLrd_QiyHH;`o zoBuxT?0z(ANcp0O1}eq_#7Vc&w})7)GNpyzAb=0@^bLV)^8cYn`|~G(j~(CvPJuTQC_@~TPYNAp zMH8nC<+;M(wj4E(nfQvYERsjPH+gxU8mRaxBWnu4@H7EAf}sG6ih`P&rE4+|G^Y8a z2`u7M8FgP{(Wc5qT3Qfs&r4PM@3s>>B{VfROS`p0<}imyPFGLuX~bGMh;UQsb^PKmwAY6ag}Zq zKg$*Wl3s;QVzQpz%G5K};(pd3=5GpP>8*4-?Q?&i5r{A&E(F5 zo!G!@^wWm+1kFsz-8HUVT8KkC9$i#%d)itk;C6w?JdBh|EB76@R60BAjf#SPVImwU ldp2{Hc*$FJz3yM}3{ln3pqzN8|1r;@@qIW9_r!Me)?W@@l`Q}O delta 948 zcmah|NoW*76s_v&rFuF&lgU1eahAl97-J5i!Hkjw6AvDgAPA8_JEr^4n(2&{%Ib_n z1c~Ayp#o9DTqCFlgUiKJh!<}O!vUL&#|F8c2e%Jr+_v__p<((S+ ziLUzqx8S!L`~8wW4TYx;pFYVT^@6pfd z(HTv?A(f_)b{b-zQLI*?p{?=!lod^RQsz%lVR=;Bp_Fh=F>zK}0H&IidGuu!Q(F+t zvb>VRPAl(Fwix64m^L_CJdVBH67McCiyLfu9_27qSeqC-mg)_L~SRUA(m+m zP{X=8VrSBpLk%-UQ|(c9MSR?>yCSvImaA=7krBsLd&UQ>47GtDC}tAZ*RWpD0uGc zilR4>t}t2-OB^mYcAY*O11m9KcQsmRj&zr!cjXetE;fvG%61H+$xkZSC*?#LDShjN c|2}{OSra}CK>z>% diff --git a/src/plant_transaction_data/__pycache__/router.cpython-311.pyc b/src/plant_transaction_data/__pycache__/router.cpython-311.pyc index ebc4b9162fc9f43e211a35e93893a32666df9e58..d33f9c030d4f232aa160a36bbd43d146b672e4bb 100644 GIT binary patch delta 249 zcmaE^^Hzs`I*eyk?MEvpnaq;}g8#w}b?(#|Bm5{q4VR%DWbF(O? z4kM%4j6oWufy7GYB6$$oY;rA^Eu-D$-CP$L83Q)=@+32ITYw}i zL4@w)-@I;&#*>}+)PUw>^4T-SZC=T@mr($u#+uC^1r9JW dnr_}C^n;O6ZSranH%67ob3|1(i-`s@0svXRL>2%5 delta 263 zcmaE>^IV5_IWI340}vd{<;iT@$ji^pxMcD|ep7)MW(I~@rdsA&mKvrarW)qSaqNYY zwYgL$KV@%YGXiQTGM-$>q0D6lWa%AR@*GVDb8qP4pOBHBJ@Cn z3W!hz5}K?{KcwH&CkB$Rd&y11B)Kj8B(fEg%vQ`Y zOD>9s*XiVL-}U>EONzmJz$Zpv!)3 zAm8x*j9X-|3A?fNy>=;x!zNe&S}0Si!WTUKOsNMvoe^RX&(f$0e}O3&uQMy$1?D=)bvQ!At%YCx(8*M$BU|$EBDEkNRkxvk10+WxwPzr4^63$gJhIzrihJRw(j? zhWPr*e0HgnUo1pC<4K%pUXAG`DKJUDlcaXiwh05RP@lQy>yU|t-aPs zYP?9lqQyYIw^jzE8%e#ZM>YC&e^51gb+7M6^0BW+DQmvyLtnJTMEQOSGGlwWs#>FJ zEUv~*>(ZclbX=3h*Qa&q(B|8kG_*e5GBK`zlK5nGeN_*JYl7Z;tY+6;z8c?jO3De% z8QQ$|z!_GZ;b!o#8XnbxqdR8x)U5W}tk!k0#_Ia!xyz()v@1pa^@9 zf}s|}`iB1l4F!)Pv^YAyx3|{}9pCQTE~{tKT0E_d%xR&yTC$d;8=;$;df*>a{eyaV zRIzt5?LssB0vH2ZBZ@$t*arOVv)%1+os1cFW44py{O+qPW!-DPV|1Y7^qeCia#4Y% z$S>|OQxep(g!3HY;a?Z)QO_SNd%5oP-si@r!FdXB8gK>xw*tKhcnffjBH~6VDjMcu zwv;KA5IPT@8PX+nSJ6A5Ujo4WMehRAfH^=0(C*6C>FP2}Oi?t9a;B7NSeKWm%%j%4i;9WIz_s*#c-eilU7IE?0Yyo06L^(3wx`_oNdXd!9TBM)_-WVu#qeH%#sB zX2@3e??>StA~*vC@d#p22mo&r!8`p+7+YABm#=2WQMLZV!3^6y#>SeiK#Qlc#rz+u JWcay{{sFM&H{}2T delta 663 zcmZwEPiWIn90&0HZJIU-8EHC=OY7FUnj%wBBD%qbb+b;_PN(xv>$c)1j^dQp9_C2V z9o*I819jj*5b+{{51;h|78Rw(V7)!ywqmTKTLMr@D z+8-Sy;TXAVB^qx_jg01gd^6up4?#}7 zSZn6-CnduplkCj>qik}q9dUg1=F+|T^4%3nL@Mdg7=ERVgeD-K!MoZ3UmdjpTm)u-OTcAd z7GQxZz*XQHa2+W15G|>@+cGp`c+f}~Hz3Xd^Fa3mkQVTqF~Hv@aov4noM7n!{%mG> z`0;P?PxDDAcxe%DB)+Tg;}Dz}!Fp81t4Wi-?> previous_revenue and total_cost < revenue) or ( - previous_total_cost < previous_revenue and total_cost > revenue - ): - if total_cost < revenue: - bep_total_lcc = previous_total_cost - bep_year = previous_year + if previous_total_cost is not None and previous_revenue is not None: + prev_diff = previous_total_cost - previous_revenue + curr_diff = total_cost - revenue + + # If signs differ there's a crossing between previous and current point + if prev_diff == 0: + bep_year = previous_year + bep_total_lcc = previous_total_cost + break + + if prev_diff * curr_diff < 0: + # Interpolate linearly between the two years to estimate BEP year + denom = ( (total_cost - previous_total_cost) - (revenue - previous_revenue) ) + if denom != 0: + t = (previous_revenue - previous_total_cost) / denom + # clamp t to [0,1] + t = max(0.0, min(1.0, t)) + try: + bep_year = previous_year + t * (item.tahun - previous_year) + except Exception: + bep_year = previous_year + bep_total_lcc = previous_total_cost + t * (total_cost - previous_total_cost) else: - bep_total_lcc = total_cost - bep_year = item.tahun + # fallback if interpolation is not possible + if total_cost < revenue: + bep_total_lcc = previous_total_cost + bep_year = previous_year + else: + bep_total_lcc = total_cost + bep_year = item.tahun break previous_total_cost = total_cost