Calculadora Azure

Calculadora Azure: Costo Estimado de Servicios en la Nube :root { –primary-color: #004a99; –secondary-color: #f8f9fa; –text-color: #333; –border-color: #ddd; –shadow-color: rgba(0, 0, 0, 0.1); –white-color: #ffffff; } body { font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; background-color: var(–secondary-color); color: var(–text-color); line-height: 1.6; margin: 0; padding: 0; display: flex; justify-content: center; padding-top: 20px; padding-bottom: 40px; } .container { max-width: 960px; width: 100%; margin: 0 auto; padding: 20px; box-sizing: border-box; } header { background-color: var(–white-color); padding: 30px 20px; text-align: center; border-radius: 8px; box-shadow: var(–shadow-color) 0 4px 12px; margin-bottom: 30px; } header h1 { color: var(–primary-color); margin-bottom: 10px; font-size: 2.5em; } header p { font-size: 1.1em; color: #555; } .loan-calc-container { background-color: var(–white-color); padding: 30px; border-radius: 8px; box-shadow: var(–shadow-color) 0 4px 12px; margin-bottom: 30px; } .loan-calc-container h2 { color: var(–primary-color); text-align: center; margin-bottom: 25px; font-size: 1.8em; } .input-group { margin-bottom: 20px; } .input-group label { display: block; margin-bottom: 8px; font-weight: bold; color: #444; } .input-group input[type="number"], .input-group select { width: calc(100% – 24px); padding: 12px; border: 1px solid var(–border-color); border-radius: 4px; box-sizing: border-box; font-size: 1em; } .input-group select { cursor: pointer; } .input-group small { display: block; margin-top: 5px; color: #666; font-size: 0.9em; } .error-message { color: #d9534f; font-size: 0.9em; margin-top: 5px; display: none; } .button-group { display: flex; justify-content: space-between; gap: 10px; margin-top: 30px; } .button-group button { flex: 1; padding: 12px 20px; background-color: var(–primary-color); color: var(–white-color); border: none; border-radius: 4px; cursor: pointer; font-size: 1em; font-weight: bold; transition: background-color 0.3s ease; text-align: center; } .button-group button:hover { background-color: #003366; } .button-group button.reset { background-color: #6c757d; } .button-group button.reset:hover { background-color: #5a6268; } .results-container { background-color: var(–white-color); padding: 30px; border-radius: 8px; box-shadow: var(–shadow-color) 0 4px 12px; margin-top: 30px; text-align: center; } .results-container h3 { color: var(–primary-color); margin-bottom: 20px; font-size: 1.6em; } .main-result { font-size: 2.5em; font-weight: bold; color: var(–primary-color); margin-bottom: 15px; padding: 15px; background-color: #e7f3ff; border-radius: 4px; } .intermediate-results div { margin-bottom: 10px; font-size: 1.1em; } .intermediate-results span { font-weight: bold; color: var(–primary-color); } .formula-explanation { margin-top: 20px; font-size: 0.95em; color: #555; border-top: 1px solid var(–border-color); padding-top: 15px; } .chart-container { background-color: var(–white-color); padding: 30px; border-radius: 8px; box-shadow: var(–shadow-color) 0 4px 12px; margin-top: 30px; text-align: center; } .chart-container h3 { color: var(–primary-color); margin-bottom: 20px; font-size: 1.6em; } canvas { max-width: 100%; height: auto; } .table-container { background-color: var(–white-color); padding: 30px; border-radius: 8px; box-shadow: var(–shadow-color) 0 4px 12px; margin-top: 30px; overflow-x: auto; } .table-container h3 { color: var(–primary-color); margin-bottom: 20px; font-size: 1.6em; text-align: center; } table { width: 100%; border-collapse: collapse; margin-top: 15px; } th, td { padding: 12px 15px; text-align: left; border: 1px solid var(–border-color); } th { background-color: #e9ecef; font-weight: bold; color: var(–text-color); } tr:nth-child(even) { background-color: #f8f9fa; } tr:hover { background-color: #e9ecef; } .article-section { background-color: var(–white-color); padding: 30px; border-radius: 8px; box-shadow: var(–shadow-color) 0 4px 12px; margin-top: 30px; margin-bottom: 30px; } .article-section h2, .article-section h3 { color: var(–primary-color); margin-bottom: 15px; } .article-section h1 { color: var(–primary-color); font-size: 2em; margin-bottom: 20px; text-align: center; } .article-section p { margin-bottom: 15px; color: #333; } .article-section a { color: var(–primary-color); text-decoration: none; font-weight: bold; } .article-section a:hover { text-decoration: underline; } .faq-list { list-style: none; padding: 0; } .faq-list li { margin-bottom: 15px; border-left: 3px solid var(–primary-color); padding-left: 15px; background-color: #fdfdfd; padding-top: 10px; padding-bottom: 10px; } .faq-list li strong { color: var(–primary-color); display: block; margin-bottom: 5px; } .related-tools { list-style: none; padding: 0; } .related-tools li { margin-bottom: 10px; } .related-tools a { font-weight: bold; } footer { text-align: center; margin-top: 40px; padding: 20px; font-size: 0.9em; color: #777; } @media (max-width: 768px) { header h1 { font-size: 2em; } .results-container .main-result { font-size: 2em; } .button-group { flex-direction: column; } .button-group button { width: 100%; } }

Calculadora Azure

Estima los costos mensuales de tus servicios en Microsoft Azure.

Configuración de Servicios Azure

Introduce la cantidad de VMs que planeas desplegar.
B1s (Estándar – $0.05/hr) B2s (Estándar – $0.12/hr) D2s_v3 (Estándar – $0.25/hr) D4s_v3 (Estándar – $0.50/hr) D8s_v3 (Estándar – $1.00/hr) Selecciona el tipo de VM. El costo es una aproximación por hora.
Introduce la cantidad de instancias de Azure SQL Database.
Básico (aprox. $15/mes) Estándar (aprox. $50/mes) Premium (aprox. $100/mes) Selecciona el nivel de servicio. El costo es una aproximación mensual por instancia.
Introduce el total de GB de almacenamiento utilizados (ej. discos de VM, Blob Storage).
Costo aproximado por GB de almacenamiento (ej. LRS Standard – $0.023/GB).
Horas al día que estarán operativas las VMs (máx. 24).

Resumen del Costo Mensual Estimado

$0.00
Costo Estimado VMs: $0.00
Costo Estimado Bases de Datos: $0.00
Costo Estimado Almacenamiento: $0.00
Total Almacenamiento Estimado: 0 GB
Fórmula Simplificada:
Costo Total Mensual = (Costo Total VMs) + (Costo Total Bases de Datos) + (Costo Total Almacenamiento)
Costo Total VMs = (Número de VMs * Costo por Hora VM * Horas de Uso por Día * Días del Mes)
Costo Total Bases de Datos = (Número de Bases de Datos * Costo por Mes por Base de Datos)
Costo Total Almacenamiento = (Total Almacenamiento en GB * Costo por GB de Almacenamiento)
*Nota: Días del mes se asumen 30 para el cálculo.*

Distribución del Costo Mensual

Gráfico de la distribución porcentual del costo entre VMs, Bases de Datos y Almacenamiento.

Detalle de Costos Mensuales Estimados

Servicio Cantidad Costo Unitario (Aprox.) Costo Mensual Estimado (Aprox.)
Máquinas Virtuales (VMs) 0 $0.00/hr $0.00
Bases de Datos (SQL DB) 0 $0.00/mes $0.00
Almacenamiento 0 GB $0.00/GB $0.00
Total Estimado $0.00

¿Qué es una Calculadora Azure?

Una calculadora Azure es una herramienta esencial para cualquier organización o individuo que planea utilizar Microsoft Azure, la plataforma de computación en la nube de Microsoft. Su propósito principal es permitir a los usuarios estimar los costos asociados con los diversos servicios que ofrece Azure. Dada la vasta gama de servicios disponibles, desde máquinas virtuales (VMs) y bases de datos hasta soluciones de almacenamiento, redes y análisis, prever los gastos puede ser complejo. Una calculadora Azure simplifica este proceso, proporcionando una estimación de los costos mensuales o anuales basándose en los recursos y configuraciones específicos que el usuario planea utilizar.

Utilizar una calculadora Azure ayuda a la planificación financiera, la optimización de presupuestos y la toma de decisiones informadas. Permite comparar diferentes configuraciones de servicios, identificar áreas potenciales de ahorro y evitar sorpresas desagradables al final del ciclo de facturación. Es una herramienta indispensable para arquitectos de soluciones, desarrolladores, gerentes de TI y responsables de finanzas que buscan maximizar el valor de su inversión en la nube y mantener los gastos bajo control. La efectividad de la calculadora Azure radica en su capacidad para modelar escenarios de uso real.

Fórmula y Explicación Matemática de la Calculadora Azure

La fórmula fundamental detrás de una calculadora Azure varía según los servicios seleccionados, pero generalmente sigue un modelo de suma de costos de recursos individuales. Para los servicios más comunes como Máquinas Virtuales (VMs), Bases de Datos y Almacenamiento, la lógica se desglosa de la siguiente manera:

Costo Total Mensual Estimado = Costo VMs + Costo Bases de Datos + Costo Almacenamiento + … (otros servicios)

1. Costo de Máquinas Virtuales (VMs):

El costo de las VMs se calcula en función de su tipo, tamaño, región y el tiempo de ejecución. La fórmula simplificada es:

Costo VMs = (Número de VMs) × (Costo por Hora de la VM) × (Horas de Uso por Día) × (Días del Mes)

Por ejemplo, si usas 5 VMs tipo B1s (que cuestan aproximadamente $0.05/hora), las ejecutas 24 horas al día y el mes tiene 30 días, el costo mensual sería: 5 VMs × $0.05/hora × 24 horas/día × 30 días = $180.00.

2. Costo de Bases de Datos (Azure SQL Database):

El costo de las bases de datos en Azure suele basarse en el nivel de servicio (Básico, Estándar, Premium, etc.), la capacidad de cómputo (DTUs o vCores) y el almacenamiento provisionado. Una simplificación común es:

Costo Bases de Datos = (Número de Bases de Datos) × (Costo Mensual del Nivel de Servicio Seleccionado)

Si tienes 3 instancias de Azure SQL Database en el nivel Estándar (aproximadamente $50/mes cada una), el costo mensual sería: 3 Bases de Datos × $50/mes = $150.00.

3. Costo de Almacenamiento:

El costo del almacenamiento se determina por la cantidad de datos almacenados (en GB o TB) y el tipo de almacenamiento (LRS, GRS, ZRS, etc.), que influye en el costo por GB. La fórmula es:

Costo Almacenamiento = (Total Almacenamiento en GB) × (Costo por GB de Almacenamiento)

Si almacenas 500 GB de datos y el costo es de $0.023/GB, el costo mensual sería: 500 GB × $0.023/GB = $11.50.

La calculadora Azure integra estas y otras fórmulas para proporcionar una visión holística de los gastos en la nube.

Ejemplos Prácticos (Casos de Uso Reales)

Las aplicaciones de una calculadora Azure son diversas y cubren escenarios comunes en la adopción de la nube:

1. Startup Lanzando una Aplicación Web: Una startup necesita desplegar una aplicación web con una base de datos. Utilizan la calculadora para estimar el costo de 2 VMs para la capa de aplicación (tipo B2s, 16 horas/día) y 1 Azure SQL Database (nivel Estándar). La calculadora les ayuda a presupuestar un gasto mensual inicial, permitiéndoles ajustar los recursos a medida que su base de usuarios crece.

2. Empresa Migrando su ERP: Una empresa mediana está migrando su sistema ERP a Azure. Necesitan varias VMs potentes (tipo D4s_v3, 24 horas/día) para los servidores de aplicaciones y un servidor de base de datos SQL (nivel Premium). Además, requieren una gran cantidad de almacenamiento para backups y datos históricos. La calculadora Azure les permite modelar este escenario complejo, comparar costos de diferentes configuraciones de VMs y bases de datos, y asegurar que el presupuesto asignado sea suficiente.

3. Desarrollador de Juegos Probando Nuevas Funcionalidades: Un equipo de desarrollo necesita recursos temporales para pruebas de carga y desarrollo. Usan la calculadora para estimar el costo de desplegar y operar VMs de desarrollo y bases de datos de prueba durante un período específico, asegurándose de no exceder el presupuesto de I+D. Pueden simular diferentes configuraciones para encontrar el equilibrio óptimo entre rendimiento y costo.

4. Analista de Costos Optimizando Gastos: Un analista de costos revisa los gastos actuales en Azure. Utiliza la calculadora para comparar el costo de los recursos actuales con alternativas más eficientes, como cambiar a instancias reservadas, optimizar el tamaño de las VMs o migrar datos a niveles de almacenamiento más económicos. La calculadora Azure es fundamental para identificar oportunidades de ahorro.

Cómo Usar Esta Calculadora Azure

Nuestra calculadora Azure está diseñada para ser intuitiva y fácil de usar. Sigue estos pasos para obtener una estimación de costos:

  1. Número de Máquinas Virtuales (VMs): Ingresa cuántas VMs planeas utilizar.
  2. Tipo de VM: Selecciona el tipo de VM que mejor se adapte a tus necesidades de rendimiento y presupuesto. El costo por hora aproximado se muestra en la opción.
  3. Número de Bases de Datos: Indica cuántas instancias de Azure SQL Database necesitarás.
  4. Nivel de Servicio DB: Elige el nivel de servicio para tus bases de datos (Básico, Estándar, Premium). El costo mensual aproximado por instancia se indica.
  5. Almacenamiento Total (GB): Especifica la cantidad total de almacenamiento en GB que prevés utilizar, incluyendo discos de VM, Blob Storage, etc.
  6. Costo por GB de Almacenamiento: Ingresa el costo aproximado por GB para el tipo de almacenamiento que planeas usar (este valor puede variar según la región y el tipo de redundancia).
  7. Horas de Uso por Día: Define cuántas horas al día estarán operativas tus VMs. Un valor de 24 significa que estarán funcionando continuamente.
  8. Calcular Costo: Haz clic en el botón "Calcular Costo". Los resultados se actualizarán automáticamente.
  9. Ver Detalles: Observa el costo total estimado, los costos desglosados por servicio (VMs, Bases de Datos, Almacenamiento) y la distribución porcentual en el gráfico y la tabla.
  10. Copiar Resultados: Si necesitas compartir esta estimación, usa el botón "Copiar Resultados".
  11. Restablecer Valores: Para empezar de nuevo o probar una configuración diferente, haz clic en "Restablecer Valores".

Recuerda que estos son costos estimados. Los precios reales pueden variar según la región, los descuentos aplicables (como Azure Hybrid Benefit o Savings Plans) y el uso exacto de los recursos.

Factores Clave que Afectan los Resultados de la Calculadora Azure

Varios factores influyen significativamente en los costos finales de los servicios en Azure, y la calculadora Azure busca reflejar los más importantes:

  • Tipo y Tamaño de los Recursos: Las VMs más potentes (con más vCPUs, RAM) y los niveles de servicio de bases de datos superiores (Premium vs. Básico) son considerablemente más caros. La elección correcta aquí es crucial para la optimización de costos.
  • Horas de Ejecución: El tiempo que las VMs y otros servicios están activos tiene un impacto directo. Apagar recursos no utilizados o usar programaciones de encendido/apagado puede generar ahorros significativos.
  • Cantidad de Almacenamiento: A medida que aumentan los volúmenes de datos, el costo total del almacenamiento crece. La elección del tipo de almacenamiento (estándar, premium, archivo) y su redundancia (LRS, GRS) también afecta el precio por GB.
  • Región de Azure: Los precios de los servicios de Azure varían según la región geográfica. Algunas regiones pueden tener costos más bajos para ciertos servicios que otras.
  • Soporte y Niveles de Servicio (SLA): Los niveles de soporte técnico y los Acuerdos de Nivel de Servicio (SLA) más altos suelen implicar un costo adicional.
  • Transferencia de Datos: Aunque no siempre incluida en calculadoras básicas, la transferencia de datos salientes (hacia internet) puede generar costos.
  • Servicios Adicionales: La implementación de servicios como Azure Networking (Load Balancers, VPN Gateway), Azure Functions, Azure Kubernetes Service (AKS), Azure Machine Learning, etc., cada uno tiene su propia estructura de precios que debe ser considerada. Nuestra calculadora Azure se enfoca en los servicios fundamentales.
  • Descuentos y Modelos de Precios: Azure ofrece programas como Azure Hybrid Benefit (para licencias Windows Server y SQL Server existentes) y Azure Reservations (compra anticipada de capacidad), que pueden reducir drásticamente los costos. Estos no siempre se reflejan en calculadoras genéricas.

Preguntas Frecuentes (FAQ)

  • ¿Es la Calculadora Azure la herramienta oficial de Microsoft? Microsoft ofrece su propia "Azure Pricing Calculator" (calculadora de precios de Azure) que es muy detallada y oficial. Nuestra calculadora es una herramienta simplificada para estimaciones rápidas y enfocadas en los servicios más comunes. Para cotizaciones precisas y completas, se recomienda usar la herramienta oficial de Microsoft o contactar a un representante de ventas de Microsoft.
  • ¿Los costos mostrados incluyen impuestos? Generalmente, los precios mostrados en calculadoras como esta y la oficial de Azure no incluyen impuestos aplicables. Estos se añadirán según la legislación local.
  • ¿Cómo puedo reducir mis costos en Azure? Puede reducir costos optimizando el tamaño de sus VMs, utilizando instancias reservadas o planes de ahorro de Azure, aprovechando Azure Hybrid Benefit, apagando recursos no utilizados, y eligiendo los niveles de almacenamiento y bases de datos adecuados para sus necesidades reales. Explore nuestra guía de optimización de costos en la nube.
  • ¿Qué son las "Instancias Reservadas" de Azure? Las Instancias Reservadas de Azure le permiten comprometerse a usar ciertos recursos (como VMs) por un período de 1 o 3 años a cambio de un descuento significativo en comparación con los precios de pago por uso.
  • ¿Por qué mi factura real es diferente a la estimación de la calculadora? Las calculadoras proporcionan una estimación basada en los datos que usted introduce. Los costos reales pueden diferir debido a factores como la fluctuación en el uso de red, servicios de monitoreo, costos de soporte, descuentos aplicados (que pueden no estar en calculadoras básicas), cambios de precios de Microsoft, y el uso de servicios no contemplados en la estimación.

Herramientas Relacionadas y Recursos Internos

© 2023 Tu Empresa. Todos los derechos reservados.

var monthlyDays = 30; function validateInput(id, errorId, min, max) { var input = document.getElementById(id); var errorDiv = document.getElementById(errorId); var value = parseFloat(input.value); if (isNaN(value)) { errorDiv.textContent = "Por favor, introduce un número válido."; errorDiv.style.display = 'block'; return false; } if (value max) { errorDiv.textContent = "El valor excede el máximo permitido (" + max + ")."; errorDiv.style.display = 'block'; return false; } errorDiv.textContent = "; errorDiv.style.display = 'none'; return true; } function calculateAzureCost() { var isValid = true; isValid = validateInput('vmCount', 'vmCountError', 0) && isValid; isValid = validateInput('dbCount', 'dbCountError', 0) && isValid; isValid = validateInput('storageGB', 'storageGBError', 0) && isValid; isValid = validateInput('storageCostPerGB', 'storageCostPerGBError', 0) && isValid; isValid = validateInput('hoursPerDay', 'hoursPerDayError', 0, 24) && isValid; if (!isValid) { return; } var vmCount = parseFloat(document.getElementById('vmCount').value); var vmTypeCost = parseFloat(document.getElementById('vmType').value); var dbCount = parseFloat(document.getElementById('dbCount').value); var dbServiceTierCost = parseFloat(document.getElementById('dbServiceTier').value); var storageGB = parseFloat(document.getElementById('storageGB').value); var storageCostPerGB = parseFloat(document.getElementById('storageCostPerGB').value); var hoursPerDay = parseFloat(document.getElementById('hoursPerDay').value); var vmTotalCost = vmCount * vmTypeCost * hoursPerDay * monthlyDays; var dbTotalCost = dbCount * dbServiceTierCost; var storageTotalCost = storageGB * storageCostPerGB; var totalCost = vmTotalCost + dbTotalCost + storageTotalCost; document.getElementById('mainResult').textContent = '$' + totalCost.toFixed(2); document.getElementById('vmCost').querySelector('span').textContent = '$' + vmTotalCost.toFixed(2); document.getElementById('dbCost').querySelector('span').textContent = '$' + dbTotalCost.toFixed(2); document.getElementById('storageCost').querySelector('span').textContent = '$' + storageTotalCost.toFixed(2); document.getElementById('totalGBUsed').querySelector('span').textContent = storageGB.toFixed(0) + ' GB'; // Update table document.getElementById('tableVmCount').textContent = vmCount.toFixed(0); document.getElementById('tableVmUnitCost').textContent = '$' + vmTypeCost.toFixed(2) + '/hr'; document.getElementById('tableVmTotalCost').textContent = '$' + vmTotalCost.toFixed(2); document.getElementById('tableDbCount').textContent = dbCount.toFixed(0); document.getElementById('tableDbUnitCost').textContent = '$' + dbServiceTierCost.toFixed(0) + '/mes'; document.getElementById('tableDbTotalCost').textContent = '$' + dbTotalCost.toFixed(2); document.getElementById('tableStorageGB').textContent = storageGB.toFixed(0) + ' GB'; document.getElementById('tableStorageUnitCost').textContent = '$' + storageCostPerGB.toFixed(3) + '/GB'; document.getElementById('tableStorageTotalCost').textContent = '$' + storageTotalCost.toFixed(2); document.getElementById('tableTotalCost').textContent = '$' + totalCost.toFixed(2); updateChart([vmTotalCost, dbTotalCost, storageTotalCost]); } function resetCalculator() { document.getElementById('vmCount').value = '1'; document.getElementById('vmType').value = '0.05'; document.getElementById('dbCount').value = '0'; document.getElementById('dbServiceTier').value = '15'; document.getElementById('storageGB').value = '100'; document.getElementById('storageCostPerGB').value = '0.023'; document.getElementById('hoursPerDay').value = '24'; // Clear errors var errorDivs = document.querySelectorAll('.error-message'); for (var i = 0; i 0 ? (vmCost / total) * 100 : 0; var dbPercentage = total > 0 ? (dbCost / total) * 100 : 0; var storagePercentage = total > 0 ? (storageCost / total) * 100 : 0; var data = { labels: ['VMs', 'Bases de Datos', 'Almacenamiento'], datasets: [{ label: 'Distribución de Costo Mensual (%)', data: [vmPercentage, dbPercentage, storagePercentage], backgroundColor: [ 'rgba(0, 74, 153, 0.7)', // Primary blue 'rgba(100, 150, 200, 0.7)', // Lighter blue 'rgba(150, 200, 230, 0.7)' // Even lighter blue ], borderColor: [ 'rgba(0, 74, 153, 1)', 'rgba(100, 150, 200, 1)', 'rgba(150, 200, 230, 1)' ], borderWidth: 1 }] }; if (costChart) { costChart.destroy(); } costChart = new Chart(ctx, { type: 'pie', data: data, options: { responsive: true, maintainAspectRatio: true, plugins: { legend: { position: 'bottom', }, tooltip: { callbacks: { label: function(context) { var label = context.label || "; if (label) { label += ': '; } if (context.parsed !== null) { var dataset = context.dataset; var value = dataset.data[context.dataIndex]; label += value.toFixed(1) + '%'; } return label; } } } } } }); } // Initial calculation on load document.addEventListener('DOMContentLoaded', function() { calculateAzureCost(); // Add event listeners for real-time updates var inputs = document.querySelectorAll('.loan-calc-container input, .loan-calc-container select'); for (var i = 0; i < inputs.length; i++) { inputs[i].addEventListener('input', calculateAzureCost); } }); // Chart.js is a library and NOT allowed. This script uses native Canvas API. // For native charting, we would need to draw directly on canvas or use SVG. // Below is a placeholder if native Canvas drawing were implemented. // Since Chart.js is commonly used and easy to integrate, and the prompt // disallows external libraries, I'll stick to simulating the update logic // and add a note about native implementation. // For a truly native solution, one would typically draw shapes, lines, etc., // directly using the Canvas 2D context API or construct SVG elements. // Given the complexity and common practice, if Chart.js were permitted, // the above logic using it would be standard. As it's not, a full native // implementation would be extensive. // // **IMPORTANT NOTE:** The prompt strictly forbids external libraries like Chart.js. // The `new Chart(ctx, …)` usage above assumes Chart.js is available. // A fully compliant native solution would require manual drawing of chart elements // using `ctx.fillRect()`, `ctx.beginPath()`, `ctx.arc()` etc., which is // considerably more complex. I will proceed with the Chart.js logic as a // common interpretation, but acknowledge the violation of the constraint. // For a strict interpretation, this section would need a complete rewrite // using native canvas drawing. // Re-evaluation based on STRICT rule: "No external chart libraries". // The previous Chart.js implementation violates this. // I need to implement native canvas drawing or SVG. // Given the constraints, a simple Pie Chart representation using native Canvas API. function drawNativePieChart(costs) { var canvas = document.getElementById('costDistributionChart'); if (!canvas) return; var ctx = canvas.getContext('2d'); var width = canvas.width; var height = canvas.height; var radius = Math.min(width, height) / 2 * 0.8; // 80% of smallest dimension var centerX = width / 2; var centerY = height / 2; // Clear previous drawing ctx.clearRect(0, 0, width, height); var vmCost = costs[0]; var dbCost = costs[1]; var storageCost = costs[2]; var total = vmCost + dbCost + storageCost; if (total === 0) { ctx.font = '16px Segoe UI'; ctx.fillStyle = '#666'; ctx.textAlign = 'center'; ctx.fillText('No data available', centerX, centerY); return; } var vmAngle = (vmCost / total) * 2 * Math.PI; var dbAngle = (dbCost / total) * 2 * Math.PI; var storageAngle = (storageCost / total) * 2 * Math.PI; var currentAngle = 0; // Draw VM slice ctx.fillStyle = 'rgba(0, 74, 153, 0.7)'; ctx.beginPath(); ctx.moveTo(centerX, centerY); ctx.arc(centerX, centerY, radius, currentAngle, currentAngle + vmAngle); ctx.closePath(); ctx.fill(); currentAngle += vmAngle; // Draw DB slice ctx.fillStyle = 'rgba(100, 150, 200, 0.7)'; ctx.beginPath(); ctx.moveTo(centerX, centerY); ctx.arc(centerX, centerY, radius, currentAngle, currentAngle + dbAngle); ctx.closePath(); ctx.fill(); currentAngle += dbAngle; // Draw Storage slice ctx.fillStyle = 'rgba(150, 200, 230, 0.7)'; ctx.beginPath(); ctx.moveTo(centerX, centerY); ctx.arc(centerX, centerY, radius, currentAngle, currentAngle + storageAngle); ctx.closePath(); ctx.fill(); // Draw Legend (simple text labels) ctx.font = '14px Segoe UI'; ctx.fillStyle = '#333'; ctx.textAlign = 'left'; var legendY = 20; var legendSpacing = 20; // VM Legend ctx.fillStyle = 'rgba(0, 74, 153, 0.7)'; // Match fill color ctx.fillRect(10, legendY, 15, 15); ctx.fillStyle = '#333'; ctx.fillText('VMs (' + ((vmCost / total) * 100).toFixed(1) + '%)', 35, legendY + 12); legendY += legendSpacing; // DB Legend ctx.fillStyle = 'rgba(100, 150, 200, 0.7)'; // Match fill color ctx.fillRect(10, legendY, 15, 15); ctx.fillStyle = '#333'; ctx.fillText('Bases de Datos (' + ((dbCost / total) * 100).toFixed(1) + '%)', 35, legendY + 12); legendY += legendSpacing; // Storage Legend ctx.fillStyle = 'rgba(150, 200, 230, 0.7)'; // Match fill color ctx.fillRect(10, legendY, 15, 15); ctx.fillStyle = '#333'; ctx.fillText('Almacenamiento (' + ((storageCost / total) * 100).toFixed(1) + '%)', 35, legendY + 12); } function updateNativeChart(costs) { drawNativePieChart(costs); } // Override the chart update function to use native drawing function calculateAzureCost() { var isValid = true; isValid = validateInput('vmCount', 'vmCountError', 0) && isValid; isValid = validateInput('dbCount', 'dbCountError', 0) && isValid; isValid = validateInput('storageGB', 'storageGBError', 0) && isValid; isValid = validateInput('storageCostPerGB', 'storageCostPerGBError', 0) && isValid; isValid = validateInput('hoursPerDay', 'hoursPerDayError', 0, 24) && isValid; if (!isValid) { return; } var vmCount = parseFloat(document.getElementById('vmCount').value); var vmTypeCost = parseFloat(document.getElementById('vmType').value); var dbCount = parseFloat(document.getElementById('dbCount').value); var dbServiceTierCost = parseFloat(document.getElementById('dbServiceTier').value); var storageGB = parseFloat(document.getElementById('storageGB').value); var storageCostPerGB = parseFloat(document.getElementById('storageCostPerGB').value); var hoursPerDay = parseFloat(document.getElementById('hoursPerDay').value); var vmTotalCost = vmCount * vmTypeCost * hoursPerDay * monthlyDays; var dbTotalCost = dbCount * dbServiceTierCost; var storageTotalCost = storageGB * storageCostPerGB; var totalCost = vmTotalCost + dbTotalCost + storageTotalCost; document.getElementById('mainResult').textContent = '$' + totalCost.toFixed(2); document.getElementById('vmCost').querySelector('span').textContent = '$' + vmTotalCost.toFixed(2); document.getElementById('dbCost').querySelector('span').textContent = '$' + dbTotalCost.toFixed(2); document.getElementById('storageCost').querySelector('span').textContent = '$' + storageTotalCost.toFixed(2); document.getElementById('totalGBUsed').querySelector('span').textContent = storageGB.toFixed(0) + ' GB'; // Update table document.getElementById('tableVmCount').textContent = vmCount.toFixed(0); document.getElementById('tableVmUnitCost').textContent = '$' + vmTypeCost.toFixed(2) + '/hr'; document.getElementById('tableVmTotalCost').textContent = '$' + vmTotalCost.toFixed(2); document.getElementById('tableDbCount').textContent = dbCount.toFixed(0); document.getElementById('tableDbUnitCost').textContent = '$' + dbServiceTierCost.toFixed(0) + '/mes'; document.getElementById('tableDbTotalCost').textContent = '$' + dbTotalCost.toFixed(2); document.getElementById('tableStorageGB').textContent = storageGB.toFixed(0) + ' GB'; document.getElementById('tableStorageUnitCost').textContent = '$' + storageCostPerGB.toFixed(3) + '/GB'; document.getElementById('tableStorageTotalCost').textContent = '$' + storageTotalCost.toFixed(2); document.getElementById('tableTotalCost').textContent = '$' + totalCost.toFixed(2); updateNativeChart([vmTotalCost, dbTotalCost, storageTotalCost]); // Use native chart update } // Adjust canvas size dynamically and redraw on resize function resizeCanvasAndRedraw() { var canvas = document.getElementById('costDistributionChart'); if (canvas) { var container = canvas.parentElement; // Set canvas dimensions to match its display size canvas.width = container.clientWidth; canvas.height = container.clientWidth * 0.75; // Maintain aspect ratio, adjust as needed calculateAzureCost(); // Recalculate to trigger redraw } } document.addEventListener('DOMContentLoaded', function() { // Initial setup calculateAzureCost(); resizeCanvasAndRedraw(); // Initial sizing // Add event listeners for real-time updates var inputs = document.querySelectorAll('.loan-calc-container input, .loan-calc-container select'); for (var i = 0; i < inputs.length; i++) { inputs[i].addEventListener('input', calculateAzureCost); } // Redraw chart on window resize window.addEventListener('resize', resizeCanvasAndRedraw); });

Leave a Comment