3
iC                @   s  d dl mZmZmZmZmZmZmZ d dlmZm	Z	 d dl
mZmZ d dlT d dlZd dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ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) d dl*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZA d dlBmCZC d dlDmEZE d d	lmZ d dlFmGZG d dlHmIZI d dlJmKZK d d lLmMZM d dlNT d d!lOmPZP d d"lJmQZQ d#d$ ZRd%d& ZSejTd'd(gd)d*d+ ZUejTd,d-d. ZVejTd/d(gd)d0d1 ZWejTd2d(gd)d3d4 ZXejTd5d(gd)d6d7 ZYejTd8d(gd)d9d: ZZejTd;d(gd)d<d= Z[ejTd>d(gd)d?d@ Z\ejTdAd(gd)dBdC Z]ejTdDdEdF Z^dGdH Z_ejTdIdJdK Z`dLdM ZejTdNdOdP ZaejTdQdRdS ZbejTdTd(gd)dUdV ZcejTdWdXdY ZdejTdZd(gd)d[d\ ZeejTd]d^d_ ZfejTd`d(dagd)dbdc Zgddde Zhdfdg ZidS )h    )Flaskjsonifyrender_templateurl_forrequestredirectjson)datetime	timedelta)MailMessage)*N)app)db	FromCachedb_cache)get_booking_status_idcurrencyPostProcessorconvertAmount)BookingActivity)BookingType)Booking)BookingStatus)BookingPayment)BookingPaymentFailure)Donation)Facility)	Inventory)Detail)Transaction)Gatepass)GatepassGuest)GatepassVehicle)Vehicle)SalesforceData)PaymentGateway)PaymentMethod)Invoice)BookingBankSlip)Partner)CheckoutTransaction)bookingTotal)fieldValidation)currencyPostProcessorInvoice)getBookingSessionUserc             C   s   | j j  d S )N)sessionclose)self r2   5/booking_service/app/routes/bookings_payments_urls.pyr0   +   s    r0   c             C   s  | |kr|S | |kr|dkrt jtj| }y@|j d d d }|j d d d }t|t| }t|S  tk
r   d}t|S X n8| dkrt jtj|}y@|j d d d }|j d d d }t|t| }t|S  tk
r   d}t|S X nt jtj|}t jtj| }y||j d d d }	|j d d d }
|j d d d }|j d d d }t|t|
 }t|t| }|}t|S  tk
r   d}t|S X d S )Nz$162fface-f5f1-41de-913b-d2bb784dda3adatar   currency_buy_amountcurrency_sell_amount)requestsgetget_buy_sell_rateformatr   float	Exception)
currencyTocurrencyFromamountget_ratebuyingsellingvalueget_from_rateget_to_ratefrom_buyingfrom_selling	to_buying
to_selling	temp_fromtemp_tor2   r2   r3   currencyHandler/   sT    

rL   z%/iveri/bookings/payments/<booking_id>POST)methodsc       &   '   C   sp  t jjtjttjtjkjttj	tj
kjtjtjtjtjtjtjtjtjtjtjtjtjtj	tjtjtjtjtjtjtjtjtjtjtj j!tj"d kj!tj| kj# }i }t$||  t jjtj!tj"d kj!tj| kj# }|sg }|j%d t&d|idfS |d }i }|j|d< d|d< d|j d	 |d
< t'j( j)d|d< |j|d< |j|d< |j|d< |jj)d|d< |jj)d|d< |j|d< |jd |j |d< d|_t'j( |_t*d|_	yt+t,j-d d }W n. t.k
r } zt&d|idfS d }~X nX y&t,j-d }	|	d d }
|	d(d  }W n t.k
rH   d }
d }Y nX t/j0t1j2|j}|j- d d d }|j- d d d }t jjt3j!t3j"d kj!t3j| kj4 }t5|dkrt6|j|j|}t7|t7| }nt5|dkrg }xJ|D ]B}|j8rt6|j|j8|j9}nt6|j|j|j9}|j%t7| qW t:|}||krjg }|j%d  t&d|idfS t6|j|j|}t7|t7| }|t7| }t;t<j= }t>t;t<j= | |d!d d |
|||d d"}t jj?| t3|| |||j|d#|j||t'j( d$t'j( t'j( d%}t jj?| t jjt@j!t@j"d kj!t@j| kj# }|rRd|_"t'j( |_t jjtAj!tAj"d kj!tAj| kj4 }|rx |D ]}d#|_Bt'j( |_qW n t jjtCj!tCj"d kj!tCj| kj4 }|rx |D ]}d#|_Dt'j( |_qW n t jjtEj!tEj"d kj!tEj| kj# } | jF}!t jjtGj!tGj"d kj!tGjH|!kj4 }"|"rpx |"D ]}#d#|#_It'j( |#_qTW n t jjtJj!tJj"d kj!tJjH|!kj4 }$|$rx |$D ]}%d#|%_Kt'j( |%_qW n yTt jjL  tMt  ytN| W n t.k
r   Y nX g }|j%d& t&d|idfS  t.k
rj } z8tO| t jjP  tMt  g }|j%d' t&d|idfS d }~X nX d S ))Nz.The selected booking does not appear to exist.message   
total_cost	recipientz$reservations@olpejetaconservancy.orgsenderzBooking Payment (#)subjectz%B %Ytodaybooking_ref_code
first_name	last_namez%A, %d %b %Ycheck_in_datecheck_out_date client   	Confirmedr?   d   i  card_number   r4   r   r5   r6   z%The booking has already been paid forz$73414fc2-5bf7-42d1-9cdf-08fee8a0b08e)booking_payment_public_id
booking_idtransaction_idpayment_methodphone_numbermpesa_referencecard_first_fourcard_last_fourbooking_amountamount_paid
session_idz$33ad20be-3a89-4deb-ab71-7510ba51677eZiVeri)transaction_booking_public_idrd   transaction_original_costtransaction_totaltransaction_total_currencytransaction_balancetransaction_payment_methodtransaction_payment_currency$payment_currency_buying_rate_at_time%payment_currency_selling_rate_at_timetransaction_daterm   
created_at
updated_atz:Payment for the booking has been successfully carried out.z0There was a slight issue paying for the booking.)Qr   r/   queryr   joinr   booking_public_idrd   r   statusbooking_status_public_idadd_columnsbooking_typebooking_check_in_datebooking_check_out_dateactual_booking_check_in_dateactual_booking_check_out_datebooking_done_by
checked_inchecked_outrm   rx   ry   rW   payment_statuscurrencybooking_status_namerX   rY   email_addressrg   addressadditional_notefilterdeletion_markerfirstr+   appendr   r	   nowstrftimer   intr   r   r<   r7   r8   r9   r:   r   alllenrL   r;   rt   rp   sumstruuiduuid4r   addr'   r   inventory_payment_methodr   facility_payment_methodr    gatepass_public_idr!   gatepass_idgatepass_guest_payment_methodr"   gatepass_vehicle_payment_methodcommitr0   
send_emailprintrollback)&rd   get_bookingbooking_detailsget_booking2outputtotal
email_datar?   ecard
card_first	card_lastget_exchange_ratebuying_rateselling_rateget_past_paymentsconverted_transaction_amountbalancetotal_paymentseach_paymentconverted_transaction_total
past_totalrO   pendingre   paymenttransactionget_to_invoiceget_all_inventorysingle_inventoryget_all_facilitiessingle_facilitygatepassr   get_all_guestssingle_guestget_all_vehiclessingle_vehicler2   r2   r3   get_iveri_posted_datai   sX   

























