Entrada 16 (Controlador de movimientos)

Fecha: 27 de abril de 2026

Inicio: [11:34] | Fin: [12:48] || Total: [1 hora y 16 minutos]

Presente: Sebastián Ramírez Abarca

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

¿QUÉ HICIMOS HOY?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

- Se creó el archivo movimientoController.ts que controla movimientos.

- Se creó el archivo movimientos.ts para manejar la ruta.

- Se corrigió una dirección en errorHelper.ts

 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

PROBLEMAS DETECTADOS Y CÓMO RESOLVERLOS

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

- En errorHelper.ts escribí mal una dirección por lo que daba error al probar con datos que debían tirar error.

Solución: corregir la ruta, me faltó un punto para señalar que vaya a la dirección raíz.

Antes: import { getPool, sql } from './db/connection';

Después: import { getPool, sql } from '../db/connection';

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

DUDAS Y DIVERGENCIAS DE CRITERIOS

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

- No hubo dudas ni divergencias en esta sesión.

 

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

AVANCE DEL CÓDIGO

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

versión actualizada de errorHelper.ts:

import { getPool, sql } from '../db/connection';

movimientoController.ts:

import { Request, Response } from 'express';
import { getPool, sql } from '../db/connection';
import { getErrorMessage } from '../utils/errorhelper';

// GET /api/movimientos/:valorDocumentoIdentidad
// Llama sp_GetMovimientos y retorna todos los movimientos del empleado
export async function getMovimientos(req: Request, res: Response): Promise<void> {
    try {
        const valorDocumentoIdentidad = String(req.params.valorDocumentoIdentidad ?? '').trim();

        if (!valorDocumentoIdentidad) {
            res.status(400).json({
                success: false,
                message: 'valorDocumentoIdentidad es requerido'
            })
            return;
        }

        const pool = await getPool();

        const result = await pool
            .request()
            .input('inValorDocumentoIdentidad', sql.VarChar(32), valorDocumentoIdentidad)
            .output('outResultCode', sql.Int)
            .execute('sp_GetMovimientos');

        const outResultCode: number = result.output.outResultCode;

        if (outResultCode !== 0) {
            res.status(400).json({
                success: false,
                outResultCode,
                message: await getErrorMessage(outResultCode)
            })
            return;
        }

        res.status(200).json({
            success: true,
            outResultCode,
            data: result.recordset
        });
   
    } catch (error) {
        console.error('Error en getMovimientos:', error);
        res.status(500).json ({
            success: false,
            outResultCode: 50008,
            message: 'Error interno del servidor'
        });
    }
}

// POST /api/movimientos
// Llama sp_InsertMovimiento para agregar un nuevo movimiento
export async function insertMovimiento(req: Request, res: Response): Promise<void> {
    const { valorDocumentoIdentidad, nombreTipoMovimiento, monto, fecha } = req.body;

    if (!valorDocumentoIdentidad || !nombreTipoMovimiento || monto === undefined || !fecha){
        res.status(400).json({
            success: false,
            message: 'valorDocumentoIdentidad, nombreTipoMovimiento, monto y fecha son requeridos'
        });
        return;
    }

    try {
        const username = String(req.headers['x-username'] ?? 'UsuarioScripts')
        const ipPostIn = req.ip ?? '';
        const postTime = new Date();

        const pool = await getPool();

        const result = await pool
            .request()
            .input('inValorDocumentoIdentidad', sql.VarChar(32), String(valorDocumentoIdentidad))
            .input('inNombreTipoMovimiento', sql.VarChar(64), String(nombreTipoMovimiento))
            .input('inMonto', sql.Decimal(10, 2), Number(monto))
            .input('inUsername', sql.VarChar(64), username)
            .input('inIpPostIn', sql.VarChar(32), ipPostIn)
            .input('inPostTime', sql.DateTime, postTime)
            .input('inFecha', sql.Date, new Date(fecha))
            .output('outResultCode', sql.Int)
            .execute('sp_InsertMovimiento');

        const outResultCode: number = result.output.outResultCode;

        if (outResultCode !== 0) {
            res.status(400).json({
                success: false,
                outResultCode,
                message: await getErrorMessage(outResultCode)
            });
            return;
        }

        res.status(201).json({
            success: true,
            outResultCode,
            message: 'Movimiento insertado exitosamente'
        });
       
    } catch (error) {
        console.error('Error en insertMovimiento:', error);
        res.status(500).json ({
            success: false,
            outResultCode: 50008,
            message: 'Error interno del servidor'
        });
    }
}

Y movimientos.ts:

import { Router } from 'express';
import { getMovimientos, insertMovimiento } from '../controllers/movimientoController';

const router = Router();

// GET /api/movimientos/:valorDocumentoIdentidad para lista movimientos de un empleado
router.get('/:valorDocumentoIdentidad', getMovimientos);

// Post /api/movimientos para agregar un nuevo movimiento
router.post('/', insertMovimiento);

export default router;

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

MORALEJAS / BUENAS PRÁCTICAS

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

- Desde Visual Studio Code se puede poner al día el repositorio local con el de github presionando sync changes. Antes volvía a sacar copia completa del repositorio de github.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

PRÓXIMA SESIÓN: ¿QUÉ SIGUE?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

- Crear página de insertar movimientos.

Comentarios

Entradas más populares de este blog

Entrada 20 (Lógica de insertarMovimientos, conectarla y probarla)

Entrada 21 (Análisis de resultados)