-- ============================================================
-- HOTFIX: Cortesía — corregir descuento_monto incorrecto
-- Fecha: 2026-03-23
-- Problema: Al registrar ventas de cortesía (descuento_tipo=1)
--   se almacenaba el subtotal como descuento_monto, generando
--   totales negativos en reportes (ej: descuento=12, total=-12).
-- Solución: descuento_monto debe ser 0 para cortesías.
--   El consumo real queda registrado en tm_detalle_pedido.
-- ============================================================

-- 1) Corregir registros existentes con descuento_monto incorrecto
UPDATE tm_venta
SET descuento_monto = 0
WHERE descuento_tipo = 1
  AND descuento_monto > 0;

-- Verificación (debe retornar 0 filas después del UPDATE):
-- SELECT id_venta, descuento_tipo, descuento_monto, total
-- FROM tm_venta
-- WHERE descuento_tipo = 1 AND descuento_monto > 0;


-- 2) Actualizar el stored procedure usp_restEmitirVenta
--    para que nuevas cortesías se guarden con descuento_monto = 0

DROP PROCEDURE IF EXISTS `usp_restEmitirVenta`;

DELIMITER //
CREATE PROCEDURE `usp_restEmitirVenta`(
    IN `_flag` INT(11),
    IN `_dividir_cuenta` INT(11),
    IN `_id_pedido` INT(11),
    IN `_tipo_pedido` INT(11),
    IN `_tipo_entrega` VARCHAR(1),
    IN `_id_cliente` INT(11),
    IN `_id_tipo_doc` INT(11),
    IN `_id_tipo_pago` INT(11),
    IN `_id_usu` INT(11),
    IN `_id_apc` INT(11),
    IN `_pago_efe_none` DECIMAL(10,2),
    IN `_pago_tar` DECIMAL(10,2),
    IN `_pago_yape` DECIMAL(10,2),
    IN `_pago_plin` DECIMAL(10,2),
    IN `_pago_tran` DECIMAL(10,2),
    IN `_descuento_tipo` INT(11),
    IN `_descuento_personal` INT(11),
    IN `_descuento_monto` DECIMAL(10,2),
    IN `_descuento_motivo` VARCHAR(200),
    IN `_comision_tarjeta` DECIMAL(10,2),
    IN `_comision_delivery` DECIMAL(10,2),
    IN `_igv` DECIMAL(10,2),
    IN `_total` DECIMAL(10,2),
    IN `_codigo_operacion` VARCHAR(50),
    IN `_fecha_venta` DATETIME
)
BEGIN
	DECLARE pago_efe DECIMAL(10,2) DEFAULT 0;
	DECLARE pago_tar DECIMAL(10,2) DEFAULT 0;
	DECLARE pago_yape DECIMAL(10,2) DEFAULT 0;
	DECLARE pago_plin DECIMAL(10,2) DEFAULT 0;
	DECLARE pago_tran DECIMAL(10,2) DEFAULT 0;

	if (_descuento_tipo = 1 or _descuento_tipo = 3) then
		SET pago_efe = 0;
		SET pago_tar = 0;
		SET pago_yape = 0;
		SET pago_plin = 0;
		SET pago_tran = 0;
		-- Cortesía (tipo 1): el consumo queda en tm_detalle_pedido; no registrar el subtotal
		-- como descuento financiero en tm_venta para que no afecte ningún reporte.
		-- Crédito personal (tipo 3) SÍ conserva su monto (es el crédito extendido al personal).
		IF _descuento_tipo = 1 THEN
			SET _descuento_monto = 0;
		END IF;
	else
		IF _id_tipo_pago = 1 THEN
			SET pago_efe = ( _total + _comision_delivery - _descuento_monto);
			SET pago_tar = 0;
			SET pago_yape = 0;
			SET pago_plin = 0;
			SET pago_tran = 0;
		ELSEIF _id_tipo_pago = 2 THEN
			SET pago_efe = 0;
			SET pago_tar = ( _total + _comision_delivery - _descuento_monto);
		ELSEIF _id_tipo_pago = 3 THEN
			SET pago_efe = ( _total + _comision_delivery - _descuento_monto) - _pago_tar - _pago_yape - _pago_plin - _pago_tran;
			SET pago_tar = _pago_tar;
			SET pago_yape = _pago_yape;
			SET pago_plin = _pago_plin;
			SET pago_tran = _pago_tran;
		ELSE
			SET pago_efe = 0;
			SET pago_tar = ( _total + _comision_delivery - _descuento_monto);
			SET pago_yape = 0;
			SET pago_plin = 0;
			SET pago_tran = 0;
		END IF;
	end if;

	IF _flag = 1 THEN

		SELECT serie,numero INTO @serie, @numinit
		FROM tm_tipo_doc
		WHERE id_tipo_doc = _id_tipo_doc;

		SET @numactual = 0;

		SELECT nro_doc INTO @numactual
		FROM tm_venta
		WHERE id_tipo_doc = _id_tipo_doc AND serie_doc = @serie
		ORDER BY nro_doc DESC LIMIT 1;

		IF (SELECT @numactual) > (SELECT @numinit) THEN
			SET @numero = @numactual+1;
		ELSEIF (SELECT @numactual) < (SELECT @numinit) THEN
			SET @numero = @numinit;
		ELSEIF (SELECT @numactual) = (SELECT @numinit) THEN
			SET @numero = @numinit+1;
		END IF;

		INSERT INTO tm_venta (id_pedido, id_tipo_pedido, id_cliente, id_tipo_doc, id_tipo_pago, id_usu, id_apc, serie_doc, nro_doc, pago_efe, pago_efe_none, pago_tar, pago_yape, pago_plin, pago_tran, descuento_tipo, descuento_personal, descuento_monto, descuento_motivo, comision_tarjeta, comision_delivery, igv, total, codigo_operacion, fecha_venta)
		VALUES (_id_pedido, _tipo_pedido, _id_cliente, _id_tipo_doc, _id_tipo_pago,_id_usu,_id_apc, @serie,@numero, pago_efe, _pago_efe_none, pago_tar, pago_yape, pago_plin, pago_tran, _descuento_tipo, _descuento_personal, _descuento_monto, _descuento_motivo, _comision_tarjeta, _comision_delivery, _igv, _total, _codigo_operacion, _fecha_venta );

		SELECT @@IDENTITY INTO @id;

		IF _dividir_cuenta = 1 THEN

			IF _tipo_pedido = 1 THEN
				SELECT id_mesa INTO @idMesa FROM tm_pedido_mesa WHERE id_pedido = _id_pedido;
				UPDATE tm_mesa SET estado = 'a' WHERE id_mesa = @idMesa;
				UPDATE tm_pedido SET estado = 'd' WHERE id_pedido = _id_pedido;
			elseIF _tipo_pedido = 2 then
				UPDATE tm_pedido SET estado = 'b' WHERE id_pedido = _id_pedido;
				UPDATE tm_pedido_llevar SET fecha_entrega = _fecha_venta WHERE id_pedido = _id_pedido;
			ELSEIF _tipo_pedido = 3 THEN

				UPDATE tm_pedido SET id_apc = _id_apc, id_usu = _id_usu, estado = _tipo_entrega WHERE id_pedido = _id_pedido;

				if _tipo_entrega = 'c' then
					UPDATE tm_pedido_delivery SET fecha_envio = _fecha_venta WHERE id_pedido = _id_pedido;
				elseif _tipo_entrega = 'd' then
					UPDATE tm_pedido_delivery SET fecha_entrega = _fecha_venta WHERE id_pedido = _id_pedido;
				end if;
			END IF;

		END IF;

		SELECT @id AS id_venta;

	END IF;

END//
DELIMITER ;
