<?php
// Incluir el archivo de conexión a la base de datos
include $_SERVER['DOCUMENT_ROOT'] . '/db/db.php';


//Actualizacion de precios por proveedor
function updateListaPrecios($idProveedor) {
    global $conn;

    // Consulta para obtener los datos
    $sql = "
   SELECT
    `db_compranet`.`tb_productos_variantes`.`id` AS `id`,
    `db_compranet`.`tb_productos_variantes`.`referenciaCPN` AS `referenciaCPN`,
    `db_compranet`.`tb_productos_variantes`.`precioListaProveedor` AS `precioListaProveedor`,
    `db_compranet`.`tb_descuentos_lineas`.`descuentoGeneral` AS `descuentoGeneral`,
    `db_compranet`.`tb_descuentos_lineas`.`descuentoAdicional` AS `descuentoAdicional`,
    `db_compranet`.`tb_impuestos`.`valor` AS `Impuesto`,
    `db_compranet`.`tb_descuentos_lineas`.`esOferta` AS `esOferta`,
    `db_compranet`.`tb_impuestos`.`nombre` AS `TipoImpuesto`,
    `db_compranet`.`tb_productos`.`idProveedor` AS `idProveedor`,
    `db_compranet`.`tb_descuentos_lineas`.`factorPrecioVenta` AS `factorPrecioVenta`,
    `db_compranet`.`tb_descuentos_lineas`.`comision` AS `comision`,
    (
        CEILING(
            (
                (
                    `db_compranet`.`tb_productos_variantes`.`precioListaProveedor` *(
                        (
                            (
                                (
                                    (
                                        1 - `db_compranet`.`tb_descuentos_lineas`.`descuentoGeneral`
                                    ) *(
                                        CASE WHEN(
                                            `db_compranet`.`tb_descuentos_lineas`.`esOferta` = 0
                                        ) THEN(
                                            1 - `db_compranet`.`tb_descuentos_lineas`.`descuentoAdicional`
                                        ) ELSE 1
                                    END
                                )
                            ) * `db_compranet`.`tb_descuentos_lineas`.`factorPrecioVenta`
                        ) *(
                            1 + `db_compranet`.`tb_descuentos_lineas`.`comision`
                        )
                    ) *(
                        1 + `db_compranet`.`tb_impuestos`.`valor`
                    )
                )
            ) / 10
        )
    ) * 10
) AS `PVP`,
(
    (
        CEILING(
            (
                (
                    `db_compranet`.`tb_productos_variantes`.`precioListaProveedor` *(
                        (
                            (
                                (
                                    (
                                        1 - `db_compranet`.`tb_descuentos_lineas`.`descuentoGeneral`
                                    ) *(
                                        CASE WHEN(
                                            `db_compranet`.`tb_descuentos_lineas`.`esOferta` = 0
                                        ) THEN(
                                            1 - `db_compranet`.`tb_descuentos_lineas`.`descuentoAdicional`
                                        ) ELSE 1
                                    END
                                )
                            ) * `db_compranet`.`tb_descuentos_lineas`.`factorPrecioVenta`
                        ) *(
                            1 + `db_compranet`.`tb_descuentos_lineas`.`comision`
                        )
                    ) *(
                        1 + `db_compranet`.`tb_impuestos`.`valor`
                    )
                )
            ) / 10
        )
    ) * 10
) /(
    1 + `db_compranet`.`tb_impuestos`.`valor`
)
) AS `PVPantesImpuestos`,
(
    CASE WHEN(
        `db_compranet`.`tb_descuentos_lineas`.`esOferta` = 1
    ) THEN(
        (
            CEILING(
                (
                    (
                        (
                            `db_compranet`.`tb_productos_variantes`.`precioListaProveedor` *(
                                (
                                    (
                                        (
                                            1 - `db_compranet`.`tb_descuentos_lineas`.`descuentoGeneral`
                                        ) *(
                                            1 - `db_compranet`.`tb_descuentos_lineas`.`descuentoAdicional`
                                        )
                                    ) * `db_compranet`.`tb_descuentos_lineas`.`factorPrecioVenta`
                                ) *(
                                    1 + `db_compranet`.`tb_descuentos_lineas`.`comision`
                                )
                            )
                        ) *(
                            1 + `db_compranet`.`tb_impuestos`.`valor`
                        )
                    ) / 10
                )
            ) * 10
        ) /(
            1 + `db_compranet`.`tb_impuestos`.`valor`
        )
    ) ELSE NULL
END
) AS `PVPReducidoAntesImpuestos`,
(
    CASE WHEN(
        `db_compranet`.`tb_descuentos_lineas`.`esOferta` = 1
    ) THEN(
        CEILING(
            (
                (
                    (
                        `db_compranet`.`tb_productos_variantes`.`precioListaProveedor` *(
                            (
                                (
                                    (
                                        1 - `db_compranet`.`tb_descuentos_lineas`.`descuentoGeneral`
                                    ) *(
                                        1 - `db_compranet`.`tb_descuentos_lineas`.`descuentoAdicional`
                                    )
                                ) * `db_compranet`.`tb_descuentos_lineas`.`factorPrecioVenta`
                            ) *(
                                1 + `db_compranet`.`tb_descuentos_lineas`.`comision`
                            )
                        )
                    ) *(
                        1 + `db_compranet`.`tb_impuestos`.`valor`
                    )
                ) / 10
            )
        ) * 10
    ) ELSE NULL
END
) AS `PVPReducido`
FROM
    (
        `db_compranet`.`tb_descuentos_lineas`
    JOIN(
            (
                `db_compranet`.`tb_productos`
            JOIN `db_compranet`.`tb_productos_variantes` ON
                (
                    (
                        `db_compranet`.`tb_productos`.`id` = `db_compranet`.`tb_productos_variantes`.`idProducto`
                    )
                )
            )
        JOIN `db_compranet`.`tb_impuestos` ON
            (
                (
                    `db_compranet`.`tb_productos`.`idImpuesto` = `db_compranet`.`tb_impuestos`.`id`
                )
            )
        )
    ON
        (
            (
                (
                    `db_compranet`.`tb_descuentos_lineas`.`idLinea` = `db_compranet`.`tb_productos_variantes`.`idLinea`
                ) AND(
                    `db_compranet`.`tb_descuentos_lineas`.`idProveedor` = `db_compranet`.`tb_productos`.`idProveedor`
                )
            )
        )
    )
WHERE
    (
        `db_compranet`.`tb_productos_variantes`.`precioListaProveedor` > 0 AND db_compranet.tb_productos.idProveedor = ?
    )
ORDER BY
    (
        CASE WHEN(
            `db_compranet`.`tb_descuentos_lineas`.`esOferta` = 1
        ) THEN(
            CEILING(
                (
                    (
                        (
                            `db_compranet`.`tb_productos_variantes`.`precioListaProveedor` *(
                                (
                                    (
                                        (
                                            1 - `db_compranet`.`tb_descuentos_lineas`.`descuentoGeneral`
                                        ) *(
                                            1 - `db_compranet`.`tb_descuentos_lineas`.`descuentoAdicional`
                                        )
                                    ) * `db_compranet`.`tb_descuentos_lineas`.`factorPrecioVenta`
                                ) *(
                                    1 + `db_compranet`.`tb_descuentos_lineas`.`comision`
                                )
                            )
                        ) *(
                            1 + `db_compranet`.`tb_impuestos`.`valor`
                        )
                    ) / 10
                )
            ) * 10
        ) ELSE NULL
    END
)
DESC";

$stmt = $conn->prepare($sql);

    $stmt->bind_param("i", $idProveedor);
    $stmt->execute();
    $result = $stmt->get_result();

    // IDs de productos obtenidos
    $idsObtenidos = [];

    if ($result->num_rows > 0) {
        // Procesar los datos obtenidos
        while($row = $result->fetch_assoc()) {
            $id = $row['id'];
            $referenciaCPN = $row['referenciaCPN'];
            $precioListaProveedor = $row['precioListaProveedor'];
            $descuentoGeneral = $row['descuentoGeneral'];
            $descuentoAdicional = $row['descuentoAdicional'];
            $Impuesto = $row['Impuesto'];
            $esOferta = $row['esOferta'];
            $TipoImpuesto = $row['TipoImpuesto'];
            $idProveedor = $row['idProveedor'];
            $factorPrecioVenta = $row['factorPrecioVenta'];
            $comision = $row['comision'];
            $PVP = $row['PVP'];
            $PVPantesImpuestos = $row['PVPantesImpuestos'];
            $PVPReducidoAntesImpuestos = $row['PVPReducidoAntesImpuestos'];
            $PVPReducido = $row['PVPReducido'];

            // Insertar o actualizar los datos en la tabla tb_lista_precios
            $insertOrUpdateSQL = "
            INSERT INTO tb_lista_precios (id, referenciaCPN, precioListaProveedor, descuentoGeneral, descuentoAdicional, Impuesto, esOferta, TipoImpuesto, idProveedor, factorPrecioVenta, comision, PVP, PVPantesImpuestos, PVPReducidoAntesImpuestos, PVPReducido) 
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
            ON DUPLICATE KEY UPDATE 
            referenciaCPN = VALUES(referenciaCPN),
            precioListaProveedor = VALUES(precioListaProveedor),
            descuentoGeneral = VALUES(descuentoGeneral),
            descuentoAdicional = VALUES(descuentoAdicional),
            Impuesto = VALUES(Impuesto),
            esOferta = VALUES(esOferta),
            TipoImpuesto = VALUES(TipoImpuesto),
            factorPrecioVenta = VALUES(factorPrecioVenta),
            comision = VALUES(comision),
            PVP = VALUES(PVP),
            PVPantesImpuestos = VALUES(PVPantesImpuestos),
            PVPReducidoAntesImpuestos = VALUES(PVPReducidoAntesImpuestos),
            PVPReducido = VALUES(PVPReducido)";

            $stmt2 = $conn->prepare($insertOrUpdateSQL);
            $stmt2->bind_param("isddddisdiddddd", $id, $referenciaCPN, $precioListaProveedor, $descuentoGeneral, $descuentoAdicional, $Impuesto, $esOferta, $TipoImpuesto, $idProveedor, $factorPrecioVenta, $comision, $PVP, $PVPantesImpuestos, $PVPReducidoAntesImpuestos, $PVPReducido);

            if (!$stmt2->execute()) {
                echo "Error: " . $stmt2->error;
            } else {
                // Agregar el ID al array de IDs obtenidos
                $idsObtenidos[] = $id;
            }
        }
    } else {
        echo "No se encontraron datos.";
    }

    // Eliminar registros que no están en los resultados de la consulta
    if (!empty($idsObtenidos)) {
        $idsObtenidosList = implode(",", $idsObtenidos);
        $deleteSQL = "DELETE FROM tb_lista_precios WHERE idProveedor = ? AND id NOT IN ($idsObtenidosList)";
        $stmt3 = $conn->prepare($deleteSQL);
        $stmt3->bind_param("i", $idProveedor);
        if (!$stmt3->execute()) {
            echo "Error al eliminar registros: " . $stmt3->error;
        }
    } else {
        // Si no hay IDs obtenidos, eliminar todos los registros del proveedor
        $deleteAllSQL = "DELETE FROM tb_lista_precios WHERE idProveedor = ?";
        $stmt4 = $conn->prepare($deleteAllSQL);
        $stmt4->bind_param("i", $idProveedor);
        if (!$stmt4->execute()) {
            echo "Error al eliminar todos los registros: " . $stmt4->error;
        }
    }

    // Cerrar conexiones
    $stmt->close();
}

