Ë
    ×4—j-  ã                  ó,  — d Z ddl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 ddlmZmZ d	Zd
Z ed¬«       G d„ d«      «       Zdd„Zdd„Zdd„Zdddddœ	 	 	 	 	 	 	 	 	 dd„Zdddœ	 	 	 	 	 d d„Zddœd!d„Zddœd"d„Zddœ	 	 	 	 	 	 	 	 	 d#d„Zy)$u'  Nutzungsverhaeltnisse â€“ die einzige Stelle, an der Miet- und
Eigentumsverhaeltnisse zusammengefuehrt werden.

Fachliche Vorgabe (xin, HANDOVER_vportal_nutzungsverhaeltnisse.md):

    Im Portal gibt es keine Eigentuemer und keine Mieter, sondern
    ausschliesslich NUTZER. Wer Nutzer ist, ergibt sich aus der
    Nutzungsperiode. Der Eigentuemer bekommt keine Sonderrolle.

Gespeichert wird analog zu xin in zwei Tabellen (``ReuMietV`` /
``ReuEigentuemer``), gelesen wird ausschliesslich ueber dieses Modul. Jede
Zugriffspruefung, jede Liste und jede Ueberlappungspruefung geht hier durch â€“
sonst laufen die Regeln fuer Mieter und Eigentuemer auseinander.

Sichtbarkeitsregel: unveraendert wie bisher fuer Mietvertraege, jetzt auch
fuer Eigentumsverhaeltnisse. Ein Verhaeltnis zaehlt, wenn es am Stichtag
laeuft:

    GueltigVon <= heute  UND  (GueltigBis IS NULL ODER GueltigBis >= heute)

Die 24-Monats-Regel aus Arbeitspaket C ist hier bewusst NICHT enthalten. Sie
wuerde beendete Verhaeltnisse wieder sichtbar machen und gehoert in einen
eigenen Schritt.
é    )Úannotations)Ú	dataclass)Údate)ÚOptionalÚSequence)ÚQ)Útimezone)ÚReuEigentuemerÚReuMietVÚmieterÚeigentuemerT)Úfrozenc                  ó„   — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   ded
<   edd„«       Zedd„«       Zddd„Zdd„Z	y)ÚNutzungsverhaeltniszEEin Verhaeltnis Person <-> Einheit, unabhaengig von der Quelltabelle.ÚstrÚartÚintÚreuidÚpersonen_idúOptional[date]Úgueltig_vonÚgueltig_bisÚquell_idc                ó8   — | j                   › d| j                  › �S )z3Stabiler Schluessel fuer URLs und Dropdown-Auswahl.ú:)r   r   ©Úselfs    ú</var/www/html/vportal/core/services/nutzungsverhaeltnisse.pyÚ
schluesselzNutzungsverhaeltnis.schluessel3   s   € ð —(‘(�˜1˜TŸ]™]˜OÐ,Ð,ó    c                ó(   — | j                   t        k(  S ©N)r   ÚART_EIGENTUEMERr   s    r   Úist_eigentuemerz#Nutzungsverhaeltnis.ist_eigentuemer8   s   € à�x‰xœ?Ñ*Ð*r    Nc                óÀ   — |xs" t        j                  «       j                  «       }| j                  r| j                  |kD  ry| j                  r| j                  |k  ryy)z#Laeuft das Verhaeltnis am Stichtag?FT)r	   Únowr   r   r   )r   ÚstichtagÚtags      r   Ú	ist_aktivzNutzungsverhaeltnis.ist_aktiv<   sP   € àÒ/œ(Ÿ,™,›.×-Ñ-Ó/ˆØ×Ò × 0Ñ 0°3Ò 6ØØ×Ò × 0Ñ 0°3Ò 6ØØr    c                ó|   — |�| j                   �| j                   |k  ry|�| j                  �| j                  |kD  ryy)z~Schneidet sich dieses Verhaeltnis mit dem Zeitraum [von, bis]?

        Offene Enden (``None``) gelten als unendlich.
        FT)r   r   )r   ÚvonÚbiss      r   Ú
