Renomme HT/TTC, réduit leur largeur, ajoute une colonne TVA au grand livre
HT/TTC passent de "Montant HT"/"Montant TTC" à "HT"/"TTC" (5% de large au lieu de 6,2%), avec une nouvelle colonne TVA entre les deux (3,5%, affichée en %, arrondie à 2 décimales -- les lignes migrées portent parfois un taux rétro-calculé à 4 décimales, voir figli_compta_ledger_update_8005()). field_tva était déjà exposé sans changement de requête JSON:API (pas de sparse fieldset ici). Piège de spécificité CSS : .amount:not(.compte-col) (déjà en place pour Écart) compte comme 2 classes à cause de :not(), donc un simple .figli-ht-col à une classe perdait systématiquement contre elle -- recombiné en .amount.figli-ht-col pour égaler/dépasser sa spécificité.
This commit is contained in:
@@ -444,6 +444,22 @@ html.gin--dark-mode #figli-home-app {
|
|||||||
width: 6.2%;
|
width: 6.2%;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
/* HT/TTC narrower than the general .amount rule above (still used by
|
||||||
|
Écart) -- shorter header text (HT/TTC vs. the old Montant HT/Montant
|
||||||
|
TTC) and TVA splitting the row between them means neither needs as
|
||||||
|
much room. TVA itself narrower still: "12,64 %" is the longest
|
||||||
|
realistic value (see figli_compta_ledger_update_8005()'s docblock on
|
||||||
|
backfilled non-round rates), well short of an 8-figure amount.
|
||||||
|
`.amount` doubled up in the selector (not just .figli-ht-col alone):
|
||||||
|
:not(.compte-col) in the rule above counts toward specificity same as
|
||||||
|
a real class, so a single-class selector here would lose to it. */
|
||||||
|
#figli-home-app .amount.figli-ht-col,
|
||||||
|
#figli-home-app .amount.figli-ttc-col {
|
||||||
|
width: 5%;
|
||||||
|
}
|
||||||
|
#figli-home-app .amount.figli-tva-col {
|
||||||
|
width: 3.5%;
|
||||||
|
}
|
||||||
#figli-home-app .amount.compte-col {
|
#figli-home-app .amount.compte-col {
|
||||||
width: 4.3%;
|
width: 4.3%;
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
|||||||
@@ -22,6 +22,10 @@
|
|||||||
|
|
||||||
const API_BASE = '/jsonapi/node/ligne_comptable';
|
const API_BASE = '/jsonapi/node/ligne_comptable';
|
||||||
const EUR = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' });
|
const EUR = new Intl.NumberFormat('fr-FR', { style: 'currency', currency: 'EUR' });
|
||||||
|
// Not style: 'percent' -- that expects a fraction (0.10) and field_tva
|
||||||
|
// stores a plain rate (10), which style: 'percent' would otherwise
|
||||||
|
// silently read as 1000%.
|
||||||
|
const PCT = new Intl.NumberFormat('fr-FR', { minimumFractionDigits: 0, maximumFractionDigits: 2 });
|
||||||
const MONTHS = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'];
|
const MONTHS = ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'];
|
||||||
const TYPE_LABELS = {
|
const TYPE_LABELS = {
|
||||||
entree: 'Entrée client',
|
entree: 'Entrée client',
|
||||||
@@ -365,6 +369,7 @@
|
|||||||
facture: attrs.field_numero_facture || null,
|
facture: attrs.field_numero_facture || null,
|
||||||
libelle: attrs.field_notes || attrs.title,
|
libelle: attrs.field_notes || attrs.title,
|
||||||
montant_ht: montantHt,
|
montant_ht: montantHt,
|
||||||
|
tva: attrs.field_tva !== null && attrs.field_tva !== undefined ? parseFloat(attrs.field_tva) : null,
|
||||||
montant_ttc: attrs.field_montant_ttc !== null && attrs.field_montant_ttc !== undefined ? parseFloat(attrs.field_montant_ttc) : null,
|
montant_ttc: attrs.field_montant_ttc !== null && attrs.field_montant_ttc !== undefined ? parseFloat(attrs.field_montant_ttc) : null,
|
||||||
parCompte,
|
parCompte,
|
||||||
somme,
|
somme,
|
||||||
@@ -668,6 +673,13 @@
|
|||||||
formatEur(v) {
|
formatEur(v) {
|
||||||
return v === null || v === undefined ? '' : EUR.format(v);
|
return v === null || v === undefined ? '' : EUR.format(v);
|
||||||
},
|
},
|
||||||
|
// Historical lines can carry a backfilled, non-round rate (e.g.
|
||||||
|
// 12.6414 -- see figli_compta_ledger_update_8005()'s docblock for
|
||||||
|
// why); rounded to 2 decimals for display, same as every amount
|
||||||
|
// column here, rather than showing the full stored precision.
|
||||||
|
formatPct(v) {
|
||||||
|
return v === null || v === undefined ? '' : PCT.format(v) + ' %';
|
||||||
|
},
|
||||||
// Écart between this ouverture row's year and the previous year's
|
// Écart between this ouverture row's year and the previous year's
|
||||||
// calculated closing balance -- restricted to whichever compte(s)
|
// calculated closing balance -- restricted to whichever compte(s)
|
||||||
// this specific row's répartition actually touches (ouverture lines
|
// this specific row's répartition actually touches (ouverture lines
|
||||||
|
|||||||
@@ -128,21 +128,22 @@
|
|||||||
<th>Facture</th>
|
<th>Facture</th>
|
||||||
<th>Libellé / Détail</th>
|
<th>Libellé / Détail</th>
|
||||||
<th>Signalement</th>
|
<th>Signalement</th>
|
||||||
<th class="amount">Montant HT</th>
|
<th class="amount figli-ht-col">HT</th>
|
||||||
<th class="amount">Montant TTC</th>
|
<th class="amount figli-tva-col">TVA</th>
|
||||||
|
<th class="amount figli-ttc-col">TTC</th>
|
||||||
<th v-for="c in allComptes" :key="c" class="amount compte-col">{{ c }}</th>
|
<th v-for="c in allComptes" :key="c" class="amount compte-col">{{ c }}</th>
|
||||||
<th class="amount">Écart</th>
|
<th class="amount">Écart</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr ref="topSentinel" class="figli-sentinel-row">
|
<tr ref="topSentinel" class="figli-sentinel-row">
|
||||||
<td :colspan="7 + allComptes.length + 3">
|
<td :colspan="7 + allComptes.length + 4">
|
||||||
<span v-if="loadingOlder">Chargement des mois précédents…</span>
|
<span v-if="loadingOlder">Chargement des mois précédents…</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<template v-for="item in groupedRows" :key="item.key">
|
<template v-for="item in groupedRows" :key="item.key">
|
||||||
<tr v-if="item.isGroup" class="figli-group-row" :data-year="item.year">
|
<tr v-if="item.isGroup" class="figli-group-row" :data-year="item.year">
|
||||||
<td :colspan="7 + allComptes.length + 3">{{ item.label }} <span class="figli-note">({{ item.count }} lignes)</span></td>
|
<td :colspan="7 + allComptes.length + 4">{{ item.label }} <span class="figli-note">({{ item.count }} lignes)</span></td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr v-else :class="{'figli-flag-row': item.hasFlag}" :data-year="item.date ? item.date.slice(0, 4) : null">
|
<tr v-else :class="{'figli-flag-row': item.hasFlag}" :data-year="item.date ? item.date.slice(0, 4) : null">
|
||||||
<td class="actions-col">
|
<td class="actions-col">
|
||||||
@@ -239,14 +240,15 @@
|
|||||||
<template v-else>—</template>
|
<template v-else>—</template>
|
||||||
</span>
|
</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="amount" :class="montantClass(item.montant_ht)">{{ formatEur(item.montant_ht) }}</td>
|
<td class="amount figli-ht-col" :class="montantClass(item.montant_ht)">{{ formatEur(item.montant_ht) }}</td>
|
||||||
<td class="amount">{{ formatEur(item.montant_ttc) }}</td>
|
<td class="amount figli-tva-col">{{ formatPct(item.tva) }}</td>
|
||||||
|
<td class="amount figli-ttc-col">{{ formatEur(item.montant_ttc) }}</td>
|
||||||
<td v-for="c in allComptes" :key="c" class="amount compte-col">{{ item.parCompte[c] !== undefined ? formatEur(item.parCompte[c]) : '' }}</td>
|
<td v-for="c in allComptes" :key="c" class="amount compte-col">{{ item.parCompte[c] !== undefined ? formatEur(item.parCompte[c]) : '' }}</td>
|
||||||
<td class="amount" :class="{'figli-ecart': item.hasError}">{{ item.hasError ? formatEur(item.ecart) : '' }}</td>
|
<td class="amount" :class="{'figli-ecart': item.hasError}">{{ item.hasError ? formatEur(item.ecart) : '' }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
</template>
|
</template>
|
||||||
<tr ref="bottomSentinel" class="figli-sentinel-row">
|
<tr ref="bottomSentinel" class="figli-sentinel-row">
|
||||||
<td :colspan="7 + allComptes.length + 3">
|
<td :colspan="7 + allComptes.length + 4">
|
||||||
<span v-if="loadingNewer">Chargement des mois suivants…</span>
|
<span v-if="loadingNewer">Chargement des mois suivants…</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@@ -258,8 +260,9 @@
|
|||||||
Solde {{ currentYear || '…' }} (créditeur / débiteur)
|
Solde {{ currentYear || '…' }} (créditeur / débiteur)
|
||||||
<span v-if="currentYearLoading" class="figli-note">chargement…</span>
|
<span v-if="currentYearLoading" class="figli-note">chargement…</span>
|
||||||
</td>
|
</td>
|
||||||
<td class="amount">{{ currentYearTotals ? formatEur(currentYearTotals.montant_ht) : '' }}</td>
|
<td class="amount figli-ht-col">{{ currentYearTotals ? formatEur(currentYearTotals.montant_ht) : '' }}</td>
|
||||||
<td class="amount">{{ currentYearTotals ? formatEur(currentYearTotals.montant_ttc) : '' }}</td>
|
<td class="amount figli-tva-col"></td>
|
||||||
|
<td class="amount figli-ttc-col">{{ currentYearTotals ? formatEur(currentYearTotals.montant_ttc) : '' }}</td>
|
||||||
<td v-for="c in allComptes" :key="c" class="amount compte-col" :class="currentYearTotals ? soldeClass(currentYearTotals.par_compte[c]) : ''">{{ currentYearTotals && currentYearTotals.par_compte[c] !== undefined ? formatEur(currentYearTotals.par_compte[c]) : '' }}</td>
|
<td v-for="c in allComptes" :key="c" class="amount compte-col" :class="currentYearTotals ? soldeClass(currentYearTotals.par_compte[c]) : ''">{{ currentYearTotals && currentYearTotals.par_compte[c] !== undefined ? formatEur(currentYearTotals.par_compte[c]) : '' }}</td>
|
||||||
<td class="amount" :class="currentYearTotals ? soldeClass(currentYearTotals.ecart) : ''">{{ currentYearTotals ? formatEur(currentYearTotals.ecart) : '' }}</td>
|
<td class="amount" :class="currentYearTotals ? soldeClass(currentYearTotals.ecart) : ''">{{ currentYearTotals ? formatEur(currentYearTotals.ecart) : '' }}</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
Reference in New Issue
Block a user