
    iN0              
       ,   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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 ddl m!Z!  edgde! ed       ed       ed      d       G d de             Z"y)    )BytesIO)Path)HttpResponse)get_object_or_404)timezone)slugify)IsAuthenticated)APIView)OpenApiResponseextend_schema)Booking)	Structure   )build_configured_exemption_mapbuild_monthly_rate_mapbuild_period_boundscalculate_city_tax_report$get_missing_city_tax_settings_fieldsnormalize_platform_tokens)StructureCityTaxSettings)CityTaxPreviewRequestSerializerzCity TaxzExport city tax report as XLSXz	XLSX file)descriptionzValidation errorszStructure/settings not found)     i  )tagssummaryrequest	responsesc                   h    e Zd ZegZed        Zed        Zed        Zed        Z	ed        Z
d Zy)CityTaxExportAPIViewc                    i 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"i d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAddBd}|j                         D ]
  \  }}|| |<    y )CNA1idB1first_guest_statusC1client_full_nameD1zCheck in date timeE1zCheckout date timeF1rental_nameG1nights_countH1Total_guests_countI1AdultsJ1ChildrenK1final_priceL1
created_atM1sourceN1guest_city_tax_base_amountO1rental_tax_amountP1estimated_total_city_taxQ1estimated_ordinary_nightsR1estimated_exempt_nightsS1 estimated_platform_exempt_nightsT1client_emailU1client_phoneV1zCheck in date format 1W1zCheck out date format 1X1zCheck in dateY1zCheck out dateZ1zAdults x nights <=8 nightsAA1zMinors x nights <=8 nightsAB1zAll guests x nightsAC1zLong stay # of adultsAD1zLong stay nightsAE1zAdults + Minors + Long StayAF1zValidation CheckAL1AM1)items)wsheaderscellvalues       ,/backend/structures/views_city_tax_export.py_apply_booking_sheet_headersz1CityTaxExportAPIView._apply_booking_sheet_headers*   s   #
$#
&#
 $#
 &	#

 &#
 -#
 .#
 &#
 (#
 *#
 -#
 ,#
 (#
 .#
 %#
  ,!#
" -##
$ +%#
& 4'#
( .)#
* .+#
, *-#
. +/#
0 /1#
2 "3#
4 .5#
6 /7#
8 (9#
: *;#
< %=#
> 0?#
@ %A#
B 4C#
D 8E#
H #==?KD%BtH +    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%   | d&| <   |d'   | d(| <   |d)   | d*| <   |d   d d+ | d,| <   |d	   d d+ | d-| <   |d   d d+ | d.| <   |d	   d d+ | d/| <   |d!   | d0| <   |d#   | d1| <   |d2   | d3| <   |d4   | d5| <   |d6   | d7| <   |d8   | d9| <   |d8   |d2   k(  | d:| <   |d   | d;| <   |d   | d<| <   y )=Nr#   Ar%   Br'   Ccheck_inD	check_outEr+   Fr-   Gtotal_guests_countHadultsIchildrenJr5   Kr7   Lr9   Mr;   Nr=   Or?   PrA   QrC   RrE   SrG   TrI   U
   VWXYZAAall_guest_nightsABoverflow_guest_countACoverflow_nightsADvalidation_totalAEAFALAM )rX   row_idxpayloads      r\   _write_booking_rowz'CityTaxExportAPIView._write_booking_rowS   s   #DMQwi=#$89Qwi=#$67Qwi=#J/Qwi=#K0Qwi=#M2Qwi=#N3Qwi=#$89Qwi=#H-Qwi=#J/Qwi=#M2Qwi=#L1Qwi=#H-Qwi=#$@AQwi=#$78Qwi=#$>?Qwi=#$?@Qwi=#$=>Qwi=#$FGQwi=#N3Qwi=#N3Qwi=#J/4Qwi=#K0"5Qwi=#J/4Qwi=#K0"5Qwi=#$?@Qwi=$%>?Ry>$%78Ry>$%;<Ry>$%67Ry>$%78Ry>$%78GDV<WWRy>$T]Ry>$X.Ry>r^   c                 l    g d}|s|D ]  }d| | | <    y |D ]  }d| d| d|dz
   d| | | <    y )N)rj   rl   rn   rt   ru   rv   rw   r   r   r   r   r   r   r   z=SUBTOTAL(9,$z$2:$$r   )r   )rX   r   has_datatotal_columnscolumns        r\   _write_booking_totals_rowz.CityTaxExportAPIView._write_booking_totals_rowz   sf    
 '+,fXgY'( (#F)6vhd6(!GVWK=XY'ZB&'#$ $r^   c                 P    |j                         D ]  \  }}|| | |    _         y )N)rW   _style)rX   r   	style_mapcolstyles        r\   _apply_row_stylez%CityTaxExportAPIView._apply_row_style   s-    #//+JC+0B#wi !( ,r^   c                    ddl m} d| d<   || d<   d| d<   d| d	<   d
| d<   d| d<   d| d<   |D ci c]  }|ddd
 }}|D ].  }||d      dxx   |d   z  cc<   ||d      dxx   |d   z  cc<   0 d}|D ].  }||   | d| <   ||   d   | d| <   ||   d   | d| <   |dz  }0 d| d| <   d|dz
   d| d| <   d|dz
   d| d| <   y c c}w )Nr   )MONTH_SHORTr+   r"   r$   Total GuestsB2zTotal Overnight StaysC2z
