
    {i|'                       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 d dlmZ 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mZ  ed      Zd"dZd#dZd#dZ ed       G d d             Z  ed       G d d             Z!d$dZ"d%dZ#d&dZ$	 	 	 	 	 	 d'dZ%d(dZ&e
jN                  d)d       Z(d*dZ)e
jN                  d*d       Z*	 	 	 	 	 	 	 	 d+d Z+y!),    )annotations)	dataclass)DecimalROUND_HALF_UP)Iterable)transaction)MaxPrefetch)Booking)is_being_deletedis_booking_id_being_deleted)ReceiptReceiptLineItem)	Structure) calculate_booking_city_tax_total   )BookingServicez0.01c                d    t        t        | xs d            j                  t        t              S )Nr   rounding)r   strquantize	TWOPLACESr   values    $/backend/services/receipt_service.pyquantize_moneyr      s%    3uz?#,,Y,OO    c                    t        |       } t        t        |xs d            }|dk  r| S t        d      |t        d      z  z   }| |z  j                  t        t
              S )Nr   1100r   )r   r   r   r   r   r   )gross_amountvat_ratedivisors      r   calculate_net_from_grossr%      s^    !,/Ls8=q)*H1}clh78G7",,Y,OOr   c                6    t        | |      }t        | |z
        S N)r%   r   )r"   r#   
net_amounts      r   calculate_vat_from_grossr)   #   s    ),AJ,344r   T)frozenc                  J    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   y	)
CalculatedLineItemr   	line_typedescriptionr   r#   r"   r(   
vat_amountN__name__
__module____qualname____annotations__ r   r   r,   r,   (   s%    Nr   r,   c                  T    e Zd ZU ded<   ded<   ded<   ded<   ded<   ded<   ded	<   y
)ReceiptBreakdownzlist[CalculatedLineItem]
line_itemsr   taxable_grosstaxable_nettaxable_vatcity_tax_amount	total_nettotal_grossNr0   r5   r   r   r7   r7   2   s,    ((r   r7   c                P   t         j                  j                         j                  | j                         t
        j                  j                  |       j                  t        d            d   xs ddz   }| j                  xs dj                         xs d}|| d	|d
fS )Npk)	structuresequence)max_sequencerD   r   r   REC-05d)r   objectsselect_for_updategetrA   r   filter	aggregater	   receipt_prefixstrip)rB   next_sequenceprefixs      r   get_receipt_number_componentsrQ   =   s    '')--->3==3z?=[	
 	 	
M &&/%668AEFVHAmC%8999r   c                2    t        t        | xs d            S Nr   )r   r   r   s    r   _normalize_decimalrT   I   s    3uz?##r   c                    t        | j                        }t        t        | j                        |z
        }|dkD  s|dk  r|S |S rS   )r   subtotaltotal_price)bookingr<   subtotal_amountfallback_amounts       r   _get_accommodation_grossr[   M   sG    $W%5%56O$^G4G4G%H?%Z[Oo2r   c                P   | j                   j                         j                          t        j                  j                  |D cg c]P  }t        | |j                  |j                  |j                  |j                  |j                  |j                        R c}       y c c}w )N)receiptr-   r.   r#   r"   r(   r/   )r8   alldeleter   rH   bulk_creater-   r.   r#   r"   r(   r/   )r]   r8   	line_items      r   _replace_receipt_line_itemsrb   V   s     ##%'' (	
 (	 #--%11"++&33$//$// (	
	
s   AB#c                n   t        | j                  j                               }|s8t        t        j                  j                  |       j                  d            }t        t        |             }t        | |      }t        t        | j                  j                  xs d            }t        ||      }t        ||      }t!        t"        j$                  j&                  d||||      g}|}|}	|}
|D ]  }t        |j(                        }t        t        |j*                  xs d            }t        ||      }t        ||      }|j-                  t!        t"        j$                  j.                  |j0                  j2                  ||||             ||z  }|	|z  }	|
|z  }
 |dkD  rJ|j-                  t!        t"        j$                  j4                  dt        d      ||t        d                   t7        |t        |      t        |	      t        |
      |t        |	|z         t        ||z         	      S )