r   z-/iveri/bookings/payments-failure/<booking_id>c       	       C   sH  t jjtjttjtjkjttj	tj
kjtjtjtjtjtjtjtjtjtjtjtjtjtj	tjtjtjtjtjtjtjtjtjtjtj j!tj"d kj!tj| kj# }yt$j%d }W n t&k
r   d }Y nX yt$j%d }W n t&k
r   d }Y nX i }|j|d< d|d< d|j d |d< t'j( j)d	|d
< |j|d< |j|d< |j|d< |jj)d|d< |jj)d|d< |j|d< |jd |j |d< t*t+j, }t-| |||d d}t jj.| y0t jj/  t0t  g }|j1d t2d|idfS  t&k
rB } z8t3| t jj4  t0t  g }|j1d t2d|idfS d }~X nX d S )Nra   failure_reasonrR   z$reservations@olpejetaconservancy.orgrS   zBooking Payment Failure (#rT   rU   z%B %YrV   rW   rX   rY   z%A, %d %b %YrZ   r[   r\   r]   )rd   ra   !booking_payment_failure_public_idr   rm   z#Payment for the booking has failed.rO   rP   z$Payment for the booking has  failed.i  )5r   r/   r{   r   r|   r   r}   rd   r   r~   r   r   r   r   r   r   r   r   r   r   rm   rx   ry   rW   r   r   r   rX   rY   r   rg   r   r   r   r   r   r   r   r<   r	   r   r   r   r   r   r   r   r   r0   r   r   r   r   )	rd   r   r   r   r   r   r   r   r   r2   r2   r3   get_iveri_failure_posted_dataZ  sr    












r   z/ui-iveri/booking-paymentc        (      C   sb  ddiddiddiddig} t tj| }|r<td|idfS tjd }tjjtjt	tj
t	jkjttjtjkjtj
tjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjtjt	jt	j t	j!t	j"t	j#t	j$j%tj&d kj%tj
|kj' }i }t(|| tjjtj%tj&d kj%tj
|kj' }|sLg }|j)d td	|id
fS |d }i }|j!|d< d|d< d|j d |d< t*j+ j,d|d< |j|d< |j|d< |j |d< |jj,d|d< |jj,d|d< |j|d< |jd |j  |d< d|_t*j+ |_t-d|_tjd }	tjd }
|
d d }|
d*d  }t.j/t0j1|j}|j d d  d! }|j d d  d" }tjjt2j%t2j&d kj%t2j|kj3 }t4|d krt5|j|j|	}t6|t6| }nt4|d kr|g }xJ|D ]B}|j7rt5|j|j7|j8}nt5|j|j|j8}|j)t6| qW t9|}||krPg }|j)d# td	|id
fS t5|j|j|	}t6|t6| }|t6| }t:t;j< }t=t:t;j< ||d$d d ||||	tjd d%}tjj>| t2||||	|j|d&|j||t*j+ tjd t*j+ t*j+ d'}tjj>| tjjt?j%t?j&d kj%t?j|kj' }|rDd|_&t*j+ |_tjjt@j%t@j&d kj%t@j|kj3 }|rx |D ]}d&|_At*j+ |_qxW n tjjtBj%tBj&d kj%tBj|kj3 }|rx |D ]} d&| _Ct*j+ | _qW n tjjtDj%tDj&d kj%tDj|kj' }!|!jE}"tjjtFj%tFj&d kj%tFjG|"kj3 }#|#rbx |#D ]}$d&|$_Ht*j+ |$_qFW n tjjtIj%tIj&d kj%tIjG|"kj3 }%|%rx |%D ]}&d&|&_Jt*j+ |&_qW n yTtjjK  tLt ytM| W n tNk
r   Y nX g }|j)d( td	|id
fS  tNk
r\ }' z8tO|' tjjP  tLt g }|j)d) td	|idfS d }'~'X nX d S )+Nfieldrd   r?   ra   rm   messagesi  z.The selected booking does not appear to exist.rO   rP   rQ   rR   z$reservations@olpejetaconservancy.orgrS   zBooking Payment (#rT   rU   z%B %YrV   rW   rX   rY   z%A, %d %b %YrZ   r[   r\   r]   r^   r_   rb   r4   r   r5   r6   z%The booking has already been paid forz$73414fc2-5bf7-42d1-9cdf-08fee8a0b08e)rc   rd   re   rf   rg   rh   ri   rj   rk   rl   rm   z$33ad20be-3a89-4deb-ab71-7510ba51677e)rn   rd   ro   rp   rq   rr   rs   rt   ru   rv   rw   rm   rx   ry   z:Payment for the booking has been successfully carried out.z0There was a slight issue paying for the booking.rz   )Qr,   r   r   r   r   r/   r{   r   r|   r   r}   rd   r   r~   r   r   r   r   r   r   r   r   r   r   rm   rx   ry   rW   r   r   r   rX   rY   r   rg   r   r   r   r   r   r+   r   r	   r   r   r   r7   r8   r9   r:   r   r   r   rL   r;   rt   rp   r   r   r   r   r   r   r'   r   r   r   r   r    r   r!   r   r   r"   r   r   r0   r   r<   r   r   )(validation_listr   rd   r   r   r   r   r   r   r?   r   r   r   r   r   r   r   r   r   r   r   r   r   rO   r   re   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r2   r3   ui_iveri_payment  sZ   



























r   z/bookings/payment/newc        4      C   s  g } y&t jd j  t jd s(| jd W n, tk
rV } z| jd W Y d d }~X nX t jd dkrtjjtj	tj
d kj	tjt jd kj }|j}n
t jd }y&t jd j  t jd s| jd W n, tk
r } z| jd W Y d d }~X nX y,tt jd	 j  t jd	 s$| jd
 W n. tk
