Autres taxes CFE param, % marge sur HT, Prix HT/TVA/TTC séparés, clients sans coeff
This commit is contained in:
+35
-14
@@ -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>`;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user