Investissements
Total HT : 0,00 EUR
Total TTC : 0,00 EUR
Chiffre d’Affaires Sportif
Autres Activités
Masse Salariale
Charges d’Exploitation
Fiscalité
| Poste | Année 1 | Année 2 | Année 3 |
|---|
| Résultat Imposable | 0,00 | 0,00 | 0,00 |
| IS Estimé | 0,00 | 0,00 | 0,00 |
| Résultat Net | 0,00 | 0,00 | 0,00 |
Financement
Mensualité : 0,00 EUR
Besoin théorique : 0,00 EUR
Compte de Résultat
| Indicateur | Année 1 | Année 2 | Année 3 |
|---|
| Chiffre d’Affaires | 0,00 | 0,00 | 0,00 |
| Charges Exploitation | 0,00 | 0,00 | 0,00 |
| EBITDA (EBE) | 0,00 | 0,00 | 0,00 |
| Résultat Net | 0,00 | 0,00 | 0,00 |
| Cash-Flow Net | 0,00 | 0,00 | 0,00 |
Seuil de Rentabilité
| Indicateur | A1 | A2 | A3 |
|---|
| Point Mort (EUR) | 0,00 | 0,00 | 0,00 |
| Point Mort (Mois) | 0,00 | 0,00 | 0,00 |
Mise à jour des calculs…
#bp-app {
background: #fff;
padding: 20px;
border-radius: 8px;
box-shadow: 0 5px 15px rgba(0,0,0,0.05);
font-family: inherit;
}#bp-tabs-nav {
display: flex;
flex-wrap: wrap;
gap: 5px;
border-bottom: 3px solid #B3BC00;
margin-bottom: 20px;
}.bp-tab-btn {
padding: 10px 15px;
border: 1px solid #ddd;
border-bottom: none;
background: #f8f8f8;
cursor: pointer;
font-weight: 600;
font-size: 13px;
border-radius: 5px 5px 0 0;
}.bp-tab-btn.active {
background: #B3BC00;
color: #fff;
border-color: #B3BC00;
}.bp-tab-panel {
display: none;
animation: fadeIn 0.3s;
}.bp-tab-panel.active { display: block; }@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }.bp-section-title {
color: #B3BC00;
font-size: 1.5rem;
margin-bottom: 1.5rem;
border-left: 5px solid #B3BC00;
padding-left: 15px;
}.bp-table {
width: 100%;
margin-bottom: 1rem;
border-collapse: collapse;
}.bp-table th {
background: #f4f4f4;
text-align: left;
padding: 12px;
font-size: 12px;
}.bp-table td {
padding: 8px;
border-bottom: 1px solid #eee;
}.bp-input-table {
width: 100%;
padding: 5px;
border: 1px solid #ccc;
border-radius: 3px;
}.bp-cell-calc {
font-weight: 700;
text-align: right;
color: #333;
}.bp-total-row {
background: #f9f9f9;
font-weight: bold;
}.bp-btn-add {
background: #B3BC00;
color: #fff;
border: none;
padding: 8px 15px;
border-radius: 4px;
cursor: pointer;
}.bp-btn-remove {
background: #ff4444;
color: #fff;
border: none;
width: 25px;
height: 25px;
border-radius: 50%;
cursor: pointer;
}.bp-summary-box, .bp-suggestion-box {
background: #f0f3e8;
padding: 15px;
margin-top: 20px;
border-radius: 5px;
}.bp-accent {
font-weight: 800;
color: #B3BC00;
}.bp-hidden { display: none; }#bp-loader {
position: fixed;
bottom: 20px;
right: 20px;
background: #B3BC00;
color: white;
padding: 10px 20px;
border-radius: 30px;
z-index: 9999;
}(function() {
‘use strict’;// Utilitaires
const val = (idOrEl) => {
const el = typeof idOrEl === ‘string’ ? document.getElementById(idOrEl) : idOrEl;
return el ? parseFloat(el.value) || 0 : 0;
};const fmt = (n) => (n || 0).toLocaleString(‘fr-FR’, { minimumFractionDigits: 2, maximumFractionDigits: 2 });const setText = (id, value) => {
const el = document.getElementById(id);
if (el) el.textContent = fmt(value);
};// Gestion des onglets
document.querySelectorAll(‘.bp-tab-btn’).forEach(btn => {
btn.addEventListener(‘click’, () => {
document.querySelectorAll(‘.bp-tab-btn, .bp-tab-panel’).forEach(el => el.classList.remove(‘active’));
btn.classList.add(‘active’);
document.getElementById(btn.dataset.tab).classList.add(‘active’);
});
});// Suppression de ligne
document.getElementById(‘bp-app’).addEventListener(‘click’, (e) => {
if (e.target.classList.contains(‘bp-btn-remove’)) {
const tr = e.target.closest(‘tr’);
if (tr.parentNode.querySelectorAll(‘tr’).length > 1) {
tr.remove();
triggerGlobalRecalc();
}
}
});// Ajout de lignes
const bindBtn = (id, tbodyId, html) => {
const btn = document.getElementById(id);
if(btn) btn.addEventListener(‘click’, () => {
const tbody = document.getElementById(tbodyId);
const tr = document.createElement(‘tr’);
tr.innerHTML = html;
tbody.appendChild(tr);
triggerGlobalRecalc();
});
};bindBtn(‘btn-add-invest’, ‘invest-tbody’, `
| | | 0,00 | | 0,00 | | | `);// … Répéter pour les autres boutons si besoin …function triggerGlobalRecalc() {
const loader = document.getElementById(‘bp-loader’);
if(loader) loader.classList.remove(‘bp-hidden’);// 1. Collecte & Calculs par ligne
let invHT = 0, invTTC = 0, ca1 = 0, ca2 = 0, ca3 = 0, ch1 = 0, ch2 = 0, ch3 = 0, rh1 = 0, rh2 = 0, rh3 = 0;
const infla = 1 + (val(‘bp-inflation’) / 100);// Investissements
document.querySelectorAll(‘#invest-tbody tr’).forEach(tr => {
const q = val(tr.querySelector(‘[data-field= »qty »]’));
const p = val(tr.querySelector(‘[data-field= »price_ht »]’));
const t = val(tr.querySelector(‘[data-field= »tva_rate »]’));
const tht = q * p;
const tttc = tht * (1 + t/100);
tr.querySelector(‘[data-field= »total_ht »]’).textContent = fmt(tht);
tr.querySelector(‘[data-field= »total_ttc »]’).textContent = fmt(tttc);
invHT += tht; invTTC += tttc;
});// CA Sport
document.querySelectorAll(‘#ca-sport-tbody tr’).forEach(tr => {
const p = val(tr.querySelector(‘[data-field= »price_ht »]’));
ca1 += p * val(tr.querySelector(‘[data-field= »rate_a1″]’));
ca2 += p * val(tr.querySelector(‘[data-field= »rate_a2″]’));
ca3 += p * val(tr.querySelector(‘[data-field= »rate_a3″]’));
});// RH (Calcul simplifié Charges 42%)
document.querySelectorAll(‘#rh-tbody tr’).forEach(tr => {
const net = val(tr.querySelector(‘[data-field= »salaire_net »]’));
const nb = val(tr.querySelector(‘[data-field= »nb_postes »]’));
const cout = net * 1.42 * 12 * nb;
tr.querySelector(‘[data-field= »cout_a1″]’).textContent = fmt(cout);
rh1 += cout; rh2 += cout * infla; rh3 += cout * infla * infla;
});// Charges
document.querySelectorAll(‘#charges-tbody tr’).forEach(tr => {
const m = val(tr.querySelector(‘[data-field= »montant_ht »]’));
tr.querySelector(‘[data-field= »annuel_a1″]’).textContent = fmt(m * 12);
ch1 += m * 12; ch2 += m * 12 * infla; ch3 += m * 12 * infla * infla;
});// Amortissements (Simplifié)
let am1 = 0, am2 = 0, am3 = 0;
const amortTbody = document.getElementById(‘amort-tbody’);
amortTbody.innerHTML = « »;
document.querySelectorAll(‘#invest-tbody tr’).forEach(tr => {
const base = val(tr.querySelector(‘[data-field= »qty »]’)) * val(tr.querySelector(‘[data-field= »price_ht »]’));
const dur = val(tr.querySelector(‘[data-field= »amort_years »]’)) || 1;
const dot = base / dur;
am1 += dot; am2 += dot; am3 += dot;
amortTbody.innerHTML += `
| ${tr.querySelector(‘[data-field= »designation »]’).value} | ${fmt(base)} | ${fmt(dot)} | ${fmt(dot)} | ${fmt(dot)} |
`;
});// Banque
const mntEmp = val(‘bp-banque-montant’);
const mensualite = mntEmp > 0 ? (mntEmp * (val(‘bp-banque-taux’)/100/12)) / (1 – Math.pow(1 + (val(‘bp-banque-taux’)/100/12), -val(‘bp-banque-duree’)*12)) : 0;
setText(‘banque-mensualite’, mensualite);// Synthèse & Fiscalité
const ebe1 = ca1 – ch1 – rh1;
const is1 = ebe1 > 42500 ? (42500 * 0.15) + (ebe1 – 42500) * 0.25 : Math.max(0, ebe1 * 0.15);
setText(‘syn-total-recettes-a1’, ca1);
setText(‘syn-total-charges-a1’, ch1 + rh1);
setText(‘syn-ebitda-a1’, ebe1);
setText(‘syn-res-net-a1’, ebe1 – am1 – is1);
setText(‘syn-cf-net-a1’, (ebe1 – am1 – is1) + am1 – (mensualite * 12));// Analyse (Seuil de rentabilité simplifié)
const sr1 = (ch1 + rh1 + am1);
setText(‘ana-sr-a1’, sr1);
setText(‘ana-pm-a1’, ca1 > 0 ? (sr1 / ca1) * 12 : 0);// Update UI
setText(‘invest-summary-ht’, invHT);
setText(‘invest-summary-ttc’, invTTC);
setText(‘sug-besoin’, Math.max(0, invTTC – val(‘bp-capital’) – val(‘bp-cc’)));setTimeout(() => { if(loader) loader.classList.add(‘bp-hidden’); }, 300);
}// Event listeners
document.getElementById(‘bp-app’).addEventListener(‘input’, (e) => {
if (e.target.classList.contains(‘bp-input-calc’)) triggerGlobalRecalc();
});// Init
triggerGlobalRecalc();})();