rT } z| jd W Y d d }~X nX y,tt jd j  t jd s| jd W n. tk
r } z| jd W Y d d }~X nX yt jd j  t jd }W n( tk
r } z
d }W Y d d }~X nX | rtd| idfS tt jd dkr@g }|jd td|idfS yt jd }W n4 tk
r } ztt| d }W Y d d }~X nX yt jd }W n4 tk
r }	 ztt|	 d }W Y d d }	~	X nX yt jd }
t jd }W n8 tk
r } ztt| d }
d }W Y d d }~X nX tjjtj	tjt jd kj	tj
d kj }y|r`t jd d }nd }W n tk
r   d }Y nX tjjtj	tj
d kj	tjt jd kj }|rn$g }|jd tdt jd idfS tjjtjttjtjkjttjtjkjttjtjkj tjtjtj!tj"tj#tj$tj%tj&tj'tjtj(tj)tj*tjtj+tj,tj-tj.tj/tj0tj1tj2tj3tj4j	tj
d kj	tj|kj5 }|sg }|jd td|idfS i }t6|| t7|d d}t jd dkrtjjt8j	t8j9|kj }|r(g }|jd td|idfS tt:j; }t8tt:j; ||d d!|||
||t jd |d"}tjj<| tjjt=j>t?j@j	t?j
d kj	t?j|jkjA }tjjt=j>t?jBj	t?j
d kj	t?j|jkjA }tjjt=j>tCjDj	tCjt jd kjA }|| }|dkrL||krLtjjtCj	tCjt jd kjEtCj+d#i tjjF  td$|d%d& td'|d%d& td(|d%d& tjjtj	tj
d kj	tj|kj }tjjt?j	t?j
d kj	t?j|kj5 }tG|dkrt|tt jd  }t?|||t jd |d d!tHjI |j,d#d#|tHjI tHjI d)}tjj<| tjjtJj	tJj
d kj	tJj|kj }|rld#|_
tHjI |_*t|tt jd krd#|_+tHjI |_*tKd*|_n2t|tt jd k	rd|_+tHjI |_*tKd+|_n8tG|dk	rg } x|D ]}!| jt|!jB qW t>| }"t||" }#|#tt jd  }t?|||t jd |d d!tHjI |j,d#d#|tHjI tHjI d)}tjj<| tjjtJj	tJj
d kj	tJj|kj }|rd#|_
tHjI |_*|#tt jd krd#|_+tHjI |_*tKd*|_n.|#tt jd k	rd|_+tHjI |_*tKd+|_tjjtLj	tLj
d kj	tLj|kj5 }$|$	r^x |$D ]}%d |%_MtHjI |%_*	qBW n tjjtNj	tNj
d kj	tNj|kj5 }&|&	rx |&D ]}'d |'_OtHjI |'_*	qW n tjjtPj	tPj
d kj	tPj|kj }(|(jQ})tjjtRj	tRj
d kj	tRjS|)kj5 }*|*
r,x |*D ]}+d |+_TtHjI |+_*
qW n tjjtUj	tUj
d kj	tUjS|)kj5 },|,
r|x |,D ]}-d |-_VtHjI |-_*
q`W n y0tjjF  tWt g }|jd, td|idfS  tk
r  } z6tjjX  tWt g }|jd- t|t|d.dfS d }~X nX nt jd d/krtjjt8j	t8j
d kj	t8jt jd kj	t8jt jd kj	t8jYt jd kj }.|.sg }|jd0 td|idfS g }|jd1 td|idfS n,t jd d/krtt:j; }t8tt:j; t jd |t jd t jd2 |||
||t jd |d"}tjj<| tjjtj	tj
d kj	tjt jd kj }tjjt?j	t?j
d kj	t?jt jd kj5 }tZj[t\j]t jd2 }/|/j d3 d d4 }0|/j d3 d d5 }1tG|dkrt^|j,t jd2 t jd }2tt jd	 t|2 }t?|t jd t jd	 t jd |t jd |t jd2 tHjI |j,|0|1|tHjI tHjI d6}tjj<| tjjtJj	tJj
d kj	tJjt jd kj }|rd#|_
tHjI |_*tt jd	 t|2krd#|_+tHjI |_*tKd*|_nHtt jd	 t|2krt7|dkrd#|_+nd|_+tHjI |_*tKd+|_ntG|dkrg } xJ|D ]B}!|!j_rHt^|j,|!j_|!jB}3nt^|j,|j,|!jB}3| jt|3 q(W t>| }"t^|j,t jd2 t jd }2tt jd	 t|" }#|#t|2 }t?|t jd t jd	 t jd |t jd |t jd2 tHjI |j,|0|1|tHjI tHjI d6}tjj<| tjjtJj	tJj
d kj	tJjt jd kj }|rTd#|_
tHjI |_*|#t|2kr~d#|_+tHjI |_*tKd*|_n>|#t|2krt7|dkrd#|_+nd|_+tHjI |_*tKd+|_tjjtLj	tLj
d kj	tLjt jd kj5 }$|$rx&|$D ]}%t jd |%_MtHjI |%_*qW n tjjtNj	tNj
d kj	tNjt jd kj5 }&|&rtx&|&D ]}'t jd |'_OtHjI |'_*qRW n tjjtPj	tPj
d kj	tPjt jd kj }(|(jQ})tjjtRj	tRj
d kj	tRjS|)kj5 }*|*rx&|*D ]}+t jd |+_TtHjI |+_*qW n tjjtUj	tUj
d kj	tUjS|)kj5 },|,rTx&|,D ]}-t jd |-_VtHjI |-_*q2W n y0tjjF  tWt g }|jd, td|idfS  tk
r } z6tjjX  tWt g }|jd- t|t|d.dfS d }~X nX d S )7Nrd   zBooking ID is empty.zBooking ID is missing.rm   Mpesarf   zPayment method is empty.zPayment method is missing.rk   zBooking amount is empty.zBooking amount is missing.payment_amountzPayment amount is empty.zPayment amount is missing.r   i  r   z5The payment amount cannot be less than or equal to 0.rO   phone	mpesa_ref
first_four	last_fourpayment_gatewaypayment_gateway_public_idz9The selected payment method does not exist in the system.z<The selected booking does not appear to exist in the system.rP   rQ      z&The booking has already been paid for.z$1c9d01cc-ef31-4757-a390-10c765fcecabz$162fface-f5f1-41de-913b-d2bb784dda3a)rc   rd   re   rf   payment_currencyrg   rh   ri   rj   rk   rl   rm   r^   z@#####transaction_balanceT)flushz@#####donations_amountz@#####transaction_original_cost)rn   rd   ro   rp   rr   rs   rt   rw   rq   ru   rv   rm   rx   ry   r_   DepositzThe booking has been paid for.z*There was an error paying for the booking.)rO   errorz$cbff45f3-4f12-41da-8b4a-bf308112f032z7The Mpesa payment was not successful. Please try again.zMpesa payment successful.currency_idr4   r5   r6   )rn   rd   ro   rp   rr   rs   transaction_payment_gatewayrt   rw   rq   ru   rv   rm   rx   ry   )`r   r   stripr   KeyErrorr   r/   r{   r   r   r   rW   r   r}   r   r   r;   r   r%   rf   r<   r&   payment_method_public_idr|   r   r   booking_type_public_idr   r~   r   r   rd   r   r   r   r   r   r   r   r   rm   rx   ry   r   r   booking_type_namer   rX   rY   r   rg   r   r   r   r+   roundr   rh   r   r   r   funcr   r   ro   scalarrp   r   r?   updater   r   r	   r   r'   r   r   r   r   r   r    r   r!   r   r   r"   r   r0   r   rl   r7   r8   r9   r:   rL   rt   )4r   r   get_booking_idrd   rm   rO   rg   phone_errorrh   mpesa_errorri   rj   
card_errorget_gatewayr   rf   return_bookingsr   return_datar   check_paymentre   r   ro   rp   donations_amountrr   return_bookingr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   check_existing_paymentr   r   r   r   r   r2   r2   r3   pay_for_booking  sz   

























&



















r   z/bookings/payment/deferc           '   C   s6  g } y&t jd j  t jd s(| jd W n, tk
rV } z| jd W Y d d }~X nX y&t jd j  t jd s|| jd W n, tk
r } z| jd W Y d d }~X nX | rtd| idfS tjjt	j
t	jd kj
t	jt jd kj }|sg }|jd	 td
|idfS tjjtj
tjd kj
tj|jkj }|sNtd|_nptjtj|j}|j d dkrtd|_d|_tttj |jt jd tj d}tjj| n
td|_y0tjj  t t g }|jd td
|idfS  t!k
r0   tjj"  t t g }|jd td
|idfS X d S )Nrd   zBooking ID is empty.zBooking ID is missing.rm   zSession ID is empty.zSession ID is missing.r   i  z.The selected booking does not appear to exist.rO   Unconfirmedtype_public_idZ90b00b2bz
To Invoicerb   )invoice_public_idrd   rm   rx   zBooking payment deferred.rP   z5Unable to defer the booking payment. Try again later.)#r   r   r   r   r   r   r   r/   r{   r   r   r   r}   r   r)   rd   r   r~   r7   r8   get_partner_detailsr:   
partner_idr   r'   r   r   r   r	   r   r   r   r0   r<   r   )r   r   r   rO   Zcheck_if_partner_bookingget_partnerinvoicer2   r2   r3   defer_booking_payment"  sd    








r   z/bookings/paidc           '   C   s  g } y&t jd j  t jd s(| jd W n, tk
rV } z| jd W Y d d }~X nX y&t jd j  t jd s|| jd W n, tk
r } z| jd W Y d d }~X nX | rtd| idfS tjjt	j
t	jd kj
t	jt jd kj
t	jtd	kj }|s"g }|jd
 td|idfS td|_d|_tj |_tttj t jd dt jd tj d}tjj| y0tjj  tt g }|jd td|idfS  tk
