Calculator Buget Producție Video
Calculează costul exact pentru producția video. Alege tipul de proiect pentru a deschide calculatorul potrivit.
Calculator Spot Comercial
Bifează articolele · Click pe preț pentru a edita
Calculator Reels & Social Media
Bifează articolele · Click pe preț pentru a edita
';
group.items.forEach(function (item) {
var total = item.checked ? item.price * item.qty : 0;
rowsHtml += '
';
flatIdx++;
});
});
html += '
'
+ '
'
+ '
'
+ '
'
+ (cat.note ? '
' + cat.note + '
' : '')
+ rowsHtml + '
';
});
body.innerHTML = html;
bindEvents();
recalcAll();
}
function findRow(rowEl) {
var catId = rowEl.getAttribute('data-cat');
var idx = parseInt(rowEl.getAttribute('data-idx'), 10);
for (var c = 0; c < data.length; c++) {
if (data[c].id === catId) {
var fi = 0;
for (var g = 0; g < data[c].groups.length; g++) {
for (var i = 0; i < data[c].groups[g].items.length; i++) {
if (fi === idx) return data[c].groups[g].items[i];
fi++;
}
}
}
}
return null;
}
function bindEvents() {
var heads = body.querySelectorAll('.ir-calc__cat-head');
for (var h = 0; h < heads.length; h++) {
heads[h].addEventListener('click', function (e) {
var catEl = e.currentTarget.closest('.ir-calc__cat');
var wrap = catEl.querySelector('.ir-calc__cat-wrap');
if (catEl.classList.contains('is-open')) {
catEl.classList.remove('is-open');
wrap.style.maxHeight = '0';
} else {
catEl.classList.add('is-open');
wrap.style.maxHeight = wrap.scrollHeight + 'px';
}
});
}
var rows = body.querySelectorAll('.ir-calc__row');
for (var r = 0; r < rows.length; r++) {
(function (row) {
row.querySelector('.ir-calc__row-check').addEventListener('change', function () {
var item = findRow(row);
if (!item) return;
item.checked = this.checked;
if (item.checked && item.qty === 0) { item.qty = 1; row.querySelector('.ir-calc__row-qty input').value = 1; }
updateRow(row, item); recalcAll();
});
row.querySelector('.ir-calc__row-price-input').addEventListener('input', function () {
var item = findRow(row);
if (!item) return;
item.price = parseInt(this.value) || 0;
updateRow(row, item); recalcAll();
});
row.querySelector('.ir-calc__qty-minus').addEventListener('click', function () {
var item = findRow(row);
if (!item) return;
item.qty = Math.max(0, item.qty - 1);
row.querySelector('.ir-calc__row-qty input').value = item.qty;
if (item.qty === 0) { item.checked = false; row.querySelector('.ir-calc__row-check').checked = false; }
else if (!item.checked) { item.checked = true; row.querySelector('.ir-calc__row-check').checked = true; }
updateRow(row, item); recalcAll();
});
row.querySelector('.ir-calc__qty-plus').addEventListener('click', function () {
var item = findRow(row);
if (!item) return;
item.qty++;
row.querySelector('.ir-calc__row-qty input').value = item.qty;
if (!item.checked) { item.checked = true; row.querySelector('.ir-calc__row-check').checked = true; }
updateRow(row, item); recalcAll();
});
row.querySelector('.ir-calc__row-qty input').addEventListener('input', function () {
var item = findRow(row);
if (!item) return;
var val = Math.max(0, parseInt(this.value) || 0);
item.qty = val;
if (val === 0 && item.checked) { item.checked = false; row.querySelector('.ir-calc__row-check').checked = false; }
else if (val > 0 && !item.checked) { item.checked = true; row.querySelector('.ir-calc__row-check').checked = true; }
updateRow(row, item); recalcAll();
});
})(rows[r]);
}
}
function updateRow(row, item) {
var total = item.checked ? item.price * item.qty : 0;
var el = row.querySelector('.ir-calc__row-total');
el.textContent = '€' + total.toLocaleString();
el.classList.toggle('is-active', item.checked);
row.classList.toggle('is-checked', item.checked);
}
function recalcAll() {
var prod = 0;
data.forEach(function (cat) {
var s = 0;
cat.groups.forEach(function (g) { g.items.forEach(function (it) { s += it.checked ? it.price * it.qty : 0; }); });
prod += s;
var el = body.querySelector('.ir-calc__cat[data-cat="' + cat.id + '"] .ir-calc__cat-sum');
if (el) el.textContent = '€' + s.toLocaleString();
});
var sv = surpriseOn ? Math.round(prod * surprisePct / 100) : 0;
var fv = feeOn ? Math.round(prod * feePct / 100) : 0;
elProd.textContent = '€' + prod.toLocaleString();
elSurpriseVal.textContent = '€' + sv.toLocaleString();
elFeeVal.textContent = '€' + fv.toLocaleString();
elTotal.textContent = '€' + (prod + sv + fv).toLocaleString();
surpriseRow.classList.toggle('is-off', !surpriseOn);
surprisePctInput.classList.toggle('is-off', !surpriseOn);
surprisePctInput.disabled = !surpriseOn;
feeRow.classList.toggle('is-off', !feeOn);
feePctInput.classList.toggle('is-off', !feeOn);
feePctInput.disabled = !feeOn;
}
surpriseCheck.addEventListener('change', function () { surpriseOn = this.checked; recalcAll(); });
surprisePctInput.addEventListener('input', function () { surprisePct = Math.max(0, Math.min(100, parseInt(this.value) || 0)); recalcAll(); });
feeCheck.addEventListener('change', function () { feeOn = this.checked; recalcAll(); });
feePctInput.addEventListener('input', function () { feePct = Math.max(0, Math.min(100, parseInt(this.value) || 0)); recalcAll(); });
function openModal() { modal.classList.add('is-open'); document.body.style.overflow = 'hidden'; }
function closeModal() { modal.classList.remove('is-open'); document.body.style.overflow = ''; }
closeBtn.addEventListener('click', closeModal);
jsClose.addEventListener('click', closeModal);
overlay.addEventListener('click', closeModal);
document.addEventListener('keydown', function (e) {
if (e.key === 'Escape' && modal.classList.contains('is-open')) closeModal();
});
resetBtn.addEventListener('click', function () {
data = JSON.parse(JSON.stringify(defaultCategories));
surpriseOn = true; surprisePct = 5; feeOn = true; feePct = 18;
surpriseCheck.checked = true; surprisePctInput.value = 5;
feeCheck.checked = true; feePctInput.value = 18;
companyInput.value = '';
render();
});
/* ═══ PDF ═══ */
downloadBtn.addEventListener('click', function () {
var now = new Date();
var dateStr = now.toLocaleDateString('ro-RO', { year: 'numeric', month: 'long', day: 'numeric' });
var timeStr = now.toLocaleTimeString('ro-RO', { hour: '2-digit', minute: '2-digit' });
var companyName = companyInput.value.trim();
var prod = 0;
var sections = '';
data.forEach(function (cat) {
var items = [];
cat.groups.forEach(function (group) {
group.items.forEach(function (item) {
if (item.checked && item.qty > 0) items.push({ name: item.name.replace(/<[^>]*>/g, ''), price: item.price, qty: item.qty, total: item.price * item.qty, subtitle: group.subtitle || null });
});
});
if (items.length === 0) return;
var catTotal = 0; var rows = ''; var lastSub = '';
items.forEach(function (it) {
if (it.subtitle && it.subtitle !== lastSub) { lastSub = it.subtitle; rows += '
| ' + it.subtitle + ' |
'; }
catTotal += it.total;
rows += '
| ' + it.name + ' | ' + it.qty + ' | €' + it.price.toLocaleString() + ' | €' + it.total.toLocaleString() + ' |
';
});
prod += catTotal;
sections += '
' + cat.name + '€' + catTotal.toLocaleString() + '
| Articol | Cant. | Preț | Total |
' + rows + '
';
});
var sv = surpriseOn ? Math.round(prod * surprisePct / 100) : 0;
var fv = feeOn ? Math.round(prod * feePct / 100) : 0;
var total = prod + sv + fv;
var extra = '';
if (surpriseOn && sv > 0) extra += '
Cheltuieli neprevăzute (' + surprisePct + '%)€' + sv.toLocaleString() + '
';
if (feeOn && fv > 0) extra += '
Taxa Casei de Producție (' + feePct + '%)€' + fv.toLocaleString() + '
';
var companyBlock = companyName
? '
Companie' + companyName + '
'
: '';
var doc = '
' + defaultTitle + ''
+ '
' + defaultTitle + '
'
+ (companyName ? '
' + companyName + '
' : '')
+ '
Generat pe ' + dateStr + ' la ' + timeStr + '
'
+ '
'
+ companyBlock
+ sections
+ '
Costuri de Producție€' + prod.toLocaleString() + '
' + extra + '
TOTAL PRODUCTION€' + total.toLocaleString() + '
'
+ '
Apasă butonul → alege „Salvează ca PDF" → Salvează
';
var win = window.open('', '_blank');
if (win) { win.document.write(doc); win.document.close(); }
else { var blob = new Blob([doc], { type: 'text/html;charset=utf-8' }); var url = URL.createObjectURL(blob); var a = document.createElement('a'); a.href = url; a.download = defaultTitle.replace(/\s+/g, '-') + (companyName ? '-' + companyName.replace(/\s+/g, '-') : '') + '-' + now.toISOString().slice(0, 10) + '.html'; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }
});
render();
return { open: openModal, close: closeModal };
}
/* ═══════════════════════════════════════
═══ CREATE BOTH CALCULATORS ═══
═══════════════════════════════════════ */
var calculators = {
spot: createCalc('modal-spot', spotDefault, 'Buget Spot Comercial'),
reels: createCalc('modal-reels', reelsDefault, 'Buget Reels & Social Media')
};
/* ═══ OPEN BUTTONS ═══ */
var openBtns = document.querySelectorAll('[data-calc-open]');
for (var i = 0; i < openBtns.length; i++) {
openBtns[i].addEventListener('click', function () {
var type = this.getAttribute('data-calc-open');
if (calculators[type]) calculators[type].open();
});
}
})();