N)rX   servicer   Accommodation)r-   r.   r#   r"   r(   r/   zCity Tax0z0.00)r8   r9   r:   r;   r<   r=   r>   )listbooking_servicesr^   r   rH   rK   select_relatedr   r   r[   r   r   rB   default_vat_rater%   r)   r,   r   LineTypeACCOMMODATIONpricer#   appendSERVICErd   nameCITY_TAXr7   )rX   rh   r<   accommodation_grossaccommodation_vat_rateaccommodation_netaccommodation_vatr8   r9   r:   r;   booking_servicer"   r#   r(   r/   s                   r   build_receipt_breakdownrw   k   s#   G4488:;""))'):II)T
 %%Eg%NOO27OL$S):):)K)K)Pq%QR01DF\]01DF\] 	%..<<'+,((	
	J (M#K#K+%o&;&;<377<1=>-lHE
-lHE
)22::+3388!)%%		
 	%z!z!% ,( )22;;& ,*"6?		
 $]3";/";/' !>?"=?#BC r   c           
     :   | y t        | t              rKt        | dd      st        |       ry t        | dd      ry | j                  j
                  sy | j                  sy t        | t              rt        |       ry t        | t              r| j                  n
t        |       }t        |      ry t        j                  j                  d      j                  t        dt        j                  j                  d                  j                  |      j!                         } | t        |       ry t        | dd      ry | j                  j
                  sy | j                  sy t"        j                  j%                         j                  | 	      j!                         }||j&                  r|S t)        |       }|rt+        | j                        \  }}t"        j                  j-                  | j                  | |||j.                  |j0                  |j2                  |j4                  
      }nX|j.                  |_        |j0                  |_        |j2                  |_        |j4                  |_        |j9                  g d       t;        ||j<                         |S )N_is_being_deletedF_skip_receipt_syncrB   rh   rd   )querysetr@   )reservation)rB   r|   numberrC   r>   r=   	total_vatr<   )r>   r=   r~   r<   
updated_at)update_fields)
isinstancer   getattrr   rB   invoicing_enabledis_checked_inidintr   rH   ri   prefetch_relatedr
   r   rK   firstr   rI   is_finalizedrw   rQ   creater>   r=   r;   r<   r~   saverb   r8   )rX   
booking_idr]   	breakdownrC   r}   s         r   sync_receipt_for_bookingr      s<   '7#7/7;KG;T70%8  22$$'7#(8(A)'7;WJ":. 	&&{3		(#5@V@V@e@efo@pq	r	:			  *73w,e4..   	))+	G	$	 
 w33'0I89J9JK&//((''!--))++%55 ) 	
 (33%//%11"+";"; 	 	
  )=)=>Nr   c                    t        | t              r| j                  n
t        |       }t	        t
        j                  j                  |d      j                  dd            }d}|D ]  }t        |      |dz  } |S )NT)structure_idr   r   )flatr   r   )
r   r   r   r   rg   r   rH   rK   values_listr   )rB   r   booking_idssynced_countr   s        r   sync_receipts_for_structurer     s    #-i#C9<<YL% 	 	
 +d+
&	K L!
#J/;AL " r   c                    t        | t              r| j                  n
t        |       }t        j
                  j                         j                  |d      }|j                         }|j                          |S )NF)r   r   )
r   r   r   r   r   rH   rI   rK   countr_   )rB   r   draft_receiptsdeleted_counts       r   #delete_draft_receipts_for_structurer     se    #-i#C9<<YL__668??! @ N #((*Mr   c                   t        | j                        }t        |      }t        | j                        }|r|st	        |        y |r|r||k7  rt        |        y y y r'   )boolr   rT   rj   r   r   )rB   previous_invoicing_enabledprevious_default_vat_ratecurrent_invoicing_enabledprevious_vat_ratecurrent_vat_rates         r   *handle_structure_invoicing_settings_changer     se     !%Y%@%@ A*+DE))*D*DE!*C+I6 &*;?O*O#I. +P !r   N)r   zDecimal | int | float | strreturnr   )r"   r   r#   r   r   r   )rB   r   r   ztuple[int, str])r   "Decimal | int | float | str | Noner   r   )rX   r   r<   r   r   r   )r]   r   r8   zIterable[CalculatedLineItem]r   None)rX   r   r   r7   )rX   zBooking | intr   zReceipt | None)rB   zStructure | intr   r   )rB   r   r   r   r   r   r   r   ),
__future__r   dataclassesr   decimalr   r   typingr   	django.dbr   django.db.modelsr	   r
   bookings.modelsr   invoicing.deletionr   r   invoicing.modelsr   r   structures.modelsr   structures.city_tax_servicer   modelsr   r   r   r%   r)   r,   r7   rQ   rT   r[   rb   rw   atomicr   r   r   r   r5   r   r   <module>r      s   " ! *  ! * # L 5 ' H "FO	PP5
 $   $  	:$, 
*DN M M`  // !%/  B	/
 
/r   