ueberlapptzNutzungsverhaeltnis.ueberlapptE   sI   € ð
 ˆ?˜t×/Ñ/Ð;À×@PÑ@PÐSVÒ@VØØˆ?˜t×/Ñ/Ð;À×@PÑ@PÐSVÒ@VØØr    )Úreturnr   )r.   Úboolr"   )r'   r   r.   r/   )r+   r   r,   r   r.   r/   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__Ú__annotations__Úpropertyr   r$   r)   r-   © r    r   r   r   (   sV   … áOà	ƒHØƒJØÓØÓØÓØƒMàò-ó ð-ð ò+ó ð+ôô	r    r   c                ó�   — t        t        | j                  | j                  | j                  | j
                  | j                  ¬«      S ©N)r   r   r   r   r   r   )r   Ú
ART_MIETERÚREUID_idÚMieterIDÚContractValidFromÚContractValidUntilÚMietVID)Úmvs    r   Ú
_aus_mietvr@   U   s9   € ÜÜØ�k‰kØ—K‘KØ×(Ñ(Ø×)Ñ)Ø—‘ôð r    c                ó�   — t        t        | j                  | j                  | j                  | j
                  | j                  ¬«      S r8   )r   r#   r:   ÚEigentuemerIDÚ	ValidFromÚ
ValidUntilÚ
EigentumID)Úets    r   Ú_aus_eigentumrG   `   s7   € ÜÜØ�k‰kØ×$Ñ$Ø—L‘LØ—M‘MØ—‘ôð r    c                ó‚   — | j                   | j                  xs t        j                  | j                  | j
                  fS r"   )r   r   r   Úminr   r   )Únvs    r   Ú_sortierschluesselrK   k   s*   € à�H‰H�b—n‘nÒ0¬¯©°"·&±&¸"¿+¹+ÐFÐFr    N)Úpersonen_idsÚreuidsÚ
nur_aktiver'   c                ój  — | �t        | «      dk(  rg S |xs" t        j                  «       j                  «       }t        j
                  j                  «       }t        j
                  j                  «       }| �$|j                  | ¬«      }|j                  | ¬«      }|�$|j                  |¬«      }|j                  |¬«      }|rp|j                  |¬«      j                  t        d¬«      t        |¬«      z  «      }|j                  |¬	«      j                  t        d¬
«      t        |¬«      z  «      }|D �cg c]  }t        |«      ‘Œ }}||D �	cg c]  }	t        |	«      ‘Œ c}	z  }|D �
cg c]  }
|
j                  �|
j                  �|
‘Œ }}
|j                  t        ¬«       |S c c}w c c}	w c c}
w )zÉVereinigt Miet- und Eigentumsverhaeltnisse zu einer Liste.

    ``personen_ids=None`` bedeutet "alle Personen" (Admin-Sicht),
    ``personen_ids=[]`` bedeutet "keine" und liefert eine leere Liste.
    r   )ÚMieterID__in)ÚEigentuemerID__in)Ú	REUID__in)ÚContractValidFrom__lteT)ÚContractValidUntil__isnull)ÚContractValidUntil__gte)ÚValidFrom__lte)ÚValidUntil__isnull)ÚValidUntil__gte)Úkey)Úlenr	   r&   r   r   ÚobjectsÚallr
   Úfilterr   r@   rG   r   r   ÚsortrK   )rL   rM   rN   r'   r(   Úmietv_qsÚeigentum_qsr?   ÚverhaeltnisserF   rJ   s              r   Úlade_verhaeltnisserb   p   sœ  € ð Ð¤C¨Ó$5¸Ò$:Øˆ	à
Ò
+”h—l‘l“n×)Ñ)Ó+€Cä×Ñ×#Ñ#Ó%€HÜ ×(Ñ(×,Ñ,Ó.€KàÐØ—?‘?°�?Ó=ˆØ!×(Ñ(¸<Ð(ÓHˆàÐØ—?‘?¨V�?Ó4ˆØ!×(Ñ(°6Ð(Ó:ˆáØ—?‘?¸#�?Ó>×EÑEÜ¨Ô.´È3Ô1OÑOó
ˆð "×(Ñ(¸Ð(Ó<×CÑCÜ Ô&¬¸3Ô)?Ñ?ó
ˆð /7Ö7¨”Z •^Ð7€MÐ7Ø°+Ö>¨B”m BÕ'Ò>Ñ>€Mð #öØØ�>‰>Ð%¨"¯(©(Ð*>ò 	ð€Mð ð
 ×ÑÔ-ÐÔ.ØÐùò 8ùÚ>ùòs   Ä7F&ÅF+Å+!F0)rN   r'   c               óB   — t        | dd«      }|€g S t        |g||¬«      S )uE   Alle Verhaeltnisse dieses Nutzers â€“ als Mieter wie als Eigentuemer.Ú
PersonenIDN)rL   rN   r'   )Úgetattrrb   )ÚuserrN   r'   r   s       r   Úverhaeltnisse_fuer_userrg   ¡   s3   € ô ˜$ ¨dÓ3€KØÐØˆ	ÜØ!�]¨zÀHôð r    ©r'   c               óx   — i }t        | |¬«      D ]  }|j                  |j                  d«       Œ  t        |«      S )u;   Einheiten, die dieser Nutzer sehen darf â€“ ohne Duplikate.rh   N)rg   Ú
setdefaultr   Úlist)rf   r'   ÚgesehenrJ   s       r   Úreuids_fuer_userrm   °   s;   € à€GÜ% d°XÔ>ò +ˆØ×Ñ˜2Ÿ8™8 TÕ*ð+ä�‹=Ðr    c               óB   ‡— t        ˆfd„t        | |¬«      D «       «      S )Nc              3  óN   •K  — | ]  }|j                   t        ‰«      k(  –— Œ y ­wr"   )r   r   )Ú.0rJ   r   s     €r   ú	<genexpr>zhat_zugriff.<locals>.<genexpr>¹   s&   øè ø€ ò àð 	�‰”C˜“JÕñùs   ƒ"%rh   )Úanyrg   )rf   r   r'   s    ` r   Úhat_zugriffrs   ¸   s$   ø€ Üó ä)¨$¸ÔBôó ð r    )Úausserc               óÊ   — t        | gd¬«      }g }|D ]M  }|�%|j                  |j                  ft        |«      k(  rŒ*|j	                  ||«      sŒ=|j                  |«       ŒO |S )uš  Verhaeltnisse derselben Einheit, die sich mit [von, bis] schneiden.

    ``ausser=(art, quell_id)`` blendet den Datensatz aus, der gerade
    geschrieben wird â€“ sonst kollidiert jedes Update mit sich selbst.

    Geprueft wird gegen Nutzungsperioden und nicht gegen Mietvertraege: sonst
    bleibt im WEG-Fall der Eigentuemer-Nutzer unsichtbar und Ueberlappungen
    Eigentuemer <-> Mieter kaemen durch.
    F)rM   rN   )rb   r   r   Útupler-   Úappend)r   r+   r,   rt   Ú
