
    }i%                     |   d dl 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mZ d dl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  eddg      Z G d de
      ZdededefdZdedededefdZdededefdZejA                  d       ee      fdefd       Z!ejA                  d      dd ee      fdee   dee   defd        Z"ejG                  d       ee      fd!edefd"       Z$ejK                  d#       ee      fd$edefd%       Z&ejA                  d&       ee      fdededefd'       Z'y)(    )	APIRouterDependsHTTPException)Session)OptionalList)	BaseModel)date	timedeltaN)get_db)DailySubscription)MassTemplate)TemplatePosition)Asimz
/api/dailyzJadwal Harian)prefixtagsc                   "    e Zd ZU eed<   eed<   y)SubscriptionCreateasim_idtemplate_idN)__name__
__module____qualname__int__annotations__     2/var/www/html/asim.com/backend/app/routes/daily.pyr   r      s    Lr   r   yearmonthreturnc                     t        | |d      }|j                         dk7  r#|t        d      z  }|j                         dk7  r#|S )z+Get tanggal Jumat pertama di bulan tersebut      )days)r
   weekdayr   )r   r    ds      r   get_first_fridayr(      sB    T5!A
))+
	YA ))+
Hr   subasim_maptemplate_mapc                    |j                  | j                        }|j                  | j                        }| j                  | j                  |r|j                  nd |r|j
                  nd |r|j                  nd | j                  |r|j                  nd |r|j                  nd |r|j                  nd |r|j                  nd| j                  t        | j                        dS )NF)idr   	asim_nameasim_no
asim_photor   template_nameday_of_weektimeis_first_friday	is_active
created_at)getr   r   r-   	full_nameno_asimphotonamer2   r3   r4   r5   strr6   )r)   r*   r+   asimtemplates        r   _build_sub_dictr?      s    <<$D0Hff;;'+T^^#'4<<T$(djjd*2/7x++T!)t7?833U]]#..) r   dbc                    |j                  t              j                  t        j                  | j                  k(        j                         }|j                  t              j                  t        j                  | j                  k(        j                         }|r| j                  |ini }|r| j                  |ini }t        | ||      S )uW   Single-item enrich — used after create. Uses individual queries (ok for single item).)	queryr   filterr-   r   firstr   r   r?   )r)   r@   r=   r>   r*   r+   s         r   enrich_subscriptionrE   -   s    88D>  CKK!78>>@Dxx%,,\__-OPVVXH&*T"H2:COOX.L3,77r   z
/templatesc                     | j                  t              j                  t        j                  dk(  t        j                  dk(        j                  t        j                  t        j                        j                         }|sg S |D cg c]  }|j                   }}| j                  t              j                  t        j                  j                  |            j                         }i }|D ].  }|j                  |j                  d      dz   ||j                  <   0 |D cg c]W  }|j                  |j                  |j                  |j                  |j                  |j                  |j                  d      dY c}S c c}w c c}w )u;   Get semua template harian — batch query TemplatePositionsdailyTr   r#   )r-   r;   r2   r3   r4   position_count)rB   r   rC   	mass_typer5   order_byr2   r3   allr-   r   r   in_r7   r;   r4   )r@   	templatesttemplate_idsall_positionsposition_count_mapps          r   get_daily_templatesrS   5   s\    &--')$& h|''):):;CCE 
 	 #,,)QADD)L,HH-.55$$((6	ce  ,>,B,B1==RS,TWX,X1==)  
 A $$FF==FF 00044QTT1=	
 
 
 -
s   
F'AFz/subscriptionsr   r   c                    |j                  t              j                  t        j                  dk(        }| r"|j                  t        j                  | k(        }|r"|j                  t        j
                  |k(        }|j                         }|sg S t        |D ch c]  }|j
                   c}      }t        |D ch c]  }|j                   c}      }|j                  t              j                  t        j                  j                  |            j                         D ci c]  }|j                  | }	}|j                  t              j                  t        j                  j                  |            j                         D 
ci c]  }
|
j                  |
 }}
|D cg c]  }t        ||	|       c}S c c}w c c}w c c}w c c}
w c c}w )NT)rB   r   rC   r5   r   r   rK   listr   r-   rL   r   r?   )r   r   r@   qsubssasim_idstmpl_idsar*   rN   r+   s               r   get_subscriptionsr\   U   sr   
"#**+<+F+F$+NOAHH&22kABHH&..'9:557D	 -1QYY-.HD1DqQ]]D12H!#$!6!6tww{{87L!M!Q!Q!ST!SAa!SHT%'XXl%;%B%B<??CVCVW_C`%a%e%e%gh%gADD!G%gLh@DE1OAx6EE .1ThEs   G>G)GG*Gdatac                    |j                  t              j                  t        j                  | j                  k(  t        j                  | j                  k(  t        j
                  dk(        j                         }|rt        dd      |j                  t              j                  t        j                  | j                  k(        j                         }|st        dd      |j                  t              j                  t        j                  | j                  k(        j                         }t        |      }|j                  t              j                  t        j                  | j                  k(  t        j
                  dk(        j                         }||k\  rt        dd| d      t        | j                  | j                  |j                  |j                  d	      }|j!                  |       	 |j#                          |j%                  |       t+        ||      S # t&        $ r |j)                          t        d
