
    i-                     x   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 d dl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mZmZ d dlmZ d dlmZ d dl m!Z! de"dedefdZ#de"dedefdZ$dededefdZ%	 d,dededededz  ddf
dZ&dededefdZ'ddde"dede"dz  defdZ(	 	 	 d-ded edz  d!edz  de"dz  de)e   f
d"Z*ddde"dedede"dz  def
d#Z+ddde"dede"dz  de,e-e.f   fd$Z/dede-dz  fd%Z0de"dede,e"ef   fd&Z1d'ed(ede-fd)Z2dedede3e4e-dz  e)e-   f   fd*Z5dededefd+Z6y).    )date)HTTPExceptionstatus)select)Session
joinedload)WhatsAppBookingSession)Customer)ReservationReservationStatusReservationStatusHistory)Room)Table)Venue)ReservationCreateReservationReadReservationUpdate)reassign_single_reservation)LAYOUT_UNITS_PER_METER)ensure_room_for_venuevenue_iddbreturnc                 >    t        | |      }|j                          |S N)r   flush)r   r   rooms      I/var/www/html/PRENOTAZIONI_IA/backend/app/services/reservation_service.pyget_default_roomr      s     2.DHHJK    customer_idc                 l    |j                  t        |       }|t        t        j                  d      |S )NzCliente non trovatostatus_codedetail)getr
   r   r   HTTP_404_NOT_FOUND)r!   r   customers      r   get_customerr)      s1    vvh,H(A(AJ_``Or    payloadc                    | j                   t        | j                   |      S t        t              j	                  t        j
                  | j                  k(  t        j                  | j                  k(        }|j                  |      }|U| j                  r*|j                  | j                  k7  r| j                  |_        | j                  r| j                  |_        |S t        | j                  xs d| j                  xs d| j                  | j                        }|j                  |       |j                          |S )N )namephoneemailnotes)r!   r)   r   r
   wherer.   customer_phoner-   customer_namescalarcustomer_emailr/   customer_notesr0   addr   )r*   r   stmtexistingr(   s        r   find_or_create_customerr:       s    &G//44(!!(..G4J4J"JHMM]d]r]rLrsDyyH!!hnn8N8N&N$33HN!!$33HN""(b$$*$$$$	H FF8HHJOr    Nreservation
new_status
old_statusc                 V    t        | j                  ||      }|j                  |       y )N)reservation_idr=   r<   )r   idr7   )r;   r<   r   r=   historys        r   append_status_historyrB   8   s(     '"~~G
 FF7Or    c                 z   |j                  t        | j                        }|t        t        j
                  d      t        | |      }t        | j                  |j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  | j                  
      }|j!                  |       |j#                          t%        ||j                  |       |j#                          t'        ||       |j)                          t+        |j                  |      S )NzLocale non trovator#   )
r   r!   reservation_date
start_timeduration_minutesguestsr   sourcer0   area_preference)r&   r   r   r   r   r'   r:   r   r@   rD   rE   rF   rG   rH   r0   rI   r7   r   rB   r   commitget_reservation_or_404)r*   r   venuer(   r;   s        r   create_reservationrM   F   s    FF5'**+E}(A(AJ^__&w3H!!KK 11%% 11~~~~~~mm//K FF;HHJ+{'9'92>HHJR0IIK!+.."55r    r   r?   c                   t        t              j                  t        t        j                        t        t        j
                        t        t        j                        t        t        j                              j                  t        j                  | k(        }|"|j                  t        j                  |k(        }|j                  |      }|t        t        j                  d      |S )NzPrenotazione non trovatar#   )r   r   optionsr   r(   assigned_tableassigned_combinationstatus_historyr1   r@   r   r4   r   r   r'   )r?   r   r   r8   r;   s        r   rK   rK   a   s    {	{++,{112{778{112	

 
{~~/	0 	 zz+..(:;))D/K(A(AJdeer    rD   status_filterc                    t        t              j                  t        t        j                        t        t        j
                        t        t        j                        t        t        j                              j                  t        j                  j                         t        j                  t        j                        }|"|j                  t        j                  |k(        }|"|j                  t        j                  |k(        }|"|j                  t        j                  |k(        }t!        | j#                  |      j%                               S r   )r   r   rP   r   r(   rQ   rR   rS   order_byrD   descrE   
created_atr1   r   r   listscalarsunique)r   rD   rT   r   r8   s        r   list_reservationsr\   t   s     	{	{++,{112{778{112	

 
+..335{7M7M{OeOe	f 	 zz+..(:;#zz+66:JJK zz+,,=>

4 '')**r    c                \   t        | ||      }|j                  }d}|j                  d      }dD ci c]  }||v r||j                  |       }	}d|v r$|j                  d      }
|
t	        |
|      |_        |j
                  }|Bd|	v r|	d   