function actualizar_escala_descuentos_variaciones($proveedor_id) {
    global $conn;

    // Crear una tabla temporal para almacenar los resultados de la consulta
    $createTempTableSQL = "
    CREATE TEMPORARY TABLE temp_escala_descuentos_variaciones AS
    SELECT
        tb_productos.idProveedor,
        tb_productos_variantes.id AS idVariacion,
        tb_valores_escalas_descuento.id AS idValorEscalaDescuento,
ROUND(
        LEAST(
            IFNULL(tb_productos_variantes.PVPantesImpuestos, 9999999),
            IFNULL(tb_productos_variantes.PVPreducidoantesImpuestos, 9999999)
        ) * (1 - tb_valores_escalas_descuento.porcentaje_descuento),
        0
    ) AS PVPantesImpuestos,
    ROUND(
        LEAST(
            IFNULL(tb_productos_variantes.PVPantesImpuestos, 9999999),
            IFNULL(tb_productos_variantes.PVPreducidoantesImpuestos, 9999999)
        ) * (1 - tb_valores_escalas_descuento.porcentaje_descuento) * (1 + tb_impuestos.valor),
        0
    ) AS PVP,
    CASE 
        WHEN ROUND(
            LEAST(
                IFNULL(tb_productos_variantes.PVPantesImpuestos, 9999999),
                IFNULL(tb_productos_variantes.PVPreducidoantesImpuestos, 9999999)
            ),
            0
        ) = 0 THEN 0
        ELSE CEILING(
            tb_valores_escalas_descuento.valor_desde / ROUND(
                LEAST(
                    IFNULL(tb_productos_variantes.PVPantesImpuestos, 9999999),
                    IFNULL(tb_productos_variantes.PVPreducidoantesImpuestos, 9999999)
                ),
                0
            )
        )
    END AS cantidadRequerida
    FROM
        tb_productos
    INNER JOIN tb_productos_variantes ON tb_productos.id = tb_productos_variantes.idProducto
    INNER JOIN tb_descuentos_lineas ON tb_productos_variantes.idLinea = tb_descuentos_lineas.idLinea AND tb_productos.idProveedor = tb_descuentos_lineas.idProveedor
    INNER JOIN tb_escalas_descuentos_lineas ON tb_descuentos_lineas.id = tb_escalas_descuentos_lineas.idLinea
    INNER JOIN tb_lista_escala_descuentos ON tb_escalas_descuentos_lineas.idEscala = tb_lista_escala_descuentos.id
    INNER JOIN tb_valores_escalas_descuento ON tb_lista_escala_descuentos.id = tb_valores_escalas_descuento.idEscala
    INNER JOIN tb_impuestos ON tb_impuestos.id = tb_productos.idImpuesto 
    WHERE tb_productos.idProveedor = ? AND tb_valores_escalas_descuento.valor_desde > 1 AND tb_productos_variantes.PVPantesImpuestos>1 ";

    $stmt = $conn->prepare($createTempTableSQL);
    $stmt->bind_param("i", $proveedor_id);
    if (!$stmt->execute()) {
        echo "Error al crear la tabla temporal: " . $stmt->error;
        return;
    }
    $stmt->close();

    // Actualizar registros existentes
    $updateSQL = "
    UPDATE tb_escala_descuentos_variaciones es
    INNER JOIN temp_escala_descuentos_variaciones temp ON es.idProveedor = temp.idProveedor 
                                                      AND es.idVariacion = temp.idVariacion 
                                                      AND es.idValorEscalaDescuento = temp.idValorEscalaDescuento
    SET es.PVPantesImpuestos = temp.PVPantesImpuestos,
        es.PVP = temp.PVP,
        es.cantidadRequerida = temp.cantidadRequerida
    WHERE es.PVPantesImpuestos != temp.PVPantesImpuestos 
       OR es.PVP != temp.PVP 
       OR es.cantidadRequerida != temp.cantidadRequerida";
    if (!$conn->query($updateSQL)) {
        echo "Error al actualizar registros existentes: " . $conn->error;
        return;
    }

    // Eliminar registros que no están en la consulta
    $deleteSQL = "
    DELETE FROM tb_escala_descuentos_variaciones
    WHERE idProveedor = ?
      AND (idProveedor, idVariacion, idValorEscalaDescuento) NOT IN (
        SELECT idProveedor, idVariacion, idValorEscalaDescuento 
        FROM temp_escala_descuentos_variaciones
    )";
    $stmt = $conn->prepare($deleteSQL);
    $stmt->bind_param("i", $proveedor_id);
    if (!$stmt->execute()) {
        echo "Error al eliminar registros: " . $stmt->error;
        return;
    }
    $stmt->close();

    // Insertar nuevos registros que no están en la tabla original
    $insertSQL = "
    INSERT INTO tb_escala_descuentos_variaciones (idProveedor, idVariacion, idValorEscalaDescuento, PVPantesImpuestos, PVP, cantidadRequerida)
    SELECT temp.idProveedor, temp.idVariacion, temp.idValorEscalaDescuento, temp.PVPantesImpuestos, temp.PVP, temp.cantidadRequerida
    FROM temp_escala_descuentos_variaciones temp
    LEFT JOIN tb_escala_descuentos_variaciones es ON temp.idProveedor = es.idProveedor 
                                                AND temp.idVariacion = es.idVariacion 
                                                AND temp.idValorEscalaDescuento = es.idValorEscalaDescuento
    WHERE es.idVariacion IS NULL";
    if (!$conn->query($insertSQL)) {
        echo "Error al insertar nuevos registros: " . $conn->error;
        return;
    }

    // Eliminar la tabla temporal
    $dropTempTableSQL = "DROP TEMPORARY TABLE temp_escala_descuentos_variaciones";
    if (!$conn->query($dropTempTableSQL)) {
        echo "Error al eliminar la tabla temporal: " . $conn->error;
    }
}