r   tjj  tt g }|jd td|idfS X d S )Nrd   zBooking ID is empty.zBooking ID is missing.rm   zSession ID is empty.zSession ID is missing.r   i  	CancelledzAThe selected booking either does not exist or has been cancelled.rO   i  r_   r^   zBooking marked as paid)booking_activity_public_idrd   booking_activity_descriptionrm   rx   zBooking marked as paid.rP   z4Unable to mark the booking as paid. Try again later.)r   r   r   r   r   r   r   r/   r{   r   r   r   r}   r~   r   r   r   r	   r   ry   r   r   r   r   r   r   r0   r<   r   )r   r   r   rO   booking_activityr2   r2   r3   mark_booking_as_paidm  s\    








r   z/bookings/complimentsc           '   C   sx  g } y&t jd j  t jd s(| jd W n, tk
rV } z| jd W Y d d }~X nX y&t jd j  t jd s|| jd W n, tk
r } z| jd W Y d d }~X nX | rtd| idfS tjjt	j
t	jd kj
t	jt jd kj
t	jtd	kj }|s"g }|jd
 td|idfS tjjtj
tjd kj
tjt jd kj
tjtdkj }tjjtj
tjd kj
tj|jkj }x|D ]}d|_tj |_qW tjjtj
tjd kj
tj|jkj }x|D ]}d|_tj |_qW tjjtj
tjd kj
tjt jd kj
tjtdkj }	x|	D ]}
d|
_tj |
_q8W tjjtj
tjd kj
tjt jd kj
tjtdkj }x|D ]}d|_tj |_qW td|_d|_ tj |_t!t"t#j$ t jd dt jd tj d}tjj%| y0tjj&  t't g }|jd td|idfS  t(k
rr   tjj)  t't g }|jd td|idfS X d S )Nrd   zBooking ID is empty.zBooking ID is missing.rm   zSession ID is empty.zSession ID is missing.r   i  r   zAThe selected booking either does not exist or has been cancelled.rO   i  Updatedr`   Complimentary   z Booking marked as free-of-charge)r   rd   r   rm   rx   z!Booking marked as free-of-charge.rP   z>Unable to mark the booking as free-of-charge. Try again later.)*r   r   r   r   r   r   r   r/   r{   r   r   r   r}   r~   r   r   r    rd   r!   r   r   r   gatepass_discount_rater	   r   ry   r"   gatepass_vehicle_discount_rater   inventory_discount_rater   facility_discount_rater   r   r   r   r   r   r   r0   r<   r   )r   r   r   rO   Zget_booking_gatepassget_gatepass_guestsZsingle_gatepass_guestget_gatepass_vehiclesZsingle_gatepass_vehicleget_booking_inventoryr   Zget_booking_facilitiesr   r   r2   r2   r3   mark_as_complimentary  s    











r  z/bookings/payment/mpesa/newc        8   n   C   s
  g } y&t jd j  t jd s(| jd W n, tk
rV } z| jd W Y d d }~X nX y&t jd j  t jd s|| jd W n, tk
r } z| jd W Y d d }~X nX yt jd }W n& tk
r } z
d }W Y d d }~X nX y(t jd j  t jd s| jd	 W n. tk
r8 } z| jd
 W Y d d }~X nX | r^g }|jd td| idfS tjjt	j
tt	jtjkj
tt	jtjkj
tt	jtjkjt	jt	jt	jt	jt	jt	jt	jt	jt	jt	jt	jt	jt	jt	jt	j t	j!t	j"t	j#tj$tj%tj&tj'tj(tj)tj*tj+j,t	j-d kj,t	jt jd kj. }|sLg }|jd td|idfS g }|j}|j!}|j"}|j#}	i }
t/|
|j |rt jd }t0dd|}ntjjt1j,t1j-d kj,t1jt jd kj2 }g }|r x0|D ](}t3d|j4|j5|j6|j7}|j| qW t8|}t3d||
d ||	}t9j:t;|| d}g }yt jd }t<|dkr̐xb|D ]X}y|jj=d}t>d|d |d |d |d |}|j| |j&|j'|j(|j)d|d ddddd |j?d!|j@|d t jd |jd"}tAjBtC|d#}yVt1|j d$ t jd |d dd%|d |d |d tDjE d&	}tjjF| tjjG  W n4 tHk
rv } ztId' tI| W Y d d }~X nX W n4 tHk
r } ztId( tI| W Y d d }~X nX qXW t8|}t9j:|| }W n$ tk
r } zW Y d d }~X nX tjjtJj,tJj-d kj,tJj|jkj2 }t<|dkrg }xJ|D ]B}|jKrVt0|j!|jK|jL}nt0|j!|j!|jL}|jtM| q6W t8|} | |krg }|jd) td|idfS tN|d*k
rNy@t jd d+||t jd d,| d-}!d.d/d0d1d2d3d4d5d6d7d8}"|"jOd9jOd:}#d;tPjQ|"jOd< d=|"jOd> jR jS  }$d?|$i}%tAjO|#|%d@}&|&jTdk	rԐy.|&j jOdA}'tN|!jOdB}(|!jOdC})|!jOdD}*|!jOdE}+|!jOdFd },tDjE j=dG}-tPjQ|"dH  |"dI  |- jR jSdJ}.dKdL|' dM}%|"jOdH|.|-dN|)|(|"jOdH|(dO|,r|,ndPdQdR}/tIdS|/dTdU tAjB|"jOd9jOdV|%|/dW}&|&jTdk	rly|&j }0tUtVjW }1tX }2tIdX|2dTdU tY|2tUtVjW |+|*|(|)|0jOdY|0jOdZtDjE tDjE d[
}3tjjF|3 tjjG  tjjtZj8tJj[j,tJj-d kj,tJj|jkj\ }4tjjtZj8tJjLj,tJj-d kj,tJj|jkj\ }5tjjtZj8t1j]j,t1jt jd kj\ }6|5|4 }7|7dkr|7|6krtjjt1j,t1jt jd kj^t1j d\i tjjG  tId]dTdU tId^|3j_ d_|3j` d`|3ja da|3jb db|3j) dc|3j] dd|3jc de|3jd df|3j dg|3j dhdTdU tddiidfS  tHk
	rh } z(tIdjtU|dTdU tdktU|dldmfS d }~X nX ntIdndTdU tddoidmfS W nF tHk
	r } z(tIdptU|dTdU tdqtU|dldmfS d }~X nX n&tIdr|&jedTdU tds|&jedl|&jTfS W nN tHk

