Volver a proyectos
Web
2 min de lectura

Portal de Transparencia de la CNE

Por Jeferson Heredia
13 de mayo de 2025
WordPress
PHP
Transparencia Gubernamental
Accesibilidad
UX/UI
Desarrollo Web
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

Página principal del Portal de Transparencia de la CNE

Repositorio de documentos oficiales y normativas

Repositorio de documentos oficiales y normativas

Formulario de solicitud de acceso a la información pública

Formulario de solicitud de acceso a la información pública

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