Si hicimos un downgrade anteriormente, y podemos cerrar mesa y pagarla, pero al querer cancelar el cheque, nos aparece lo siguiente:




Debemos correr el siguiente query:



ALTER PROCEDURE [dbo].[sp_CancelaCheque]
@NumCheque int = 0,
@Autoriza int = 0 AS
BEGIN
DECLARE @@ViejoIdMesa as int, @@NuevoIdMesa as int
SET NOCOUNT ON

SELECT @@ViejoIdMesa = IdMesa FROM Mesas WHERE NumCheque = @NumCheque AND StatusMesa = 1

INSERT Mesas(NumCheque, FechaDelDia, Mesa, FechaHora, Personas, IdEmpleado, Total, Descuento, IVA, Propina, StatusMesa, Numfactura, VieneDel, IdCaja, IdCajero, IdDescuento, IdCliente,
CambioAMesa, QuienAutoriza, IdPrecioEspecial)
SELECT 0,FechaDelDia, Mesa, FechaHora, Personas, IdEmpleado, Total, Descuento, IVA, Propina, 0, NumFactura, @NumCheque, IdCaja, IdCajero, IdDescuento, IdCliente,
CambioAMesa, QuienAutoriza, IdPrecioEspecial FROM Mesas
WHERE NumCheque = @NumCheque AND StatusMesa = 1

SELECT @@NuevoIdMesa = IdMesa FROM Mesas WHERE VieneDel = @NumCheque

UPDATE Mesas SET StatusMesa = 3, FechaHora = GETDATE(), QuienAutoriza = @Autoriza WHERE IdMesa = @@ViejoIdMesa

--- Mete los que NO son Paquetes:

INSERT Comandas(IdMesa, NumComanda, IdProducto, Cantidad, Precio, Descuento, Monto, IVA, IdEmpleado,
QueHizo, AQueHora, Modificadores, Tiempo, Enviada, Servida, CodigosModificadores,
Persona, IEPS, EsPaquete, IdComandaPaquete)
SELECT @@NuevoIdMesa, NumComanda, IdProducto, Cantidad, Precio, Descuento, Monto, IVA, IdEmpleado,
6, AQueHora, Modificadores, Tiempo, Enviada, Servida, CodigosModificadores,
Persona, IEPS, EsPaquete, IdComandaPaquete FROM Comandas
WHERE IdMesa = @@ViejoIdMesa AND (EsPaquete <> 1 OR EsPaquete IS NULL)

--- Mete los que son Paquetes:

DECLARE @strSQL nvarchar(max), @EsteIdComanda int, @IdPrincipal int, @EsPaquete bit

DECLARE PaquetesMesaVieja CURSOR STATIC FOR
SELECT IdComanda, EsPaquete
FROM Comandas
WHERE IdMesa = @@ViejoIdMesa AND (EsPaquete = 1 AND EsPaquete IS NOT NULL) AND (IdComandaPaquete = 0 OR IdComandaPaquete IS NULL)
ORDER BY IdComanda

OPEN PaquetesMesaVieja

FETCH NEXT FROM PaquetesMesaVieja INTO @EsteIdComanda, @EsPaquete

WHILE @@FETCH_STATUS = 0
BEGIN

SET @IdPrincipal = 0

INSERT Comandas(IdMesa, NumComanda, IdProducto, Cantidad, Precio, Descuento, Monto, IVA, IdEmpleado,
QueHizo, AQueHora, Modificadores, Tiempo, Enviada, Servida, CodigosModificadores,
Persona, IEPS, EsPaquete, IdComandaPaquete)
SELECT @@NuevoIdMesa, NumComanda, IdProducto, Cantidad, Precio, Descuento, Monto, IVA, IdEmpleado,
6, AQueHora, Modificadores, Tiempo, Enviada, Servida, CodigosModificadores,
Persona, IEPS, EsPaquete, 0
FROM Comandas WHERE IdComanda = @EsteIdComanda

SELECT @IdPrincipal = SCOPE_IDENTITY();

INSERT Comandas(IdMesa, NumComanda, IdProducto, Cantidad, Precio, Descuento, Monto, IVA, IdEmpleado,
QueHizo, AQueHora, Modificadores, Tiempo, Enviada, Servida, CodigosModificadores,
Persona, IEPS, EsPaquete, IdComandaPaquete)
SELECT @@NuevoIdMesa, NumComanda, IdProducto, Cantidad, Precio, Descuento, Monto, IVA, IdEmpleado,
6, AQueHora, Modificadores, Tiempo, Enviada, Servida, CodigosModificadores,
Persona, IEPS, EsPaquete, @IdPrincipal
FROM Comandas WHERE IdComandaPaquete = @EsteIdComanda

FETCH NEXT FROM PaquetesMesaVieja INTO @EsteIdComanda, @EsPaquete
END

CLOSE PaquetesMesaVieja
DEALLOCATE PaquetesMesaVieja

UPDATE Comandas SET QueHizo = 3, NumComanda = 0, AQueHora = GETDATE() WHERE IdMesa = @@ViejoIdMesa

IF ((SELECT COUNT(*)
FROM sysobjects WHERE name = 'PI_RelacionPedidosMesas') <> 0)
UPDATE PI_RelacionPedidosMesas SET IdMesa = @@NuevoIdMesa WHERE IdMesa = @@ViejoIdMesa

DELETE Pagos WHERE IdMesa = @@ViejoIdMesa
DELETE CancelacionComandas WHERE QueHizo = 10 AND IdMesa = @@ViejoIdMesa
UPDATE Facturas SET Cancelada = 1 WHERE IdMesa = @@ViejoIdMesa
SELECT @@NuevoIdMesa
END