U
    HÚêfBW  ã                   @   s6  d dl mZmZmZmZmZmZmZmZm	Z	 d dl
mZmZ d dl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mZmZ d dlmZ d dlmZmZ d d	lmZ d d
lm Z  d dl!m"Z"m#Z#m$Z$m%Z% ede&ƒZ'e'j(ddgdedd„ ƒƒZ)dd„ Z*e'j(ddgdedd„ ƒƒZ+e'j(dddgdedd„ ƒƒZ,dd„ Z-e'j(dddgdeeddd ƒd!d"„ ƒƒƒZ.e'j(d#dgdeeddd ƒd$d%„ ƒƒƒZ/e'j(d&dgdeeddd ƒd'd(„ ƒƒƒZ0e'j(d)dgdeeddd ƒd*d+„ ƒƒƒZ1e'j(d,dgdeeddd ƒd-d.„ ƒƒƒZ2e'j(d/dgdeeddd ƒd0d1„ ƒƒƒZ3dS )2é    )	Ú	BlueprintÚResponseÚrender_templateÚredirectÚurl_forÚflashÚrequestÚjsonifyÚ	send_file)ÚStringIOÚBytesION)Úlogin_required)Údb)ÚUserÚHotelÚRoomÚAgencyÚBookingÚGuestr   ÚInvoice)Úroles_required)ÚdatetimeÚ	timedelta)Úcurrent_user)Úfunc)Úsend_tentative_emailÚsend_confirmation_emailÚsend_invoice_paid_emailÚsend_invoice_emailÚbookingz/search_hotelsÚGET)Úmethodsc               
      sŽ  t j d¡} t j d¡}t j d¡}t |d¡ d¡‰ t |d¡ d¡}t |d¡ d¡}d }d| krld}nd| krxd}tjj|d	 	¡ }‡ fd
d„|D ƒ}|D ]Î}|j
D ]Â}	d}
d|	jkrÂd}
n.d|	jkrÒd}
nd|	jkrâd}
nd|	jkrðd}
t |d¡}t |d¡}d}|}||k r^t|	| d¡ ¡ d i ƒ}|| d |j¡d¡7 }|tdd7 }q||
9 }||	_qªq td|ˆ ||| t j d¡dS )NÚlocationÚcheck_inÚ	check_outú%Y-%m-%dz%Bú%d-%m-%YÚMakkahÚMadinah)r"   c                    s   g | ]}t |ˆ ƒr|‘qS © )Úis_month_available)Ú.0Úhotel©Úcheck_in_monthr)   úF/home/www/findmeahotel.co.uk/times_travel/app/routes/booking_routes.pyÚ
<listcomp>'   s     
 z!search_hotels.<locals>.<listcomp>é   ÚSingleÚDoubleé   ÚTripleé   ÚQuadé   r   Z_rateszDay{})Údayszbooking/search_hotels.htmlZtotal_nights)ÚhotelsÚmonthr#   r$   r"   Únights)r   ÚargsÚgetr   ÚstrptimeÚstrftimer   ÚqueryÚ	filter_byÚallÚroomsÚtypeÚgetattrÚlowerÚformatÚdayr   Útotal_pricer   )r"   Zcheck_in_date_strZcheck_out_date_strZcheck_in_dateZcheck_out_dateZlocation_typer:   Zavailable_hotelsr,   ÚroomÚpersonsrJ   Úcurrent_dateZcurrent_month_ratesr)   r-   r/   Úsearch_hotels   sT    







úrN   c                 C   s   | j  |¡}|dk	o|dkS )zB
    Check if the hotel has availability for the given month.
    Nr   )Úavailabilityr>   )r,   r.   rO   r)   r)   r/   r*   U   s    r*   z%/booking/<int:hotel_id>/<int:room_id>c                 C   sÈ  t j | ¡}tj |¡}tj d¡}tj d¡}tj d¡}tj d¡}t}|jrX|jnd }	zZ|rœ|rœt	 