kandidatenÚtrefferrJ   s          r   Úueberlappende_verhaeltnisserz   Ã   sh   € ô  $¨E¨7¸uÔE€JØ€GØò ˆØÐ 2§6¡6¨2¯;©;Ð"7¼5À»=Ò"HØØ�=‰=˜˜cÕ"Ø�N‰N˜2Õð	ð
 €Nr    )r?   r   r.   r   )rF   r
   r.   r   )rJ   r   )
rL   úOptional[Sequence[int]]rM   r{   rN   r/   r'   r   r.   úlist[Nutzungsverhaeltnis])rN   r/   r'   r   r.   r|   )r'   r   r.   z	list[int])r   r   r'   r   r.   r/   )
r   r   r+   r   r,   r   rt   zOptional[tuple]r.   r|   )r3   Ú
__future__r   Údataclassesr   Údatetimer   Útypingr   r   Údjango.db.modelsr   Údjango.utilsr	   Úapp_nutzer.modelsr
   r   r9   r#   r   r@   rG   rK   rb   rg   rm   rs   rz   r6   r    r   ú<module>r„      s  ðñõ0 #å !Ý ß %å Ý !ç 6à€
Ø€ñ �$Ô÷%ð %ó ð%óXóóGð -1Ø&*ØØ#ñ.à)ð.ð $ð.ð ð	.ð
 ð.ð ó.ðh Ø#ñ	ð ðð ð	ð
 óð :>õ ð AEõ ð  #ñØðà	ðð 
ðð
 ðð ôr    