# Gestion Integral Web

**Gestion Integral Web** es un sistema de gestión empresarial, diseñado para administrar las operaciones de una empresa de medios de comunicación. Este proyecto representa la migración y modernización de un sistema de escritorio heredado, desarrollado originalmente en VB.NET (Migrado de Cobol), a una arquitectura web moderna y robusta.

El sistema se compone de un **backend APIRest desarrollado en ASP.NET Core** y un **frontend interactivo de tipo SPA (Single Page Application) construido con React y TypeScript**.

---
## Módulos y Funcionalidades Principales

El sistema está organizado en varios módulos clave para cubrir todas las áreas operativas:

### 🚚 Distribución
- **Gestión de Canillitas y Accionistas:** ABM completo, manejo de legajos, zonas, paradas, y estado de baja.
- **Gestión de Distribuidores:** ABM de distribuidores, asignación de zonas y datos de contacto.
- **Gestión de Publicaciones:** Administración de diarios y revistas, incluyendo:
  - **Precios:** Definición de precios por día de la semana con historial de vigencia.
  - **Recargos:** Configuración de recargos por zona geográfica.
  - **Porcentajes de Pago:** Asignación de porcentajes de pago diferenciados para distribuidores y canillitas/accionistas.
  - **Secciones:** Administración de las secciones que componen cada publicación (Ej: Deportes, Espectáculos).
- **Movimientos Diarios:**
  - Registro de entradas (devoluciones) y salidas (entregas) para distribuidores y canillitas.
  - Carga masiva de movimientos para canillitas.
  - Control de Devoluciones y gestión de sobrantes y ejemplares sin cargo.
  - Gestión de salidas a "Otros Destinos" (ej: canje, protocolo).
- **Liquidaciones:** Proceso para marcar movimientos como liquidados y calcular montos a rendir.

### 🖨️ Impresión
- **Gestión de Stock de Bobinas:**
  - Ingreso de bobinas con remito, peso, tipo y planta.
  - Trazabilidad completa del estado de cada bobina (Disponible, En Uso, Dañada).
  - Asignación de bobinas consumidas a una publicación y sección específica.
- **Registro de Tiradas:**
  - Definición de tiradas diarias por publicación y planta.
  - Detalle de secciones y cantidad de páginas por cada tirada.
- **Administración de Datos Maestros:** ABM de Plantas de Impresión, Tipos de Bobina y Estados de Bobina.

### 💰 Contabilidad
- **Cuentas Corrientes:** Seguimiento de saldos para distribuidores por empresa.
- **Gestión de Pagos:** Registro de pagos recibidos y realizados a distribuidores, con múltiples tipos de pago.
- **Notas de Crédito y Débito:** Emisión de notas para ajustar las cuentas corrientes de distribuidores y canillitas.
- **Administración de Tipos de Pago.**

### 📻 Radios
- **Gestión de Fonoteca:** ABM de canciones, intérpretes, autores, y ritmos.
- **Generador de Listas de Reproducción:** Herramienta para generar planillas de programación musical en formato Excel (XLSX) y ZIP para su presentación a entidades como AADI y SADAIC.

### 📊 Reportes
- **Módulo de Reportes PDF y Excel:** Generación de una amplia gama de reportes operativos y de gestión.
  - **Impresión:** Existencia de Papel, Movimiento de Bobinas, Consumo por Sección/Publicación, Comparativa Mensual de Consumo.
  - **Distribución:** Listados de Distribución (General y Canillitas), Control de Devoluciones, Comprobantes de Liquidación.
  - **Contabilidad:** Balances de Cuentas Corrientes de Distribuidores.
  - **Ventas:** Reportes de Venta Mensual para Secretaría.

### 👤 Usuarios y Seguridad
- **Gestión de Usuarios:** ABM de usuarios del sistema.
- **Control de Acceso Basado en Roles (RBAC):**
  - **Perfiles:** Creación de roles de usuario (ej: Administrador, Operador de Distribución).
  - **Permisos:** Definición granular de permisos para cada acción del sistema (Ver, Crear, Modificar, Eliminar).
  - Asignación flexible de permisos a perfiles.
- **Autenticación Segura:** Mediante JSON Web Tokens (JWT).
- **Auditoría:** Todas las modificaciones a los datos maestros y transacciones importantes se registran en tablas de historial (`_H`).

### 📨 Suscripciones
- **Gestión de Suscriptores:** ABM completo de clientes, incluyendo datos de contacto, dirección de entrega y forma de pago preferida.
- **Ciclo de Vida de la Suscripción:** Creación y administración de suscripciones por cliente y publicación, con fechas de inicio, fin, días de entrega y estados (`Activa`, `Pausada`, `Cancelada`).
- **Facturación Proporcional (Pro-rata):** El sistema genera automáticamente una "Factura de Alta" por el monto proporcional cuando un cliente se suscribe en un período ya cerrado, evitando cobros excesivos en la primera factura.
- **Gestión de Promociones:** ABM de promociones (ej. descuentos porcentuales, bonificación de días) y asignación a suscripciones específicas con vigencia definida.
- **Cuenta Corriente del Suscriptor:** Administración de ajustes manuales (`Crédito`/`Débito`) para manejar situaciones excepcionales como notas de crédito, devoluciones o cargos especiales.
- **Procesos de Cierre Mensual:**
  - **Generación de Cierre:** Proceso masivo que calcula y genera todas las facturas del período, aplicando promociones y ajustes.
  - **Notificaciones Automáticas:** Envío automático de resúmenes de cuenta por email a cada suscriptor al generar el cierre.