rJ } z0tIdttU|dTdU g }|jdu td|idfS d }~X nX n4tN|d*k
rg }|jdv t|tM||dwdfS d S )xNr   zPhone number is empty.zPhone number is missing.rd   zBooking ID is empty.zBooking ID is missing.r   rm   zSession ID is empty.zSession ID is missing.z5You appear to be missing some data. Please try again.r   i  z<The selected booking does not appear to exist in the system.rO   rP   z$162fface-f5f1-41de-913b-d2bb784dda3arQ   r   public_donationsr   z%Y-%m-%dnew_donation_currency_idnew_donation_amountZnew_donation_currency_buy_rateZnew_donation_currency_sell_rate	n4383h334enjkr4k4z798e770d-5d674a27ee4FemalezMs.z
1900-01-01)rX   sur_nameemailrg   	frequencyr?   rf   payment_option	anonymitygendertitlecitydobcountryr   r}   rW   )r   donation_ref_codezMpesa Checkout)	donation_public_idrd   donation_currencydonation_causedonation_sourcedonation_amountcurrency_buying_amountcurrency_selling_amountrx   z$error while saving checkout donationr   z&The booking has already been paid for.ip r   zB-)rg   
payment_tor?   	referencerd   transaction_referencezKhttps://api.safaricom.co.ke/oauth/v1/generate?grant_type=client_credentialsz;https://api.safaricom.co.ke/mpesa/stkpush/v1/processrequestz7https://api.safaricom.co.ke/mpesa/stkpushquery/v1/query)oauthUrlSTKPushZSTKPushQueryZ Kw6sgSpRhHNavlhiXbdSdGh7JygIMAUQZ7GU4h4te21WxuKLtiƷ zhttps://167.99.85.35:5019z bookings.olpejetaconservancy.orgZ@e50a04ce1d7ebcfd693cd90da55a4313104e579e4c1317c8c921b42ed7288de6)urlsconsumer_keyconsumer_secret
short_codeZmain_urlZ	server_ippass_keyr*  r(  zBasic r+  :r,  Authorization)headersaccess_tokenrg   r?   r&  r%  r'  z%Y%m%d%H%M%Sr-  r.  zutf-8zapplication/jsonzBearer )zContent-Typer0  ZCustomerPayBillOnlinez<https://bookings.olpejetaconservancy.org:5005/mpesa/callbackzNo referencezSome description here)ZBusinessShortCodeZPassword	TimestampZTransactionTypeZAmountZPartyAZPartyBPhoneNumberZCallBackURLZAccountReferenceZTransactionDescz@#####m-pesa mpesa_payloadT)r   r)  )r1  r   next_idMerchantRequestIDCheckoutRequestID)
checkout_transaction_idcheckout_transaction_public_idr%  r&  rg   r?   merchant_request_idcheckout_request_idrx   ry   r^   zi saved data successfullyzg
                            CheckoutTransaction:
                            checkout_transaction_id: z=
                            checkout_transaction_public_id: z)
                            payment_to: z(
                            reference: z+
                            phone_number: z%
                            amount: z2
                            merchant_request_id: z2
                            checkout_request_id: z)
                            created_at: z)
                            updated_at: z
                            z&Check mobile phone to complete paymentzunable to save datazFailed to save transaction)rO   r   i  zstatus is 500zFailed to process paymentzstatus is exception onezError processing paymentzstatus is exception twozFailed to authenticatezmajor exceprion at mpesazLThere was an error connecting to the Mpesa payment service. Try again later.z:The amount is greater than KES 70,000. Try another method.)rO   r?   r   )fr   r   r   r   r   r   r   r/   r{   r   r|   r   r   r   r   r~   r   r   r}   rd   r   r   r   r   r   r   r   r   rW   rm   rx   ry   r   r   currency_buying_rate_at_timecurrency_selling_rate_at_timer   r   rX   rY   r   rg   r   r   r   r   r   r+   rL   r   r   r   r  r"  r#  r$  r   mathceilr   r   r   r-   r  r  r7   postpost_donationr	   r   r   r   r<   r   r   rt   rp   r;   r   r8   base64	b64encodeencodedecodestatus_coder   r   r    get_next_checkout_transaction_idr*   r   ro   r   r?   r   r8  r9  r%  r&  r:  r;  text)8r   r   Zdata_payment_amountrO   r   r   Zmpesa_transaction_refbooking_currencyr   r   r   Zjson_payment_amountr   get_all_booking_donations	donationssingle_donationr"  donation_totalZconverted_amountZonline_payment_donationsonline_payment_donationsingle_online_donationZtransaction_booking_dateZonline_donation_amount	json_datadonation_requestdonationZonline_donation_totalr   r   r   r   r   payloaddetailsurlauthr1  responser2  rg   r?   r&  r%  r'  Z
time_stamppasswordZmpesa_payloadbodyr8  r5  r   ro   rp   r   rr   r2   r2   r3   pay_for_booking_mpesa  s&   


	





 



&





\$$rZ  z/iveri-donation/newc           '   C   st  t jjtjttjtjkjttj	tj
kjttjtjkjtjtjtjtjtjtjtjtjtjtjtjtjtjtj	tjtjtjtjtjtjtj tj!tj"tj#tj$tj%tj&tj%tj'j(tj)d kj(tjt*j+d kj, } | sg }|j-d t.d|idfS g }t*j+d }yt*j+d }W n( t/k
r< } z
g }W Y d d }~X nX t0|dkrdx|D ]
}y| j | j!| j"| j#d|d d	d
ddd| j&d| j'|d t*j+d | jd}t1j2t3|d}yRt4|j+ d t*j+d |d d
d|d | j| jt5j6 d	}t jj7| t jj8  W n, t/k
r, } zt9| W Y d d }~X nX W n, t/k
r\ } zt9| W Y d d }~X nX qTW t.ddidfS )Nrd   z<The selected booking does not appear to exist in the system.rO   rP   r  r   r  r  r  z798e770d-5d6r  r  zMs.z
1900-01-01r  )rX   r  r  rg   r  r?   rf   r  r  r  r  r  r  r  r   r}   rW   )r   r  ZIveri)	r  rd   r  r   r!  r"  r#  r$  rx   zSuccessfully saved donation   ):r   r/   r{   r   r|   r   r   r   r   r~   r   r   r}   rd   r   r   r   r   r   r   r   r   rW   rm   rx   ry   r   r   r<  r=  r   r   rX   rY   r   rg   r   r   r  r  r   r   r   r   r   r   r   r<   r   r7   r@  rA  r   r	   r   r   r   r   )r   r   rN  r   rO  rP  rQ  rR  r2   r2   r3   new_iveri_donations  s    

 r\  z
/mail_testc              C   s   g } g }t jtjd d}ddddg}d}x|D ]}t|}t|}d}td	d
}	t||||	}
y(|jjj	j
|
j d}| jt| W q0 tk
r } z|jt| W Y d d }~X q0X q0W | rtd| iS |rtd|iS d S )NSENDGRID_API_KEY)apikeyzkkagunda@gmail.comz'kenneth.kagunda@olpejetaconservancy.orgzkkagunda2022@gmail.comzkagundakk@yahoo.comz$reservations@olpejetaconservancy.orgzMulti-receiving emailz	text/htmlz+Hello. This is a test email. <br/>Asante...)request_bodyrO   r4   )sendgridSendGridAPIClientr   configEmailContentr   r]   mailsendr@  r8   r   r   r<   r   )Zrandom_arrayerror_arraysgrR   rS   single
from_emailto_emailrU   contentre  rW  r   r2   r2   r3   	mail_test  s*    

