o
    ȟ1i.                     @   s   d dl m Z mZ d dlmZmZ d dlmZ d dlmZ d dl	Z	d dl
mZ d dlmZmZ d dlmZmZmZmZ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 G dd dZdS )    )datetimetimezone)updateextract)
joinedload)existsN)get_db)CoreDBErrorGenericError)BursaryDiscountInfoBursaryDiscountApplicationParticipantUserUserProfileCourseAcademicYear)BursaryCourseAllocation)AcademicYearResponseSchema)BursaryDiscountInfoResponse)CourseResponseSchemac                   @   s   e Zd Zdd Zdd Zdd Zdefdd	Zd
d Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdefdd Zd!S )"BursaryDiscountServicec                 C   s   t  <}| }ztdi |}|| |  || |W W  d    S  ty> } z|  td| d }~ww 1 sBw   Y  d S )Nz,Could not create new bursary discount info:  )	r   
model_dumpr   addcommitrefresh	Exceptionrollbackr	   )selfrequestdbpayloadinstanceer   r   !/app/services/bursary_discount.pycreate_info   s   

z"BursaryDiscountService.create_infoc                 C   sj   t  (}|tttjtjd }|r |tj	|k}|
 W  d    S 1 s.w   Y  d S )N)r   queryr   optionsr   academic_yearfilter
deleted_atis_academic_year_idall)r   r,   r    r&   r   r   r$   list_all_info   s   
$z$BursaryDiscountService.list_all_infoc                 C   s   t  E}|tttjtjd tj	dk}g }|D ]}|
|j q|ttjd tj| }dd |D W  d    S 1 sKw   Y  d S )NTc                 S      g | ]	}t | qS r   )r   model_validater   .0recordr   r   r$   
<listcomp>/       zJBursaryDiscountService.list_bursary_info_academic_year.<locals>.<listcomp>)r   r&   r   r'   r   r(   r)   r*   r+   
is_enabledappendr,   r   whereidin_r-   )r   r    r&   bursary_info_academic_yearrowrecordsr   r   r$   list_bursary_info_academic_year'   s   &$z6BursaryDiscountService.list_bursary_info_academic_yearbursary_discount_idc                 C   sl   t  )}|ttj|ktjd  }|stdddt	
| W  d    S 1 s/w   Y  d S )N  Bursary discount not foundstatus_codeexc)r   r&   r   r8   r9   r*   r+   firstr
   r   r0   r   )r   r?   r    r3   r   r   r$   bursary_discount_detail3   s   
$z.BursaryDiscountService.bursary_discount_detailc                 C   s   |j dgd}t ,}|ttj|ktjd j|dd}|	  |dkr.t
dddW d    d S 1 s9w   Y  d S )	Nr9   excludefetch)synchronize_sessionr   i  z!Could not update bursary discountrB   )r   r   r&   r   r)   r9   r*   r+   r   r   r
   )r   r?   r   r!   r    resultr   r   r$   update_bursary_discount<   s   
"z.BursaryDiscountService.update_bursary_discountc                 C   sZ   t   }|tttj|kjtj d |  W d    d S 1 s&w   Y  d S )N)r6   )	r   executer   r   r8   r9   valuesr6   r   )r   r?   r    r   r   r$   toogle_enableF   s   
"z$BursaryDiscountService.toogle_enablec           	      C   s   zZt  L}g }|jD ]3}t d tdd }|t	tj
|k }|t||j|j||d dk|d d q
|| |  W d    W d S 1 sSw   Y  W d S  tyq } z|  td| d }~ww )	Nz%Y%m%d%H%M%Si  i'  	user_typeparentr9   )application_number	parent_idr,   participant_idis_parent_user
created_byz3Could not create new bursary discount application: )r   rT   r   nowstrftimerandomrandintr&   r   r8   r9   rE   r7   r   rS   r,   bulk_save_objectsr   r   r   r	   )	r   r   userr    Zapplication_listrT   rR   participantr#   r   r   r$   create_applicationP   s,   





&z)BursaryDiscountService.create_applicationc                 C   s|   t  1}|ttj|ktjd  }|stdddt	
tj|_|  ddiW  d    S 1 s7w   Y  d S )Nr@   rA   rB   messagez%Bursary discount deleted successfully)r   r&   r   r8   r9   r*   r+   rE   r
   r   rW   r   utcr   )r   r?   r    bursary_discountr   r   r$   delete_bursary_discountg   s   