|	d   |_        d|	v r|	d   
|	d   |_        d	|	v r
|	d	   |_        d
|	v r
|	d
   |_	        |j                         D ]d  \  }}t        |||       |dv rd}|dk(  s||k7  s%t        ||||       |t        j                  t        j                  hv sWd |_        d |_        f |j%                          |r8|j                  t        j                  t        j                  hvrt'        ||       |j)                          t        | ||      S c c}w )NrN   FT)exclude_unset)r3   r2   r5   r6   r!   r3   r2   r5   r6   >   rG   rE   rF   rD   r   )r=   )rK   r   
model_dumppopr)   r(   r-   r.   r/   r0   itemssetattrrB   r   	cancelledno_showassigned_table_idassigned_combination_idr   r   rJ   )r?   r*   r   r   r;   previous_statusneeds_reassignmentpayload_datafieldcustomer_updatesr!   r(   values                r   update_reservationrm      s   (hOK!((O%%D%9L ]L  	|&&  $"&&}5"#/R#@K ##H..3CO3T3`,_=HM//4DEU4V4b-.>?HN//-.>?HN//-.>?HN$**, ;uUE*TT!%H/!9!+ub_U*446G6O6OPP04-6:3; HHJk009J9T9TVgVoVo8pp#K4IIK!."xHHMs   F)c                   t        | ||      }|j                  |j                  j                  |j                  j                         |j                  j                  d      d}t        |j                  t        t              j                  t        j                  |j                  k(                    }|D ]  }d |_        d|_        i |_         |j!                  |       |j#                          |S )NrN   z%H:%M)r@   r3   rD   rE   rc   )rK   r@   r(   r-   rD   	isoformatrE   strftimerY   rZ   r   r	   r1   r?   r   draftdeleterJ   )r?   r   r   r;   snapshotlinked_sessionssessions          r   delete_reservationrv      s    (hOKnn$--22'88BBD!,,55g>	H 


601778N8]8]alaoao8opqO # !%$
 IIkIIKOr    c                     | j                   | j                   j                  S | j                  | j                  j                  S y r   )rQ   r-   rR   )r;   s    r   assignment_labelrx      sA    !!-))...''3//444r    c           	         t        |j                  t        t        j                        j                  t        j                  | k(                    }|st        | |      }|j                  g}t        |j                  t        t              j                  t        j                  j                  |                        }|D ci c]  }|j                  | c}S c c}w r   )rY   rZ   r   r   r@   r1   r   r   r   room_idin_)r   r   room_idsr   tablestables         r   room_tables_mapr      s    BJJvdgg44T]]h5NOPQH"-GG9"**VE]001B1B81LMNOF)/0EHHeO000s   Canchortargetc           
         | j                   | j                  dz  z   }| j                  | j                  dz  z   }|j                   |j                  dz  z   }|j                  |j                  dz  z   }||z
  }||z
  }t	        |      t	        |      k\  rE|dkD  rdnd}|dkD  rdnd}	t        dt	        |      | j                  |j                  z   dz  z
        }
nD|dkD  rdnd}|dkD  rd	nd
}	t        dt	        |      | j                  |j                  z   dz  z
        }