$rm  c             C   s  | d }| d }i }| d |d< | d |d< | d |d< | d |d< | d |d< | d d | d  |d	< t j jd
|d< tjtjd d}t|}t|}| d }tdt	d|d}t
||||}	y&|jjjj|	j d}
tdt|
iS  tk
r } ztdt|iS d }~X nX d S )NrR   rS   rW   rX   rY   rZ   r[   r\   r]   z%Ycopyright_yearr]  )r^  rU   z	text/htmlz!confirmation_with_activities.html)r4   )r_  rO   )r	   r   r   r`  ra  r   rb  rc  rd  r   r   r]   re  rf  r@  r8   r   r   r<   )r   rR   rS   r   rh  rj  rk  rU   rl  re  rW  r   r2   r2   r3   r   8  s0    
r   z&/bookings/payment/failure/<booking_id>c             C   s   t jjtjtjd kjtj| kj }|sJg }|j	d t
d|idfS i }|j|d< |j|d< |j|d< |j|d< t
d|id	fS )
Nz.The selected booking does not appear to exist.rO   i  rd   ra   reasonrx   r4   rP   )r   r/   r{   r   r   r   r   rd   r   r   r   ra   r   rx   )rd   r   rO   r   r2   r2   r3   view_payment_failure]  s    




rp  c             C   sB   t jjtjtjd kjtj| kj }x|D ]}|j}|S W d S )N)	r   r/   r{   r   r   r   r   r   r   )status_name	status_idri  booking_status_idr2   r2   r3   r   u  s    
r   z&/donation/payment/status/<booking_ref>c             C   s  t jjtjttjtjkjttj	tj
kjtjtjtjtjtjtjtjtjtjtjtjtjtjtj	tjtjtjtjtjtjtjjtj| kj t!t"j# }i }|r|jdkrd|d< |jdkrd|d< |jdkrd|d< |jdkrd	|d< n|jsd
|d< nd|d< t$d|idfS )Nr^   Paidbooking_payment_statusr   zIncomplete Paymentr  r  rb   z
To InvoicezNot PaidzBooking Not Foundr4   rP   )%r   r/   r{   r   r|   r   r   r   r   r~   r   r   r}   r   r   r   r   r   r   r   rW   rm   rx   ry   r   r   r   r<  r=  r   r   r   optionsr   r   r   r   )booking_refr   r   r2   r2   r3   view_donation_payment_status  s:    





rx  z/bookings/payment/failurec              C   st  yt tjd } W n tk
r*   d} Y nX yt tjd }W n tk
rV   d}Y nX | dkrtjjtjtj	d kj
tjj jttj }n:tjjtjtj	d kj
tjj jttj| |dj}|sg }|jd td|id	fS g }xn|D ]f}i }tjjtjtj|jkj }|r|j|d
< |j|d< |j|d< |j|d< |j|d< |j| qW td|idfS )Npager^   items2   r   Fz'No failed iveri payments at the moment.rO   i  rd   rW   ra   ro  rx   r4   rP   )r   r   argsr<   r   r/   r{   r   r   r   order_byrx   descrv  r   r   r   paginaterz  r   r   r   r}   rd   r   rW   ra   r   )ry  rz  Zfailure_paymentsrO   r   ri  r   r   r2   r2   r3   view_payments_failure  sF    









r  z/bookings/bankslip/newc           r   C   sl  g } y&t jd j  t jd s(| jd W n, tk
rV } z| jd W Y d d }~X nX y&t jd j  t jd s|| jd W n, tk
r } z| jd W Y d d }~X nX y&t jd j  t jd s| jd W n. tk
r  } z| jd	 W Y d d }~X nX y(t jd
 j  t jd
 s(| jd W n. tk
rX } z| jd W Y d d }~X nX y(t jd j  t jd s| jd W n. tk
r } z| jd W Y d d }~X nX y(t jd j  t jd s| jd W n. tk
r } z| jd W Y d d }~X nX y(t jd j  t jd s0| jd W n. tk
r` } z| jd W Y d d }~X nX | rg }|jd td| idfS tttj	 t jd t jd t jd t jd t jd
 t jd t jd t
j d	}tjj| y0tjj  tt g }|jd td|idfS  tk
rf } z6tjj  tt g }|jd t|t|ddfS d }~X nX d S )NrX   zFirst name is empty.zFirst  name is missing.rY   zLast name is empty.zLast  name is missing.slip_referencezSlip reference  is empty.zSlip reference is missing.r   zCurrency is empty.zCurrency reference is missing.r   zAmount is empty.zAmount reference is missing.rd   zBooking ID is empty.zBooking ID is missing.rm   zSession ID is empty.zSession ID is missing.z5You appear to be missing some data. Please try again.r   i  )	booking_bank_slip_public_idrX   rY   r  rd   r   r   rm   rx   z$Bank Slip details successfully savedrO   r[  z1An error occurred while saving bank slip details.)rO   r   )r   r   r   r   r   r   r(   r   r   r   r	   r   r   r/   r   r   r0   r<   r   )r   r   rO   Zbank_slip_detailsr2   r2   r3   save_bank_slip_details  s    







r  z/bookings/bankslip/viewc           )   C   s  yt tjd } W n tk
r*   d} Y nX yt tjd }W n tk
rV   d}Y nX | dkrtjjtjtj	d kj
tjj jttj }n:tjjtjtj	d kj
tjj jttj| |dj}|s| dkrg }|jd td|id	fS g }|jd
 td|id	fS nvg }x^|D ]T}tjjtjtj|jkj }i }|j|d< |j|d< |j|d< |j|d< |j|d< |j|d< |j|d< |j|d< |j|d< |j |d< t!j"t#j$|j%}y|j& d d d |d< W n tk
r    d|d< Y nX |j%|d< |j'}	i }
y&t(|	|
 |
d |d< |
d |d< W n4 tk
rp } zd|d< d|d< W Y d d }~X nX |j| q(W td|id	fS d S )Nry  r^   rz  r{  r   Fz/There are currently nobank slips in the system.rO   rP   z4There are currently no morebank slips in the system.r  rX   rY   r  rW   r}   r   receipt_detailsrx   r~   r4   currency_name r   session_userrm   ))r   r   r|  r<   r   r/   r{   r(   r   r   r}  rx   r~  rv  r   r   r   r  rz  r   r   r   r}   rd   r   r  rX   rY   r  rW   r   r  r~   r7   r8   get_currencyr:   r   r   rm   r.   )ry  rz  return_bank_slipr   r4   ri  r   r   r   rm   	user_infor   r2   r2   r3   view_all_booking_slip1	  sv    
















r  z/bookings/bankslip/allocatec        0      C   s
  g } y&t jd j  t jd s(| jd W n, tk
rV } z| jd W Y d d }~X nX t jd dkrtjjtj	tj
d kj	tjt jd kj }|j}n
t jd }y&t jd j  t jd s| jd W n, tk
r } z| jd W Y d d }~X nX y,tt jd	 j  t jd	 s$| jd
 W n. tk
rT } z| jd W Y d d }~X nX yt jd j  t jd }W n( tk
r } z
d }W Y d d }~X nX | rtd| idfS tt jd	 dkrg }|jd td|idfS yt jd }W n( tk
r } z
d }W Y d d }~X nX yt jd }W n( tk
rR }	 z
d }W Y d d }	~	X nX yt jd }
t jd }W n, tk
r } zd }
d }W Y d d }~X nX yt jd d }W n tk
r   d }Y nX tjjtj	tj
d kj	tjt jd kj }|rn$g }|jd tdt jd idfS tjjtjttjtjkjttjtjkjttjtjkjtjtjtjtjtj tj!tj"tj#tj$tjtj%tj&tj'tjtj(tj)tj*tj+tj,tj-tj.tj/tj0tj1j	tj
d kj	tj|kj2 }|sg }|jd td|idfS i }t3|| t4|d d}tt5j6 }t7tt5j6 t jd |t jd t jd |||
||t jd	 |d}tjj8| tjjtj	tj
d kj	tjt jd kj }tjjt9j	t9j
d kj	t9jt jd kj2 }|j&j:d}t jd |d}t;j<t=|d }|j d! d d" }|j d! d d# }t>|dkrxt?|j)t jd t jd	 |||}t|t| }t9|t jd t jd$ t jd	 |t jd |t jd t@jA |j)|||t@jA t@jA d%}tjj8| tjjtBj	tBj
d kj	tBjt jd kj }|rd&|_
t@jA |_'t|t|kr2d&|_(t@jA |_'tCd'|_nBt|t|kr2t4|dkrZd&|_(nd|_(t@jA |_'tCd(|_nt>|dkr2g } x^|D ]V}!|!jDrt?|j)|!jD|!jE|!jF|!jG|}"nt?|j)|!jD|!jE|!jF|!jG|}"| jt|" qW tH| }#t?|j)t jd t jd	 |||}t|t|# }$|$t| }t9|t jd |t jd	 |t jd |t jd t@jA |j)|||t@jA t@jA d%}tjj8| tjjtBj	tBj
d kj	tBjt jd kj }|rd&|_
t@jA |_'|$t|krd&|_(t@jA |_'tCd'|_n>|$t|kr2t4|dkrd&|_(nd|_(t@jA |_'tCd(|_tjjtIj	tIj
d kj	tIjt jd kj2 }%|%rx$|%D ]}&t jd |&_Jt@jA |&_'qlW nJtjjtKj	tKj
d kj	tKjt jd kj2 }'|'rx&|'D ]}(t jd |(_Lt@jA |(_'qW n tjjtMj	tMj
d kj	tMjt jd kj })|)jN}*tjjtOj	tOj
d kj	tOjP|*kj2 }+|+	rvx&|+D ]},t jd |,_Qt@jA |,_'	qTW n tjjtRj	tRj
d kj	tRjP|*kj2 }-|-	rx&|-D ]}.t jd |._St@jA |._'	qW n ytjjtTj	tTj
d kj	tTjUt jd) kj }/d|/_t jd |/_Vy0tjjW  tXt g }|jd* td|idfS  tk

