
    1iz                     T   S SK rS SKrS SKrS SKJr  S SK	J
r  S SKrS SKJr  S SKrS SKJr  SSSSSS	S
SS.rSrSrSr/ SQr/ SQrS\R0                  l        \\R0                  l        SSSSSSSSSSSSS.rS rS!rS"r\R>                  " S#S$9S%\ 4S& j5       r!S%\ S'\ 4S( jr"S) r#S* r$S+\RJ                  S'\RJ                  4S, jr&S+\RJ                  S'\RJ                  4S- jr'S+\RJ                  S.\RJ                  S'\RJ                  4S/ jr(S0\RJ                  S'\RJ                  4S1 jr)S2 r*g)3    N)MarkerCluster)	FILE_PATHz#8B4513z#FD6A02z#FFFFFFz#2F4F4Fz#F5F5DCz#000000z#C19A6Bz#8B0000)browngoldwhite	darkslatebeigeblacklight_browndark_redzPlayfair Display, serifzLato, sans-serifzMontserrat, sans-serif)z#eff8ffz#dff0ffz#b8e3ffz#78cdffz#38b6ffz#069af1z#007acez#0061a7z#02528az#084572z#062b4b)z#e6194bz#3cb44bz#ffe119z#4363d8z#f58231z#911eb4z#46f0f0z#f032e6z#bcf60cz#fabebez#008080z#e6beffz#9a6324z#fffac8z#800000z#aaffc3z#808000z#ffd8b1z#000075z#808080plotly_darkEneFebMarAbrMayJunJulAgoSepOctNovDic)                        	   
         Vertical
