Autres taxes CFE param, % marge sur HT, Prix HT/TVA/TTC séparés, clients sans coeff

This commit is contained in:
Jo
2026-07-06 13:23:19 +02:00
parent 274ec01239
commit dbbbc92d91
5 changed files with 104 additions and 57 deletions
+35 -14
View File
@@ -178,10 +178,16 @@
<label class="form-label fw-semibold d-flex justify-content-between">
Marge brute <span id="marginDisplay" class="fw-bold" style="color:#ff6b35">27.5 %</span>
</label>
<div class="d-flex gap-2 mb-2" id="marginButtons">
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="setMargin(20)">20%</button>
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="setMargin(25)">25%</button>
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="setMargin(30)">30%</button>
<button type="button" class="btn btn-sm btn-outline-secondary" onclick="setMargin(35)">35%</button>
</div>
<input type="range" name="gross_margin_pct" id="gross_margin_pct" class="form-range"
min="20" max="35" step="0.5" value="27.5">
min="0" max="100" step="0.5" value="27.5">
<div class="d-flex justify-content-between" style="font-size:.75rem;color:#6b7280">
<span>20%</span><span>35%</span>
<span>0%</span><span>100%</span>
</div>
</div>
<div class="mb-3">
@@ -271,8 +277,19 @@ document.getElementById('design_multiplier').addEventListener('input', function(
});
// ── Marge ─────────────────────────────────────────────────────────────────────
function setMargin(val) {
document.getElementById('gross_margin_pct').value = val;
updateMarginDisplay(val);
recalc();
}
function updateMarginDisplay(val) {
document.getElementById('marginDisplay').textContent = parseFloat(val).toFixed(1) + ' %';
val = parseFloat(val);
document.getElementById('marginDisplay').textContent = val.toFixed(1) + ' %';
[20, 25, 30, 35].forEach(function(v) {
const btn = document.querySelector('#marginButtons button[onclick="setMargin(' + v + ')"]');
if (btn) btn.className = 'btn btn-sm ' + (Math.abs(val - v) < 0.01 ? 'btn-secondary' : 'btn-outline-secondary');
});
}
const marginSlider = document.getElementById('gross_margin_pct');
@@ -374,20 +391,22 @@ function renderBreakdown(d, body) {
const matOpt = matSel.options[matSel.selectedIndex];
const matName = matOpt.value ? (matOpt.dataset.name || matOpt.text.split('—')[0].trim()) : 'global';
// Remise
const dis = body.discount_pct > 0
? `<div class="breakdown-row text-danger"><span class="ps-2">Remise (${body.discount_pct}%)</span><span>-${fmt2(d.prix_ttc * body.discount_pct / 100)}</span></div>` : '';
// TVA — toujours affichee
const tvaLabel = d._tva_pct > 0
? `TVA ${d._tva_pct}% — ${fmt2(d.tva_amount)}`
: `TVA — franchise en base`;
// TVA
const tvaLabel = d._tva_pct > 0 ? `TVA (${d._tva_pct}%)` : `TVA — franchise en base`;
const tvaClass = d._tva_pct > 0 ? '' : 'text-muted fst-italic';
// VFL
const vflRow = d._vfl_pct > 0
? `<div class="breakdown-row"><span class="breakdown-muted ps-2">VFL impot (${d._vfl_pct}%)</span><span>${fmt2(d.vfl_amount)}</span></div>` : '';
// Autres taxes
const otherRow = d._other_taxes_pct > 0
? `<div class="breakdown-row"><span class="breakdown-muted ps-2">Autres taxes / CFE (${d._other_taxes_pct}%)</span><span>${fmt2(d.other_taxes_amount)}</span></div>` : '';
// Remise
const disRow = body.discount_pct > 0
? `<div class="breakdown-row text-danger"><span class="ps-2">Remise (${body.discount_pct}%)</span><span>-${fmt2(d.prix_ttc * body.discount_pct / 100)}</span></div>` : '';
document.getElementById('breakdown').innerHTML = `
<div class="breakdown-row section-header"><span>Cout fixe</span></div>
<div class="breakdown-row"><span class="breakdown-muted ps-2">Matiere <small class="text-secondary">${matName}</small></span><span>${fmt(d.material_cost)}</span></div>
@@ -402,13 +421,15 @@ function renderBreakdown(d, body) {
<div class="breakdown-row"><span class="breakdown-muted ps-2">Manutention <small class="text-secondary">${d._handling_minutes} min × ${d._handling_rate} €/h</small></span><span>${fmt(d.handling_cost)}</span></div>
<div class="breakdown-row"><span class="breakdown-muted ps-2">Design (x${dm})</span><span>${fmt(d.design_cost)}</span></div>
<div class="breakdown-row"><span class="breakdown-muted ps-2">Marge brute (${mgn}%)</span><span>${fmt2(d.margin_amount)}</span></div>
<div class="breakdown-row subtotal"><span class="fw-semibold">Total marge</span><span class="fw-semibold">${fmt2(d.total_marge)}</span></div>
<div class="breakdown-row subtotal"><span class="fw-semibold">Total marge <small class="text-muted fw-normal">(${d.marge_pct_on_ht}% du HT)</small></span><span class="fw-semibold">${fmt2(d.total_marge)}</span></div>
<div class="breakdown-row section-header"><span>Fiscal</span></div>
<div class="breakdown-row"><span class="breakdown-muted ps-2">Cotisations BIC vente (${d._cot_pct}%)</span><span>${fmt2(d.cotisations_amount)}</span></div>
${vflRow}
<div class="breakdown-row ${tvaClass}"><span class="ps-2">${tvaLabel}</span></div>
${dis}
${otherRow}
<div class="breakdown-row total" style="border-top:none"><span>Prix HT</span><span class="final-price">${fmt2(d.prix_ht_net)}</span></div>
<div class="breakdown-row ${tvaClass}"><span class="ps-2">${tvaLabel}</span><span>${d._tva_pct > 0 ? fmt2(d.tva_amount) : ''}</span></div>
${disRow}
<div class="breakdown-row total"><span>PRIX FINAL TTC</span><span class="final-price">${fmt2(d.final_price)}</span></div>`;
}