- Created a pre-commit hook in .husky to run lint-staged. - Added .lintstagedrc.mjs to format frontend files with Prettier and apply Spotless to backend Java files. - Introduced .prettierignore to exclude specific directories from formatting.
174 lines
4.7 KiB
HTML
174 lines
4.7 KiB
HTML
<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>
|