
    wh.                     4    d dl mZ d dlmZmZ  G d d      Zy)    )Session)DictAnyc                   H   e Zd ZdefdZdedeeef   fdZ	dedeeef   fdZ
dedeeef   fdZdedeeef   fdZdedeeef   fd	Zdedeeef   fd
Zdedeeef   fdZdedeeef   fdZdedeeef   fdZdedeeef   fdZdeeef   fdZdeeef   fdZy)DatabaseServicedbc                     || _         y )N)r   )selfr   s     B/var/www/html/retail-simulation-api/app/api/module10/db_service.py__init__zDatabaseService.__init__   s	        simulation_idreturnc           
         	 | j                  |      | j                  |      | j                  |      | j                  |      | j	                  |      | j                  |      | j                  |      | j                  |      d}|S # t        $ r1}t        dt        |              | j                         cY d}~S d}~ww xY w)z/Get simulation inputs from database dynamicallymodel_a_assumptionsmodel_b_assumptionsonline_assumptionssensitivity_params
brand_data
sales_datainvestment_dataoperational_datazDatabase error: N)_get_model_a_data_get_model_b_data_get_online_data_get_sensitivity_data_get_brand_data_get_sales_data_get_investment_data_get_operational_data	Exceptionprintstr_get_sample_data)r
   r   inputses       r   get_simulation_inputsz%DatabaseService.get_simulation_inputs   s    	+ (,'='=m'L'+'='=m'L&*&;&;M&J&*&@&@&O"22=A"22=A#'#<#<]#K$($>$>}$M	F M 	+$SVH-.((**	+s   BB 	C&B<6C<Cc                    	 | j                  |      }i }d|v rP|d   }|j                  dd      dz  |j                  dd      dz  |j                  dd      dz  d|d<   d	d
dd|d<   d|v r	dd	d
d|d<   d|v rdddd|d<   dddd|d<   |S # t        $ r1}t        dt	        |              | j                         cY d}~S d}~ww xY w)z/Get period-based inputs for dynamic calculationr   B9      @
         Y1_Y2Y3_Y4Y5_Y6investment_capital_expenses      .@      (@      $@bills_per_monthr         4@	inventoryr         @rent       @      @      @	utilitieszError getting period inputs: N)r(   getr"   r#   r$   _get_default_period_inputs)r
   r   	base_dataperiod_inputsmodel_ar'   s         r   get_simulation_period_inputsz,DatabaseService.get_simulation_period_inputs   s"   .	5 22=AIM %	1#$9:$[[s3b8$[[s3a7$[[s3a7@;< "!!4/0 y(!!!.k* "Y.   )f% !  .k* !  	51#a&:;2244	5s   BB 	C&C=CCc                     ddddddS )z%Get Model A assumptions from database        2   r+   B5B6B7B8r*    r
   r   s     r   r   z!DatabaseService._get_model_a_dataN   s    
 
 	
r   c                     ddddddS )z%Get Model B assumptions from database                 @rK   rP   rQ   s     r   r   z!DatabaseService._get_model_b_dataZ   s     
 	
r   c                     ddddS )zGet Online business assumptions  	     rL   rM   rN   rP   rQ   s     r   r   z DatabaseService._get_online_datad   s     
 	
r   c                     ddddS )z#Get sensitivity analysis parameters皙?      ?333333?C4D4E4rP   rQ   s     r   r   z%DatabaseService._get_sensitivity_datal   s     
 	
r   c                    	 ddl m} ddlm} | j                  j                  |      j                  |j                  |k(        j                         }| j                  j                  |      j                  |j                  |k(        j                         }|r|j                  ndt        |      t        d |D              dS # t        $ r}ddd	dcY d
}~S d
}~ww xY w)zGet brand and store format datar   )TblBrand)TblStoreFormatzDynamic Brandc              3   <   K   | ]  }|j                   xs d   ywr   N)
store_size).0sfs     r   	<genexpr>z2DatabaseService._get_brand_data.<locals>.<genexpr>   s     'S]r(:(:]   
brand_namestore_formatstotal_store_sizezSample Brand     N)app.models.main.brandrf   app.models.main.store_formaterg   r   queryfiltergroup_idfirstallrp   lensumr"   )r
   r   rf   rg   brandrq   r'   s          r   r   zDatabaseService._get_brand_datat   s    	`6D GGMM(+2283D3D3UV\\^E !GGMM.9@@''=8ce 
 38e.._!$]!3$''S]'S$S 
  	`"01Z^__	`s   CC 	CCCCc                    	 ddl m} | j                  j                  |      j	                  |j
                  |k(        j                         }d}d}d}|D ]O  }|j                  dk(  r||j                  xs dz  }&|j                  dk(  s6t        ||j                  xs d      }Q ||z  dz  }|||dS # t        $ r}ddd	dcY d
}~S d
}~ww xY w)zGet sales and revenue datar   )TblSalesEstimatezNumber of Bills per Monthz"Average Price per item (in Rupees)rV   total_monthly_salesr7   average_price_per_item`   r,   N)app.models.main.sales_estimater   r   rw   rx   ry   r{   	parametervaluemaxr"   )	r
   r   r   r   total_salesr7   	avg_pricesaler'   s	            r   r   zDatabaseService._get_sales_data   s    	kG'78?? ))]:ce  KOI">>%@@#tzzQ6O^^'KK #ItzzQ ?I	 # *I5:K (3#2*3 
  	k+2tgijj	ks$   BB5 )B5 5	C>C	C	Cc                    	 ddl m} ddlm} ddlm} | j                  j                  |      j                  |j                  |k(        j                         }| j                  j                  |      j                  |j                  |k(        j                         }| j                  j                  |      j                  |j                  |k(        j                         }t        d |D              }t        d |D              }	t        d |D              }