d      w xY w)NTi  zASIM sudah subscribe misa ini!status_codedetail  zTemplate tidak ditemukanzSlot penuh! Kapasitas z orang.)r   r   r2   	mass_timer5     z*Gagal menyimpan subscription jadwal harian)rB   r   rC   r   r   r5   rD   r   r   r-   r   rK   lencountr2   r3   addcommitrefresh	ExceptionrollbackrE   )r]   r@   existingr>   	positionsmax_capacitycurrent_countr)   s           r   create_subscriptionrp   h   s    xx)*11!!T\\1%%)9)99##t+ eg	 
 4TUU xx%,,\__@P@P-PQWWYH4NOO)*11$$(8(88	ce  y>LHH./66%%)9)99##t+ eg 
 $6L\NZa4bcc
$$((--C FF3Kb
		


3 sB''  b
4`aabs   >!H+ +'Iz/subscriptions/{sub_id}sub_idc                 F   |j                  t              j                  t        j                  | k(        j	                         }|st        dd      |j                  |       	 |j                          ddiS # t        $ r |j                          t        dd      w xY w)Nrb   zSubscription tidak ditemukanr_   rd   z*Gagal menghapus subscription jadwal harianmessagezBerhasil unsubscribe)
rB   r   rC   r-   rD   r   deleterh   rj   rk   )rq   r@   r)   s      r   unsubscriberu      s    
(($
%
,
,->-A-AV-K
L
R
R
TC4RSSIIcNb
		 -..  b
4`aabs   %A9 9'B z	/schedulec                    t        ||       }t        j                  ||       d   }|j                  t              j                  t        j                  dk(  t        j                  dk(        j                         }|j                  t              j                  t        j                  dk(        j                         }t        |D ch c]  }|j                   c}      }|rh|j                  t              j                  t        j                  j                  |            j                         D 	ci c]  }	|	j                  |	 c}	ni }
|D cg c]  }|j                   }}|rO|j                  t              j                  t        j                   j                  |            j                         ng }i }|D ].  }|j#                  |j                   d      dz   ||j                   <   0 i }|D ]  }|j                   |vrg ||j                   <   |
j#                  |j                        }||j                      j%                  |j                  |j                  |r|j&                  nd|r|j(                  nd|r|j*                  ndd        g }t-        d|dz         D ]  }t/        || |      }|j1                         }||k(  }|D ]  j2                  |k7  rj4                  r|s"j4                  s|r|dk(  rt7        fd|D              }|rL|j%                  t9        |      |j;                  d	      j                  j<                  j>                  |xr j4                  |j#                  j                  d      |j#                  j                  g       d
        
 |jA                  d        |S c c}w c c}	w c c}w )uH   Generate jadwal harian on-the-fly untuk bulan tertentu — batch queriesr#   rG   Tr   N)rq   r   r.   r/   r0   r$   c              3      K   | ]<  }|j                   d k(  xr' |j                  xr |j                  j                  k(   > yw)r$   N)r2   r4   r3   ).0rN   r>   s     r   	<genexpr>z%get_daily_schedule.<locals>.<genexpr>   sB      0& MMQ&X1+<+<X8==AXX&s   AAz%A)r
   day_namer   r1   r3   r4   rH   subscribersc                     | d   | d   fS )Nr
   r3   r   )xs    r   <lambda>z$get_daily_schedule.<locals>.<lambda>   s    qy!F)4r   )key)!r(   calendar
monthrangerB   r   rC   rI   r5   rK   r   rU   r   r   r-   rL   r   r   r7   appendr8   r9   r:   ranger
   r&   r2   r4   anyr<   strftimer;   r3   sort)r    r   r@   first_fridaydays_in_monthrM   subscriptionsr)   rY   r[   r*   rN   rO   rP   rQ   rR   sub_by_templater=   resultr'   current_dater2   is_first_friday_dayhas_first_friday_templater>   s                           @r   get_daily_scheduler      sa    $D%0L''e4Q7M &--')$& 
ce  HH./66##t+	ce 
 M:MSS[[M:;HX`$!6!6tww{{87L!M!Q!Q!ST!SAa!STfhH #,,)QADD)L,  HH-.55$$((6	ce  ,>,B,B1==RS,TWX,X1==)  O??/1/1OCOO,||CKK((//ff{{+/T'+t||(,$**$1
 		  F1ma'(D%+"**,+|; "H##{2''0C++0CWXHX,/ 0&0 -) -MML)(11$7'{{!) #6#S8;S;S"4"8"8a"H.228;;C	 	! " )B KK4K5M} ;T -s   O5OO)(fastapir   r   r   sqlalchemy.ormr   typingr   r   pydanticr	   datetimer
   r   r   app.databaser   app.models.daily_subscriptionr   app.models.mass_templater   app.models.template_positionr   app.models.asimr   routerr   r   r(   dictr?   rE   r7   rS   r\   postrp   rt   ru   r   r   r   r   <module>r      s   5 5 " !  $   ; 1 9  	,o->	? 3 s t * d $ SW $8. 8G 8 8 L&-fo G  > 37RVfmntfu F8C= F(3- F\c F F$ @G *(0 *(g *( *(X ()+26? 
/ 
/ 
/ *
/ K<CFO Oc O O' O Or   