From caa667f2b82344cfe1db405932d1b0df1ec5dbed Mon Sep 17 00:00:00 2001 From: MrWaradana Date: Thu, 30 Jan 2025 13:33:16 +0700 Subject: [PATCH] feat: chart data api --- .../__pycache__/model.cpython-311.pyc | Bin 4123 -> 6583 bytes .../__pycache__/router.cpython-311.pyc | Bin 4911 -> 5605 bytes .../__pycache__/schema.cpython-311.pyc | Bin 7686 -> 12136 bytes .../__pycache__/service.cpython-311.pyc | Bin 4024 -> 4599 bytes src/plant_transaction_data/model.py | 34 ++++++++++++++ src/plant_transaction_data/router.py | 16 ++++++- src/plant_transaction_data/schema.py | 43 ++++++++++++++++++ src/plant_transaction_data/service.py | 12 +++++ 8 files changed, 103 insertions(+), 2 deletions(-) diff --git a/src/plant_transaction_data/__pycache__/model.cpython-311.pyc b/src/plant_transaction_data/__pycache__/model.cpython-311.pyc index f743fa1823cc2d74d18c77bb7f7e2ef033134bc5..cd2bc246eb1dc6ce15741f6973968511af09a64e 100644 GIT binary patch delta 1822 zcmbu9&u`mg7{{C8ma3zfSQB?knqQ5Zjzq1XE2-N2Y9UQX8Qp-i6d1Cc#M!(xc1fHH zkdXHmAdoMScJU2QNXXL;>y6&Hq1TdyEdK#q=>+1y3Fq+^J8pI&NW!xumaoxz7M*ms7_ZxUtzor^+tLx; zX1E4ZCtCu=usqFDY@N2Me0G&%nORG%Q%Ceyj)f?La2hp+`kEpc_L%PQREHsXs#T-z zQmirOtfJ~)c9{;tGaO6S1#^1i`4Coj$EtX#c6DG2=aTacyuS4!yu^@d=jV=ZcBsy=WME(ng(#R; zjxrWq=1YT&xC)1|>_=%&=1%j`*kAqsm46GxjoY_w>_&@~a;3T@-k;jKfW7+U=cx=P z=z(Z2A^8;_3Z&IQS_`BRHml=v-#2@Eauwk#D!!uOD-Uk|FD_73L`Mf%x*XHvGi;P?*wkYB9_z8w$IW?BkVmX9`^-#RGFKsJD6k1n9 z>sn|XVFB^+G%h6HloN{o)Q6HKHCfVN!B{UXEhq#EuBpK_Ex3lTD|(pdHKjeJ ziozRectZCe2mNcl)0B%-aYs=EZ8?>*Id^icMx)T%&tP=i8jfUAnV<;PK?n#zwQZD$U8? NJ_Gmfm()P({{Z2xy6FG_ delta 166 zcmdmPJX?WpIWI340}y=Dot(aodm`U6rYP2p-y&EiAL6uUwBF3bb)0#!j$k;GJ>{8<-V&nBVze}Fn(5j{?Al$cdo*Ce zV&cJgGj+hk3tmw4pb4J1z=?wwhh(Fq6A~{ZU_2}&Ts&ES&F<{TLSkZ1_cwq4e|=y5 z|6f%zKaSiRwZBa!V~V&QmcO1koc_`-EN#&g<&xqmF7gzLFrq3}5xlFOMs=)H0~^%D zCbh67{F;^6NK3dR?Wk9#6a%p0OrTt$ki5dDfs{s*W)UbseTm(y!+ zz29z}RQaE%d`yrmH+cmKns_>w^x6ORO{;DnDY+?9aMMI3!-H#s6}Ml!Z{lyG>geWY zPM0B7f=F_m#s5N;38^=&yV=j4Onl2Tm2yHUvC7VqO@dw6z}_m@Bi#gh3@E$9-d}PD ziR~6iW!iL08x)=s3eWctyQbTn|6s`#^9z+esSX^Z_0QbR(L)c}S8s(ib#s|*{36$R7{CI?i(Q3Dv}7Yt_9g_+}z z4L@e>=%_VSelwEc-++SoI+clB8*9~Dc1=c zUmQ23R;w{+erR{|mO=KCaE^+{pA~Rld@d^Y^26WZn`S$I^mhK}a{g#L{p5Y|#GQC{ zMbVAeUAuI*FvMR^6swOTN}_zZ*xq%z9dF!@HUF zHH?8VOVZaxS#KVS?_uslU<92olIg76*yQ(J5W3|fAKL0hgW@+`<> z_;+NVP;GhS0Gkvc_?z%O(V`U%A#_I>Za?kjucXG8Or)+T{}*fp9YJm7@PEJmP)@bs z=J!)c{wVe9$UlPju)Ceh`0RuuSdk00w8z4%a5 T)HA3%b|rJ|diq18!-n|>AREWM delta 1550 zcmbVM&1)n@6z`h;m`=|}&u223^knj3J|>ZMHBqA*mR;0Egv~B&^iZh7>{Lw>=}Ly` z8D&ApB_N0%);f6gw6X}wvf@c^{sFlujh6-YAb8k|EbL+Ny_$?6i3hRh`SISbey`qd zUKjmv`Mde-*O`oGz}h(YWNX&HovrNukT8rd4Q4PB8iG(lFiwOCVNz3A)Dkweg+m?S zO=g8j;Zj$}b~qwD>WLIhi8M`%49#fX3A4hdzR1y>$kV(i(1Iw^qCPhnmPDDB#V8%s zxf{MbCMvX|laX*-RB2VmUN|8F8W1C4aPtlr{svv^MQgnFm9H)*ib;c|c)&gNEvbee zbXevN0V(_jOLN(iTqnVNUST<2W_eEdjt`P8tvZLks#z97Mj zKCjH{9gB?~Sf}*Upr1jrpa-*{pV#^^o@NzZ?Ko`wOwBCRJabet=&>~H!Nzz-*SV~E zrfv@EiYMxphjrj>;*5TtWp5ab;18TYgQ)k+8^lug%nPb+l~u)>_3hZ);=MQt&}@a_ z{dcVQNp1qvvW75;5U8K+7Xu%|F@T0GwID!Zpi*T=+VhZ?)n`tm9=N|bTC%8qN?ux@ zLg6$3RAw=@5gdTH@aE>`_2%mN)#k>v&E}PBZ*RP=d)ze#Jr>o|kx4SAYF^cT0ScDX zx~Is3I`qCDbXZZJrs}Wh!>!obZ3!NGZOL0b&YCxG$sBglrmew&D@d#&JP#0A08_B! zocc3Wv)3S9SJ||H79Xeo3YJi~jPNW#@VOb;Xllwqu3PD){!ms*q>gT#e-%58qU93 zDd4_te;%U91Q>LlelS%J;p;hg0T~|x4CFZ{0PYuLK-21d&!8)4|m#p;8Ncx{f2NV5?#inNVfOS z!OU7WTM<7u)E7}uLO~t`$NTL)$z>V&9P+JxZ~LE`QKUVjwYx}9Aa>+lzsF^4?(Ftr zGwMl+_g3QNimmP*5NlU4HoN_v#OX^M&|O2~P~;rI6L%dB?1%iK+<+86MNtA~^vEQH q{Ax@bo_y5p!dk~BiATo&gS0_jJv3hVFORxZ{Qdq%r4NXOX8#88HbN@^ diff --git a/src/plant_transaction_data/__pycache__/schema.cpython-311.pyc b/src/plant_transaction_data/__pycache__/schema.cpython-311.pyc index e2f6d8041ab369cfa437288c9642353287a70bda..f03b06ca0ae3e8c5c0483acc89a0322569175f72 100644 GIT binary patch delta 2285 zcma)+O-$Qn7{_gRfwX+4gd_wgTX6=o>Z%2@v60bkK+8rxppZ0!u9=gV;w^EguHB+?_)P#E|r?ZKRtdv{*PZj z@0;&Df8A>PrM2}mMLxyuN4J0L*=n=X&$b5F=u=w{7e<Kd~nLuq=Nu*c_U+Fk@d<;&I z7bgKz5Ux*4qBy;G)%>pMlpnm!1bCjd)=^D+JpEr|Hcpd9!)n)Df)%7ikrmQxOyX0* zdti`ximbVQAg7&x*ZRH})qc7uo@ zWY`3Mmy4@CdSoTTB_gp@S|UiUr36kOR!O-WR2{}_wxVR!V<|34G_oa;Xk0Z{0@1kE zL>;KO);N(*#raqy$?}5439Jy~^dw6qsj7`l_r};Y?whKIWmTp+kd5-}1{>jpbuKNj zX+9#c$tb(Z3Tkh48XLQl;nO?}M(_Dz5xRO+SL;eTq8HXq=STMm{-QuPX|1+(P@weN(Ys+Dz@!}{c^24|@Wm1g%=jrSGf%cdpO zR+CuO(oqh)JjFpn?3HuuHzd}M68cwGW*q16Me!;ey=#COKodYajtyXa0{9eAKAqxq zxSa(o02Tp3KnQRH5C(h($Swhw0XG4k18xB#fG+?nAPR^9;s6e?0=NxW1@M3`0bcSY@dRBc;3PcxZcY<3us@GU0%iIExNoiI=gMkb?vmvh}d2Q zd9l^z#D7>AX8cOQy>F4{7Ul7vG9E0B2W2#vv*(?=M3mS;1qJc1Rww@5#>{v=DopP) z@_bPCgcMJx=n2VaC^wXM?_QD-u|o<99ge=ApDr*57J1aKjQWeCei^;7J(P3rkQ`$B z739~t+iVPe+rr>KJImK=t?(zi6Y2)sALN6D(E~9GCH4|$p?2yCb7c`3gZKt^X6;3y2Hy;h0LL; z_fa{pKg`WEcxlvpT}K}$+=09 zVmS(u_sicyWV%14i)M)E?8S9RHVABhPXicV1GG)JfxmYw zyA0>95yIL*GpKAr0I-f7J?9!Vg-xQ+jhB0tJqDF5B%@NriF)@S3b>1(^}N%f>A|gk z*o-gr`aIg{(AKU!y4GH+seP`0O`c>bo=I>M;sa7mlPi4>@AW=%4boovh&q`MXOFeW Y^Xm8__Vrz$P1xUe9zX7jAb6zz0X(zQ^8f$< delta 510 zcmaD6*Ji`FoR^o20SNMRC#N40n8+u=cx|G30VDUs8NuRQ%a|D$Rs%5vMDeEx1T$y~ zZkA&d=VsL0Y{v73*@_n^SHub=ZZT)(mE7Wwk5A0Y%P&bR$;{6yj*l z&}?G^De(jmX!eGI#6X1iWEUMJh`nJzQ%Y>mOo#$0WPz#1YE~pj7DV_@meDoj0lNsq z_0trX9I5MT4)!D1>0n#I%2A#3i^C>2KczG$)vhQWsF4wfi@hg5(w#kdgPs;68<5nU L%%LB{0x}u^q1a}x diff --git a/src/plant_transaction_data/__pycache__/service.cpython-311.pyc b/src/plant_transaction_data/__pycache__/service.cpython-311.pyc index 79aa31862d445c5664f9845cff947d452098b776..e1fc8d9aac0cc1c64df979e711e0b1c5a7680d91 100644 GIT binary patch delta 653 zcmZ9IJ#5oJ6vusz?KrmMpu|m+%A!^RZ9Y^=oE8QmB9QnP5ULunbg8V^X+dc#&dvZT zYWSGw0MSV-EZJZL1tc~mm>BBFRZs_%ZcL~PLaG>em$1P3?sxD1*Ynf6_hI^1R(%zX zN(`)y{&HZmF7yEFUoa)Y(wPq>w&9dTlI!Vw#st%05#=?O;wFVYa~BzUQjCpmG* znFO7-qctX<>gnhQhmMIXyha7`PWVJ>a*|aMG1wI%@@1agX1Y8%l+OweLffIPK&*&H zhHMOl|3>N#)M2p!-QCQKI0QEqDNa$G1{{Pew~i;MOpaxXNIOqHiym6&U5HF0qeTA; zyN+jh9>!%*d13tg1&HxHxi6jLD-d4ly_dcqR3?v<0$&B=7I~{Y&rTgk?%k%ZgTg$8K#?JK^kJnyLpmr-Tfnp;rd4p3f_6We>#FH`3 W=@FD2o=6|@a33-MB1INskN*JYRi)1W delta 254 zcmeyayhEOEIWI340}!z5O-|3}oX97^_+g^@ezO#zRE{*36yX+@D6tgIRQ?o^R5qX( zXBu0IC{RosEXI{81XLpi7A|d81E5vflb>*vFzRoP;edFiK8N;8$c+oZQ6UD5?q40kWY8q@f6; ds7PtDtbhcUGmyy$#KluK+Y3lCPA(B_1^~tGJY)a> diff --git a/src/plant_transaction_data/model.py b/src/plant_transaction_data/model.py index e28dd38..387a8ae 100644 --- a/src/plant_transaction_data/model.py +++ b/src/plant_transaction_data/model.py @@ -58,3 +58,37 @@ class PlantTransactionData(Base, DefaultMixin, IdentityMixin): calc4_principal_repayment = Column(Float, nullable=True) calc4_free_cash_flow_on_equity = Column(Float, nullable=True) calc4_discounted_fcf_on_equity = Column(Float, nullable=True) + chart_total_revenue = Column(Float, nullable=True) + chart_revenue_a = Column(Float, nullable=True) + chart_revenue_b = Column(Float, nullable=True) + chart_revenue_c = Column(Float, nullable=True) + chart_revenue_d = Column(Float, nullable=True) + chart_revenue_annualized = Column(Float, nullable=True) + chart_fuel_cost_component_c = Column(Float, nullable=True) + chart_fuel_cost = Column(Float, nullable=True) + chart_fuel_cost_annualized = Column(Float, nullable=True) + chart_oem_component_bd = Column(Float, nullable=True) + chart_oem_bd_cost = Column(Float, nullable=True) + chart_oem_periodic_maintenance_cost = Column(Float, nullable=True) + chart_oem_annualized = Column(Float, nullable=True) + chart_capex_component_a = Column(Float, nullable=True) + chart_capex_biaya_investasi_tambahan = Column(Float, nullable=True) + chart_capex_acquisition_cost = Column(Float, nullable=True) + chart_capex_annualized = Column(Float, nullable=True) + fs_chart_total_revenue = Column(Float, nullable=True) + fs_chart_revenue_a = Column(Float, nullable=True) + fs_chart_revenue_b = Column(Float, nullable=True) + fs_chart_revenue_c = Column(Float, nullable=True) + fs_chart_revenue_d = Column(Float, nullable=True) + fs_chart_revenue_annualized = Column(Float, nullable=True) + fs_chart_fuel_cost_component_c = Column(Float, nullable=True) + fs_chart_fuel_cost = Column(Float, nullable=True) + fs_chart_fuel_cost_annualized = Column(Float, nullable=True) + fs_chart_oem_component_bd = Column(Float, nullable=True) + fs_chart_oem_bd_cost = Column(Float, nullable=True) + fs_chart_oem_periodic_maintenance_cost = Column(Float, nullable=True) + fs_chart_oem_annualized = Column(Float, nullable=True) + fs_chart_capex_component_a = Column(Float, nullable=True) + fs_chart_capex_biaya_investasi_tambahan = Column(Float, nullable=True) + fs_chart_capex_acquisition_cost = Column(Float, nullable=True) + fs_chart_capex_annualized = Column(Float, nullable=True) diff --git a/src/plant_transaction_data/router.py b/src/plant_transaction_data/router.py index 8d280f9..fdbc37e 100644 --- a/src/plant_transaction_data/router.py +++ b/src/plant_transaction_data/router.py @@ -1,14 +1,15 @@ -from typing import Optional +from typing import List, Optional from fastapi import APIRouter, HTTPException, status, Query from .model import PlantTransactionData from .schema import ( PlantTransactionDataPagination, PlantTransactionDataRead, + PlantTransactionChart, PlantTransactionDataCreate, PlantTransactionDataUpdate, ) -from .service import get, get_all, create, update, delete +from .service import get, get_all, get_charts, create, update, delete from src.database.service import CommonParameters, search_filter_sort_paginate from src.database.core import DbSession @@ -39,6 +40,17 @@ async def get_transaction_datas( ) +@router.get("/charts", response_model=StandardResponse[List[PlantTransactionChart]]) +async def get_chart_data(db_session: DbSession, common: CommonParameters): + chart_data = await get_charts(db_session=db_session, common=common) + if not chart_data: + raise HTTPException( + status_code=status.HTTP_404_NOT_FOUND, + detail="A data with this id does not exist.", + ) + return StandardResponse(data=chart_data, message="Data retrieved successfully") + + @router.get( "/{transaction_data_id}", response_model=StandardResponse[PlantTransactionDataRead] ) diff --git a/src/plant_transaction_data/schema.py b/src/plant_transaction_data/schema.py index 57844d6..d13f352 100644 --- a/src/plant_transaction_data/schema.py +++ b/src/plant_transaction_data/schema.py @@ -65,9 +65,52 @@ class PlantTransactionDataBase(DefaultBase): updated_by: Optional[str] = Field(None, nullable=True) +class PlantTransactionChart(DefaultBase): + tahun: Optional[int] = Field(None, nullable=True) + is_actual: Optional[int] = Field(None, nullable=True) + seq: Optional[int] = Field(None, nullable=True) + chart_total_revenue: Optional[float] = Field(None, nullable=True) + chart_revenue_a: Optional[float] = Field(None, nullable=True) + chart_revenue_b: Optional[float] = Field(None, nullable=True) + chart_revenue_c: Optional[float] = Field(None, nullable=True) + chart_revenue_d: Optional[float] = Field(None, nullable=True) + chart_revenue_annualized: Optional[float] = Field(None, nullable=True) + chart_fuel_cost_component_c: Optional[float] = Field(None, nullable=True) + chart_fuel_cost: Optional[float] = Field(None, nullable=True) + chart_fuel_cost_annualized: Optional[float] = Field(None, nullable=True) + chart_oem_component_bd: Optional[float] = Field(None, nullable=True) + chart_oem_bd_cost: Optional[float] = Field(None, nullable=True) + chart_oem_periodic_maintenance_cost: Optional[float] = Field(None, nullable=True) + chart_oem_annualized: Optional[float] = Field(None, nullable=True) + chart_capex_component_a: Optional[float] = Field(None, nullable=True) + chart_capex_biaya_investasi_tambahan: Optional[float] = Field(None, nullable=True) + chart_capex_acquisition_cost: Optional[float] = Field(None, nullable=True) + chart_capex_annualized: Optional[float] = Field(None, nullable=True) + fs_chart_total_revenue: Optional[float] = Field(None, nullable=True) + fs_chart_revenue_a: Optional[float] = Field(None, nullable=True) + fs_chart_revenue_b: Optional[float] = Field(None, nullable=True) + fs_chart_revenue_c: Optional[float] = Field(None, nullable=True) + fs_chart_revenue_d: Optional[float] = Field(None, nullable=True) + fs_chart_revenue_annualized: Optional[float] = Field(None, nullable=True) + fs_chart_fuel_cost_component_c: Optional[float] = Field(None, nullable=True) + fs_chart_fuel_cost: Optional[float] = Field(None, nullable=True) + fs_chart_fuel_cost_annualized: Optional[float] = Field(None, nullable=True) + fs_chart_oem_component_bd: Optional[float] = Field(None, nullable=True) + fs_chart_oem_bd_cost: Optional[float] = Field(None, nullable=True) + fs_chart_oem_periodic_maintenance_cost: Optional[float] = Field(None, nullable=True) + fs_chart_oem_annualized: Optional[float] = Field(None, nullable=True) + fs_chart_capex_component_a: Optional[float] = Field(None, nullable=True) + fs_chart_capex_biaya_investasi_tambahan: Optional[float] = Field( + None, nullable=True + ) + fs_chart_capex_acquisition_cost: Optional[float] = Field(None, nullable=True) + fs_chart_capex_annualized: Optional[float] = Field(None, nullable=True) + + class PlantTransactionDataCreate(PlantTransactionDataBase): pass + class PlantTransactionDataUpdate(PlantTransactionDataBase): pass diff --git a/src/plant_transaction_data/service.py b/src/plant_transaction_data/service.py index a3e6da9..cafe417 100644 --- a/src/plant_transaction_data/service.py +++ b/src/plant_transaction_data/service.py @@ -40,6 +40,18 @@ async def get_all( return results +async def get_charts( + *, + db_session: DbSession, + common, +): + """Returns all documents.""" + query = Select(PlantTransactionData).order_by(PlantTransactionData.tahun.asc()) + results = await db_session.execute(query) + + return results.scalars().all() + + async def create( *, db_session: DbSession, transaction_data_in: PlantTransactionDataCreate ):