||	z   |
z   ||	|
z   dS # t        $ r}d	d
ddcY d}~S d}~ww xY w)z'Get investment and capital expense datar   )TblCivil)TblDisplayRackingUnit)TblCarpentryc              3   ^   K   | ]%  }|j                   xs d |j                  xs d z   ' ywri   )rate_per_sqft
total_sqftrk   items     r   rm   z7DatabaseService._get_investment_data.<locals>.<genexpr>   s-     n]mUYt116Q4??;OaP]m   +-c              3   ^   K   | ]%  }|j                   xs d |j                  xs d z   ' ywri   number_of_unitscost_per_unitr   s     r   rm   z7DatabaseService._get_investment_data.<locals>.<genexpr>   s0     wdv\`!5!5!:t?Q?Q?VUV Wdvr   c              3   ^   K   | ]%  }|j                   xs d |j                  xs d z   ' ywri   r   r   s     r   rm   z7DatabaseService._get_investment_data.<locals>.<genexpr>   s0     !{fz^b4#7#7#<1ASASAXWX"Yfzr   total_capital_investmentcivil_work_investmentequipment_investment@KL 逄 - N)app.models.main.civilr   $app.models.main.display_racking_unitr   app.models.main.carpentryr   r   rw   rx   ry   r{   r}   r"   )r
   r   r   r   r   civil_investmentracking_investmentcarpentry_investmenttotal_civiltotal_rackingtotal_carpentryr'   s               r   r    z$DatabaseService._get_investment_data   s3   	|6R>  $ww}}X6==!!]2 ce  "&/D!E!L!L%..-?"ce  $(77==#>#E#E%%6$ce ! n]mnnKwdvwwM!!{fz!{{O -8-,G/,Y)4(5(G 
  	|07RYsz{{	|s   D%D( (	E1D<6E<Ec                 v   	 ddl m} ddlm} ddlm} | j                  j                  |      j                  |j                  |k(        j                         }t        d |D              }| j                  j                  |      j                  |j                  |k(        j                         }t        d |D              }| j                  j                  |      j                  |j                  |k(        j                         }	t        d |	D              }
|||
dS # t        $ r}d	d
ddcY d}~S d}~ww xY w)z)Get operational expenses and utility datar   )TblRentExpenses)
TblUtility)TblOperatingExpensesc              3   <   K   | ]  }|j                   xs d   ywri   )rent_per_month)rk   r;   s     r   rm   z8DatabaseService._get_operational_data.<locals>.<genexpr>   s     L)$T005A5)rn   c              3   <   K   | ]  }|j                   xs d   ywri   )cost_per_month)rk   utilitys     r   rm   z8DatabaseService._get_operational_data.<locals>.<genexpr>   s     !Z\''"8"8"=A"=\rn   c              3   <   K   | ]  }|j                   xs d   ywri   )percentage_of_sales_per_year)rk   ops     r   rm   z8DatabaseService._get_operational_data.<locals>.<genexpr>   s!     !`Q_2""A"A"FQ"FQ_rn   monthly_rentmonthly_utilitiesoperating_expense_percentageI P  r4   N)app.models.main.rent_expensesr   app.models.main.utilityr   "app.models.main.operating_expensesr   r   rw   rx   ry   r{   r}   r"   )r
   r   r   r   r   	rent_data
total_rentutility_datatotal_utilitiesoperating_datatotal_operatingr'   s               r   r!   z%DatabaseService._get_operational_data   s%    	nE:O o6==((M9ce  L)LLJ  77==4;;##}4ce  "!Z\!ZZO "WW]]+?@GG$-->ce  "!`Q_!``O !+%40? 
  	n$*hlmm	ns   DD 	D8(D3-D83D8c                 :    dddddddddddddddddd	ddd
S )z2Default period inputs when database is unavailabler6   r<   r>   r/   r:   r8   r4   r5   r=   )r3   r;   r9   r7   r?   rP   r
   s    r   rA   z*DatabaseService._get_default_period_inputs   sA     6:CRU+V!C#>#'$F)-tL#&sC
 	
r   c                 `    ddddddddd	d
ddddddddddddddddddddddd d!d"d#d$S )%z Enhanced sample data for testingrG   rH   rI   rJ   r+   rK   rS   rT   rU   rV   rW   rY   rZ   r[   r\   r^   r_   r`   ra   zDynamic Retail Brandrs   rt   ro   r   r   r,   r   r   r   r   r   r   r   r4   r   r   rP   r   s    r   r%   z DatabaseService._get_sample_data   s     "Bb$ "Bb$ D# C# 5q^b (/4ce -4gov  !'Udh!-
 	
r   N)__name__
__module____qualname__r   r   intr   r$   r   r(   rE   r   r   r   r   r   r   r    r!   rA   r%   rP   r   r   r   r      sS   7 +3 +4S> +(05# 05$sCx. 05d

s 

tCH~ 


s 
tCH~ 

c 
d38n 

3 
4S> 
`S `T#s(^ `,kS kT#s(^ k:|# |$sCx. |@"n3 "n4S> "nH
DcN 

$sCx. 
r   r   N)sqlalchemy.ormr   typingr   r   r   rP   r   r   <module>r      s    " L
 L
r   