Portal de Transparencia de la CNE

Descripción
Desarrollé el Portal de Transparencia para la Comisión Nacional de Energía (CNE) de República Dominicana, una plataforma crucial que garantiza el acceso público a la información institucional en cumplimiento con la Ley General de Libre Acceso a la Información Pública (Ley 200-04) y el Decreto No. 130-05.
Este proyecto representó un desafío significativo, ya que requirió tanto el desarrollo desde cero de nuevas funcionalidades como la actualización y mantenimiento del portal existente que se encontraba en producción. La implementación se realizó de manera que permitiera la continuidad del servicio sin interrupciones para los ciudadanos que dependen de esta plataforma para acceder a información gubernamental.
El portal fue diseñado con una arquitectura que facilita la publicación, organización y acceso a documentos oficiales, informes financieros, estructura organizativa, planes estratégicos y otros datos de interés público. Implementé un sistema de búsqueda avanzada que permite a los ciudadanos encontrar rápidamente la información específica que necesitan, así como formularios electrónicos para solicitudes de información que cumplen con los plazos y requisitos establecidos por la ley.
Dada la naturaleza oficial de esta plataforma, se implementaron rigurosos estándares de seguridad, accesibilidad y usabilidad, asegurando que el portal fuera accesible para todos los ciudadanos, incluyendo aquellos con discapacidades, y que la información presentada fuera íntegra y auténtica.
Tecnologías Utilizadas
WordPress
CMS principal para la gestión de contenidos y documentos
PHP
Desarrollo de funcionalidades personalizadas para requisitos específicos
MySQL
Base de datos para almacenamiento y recuperación eficiente de documentos
JavaScript
Mejoras de interactividad y experiencia de usuario
HTML5/CSS3
Estructura semántica y diseño responsivo accesible
AWS S3
Almacenamiento de documentos oficiales y archivos de gran tamaño
Desafíos
Actualización sin interrupciones
Actualizar y mejorar el portal existente mientras se mantenía en funcionamiento, sin interrumpir el acceso público a información crítica gubernamental.
Cumplimiento normativo
Asegurar que el portal cumpliera con todos los requisitos legales de la Ley 200-04 y el Decreto 130-05, así como con las directrices de la Dirección General de Ética e Integridad Gubernamental (DIGEIG).
Gestión documental
Implementar un sistema eficiente para la gestión, categorización y búsqueda de grandes volúmenes de documentos oficiales con diferentes formatos y tamaños.
Accesibilidad universal
Garantizar que el portal fuera accesible para todos los ciudadanos, incluyendo personas con discapacidades, siguiendo los estándares WCAG 2.1.
Soluciones
Estrategia de implementación progresiva
Desarrollé una estrategia de implementación por fases que permitió actualizar secciones del portal de manera incremental, manteniendo siempre la disponibilidad del servicio.
Sistema de gestión documental
Implementé un sistema personalizado de gestión documental con taxonomías específicas para la organización gubernamental, facilitando la publicación y actualización regular de documentos oficiales.
Optimización de búsqueda
Desarrollé un motor de búsqueda avanzado con filtros personalizados que permite a los ciudadanos encontrar rápidamente documentos específicos entre miles de archivos publicados.
Diseño centrado en el usuario
Apliqué principios de diseño centrado en el usuario para crear una interfaz intuitiva que facilita la navegación y el acceso a la información, independientemente del nivel de alfabetización digital del usuario.
Galería

Página principal del Portal de Transparencia de la CNE

Repositorio de documentos oficiales y normativas

Formulario de solicitud de acceso a la información pública
Ejemplo de Código
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'
Habilidades Python
¿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