HorizontalLoteF)show_spinnerpathc                 H   [         R                  " U 5      n[         R                  " U[        5      n[         R                  " U[        5      n[         R                  " U[
        5      nX#U4 H0  nSUR                  ;   d  M  [         R                  " US   SS9US'   M2     X#U4$ )zs
Carga las hojas Vertical, Horizontal y Lote desde el archivo de BD
y asegura que Fecha_inicio_venta sea datetime.
Fecha_inicio_ventacoerceerrors)pd	ExcelFile
read_excelSHEET_VERTICALSHEET_HORIZONTAL
SHEET_LOTEcolumnsto_datetime)r*   xlsvertical
horizontallotedfs         PC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\Proyectos\REM\Oferta.pyload_oferta_catalogor>   =   s     ,,t
C}}S.1Hs$45J==j)DT*2::-')~~'((B#$ + %%    returnc                 &   [         R                  R                  U 5      nUR                  S5      S   nSU;   a  UR                  S5      S   nUR	                  SS5      R                  5       nUR                  5       S:X  a  gUR                  5       $ )	u`   
Extrae el nombre de la ciudad del archivo BD_XXXX.xlsm.
Ejemplo: BD_Mazatlan.xlsm -> Mazatlán
.r   BD_r   _ mazatlanu	   Mazatlán)osr*   basenamesplitreplacestriplowertitle)r*   basenombres      r=   get_ciudad_from_file_pathrP   P   s~    
 77D!DZZ_QFe$Q'^^C%++-F ||~# <<>r?   c                 F   [        [        5      u  pEnSUS'   SUS'   SUS'   / SQnXG Vs/ s H  oUR                  ;   d  M  UPM     sn   nXW Vs/ s H  oUR                  ;   d  M  UPM     sn   nXg Vs/ s H  oUR                  ;   d  M  UPM     sn   n[        R                  " XEU/SS9n	U c  [        R
                  " / SQS	9$ Ub  U	S
   U:  U	S
   U :*  -  n
OU	S
   U :H  n
X   n	U(       a  XS   R                  U5         n	U(       a  XS   R                  U5         n	U	R                  S/S9R                  / SQS9R                  5       n	U	R                  SSSSS.S	9nU/ SQ   R                  SS/S9nUS   R                  S 5      US'   U$ s  snf s  snf s  snf )a  
Devuelve un DataFrame con los desarrollos que ENTRAN en el periodo seleccionado,
comparando Fecha_inicio_venta contra periodo_prev y periodo_sel.

Regla:
- Si hay periodo_prev: Fecha_inicio_venta en (periodo_prev, periodo_sel]
- Si NO hay periodo_prev: Fecha_inicio_venta == periodo_sel

Todo respeta:
- tipo_filter (Vertical / Horizontal / Lote)
- proyectos_seleccionados (no mostrar proyectos excluidos)
r&   Tipor'   r(   )Nombre_desarrolloZonar,   rR   Tignore_index
DesarrollorR   rT   r6   r,   rS   subsetrS   rR   rT   rX   rT   Fecha inicio venta)rS   rR   rT   r,   )rX   rR   rT   r]   byc                 F    [         U R                      SU R                   3$ N-SPANISH_MONTH_ABBRmonthyearxs    r=   <lambda>(get_desarrollos_nuevos.<locals>.<lambda>       '01166(;r?   )r>   r   r6   r0   concat	DataFrameisindropnadrop_duplicatescopyrenamesort_valuesapplyperiodo_selperiodo_prevtipo_filterproyectos_seleccionadosr9   r:   r;   	cols_basecdf_all
mask_fechadf_finals               r=   get_desarrollos_nuevosr   e   s    $ "6i!@H$ "HV%JvDL LIIGIqh6F6F1FIGHH	M	1*:L:L5LQ	MNJI;Iqdll):I;<DYYd3$GF ||$BCC ()L8*+{:< 	 01[@
F v++K8923889PQR 	123	 E	F	  }}!-"6	
  H KLXXL! Y H
 &..B%C%I%I;&H!" Oo HM;s#   FFF'F6FFc                    [        [        5      u  pEnSUS'   SUS'   SUS'   / SQnXG Vs/ s H  oUR                  ;   d  M  UPM     sn   nXW Vs/ s H  oUR                  ;   d  M  UPM     sn   nXg Vs/ s H  oUR                  ;   d  M  UPM     sn   n[        R                  " XEU/SS9n	SU	R                  ;   a  [        R
                  " U	S   S	S
9U	S'   U c  [        R                  " / SQS9$ Ub  U	S   U:  U	S   U :*  -  n
OU	S   U :H  n
X   n	U(       a  XS   R                  U5         n	U(       a  XS   R                  U5         n	U	R                  S/S9R                  / SQS9R                  5       n	U	R                  SSSSS.S9nU/ SQ   R                  SS/S9nUS   R                  S 5      US'   U$ s  snf s  snf s  snf )ug  
Devuelve los desarrollos que SALEN en el periodo seleccionado.
Se basa en la columna Fecha_fin_ventas en las hojas Vertical, Horizontal y Lote.

Regla:
- Si hay periodo_prev → Fecha_fin_ventas en (periodo_prev, periodo_sel]
- Si NO hay periodo_prev → Fecha_fin_ventas == periodo_sel

Respeta los filtros globales:
- tipo_filter
- proyectos_seleccionados
r&   rR   r'   r(   )rS   rT   Fecha_fin_ventasrR   TrU   r   r-   r.   rW   rY   rS   rZ   r\   rX   rT   Fecha fin ventas)rS   rR   rT   r   )rX   rR   rT   r   r^   c                 F    [         U R                      SU R                   3$ ra   rc   rg   s    r=   ri   *get_desarrollos_vendidos.<locals>.<lambda>  rk   r?   )r>   r   r6   r0   rl   r7   rm   rn   ro   rp   rq   rr   rs   rt   ru   s               r=   get_desarrollos_vendidosr      s+   & "6i!@H$ "HV%JvDL JIIGIqh6F6F1FIGHH	M	1*:L:L5LQ	MNJI;Iqdll):I;<DYYd3$GF V^^+%'^^%&x&
!" ||$BCC&',6&';68 	
 ./;>
F
 v++K8923889PQR 	123&KLtv  }}!- 2	
  H IJVVL! W H $,,>#?#E#E;$H  O HM;s#   F?F?G'G6G	G	ventasc                 l   U R                  5       n[        R                  " UR                  SS5      SS9n[        R                  " UR                  SS5      SS9nUR	                  S[
        R                  5      n[
        R                  " UR                  5       X#-  [
        R                  5      US'   U$ )z
Devuelve el mismo DataFrame de ventas pero con una nueva columna '% vendido',
calculada como Ventas_acumuladas / Numero_de_viviendas_planeadas.
Ventas_acumuladasr   r-   r.   Numero_de_viviendas_planeadas	% vendido)	rq   r0   
to_numericgetrJ   npnanwherenotna)r   r<   numdenoms       r=   add_porcentaje_vendidor     s    
 
B --2A6x
HCMM"&&!@!DXVE MM!RVV$Ehh
B{O Ir?   c                     SU R                   ;  a  [        R                  " / SQS9$ U R                  5       nXDS   U:H     n[        R                  " US   SS9R                  S5      US'   US   S:H  nXE   nU(       a  XDS	   R                  U5         nU(       a  XDS
   R                  U5         nUR                  (       a  [        R                  " / SQS9$ U/ SQ   R                  5       R                  SSS.S9R                  SS/5      nU$ )a&  
Devuelve los desarrollos detenidos en el periodo seleccionado,
usando la columna Ventas_detenidas de la hoja Ventas.

Regla:
- Solo se consideran las filas con Fecha == periodo_sel
- Ventas_detenidas debe ser VERDADERO (texto) o True (booleano)
- Respeta tipo_filter y proyectos_seleccionados
Ventas_detenidasrW   rY   Fechar-   r.   r   r   Tipo_proyectorS   )rS   r   rT   rX   rR   rS   r   )r6   r0   rm   rq   r   fillnarn   emptyrp   rr   rs   )r   rv   rx   ry   r<   mask_detr~   s          r=   get_proyectos_detenidosr   -  s     /||$BCC	B 
wK;&	'B  ]]2.@+A(SZZ[\]B $%*H	B ?#((56&',,-DEF 
xx||$BCC 	9:			%1!' 
 

 
fl+	,  Or?   preciosc                 D  ^ U R                  5       nXfS   U:H     R                  5       nU(       a  XfS   R                  U5         nU(       a  XfS   R                  U5         nUR                  (       a  [        R                  " / SQS9$ [        UUUUS9n[        U UUUS9nUR                  (       d  [        US   R                  5       5      O	[        5       mUR                  (       d  [        US   R                  5       5      O	[        5       n	XfS   R                  U	5      )    R                  5       nUR                  (       a  [        R                  " / SQS9$ US   R                  U4S	 j5      US
'   S H-  n
XR                  ;   d  M  [        R                  " Xj   SS9Xj'   M/     Ub7  UR                  UR                  -
  S-  UR                  UR                  -
  -   nOSnUb  US::  a  SnUS   U-  US'   US   R                  5       nUR                  5       nXS   U:H     R                  5       nXS   R                  U5         nU(       a  XS   R                  U5         nSUR                  ;   a  [        R                  " US   SS9US'   SUR                  ;   a  [        R                  " US   SS9US'   XS   R                  5       US   S:  -     nUR                  (       dC  SUR                  ;   a3  UR                  SS/SS9S   R!                  5       R#                  SS0S9nO[        R                  " / SQS9nUR%                  USS/SS9nU/ SQ   R'                  5       R#                  SSS.S9R)                  SS/5      nUS   US   -  US '   U$ )!u,  
Devuelve los proyectos DISPONIBLES o VENDIDOS en el periodo seleccionado,
excluyendo únicamente los detenidos.

Estatus:
- "Vendido"      → aparece en get_desarrollos_vendidos()
- "Disponible"   → no vendido y no detenido

Además calcula:
- ventas_ulti_mes = Ventas_periodo / meses_transcurridos
- M2_promedio     = promedio de M2 de sus prototipos (en hoja Precios) en el periodo base,
                    considerando solo filas con Precio > 0.
- % vendido       = % de ventas acumuladas sobre viviendas planeadas en el periodo base seleccionado.
r   r   rS   )
rX   rR   rT   Estatusr   Ventas_periodoventas_ulti_mesM2_promedioInventario_disponibler   rY   rv   rw   rx   ry   r   rv   rx   ry   rX   c                    > U T;   a  S$ S$ )NVendido
Disponible )rh   vendidos_sets    r=   ri   +get_proyectos_disponibles.<locals>.<lambda>  s    qL0)BlBr?   r   )r   r   r   r   r-   r.   r%   r   r   r   r   PrecioM2F)as_indexr   )rS   r   r   left)onhow)
rS   r   rT   r   r   r   r   r   r   r   rR   r   r   r   r   )rq   rn   r   r0   rm   r   r   setuniquert   r6   r   rf   re   r   groupbymeanrr   mergerp   rs   )r   r   rv   rw   rx   ry   r<   df_vendidosdf_detenidosdetenidos_setcolmeses_transcurridosproyectos_validospredf_m2r~   r   s                   @r=   get_proyectos_disponiblesr   g  s   0 
B	wK;&	'	,	,	.B ?#((56&',,-DEF	xx||
 	
 +! 7	K + 7	L CNBSBS3{<0779:Y\Y^LDPDVDVC\299;<\_\aM
 
#$))-88	9	>	>	@B	xx||
 	
 *+11BByM **mmBGH=BG *//,2C2CCrI 2 22
  "&9Q&>/03FFB ./668
,,.C 'lk)
*
/
/
1C %&++,=>
?C o&++K89 3;;c(mHEHs{{MM#d)H=D	 8}""$X):;
<C 99,KK,o>KOPTUTVVT=1V2 	 I

 
1 
 
B 		
 
		%1!' 
 

 
fl+	,- 0 %%89HEd<eeH[Or?   df_disponiblesc                    / SQn/ nS nU H  nU" X5      nXUS   S:H     nXUS   R                  SS/5         nUS   R                  5       nUS   R                  SS	9n	US
   R                  5       n
US
   R                  SS	9nUS   R                  5       nU(       a  US:  a  X-  nO[        R
                  nUS   R                  5       nUR                  UUU	U
UUUUS.5        M     [        R                  " U5      nUR                  S5      R                  nSUR                  l        U/ SQ   nUR                   H  nUS;   a-  UR                  U   R                  S5      UR                  U'   M6  US;   a-  UR                  U   R                  S5      UR                  U'   Mi  US:X  d  Mq  UR                  U   S-  R                  S5      UR                  U'   M     UR                  5       $ )a8  
Construye la tabla de resumen por tipo (Vertical, Horizontal, Lote)
a partir de df_disponibles, que ya contiene:

- Desarrollo
- Tipo
- Zona
- Estatus (Disponible / Vendido)
- Ventas_acumuladas
- Ventas_periodo
- ventas_ulti_mes
- M2_promedio
- Inventario_disponible
- Numero_de_viviendas_planeadas
- % vendido
)r&   r'   r(   c                     X S   U:H     $ )NrR   r   )r<   tipos     r=   filtro_tipo5build_resumen_proyectos_vivienda.<locals>.filtro_tipo:  s    V*$%%r?   r   r   r   rX   r   r   )	min_countr   r   r   r   )rR   z
Proyectos:Inventario disponible:-   Absorción promedio último mes x desarrollo:!   Absorción mensual x último mes:Medida promedio:2   Estimación de venta de oferta disponible (meses):r   rR   Metricas)r   r   )r   r   r   r   d   )rn   nuniquesumr   r   r   appendr0   rm   	set_indexTindexnamelocroundreset_index)r   tiposfilasr   r   df_tdf_dispdf_disp_ven	proyectosinventario_dispabsorcion_prom_x_desabsorcion_mensualmedida_prommeses_estimpct_vendidodf_metricasmetricas                    r=    build_resumen_proyectos_viviendar   %  s$   $ /EE& >0I,67	?//y0IJK L)113	 ""9:>>>K  ++<=BBD ((9:>>>K m,113 !2Q!6)=K&&K k*//1'*9AU5F$/FQ(		
= X ,,u%K ''/11K (K @AK $$ 
 
 (3w'?'E'Ea'HKOOG$ 
 

 (3w'?'E'Ea'HKOOG$#(3(@3(F'M'Ma'PKOOG$ %  ""$$r?   c           	         [         R                  " S5        [         R                  " SUR                  S5       3U(       a  SUR                  S5       3OS-   5        [         R                  R                  S5        [         R                  R                  S5        [         R                  " S5      u  pgp[        UUUUS	9n
U   [         R                  " S
5        U
R                  (       a  [         R                  " S5        O[         R                  " U
SSS9  U(       a<  [         R                  " SUR                  S5       SUR                  S5       S35        O)[         R                  " SUR                  S5       S35        SSS5        [        UUUUS	9nU   [         R                  " S5        UR                  (       a  [         R                  " S5        O[         R                  " USSS9  U(       a<  [         R                  " SUR                  S5       SUR                  S5       S35        O)[         R                  " SUR                  S5       S35        SSS5        [        U 5      nXS   U:H     R                  5       nU(       a  XS   R                  U5         nU(       a  XS   R                  U5         nXS   S:  US   S:  -     nU   [         R                  " S5        UR                  (       a  [         R                  " S5        OU/ SQ   R!                  5       R#                  S S!S".S#9R%                  S!S /5      nUS   R'                  S$ 5      US'   [         R                  " USSS9  [         R                  " S%UR                  S5       S&35        SSS5        [)        U UUUS'9nU	   [         R                  " S(5        UR                  (       a  [         R                  " S)5        O?[         R                  " USSS9  [         R                  " S*UR                  S5       S+35        SSS5        [         R*                  " 5         [         R                  " S,5        [         R                  " S-5        [-        U UUUUUS.9nUR                  (       do  [/        [0        5      nS/UR3                  5        3n[         R                  " U5        [5        U5      n[         R                  " USSS9  [         R                  " S05        US   R'                  S1 5      US'   [         R                  " S25        UR                  (       a  [         R                  " S35        g[         R                  " USSS9  [         R                  " S4UR                  S5       S535        g! , (       d  f       GN%= f! , (       d  f       GN`= f! , (       d  f       GN,= f! , (       d  f       GN= f)6up   
Página de Oferta del dashboard REM.
TODO lo que se muestra respeta los filtros globales que vienen de REM.py.
OfertazPeriodo base: z%Y-%m-%dz | Periodo anterior:  u   **Contexto de esta sección**zwTodos los indicadores de Oferta respetan los filtros de tipo de proyecto y proyectos seleccionados en la barra lateral.r   r   zDesarrollos nuevos que entranz]No hay desarrollos nuevos que hayan iniciado ventas en este periodo con los filtros actuales.T)use_container_width
hide_indexzDEsta tabla muestra los desarrollos que **iniciaron ventas** entre **z** y **z**.zLEsta tabla muestra los desarrollos que **iniciaron ventas en el periodo** **Nz#Desarrollos vendidos (que salieron)zXNo hay desarrollos que hayan finalizado ventas en este periodo con los filtros actuales.zAEstos son los desarrollos que **finalizaron sus ventas** entre **zIEstos son los desarrollos que **finalizaron sus ventas en el periodo** **r   r   rS   r   gffffff?g      ?u!   Desarrollos maduros: que saldránuX   No hay desarrollos con más del 95% vendido en el periodo base con los filtros actuales.)rS   r   rT   r   rX   rR   r   rY   c                 
    U S $ Nz.1%r   rg   s    r=   ri   oferta_page.<locals>.<lambda>!  s
    QsG*r?   z\Estos son los desarrollos que tienen un **porcentaje vendido mayor al 95%** en el periodo **uT   **. Son proyectos que están por agotar su inventario y pronto saldrán del mercado.r   zDesarrollos detenidoszWNo hay desarrollos marcados como detenidos en el periodo base con los filtros actuales.u@   Proyectos cuya comercialización está detenida en el periodo **z**zDetalle de la ofertau   A continuación puedes ver análisis más específicos de la oferta, complementando el resumen rápido de entradas, salidas, maduros y detenidos.)r   r   rv   rw   rx   ry   zPROYECTOS DE VIVIENDA EN u   Esta tabla resume, por tipo de proyecto, cuántos desarrollos hay, qué inventario está disponible, cómo ha sido la absorción reciente y cuántos meses, al ritmo actual, tomaría vender la oferta disponible.c                 
    U S $ r   r   rg   s    r=   ri   r     s
    3jr?   z#Proyectos disponibles en el periodozTNo se encontraron proyectos disponibles en el periodo base con los filtros actuales.zMEstos son los proyectos que **siguen activos y disponibles** en el periodo **uP   **, después de excluir los que ya terminaron ventas y los que están detenidos.)strM   captionstrftimesidebarmarkdownr6   r   	subheaderr   info	dataframer   r   rq   rn   rp   rr   rs   rt   r   dividerr   rP   r   upperr   )r   r   rv   rw   rx   ry   c1c2c3c4	df_nuevosr   ventas_con_pct
df_madurosdf_display_madurosr   r   ciudadtitulo_resumen
df_resumens                       r=   oferta_pager    s    HHXJJ
--j9:;JV"<#8#8#D"EF\^	`
 JJ78JJ	7 ZZ]NBB
 '! 7	I 

45??GG,
 LL$( %..z:;7;CWCWXbCcBddgi
 $--j9:#?- 
> +! 7	K 

:;GG,
 LL$( %..z:;7;CWCWXbCcBddgi
 $--j9:#?- 
@ ,F3N  w 7; FGLLNJ ? ; @ @ MN
+> ? D DE\ ]^
 4<KAXY\A\]^J 

89GG, UV "-9)/   fl34  /A.M.S.S$/{+
 LL"$( GG##.#7#7
#C"D EccC 
V + 7	L 

,-GG,
 LL$( GG##.#7#7
#C"DBH 
& JJLLL'(JJ	W /! 7N *954V\\^4DE
^$5nE

 $	
 	W	
 #1"="C"C(#N; LL67
(	

 	 $	
 	%%j12 3??	
{ 
L 
` 
d 
s4   CV!CV3CW6A>W!
V03
W
W
W&)+	streamlitr   pandasr0   numpyr   plotly.expressexpresspxplotly.graph_objectsgraph_objectsgofoliumfolium.pluginsr   rG   resumenr   COLORS
TITLE_FONT	BODY_FONTALT_FONTPICTON_BLUEBUMP_COLORSdefaultstemplatecolor_discrete_sequencerd   r3   r4   r5   
cache_datastrr>   rP   r   r   rm   r   r   r   r   r  r   r?   r=   <module>r     s       !  ( 	  	
 '
	#
 % &1 # 5U5U%U   
 E"&s & #&$C C *Rh[|2<< BLL ,7LL7
 \\7t{LL{\\{ \\{|a%R\\ a%bll a%LJ
r?   