USE GLPLUGINS
GO
SET DATEFORMAT YMD;

-- VER. 1.0.0.22

-- SP_VALIDARFACTVENTA
	DROP PROCEDURE IF EXISTS [dbo].[SP_VALIDARFACTVENTA]
	GO

	SET ANSI_NULLS ON
	GO
	SET QUOTED_IDENTIFIER ON
	GO
	-- =============================================
	-- Author:		EChevez
	-- Create date: 2025-11-19
	-- Update date: 2025-11-19
	-- Description:	Validar factura de venta.
	-- =============================================
	CREATE PROCEDURE [dbo].[SP_VALIDARFACTVENTA]
		@FO SMALLINT, 
		@SERIE VARCHAR(4), 
		@NUMERO INT,
		@N CHAR(1)
	AS
	BEGIN
		SET NOCOUNT ON;
		SET DATEFORMAT YMD;

		DECLARE @VALIDACION AS TABLE(
			RESULTADO BIT,
			MENSAJE VARCHAR(300)
		);

		DECLARE @SALA SMALLINT;
		DECLARE @MESA INT;
		DECLARE @FECHA DATETIME;
		DECLARE @CODCLIENTE INT;
		DECLARE @CODVENDEDOR INT;
		DECLARE @CAJA INT;
		DECLARE @CARGO DECIMAL(12,2);
		DECLARE @TOTALNETO DECIMAL(12,2);
		DECLARE @SUPEDIDO VARCHAR(15);
		DECLARE @IDMOTIVODTO INT;
		DECLARE @FECHAINI DATETIME;
		DECLARE @IDMINUTA BIGINT;
		
		DECLARE @FODISTRIBUIDOR SMALLINT;
		DECLARE @VENDEDOR VARCHAR(255);
		DECLARE @CAJAMANAGER INT;

		DECLARE @CODFORMAPAGOLEALTAD INT;
		DECLARE @CODFORMAPAGOCREDITOEMPLEADO INT;
		DECLARE @CODFORMAPAGOCUPONEMPLEADO INT;

		DECLARE @CODMOTIVODTOCERTIFICADO INT;
		DECLARE @CODMOTIVODTOEMPLEADO INT;
		DECLARE @CODMOTIVODTOCUPONCUMPLEANERO INT;

		-- OBTENER VALORES DE TIQUETSCAB
		SELECT @SALA = ISNULL(SALA, 0), 
		@MESA = ISNULL(MESA, 0),
		@FECHA = ISNULL(FECHA, GETDATE()),
		@CODCLIENTE = ISNULL(CODCLIENTE, 0),
		@CODVENDEDOR = ISNULL(CODVENDEDOR, 0),
		@CAJA = ISNULL(CAJA, 0),
		@CARGO = CAST(ISNULL(CARGO, 0) AS DECIMAL(12,2)), 
		@TOTALNETO =  CAST(ISNULL(TOTALNETO, 0) AS DECIMAL(10,2)),
		@SUPEDIDO = ISNULL(SUPEDIDO, ''), 
		@IDMOTIVODTO = ISNULL(IDMOTIVODTO, -1), 
		@FECHAINI = ISNULL(FECHAINI, GETDATE()), 
		@IDMINUTA = ISNULL(IDMINUTA, 0) 
		FROM ICGFRONTREST.DBO.TIQUETSCAB 
		WHERE FO = @FO 
		AND SERIE = @SERIE 
		AND NUMERO = @NUMERO 
		AND N = @N;

		-- OBTENER CODIGO DE FO DE DISTRIBUIDORES
		SELECT @FODISTRIBUIDOR = CAST(VALOR AS INT) 
		FROM PARAMETROS 
		WHERE CLAVE = 'FO_DISTRIBUIDOR';

		-- OBTENGA NOMBRE DE VENDEDOR
		SELECT @VENDEDOR = ISNULL(NOMBREVENDEDOR, '') 
		FROM [ICGFRONTREST].[DBO].[VENDEDORES] 
		WHERE CODVENDEDOR = @CODVENDEDOR;

		-- OBTENER CAJAMGR
		SELECT @CAJAMANAGER = ISNULL(CAJAMANAGER, 0) 
		FROM [ICGFRONTREST].[DBO].[REM_CAJASMGR] 
		WHERE CAJAFRONT = @CAJA;

		-- OBTERNER CODIGO DE FORMA DE PAGO LEALTAD
		SELECT @CODFORMAPAGOLEALTAD = CAST(VALOR AS INT) 
		FROM PARAMETROS 
		WHERE CLAVE = 'FDP_LEALTAD';

		-- OBTENER CODIGO DE FORMA DE PAGO CREDITO EMPLEADO
		SELECT @CODFORMAPAGOCREDITOEMPLEADO = CAST(VALOR AS INT) 
		FROM PARAMETROS 
		WHERE CLAVE = 'FDP_CREDITO_EMPLEADO';

		-- OBTENER CODIGO DE FORMA DE PAGO CUPON EMPLEADO
		SELECT @CODFORMAPAGOCUPONEMPLEADO = CAST(VALOR AS INT) 
		FROM PARAMETROS 
		WHERE CLAVE = 'FDP_CUPON_EMPLEADO';

		-- OBTENER CODIGO DE MOTIVO DE DESCUENTO DE CERTIFICADO DE REGALO
		SELECT @CODMOTIVODTOCERTIFICADO = CAST(VALOR AS INT) 
		FROM PARAMETROS 
		WHERE CLAVE = 'MD_CERT_REG';

		-- OBTENER CODIGO DE MOTIVO DE DESCUENTO DE EMPLEADO
		SELECT @CODMOTIVODTOEMPLEADO = CAST(VALOR AS INT) 
		FROM PARAMETROS 
		WHERE CLAVE = 'MD_DTO_EMP';

		-- OBTENER CODIGO DE MOTIVO DE DESCUENTO DE CUPON CUMPLEANERO
		SELECT @CODMOTIVODTOCUPONCUMPLEANERO = CAST(VALOR AS INT) 
		FROM PARAMETROS 
		WHERE CLAVE = 'MD_CUPON_CUMP';
		

		-- VALIDACIONES ENTRE SUCURSAL Y DISTRIBUIDORES
		IF @FO != @FODISTRIBUIDOR
		BEGIN
			-- VALIDAR FORMA DE PAGO ANTICIPO A PEDIDO EN ENCARGO DE SUCURSALES
			IF (@SUPEDIDO != '' AND EXISTS(SELECT * FROM ICGFRONTREST.DBO.TIQUETSPAG WHERE FO = @FO AND SERIE = @SERIE AND NUMERO = @NUMERO AND N = @N AND CODFORMAPAGO != 52))
			BEGIN
				INSERT INTO @VALIDACION 
				VALUES
				(0, 'La única forma de pago permitida para ENCARGOS es ANTICIPO A PEDIDOS');
			END
		END
		ELSE 
		BEGIN
			-- VALIDACIONES PARA DISTRIBUIDORES
			IF @TOTALNETO > 0
			BEGIN
				DECLARE @ERROR NVARCHAR(MAX) = ''

				-- FORMA DE PAGO INVALIDA EN PEDIDOS
				IF (EXISTS(SELECT 1 FROM ICGFRONTREST.DBO.TIQUETSPAG WHERE FO = @FO AND SERIE = @SERIE AND NUMERO = @NUMERO AND N = @N 
									AND CODFORMAPAGO NOT IN (SELECT CODFORMAPAGO FROM ICGFRONTREST.DBO.FORMASPAGO WHERE PENDIENTE = 'T')))
				BEGIN
					INSERT INTO @VALIDACION 
					VALUES
					(0, 'Las únicas forma de pago permitidas para facturacion de ENCARGOS son al CREDITO');
				END

				-- Facturacion omitiendo minuta (union minutas) de cliente al que se esta facturando
				IF (EXISTS(SELECT 1 FROM ICGFRONTREST.DBO.MINUTASCAB WHERE CODCLIENTE =@CODCLIENTE AND MESA IN 
										(SELECT NumeroPedido FROM MINUTAESPERA WHERE IdSucursal = @FO AND CodCliente = @CODCLIENTE AND Facturado = '0')))
				BEGIN
					INSERT INTO @VALIDACION 
					VALUES
					(0, 'No se ha realizado la UNION MINUTA de todas las minutas asociadas al cliente');
				END
			END
			ELSE
			BEGIN
				DECLARE @GuidFacturacionAnulacion UNIQUEIDENTIFIER = (SELECT TOP 1 GuidFacturacion FROM  [GLPLUGINS].[dbo].[MINUTAESPERA]  WHERE IdSucursal = @FO AND CodCliente = @CODCLIENTE AND Facturado = '1' AND NumeroPedido = @MESA)

				UPDATE MINUTAESPERA SET Facturado = '0', Entregado = '0' WHERE IdSucursal = @FO AND CodCliente = @CODCLIENTE AND GuidFacturacion = @GuidFacturacionAnulacion;
			END
		END
		-- END VALIDACIONES ENTRE SUCURSAL Y DISTRIBUIDORES

		-- VALIDAR PAGO CON CERTIFICADO DE REGALO
		IF @IDMOTIVODTO = @CODMOTIVODTOCERTIFICADO 
		BEGIN
			DECLARE @MONTOCERTIFICADO DECIMAL(12,2);
			DECLARE @SALDOCERTIFICADO DECIMAL(12,2);

			SELECT @MONTOCERTIFICADO = MONTO,
			@SALDOCERTIFICADO = SALDO 
			FROM CERTIFICADOSREGALOMINUTAS 
			WHERE FO = @FO 
			AND SERIE = @SERIE 
			AND NUMERO = @NUMERO 
			AND N = @N;

			IF @SALDOCERTIFICADO < @MONTOCERTIFICADO
			BEGIN
				INSERT INTO @VALIDACION 
				VALUES
				(0, 'El saldo del CERTIFICADO DE REGALO es menor al MONTO A PAGAR');
			END
		END
		-- END VALIDAR PAGO CON CERTIFICADO DE REGALO

		-- VALIDAR PAGO CON CREDITO DE EMPLEADO -> CUPON
		IF EXISTS(SELECT * FROM ICGFRONTREST.DBO.TIQUETSPAG WHERE FO = @FO AND SERIE = @SERIE AND NUMERO = @NUMERO AND N = @N AND CODFORMAPAGO = @CODFORMAPAGOCREDITOEMPLEADO)
		BEGIN
			IF EXISTS (SELECT * FROM EMPLEADOSMINUTAS WHERE IDMINUTA = @IDMINUTA OR FECHA = @FECHAINI)
			BEGIN
				DECLARE @IDEMPLEADO INT;
				DECLARE @TOKEN VARCHAR(50);
				DECLARE @SALDOCREDITO DECIMAL(12,2);
				DECLARE @SALDOCUPON DECIMAL(12,2);
				DECLARE @MONTOCREDITO DECIMAL(12,2);
				DECLARE @MONTOCUPON DECIMAL(12,2);

				SELECT @IDEMPLEADO = IDEMPLEADO,
				@TOKEN = ISNULL(TOKEN, ''), 
				@SALDOCREDITO = ISNULL(SALDOCREDITO, 0),
				@SALDOCUPON = ISNULL(SALDOCUPON, 0)
				FROM EMPLEADOSMINUTAS 
				WHERE (IDMINUTA = @IDMINUTA 
				OR FECHA = @FECHAINI)
				AND PROCESADO = 0 
				AND ANULADO = 0;

				SELECT @MONTOCREDITO = ISNULL(SUM(IMPORTE + PROPINA), 0) 
				FROM ICGFRONTREST.DBO.TIQUETSPAG 
				WHERE FO = @FO 
				AND SERIE = @SERIE 
				AND NUMERO = @NUMERO 
				AND N = @N 
				AND CODFORMAPAGO = @CODFORMAPAGOCREDITOEMPLEADO;

				IF @TOKEN = ''
				BEGIN
					INSERT INTO @VALIDACION 
					VALUES
					(0, 'La forma de pago CREDITO DE EMPLEADO no fue validada con CODIGO DE VERIFICACION');
				END

				IF (@SALDOCREDITO + @SALDOCUPON) < @MONTOCREDITO
				BEGIN
					INSERT INTO @VALIDACION 
					VALUES
					(0, 'El saldo de EMPLEADO es menor al MONTO A PAGAR');
				END

				

				--IF @SALDOCUPON > 0
				--BEGIN
				--	DECLARE @CUPONREQASIST BIT;

				--	SELECT @CUPONREQASIST = CAST(VALOR AS BIT) 
				--	FROM PARAMETROS 
				--	WHERE CLAVE = 'CPN_REQ_AST';

				--	IF @CUPONREQASIST = 1
				--	BEGIN
				--		DECLARE @MARCACION BIT;

				--		-- VERIFICAR SI EL EMPLEADO HA MARCADO ASISTENCIA
				--		EXEC @MARCACION = SP_VERIFICAREMPLEADOMARCACION @FECHA, @IDEMPLEADO;

				--		IF @MARCACION = '0'
				--		BEGIN
				--			INSERT INTO @VALIDACION 
				--			VALUES
				--			(0, 'Empleado no ha marcado asistencia para hacer uso de cupón');
				--		END
				--	END
				--END

			END
			ELSE
			BEGIN
				INSERT INTO @VALIDACION 
				VALUES
				(0, 'La forma de pago CREDITO DE EMPLEADO debe asociarse a un GAFETE o DUI');
			END
		END
		-- END VALIDAR PAGO CON CREDITO DE EMPLEADO -> CUPON

		-- VALIDAR PAGO CON CLIENTE ESTRELLA
		IF EXISTS(SELECT * FROM ICGFRONTREST.DBO.TIQUETSPAG WHERE FO = @FO AND SERIE = @SERIE AND NUMERO = @NUMERO AND N = @N AND CODFORMAPAGO = @CODFORMAPAGOLEALTAD)
		BEGIN
			IF EXISTS (SELECT * FROM MEMBRESIASMINUTAS WHERE IDMINUTA = @IDMINUTA OR FECHA = @FECHAINI)
			BEGIN
				DECLARE @TOKENCANJE VARCHAR(50);
				DECLARE @SALDODINERO DECIMAL(12,2);
				DECLARE @MONTODINERO DECIMAL(12,2);

				SELECT @TOKENCANJE = ISNULL(TOKENCANJE, ''),
				@SALDODINERO = ISNULL(SALDODINERO, 0) 
				FROM MEMBRESIASMINUTAS 
				WHERE (IDMINUTA = @IDMINUTA 
				OR FECHA = @FECHAINI)
				AND PROCESADO = 0
				AND ANULADO = 0;

				SELECT @MONTODINERO = ISNULL(SUM(IMPORTE + PROPINA), 0) 
				FROM ICGFRONTREST.DBO.TIQUETSPAG 
				WHERE FO = @FO 
				AND SERIE = @SERIE 
				AND NUMERO = @NUMERO 
				AND N = @N 
				AND CODFORMAPAGO = @CODFORMAPAGOLEALTAD;

				IF @TOKENCANJE = ''
				BEGIN
					INSERT INTO @VALIDACION 
					VALUES
					(0, 'La forma de pago CLIENTE ESTRELLA no fue validada con CODIGO DE VERIFICACION');
				END

				IF @SALDODINERO < @MONTODINERO 
				BEGIN
					INSERT INTO @VALIDACION 
					VALUES
					(0, 'El saldo de CLIENTE ESTRELLA es menor al MONTO A PAGAR');
				END

				DECLARE @CODCERTIFICADOREGALO INT;
				DECLARE @CODRECARGACERTIFICADOREGALO INT;

				SET @CODCERTIFICADOREGALO = (SELECT VALOR FROM PARAMETROS WHERE CLAVE = 'ART_CERT_REG');
				SET @CODRECARGACERTIFICADOREGALO = (SELECT VALOR FROM PARAMETROS WHERE CLAVE = 'ART_REC_CERT_REG');

				IF EXISTS (SELECT * FROM ICGFRONTREST.DBO.TIQUETSLIN WHERE FO = @FO AND SERIE = @SERIE AND NUMERO = @NUMERO AND N = @N AND CODARTICULO IN (@CODCERTIFICADOREGALO, @CODRECARGACERTIFICADOREGALO))
				BEGIN
					INSERT INTO @VALIDACION 
					VALUES
					(0, 'La forma de pago CLIENTE ESTRELLA no puede usarse para pagar CERTIFICADOS DE REGALO, por favor realizar cuentas separadas');
				END
			END
			ELSE
			BEGIN
				INSERT INTO @VALIDACION 
				VALUES
				(0, 'La forma de pago CLIENTE ESTRELLA debe asociarse a una MEMBRESIA o DUI');
			END
		END
		-- END VALIDAR PAGO CON CLIENTE ESTRELLA

		IF NOT EXISTS(SELECT * FROM @VALIDACION)
		BEGIN
			INSERT INTO @VALIDACION 
			VALUES 
			(1, 'Factura de venta válida');
		END

		SELECT * FROM @VALIDACION;
	END
	GO
-- END SP_VALIDARFACTVENTA