r } z6tjjY  tXt g }|jd+ t|t|d,dfS d }~X nX W nB tk

r } z$g }|jd- t|t|d,dfS d }~X nX d S ).Nrd   zBooking ID is empty.zBooking ID is missing.rm   r   rf   zPayment method is empty.zPayment method is missing.r   zPayment amount is empty.zPayment amount is missing.r   i  r   z5The payment amount cannot be less than or equal to 0.rO   r   r   r   r   r   r   z9The selected payment method does not exist in the system.z<The selected booking does not appear to exist in the system.rP   rQ   r   r   )rc   rd   re   rf   r   rg   rh   ri   rj   rk   rl   rm   z%Y-%m-%d)r   date)r   r4   
buy_amountZsell_amountrk   )rn   rd   ro   rp   rr   rs   r   rt   rw   rq   ru   rv   rm   rx   ry   r^   r_   r   Zbooking_slip_public_idz,The receipt has successfully been allocated.z)There was an error allocating the recipe.)rO   r   z*There was an error allocating the receipt.)Zr   r   r   r   r   r   r/   r{   r   r   r   rW   r   r}   r   r   r;   r<   r&   r   r|   r   r   r   r   r~   r   r   rd   r   r   r   r   r   r   r   r   rm   rx   ry   r   r   r   r   rX   rY   r   rg   r   r   r   r+   r   r   r   r   r   r   r   r7   r@  get_currency_rate_at_timer   r-   r	   r   r'   r   rt   rp   ru   rv   r   r   r   r   r   r    r   r!   r   r   r"   r   r(   r  r  r   r0   r   )0r   r   r   rd   rm   rO   rg   r   rh   r   ri   rj   r   r   rf   r   r   r   r   re   r   r   r   r  	post_datar   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r2   r2   r3   allocate_bank_slip	  s$   


























&
r  z/bookings/paymentsc           8   C   s  yt tjd } W n tk
r*   d} Y nX yt tjd }W n tk
rV   d}Y nX | dkrtjjtjtj	d kj
tjj jttj }n:tjjtjtj	d kj
tjj jttj| |dj}|sg }|jd td|id	fS g }x|D ]}i }tjjtjtj|jkj }|r>|j|d
< |j|d< tjjtjtj	d kjtj|jkj }y|j|d< W n, tk
r }	 zd|d< W Y d d }	~	X nX i }
t|j|
 y|
d |d< |
d |d< W n6 tk
r }	 zd|d< |j|d< W Y d d }	~	X nX t j!t"j#|j$}y|j% d d d |d< W n tk
rT   d|d< Y nX |j$|d< t&|j'|d< |j(|d< |j)|d< |j*|d< |j|d< |j| qW td|idfS )Nry  r^   rz  r{  r   Fz6Currently no booking payments available in the system.rO   i  rd   rW   payment_method_namer  r  rm   r4   r  r   r   rl   rh   ri   rj   rx   rP   )+r   r   r|  r<   r   r/   r{   r   r   r   r}  rx   r~  rv  r   r   r   r  rz  r   r   r   r}   rd   r   rW   r&   r   rf   r  r.   rm   r7   r8   r  r:   r   r   r;   rl   rh   ri   rj   )ry  rz  booking_paymentsrO   r   ri  r   r   rf   r   r  r   r2   r2   r3   view_all_booking_payments
  sv    










r  z/mpesa/callbackGETc           -   C   sv  t ddd tjdkrfd } t ddd t tj dd y4tj}t d|jddd tj } t d| dd W n0 tk
r } zt d	|dd W Y d d }~X nX ytj }t d
|dd W n. tk
r } zt ddd W Y d d }~X nX | d d d }| d d d }| d d d }t d| dd |dkrft dd d d d  t ddd t	j
jtj||djddi t	j
j  tjj||dj }t d|dd |rH|j}|j}	|j}
|j}|d|	|
||dd}t d|dd t| yg }|jd td|idfS  tjk
rD } ztd d!t| id"fS d }~X nX ntd d#| d$| d%id&fS tdd'idfS )(Nz1update_booking_mpesa_payment calllback was calledT)r   rM   z0update_booking_mpesa_payment callback was calledzRaw request body:zutf-8zParsed request JSON:z&Error at request body or JSON parsing:zwas  responsezwas not responseZBodyZstkCallbackr6  r7  Z
ResultCodezResult Code: r   z9////////////////////////////////////////////////////////
zC///////////////////bookings/payment/mpesa/new ////////////////////
zSUCCESSFUL PAYMENT)r:  r;  r   updated_transactionz$cbff45f3-4f12-41da-8b4a-bf308112f032r   )rd   rf   r   r   rk   r   rm   booking_payloadzMpesa payment successful.rO   rP   r   zError fetching payment data: i  z8updated_transaction transaction with merchant_request_idz and  checkout_request_idz does not existi  zCallback processed)r   r   methodr	   r   r4   rE  get_jsonr<   r   r/   r{   r*   	filter_byr   r   r   r&  rg   r:  r?   update_mpesa_paid_bookingr   r   r7   RequestExceptionr   )Zreq_dataZraw_datar   rY  r:  r;  result_coder  rd   rg   r   r?   r  rO   r2   r2   r3   update_booking_mpesa_payment;  sr     