function actualizar_marpico() {
    global $conn;

    // Consulta 1: Resetear inventario y vinculado
    $resetInventarioSQL = "
    UPDATE db_compranet.tb_productos
    INNER JOIN db_compranet.tb_productos_variantes 
    ON db_compranet.tb_productos.id = db_compranet.tb_productos_variantes.idProducto 
    SET db_compranet.tb_productos_variantes.inventario = 0, 
        db_compranet.tb_productos_variantes.vinculado = 0
    WHERE db_compranet.tb_productos.idProveedor = 1";
    if (!$conn->query($resetInventarioSQL)) {
        echo "Error en la consulta 1: " . $conn->error;
        return;
    }

    // Consulta 2: Actualizar precioListaProveedor
    $updatePrecioListaProveedorSQL = "
    UPDATE db_compranet.tb_productos_variantes AS tpv
    JOIN db_compranet.tb_productos AS p ON tpv.idProducto = p.id
    JOIN db_inventarios_compranet.marpico_inventario AS mi ON tpv.referenciaProveedor = mi.codigo
    SET tpv.precioListaProveedor = (mi.precio * (1 - (mi.descuento / -100)))
    WHERE p.idProveedor = 1";
    if (!$conn->query($updatePrecioListaProveedorSQL)) {
        echo "Error en la consulta 2: " . $conn->error;
        return;
    }

    // Consulta 3: Actualizar idLinea
    $updateIdLineaSQL = "
    UPDATE db_compranet.tb_productos_variantes AS tpv
    JOIN db_compranet.tb_productos AS p ON tpv.idProducto = p.id
    JOIN db_inventarios_compranet.marpico_inventario AS mi ON tpv.referenciaProveedor = mi.codigo
    SET tpv.idLinea = CASE
        WHEN mi.variedad LIKE '%Outlet%' THEN 5
        WHEN mi.variedad LIKE '%GB%' THEN 4
        WHEN mi.variedad LIKE '%USB%' THEN 4
        WHEN mi.variedad LIKE '%Manilla%' THEN 4
        ELSE 2
    END
    WHERE p.idProveedor = 1";
    if (!$conn->query($updateIdLineaSQL)) {
        echo "Error en la consulta 3: " . $conn->error;
        return;
    }

    // Consulta 4: Actualizar inventario
    $updateInventarioSQL = "
    UPDATE db_compranet.tb_productos_variantes AS tpv
    JOIN db_compranet.tb_productos AS p ON tpv.idProducto = p.id
    JOIN db_inventarios_compranet.marpico_inventario AS mi ON tpv.referenciaProveedor = mi.codigo
    JOIN db_compranet.tb_tipo_min_inventario AS tmi ON tpv.idTipoMinInventario = tmi.id
    SET 
        tpv.inventario = CASE
            WHEN mi.cantidad - tmi.cantidad < 0 THEN 0
            ELSE mi.cantidad - tmi.cantidad
        END
    WHERE p.idProveedor = 1";
    if (!$conn->query($updateInventarioSQL)) {
        echo "Error en la consulta 4: " . $conn->error;
        return;
    }

    // Consulta 5: Actualizar vinculado
    $updateVinculadoSQL = "
    UPDATE
        db_inventarios_compranet.marpico_inventario
    INNER JOIN db_compranet.tb_productos_variantes
    ON db_inventarios_compranet.marpico_inventario.codigo = db_compranet.tb_productos_variantes.referenciaProveedor
    INNER JOIN db_compranet.tb_productos ON db_compranet.tb_productos_variantes.idProducto = db_compranet.tb_productos.id
    SET db_compranet.tb_productos_variantes.vinculado = 1
    WHERE db_compranet.tb_productos.idProveedor = 1";
    if (!$conn->query($updateVinculadoSQL)) {
        echo "Error en la consulta 5: " . $conn->error;
        return;
    }

    // Llamar a las funciones updateListaPrecios y actualizar_escala_descuentos_variaciones
    updateListaPrecios(1);
    actualizar_escala_descuentos_variaciones(1);
}

?>