|d¡}
t	 
|d¡}td|
› ƒ td|› ƒ ntdd	ƒ ttd
ƒƒW S W nF tk
rü } z(td|› d|› d|› ƒ tdd	ƒ W 5 d }~X Y nX t|
||j|j|r|jnd |	r&|	jnd |j|jdd|d d|j› dd}tj |¡ tj ¡  tddƒ d|jkr|d}n4d|jkrŽd}n"d|jkr d}nd|jkr°d}td||||||jdS )Nr#   r$   r<   Úpricez%Y-%m-%d %H:%M:%SzParsed check_in: zParsed check_out: z*Check-in and check-out dates are required.Údangerú
auth.indexzError parsing dates. Check-in: z, Check-out: ú	. Error: z4Invalid date format. Please use YYYY-MM-DD HH:MM:SS.FzBooking created by Ú.)r#   r$   Ú
hotel_nameÚ	room_typeÚagent_idÚ	agency_idÚhotel_idÚroom_idÚbooking_confirmedÚinvoice_paidÚselling_priceÚbuying_priceÚremarksúBooking created successfullyÚsuccessr2   r1   r3   r4   r5   r6   r7   r8   zbooking/booking_form.html)r,   rK   r   r<   rL   rU   )r   rA   Ú
get_or_404r   r   r=   r>   r   Úagencyr   r?   Úprintr   r   r   Ú
ValueErrorr   ÚnamerE   ÚidÚusernamer   ÚsessionÚaddÚcommitr   )rY   rZ   r,   rK   Zcheck_in_strZcheck_out_strr<   rP   Úagentrc   r#   r$   ÚeZnew_bookingrL   r)   r)   r/   Úbooking_form\   sd    
ó


  ÿrn   z$/book/<int:room_id>/<int:booking_id>ÚPOSTc           
      C   s.  t j | ¡}tj |¡}tjdkr dtjkrZtj 	|¡ tj 
¡  tddƒ ttdƒƒS d|jkrhdn,d|jkrvd	nd
|jkr„dnd|jkr’dnd}g }t|ƒD ]V}tj d|› ¡}tj d|› ¡}|r¢|r¢t|||jd}	| |	¡ tj |	¡ q¢tjd |_|jdkrtjd |_tj 
¡  t|jj|jj|jj|jj|j d¡|j  d¡d|j› |jj|jj|jj!|j |j j"d|j|j#|j$||j%d t&|jj|jj|jj|jj|j d¡|j  d¡d|j› |jj|jj|jj!|j |j j"d|j|j#|j$|j'|j%d tddƒ ttdƒƒS t(d||dS )Nro   ÚcancelzBooking cancelledÚinforR   r2   r1   r3   r4   r5   r6   r7   r8   Ú
first_nameÚ	last_name)rr   rs   Ú
booking_idÚspecial_requestsÚotherZother_requestr&   ÚTTL_00)ÚtoÚrecipient_nameÚagency_nameÚdestinationr#   r$   Úbooking_refrU   Ú	agent_refÚhotel_addressr<   Únum_of_roomsrV   Ú	inclusionÚnotesÚguestsrJ   r`   ra   zbooking_form.html)rK   r   ))r   rA   rb   r   r   ÚmethodÚformr   ri   Údeleterk   r   r   r   rE   Úranger>   r   rg   Úappendrj   ru   r   rl   Úemailrh   rc   rf   r,   r"   r#   r@   r$   Údescriptionr9   r€   r   r]   r   r‚   r   )
rZ   rt   rK   r   rL   r‚   Úirr   rs   Úguestr)   r)   r/   Úbook¢   sŒ    


ýý




ï


ï
rŒ   c           
      C   sÆ  t j dd¡}t j dd¡}t j d¡}t j d¡}t j d¡}t j d¡}|rè|rètj d	|› d	¡tj d	|› d	¡tj d	|› d	¡t	j
 d	|› d	¡tj d	|› d	¡d
