tecnova-crm / index.html
VedetteStore's picture
Add 1 files
cb6830f verified
<!DOCTYPE html>
<html lang="es">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Tecnova Ingeniería SAS - CRM</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
tailwind.config = {
darkMode: 'class',
theme: {
extend: {
colors: {
tecnovablue: '#1a4b8c',
tecnovagreen: '#2e856e',
tecnovagray: '#4a5568',
}
}
}
}
</script>
<style>
.sidebar {
transition: all 0.3s;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.sidebar-collapsed {
width: 70px;
}
.sidebar-expanded {
width: 250px;
}
.main-content {
transition: margin-left 0.3s;
}
.content-expanded {
margin-left: 250px;
}
.content-collapsed {
margin-left: 70px;
}
.chart-container {
position: relative;
height: 300px;
}
.progress-bar {
height: 6px;
border-radius: 3px;
}
.task-item:hover {
transform: translateY(-2px);
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}
.dark .sidebar {
background: linear-gradient(135deg, #4a56b7 0%, #5a3b8a 100%);
border-color: #334155;
}
.dark .sidebar a {
color: #e2e8f0;
}
.dark .sidebar a:hover {
background-color: rgba(255, 255, 255, 0.1);
}
.dark .sidebar .text-blue-200 {
color: rgba(255, 255, 255, 0.7);
}
.dark .sidebar .border-blue-700 {
border-color: rgba(255, 255, 255, 0.1);
}
.dark header {
background-color: #1e293b;
color: white;
}
.dark .bg-white {
background-color: #1e293b;
color: white;
}
.dark .bg-gray-100 {
background-color: #0f172a;
}
.dark .bg-gray-50 {
background-color: #1e293b;
}
.dark .text-gray-500 {
color: #94a3b8;
}
.dark .text-tecnovagray {
color: #e2e8f0;
}
.dark .border {
border-color: #334155;
}
.dark .task-item:hover {
background-color: #334155;
}
.dark .bg-gray-200 {
background-color: #334155;
}
.dark .bg-blue-100 {
background-color: #1e3a8a;
}
.dark .bg-green-100 {
background-color: #166534;
}
.dark .bg-purple-100 {
background-color: #5b21b6;
}
.dark .bg-orange-100 {
background-color: #9a3412;
}
.dark .bg-red-100 {
background-color: #991b1b;
}
.dark .bg-yellow-100 {
background-color: #854d0e;
}
/* New gradient sidebar styles */
.sidebar a {
color: rgba(255, 255, 255, 0.9);
transition: all 0.2s;
}
.sidebar a:hover {
background-color: rgba(255, 255, 255, 0.1);
}
.sidebar .text-blue-200 {
color: rgba(255, 255, 255, 0.7);
}
.sidebar .border-blue-700 {
border-color: rgba(255, 255, 255, 0.1);
}
.sidebar .active {
background-color: rgba(255, 255, 255, 0.15);
font-weight: 500;
}
.sidebar .divider {
color: rgba(255, 255, 255, 0.5);
}
/* Tab styles */
.tab-content {
display: none;
animation: fadeIn 0.3s ease-in-out;
}
@keyframes fadeIn {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.tab-content.active {
display: block;
}
.tab-button {
transition: all 0.2s;
}
.tab-button.active {
background-color: #1a4b8c;
color: white;
}
.dark .tab-button.active {
background-color: #2e856e;
}
/* Modal styles */
.modal {
transition: opacity 0.2s ease, visibility 0.2s ease;
}
.modal.active {
opacity: 1;
visibility: visible;
}
/* Table styles */
.data-table {
width: 100%;
border-collapse: collapse;
}
.data-table th {
text-align: left;
padding: 12px 15px;
background-color: #f8f9fa;
border-bottom: 2px solid #e9ecef;
}
.data-table td {
padding: 12px 15px;
border-bottom: 1px solid #e9ecef;
}
.data-table tr:hover {
background-color: #f8f9fa;
}
.dark .data-table th {
background-color: #1e293b;
border-bottom: 2px solid #334155;
}
.dark .data-table td {
border-bottom: 1px solid #334155;
}
.dark .data-table tr:hover {
background-color: #1e293b;
}
/* Status badges */
.status-badge {
padding: 4px 8px;
border-radius: 12px;
font-size: 12px;
font-weight: 500;
}
.status-active {
background-color: #d1fae5;
color: #065f46;
}
.status-pending {
background-color: #fef3c7;
color: #92400e;
}
.status-completed {
background-color: #dbeafe;
color: #1e40af;
}
.status-cancelled {
background-color: #fee2e2;
color: #991b1b;
}
.dark .status-active {
background-color: #064e3b;
color: #6ee7b7;
}
.dark .status-pending {
background-color: #92400e;
color: #fcd34d;
}
.dark .status-completed {
background-color: #1e40af;
color: #93c5fd;
}
.dark .status-cancelled {
background-color: #991b1b;
color: #fca5a5;
}
/* Bento Box Styles */
.bento-grid {
display: grid;
grid-template-columns: repeat(4, 1fr);
grid-template-rows: repeat(3, auto);
gap: 1.5rem;
}
.bento-card {
border-radius: 1rem;
padding: 1.5rem;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
transition: all 0.3s ease;
}
.bento-card:hover {
transform: translateY(-4px);
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
}
.bento-card-lg {
grid-column: span 2;
}
.bento-card-xl {
grid-column: span 2;
grid-row: span 2;
}
.bento-card-full {
grid-column: span 4;
}
.dark .bento-card {
background-color: #1e293b;
border: 1px solid #334155;
}
/* Client card styles */
.client-card {
transition: all 0.3s ease;
border-radius: 0.75rem;
}
.client-card:hover {
transform: translateY(-2px);
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
}
.client-avatar {
width: 48px;
height: 48px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
font-weight: bold;
color: white;
}
/* Map container */
.map-container {
height: 300px;
border-radius: 0.75rem;
overflow: hidden;
}
/* Client type indicator */
.client-type-indicator {
width: 12px;
height: 12px;
border-radius: 50%;
display: inline-block;
margin-right: 6px;
}
/* Custom scrollbar */
.custom-scrollbar::-webkit-scrollbar {
width: 6px;
height: 6px;
}
.custom-scrollbar::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 10px;
}
.custom-scrollbar::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 10px;
}
.dark .custom-scrollbar::-webkit-scrollbar-track {
background: #334155;
}
.dark .custom-scrollbar::-webkit-scrollbar-thumb {
background: #64748b;
}
/* Dashboard specific styles */
.metric-card {
transition: all 0.3s ease;
}
.metric-card:hover {
transform: translateY(-5px);
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
}
.activity-item {
transition: all 0.2s ease;
}
.activity-item:hover {
background-color: rgba(26, 75, 140, 0.05);
}
.dark .activity-item:hover {
background-color: rgba(255, 255, 255, 0.05);
}
.project-progress {
height: 6px;
border-radius: 3px;
}
.project-card:hover {
transform: translateY(-3px);
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
}
</style>
</head>
<body class="bg-gray-100 font-sans dark:bg-gray-900">
<div class="flex h-screen overflow-hidden">
<!-- Sidebar -->
<div id="sidebar" class="sidebar sidebar-expanded text-white flex flex-col">
<div class="p-4 flex items-center justify-between border-b border-white/10">
<div class="flex items-center">
<i class="fas fa-cogs text-2xl mr-3 text-white"></i>
<span id="logo-text" class="text-xl font-bold text-white">Tecnova</span>
</div>
<button id="toggle-sidebar" class="text-white focus:outline-none">
<i class="fas fa-bars"></i>
</button>
</div>
<div class="p-4 border-b border-white/10 flex items-center">
<div class="w-10 h-10 rounded-full bg-white/20 flex items-center justify-center mr-3">
<span class="text-white font-bold">AD</span>
</div>
<div id="user-info">
<p class="font-medium text-white">Admin User</p>
<p class="text-xs text-white/70">Administrador</p>
</div>
</div>
<nav class="flex-1 overflow-y-auto">
<div class="p-2">
<p class="text-xs uppercase text-white/50 px-3 py-2">Principal</p>
<a href="#" data-section="dashboard"
class="flex items-center px-3 py-3 text-white bg-white/20 rounded-lg mb-1 active">
<i class="fas fa-tachometer-alt mr-3"></i>
<span>Dashboard</span>
</a>
<a href="#" data-section="projects"
class="flex items-center px-3 py-3 text-white/80 hover:bg-white/10 rounded-lg mb-1">
<i class="fas fa-project-diagram mr-3"></i>
<span>Proyectos</span>
</a>
<a href="#" data-section="clients"
class="flex items-center px-3 py-3 text-white/80 hover:bg-white/10 rounded-lg mb-1">
<i class="fas fa-users mr-3"></i>
<span>Clientes</span>
</a>
<a href="#" data-section="tasks"
class="flex items-center px-3 py-3 text-white/80 hover:bg-white/10 rounded-lg mb-1">
<i class="fas fa-tasks mr-3"></i>
<span>Tareas</span>
</a>
</div>
<div class="p-2">
<p class="text-xs uppercase text-white/50 px-3 py-2">Operaciones</p>
<a href="#" data-section="invoicing"
class="flex items-center px-3 py-3 text-white/80 hover:bg-white/10 rounded-lg mb-1">
<i class="fas fa-file-invoice-dollar mr-3"></i>
<span>Facturación</span>
</a>
<a href="#" data-section="reports"
class="flex items-center px-3 py-3 text-white/80 hover:bg-white/10 rounded-lg mb-1">
<i class="fas fa-chart-line mr-3"></i>
<span>Reportes</span>
</a>
<a href="#" data-section="inventory"
class="flex items-center px-3 py-3 text-white/80 hover:bg-white/10 rounded-lg mb-1">
<i class="fas fa-boxes mr-3"></i>
<span>Inventario</span>
</a>
</div>
<div class="p-2">
<p class="text-xs uppercase text-white/50 px-3 py-2">Configuración</p>
<a href="#" data-section="settings"
class="flex items-center px-3 py-3 text-white/80 hover:bg-white/10 rounded-lg mb-1">
<i class="fas fa-cog mr-3"></i>
<span>Ajustes</span>
</a>
<a href="#" data-section="users"
class="flex items-center px-3 py-3 text-white/80 hover:bg-white/10 rounded-lg mb-1">
<i class="fas fa-user-shield mr-3"></i>
<span>Usuarios</span>
</a>
</div>
</nav>
<div class="p-4 border-t border-white/10">
<a href="#" class="flex items-center text-white/80 hover:text-white" id="logout-btn">
<i class="fas fa-sign-out-alt mr-3"></i>
<span>Cerrar sesión</span>
</a>
</div>
</div>
<!-- Main Content -->
<div id="main-content" class="main-content content-expanded flex-1 flex flex-col overflow-hidden">
<!-- Top Navigation -->
<header class="bg-white shadow-sm dark:bg-slate-800">
<div class="px-6 py-4 flex items-center justify-between">
<h1 id="page-title" class="text-2xl font-bold text-tecnovagray dark:text-white">Dashboard</h1>
<div class="flex items-center space-x-4">
<button id="theme-toggle" class="text-gray-500 dark:text-gray-400 hover:bg-gray-100 dark:hover:bg-gray-700 focus:outline-none rounded-lg text-sm p-2.5">
<i id="theme-icon" class="fas fa-moon"></i>
</button>
<div class="relative">
<button id="notifications-btn" class="text-gray-500 dark:text-gray-400 focus:outline-none">
<i class="fas fa-bell"></i>
<span class="absolute top-0 right-0 w-2 h-2 bg-red-500 rounded-full"></span>
</button>
</div>
<div class="relative">
<button id="messages-btn" class="text-gray-500 dark:text-gray-400 focus:outline-none">
<i class="fas fa-envelope"></i>
<span class="absolute top-0 right-0 w-2 h-2 bg-blue-500 rounded-full"></span>
</button>
</div>
<div class="relative">
<input type="text" placeholder="Buscar..." class="pl-10 pr-4 py-2 border rounded-lg focus:outline-none focus:ring-2 focus:ring-tecnovablue dark:bg-slate-700 dark:border-slate-600 dark:text-white dark:placeholder-gray-400">
<i class="fas fa-search absolute left-3 top-3 text-gray-400"></i>
</div>
</div>
</div>
</header>
<!-- Content Sections -->
<main class="flex-1 overflow-y-auto p-6 bg-gray-50 dark:bg-slate-900">
<!-- Dashboard Section -->
<div id="dashboard-section" class="tab-content active">
<!-- Welcome Banner -->
<div class="bg-gradient-to-r from-tecnovablue to-tecnovagreen text-white rounded-xl p-6 mb-6">
<div class="flex items-center justify-between">
<div>
<h2 class="text-2xl font-bold mb-2">Bienvenido de nuevo, Admin</h2>
<p class="opacity-90">Aquí tienes un resumen de las actividades recientes y métricas clave.</p>
</div>
<div class="hidden md:block">
<i class="fas fa-chart-line text-5xl opacity-30"></i>
</div>
</div>
</div>
<!-- Metrics Grid -->
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6 mb-6">
<!-- Total Revenue -->
<div class="metric-card bg-white dark:bg-slate-800 rounded-xl p-6 shadow-sm">
<div class="flex items-center justify-between">
<div>
<p class="text-gray-500 dark:text-gray-400">Ingresos Totales</p>
<h3 class="text-2xl font-bold text-tecnovablue dark:text-blue-400">$245.8M</h3>
</div>
<div class="p-3 rounded-full bg-blue-100 text-tecnovablue dark:bg-blue-900 dark:text-blue-400">
<i class="fas fa-dollar-sign text-xl"></i>
</div>
</div>
<div class="mt-4">
<div class="flex items-center justify-between text-sm">
<span class="text-gray-500 dark:text-gray-400">vs mes anterior</span>
<span class="font-medium text-green-500">+12.5%</span>
</div>
</div>
</div>
<!-- Active Projects -->
<div class="metric-card bg-white dark:bg-slate-800 rounded-xl p-6 shadow-sm">
<div class="flex items-center justify-between">
<div>
<p class="text-gray-500 dark:text-gray-400">Proyectos Activos</p>
<h3 class="text-2xl font-bold text-tecnovagreen dark:text-green-400">18</h3>
</div>
<div class="p-3 rounded-full bg-green-100 text-tecnovagreen dark:bg-green-900 dark:text-green-400">
<i class="fas fa-project-diagram text-xl"></i>
</div>
</div>
<div class="mt-4">
<div class="flex items-center justify-between text-sm">
<span class="text-gray-500 dark:text-gray-400">Completados: 5</span>
<span class="font-medium text-blue-500">72% en plazo</span>
</div>
</div>
</div>
<!-- Total Clients -->
<div class="metric-card bg-white dark:bg-slate-800 rounded-xl p-6 shadow-sm">
<div class="flex items-center justify-between">
<div>
<p class="text-gray-500 dark:text-gray-400">Clientes</p>
<h3 class="text-2xl font-bold text-purple-600 dark:text-purple-400">24</h3>
</div>
<div class="p-3 rounded-full bg-purple-100 text-purple-600 dark:bg-purple-900 dark:text-purple-400">
<i class="fas fa-users text-xl"></i>
</div>
</div>
<div class="mt-4">
<div class="flex items-center justify-between text-sm">
<span class="text-gray-500 dark:text-gray-400">Nuevos este mes: 3</span>
<span class="font-medium text-green-500">+8%</span>
</div>
</div>
</div>
<!-- Tasks Completed -->
<div class="metric-card bg-white dark:bg-slate-800 rounded-xl p-6 shadow-sm">
<div class="flex items-center justify-between">
<div>
<p class="text-gray-500 dark:text-gray-400">Tareas Completadas</p>
<h3 class="text-2xl font-bold text-orange-500 dark:text-orange-400">142</h3>
</div>
<div class="p-3 rounded-full bg-orange-100 text-orange-500 dark:bg-orange-900 dark:text-orange-400">
<i class="fas fa-check-circle text-xl"></i>
</div>
</div>
<div class="mt-4">
<div class="flex items-center justify-between text-sm">
<span class="text-gray-500 dark:text-gray-400">Pendientes: 28</span>
<span class="font-medium text-red-500">-5%</span>
</div>
</div>
</div>
</div>
<!-- Charts Row -->
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6 mb-6">
<!-- Revenue Chart -->
<div class="bg-white dark:bg-slate-800 rounded-xl p-6 shadow-sm">
<div class="flex items-center justify-between mb-4">
<h2 class="text-lg font-semibold text-tecnovagray dark:text-white">Ingresos Mensuales</h2>
<select class="text-sm border rounded-lg px-3 py-1 bg-white dark:bg-slate-700 dark:border-slate-600">
<option>2023</option>
<option>2022</option>
<option>2021</option>
</select>
</div>
<div class="chart-container">
<canvas id="revenueChart"></canvas>
</div>
</div>
<!-- Project Status Chart -->
<div class="bg-white dark:bg-slate-800 rounded-xl p-6 shadow-sm">
<div class="flex items-center justify-between mb-4">
<h2 class="text-lg font-semibold text-tecnovagray dark:text-white">Estado de Proyectos</h2>
<div class="flex space-x-2">
<button class="px-3 py-1 text-xs bg-tecnovablue text-white rounded dark:bg-blue-600">Todos</button>
<button class="px-3 py-1 text-xs bg-gray-200 text-gray-700 rounded dark:bg-gray-700 dark:text-gray-300">Activos</button>
</div>
</div>
<div class="chart-container">
<canvas id="projectStatusChart"></canvas>
</div>
</div>
</div>
<!-- Projects and Activity Row -->
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-6">
<!-- Active Projects -->
<div class="lg:col-span-2 bg-white dark:bg-slate-800 rounded-xl p-6 shadow-sm">
<div class="flex items-center justify-between mb-4">
<h2 class="text-lg font-semibold text-tecnovagray dark:text-white">Proyectos Activos</h2>
<a href="#" class="text-sm text-tecnovablue hover:underline dark:text-blue-400">Ver todos</a>
</div>
<div class="space-y-4">
<!-- Project 1 -->
<div class="project-card bg-gray-50 dark:bg-slate-700 rounded-lg p-4 transition-all">
<div class="flex items-start justify-between">
<div>
<h3 class="font-medium dark:text-white">Modernización Planta Energética</h3>
<p class="text-sm text-gray-500 dark:text-gray-400 mb-2">Energía Renovable SAS</p>
<div class="flex items-center text-sm">
<span class="text-gray-500 dark:text-gray-400 mr-3">Progreso: 65%</span>
<span class="text-blue-500">En plazo</span>
</div>
</div>
<span class="px-2 py-1 bg-blue-100 text-blue-800 rounded-full text-xs dark:bg-blue-900 dark:text-blue-400">Alta</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2 mt-3 dark:bg-gray-600">
<div class="project-progress bg-tecnovablue h-2 rounded-full" style="width: 65%"></div>
</div>
<div class="flex items-center justify-between mt-3 text-sm text-gray-500 dark:text-gray-400">
<span>Inicio: 15/03/2023</span>
<span>Fin: 30/11/2023</span>
</div>
</div>
<!-- Project 2 -->
<div class="project-card bg-gray-50 dark:bg-slate-700 rounded-lg p-4 transition-all">
<div class="flex items-start justify-between">
<div>
<h3 class="font-medium dark:text-white">Automatización Proceso Agroindustrial</h3>
<p class="text-sm text-gray-500 dark:text-gray-400 mb-2">Agropecuaria La Esperanza</p>
<div class="flex items-center text-sm">
<span class="text-gray-500 dark:text-gray-400 mr-3">Progreso: 42%</span>
<span class="text-yellow-500">En riesgo</span>
</div>
</div>
<span class="px-2 py-1 bg-green-100 text-green-800 rounded-full text-xs dark:bg-green-900 dark:text-green-400">Media</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2 mt-3 dark:bg-gray-600">
<div class="project-progress bg-tecnovagreen h-2 rounded-full" style="width: 42%"></div>
</div>
<div class="flex items-center justify-between mt-3 text-sm text-gray-500 dark:text-gray-400">
<span>Inicio: 01/05/2023</span>
<span>Fin: 15/12/2023</span>
</div>
</div>
<!-- Project 3 -->
<div class="project-card bg-gray-50 dark:bg-slate-700 rounded-lg p-4 transition-all">
<div class="flex items-start justify-between">
<div>
<h3 class="font-medium dark:text-white">Diseño Sistema HVAC</h3>
<p class="text-sm text-gray-500 dark:text-gray-400 mb-2">Constructora Edificar SAS</p>
<div class="flex items-center text-sm">
<span class="text-gray-500 dark:text-gray-400 mr-3">Progreso: 78%</span>
<span class="text-blue-500">En plazo</span>
</div>
</div>
<span class="px-2 py-1 bg-purple-100 text-purple-800 rounded-full text-xs dark:bg-purple-900 dark:text-purple-400">Baja</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2 mt-3 dark:bg-gray-600">
<div class="project-progress bg-purple-600 h-2 rounded-full" style="width: 78%"></div>
</div>
<div class="flex items-center justify-between mt-3 text-sm text-gray-500 dark:text-gray-400">
<span>Inicio: 10/02/2023</span>
<span>Fin: 30/09/2023</span>
</div>
</div>
</div>
</div>
<!-- Recent Activity -->
<div class="bg-white dark:bg-slate-800 rounded-xl p-6 shadow-sm">
<div class="flex items-center justify-between mb-4">
<h2 class="text-lg font-semibold text-tecnovagray dark:text-white">Actividad Reciente</h2>
<a href="#" class="text-sm text-tecnovablue hover:underline dark:text-blue-400">Ver todo</a>
</div>
<div class="space-y-4">
<!-- Activity 1 -->
<div class="activity-item p-3 rounded-lg">
<div class="flex items-start">
<div class="p-2 bg-blue-100 text-tecnovablue rounded-full mr-3 dark:bg-blue-900 dark:text-blue-400">
<i class="fas fa-file-invoice-dollar"></i>
</div>
<div>
<p class="font-medium dark:text-white">Factura #INV-2023-056 generada</p>
<p class="text-sm text-gray-500 dark:text-gray-400">Energía Renovable SAS - $12,450,000</p>
<p class="text-xs text-gray-400 dark:text-gray-500">Hace 2 horas</p>
</div>
</div>
</div>
<!-- Activity 2 -->
<div class="activity-item p-3 rounded-lg">
<div class="flex items-start">
<div class="p-2 bg-green-100 text-tecnovagreen rounded-full mr-3 dark:bg-green-900 dark:text-green-400">
<i class="fas fa-check-circle"></i>
</div>
<div>
<p class="font-medium dark:text-white">Tarea completada: Revisión diseño</p>
<p class="text-sm text-gray-500 dark:text-gray-400">Proyecto: Automatización Proceso Agroindustrial</p>
<p class="text-xs text-gray-400 dark:text-gray-500">Hace 5 horas</p>
</div>
</div>
</div>
<!-- Activity 3 -->
<div class="activity-item p-3 rounded-lg">
<div class="flex items-start">
<div class="p-2 bg-purple-100 text-purple-600 rounded-full mr-3 dark:bg-purple-900 dark:text-purple-400">
<i class="fas fa-user-plus"></i>
</div>
<div>
<p class="font-medium dark:text-white">Nuevo cliente agregado</p>
<p class="text-sm text-gray-500 dark:text-gray-400">Minera del Sur - Barranquilla</p>
<p class="text-xs text-gray-400 dark:text-gray-500">Ayer, 15:30</p>
</div>
</div>
</div>
<!-- Activity 4 -->
<div class="activity-item p-3 rounded-lg">
<div class="flex items-start">
<div class="p-2 bg-orange-100 text-orange-500 rounded-full mr-3 dark:bg-orange-900 dark:text-orange-400">
<i class="fas fa-exclamation-triangle"></i>
</div>
<div>
<p class="font-medium dark:text-white">Retraso en entrega detectado</p>
<p class="text-sm text-gray-500 dark:text-gray-400">Proyecto: Diseño Sistema HVAC</p>
<p class="text-xs text-gray-400 dark:text-gray-500">Ayer, 10:15</p>
</div>
</div>
</div>
<!-- Activity 5 -->
<div class="activity-item p-3 rounded-lg">
<div class="flex items-start">
<div class="p-2 bg-yellow-100 text-yellow-500 rounded-full mr-3 dark:bg-yellow-900 dark:text-yellow-400">
<i class="fas fa-comment-alt"></i>
</div>
<div>
<p class="font-medium dark:text-white">Nuevo comentario en proyecto</p>
<p class="text-sm text-gray-500 dark:text-gray-400">Modernización Planta Energética</p>
<p class="text-xs text-gray-400 dark:text-gray-500">20/07/2023</p>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Client Locations -->
<div class="bg-white dark:bg-slate-800 rounded-xl p-6 shadow-sm mb-6">
<div class="flex items-center justify-between mb-4">
<h2 class="text-lg font-semibold text-tecnovagray dark:text-white">Ubicación de Clientes</h2>
<div class="flex space-x-2">
<button class="px-3 py-1 text-xs bg-tecnovablue text-white rounded dark:bg-blue-600">Colombia</button>
<button class="px-3 py-1 text-xs bg-gray-200 text-gray-700 rounded dark:bg-gray-700 dark:text-gray-300">Internacional</button>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-6">
<div class="chart-container">
<canvas id="clientLocationChart"></canvas>
</div>
<div class="flex items-center justify-center">
<div class="text-center">
<i class="fas fa-map-marked-alt text-5xl text-gray-400 mb-3"></i>
<p class="text-gray-500 dark:text-gray-400">Mapa de ubicación de clientes</p>
<p class="text-sm text-gray-400 dark:text-gray-500">Integración con Google Maps</p>
</div>
</div>
</div>
</div>
</div>
<!-- Projects Section -->
<div id="projects-section" class="tab-content">
<!-- Projects content here -->
</div>
<!-- Clients Section -->
<div id="clients-section" class="tab-content">
<!-- Bento Box Grid -->
<div class="bento-grid mb-6">
<!-- Card 1: Total Clients -->
<div class="bento-card bg-white dark:bg-slate-800">
<div class="flex items-center justify-between">
<div>
<p class="text-gray-500 dark:text-gray-400">Clientes Totales</p>
<h3 class="text-2xl font-bold text-tecnovablue dark:text-blue-400">24</h3>
</div>
<div class="p-3 rounded-full bg-blue-100 text-tecnovablue dark:bg-blue-900 dark:text-blue-400">
<i class="fas fa-users text-xl"></i>
</div>
</div>
<div class="mt-4">
<div class="flex items-center justify-between text-sm">
<span class="text-gray-500 dark:text-gray-400">Nuevos este mes: 5</span>
<span class="font-medium">+20%</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2 mt-1 dark:bg-gray-700">
<div class="bg-tecnovablue h-2 rounded-full dark:bg-blue-500" style="width: 20%"></div>
</div>
</div>
</div>
<!-- Card 2: Client Types -->
<div class="bento-card bg-white dark:bg-slate-800">
<div class="flex items-center justify-between">
<div>
<p class="text-gray-500 dark:text-gray-400">Empresas</p>
<h3 class="text-2xl font-bold text-tecnovagreen dark:text-green-400">18</h3>
</div>
<div class="p-3 rounded-full bg-green-100 text-tecnovagreen dark:bg-green-900 dark:text-green-400">
<i class="fas fa-building text-xl"></i>
</div>
</div>
<div class="mt-4">
<div class="flex items-center justify-between text-sm">
<span class="text-gray-500 dark:text-gray-400">Personas naturales: 6</span>
<span class="font-medium">75%</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2 mt-1 dark:bg-gray-700">
<div class="bg-tecnovagreen h-2 rounded-full dark:bg-green-500" style="width: 75%"></div>
</div>
</div>
</div>
<!-- Card 3: Active Projects -->
<div class="bento-card bg-white dark:bg-slate-800">
<div class="flex items-center justify-between">
<div>
<p class="text-gray-500 dark:text-gray-400">Proyectos Activos</p>
<h3 class="text-2xl font-bold text-purple-600 dark:text-purple-400">12</h3>
</div>
<div class="p-3 rounded-full bg-purple-100 text-purple-600 dark:bg-purple-900 dark:text-purple-400">
<i class="fas fa-project-diagram text-xl"></i>
</div>
</div>
<div class="mt-4">
<div class="flex items-center justify-between text-sm">
<span class="text-gray-500 dark:text-gray-400">Por cliente: 0.5</span>
<span class="font-medium">50%</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2 mt-1 dark:bg-gray-700">
<div class="bg-purple-600 h-2 rounded-full dark:bg-purple-500" style="width: 50%"></div>
</div>
</div>
</div>
<!-- Card 4: Revenue -->
<div class="bento-card bg-white dark:bg-slate-800">
<div class="flex items-center justify-between">
<div>
<p class="text-gray-500 dark:text-gray-400">Ingresos Totales</p>
<h3 class="text-2xl font-bold text-orange-500 dark:text-orange-400">$45.2M</h3>
</div>
<div class="p-3 rounded-full bg-orange-100 text-orange-500 dark:bg-orange-900 dark:text-orange-400">
<i class="fas fa-dollar-sign text-xl"></i>
</div>
</div>
<div class="mt-4">
<div class="flex items-center justify-between text-sm">
<span class="text-gray-500 dark:text-gray-400">Por cliente: $1.88M</span>
<span class="font-medium">+15%</span>
</div>
<div class="w-full bg-gray-200 rounded-full h-2 mt-1 dark:bg-gray-700">
<div class="bg-orange-500 h-2 rounded-full dark:bg-orange-400" style="width: 15%"></div>
</div>
</div>
</div>
<!-- Card 5: Client Locations (Large) -->
<div class="bento-card bento-card-lg bg-white dark:bg-slate-800">
<div class="flex items-center justify-between mb-4">
<h2 class="text-lg font-semibold text-tecnovagray dark:text-white">Ubicación de Clientes</h2>
<div class="flex space-x-2">
<button class="px-3 py-1 text-xs bg-tecnovablue text-white rounded dark:bg-blue-600">Ciudades</button>
<button class="px-3 py-1 text-xs bg-gray-200 text-gray-700 rounded dark:bg-gray-700 dark:text-gray-300">Regiones</button>
</div>
</div>
<div class="chart-container">
<canvas id="clientLocationChart"></canvas>
</div>
</div>
<!-- Card 6: Client Type Distribution (Large) -->
<div class="bento-card bento-card-lg bg-white dark:bg-slate-800">
<h3 class="text-lg font-semibold mb-4 dark:text-white">Distribución por Tipo</h3>
<div class="chart-container">
<canvas id="clientTypeChart"></canvas>
</div>
</div>
<!-- Card 7: Top Clients (Large) -->
<div class="bento-card bento-card-lg bg-white dark:bg-slate-800">
<div class="flex items-center justify-between mb-4">
<h2 class="text-lg font-semibold text-tecnovagray dark:text-white">Clientes Principales</h2>
<a href="#" class="text-sm text-tecnovablue hover:underline dark:text-blue-400">Ver todos</a>
</div>
<div class="space-y-4">
<div class="flex items-center p-3 bg-gray-50 rounded-lg dark:bg-slate-700">
<div class="client-avatar bg-tecnovablue mr-4">ER</div>
<div class="flex-1">
<h3 class="font-medium dark:text-white">Energía Renovable SAS</h3>
<p class="text-sm text-gray-500 dark:text-gray-400">Bogotá, Colombia</p>
</div>
<div class="text-right">
<p class="font-medium text-tecnovablue dark:text-blue-400">$12.5M</p>
<p class="text-xs text-gray-500 dark:text-gray-400">2 proyectos</p>
</div>
</div>
<div class="flex items-center p-3 bg-gray-50 rounded-lg dark:bg-slate-700">
<div class="client-avatar bg-tecnovagreen mr-4">AL</div>
<div class="flex-1">
<h3 class="font-medium dark:text-white">Agropecuaria La Esperanza</h3>
<p class="text-sm text-gray-500 dark:text-gray-400">Medellín, Colombia</p>
</div>
<div class="text-right">
<p class="font-medium text-tecnovagreen dark:text-green-400">$8.2M</p>
<p class="text-xs text-gray-500 dark:text-gray-400">1 proyecto</p>
</div>
</div>
<div class="flex items-center p-3 bg-gray-50 rounded-lg dark:bg-slate-700">
<div class="client-avatar bg-purple-600 mr-4">CE</div>
<div class="flex-1">
<h3 class="font-medium dark:text-white">Constructora Edificar SAS</h3>
<p class="text-sm text-gray-500 dark:text-gray-400">Cali, Colombia</p>
</div>
<div class="text-right">
<p class="font-medium text-purple-600 dark:text-purple-400">$6.7M</p>
<p class="text-xs text-gray-500 dark:text-gray-400">1 proyecto</p>
</div>
</div>
</div>
</div>
<!-- Card 8: Client Map (Large) -->
<div class="bento-card bento-card-lg bg-white dark:bg-slate-800">
<h3 class="text-lg font-semibold mb-4 dark:text-white">Mapa de Clientes</h3>
<div class="map-container bg-gray-200 dark:bg-gray-700 flex items-center justify-center">
<div class="text-center p-6">
<i class="fas fa-map-marked-alt text-4xl text-gray-400 mb-3"></i>
<p class="text-gray-500 dark:text-gray-400">Mapa de ubicación de clientes</p>
<p class="text-sm text-gray-400 dark:text-gray-500">Integración con Google Maps</p>
</div>
</div>
</div>
<!-- Card 9: Clients List (Full Width) -->
<div class="bento-card bento-card-full bg-white dark:bg-slate-800">
<div class="flex items-center justify-between mb-6">
<h2 class="text-xl font-semibold text-tecnovagray dark:text-white">Lista de Clientes</h2>
<div class="flex space-x-3">
<button class="px-4 py-2 bg-tecnovablue text-white rounded-lg hover:bg-blue-700 transition dark:bg-blue-600 dark:hover:bg-blue-700">
<i class="fas fa-plus mr-2"></i> Nuevo Cliente
</button>
<button class="px-4 py-2 border border-gray-300 rounded-lg hover:bg-gray-100 transition dark:border-gray-600 dark:hover:bg-gray-700">
<i class="fas fa-filter mr-2"></i> Filtros
</button>
</div>
</div>
<div class="overflow-x-auto custom-scrollbar">
<table class="data-table w-full">
<thead>
<tr>
<th>Cliente</th>
<th>Contacto</th>
<th>Dirección</th>
<th>Teléfono</th>
<th>Proyectos</th>
<th>Estado</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
<tr class="hover:bg-gray-50 dark:hover:bg-slate-700">
<td class="flex items-center py-4">
<div class="client-avatar bg-tecnovablue mr-3">ER</div>
<div>
<p class="font-medium dark:text-white">Energía Renovable SAS</p>
<p class="text-sm text-gray-500 dark:text-gray-400">NIT: 900.123.456-7</p>
</div>
</td>
<td>
<p class="dark:text-white">Carlos Méndez</p>
<p class="text-sm text-gray-500 dark:text-gray-400">carlos@energia.com</p>
</td>
<td>
<p class="dark:text-white">Calle 123 #45-67</p>
<p class="text-sm text-gray-500 dark:text-gray-400">Bogotá, Colombia</p>
</td>
<td class="dark:text-white">+57 1 2345678</td>
<td>
<span class="px-2 py-1 bg-blue-100 text-blue-800 rounded-full text-xs dark:bg-blue-900 dark:text-blue-400">2 activos</span>
</td>
<td>
<span class="status-badge status-active">Activo</span>
</td>
<td>
<button class="text-gray-500 hover:text-tecnovablue dark:hover:text-blue-400 mr-2">
<i class="fas fa-eye"></i>
</button>
<button class="text-gray-500 hover:text-tecnovagreen dark:hover:text-green-400 mr-2">
<i class="fas fa-edit"></i>
</button>
<button class="text-gray-500 hover:text-red-500 dark:hover:text-red-400">
<i class="fas fa-trash"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50 dark:hover:bg-slate-700">
<td class="flex items-center py-4">
<div class="client-avatar bg-tecnovagreen mr-3">AL</div>
<div>
<p class="font-medium dark:text-white">Agropecuaria La Esperanza</p>
<p class="text-sm text-gray-500 dark:text-gray-400">NIT: 890.123.456-1</p>
</div>
</td>
<td>
<p class="dark:text-white">María González</p>
<p class="text-sm text-gray-500 dark:text-gray-400">maria@agroesperanza.com</p>
</td>
<td>
<p class="dark:text-white">Carrera 56 #12-34</p>
<p class="text-sm text-gray-500 dark:text-gray-400">Medellín, Colombia</p>
</td>
<td class="dark:text-white">+57 4 5678901</td>
<td>
<span class="px-2 py-1 bg-green-100 text-green-800 rounded-full text-xs dark:bg-green-900 dark:text-green-400">1 activo</span>
</td>
<td>
<span class="status-badge status-active">Activo</span>
</td>
<td>
<button class="text-gray-500 hover:text-tecnovablue dark:hover:text-blue-400 mr-2">
<i class="fas fa-eye"></i>
</button>
<button class="text-gray-500 hover:text-tecnovagreen dark:hover:text-green-400 mr-2">
<i class="fas fa-edit"></i>
</button>
<button class="text-gray-500 hover:text-red-500 dark:hover:text-red-400">
<i class="fas fa-trash"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50 dark:hover:bg-slate-700">
<td class="flex items-center py-4">
<div class="client-avatar bg-purple-600 mr-3">CE</div>
<div>
<p class="font-medium dark:text-white">Constructora Edificar SAS</p>
<p class="text-sm text-gray-500 dark:text-gray-400">NIT: 800.123.456-2</p>
</div>
</td>
<td>
<p class="dark:text-white">Juan Pérez</p>
<p class="text-sm text-gray-500 dark:text-gray-400">juan@constructora.com</p>
</td>
<td>
<p class="dark:text-white">Avenida 8 #23-45</p>
<p class="text-sm text-gray-500 dark:text-gray-400">Cali, Colombia</p>
</td>
<td class="dark:text-white">+57 2 3456789</td>
<td>
<span class="px-2 py-1 bg-purple-100 text-purple-800 rounded-full text-xs dark:bg-purple-900 dark:text-purple-400">1 activo</span>
</td>
<td>
<span class="status-badge status-active">Activo</span>
</td>
<td>
<button class="text-gray-500 hover:text-tecnovablue dark:hover:text-blue-400 mr-2">
<i class="fas fa-eye"></i>
</button>
<button class="text-gray-500 hover:text-tecnovagreen dark:hover:text-green-400 mr-2">
<i class="fas fa-edit"></i>
</button>
<button class="text-gray-500 hover:text-red-500 dark:hover:text-red-400">
<i class="fas fa-trash"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50 dark:hover:bg-slate-700">
<td class="flex items-center py-4">
<div class="client-avatar bg-orange-500 mr-3">MS</div>
<div>
<p class="font-medium dark:text-white">Minera del Sur</p>
<p class="text-sm text-gray-500 dark:text-gray-400">NIT: 700.123.456-3</p>
</div>
</td>
<td>
<p class="dark:text-white">Roberto Sánchez</p>
<p class="text-sm text-gray-500 dark:text-gray-400">roberto@minera.com</p>
</td>
<td>
<p class="dark:text-white">Calle 10 #5-67</p>
<p class="text-sm text-gray-500 dark:text-gray-400">Barranquilla, Colombia</p>
</td>
<td class="dark:text-white">+57 5 6789012</td>
<td>
<span class="px-2 py-1 bg-orange-100 text-orange-800 rounded-full text-xs dark:bg-orange-900 dark:text-orange-400">1 activo</span>
</td>
<td>
<span class="status-badge status-active">Activo</span>
</td>
<td>
<button class="text-gray-500 hover:text-tecnovablue dark:hover:text-blue-400 mr-2">
<i class="fas fa-eye"></i>
</button>
<button class="text-gray-500 hover:text-tecnovagreen dark:hover:text-green-400 mr-2">
<i class="fas fa-edit"></i>
</button>
<button class="text-gray-500 hover:text-red-500 dark:hover:text-red-400">
<i class="fas fa-trash"></i>
</button>
</td>
</tr>
<tr class="hover:bg-gray-50 dark:hover:bg-slate-700">
<td class="flex items-center py-4">
<div class="client-avatar bg-yellow-500 mr-3">AE</div>
<div>
<p class="font-medium dark:text-white">Alimentos Ecológicos</p>
<p class="text-sm text-gray-500 dark:text-gray-400">NIT: 600.123.456-4</p>
</div>
</td>
<td>
<p class="dark:text-white">Laura Ramírez</p>
<p class="text-sm text-gray-500 dark:text-gray-400">laura@alimentoseco.com</p>
</td>
<td>
<p class="dark:text-white">Carrera 34 #12-56</p>
<p class="text-sm text-gray-500 dark:text-gray-400">Bucaramanga, Colombia</p>
</td>
<td class="dark:text-white">+57 7 7890123</td>
<td>
<span class="px-2 py-1 bg-gray-200 text-gray-800 rounded-full text-xs dark:bg-gray-700 dark:text-gray-400">0 activos</span>
</td>
<td>
<span class="status-badge status-pending">Inactivo</span>
</td>
<td>
<button class="text-gray-500 hover:text-tecnovablue dark:hover:text-blue-400 mr-2">
<i class="fas fa-eye"></i>
</button>
<button class="text-gray-500 hover:text-tecnovagreen dark:hover:text-green-400 mr-2">
<i class="fas fa-edit"></i>
</button>
<button class="text-gray-500 hover:text-red-500 dark:hover:text-red-400">
<i class="fas fa-trash"></i>
</button>
</td>
</tr>
</tbody>
</table>
</div>
<div class="flex items-center justify-between mt-6">
<div class="text-sm text-gray-500 dark:text-gray-400">
Mostrando 1 a 5 de 24 clientes
</div>
<div class="flex space-x-2">
<button class="px-3 py-1 border rounded-lg text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-700">
<i class="fas fa-chevron-left"></i>
</button>
<button class="px-3 py-1 bg-tecnovablue text-white rounded-lg dark:bg-blue-600">1</button>
<button class="px-3 py-1 border rounded-lg text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-700">2</button>
<button class="px-3 py-1 border rounded-lg text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-700">3</button>
<button class="px-3 py-1 border rounded-lg text-gray-500 hover:bg-gray-100 dark:hover:bg-gray-700">
<i class="fas fa-chevron-right"></i>
</button>
</div>
</div>
</div>
</div>
</div>
<!-- Tasks Section -->
<div id="tasks-section" class="tab-content">
<!-- Tasks content here -->
</div>
<!-- Invoicing Section -->
<div id="invoicing-section" class="tab-content">
<!-- Invoicing content here -->
</div>
<!-- Reports Section -->
<div id="reports-section" class="tab-content">
<!-- Reports content here -->
</div>
<!-- Inventory Section -->
<div id="inventory-section" class="tab-content">
<!-- Inventory content here -->
</div>
<!-- Settings Section -->
<div id="settings-section" class="tab-content">
<!-- Settings content here -->
</div>
<!-- Users Section -->
<div id="users-section" class="tab-content">
<!-- Users content here -->
</div>
</main>
</div>
</div>
<script>
// Toggle sidebar
document.getElementById('toggle-sidebar').addEventListener('click', function() {
const sidebar = document.getElementById('sidebar');
const mainContent = document.getElementById('main-content');
const logoText = document.getElementById('logo-text');
const userInfo = document.getElementById('user-info');
sidebar.classList.toggle('sidebar-collapsed');
sidebar.classList.toggle('sidebar-expanded');
mainContent.classList.toggle('content-collapsed');
mainContent.classList.toggle('content-expanded');
if (sidebar.classList.contains('sidebar-collapsed')) {
logoText.classList.add('hidden');
userInfo.classList.add('hidden');
} else {
logoText.classList.remove('hidden');
userInfo.classList.remove('hidden');
}
});
// Toggle dark mode
document.getElementById('theme-toggle').addEventListener('click', function() {
document.documentElement.classList.toggle('dark');
const icon = document.getElementById('theme-icon');
if (document.documentElement.classList.contains('dark')) {
icon.classList.remove('fa-moon');
icon.classList.add('fa-sun');
} else {
icon.classList.remove('fa-sun');
icon.classList.add('fa-moon');
}
});
// Switch between tabs
document.querySelectorAll('[data-section]').forEach(link => {
link.addEventListener('click', function(e) {
e.preventDefault();
const sectionId = this.getAttribute('data-section') + '-section';
// Update active state in sidebar
document.querySelectorAll('[data-section]').forEach(item => {
item.classList.remove('active');
item.classList.add('text-white/80');
item.classList.remove('text-white');
item.classList.remove('bg-white/20');
});
this.classList.add('active');
this.classList.remove('text-white/80');
this.classList.add('text-white');
this.classList.add('bg-white/20');
// Update page title
const pageTitle = document.getElementById('page-title');
pageTitle.textContent = this.querySelector('span').textContent;
// Show the selected section
document.querySelectorAll('.tab-content').forEach(section => {
section.classList.remove('active');
});
document.getElementById(sectionId).classList.add('active');
});
});
// Initialize charts
document.addEventListener('DOMContentLoaded', function() {
// Revenue Chart
const revenueCtx = document.getElementById('revenueChart').getContext('2d');
const revenueChart = new Chart(revenueCtx, {
type: 'line',
data: {
labels: ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'],
datasets: [{
label: 'Ingresos (millones)',
data: [12, 15, 18, 14, 20, 22, 25, 28, 24, 30, 32, 35],
backgroundColor: 'rgba(26, 75, 140, 0.1)',
borderColor: 'rgba(26, 75, 140, 1)',
borderWidth: 2,
tension: 0.3,
fill: true
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
display: false
}
},
scales: {
y: {
beginAtZero: true,
grid: {
color: 'rgba(0, 0, 0, 0.05)'
}
},
x: {
grid: {
display: false
}
}
}
}
});
// Project Status Chart
const projectStatusCtx = document.getElementById('projectStatusChart').getContext('2d');
const projectStatusChart = new Chart(projectStatusCtx, {
type: 'doughnut',
data: {
labels: ['Completados', 'En progreso', 'En riesgo', 'Atrasados'],
datasets: [{
data: [5, 12, 3, 2],
backgroundColor: [
'rgba(46, 133, 110, 0.7)',
'rgba(26, 75, 140, 0.7)',
'rgba(245, 158, 11, 0.7)',
'rgba(239, 68, 68, 0.7)'
],
borderColor: [
'rgba(46, 133, 110, 1)',
'rgba(26, 75, 140, 1)',
'rgba(245, 158, 11, 1)',
'rgba(239, 68, 68, 1)'
],
borderWidth: 1
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
position: 'right',
},
tooltip: {
callbacks: {
label: function(context) {
const label = context.label || '';
const value = context.raw || 0;
const total = context.dataset.data.reduce((a, b) => a + b, 0);
const percentage = Math.round((value / total) * 100);
return `${label}: ${value} (${percentage}%)`;
}
}
}
},
cutout: '70%'
}
});
// Client Location Chart
const clientLocationCtx = document.getElementById('clientLocationChart').getContext('2d');
const clientLocationChart = new Chart(clientLocationCtx, {
type: 'bar',
data: {
labels: ['Bogotá', 'Medellín', 'Cali', 'Barranquilla', 'Bucaramanga'],
datasets: [{
label: 'Clientes por ciudad',
data: [8, 5, 4, 3, 2],
backgroundColor: [
'rgba(26, 75, 140, 0.7)',
'rgba(46, 133, 110, 0.7)',
'rgba(99, 102, 241, 0.7)',
'rgba(245, 158, 11, 0.7)',
'rgba(239, 68, 68, 0.7)'
],
borderColor: [
'rgba(26, 75, 140, 1)',
'rgba(46, 133, 110, 1)',
'rgba(99, 102, 241, 1)',
'rgba(245, 158, 11, 1)',
'rgba(239, 68, 68, 1)'
],
borderWidth: 1,
borderRadius: 4
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
display: false
}
},
scales: {
y: {
beginAtZero: true,
ticks: {
stepSize: 1
}
}
}
}
});
// Client Type Chart
const clientTypeCtx = document.getElementById('clientTypeChart').getContext('2d');
const clientTypeChart = new Chart(clientTypeCtx, {
type: 'doughnut',
data: {
labels: ['Empresas', 'Personas naturales'],
datasets: [{
data: [18, 6],
backgroundColor: [
'rgba(26, 75, 140, 0.7)',
'rgba(46, 133, 110, 0.7)'
],
borderColor: [
'rgba(26, 75, 140, 1)',
'rgba(46, 133, 110, 1)'
],
borderWidth: 1
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
plugins: {
legend: {
position: 'right',
},
tooltip: {
callbacks: {
label: function(context) {
const label = context.label || '';
const value = context.raw || 0;
const total = context.dataset.data.reduce((a, b) => a + b, 0);
const percentage = Math.round((value / total) * 100);
return `${label}: ${value} (${percentage}%)`;
}
}
}
},
cutout: '70%'
}
});
});
</script>
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=VedetteStore/tecnova-crm" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>