From db277accbc2874422f8a69dc522c574fc3502834 Mon Sep 17 00:00:00 2001 From: MrWaradana Date: Mon, 24 Nov 2025 11:28:22 +0700 Subject: [PATCH] add disposal cost to equipment transaction data --- src/equipment/model.py | 1 + src/equipment/schema.py | 1 + src/modules/equipment/Eac.py | 22 +++++++++++------- .../equipment/__pycache__/Eac.cpython-311.pyc | Bin 15309 -> 15813 bytes src/modules/equipment/run.py | 10 ++++---- 5 files changed, 20 insertions(+), 14 deletions(-) diff --git a/src/equipment/model.py b/src/equipment/model.py index dbd7962..a0033f0 100644 --- a/src/equipment/model.py +++ b/src/equipment/model.py @@ -92,4 +92,5 @@ class EquipmentTransactionRecords(Base, DefaultMixin, IdentityMixin): eac_npv = Column(Float, nullable=False) eac_annual_mnt_cost = Column(Float, nullable=False) eac_annual_acq_cost = Column(Float, nullable=False) + eac_disposal_cost = Column(Float, nullable=False) eac_eac = Column(Float, nullable=False) diff --git a/src/equipment/schema.py b/src/equipment/schema.py index 58c709a..5df60c9 100644 --- a/src/equipment/schema.py +++ b/src/equipment/schema.py @@ -70,6 +70,7 @@ class MasterBase(DefaultBase): eac_npv: Optional[float] = Field(None, nullable=True, le=MAX_PRICE) eac_annual_mnt_cost: Optional[float] = Field(None, nullable=True, le=MAX_PRICE) eac_annual_acq_cost: Optional[float] = Field(None, nullable=True, le=MAX_PRICE) + eac_disposal_cost: Optional[float] = Field(None, nullable=True, le=MAX_PRICE) eac_eac: Optional[float] = Field(None, nullable=True, le=MAX_PRICE) diff --git a/src/modules/equipment/Eac.py b/src/modules/equipment/Eac.py index aa5e842..fe1248f 100644 --- a/src/modules/equipment/Eac.py +++ b/src/modules/equipment/Eac.py @@ -68,16 +68,17 @@ class Eac: cumulative_values.append(row["rc_total_cost"]) # Menghitung NPV menggunakan rumus diskonto # Rumus NPV: NPV = Σ [Ct / (1 + r)^t] - # dimana Ct = cash flow pada periode t, r = inflation_rate, t = periode + # dimana Ct = cash flow pada periode t, r = disc_rate, t = periode final_value = sum( - value / ((1 + inflation_rate) ** (i + 1)) + value / ((1 + disc_rate) ** (i + 1)) for i, value in enumerate(cumulative_values) ) # Menghitung PMT biaya maintenance # Rumus PMT: PMT = PV * [r(1 + r)^n] / [(1 + r)^n – 1] - # dimana PV = final_value, r = inflation_rate, n = row["seq"] - pmt_mnt_cost = -npf.pmt(inflation_rate, row["seq"], final_value) + # dimana PV = final_value, r = disc_rate, n = row["seq"] + pmt_mnt_cost = -npf.pmt(disc_rate, row["seq"], final_value) + eac_disposal_cost = 0.07 * pmt_mnt_cost # Menghitung PMT biaya akuisisi # Rumus PMT: PMT = PV * [r(1 + r)^n] / [(1 + r)^n – 1] # dimana PV = rc_total_cost_0, r = disc_rate, n = row["seq"] @@ -102,7 +103,7 @@ class Eac: # Update lcc_equipment_tr_data update_query = """ UPDATE lcc_equipment_tr_data - SET eac_npv = %s, eac_annual_mnt_cost = %s, eac_annual_acq_cost = %s, eac_eac = %s + SET eac_npv = %s, eac_annual_mnt_cost = %s, eac_annual_acq_cost = %s, eac_disposal_cost = %s, eac_eac = %s , updated_by = 'Sys', updated_at = NOW() WHERE assetnum = %s AND tahun = %s; """ @@ -112,6 +113,7 @@ class Eac: float(final_value), float(pmt_mnt_cost), float(pmt_aq_cost), + float(eac_disposal_cost), float(eac), equipment_id, row["tahun"], @@ -158,7 +160,7 @@ class Eac: # Total NPV pada titik proyeksi ini = NPV aktual terakhir + biaya proyeksi yang didiskontokan final_value = float(last_npv) + float(discounted_proj) - + # Gunakan seq penuh (jumlah periode dari akuisisi) untuk menghitung pembayaran tahunan pemeliharaan. # Menggunakan hanya selisih dari seq aktual terakhir # (sisa_periode) mengamortisasi seluruh nilai sekarang selama @@ -170,11 +172,12 @@ class Eac: # Menghitung PMT # Rumus PMT: PMT = PV * [r(1 + r)^n] / [(1 + r)^n – 1] - # dimana PV = final_value, r = inflation_rate, n = row["seq"] + # dimana PV = final_value, r = disc_rate, n = row["seq"] # periods adalah jumlah periode # final_value adalah PV pada titik proyeksi periods - pmt_mnt_cost = -float(npf.pmt(inflation_rate, periods, final_value)) + pmt_mnt_cost = -float(npf.pmt(disc_rate, periods, final_value)) + eac_disposal_cost_proyeksi = 0.07 * pmt_mnt_cost # menghitung PMT biaya akuisisi # Rumus PMT: PMT = PV * [r(1 + r)^n] / [(1 + r)^n – 1] # dimana PV = rc_total_cost_0, r = disc_rate, n = row["seq"] @@ -200,7 +203,7 @@ class Eac: # Update lcc_equipment_tr_data update_query = """ UPDATE lcc_equipment_tr_data - SET eac_npv = %s, eac_annual_mnt_cost = %s, eac_annual_acq_cost = %s, eac_eac = %s + SET eac_npv = %s, eac_annual_mnt_cost = %s, eac_annual_acq_cost = %s, eac_disposal_cost = %s,eac_eac = %s , updated_by = 'Sys', updated_at = NOW() WHERE assetnum = %s AND tahun = %s; """ @@ -210,6 +213,7 @@ class Eac: float(final_value), float(pmt_mnt_cost), float(pmt_aq_cost), + float(eac_disposal_cost_proyeksi), float(eac), equipment_id, row["tahun"], diff --git a/src/modules/equipment/__pycache__/Eac.cpython-311.pyc b/src/modules/equipment/__pycache__/Eac.cpython-311.pyc index 16527957be36a8d099b4f4e580af5c396f10037b..e7bb452f6ffe8d8113a18cdeb91a6710c4fee644 100644 GIT binary patch delta 2249 zcma)8Yiv_h9KWYs-|yRXeXU!&c4cMlp0bCGISr^}LiZ4mz}%MI4hq}4-FwFvv^)}C zLk;NvlY)R>#><(_`hge{(L@tIXjZc?Hql^W;s-I=0!Bij@%--?+jx4C^E>}@{_o%E zx#{;K-|jbFG#IoD9YeqP<6})z#tDU0Pq%V9?=)!`=D7QK{&5dP3ciG6%2Sd2q>@uP z(Lov~-E^;B+^19=IqBg@O3i6f8Yt5`i3YZ-R_nAon3RrAy=a9gpUb$GIZZmMx62qN zWk?y}2emWD$Z4J6)7jx)mC5GrC7kYvTC^@?Vwj{J^tuQ!L5tcRaVL$Oelc&-G)^nN zid9QP$E3`hA!**Hpb0GKQU0ih>M;*CX-=~HsDH|u)WNjczGit2BWGNi5v`L}&cvC| zs>TV;PUrj}3};E@V)w8{W269|VgLX_n_ zp7e;G1s!F>v^-}@eVV+xDk;BUf?wrUXz^KO91CIXHll|UTA$|9Q@OV1pYZg`IO`MG zUJW9Kn?bd4rNB@|5DXS2>cMcEmcA6`s z;yrMett3JCJy;0qtbJ-4Z!jTr_oY9v>SZJ!KC`_-&cd9nSJqv;U}Rk|>g-7fqIZqA zSO~*}^&NOCFR8@4=2t*AFG31{zBm$w8hZr{*+o~@66@~iT;|Ldp}8M!+gqw!k7+vx z`NU{!w-C>g81F_)3qlD6p@0IkI`W{)p&(7L!_j5hKws^>d-o18v$77krUFidUIn-F zCuO~%Y>ugi`_8yeGg&=3{Kbpc_Gi4!Gv4Ou!sgTZTY-{G4VgggwAuHU5k_4fX{HOx zGmeTGM+KPOxi*v9mN%!+S=hS_g;@z)Q12d6H4_6n$27x~`-VS$&3>aa6Wllx+?er3 zXS~tr!YGX$shoTx6KR?@ucWcZ@;|4s>oSh|8Am#yerc~SJk!MzU+8pv99f~$jnk|s$6yX!+3laPXUIghXB!UBU3+}*f_)4dM zi$w-jGQv;BWf{K$ZEN7WqIUYparxg`>>d2nL5(f zgPTd=bNYnJl14K=BYq`9DMATjbZ~r_=8Znay?2> zSQUDm+({n@U6Cof@njd2g`2Ez%M}%~%o1FyN*@jf6(k0iDmxB#QOl5-&q0TWrDXMO z!vkWxKemqN6FeVAr5r)3s~jaI0+y7O_r(V0Yu|-ul?YP7^;8OJ`6b1oxrRQIo|quS zxU6<)7>-o2W{J{u=odqX!gy7IVuXsd>6=w&QDK4 delta 2151 zcmb7EZERCj7(QpWpSQhjZ@Z25wp+W8cI(DU=O!B1jq+1My*F!Istc5DPXcH1#N z?qy&|KmuX%#uyQCf1H6u1*^$^7y^nvAvBqP8j1SDe;77}gcyH#-dn~tJ_Jv4p8KBj zew_Dt&b{}?1J{Qgp9=y{*r>P_?AKntu8gtnq;#N zWA&k#+1fI1ZIS75zf3i&Y}I&(TYZ#=-TaC++jgSa*%Y##*<3Xdmn9QK~JILoA7D%*}&7L*a7*3vZM%Fgvcb_laY-;-Fn zea@x2#u={(LA4kAU5Wk9KhP-)^N+_A)gwD( z=UMYY{*=frh*_iXkr03hYXDBM`G??MvY9gfZxdxF%EY-CP{TB6izzN~p}NA_f+b1T&c+qfz}(R>Ge zGD#3ww}$C3*~@Jr!!%l&1|+`I&G3N=Ql#aLw(ZXCPJH3-=aj zrVw)|5!mZ(q5&9Z*a%bJxUFE7`!hXTm1H&r21Z1|OIE7kw6DuSQ+iuU9oxzTK$I#V zE^V__8VR|7{}7oj*_1mgRZ~-&5St-waLwOe?wI5z*L=rcc|9NMnhJH@40es$@428e za0c!M#4^ELRz73oMfY98U|I(+NEL(PIx4tl2;%#eQEoKxD_r;c;MUoBB8DGZ{u3R=Mi24}6c6282c!Zg_3^ zVl;KWEod!8XhUdc5Va{*_9$4AnM^919@?cWN7o93M!4Uw#IzR84rppzOYh|NG+rn% zZN;5Fh{RTV-sX()X)+I06C8?3If&Vfv>^(%Jr9sWpl+ zpeT*##DBh`HycCCgn)e(xSgqVkx(D*#SwHCIstxu#~5zitqk;}7#+F54-SFa>UQaZ zufe&IM~zPk%uX@miUEil;LB)x!Ul0kvX?8_8N1~LW1?qs%4 ziNj=j`v}%h`Vn;59`Y*+h?h_>r1th_iwrXuIL9!H%ST$%FJ=%OI@b=gkYCCNPzK8o4ZPUan diff --git a/src/modules/equipment/run.py b/src/modules/equipment/run.py index 461feb9..208f294 100644 --- a/src/modules/equipment/run.py +++ b/src/modules/equipment/run.py @@ -23,11 +23,11 @@ async def main(): # print(f"Error in query_data: {str(e)}") # return - try: - await predict_run() - except Exception as e: - print(f"Error in predict_equipment_data: {str(e)}") - return + # try: + # await predict_run() + # except Exception as e: + # print(f"Error in predict_equipment_data: {str(e)}") + # return try: # eac = Eac()