|
@@ -68,33 +68,44 @@ export default function LeaseDetail() {
|
|
|
notes: ''
|
|
notes: ''
|
|
|
})
|
|
})
|
|
|
const [irlCurrent, setIrlCurrent] = useState({ value: null, loading: false, quarter: null, year: null })
|
|
const [irlCurrent, setIrlCurrent] = useState({ value: null, loading: false, quarter: null, year: null })
|
|
|
|
|
+ const [irlPrevious, setIrlPrevious] = useState({ value: null, loading: false, quarter: null, year: null })
|
|
|
|
|
|
|
|
// Retourne le trimestre (1-4) d'une date ISO
|
|
// Retourne le trimestre (1-4) d'une date ISO
|
|
|
const getQuarter = dateStr => Math.ceil((new Date(dateStr).getMonth() + 1) / 3)
|
|
const getQuarter = dateStr => Math.ceil((new Date(dateStr).getMonth() + 1) / 3)
|
|
|
|
|
|
|
|
- // Ouvre le modal révision et tente de récupérer l'IRL du trimestre de référence pour l'année en cours
|
|
|
|
|
|
|
+ // Ouvre le modal révision et récupère l'IRL du même trimestre pour l'année en cours et l'année précédente
|
|
|
const openRevisionModal = async () => {
|
|
const openRevisionModal = async () => {
|
|
|
setRevForm({ effective_date: now.toISOString().slice(0, 10), rent_amount: String(lease.rent_amount), charges_amount: String(lease.charges_amount), notes: '' })
|
|
setRevForm({ effective_date: now.toISOString().slice(0, 10), rent_amount: String(lease.rent_amount), charges_amount: String(lease.charges_amount), notes: '' })
|
|
|
setIrlCurrent({ value: null, loading: false, quarter: null, year: null })
|
|
setIrlCurrent({ value: null, loading: false, quarter: null, year: null })
|
|
|
|
|
+ setIrlPrevious({ value: null, loading: false, quarter: null, year: null })
|
|
|
|
|
|
|
|
if (lease.irl_reference_quarter) {
|
|
if (lease.irl_reference_quarter) {
|
|
|
const q = lease.irl_reference_quarter
|
|
const q = lease.irl_reference_quarter
|
|
|
const y = now.getFullYear()
|
|
const y = now.getFullYear()
|
|
|
|
|
+ const yPrev = y - 1
|
|
|
setIrlCurrent(s => ({ ...s, loading: true, quarter: q, year: y }))
|
|
setIrlCurrent(s => ({ ...s, loading: true, quarter: q, year: y }))
|
|
|
|
|
+ setIrlPrevious(s => ({ ...s, loading: true, quarter: q, year: yPrev }))
|
|
|
try {
|
|
try {
|
|
|
- const { data } = await api.get(`/irl?year=${y}&quarter=${q}`)
|
|
|
|
|
- setIrlCurrent({ value: data.value, loading: false, quarter: q, year: y })
|
|
|
|
|
- // Pré-calculer le loyer si IRL de référence connu
|
|
|
|
|
- if (data.value && lease.irl_reference_value) {
|
|
|
|
|
- const ratio = data.value / lease.irl_reference_value
|
|
|
|
|
|
|
+ const [curRes, prevRes] = await Promise.all([
|
|
|
|
|
+ api.get(`/irl?year=${y}&quarter=${q}`).catch(() => ({ data: {} })),
|
|
|
|
|
+ api.get(`/irl?year=${yPrev}&quarter=${q}`).catch(() => ({ data: {} })),
|
|
|
|
|
+ ])
|
|
|
|
|
+ const curVal = curRes.data?.value ?? null
|
|
|
|
|
+ const prevVal = prevRes.data?.value ?? null
|
|
|
|
|
+ setIrlCurrent({ value: curVal, loading: false, quarter: q, year: y })
|
|
|
|
|
+ setIrlPrevious({ value: prevVal, loading: false, quarter: q, year: yPrev })
|
|
|
|
|
+ // Pré-calculer le loyer : ratio = IRL année en cours / IRL année précédente (même trimestre)
|
|
|
|
|
+ if (curVal && prevVal) {
|
|
|
|
|
+ const ratio = curVal / prevVal
|
|
|
setRevForm(f => ({
|
|
setRevForm(f => ({
|
|
|
...f,
|
|
...f,
|
|
|
rent_amount: (lease.rent_amount * ratio).toFixed(2),
|
|
rent_amount: (lease.rent_amount * ratio).toFixed(2),
|
|
|
- notes: `Révision IRL T${q} ${y} — indice ${data.value} / ref ${lease.irl_reference_value}`
|
|
|
|
|
|
|
+ notes: `Révision IRL T${q} — indice ${curVal} (${y}) / ${prevVal} (${yPrev})`
|
|
|
}))
|
|
}))
|
|
|
}
|
|
}
|
|
|
} catch {
|
|
} catch {
|
|
|
setIrlCurrent(s => ({ ...s, loading: false }))
|
|
setIrlCurrent(s => ({ ...s, loading: false }))
|
|
|
|
|
+ setIrlPrevious(s => ({ ...s, loading: false }))
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
setShowRevisionModal(true)
|
|
setShowRevisionModal(true)
|
|
@@ -789,8 +800,12 @@ export default function LeaseDetail() {
|
|
|
<p className="text-xs font-semibold text-indigo-700 uppercase tracking-wide">Indice IRL</p>
|
|
<p className="text-xs font-semibold text-indigo-700 uppercase tracking-wide">Indice IRL</p>
|
|
|
<div className="grid grid-cols-2 gap-3 text-sm">
|
|
<div className="grid grid-cols-2 gap-3 text-sm">
|
|
|
<div>
|
|
<div>
|
|
|
- <p className="text-gray-500 text-xs">IRL de référence (T{lease.irl_reference_quarter} {lease.irl_reference_year})</p>
|
|
|
|
|
- <p className="font-bold text-gray-800">{lease.irl_reference_value ?? '—'}</p>
|
|
|
|
|
|
|
+ <p className="text-gray-500 text-xs">IRL T{irlPrevious.quarter} {irlPrevious.year} (année précédente)</p>
|
|
|
|
|
+ {irlPrevious.loading
|
|
|
|
|
+ ? <p className="text-indigo-500 text-xs">⏳ Récupération…</p>
|
|
|
|
|
+ : irlPrevious.value !== null
|
|
|
|
|
+ ? <p className="font-bold text-gray-800">{irlPrevious.value}</p>
|
|
|
|
|
+ : <p className="text-gray-400 text-xs">Indice non disponible pour cette période</p>}
|
|
|
</div>
|
|
</div>
|
|
|
<div>
|
|
<div>
|
|
|
<p className="text-gray-500 text-xs">IRL T{irlCurrent.quarter} {irlCurrent.year} (en cours)</p>
|
|
<p className="text-gray-500 text-xs">IRL T{irlCurrent.quarter} {irlCurrent.year} (en cours)</p>
|
|
@@ -801,10 +816,15 @@ export default function LeaseDetail() {
|
|
|
: <p className="text-gray-400 text-xs">Indice non disponible pour cette période</p>}
|
|
: <p className="text-gray-400 text-xs">Indice non disponible pour cette période</p>}
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- {irlCurrent.value && lease.irl_reference_value && (
|
|
|
|
|
|
|
+ {irlCurrent.value && irlPrevious.value && (
|
|
|
<p className="text-xs text-indigo-600 pt-1 border-t border-indigo-100">
|
|
<p className="text-xs text-indigo-600 pt-1 border-t border-indigo-100">
|
|
|
- Variation : <strong>+{((irlCurrent.value / lease.irl_reference_value - 1) * 100).toFixed(2)} %</strong>
|
|
|
|
|
- {' '}— loyer calculé : <strong>{fmt(lease.rent_amount * irlCurrent.value / lease.irl_reference_value)}</strong>
|
|
|
|
|
|
|
+ Variation annuelle : <strong>{((irlCurrent.value / irlPrevious.value - 1) * 100 >= 0 ? '+' : '')}{((irlCurrent.value / irlPrevious.value - 1) * 100).toFixed(2)} %</strong>
|
|
|
|
|
+ {' '}— loyer calculé : <strong>{fmt(lease.rent_amount * irlCurrent.value / irlPrevious.value)}</strong>
|
|
|
|
|
+ </p>
|
|
|
|
|
+ )}
|
|
|
|
|
+ {lease.irl_reference_value && (
|
|
|
|
|
+ <p className="text-[11px] text-gray-400 pt-1">
|
|
|
|
|
+ IRL de référence bail : {lease.irl_reference_value} (T{lease.irl_reference_quarter} {lease.irl_reference_year})
|
|
|
</p>
|
|
</p>
|
|
|
)}
|
|
)}
|
|
|
</div>
|
|
</div>
|