Calculadora de Ventas de Tickets + Fees + Temporalidad - Boltick
About this app
Calculadora de Ventas de Tickets + Fees + Temporalidad - Boltick Calculadora de Ventas de Tickets + Fees + Temporalidad Parámetros Globales Impuesto Crédito/Debito (%) Ingresos Brutos (%) Base Ingresos Brutos Sobre Bruto Después Crédito/Debito Tasas Efectivas Tasa Instantánea: 0.00 Tasa 10 días: 0.00 Tasa 18 días: 0.00 Tasa 35 días: 0.00 Agregar Ítem Limpiar Todo Finalizar Ejercicio Cantidad Tipo Entrada Precio Original Markup (%) Total a Pagar Cantidad Total Crédito/Débito IIBB Resultado Ingreso Ticketera Ingreso Boltick Acciones Totales Total Cobrado: 0.00 Total Crédito/Débito: 0.00 Total IIBB: 0.00 Total Temporalidad: 0.00 Total Ticketera: 0.00 Total Boltick: 0.00 Margen Boltick (%): 0.00% Margen vs Ticketera (%): 0.00% Historial de Simulaciones
Related apps
Put this on your site
Source
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Calculadora de Ventas de Tickets + Fees + Temporalidad - Boltick</title>
<meta name="description" content="Disfruta de una calculadora interactiva para calcular las ventas de entradas con costos adicionales, impuestos y temporalidad. Aprende a gestionar tus ingresos de manera eficiente.">
<meta name="keywords" content="calculadora, ventas, tickets, fees, temporalidad, Boltick, impuesto, ingresos, automatización, web app">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.min.js" crossorigin="anonymous"></script>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@6.6.0/css/fontawesome.min.css" crossorigin="anonymous">
<script type="text/javascript">
document.addEventListener("DOMContentLoaded", function () {
const ivaSobreComisionTemporalidad = 0.21;
const tasasBase = {
instante: 0.0629,
"10d": 0.0439,
"18d": 0.0339,
"35d": 0.0149
};
let items = [
{ cantidad: 1, tipo_entrada: "Común", precio_original: 8000, markup_boltick: 0.15, temporalidad: "instante" },
{ cantidad: 5, tipo_entrada: "VIP", precio_original: 9500, markup_boltick: 0.15, temporalidad: "instante" },
{ cantidad: 1, tipo_entrada: "VIP", precio_original: 8000, markup_boltick: 0.15, temporalidad: "instante" }
];
const params = {
imp_credito_debito: 0.006,
ingresos_brutos: 0.02,
base_ingresos_brutos: "sobre_bruto"
};
const formatCurrency = (num) => {
return num.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ",");
};
const getEffectiveRates = () => {
return Object.keys(tasasBase).reduce((acc, key) => {
acc[key] = tasasBase[key] * (1 + ivaSobreComisionTemporalidad);
return acc;
}, {});
};
const updateTable = () => {
const table = $('#item-table tbody');
table.empty();
items.forEach((item, index) => {
const total_a_pagar = item.precio_original * (1 + item.markup_boltick);
const cantidad_total = total_a_pagar * item.cantidad;
const credito_debito = cantidad_total * params.imp_credito_debito;
const iibb = params.base_ingresos_brutos === "sobre_bruto" ? cantidad_total * params.ingresos_brutos : (cantidad_total - credito_debito) * params.ingresos_brutos;
const resultado = cantidad_total * getEffectiveRates()[item.temporalidad];
const ingreso_ticketera = item.precio_original * item.cantidad;
const ingreso_boltick = cantidad_total - credito_debito - iibb - resultado - ingreso_ticketera;
table.append(`
<tr>
<td><input type="number" min="0" value="${item.cantidad}" onchange="updateItem(${index}, 'cantidad', this.value)" ${isFinalized ? 'readonly' : ''}></td>
<td>
<select onchange="updateItem(${index}, 'temporalidad', this.value)" ${isFinalized ? 'disabled' : ''}>
<option value="instante" ${item.temporalidad === 'instante' ? 'selected' : ''}>instante</option>
<option value="10d" ${item.temporalidad === '10d' ? 'selected' : ''}>10 días</option>
<option value="18d" ${item.temporalidad === '18d' ? 'selected' : ''}>18 días</option>
<option value="35d" ${item.temporalidad === '35d' ? 'selected' : ''}>35 días</option>
</select>
</td>
<td><input type="text" value="${formatCurrency(item.precio_original.toFixed(2))}" onchange="updateItem(${index}, 'precio_original', parseFloat(this.value.replace(/,/g, '')))" onkeypress="return isNumberKey(event)" ${isFinalized ? 'readonly' : ''}></td>
<td><input type="number" min="0" max="1" step="0.01" value="${item.markup_boltick}" onchange="updateItem(${index}, 'markup_boltick', parseFloat(this.value))" ${isFinalized ? 'readonly' : ''}></td>
<td>${formatCurrency(total_a_pagar.toFixed(2))}</td>
<td>${formatCurrency(cantidad_total.toFixed(2))}</td>
<td>${formatCurrency(credito_debito.toFixed(2))}</td>
<td>${formatCurrency(iibb.toFixed(2))}</td>
<td>${formatCurrency(resultado.toFixed(2))}</td>
<td>${formatCurrency(ingreso_ticketera.toFixed(2))}</td>
<td>${formatCurrency(ingreso_boltick.toFixed(2))}</td>
<td><button class="btn btn-danger" onclick="removeItem(${index})" ${isFinalized ? 'disabled' : ''}>Eliminar</button></td>
</tr>
`);
});
updateTotals();
};
const getTotals = () => {
return items.reduce((acc, item) => {
const total_a_pagar = item.precio_original * (1 + item.markup_boltick) * item.cantidad;
const cantidad_total = total_a_pagar;
const credito_debito = cantidad_total * params.imp_credito_debito;
const iibb = params.base_ingresos_brutos === "sobre_bruto" ? cantidad_total * params.ingresos_brutos : (cantidad_total - credito_debito) * params.ingresos_brutos;
const resultado = cantidad_total * getEffectiveRates()[item.temporalidad];
const ingreso_ticketera = item.precio_original * item.cantidad;
const ingreso_boltick = cantidad_total - credito_debito - iibb - resultado - ingreso_ticketera;
acc.total_cobrado += cantidad_total;
acc.total_credito_debito += credito_debito;
acc.total_iibb += iibb;
acc.total_temporalidad += resultado;
acc.total_ticketera += ingreso_ticketera;
acc.total_boltick += ingreso_boltick;
return acc;
}, {
total_cobrado: 0,
total_credito_debito: 0,
total_iibb: 0,
total_temporalidad: 0,
total_ticketera: 0,
total_boltick: 0
});
};
const updateTotals = () => {
const totals = getTotals();
$('#total_cobrado').text(formatCurrency(totals.total_cobrado.toFixed(2)));
$('#total_credito_debito').text(formatCurrency(totals.total_credito_debito.toFixed(2)));
$('#total_iibb').text(formatCurrency(totals.total_iibb.toFixed(2)));
$('#total_temporalidad').text(formatCurrency(totals.total_temporalidad.toFixed(2)));
$('#total_ticketera').text(formatCurrency(totals.total_ticketera.toFixed(2)));
$('#total_boltick').text(formatCurrency(totals.total_boltick.toFixed(2)));
$('#margen_boltick_pct').text((totals.total_boltick / totals.total_cobrado * 100).toFixed(2) + '%');
$('#margen_vs_ticketera_pct').text((totals.total_boltick / totals.total_ticketera * 100).toFixed(2) + '%');
};
window.updateItem = (index, field, value) => {
if (isFinalized) return;
if (field === 'temporalidad') {
items[index].temporalidad = value;
} else {
items[index][field] = parseFloat(value);
}
updateTable();
};
window.removeItem = (index) => {
if (isFinalized) return;
items.splice(index, 1);
updateTable();
};
window.addItem = () => {
if (isFinalized) return;
items.push({ cantidad: 1, tipo_entrada: 'Común', precio_original: 8000, markup_boltick: 0.15, temporalidad: 'instante' });
updateTable();
};
$('#clear_button').click(() => {
if (isFinalized) return;
items = [];
updateTable();
});
let isFinalized = false;
$('#finalizar_button').click(() => {
isFinalized = true;
$('#parametros input, #parametros select, .btn').prop('disabled', true);
const snapshotDiv = `<div>${new Date().toLocaleString()}</div>`;
$('#snapshots').append(`<div class="snapshot">${snapshotDiv}</div>`);
});
const isNumberKey = (evt) => {
const charCode = (evt.which) ? evt.which : evt.keyCode;
return charCode >= 48 && charCode <= 57;
}
const prepareCSV = () => {
let output = '';
output += `Fecha/Hora,${new Date().toLocaleString()}\n`;
output += 'Cantidad,Tipo Entrada,Precio Original,Markup,Total a Pagar,Cantidad Total,Crédito/Débito,IIBB,Resultado,Ingreso Ticketera,Ingreso Boltick\n';
items.forEach(item => {
const total_a_pagar = item.precio_original * (1 + item.markup_boltick);
const cantidad_total = total_a_pagar * item.cantidad;
const credito_debito = cantidad_total * params.imp_credito_debito;
const iibb = params.base_ingresos_brutos === 'sobre_bruto' ? cantidad_total * params.ingresos_brutos : (cantidad_total - credito_debito) * params.ingresos_brutos;
const resultado = cantidad_total * getEffectiveRates()[item.temporalidad];
const ingreso_ticketera = item.precio_original * item.cantidad;
const ingreso_boltick = cantidad_total - credito_debito - iibb - resultado - ingreso_ticketera;
output += `${item.cantidad},${item.tipo_entrada},${item.precio_original},${item.markup_boltick},${total_a_pagar},${cantidad_total},${credito_debito},${iibb},${resultado},${ingreso_ticketera},${ingreso_boltick}\n`;
});
return output;
};
// Call to immediately set initial effective rates when the page loads
const effectiveRates = getEffectiveRates();
$('#tasa_instantanea_eff').text(formatCurrency(effectiveRates.instante));
$('#tasa_10d_eff').text(formatCurrency(effectiveRates["10d"]));
$('#tasa_18d_eff').text(formatCurrency(effectiveRates["18d"]));
$('#tasa_35d_eff').text(formatCurrency(effectiveRates["35d"]));
});
</script>
<style>
body {
background: linear-gradient(135deg, #f9f9f9 0%, #eaeaea 100%);
font-family: "Arial", sans-serif;
}
.card {
margin: 20px 0;
padding: 20px;
}
table {
width: 100%;
margin-top: 20px;
}
th, td {
text-align: center;
}
.btn {
margin: 2px;
}
#total-margins p {
font-weight: bold;
}
.snapshot {
margin: 10px 0;
padding: 10px;
background-color: #d4ffb8;
border-left: 5px solid #5cb85c;
}
</style>
</head>
<body>
<div id="main-container" class="container">
<h1 class="text-center my-4">Calculadora de Ventas de Tickets + Fees + Temporalidad</h1>
<div class="card" id="parametros">
<div class="card-body">
<div class="row">
<div class="col-md-6">
<h5>Parámetros Globales</h5>
<label>Impuesto Crédito/Debito (%)</label>
<input type="number" step="0.0001" id="imp_credito_debito" value="0.006" class="form-control" onchange="params.imp_credito_debito = parseFloat(this.value); updateTable()">
<label>Ingresos Brutos (%)</label>
<input type="number" step="0.0001" id="ingresos_brutos" value="0.02" class="form-control" onchange="params.ingresos_brutos = parseFloat(this.value); updateTable()">
<label>Base Ingresos Brutos</label>
<select id="base_ingresos_brutos" class="form-control" onchange="params.base_ingresos_brutos = this.value; updateTable()">
<option value="sobre_bruto">Sobre Bruto</option>
<option value="despues_credito_debito">Después Crédito/Debito</option>
</select>
</div>
<div class="col-md-6">
<h5>Tasas Efectivas</h5>
<div class="card">
<div class="card-body">
<p>Tasa Instantánea: <strong id="tasa_instantanea_eff">0.00</strong></p>
<p>Tasa 10 días: <strong id="tasa_10d_eff">0.00</strong></p>
<p>Tasa 18 días: <strong id="tasa_18d_eff">0.00</strong></p>
<p>Tasa 35 días: <strong id="tasa_35d_eff">0.00</strong></p>
</div>
</div>
</div>
</div>
<button class="btn btn-success" onclick="addItem()">Agregar Ítem</button>
<button class="btn btn-danger" id="clear_button">Limpiar Todo</button>
<button class="btn btn-primary" id="finalizar_button">Finalizar Ejercicio</button>
</div>
</div>
<table class="table table-bordered" id="item-table">
<thead>
<tr>
<th>Cantidad</th>
<th>Tipo Entrada</th>
<th>Precio Original</th>
<th>Markup (%)</th>
<th>Total a Pagar</th>
<th>Cantidad Total</th>
<th>Crédito/Débito</th>
<th>IIBB</th>
<th>Resultado</th>
<th>Ingreso Ticketera</th>
<th>Ingreso Boltick</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
<!-- Dynamic Rows Generated Here -->
</tbody>
</table>
<div class="card" id="total-margins">
<div class="card-body">
<h5>Totales</h5>
<p>Total Cobrado: <strong id="total_cobrado">0.00</strong></p>
<p>Total Crédito/Débito: <strong id="total_credito_debito">0.00</strong></p>
<p>Total IIBB: <strong id="total_iibb">0.00</strong></p>
<p>Total Temporalidad: <strong id="total_temporalidad">0.00</strong></p>
<p>Total Ticketera: <strong id="total_ticketera">0.00</strong></p>
<p>Total Boltick: <strong id="total_boltick">0.00</strong></p>
<p>Margen Boltick (%): <strong id="margen_boltick_pct">0.00%</strong></p>
<p>Margen vs Ticketera (%): <strong id="margen_vs_ticketera_pct">0.00%</strong></p>
</div>
</div>
<div id="snapshots" class="card">
<div class="card-body">
<h5>Historial de Simulaciones</h5>
</div>
</div>
</div>
</body>
</html>
NEW APPS
These are apps made by the community!