t        |
t        z  d      }ddddd}ddddd}|
dkD  rd| dnd}d|j                   d||    d||	    d| j                   d| 
S )N   r   leftrightright side ofleft side ofupdownbelowabovezverso sinistrazverso destrazverso l'altozverso il basso)r   r   r   r   zlato destro dizlato sinistro disottosopra)r   r   r   r   z Riduci di circa z m.r,   zSposta il tavolo  z fino a portarlo sul z tavolo .)	xwidthyheightabsmaxroundr   r-   )r   r   anchor_center_xanchor_center_ytarget_center_xtarget_center_ydelta_xdelta_ymove_direction
final_sidecurrent_gap
gap_metersdirection_labelsside_labelsgap_texts                  r   _axis_instructionr      s   hh&,,"23Ohh&--!"34Ohh&,,"23Ohh&--!"34O/G/G
7|s7|##*Q;G(/!_
!S\fllV\\.IQ-NOP!(1& '!W
!S\fmmfmm.Kq-PQR{%;;Q?J  	 **	K 7BAo":,c22Hv{{m1-=n-M,NNcdopzd{c|  }E  FL  FQ  FQ  ER  RS  T\  S]  ^  ^r    c                 \   | j                   dd g fS t        | j                  |      }| j                   j                  D cg c]  }||v r||    }}|s,d| j                   j                   d| j
                   d}d|g fS t        |d       }|d   }d	j                  d
 |D              }d|j                   dg}	|}
|dd  D ]  }|	j                  t        |
|             |}
! |	j                  d| j
                   d       d| d| j                   d| j
                   d}d||	fS c c}w )NFzPrepara la combinazione z per z	 coperti.Tc                 H    | j                   | j                  | j                  fS r   )r   r   r-   )r~   s    r   <lambda>z$build_service_plan.<locals>.<lambda>  s    RWR\R\?] r    )keyr   z, c              3   4   K   | ]  }|j                     y wr   )r-   ).0r~   s     r   	<genexpr>z%build_service_plan.<locals>.<genexpr>  s     C5EJJCs   zLascia il tavolo z come posizione di riferimento.   z4Dopo l'unione, verifica che l'assetto finale ospiti z1 coperti senza bloccare il passaggio di servizio.zUnisci i tavoli z per la prenotazione z (z
 coperti).)rR   r   r   	table_idsr-   rG   sortedjoinappendr   r@   )r;   r   tables_by_idtable_idinvolved_tablessummaryordered_tablesr   table_namesstepsprevious_tabler~   s               r   build_service_planr     s}   ''/dB";#7#7<L $88BB|# 	XO 
 ,[-M-M-R-R,SSXYdYkYkXlluvWb  O1]^NAF))CNCCK -LMNEN# &~u=> 
LL
>{?Q?Q>R  SD  	E !-B;>>BRRTU`UgUgThhrsG%+s    D)c                 x    t        j                  |       }t        | |      \  }}}|j                  |||d      S )N)requires_table_joinservice_summaryservice_steps)update)r   model_validater   
model_copy)r;   r   r*   r   r   r   s         r   serialize_reservationr   "  sM    ,,[9G:L[Z\:]7-#6.*
   r    r   )NNN)7datetimer   fastapir   r   
sqlalchemyr   sqlalchemy.ormr   r   app.models.bookingr	   app.models.customerr
   app.models.reservationr   r   r   app.models.roomr   app.models.tabler   app.models.venuer   app.schemas.reservationr   r   r   app.services.assignmentr   app.services.layout_unitsr   app.services.seed_servicer   intr   r)   r:   rB   rM   rK   rY   r\   rm   dictstrobjectrv   rx   r   r   tupleboolr   r    r    r   <module>r      s{    )  . 5 ( [ [   " " Y Y ? < ;s  D c w 8 %6 G  8 ,0	! 	 "D(	
 
6 1 6w 6; 66 X\ 3 G #PT* `k * %).2	++Tk+ %t++ Dj	+
 
++2 pt ,Is ,I5F ,IG ,Ibehlbl ,I  yD ,I^ TX s  cDj \`adflal\m ,+ #* 1c 1w 14U
3C 1^e ^U ^s ^D K  W  tSSWZY]^aYbGbAc  :	{ 	 	O 	r    