
    !+i                     x   d Z ddlZddlmZmZ ddlmZmZmZ  ej                  e	      Z
ddddd	d
ddZg dZddg dddg ddddgdddg dddddgdddg dddddgdd d!d"d#gdd$d%g dd&d'g dd(dg dd)dg dd*d+g d,dd*d+g d,dd-Zg d.d/d0d1dd2d3d4g d5d1d2d6d/d7d4g d8d+dd9d:d4d;Z G d< d=      Zy)>zm
Hyper Forecast - Calendar Multipliers
Adjustments based on day of week, period of month, and special events
    N)datetimedate)DictTupleOptional333333?gq=
ףp?gffffff?      ?ffffff?g      ?g333333?)r                     ))r   r   g?)r   
   r
   )      r   )      ?)      皙?zAno Novog?)namemultcategory_boostNatalg333333?u   Véspera de Natalg?	presentesu   Véspera Ano Novog      ?u   Dia das Criançasg?infantil
brinquedoszDia dos Namorados (BR: 12/06)zDia dos Namoradosg      ?joiaszDia dos Paisgffffff?ferramentaseletronicosu   Proclamação Repúblicar   u   Independênciar   
TiradenteszDia do Trabalhou   Dia das Mães (aprox)g?)
cama_banhoroupaor   )z01-01z12-25z12-24z12-31z10-12z02-14z06-12z08-11z11-15z09-07z04-21z05-01z05-11z05-12)   r   r   g      @gffffff@g@g333333@)piscinaboiapraia
ventiladorbrinquedo_agua)months
categories)r         gffffff?)cobertormantar&   	aquecedor)r   r   r/   r0   g333333?)	papelariamochilaescolar)veraoinvernovolta_aulasc            
           e Zd ZdZddeeeef      fdZde	defdZ
dedefd	Z	 dde	d
ee   deeee   f   fdZ	 dde	d
ee   deeee   f   fdZ	 dde	d
ee   defdZde	defdZdede	fdZy)CalendarMultiplierszH
    Provides calendar-based adjustment multipliers for forecasting
    Ncustom_dow_patternc                 "    |xs t         | _        y)zV
        Initialize with optional custom day-of-week pattern from actual data
        N)DAY_OF_WEEK_MULTIPLIERSdow_pattern)selfr<   s     X/var/www/hypershopcomercio.com.br/hyper-ai/app/services/forecast/multipliers/calendar.py__init__zCalendarMultipliers.__init__^   s     .H1H    target_datereturnc                 Z    |j                         }| j                  j                  |d      S )z5
        Get multiplier based on day of week
        r	   )weekdayr?   get)r@   rD   dows      rA   get_day_of_week_multiplierz.CalendarMultipliers.get_day_of_week_multiplierd   s+     !!###C--rC   day_of_monthc                 D    t         D ]  \  }}}||cxk  r	|k  s|c S   y)zT
        Get multiplier based on period within month (payment cycle effect)
        r	   )PERIOD_OF_MONTH_RANGES)r@   rK   startendr   s        rA   get_period_of_month_multiplierz2CalendarMultipliers.get_period_of_month_multiplierk   s6     !7 	E3++ ,	 rC   categoryc                    |j                  d      }|t        v rZt        |   }|d   }|rC|j                         |j                  dg       D cg c]  }|j                          c}v r|dz  }||d   fS |j                  dk(  r[| j                  |      ry| j                  |j                        }||z
  j                  }d|cxk  rd	k  rn ydd
d	|z
  z  z   d| dfS yc c}w )zm
        Get multiplier for special events/holidays
        Returns (multiplier, event_name or None)
        z%m-%dr   r   g?r   r   )g      @zBlack Fridayr   r/   g?zSemana Black Friday (-zd)r	   N)	strftimeSPECIAL_EVENTSlowerrH   month_is_black_friday_get_black_fridayyeardays)	r@   rD   rQ   date_keyeventr   cbf_date
days_untils	            rA   get_event_multiplierz(CalendarMultipliers.get_event_multipliert   s    ''0~%"8,E=D HNN,EIIN^`bDc0dq0ddv&& "$$[1+,,[-=-=>G!K/55J:""  sa*n56:PQ[P\\^8___ 1es   Cc                     |sy|j                   }|j                         }t        j                         D ]4  \  }}||d   v s|d   j                         D ]  \  }}||v s||fc c S  6 y)z>
        Get seasonal multiplier for product category
        rS   r-   r.   )rW   rV   SEASONAL_PATTERNSitems)	r@   rD   rQ   rW   category_lowerseason_nameconfigcat_patternr   s	            rA   get_seasonal_multiplierz+CalendarMultipliers.get_seasonal_multiplier   s     !!!)#4#:#:#< 	1Kx(()/)=)C)C)E 1%K"n4#[001	1 rC   c                     | j                  |      }| j                  |j                        }| j                  ||      \  }}| j	                  ||      \  }}||z  |z  |z  }	|||||||	dS )z?
        Get all calendar-related multipliers combined
        )day_of_weekperiod_of_monthr]   
event_nameseasonalrf   combined)rJ   rP   dayra   ri   )
r@   rD   rQ   dow_multperiod_mult
event_multrm   season_multrf   ro   s
             rA   get_all_calendar_multipliersz0CalendarMultipliers.get_all_calendar_multipliers   s     22;?99+//J!%!:!:;!Q
J#'#?#?X#V [ k)J6D $*$#& 
 	
rC   c                     |j                   dk7  s|j                         dk7  ry| j                  |j                        }||k(  S )zCheck if date is Black Fridayr   r   F)rW   rG   rY   rZ   )r@   rD   bfs      rA   rX   z$CalendarMultipliers._is_black_friday   sF    "k&9&9&;q&@ ##K$4$45b  rC   rZ   c                     t        |dd      }|j                         dz
  dz  }|t        d      j                  |      z
  S )z&Get Black Friday date for a given yearr      r   r/   r   )r[   )r   rG   
__import__	timedelta)r@   rZ   nov_30days_since_fridays       rA   rY   z%CalendarMultipliers._get_black_friday   sH     dB##^^-1Q6
:.88>O8PPPrC   )N)__name__
__module____qualname____doc__r   r   intfloatrB   r   rJ   rP   strr   ra   ri   ru   boolrX   rY    rC   rA   r;   r;   Y   s   I8De4D+E I.d .u .3 5  #' 3- 
uhsm#	$	H #' 3- 
uhsm#	$	2 #'

 3-
 
	
4!D !T !Qc Qd QrC   r;   )r   loggingr   r   typingr   r   r   	getLoggerr~   loggerr>   rM   rU   rc   r;   r   rC   rA   <module>r      sg    # ( (			8	$    !$"EtrB)4K=Y)42N)4JXdKef5tWYZ)4KY`Kab$d}VcFde0$RTU&K"DBG'L .tOtu-tOtu#4 "
	 	
 
) >{Q {QrC   