œ}||krè|dkrÚ|  |dkrÔtnt	¡} |  || ¡} |r
t |d¡}|  tj|k¡} |r,t |d¡}|  tj|k¡} tjtjtjt tj¡t tj¡tjt	j
tjtjtjtjdœ}||krž|| }	|  |dkr’|	 ¡ n|	 ¡ ¡} n$|  |dkr¶tj ¡ ntj ¡ ¡} | S )z=Apply filtering, sorting, and role-based access to the query.Úsort_byrg   Ú
sort_orderÚascÚfilter_columnÚfilter_valueÚ
start_dateÚend_dateú%)rU   rV   Ú
agent_namerz   Úconfirmation_number)r•   rz   r•   r%   )rU   rV   r]   r#   r$   r•   rz   r–   r[   r\   rg   )r   r=   r>   r   rU   ÚilikerV   r   rh   r   rf   r–   ÚjoinÚfilterr   r?   r#   r$   r]   r   Údater[   r\   rg   Úorder_byr   Údesc)
rA   r   rŽ   r   r‘   r’   r“   ÚfiltersZsort_columnsÚsort_columnr)   r)   r/   Úapply_filters_and_sortingü   sP    û

õ
"$rŸ   z	/bookingsÚsuper_adminÚadminÚagency_adminc                  C   s¦   t j} t| ƒ} tjdkr"|  ¡ }n8tjdkr@| jtjd ¡ }ntjdkrZ| jdd ¡ }td|t	j
 dd	¡t	j
 d
d¡t	j
 d¡t	j
 d¡t	j
 d¡t	j
 d¡dS )Nr    r¢   ©rX   r¡   F©r\   zbooking/booking_dashboard.htmlr   rg   rŽ   r   r   r‘   r’   r“   )Úbookingsr   rŽ   r   r‘   r’   r“   )r   rA   rŸ   r   ÚrolerC   rB   rX   r   r   r=   r>   )rA   r¥   r)   r)   r/   Úview_bookings1  s"    







ùr§   z/update_confirmationc                  C   s"  t j d¡} t j d¡}t j d¡}| r,|s>tdddœƒdfS tj | ¡}|r|dksì||_d	|_|j}|j	rv|j	ng }t
|jj|jj|jj|jj|j d
¡|j d
¡d|j› |jj|jj|jj|j|j jd|j|j|j||j|d |rö||_tj ¡  tddiƒdfS tdddœƒdfS )Nrt   r–   r^   ÚerrorúInvalid data©ÚstatusÚmessageé  ÚNoneTr&   rw   r1   )rx   ry   rz   r{   r#   r$   r|   rU   r}   r~   r<   r   rV   r€   r   r‚   rJ   r–   r«   ra   éÈ   úBooking not foundé”  ) r   r„   r>   r	   r   rA   r–   r[   rK   r‚   r   rl   rˆ   rh   rc   rf   r,   r"   r#   r@   r$   rg   r‰   r9   rE   r€   r   r]   r^   r   ri   rk   )rt   r–   r^   r   rK   r‚   r)   r)   r/   Úupdate_confirmationI  sJ    


î
r²   z/update_invoicec            
      C   s®  t j d¡} t j d¡}t j d¡}t j d¡}t j d¡}| rH|rH|sZtdddœƒd	fS tj | ¡}zt |d
¡}W nL tk
rÂ } z.t	d|› d|› ƒ tdddœƒd	f W Y ¢S d }~X Y nX |rœd|_
|j}t|j||||d}	tj |	¡ tj ¡  t|jj|jj|jj|jj|j d¡|j d¡d|j› |jj|jj|jj|j|j jd|j|j |j!|j"|j#d|	j› | d¡| d¡d tddiƒdfS tdddœƒdfS )Nrt   Úpayment_dateÚpayment_methodÚtram_numr_   r¨   r©   rª   r­   z%Y-%m-%dT%H:%MzError parsing date: rS   zInvalid date format.T)rt   Útimer´   rµ   r_   r&   rw   r1   z%H:%M)rx   ry   rz   r{   r#   r$   r|   rU   r}   r~   r<   r   rV   r€   r   r‚   rJ   Z
invoice_idZinvoice_dateZinvoice_timer«   ra   r¯   r°   r±   )$r   r„   r>   r	   r   rA   r   r?   re   rd   r\   rK   r   rg   r   ri   rj   rk   r   rl   rˆ   rh   rc   rf   r,   r"   r#   r@   r$   r‰   r9   rE   r€   r   r‚   r]   )
rt   Zpayment_date_strr´   rµ   r_   r   r³   rm   rK   Znew_invoicer)   r)   r/   Úupdate_invoice{  sb    (û	




ìr·   z%/get_booking_details/<int:booking_id>c              
   C   s   t d| › ƒ z6tj | ¡}t d|› ƒ td|d}td|dœƒW S  tk