- **Gestión de Débito Automático:**
  - **Generación de Archivo:** Creación del archivo de texto plano en formato "Pago Directo" para el Banco Galicia. Las "Facturas de Alta" se excluyen automáticamente de este proceso.
  - **Procesamiento de Respuesta:** Herramienta para procesar el archivo de respuesta del banco, actualizando los estados de pago (`Pagada`/`Rechazada`) de forma masiva.
- **Auditoría de Comunicaciones:**
  - **Log de Envíos:** Registro detallado de cada correo electrónico enviado (individual o masivo), incluyendo estado (`Enviado`/`Fallido`) y mensajes de error.
  - **Historial de Envíos:** Interfaz para consultar el historial de notificaciones enviadas por cada factura o por cada lote de cierre mensual.

---

## 🛠️ Stack Tecnológico

### Backend (`GestionIntegral.Api`)
- **Framework:** ASP.NET Core 9
- **Lenguaje:** C# 12
- **Acceso a Datos:** Dapper (Micro ORM)
- **Base de Datos:** Microsoft SQL Server
- **Autenticación:** JWT Bearer Tokens
- **Reportes PDF:** QuestPDF C# PDF Generation Library
- **Exportación Excel:** NPOI

### Frontend
- **Framework:** React 18
- **Lenguaje:** TypeScript
- **UI Kit:** Material-UI (MUI) v5 & MUI X (para `DataGrid`)
- **Enrutamiento:** React Router v6
- **Llamadas API:** Axios
- **Gestión de Estado:** React Context API (`useAuth`)
- **Build Tool:** Vite

---

## 🚀 Puesta en Marcha (Getting Started)

Siga estos pasos para configurar y ejecutar el proyecto en un entorno de desarrollo local.

### Prerrequisitos
- **.NET SDK 9.0** o superior.
- **Node.js** v18.x o superior (con npm o yarn).
- **Microsoft SQL Server** (2019 o superior) y SQL Server Management Studio (SSMS).
- Un editor de código como **Visual Studio Code** o **Visual Studio 2022**.

### 1. Clonar el Repositorio
```bash
git clone <URL_DEL_REPOSITORIO_GITEA>
cd GestionIntegralWeb
```

### 2. Configuración de la Base de Datos
1.  Abra SSMS y conecte a su instancia de SQL Server.
2.  Cree una nueva base de datos llamada `SistemaGestion`.
3.  **Restaure la base de datos** a partir del archivo `.bak` proporcionado por el equipo. (Si no lo tiene, solicítelo).
4.  Ejecute los scripts de Stored Procedures y actualizaciones de esquema que se encuentran en el archivo `dbSP.sql` sobre la base de datos restaurada.

### 3. Configuración del Backend
1.  Navegue al directorio del backend: `cd Backend/GestionIntegral.Api`.
2.  Cree un archivo `appsettings.Development.json` en este directorio si no existe.
3.  Copie y pegue la siguiente estructura y rellene los valores correctos:

    ```json
    {
      "Logging": {
        "LogLevel": {
          "Default": "Information",
          "Microsoft.AspNetCore": "Warning"
        }
      },
      "ConnectionStrings": {
        "DefaultConnection": "Data Source=NOMBRE_SU_SERVIDOR;Initial Catalog=SistemaGestion;Integrated Security=False;User ID=su_usuario_sql;Password=su_contraseña;Encrypt=True;TrustServerCertificate=True"
      },
      "Jwt": {
        "Key": "UNA_CLAVE_SECRETA_MUY_LARGA_Y_SEGURA_AQUI_DE_AL_MENOS_32_CARACTERES",
        "Issuer": "http://localhost:5183", // La URL donde corre su backend
        "Audience": "http://localhost:5173", // La URL donde corre su frontend
        "DurationInHours": 8
      }
    }
    ```
4.  Instale las dependencias y ejecute el backend:
    ```bash
    dotnet restore
    dotnet run
    ```
    La API estará disponible en la URL especificada (ej. `http://localhost:5183`).

### 4. Configuración del Frontend
1.  Navegue al directorio del frontend: `cd Frontend` (desde la raíz del proyecto).
2.  Cree un archivo `.env` en este directorio.
3.  Añada la siguiente variable de entorno apuntando a la URL de su backend:
    ```
    VITE_API_BASE_URL=http://localhost:5183
    ```
4.  Instale las dependencias y ejecute el frontend:
    ```bash
    npm install
    npm run dev
    ```
    La aplicación web estará disponible en `http://localhost:5173` (o el puerto que indique Vite).

---

## 📂 Estructura del Proyecto

### Backend (`Backend/GestionIntegral.Api/`)
```
/Controllers/    # Controladores de la API, organizados por módulo
  Reportes/
    PdfTemplates/ # Templates de los reportes utilizados mediante QuestPDF
/Data/
  /Repositories/ # Lógica de acceso a datos con Dapper para cada entidad
  DbConnectionFactory.cs # Clase para crear conexiones a la BD
/Dtos/           # Data Transfer Objects, para comunicación entre capas y con el frontend
/Models/         # Clases que representan las tablas de la base de datos
/Services/       # Lógica de negocio, validaciones y orquestación
/Program.cs      # Configuración de servicios, DI, autenticación y middleware
```

### Frontend (`Frontend/`)
```
/src/
  /components/   # Componentes reutilizables (botones, modales, etc.)
  /contexts/     # React Contexts (ej: AuthContext)
  /hooks/        # Hooks personalizados
  /layouts/      # Estructuras de página principales (ej: MainLayout con sidebar y navbar)
  /models/       # Interfaces y tipos de TypeScript para DTOs y modelos del frontend
  /pages/        # Componentes de página principales, organizados por módulo
  /routes/       # Configuración de enrutamiento con React Router
  /services/     # Lógica para realizar llamadas a la API con Axios
  /App.tsx       # Componente raíz de la aplicación
  /main.tsx      # Punto de entrada de la aplicación React
```