(r  c              C   s&   t jjt jjtjj } | p dd S )Nr   r^   )r   r/   r{   r   maxr*   r8  r   )Zmax_idr2   r2   r3   rG    s    rG  c       1      C   sV  g }t d| dd y"| d j  | d s2|jd W n, tk
r` } z|jd W Y d d }~X nX | d dkrtjjtjtj	d kjtj
| d kj }|j}n| d }y"| d	 j  | d	 s|jd
 W n, tk
r } z|jd W Y d d }~X nX y(t| d j  | d s |jd W n. tk
rP } z|jd W Y d d }~X nX y(t| d j  | d sx|jd W n. tk
r } z|jd W Y d d }~X nX y| d j  | d }W n( tk
r } z
d }W Y d d }~X nX |rtd|idfS t| d dkr2g }|jd td|idfS y| d }W n4 tk
rr } zt t| d }W Y d d }~X nX y| d }	W n4 tk
r }
 zt t|
 d }	W Y d d }
~
X nX y| d }| d }W n8 tk
r } zt t| d }d }W Y d d }~X nX tjjtjtj| d	 kjtj	d kj }y|rF| d d }nd }W n tk
rf   d }Y nX tjjtjtj	d kjtj| d	 kj }|rn"g }|jd td| d	 idfS tjjtjttjtjkjttjtjkjttjtjkjtjtjtjtj tj!tj"tj#tj$tj%tj
tj&tj'tj(tjtj)tj*tj+tj,tj-tj.tj/tj0tj1tj2jtj	d kjtj|kj3 }|sg }|jd td|idfS i }t4|| t5|d  d!}| d dk	rtjjt6jt6j7|	kj }|rg }|jd" td|idfS tt8j9 }t6tt8j9 ||d#d$||	|||| d |d%}tjj:| tjjtjtj	d kjtj|kj }tjjt;jt;j	d kjt;j|kj3 }t<|dkrt|t| d  }t;|||| d |d#d$t=j> |j*d&d&|t=j> t=j> d'}tjj:| tjjt?jt?j	d kjt?j|kj }|r>d&|_	t=j> |_(t|t| d krpd&|_)t=j> |_(t@d(|_n0t|t| d krd!|_)t=j> |_(t@d)|_n0t<|dkrg }x|D ]}|jt|jA qW tB|}t|| } | t| d  }t;|||| d |d#d$t=j> |j*d&d&|t=j> t=j> d'}tjj:| tjjt?jt?j	d kjt?j|kj }|rzd&|_	t=j> |_(| t| d krd&|_)t=j> |_(t@d(|_n,| t| d krd!|_)t=j> |_(t@d)|_tjjtCjtCj	d kjtCj|kj3 }!|!r$x |!D ]}"d#|"_Dt=j> |"_(qW n tjjtEjtEj	d kjtEj|kj3 }#|#rtx |#D ]}$d#|$_Ft=j> |$_(qXW n tjjtGjtGj	d kjtGj|kj }%|%jH}&tjjtIjtIj	d kjtIjJ|&kj3 }'|'rx |'D ]}(d#|(_Kt=j> |(_(qW n tjjtLjtLj	d kjtLjJ|&kj3 })|)	rBx |)D ]}*d#|*_Mt=j> |*_(	q&W n y0tjjN  tOt g }|jd* td|idfS  tk
	r } z6tjjP  tOt g }|jd+ t|t|d,dfS d }~X nX n| d	 d-k
rltjjt6jt6j	d kjt6j| d	 kjt6j| d kjt6jQ| d kj }+|+
sJg }|jd. td|idfS g }|jd/ td|idfS n| d	 d-krRtt8j9 }t6tt8j9 | d || d	 | d0 ||	|||| d |d%}tjj:| tjjtjtj	d kjtj| d kj }tjjt;jt;j	d kjt;j| d kj3 }tRjStTjU| d0 },|,jV d1 d d2 }-|,jV d1 d d3 }.t<|dkrtW|j*| d0 | d }/t| d t|/ }t;|| d | d | d || d	 || d0 t=j> |j*|-|.|t=j> t=j> d4}tjj:| tjjt?jt?j	d kjt?j| d kj }|r,d&|_	t=j> |_(t| d t|/kr^d&|_)t=j> |_(t@d(|_nFt| d t|/krBt5|dkrd&|_)nd!|_)t=j> |_(t@d)|_nt<|dkrBg }xJ|D ]B}|jXrtW|j*|jX|jA}0ntW|j*|j*|jA}0|jt|0 qW tB|}tW|j*| d0 | d }/t| d t| } | t|/ }t;|| d | d | d || d	 || d0 t=j> |j*|-|.|t=j> t=j> d4}tjj:| tjjt?jt?j	d kjt?j| d kj }|rd&|_	t=j> |_(| t|/krd&|_)t=j> |_(t@d(|_n>| t|/krBt5|dkr(d&|_)nd!|_)t=j> |_(t@d)|_tjjtCjtCj	d kjtCj| d kj3 }!|!rx$|!D ]}"| d	 |"_Dt=j> |"_(qzW n tjjtEjtEj	d kjtEj| d kj3 }#|#rx$|#D ]}$| d	 |$_Ft=j> |$_(qW n tjjtGjtGj	d kjtGj| d kj }%|%jH}&tjjtIjtIj	d kjtIjJ|&kj3 }'|'rxx$|'D ]}(| d	 |(_Kt=j> |(_(qXW n tjjtLjtLj	d kjtLjJ|&kj3 })|)rx$|)D ]}*| d	 |*_Mt=j> |*_(qW n y0tjjN  tOt g }|jd* td|idfS  tk
rP } z6tjjP  tOt g }|jd+ t|t|d,dfS d }~X nX d S )5Nr  T)r   rd   zBooking ID is empty.zBooking ID is missing.rm   r   rf   zPayment method is empty.zPayment method is missing.rk   zBooking amount is empty.zBooking amount is missing.r   zPayment amount is empty.zPayment amount is missing.r   i  r   z5The payment amount cannot be less than or equal to 0.rO   r   r   r   r   r   r   z9The selected payment method does not exist in the system.z<The selected booking does not appear to exist in the system.rP   rQ   r   z&The booking has already been paid for.z$1c9d01cc-ef31-4757-a390-10c765fcecabz$162fface-f5f1-41de-913b-d2bb784dda3a)rc   rd   re   rf   r   rg   rh   ri   rj   rk   rl   rm   r^   )rn   rd   ro   rp   rr   rs   rt   rw   rq   ru   rv   rm   rx   ry   r_   r   zThe booking has been paid for.z*There was an error paying for the booking.)rO   r   z$cbff45f3-4f12-41da-8b4a-bf308112f032z7The Mpesa payment was not successful. Please try again.zMpesa payment successful.r   r4   r5   r6   )rn   rd   ro   rp   rr   rs   r   rt   rw   rq   ru   rv   rm   rx   ry   )Yr   r   r   r   r   r/   r{   r   r   r   rW   r   r}   r   r   r;   r%   rf   r<   r&   r   r|   r   r   r   r   r~   r   r   rd   r   r   r   r   r   r   r   r   rm   rx   ry   r   r   r   r   rX   rY   r   rg   r   r   r   r+   r   r   rh   r   r   r   r   r   r	   r   r'   r   rp   r   r   r   r   r   r    r   r!   r   r   r"   r   r   r0   r   rl   r7   r8   r9   r:   r   rL   rt   )1r  r   r   r   rd   rm   rO   rg   r   rh   r   ri   rj   r   r   r   rf   r   r   r   r   r   re   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r2   r3   r    sZ   






















&























r  )jflaskr   r   r   r   r   r   r   r	   r
   
flask_mailr   r   sendgrid.helpers.mailpymysqlosr>  r7   r   r`  rB  routesr   r   r   r   routes.bookings_urlsr   r   r   database.booking_activity_logr   database.booking_typesr   database.bookingsr   database.booking_statusr   database.booking_paymentsr   Z!database.booking_payments_failurer   database.donationr   database.facilityr   database.inventoryr   database.booking_detailsr   database.transactionr   database.gatepassr    database.gatepass_guestsr!   database.gatepass_vehiclesr"   database.vehicler#   database.salesforcer$   database.payment_gatewaysr%   database.payment_methodsr&   database.invoicer'   database.booking_bank_slipsr(   database.partnerr)   Zdatabase.checkout_transactionr*   functions.booking_snippetsr+   functions.validationr,   	variablesZroutes.print_urlsr-   r.   r0   rL   router   r   r   r   r   r   r  rZ  r\  rm  r   rp  rx  r  r  r  r  r  r  rG  r  r2   r2   r2   r3   <module>   s   $8: rI |     	K@n   ['%$1XO  oNa