$z.BursaryDiscountService.delete_bursary_discountc                 C   sL  t  }|tttjttjtj	d }|du r&|tj
|k}|du r2|tj
dk}|r<|tj|k}|rF|tj|k}|rf|ttj| }dd |D }	|tj|	}|rt j}
|
| }|ttdtj|k }dd |D }	|tj|	}| W  d    S 1 sw   Y  d S )NTFc                 S      g | ]}|j qS r   r9   r2   r<   r   r   r$   r4          z;BursaryDiscountService.list_application.<locals>.<listcomp>yearc                 S   rc   r   rd   re   r   r   r$   r4      rf   )r   r&   r   r'   r   r(   r]   r)   r*   r+   is_approvedr,   rR   r   
first_name	icontainsr-   rT   r:   r   rW   rg   r   dob)r   r,   nameagerh   rR   r    r&   r]   rT   current_yearZ
birth_yearr   r   r$   list_applications   s:   


 $z'BursaryDiscountService.list_applicationc                 C   sT   t  }|ttj|kddi |  W d    d S 1 s#w   Y  d S )Nrh   T)r   r&   r   r)   r9   r   r   )r   r9   r    r   r   r$   approve_application   s   
"z*BursaryDiscountService.approve_applicationc                 C   s\   t  !}|ttjdktjd  }dd |D W  d    S 1 s'w   Y  d S )NTc                 S   r/   r   )r   r0   r   r1   r   r   r$   r4      r5   zDBursaryDiscountService.fetch_all_bursary_courses.<locals>.<listcomp>)r   r&   r   r8   is_bursary_productr*   r+   r-   )r   r    r=   r   r   r$   fetch_all_bursary_courses   s   $$z0BursaryDiscountService.fetch_all_bursary_coursesc                    s   t  5} jdgd} fdd jD }|| |ttj jk	d j
i |  W d    d S 1 s;w   Y  d S )Nis_fully_allocatedrG   c                    s    g | ]}t |j|j jd qS ))	course_iddiscount_pricebursary_discount_application_id)r   rt   ru   rv   re   r   r   r$   r4      s
    

z:BursaryDiscountService.allocate_course.<locals>.<listcomp>)r   r   courseadd_allr&   r   r)   r9   rv   r   rs   r   )r   r   r    r!   Zinstance_listr   rw   r$   allocate_course   s   




"z&BursaryDiscountService.allocate_coursec                 C   sR   t  }|ttj|k }dd |D W  d    S 1 s"w   Y  d S )Nc                 S   s6   g | ]}t |j|j|j|jt |jj|jjd dqS ))r9   rl   )r9   rv   rt   ru   rx   )dictr9   rv   rt   ru   rx   rl   re   r   r   r$   r4      s    	z@BursaryDiscountService.list_allocated_course.<locals>.<listcomp>)r   r&   r   r)   rv   r-   )r   application_idr    r=   r   r   r$   list_allocated_course   s   
	$z,BursaryDiscountService.list_allocated_coursec                 C   sp   t  +}|ttj|k  |ttj|kddd |	  W d    d S 1 s1w   Y  d S )NF)rh   rs   )
r   r&   r   r)   rv   deleter   r9   r   r   )r   allocation_idr    r   r   r$   remove_course_allocation   s
   "
"z/BursaryDiscountService.remove_course_allocationr|   c                 C   s   t  _}|tttjttjtj|ktj	
d }|s(tddd|tttjtj|k }|j|j|jj d|jj |jj|j|jddd |D d	W  d   S 1 sew   Y  dS )
a@  
        Get detailed information about allocated courses for a specific bursary application
        
        Args:
            application_id (int): ID of the bursary discount application
            
        Returns:
            dict: Details of allocated courses including application info and course details
        Nr@   zBursary application not foundrB    )r9   rR   participant_namer(   rh   rs   c              
   S   s>   g | ]}|j |jj |jj|j|jjj|jjj|jjjd qS ))r   rt   course_nameru   r(   term	age_group)	r9   rx   rl   ru   r(   titler   r   label)r2   rx   r   r   r$   r4      s    
zGBursaryDiscountService.get_allocated_course_details.<locals>.<listcomp>)Zapplication_detailsallocated_courses)r   r&   r   r'   r   r]   r(   r)   r9   r*   r+   rE   r
   r   rx   rv   r-   rR   ri   	last_namer   rh   rs   )r   r|   r    applicationr   r   r   r$   get_allocated_course_details   sB   




$z3BursaryDiscountService.get_allocated_course_detailsN)__name__
__module____qualname__r%   r.   r>   intrF   rL   rO   r^   rb   ro   rp   rr   rz   r}   r   r   r   r   r   r$   r      s     	

 r   ) r   r   
sqlalchemyr   r   sqlalchemy.ormr   Zsqlalchemy.sqlr   rY   core.configr   core.security.exceptionsr	   r
   modelsr   r   r   r   r   r   r   Zmodels.bursary_discountr   schema.academic_yearr   schema.bursary_discountr   Zschema.courser   r   r   r   r   r$   <module>   s    $