-- ============================================================
-- FIX: Cambiar ordenamiento del reporte de inventario
-- Fecha: 2026-06-09
-- Autor: Analisis automatico del sistema
-- ============================================================
-- PROBLEMA IDENTIFICADO:
-- El reporte de inventario ordenaba primero por producto,
-- luego por fecha (date_st_mov) y finalmente por id de
-- movimiento (id_sto_mov). Esto causaba que movimientos
-- registrados fuera de orden cronologico (por ejemplo,
-- ajustes retrospectivos o correcciones) se mostraran
-- desordenados respecto al flujo real de operaciones del
-- sistema.
--
-- SOLUCION APLICADA:
-- Se elimina el ordenamiento intermedio por fecha y se
-- deja unicamente el ordenamiento por id_sto_mov, que
-- refleja el orden secuencial de registro en la base de
-- datos (autoincremental). Esto garantiza que los
-- movimientos se muestren en el orden exacto en que
-- fueron procesados por el sistema, independientemente
-- de la fecha que tengan asignada.
--
-- NOTA: Este cambio es reversible. Si algo falla, ejecutar
--       rollback_report_inventoryv2_orderby.sql
-- ============================================================

DROP FUNCTION IF EXISTS public.report_inventoryv2();

CREATE OR REPLACE FUNCTION public.report_inventoryv2()
    RETURNS TABLE(
        date_movement date,
        id_product integer,
        name_product character varying,
        category_en character varying,
        category_esp character varying,
        movement character varying,
        comments_discard character varying,
        housekepper_name character varying,
        quantity integer,
        average_cost numeric,
        before_stock bigint,
        stock bigint
    )
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE PARALLEL UNSAFE
    ROWS 1000
AS $BODY$
BEGIN
    RETURN QUERY
    SELECT
        sm.date_st_mov AS date_movement,
        p.id_product,
        p.name_product,
        pcat.name_prod_category,
        pcat.spanish_name,
        mt.name_mov_type AS movement,
        sd.reason,
        emp.name_employee,
        /* Cantidad segun el tipo de movimiento */
        CASE
            WHEN mt.name_mov_type = 'Purchase'     THEN sm.quantity
            WHEN mt.name_mov_type = 'Adjustment'   THEN sa.adjustment::int
            WHEN mt.name_mov_type = 'New product'  THEN sm.stock_current::int
            WHEN mt.name_mov_type = 'Discard'      THEN sd.quantity*(-1)
            WHEN mt.name_mov_type = 'Consumption'  THEN sc.consumption_quantity*(-1)
            ELSE NULL
        END AS quantity,
        sm.average_cost,
        sm.stock_before,
        sm.stock_current
    FROM stock_movements sm
    INNER JOIN products p
        ON p.id_product = sm.id_product

    INNER JOIN movement_type mt
        ON sm.id_mov_type = mt.id_mov_type

    INNER JOIN stock st
        ON st.id_product = p.id_product

    INNER JOIN product_category pcat
        ON p.id_prod_category = pcat.id_prod_category

    /* AHORA CORRECTO: JOIN por id_stock_mov */
    LEFT JOIN purchase_detail pd
        ON pd.id_stock_mov = sm.id_sto_mov

    LEFT JOIN stock_adjusments sa
        ON sa.id_stock_mov = sm.id_sto_mov

    LEFT JOIN stock_discard sd
        ON sd.id_stock_mov = sm.id_sto_mov

    LEFT JOIN stock_consumption sc
        ON sc.id_stock_mov = sm.id_sto_mov
    LEFT JOIN employees emp
        ON sc.rfc_employee = emp.rfc_employee

    -- ============================================================
    -- ORDENAMIENTO MODIFICADO
    -- ============================================================
    -- Motivo: Se elimino el ordenamiento por fecha
    -- (sm.date_st_mov) porque no reflejaba el orden real de
    -- procesamiento del sistema. Ahora se ordena unicamente
    -- por producto y por id de movimiento secuencial, lo cual
    -- muestra los registros en el orden exacto en que fueron
    -- creados en la base de datos.
    --
    -- Fecha de cambio: 2026-06-09
    -- Referencia: Cambio de ordenamiento en Inventory Report
    -- ============================================================
    ORDER BY p.id_product, sm.id_sto_mov;
END;
$BODY$;

ALTER FUNCTION public.report_inventoryv2()
    OWNER TO postgres;

-- Confirmacion
SELECT 'Funcion report_inventoryv2 actualizada correctamente (ordenamiento modificado)' AS resultado;