rŠ } z(t d|› ƒ tdd	d
œƒdf W Y ¢S d }~X Y nX d S )Nz!Received request for booking ID: zBooking found: zbooking/booking_detail.html)r   ra   )r«   ÚhtmlzError: r¨   z Failed to fetch booking details.rª   iô  )rd   r   rA   rb   r   r	   Ú	Exception)rt   r   r¸   rm   r)   r)   r/   Úget_booking_details¿  s    rº   z*/download_booking_details/<int:booking_id>c                 C   sÈ  t j | ¡}tƒ }t |¡}| ddg¡ | d|jg¡ | d|jrN|jj	ndg¡ | d|j
g¡ | d|j d¡g¡ | d	|j d¡g¡ | d
|jp dg¡ | d|jg¡ | d|jg¡ | d|jg¡ | d|jjj	pèdg¡ | d|jr|jjndg¡ | d|jpdg¡ | d|jr4dndg¡ | d|jrNdndg¡ t|jdƒD ].\}}| d|› d|j› d|j› g¡ qb| ¡ }| ¡  t|  d¡ƒ}t!|ddd| › ddS )NÚFieldÚValuez
Booking IDr   úN/Aú
Hotel NamezCheck-Inr&   z	Check-Outú	Room TypeúSelling PriceúBuying PricezSpecial RequestsÚVendorZAgentúConfirmation NumberúBooking ConfirmedÚYesÚNoúInvoice Paidr1   zGuest z Nameú zutf-8útext/csvTZbooking_details_z.csv)ÚmimetypeÚas_attachmentÚdownload_name)"r   rA   rb   r   ÚcsvÚwriterÚwriterowrg   rc   rf   rU   r#   r@   r$   rV   r]   r^   ru   r,   Úvendorrl   rh   r–   r[   r\   Ú	enumerater‚   rr   rs   ÚgetvalueÚcloser   Úencoder
   )rt   r   ÚoutputrÎ   rŠ   r‹   Zcsv_contentZbyte_streamr)   r)   r/   Údownload_booking_detailsÍ  s:    
(
ürÖ   z/export_bookingsc                  C   s6  t j} t| ƒ} tjdkr"|  ¡ }n8tjdkr@| jtjd ¡ }ntjdkrZ| jdd ¡ }tƒ }t	 
|¡}| ddd	d
ddddddddg¡ |D ]ˆ}| |j|j|jp¨d|j d¡|j d¡|j|j|jrÜ|jjrÜ|jjjnd|jrì|jjnd|jpöd|jrdnd|jrdndg¡ q| d¡ t|dddidS )Nr    r¢   r£   r¡   Fr¤   ÚIDr¾   r¿   zCheck-In DatezCheck-Out DaterÀ   rÁ   rÂ   z
Agent NamerÃ   rÄ   rÇ   r½   r&   rÅ   rÆ   r   rÉ   zContent-Dispositionz attachment;filename=bookings.csv)rÊ   Úheaders)r   rA   rŸ   r   r¦   rC   rB   rX   r   rÍ   rÎ   rÏ   rg   rU   rV   r#   r@   r$   r]   r^   r,   rÐ   rf   rl   rh   r–   r[   r\   Úseekr   )rA   r¥   rÕ   rÎ   r   r)   r)   r/   Úexport_bookingsý  s8    




"

ô
rÚ   )4Úflaskr   r   r   r   r   r   r   r	   r
   Úior   r   rÍ   Úflask_loginr   Úappr   Ú
app.modelsr   r   r   r   r   r   r   Úapp.decoratorsr   r   r   r   Ú
sqlalchemyr   Z	app.emailr   r   r   r   Ú__name__Ú
booking_bpÚrouterN   r*   rn   rŒ   rŸ   r§   r²   r·   rº   rÖ   rÚ   r)   r)   r)   r/   Ú<module>   s\   ,(
DDX5

/
A

-
