U
    O%i                     @   s  d dl mZmZ d dlmZmZmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZmZmZmZmZmZ d d	lmZ ed
dgdZejdee dee
feedddZejdeejdee
feeedddZ ejdee dee
feedddZ!ejdedee
feedddZ"ej#dedee
feeedddZ$ej%dej&d ee
feedd!d"Z'ejd#ee dee
feedd$d%Z(ejd#eejdee
feeedd&d'Z)d(S ))    )ListOptional)	APIRouterDependsstatus)Session)get_db)Employee)Loan)LoanTransaction)
LoanCreate
LoanUpdateLoanOutLoanTransactionCreateLoanTransactionOutCombinedLedgerRow)
get_or_404z/apiloans)prefixtagsz/employees/{employee_id}/loans)response_modelemployee_iddbc                 C   s0   t |t| d |ttj| ktj S )Nr	   )	r   r	   queryr
   filterr   order_by	loan_dateallr    r   7/var/www/html/me.goteku.com/backend/app/routes/loans.pyget_employee_loans   s    
r!   )r   status_code)r   bodyr   c              	   C   s   t |t| d t| |j|j|j|j|jdd}|| |  t	|j
| |jd|jpVd |jd|jd}|| |  || |S )Nr	   active)r   r   total_amountmonthly_deductiondescriptionremaining_balancer   zLoan disbursement: zNew loanr   loan_idr   transaction_dater'   debitcreditbalance)r   r	   r
   r   r%   r&   r'   addflushr   idcommitrefresh)r   r#   r   loanZ
initial_txr   r   r    create_loan"   s2    	
	

r5   z$/employees/{employee_id}/loan-ledgerc                 C   s   t |t| d |tttjtjktj	| k
tjtj }d}g }|D ]V}||j |j }|t|j|j|jr|jjnd|j|j|j|jtd||jd	 qP|S )z
    Returns all loan transactions for an employee across all loans,
    sorted by transaction_date, with a running combined balance.
    r	   r   N)	r1   r*   Zloan_descriptionr+   r'   r,   r-   combined_balance
created_at)r   r	   r   r   joinr
   r*   r1   r   r   r   r+   r7   r   r,   r-   appendr   r4   r'   max)r   r   transactionsr6   rowstxr   r   r    get_combined_loan_ledgerI   s:    	
 
r>   z/loans/{loan_id}r*   r   c                 C   s   t |t| dS Nr
   )r   r
   r?   r   r   r    get_loanv   s    rA   )r*   r#   r   c                 C   sJ   t |t| d}|jdd D ]\}}t||| q|  || |S )Nr
   T)exclude_none)r   r
   
model_dumpitemssetattrr2   r3   )r*   r#   r   r4   fieldvaluer   r   r    update_loan{   s    
rH   )r"   c                 C   s$   t |t| d}|| |  d S r@   )r   r
   deleter2   )r*   r   r4   r   r   r    delete_loan   s    
rJ   z/loans/{loan_id}/transactionsc                 C   s4   t |t| d |ttj| ktjtj	 S r@   )
r   r
   r   r   r   r*   r   r+   r7   r   r?   r   r   r    get_loan_transactions   s    
 rK   c              	   C   s   t |t| d}|ttj| ktj tj	 
 }|rF|jn|j}td||j |j }t| |j|j|j|j|j|d}|| ||_|jdkrd|_|  || |S )Nr
   r   r)   Zpaid)r   r
   r   r   r   r*   r   r+   descr7   firstr.   r(   r:   r,   r-   r   r'   r/   r   r2   r3   )r*   r#   r   r4   Zlast_txZprev_balanceZnew_balancer=   r   r   r    add_loan_transaction   s4    

		


rN   N)*typingr   r   fastapir   r   r   sqlalchemy.ormr   app.core.databaser   app.models.employeer	   app.models.loanr
   app.models.loan_transactionr   Zapp.schemas.loanr   r   r   r   r   r   app.helpers.crudr   routergetstrr!   postHTTP_201_CREATEDr5   r>   rA   putrH   rI   HTTP_204_NO_CONTENTrJ   rK   rN   r   r   r   r    <module>   sb    
  ")	