Row LabelsA3zSum of Total_guests_countB3zSum of All guests x NightC3r   )guestsnightsmonthr   ri   r   r      r`   ra   rb   zGrand Totalz=SUM($B$4:$B$r   z=SUM($C$4:$C$)city_tax_servicer   )	rX   structure_namerowsmonths_ranger   r   month_totalsrowcurrent_rows	            r\   _build_summary_sheetz)CityTaxExportAPIView._build_summary_sheet   sh   1 4!4!4*44.4.4GST|e!q99|TCW&x0C8L4MM0W&x0C8J4KK0  !E$/$6B;- !$0$7$AB;- !$0$7$AB;- !1K	 " !.Q{m"/a/@ BQ{m"/a/@ BQ{m Us   Cc                 $	   t        |j                        }|j                  d       |j                  d   }|j                  d   }|j                  j	                  d      }|j                  j	                  d      }t        t        |      }t        t        |d	      }	t        |	      }
|
rt        d
dj                  |
       d      S t        |      \  }}}t        ||d         }t        |	j                        }t        |	j                         }t"        j$                  j'                  |||      j)                  d      j+                  d      }|r|j'                  |      }|r|j'                  |      }t-        |j/                  dd      |||	j0                  |t3        |	j4                  xs d      t3        |	j6                  xs d      ||t9        |	j                   xs g       
      }|j:                  }t=        t>              jA                         jB                  dz  dz  }|jE                         st        dd      S ddl#m$} ddl%m&}m'}  ||      }|d   }|d   }d |_(        d!|_(        |jS                  d"d#       | jU                  |       d$D ci c]  }||| d%   jV                   }}|jX                  d&z
  }|dkD  r|j[                  d#|       d#}|D ]-  }| j]                  |||       | j_                  |||       |d&z  }/ |} | ja                  || tc        |      '       | j_                  || |       t9        |jd                  jg                               D ]  }!|jd                  |!=   |d(d)|  *      }"d|"_4         |d+d,d,dd,-      |"_5        |jm                  |"       |j[                  d&|jX                         | jo                  ||jp                  ||.       ts               }#|ju                  |#       |#jw                  d       ty        jz                         j}                         }$t        |jp                        xs d/|j                   }%d0|% d1|$ d2}&t        |#j                         d34      }'d5|& d6|'d7<   |'S c c}w )8N)dataT)raise_exceptionperiodratesproperty_type_idproperty_id)r#   )	structure	is_activezMissing city tax settings: z, r   )statusyear)r   check_in_date__ltcheck_out_date__gtpropertyr   )r   )r   check_in_dater#   r   )
bookingsr   rates_overridedefault_ratemonthly_rate_mapmax_taxable_nightsminor_age_limitconfigured_exemptionsplatform_exemptionsplatform_exemption_labels	templateszcity-tax-template.xlsxzTemplate file not foundi  )load_workbook)TableTableStyleInfozbookings (14)zTotale OspitiBookingsr         )"r`   ra   rb   rd   rf   rg   rh   rj   rl   rn   ro   rp   rq   rr   rs   rt   ru   rv   rw   rx   ry   r{   r|   r}   r~   r   r   r   r   r   r   r   r   r   2r   )r   Table_1zA1:AF)displayNamerefTableStyleMedium2F)nameshowFirstColumnshowLastColumnshowRowStripesshowColumnStripes)r   r   r   z
structure-z	city-tax--z.xlsxzAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet)content_typezattachment; filename=""zContent-Disposition)Br   r   is_validvalidated_datagetr   r   r   r   r   joinr   r   r   exemption_reasonsr   r   r   objectsfilterselect_relatedprefetch_relatedr   order_byr   intr   r   listexport_rowsr   __file__resolveparentexistsopenpyxlr   openpyxl.worksheet.tabler   r   titledelete_colsr]   r   max_rowdelete_rowsr   r   r   booltableskeystotalsRowShowntableStyleInfo	add_tabler   r   r   saveseekr   	localdate	isoformatr   r#   getvalue)(selfr   structure_id
serializerr   r   r   r   r   settingsmissingperiod_startperiod_end_exclusiver   r   r   r   r   resultr   template_pathr   r   r   workbookbooking_sheetsummary_sheetr   data_style_maprows_to_deleter   row_payload
totals_row
table_nametableoutput	file_datestructure_slugfilenameresponses(                                           r\   postzCityTaxExportAPIView.post   s   4',,G
D1**84#227;%44889KL //33MB%iLA	$$
 7x@-dii.@-AB 
 <Ov;V8*L1)VF^L >&&!
 88T8TU OO""#"6#/ # 
 ^J'h' 	 8HIH;?H*&&=)!..-"8#>#>#C!D 8 8 =A>"7 3&*8+G+G+M2&N
 (( N""$++k9<TT 	 ##% 9#FF*B / 1 1(,!!"a())-8#&
# #ay)000# 	 &
P '..2A%%a8&K##M7KH!!-.IqLG '
 
&&+& 	' 	

 	mZH}3388:;J$$Z0 < )51EF#-$! # 
 	&!!!]%:%:;!!$>>%	 	" 	
 fA&&(224	 0Oj4O~.a	{%@OO\
 -C8*A*N&'{&
s   RN)__name__
__module____qualname__r	   permission_classesstaticmethodr]   r   r   r   r   r  r   r^   r\   r    r       s{     **& &P $/ $/L [ [0 1 1 C C6kr^   r    N)#ior   pathlibr   django.httpr   django.shortcutsr   django.utilsr   django.utils.textr   rest_framework.permissionsr	   rest_framework.viewsr
   drf_spectacular.utilsr   r   bookings.modelsr   structures.modelsr   r   r   r   r   r   r   r   modelsr   serializers_city_tax_previewr   r    r   r^   r\   <module>r)     s      $ . ! % 6 ( @ # '  - I 
,+5)<=)GH		x7 x	xr^   