feat: finalize lease documents and IRL revisions
This commit is contained in:
1 parent
f127c69a28
commit
1bf6a3449c
196 files changed
+20564
-666
No files matched your search
@@ -0,0 +1,157 @@
|
||||
<section
|
||||
class="revision-preview"
|
||||
aria-label="Prévision de révision annuelle du loyer"
|
||||
[attr.aria-busy]="pending()"
|
||||
>
|
||||
<header>
|
||||
<h3>Révision annuelle du loyer</h3>
|
||||
<p>
|
||||
Calculez le plafond applicable avant toute décision. Aucun nouveau loyer ne sera appliqué.
|
||||
</p>
|
||||
</header>
|
||||
|
||||
<form [formRoot]="requestForm" (submit)="prepare(); $event.preventDefault()">
|
||||
<fieldset [disabled]="pending()">
|
||||
<details class="advanced-options">
|
||||
<summary>Changer la série INSEE</summary>
|
||||
<label>
|
||||
<span>Nouvelle série officielle</span>
|
||||
<select class="series-override" [formField]="requestForm.seriesIdOverride">
|
||||
<option value="">Série prévue dans le bail</option>
|
||||
<option value="001515333">Métropole — 001515333</option>
|
||||
<option value="010760507">Corse — 010760507</option>
|
||||
<option value="010760509">Départements d’outre-mer (article 73) — 010760509</option>
|
||||
</select>
|
||||
</label>
|
||||
@if (requestModel().seriesIdOverride.trim()) {
|
||||
<label class="attestation">
|
||||
<input
|
||||
class="series-confirm"
|
||||
type="checkbox"
|
||||
[formField]="requestForm.seriesOverrideConfirmed"
|
||||
/>
|
||||
<span>Je confirme remplacer la série INSEE prévue par le bail.</span>
|
||||
</label>
|
||||
}
|
||||
</details>
|
||||
|
||||
@if (manualRequired()) {
|
||||
<div class="manual-indices">
|
||||
<h4>Indices IRL saisis manuellement</h4>
|
||||
<div class="field-grid">
|
||||
<label>
|
||||
<span>Indice précédent</span>
|
||||
<input
|
||||
class="previous-index"
|
||||
type="number"
|
||||
step="0.01"
|
||||
[formField]="requestForm.previousIndex"
|
||||
/>
|
||||
</label>
|
||||
<label>
|
||||
<span>Nouvel indice</span>
|
||||
<input
|
||||
class="new-index"
|
||||
type="number"
|
||||
step="0.01"
|
||||
[formField]="requestForm.newIndex"
|
||||
/>
|
||||
</label>
|
||||
</div>
|
||||
<label class="attestation">
|
||||
<input
|
||||
class="manual-confirm"
|
||||
type="checkbox"
|
||||
[formField]="requestForm.manualIndicesConfirmed"
|
||||
/>
|
||||
<span>J’atteste avoir vérifié ces deux indices IRL officiels.</span>
|
||||
</label>
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (validationError()) {
|
||||
<p class="operation-error" role="alert">{{ validationError() }}</p>
|
||||
}
|
||||
<button mat-flat-button type="submit" class="preview-submit" [disabled]="pending()">
|
||||
{{ pending() ? 'Calcul en cours…' : preview() ? 'Recalculer' : 'Préparer la révision' }}
|
||||
</button>
|
||||
</fieldset>
|
||||
</form>
|
||||
|
||||
@if (error()) {
|
||||
<div class="operation-error" role="alert">
|
||||
<p>{{ error() }}</p>
|
||||
@if (!manualRequired()) {
|
||||
<button mat-button type="button" class="retry-preview" (click)="prepare()">
|
||||
Réessayer
|
||||
</button>
|
||||
}
|
||||
</div>
|
||||
}
|
||||
|
||||
@if (preview(); as result) {
|
||||
<article class="preview-result">
|
||||
<h4>Simulation de révision</h4>
|
||||
<p class="source-label">Source : {{ sourceLabel(result.indexSource) }}</p>
|
||||
<dl>
|
||||
<div>
|
||||
<dt>Date annuelle</dt>
|
||||
<dd>{{ civilDate(result.annualRevisionDate) }}</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>Date limite de demande</dt>
|
||||
<dd>{{ civilDate(result.requestDeadline) }}</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>Série et référence</dt>
|
||||
<dd>
|
||||
{{ result.seriesId }} · T{{ result.referenceQuarter }} ·
|
||||
{{ result.previousIndexYear }} → {{ result.newIndexYear }}
|
||||
@if (result.seriesOverridden) {
|
||||
<span>Série remplacée après attestation.</span>
|
||||
}
|
||||
</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>Plafond du nouveau loyer</dt>
|
||||
<dd>{{ currency(result.rentCeiling) }}</dd>
|
||||
</div>
|
||||
<div>
|
||||
<dt>Plafond des charges</dt>
|
||||
<dd>
|
||||
{{ result.chargeCeiling === null ? 'Non applicable' : currency(result.chargeCeiling) }}
|
||||
</dd>
|
||||
</div>
|
||||
</dl>
|
||||
<p class="formula">
|
||||
{{ currency(result.previousRent) }} × {{ index(result.newIndex) }} ÷
|
||||
{{ index(result.previousIndex) }} = {{ currency(result.rentCeiling) }}
|
||||
</p>
|
||||
@if (result.chargeCeiling !== null) {
|
||||
<p class="formula charge-formula">
|
||||
{{ currency(result.previousCharges) }} × {{ index(result.newIndex) }} ÷
|
||||
{{ index(result.previousIndex) }} = {{ currency(result.chargeCeiling) }}
|
||||
</p>
|
||||
}
|
||||
@if (result.warnings.length) {
|
||||
<div class="preview-warnings" role="status">
|
||||
<strong>Avertissements</strong>
|
||||
<ul>
|
||||
@for (warning of result.warnings; track warning.code + ':' + warning.ruleVersion) {
|
||||
<li>
|
||||
{{ warningLabel(warning.code) }}
|
||||
<span>Version de règle : {{ warning.ruleVersion }}</span>
|
||||
</li>
|
||||
}
|
||||
</ul>
|
||||
</div>
|
||||
}
|
||||
</article>
|
||||
}
|
||||
|
||||
<app-rent-revision-proposals
|
||||
[leaseId]="leaseId()"
|
||||
[preview]="preview()"
|
||||
[previewRequest]="lastSuccessfulRequest()"
|
||||
/>
|
||||
</section>
|
||||
Reference in new issue
Block a user