Volver a proyectos
Web
1 min de lectura

Plataforma para la Comisión Nacional de Energía

Por Jeferson Heredia
13 de julio de 2025
WordPress
PHP
Migración
Despliegue
Desarrollo Gubernamental
Seguridad Web
Accesibilidad
Plataforma para la Comisión Nacional de Energía

Descripción

Lideré el desarrollo completo de la nueva plataforma digital para la Comisión Nacional de Energía (CNE) de República Dominicana en el 2021, un organismo gubernamental clave en la regulación y promoción del sector energético nacional.

Este proyecto representó un desafío significativo de ingeniería y gestión, ya que requirió desarrollar una plataforma completamente nueva mientras se mantenía operativa la versión anterior. Implementé una arquitectura robusta basada en WordPress que permitió crear un sitio moderno, seguro y altamente funcional que cumple con todos los estándares gubernamentales.

La plataforma fue diseñada para servir como centro de información y servicios para ciudadanos, empresas e inversores del sector energético, ofreciendo acceso a documentación oficial, estadísticas energéticas, servicios en línea y transparencia institucional. Cada aspecto del desarrollo fue meticulosamente planificado para garantizar la integridad de los datos, la seguridad de la información y la continuidad del servicio.

Tecnologías Utilizadas

WordPress

CMS principal para el desarrollo y gestión de contenidos

PHP

Desarrollo de funcionalidades personalizadas y plugins específicos

MySQL

Base de datos optimizada para alto rendimiento y seguridad

JavaScript

Interactividad y mejoras de experiencia de usuario

HTML5/CSS3

Maquetación semántica y diseño responsivo

Azure

Infraestructura cloud para alta disponibilidad y seguridad

Desafíos

Desarrollo paralelo

Uno de los mayores desafíos fue desarrollar la nueva plataforma desde cero mientras se mantenía y actualizaba el sitio existente en producción, garantizando la continuidad del servicio sin interrupciones para los usuarios.

Cumplimiento normativo OGTIC

La plataforma debía cumplir con los estrictos estándares y normativas de la Oficina Gubernamental de Tecnologías de la Información y Comunicación (OGTIC), que establece lineamientos rigurosos para sitios web gubernamentales en República Dominicana.

Seguridad reforzada

Al tratarse de un organismo gubernamental que maneja información sensible del sector energético, fue necesario implementar múltiples capas de seguridad para proteger contra vulnerabilidades y ataques cibernéticos.

Migración de datos históricos

La plataforma debía preservar y presentar adecuadamente años de documentación, estadísticas y recursos históricos del sector energético, garantizando su integridad y accesibilidad.

Soluciones

Metodología de desarrollo por fases

Implementé una metodología de desarrollo incremental que permitió construir y desplegar la nueva plataforma por módulos, facilitando pruebas exhaustivas antes de la migración completa y minimizando riesgos.

Arquitectura de seguridad multicapa

Diseñé una arquitectura de seguridad robusta que incluye autenticación de dos factores, encriptación de datos sensibles, firewalls de aplicación web (WAF), y auditorías de seguridad periódicas para proteger la integridad del sitio.

Optimización para accesibilidad

Desarrollé la plataforma siguiendo las pautas WCAG 2.1 para garantizar que todos los ciudadanos, incluidas personas con discapacidades, pudieran acceder a la información y servicios de la Comisión Nacional de Energía.

Sistema de respaldo y recuperación

Implementé un sistema automatizado de respaldo y recuperación que garantiza la continuidad del servicio incluso ante fallos críticos, con tiempos de recuperación mínimos y sin pérdida de datos.

Galería

Página principal de la Comisión Nacional de Energía

Página principal de la Comisión Nacional de Energía

Sección de servicios para ciudadanos y empresas

Sección de servicios para ciudadanos y empresas

Visualización de estadísticas energéticas nacionales

Visualización de estadísticas energéticas nacionales

Ejemplo de Código

user_manager.py

from django.db import models
from django.contrib.auth.models import User
from django.utils.text import slugify
from django.urls import reverse
import uuid

class Category(models.Model):
    name = models.CharField(max_length=100)
    slug = models.SlugField(unique=True)
    description = models.TextField(blank=True)
    
    class Meta:
        verbose_name_plural = "Categories"
        
    def __str__(self):
        return self.name
        
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        super().save(*args, **kwargs)

class Product(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    name = models.CharField(max_length=200)
    slug = models.SlugField(unique=True)
    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name="products")
    description = models.TextField()
    price = models.DecimalField(max_digits=10, decimal_places=2)
    stock = models.PositiveIntegerField(default=0)
    available = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    image = models.ImageField(upload_to='products/', blank=True, null=True)
    featured = models.BooleanField(default=False)
    
    class Meta:
        ordering = ['-created_at']
        
    def __str__(self):
        return self.name
        
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.name)
        super().save(*args, **kwargs)
        
    def get_absolute_url(self):
        return reverse('product_detail', kwargs={'slug': self.slug})
        
    @property
    def is_in_stock(self):
        return self.stock > 0

class Order(models.Model):
    STATUS_CHOICES = (
        ('pending', 'Pending'),
        ('processing', 'Processing'),
        ('shipped', 'Shipped'),
        ('delivered', 'Delivered'),
        ('cancelled', 'Cancelled'),
    )
    
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="orders")
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending')
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    shipping_address = models.TextField()
    total_amount = models.DecimalField(max_digits=10, decimal_places=2)
    
    def __str__(self):
        return f"Order {self.id} - {self.user.username}"
        
    @property
    def order_items(self):
        return self.items.all()
        
    @property
    def item_count(self):
        return sum(item.quantity for item in self.order_items)

class OrderItem(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name="items")
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(default=1)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    
    def __str__(self):
        return f"{self.quantity} x {self.product.name}"
        
    @property
    def total_price(self):
        return self.price * self.quantity

# Views example (in views.py)
from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView, DetailView
from .models import Product, Category

class ProductListView(ListView):
    model = Product
    template_name = 'shop/product_list.html'
    context_object_name = 'products'
    paginate_by = 12
    
    def get_queryset(self):
        queryset = Product.objects.filter(available=True)
        category_slug = self.kwargs.get('category_slug')
        
        if category_slug:
            category = get_object_or_404(Category, slug=category_slug)
            queryset = queryset.filter(category=category)
            
        return queryset
        
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        context['categories'] = Category.objects.all()
        return context

class ProductDetailView(DetailView):
    model = Product
    template_name = 'shop/product_detail.html'
    context_object_name = 'product'
    slug_url_kwarg = 'slug'

Compartir

Habilidades Python

Python Core
Data Analysis
Web Frameworks
Machine Learning
Testing

¿Interesado en un proyecto similar?

Si estás buscando implementar una solución en Python o tienes un proyecto en mente que requiera habilidades de desarrollo similares, no dudes en contactarme para discutir cómo puedo ayudarte.

Contactar