/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/

CREATE PROCEDURE MGRQ_ARTS_XCOT (
    V_DOCTO_RQ_ID INTEGER,
    V_PROVEEDOR_ID INTEGER,
    V_PROCESO CHAR(1))
RETURNS (
    DOCTO_RQ_ID INTEGER,
    DOCTO_RQ_DET_ID INTEGER,
    ARTICULO_ID INTEGER,
    PROVEEDOR_ID INTEGER,
    NOMBRE_PROVEEDOR VARCHAR(100),
    SELECCIONADO CHAR(1),
    CLAVE_ARTICULO VARCHAR(20),
    NOMBRE_ARTICULO VARCHAR(100),
    DESCRIPCION_ARTICULO VARCHAR(100),
    UNIDAD_COMPRA VARCHAR(5),
    CANTIDAD_COT_DEV NUMERIC(18,5),
    CANTIDAD_X_COT NUMERIC(18,5),
    CANTIDAD_A_COT NUMERIC(18,5))
AS
BEGIN
  EXIT;
END;


CREATE PROCEDURE MGRQ_ARTS_XORD (
    V_DOCTO_RQ_ID INTEGER,
    V_PROVEEDOR_ID INTEGER)
RETURNS (
    DOCTO_RQ_ID INTEGER,
    DOCTO_RQ_DET_ID INTEGER,
    ARTICULO_ID INTEGER,
    PROVEEDOR_ID INTEGER,
    NOMBRE_PROVEEDOR VARCHAR(100),
    SELECCIONADO CHAR(1),
    CLAVE_ARTICULO VARCHAR(20),
    NOMBRE_ARTICULO VARCHAR(100),
    UNIDAD_COMPRA VARCHAR(5),
    CANTIDAD_COT_DEV NUMERIC(18,5),
    CANTIDAD_X_COT NUMERIC(18,5),
    CANTIDAD_A_COT NUMERIC(18,5))
AS
BEGIN
  EXIT;
END;


CREATE PROCEDURE MGRQ_CALC_TOTALES (
    V_DOCTO_RQ_ID INTEGER)
RETURNS (
    SUBTOTAL NUMERIC(15,2),
    DESCUENTO NUMERIC(15,2),
    IMPORTE_NETO NUMERIC(15,2),
    IMPUESTOS NUMERIC(15,2),
    TOTAL NUMERIC(15,2))
AS
BEGIN
  EXIT;
END;


CREATE PROCEDURE MGRQ_CONSULTA_DOCTOS (
    V_PROCESO CHAR(1),
    V_DOCTO_RQ_ID INTEGER,
    V_REQUISITANTE_ID INTEGER,
    V_DEPARTAMENTO_ID INTEGER,
    V_DOCTO_RQ_DET_ID INTEGER,
    V_ARTICULO_ID INTEGER,
    V_FOLIO_COT CHAR(9),
    V_ESTATUS CHAR(1))
RETURNS (
    DOCTO_RQ_ID INTEGER,
    FOLIO CHAR(9),
    FECHA DATE,
    NOM_REQUISITANTE VARCHAR(50),
    NOM_DEPARTAMENTO VARCHAR(50),
    DOCTO_RQ_DET_ID INTEGER,
    NOM_PROVEEDOR VARCHAR(100),
    ARTICULO_ID INTEGER,
    CLAVE_ARTICULO VARCHAR(20),
    DESCRIPCION_ARTICULO VARCHAR(100),
    NOM_ARTICULO VARCHAR(100),
    UNIDAD_COMPRA VARCHAR(5),
    CANTIDAD NUMERIC(18,5),
    PRECIO_UNITARIO NUMERIC(18,6),
    PCTJE_DSCTO NUMERIC(9,6),
    PRECIO_TOTAL_NETO NUMERIC(15,2),
    FECHA_SOLICITADA DATE,
    FECHA_ENTREGA DATE,
    NOM_ALMACEN VARCHAR(50),
    NIVEL_AUT1 CHAR(1),
    NIVEL_AUT2 CHAR(1),
    ORDEN_CM CHAR(1),
    NO_ORDENES_CM INTEGER,
    TOTAL_UNIDADES NUMERIC(18,5),
    FOLIO_COT CHAR(9))
AS
BEGIN
  EXIT;
END;


CREATE PROCEDURE MGRQ_COPIA_FTE_DEST (
    V_DOCTO_RQ_ID INTEGER,
    V_PROVEEDOR_ID INTEGER,
    V_DOCTO_COT_ID INTEGER,
    V_PROCESO CHAR(1))
RETURNS (
    NUEVO_DOCTO_ID INTEGER)
AS
BEGIN
  EXIT;
END;


CREATE PROCEDURE MGRQ_REP_COMP_FECHAS_C (
    E_DOCTO_RQ_ID INTEGER,
    E_ESTATUS CHAR(10),
    E_FECHA_INI DATE,
    E_FECHA_FIN DATE,
    E_PROCESO CHAR(1))
RETURNS (
    DOCTO_RQ_ID INTEGER,
    FOLIO_COT CHAR(9),
    FECHA_COT DATE,
    ESTATUS_COT CHAR(1),
    DOCTO_REC_ID INTEGER,
    FOLIO_REC CHAR(9),
    FECHA_REC DATE,
    DOCTO_OCM_ID INTEGER,
    FOLIO_OCM CHAR(9),
    DOCTO_RQ_DET_ID INTEGER,
    ARTICULO_ID INTEGER,
    CLAVE_ARTICULO VARCHAR(20),
    NOMBRE_ARTICULO VARCHAR(100),
    CANTIDAD_COT NUMERIC(18,5),
    CANTIDAD_REC NUMERIC(18,5),
    FECHA_SOLICITUD DATE,
    FECHA_ENTREGA DATE,
    FECHA_DIFERENCIA DOUBLE PRECISION)
AS
BEGIN
  EXIT;
END;


CREATE PROCEDURE MGRQ_REP_COMP_FECHAS_R (
    E_DOCTO_RQ_ID INTEGER,
    E_ESTATUS CHAR(10),
    E_FECHA_INI DATE,
    E_FECHA_FIN DATE)
RETURNS (
    DOCTO_RQ_ID INTEGER,
    FOLIO_REQ CHAR(9),
    FECHA_REQ DATE,
    ESTATUS_REQ CHAR(1),
    FECHA_Y_HORA_CREACION DATE,
    FECHA_AUTORIZACION DATE,
    DOCTO_RQ_DET_ID INTEGER,
    ARTICULO_ID INTEGER,
    CLAVE_ARTICULO VARCHAR(20),
    NOMBRE_ARTICULO VARCHAR(100),
    CANTIDAD_REQ NUMERIC(18,5),
    FECHA_DIFERENCIA NUMERIC(15,2))
AS
BEGIN
  EXIT;
END;


CREATE PROCEDURE MGRQ_REP_COMP_PRECIOS (
    E_DOCTO_RQ_ID VARCHAR(9),
    E_ARTICULO_ID INTEGER)
RETURNS (
    PROVEEDOR VARCHAR(100),
    COND_PAGO VARCHAR(50),
    FOLIO_COT VARCHAR(9),
    FOLIO_REQ VARCHAR(9),
    CLAVE_ARTICULO VARCHAR(20),
    NOMBRE VARCHAR(100),
    CANTIDAD NUMERIC(15,2),
    PRECIO_UNITARIO NUMERIC(15,2),
    PCTJE_DSCTO NUMERIC(15,2),
    PRECIO_TOTAL_NETO NUMERIC(15,2),
    UNIDAD_VENTA VARCHAR(5),
    FECHA_ENTREGA DATE,
    PROVEEDOR_ID INTEGER,
    ARTICULO_ID INTEGER,
    COND_PAGO_ID INTEGER)
AS
BEGIN
  EXIT;
END;




/******************************************************************************/
/****                                Tables                                ****/
/******************************************************************************/



CREATE TABLE MGRQ_DEPARTAMENTOS (
    DEPARTAMENTO_ID       INTEGER NOT NULL,
    NOMBRE                VARCHAR(50) NOT NULL,
    USUARIO_CREADOR       USUARIO_TYPE,
    FECHA_HORA_CREACION   FECHA_Y_HORA,
    USUARIO_ULT_MODIF     USUARIO_TYPE,
    FECHA_HORA_ULT_MODIF  FECHA_Y_HORA
);


CREATE TABLE MGRQ_DERECHOS_USUARIOS (
    USUARIO_ID    ENTERO_ID NOT NULL,
    CLAVE_OBJETO  VARCHAR(5) NOT NULL
);


CREATE TABLE MGRQ_DOCTOS_COT_LIGAS (
    DOCTO_COT_LIGA_ID  INTEGER NOT NULL,
    FOLIO_COT_FTE      FOLIO_TYPE,
    FOLIO_OCM_DEST     FOLIO_TYPE
);


CREATE TABLE MGRQ_DOCTOS_RQ (
    DOCTO_RQ_ID            INTEGER NOT NULL,
    FOLIO                  FOLIO_TYPE NOT NULL,
    FECHA                  FECHA NOT NULL,
    FECHA_ENTREGA          FECHA,
    DEPARTAMENTO_ID        ENTERO_ID,
    REQUISITANTE_ID        ENTERO_ID,
    PROVEEDOR_ID           ENTERO_ID,
    COND_PAGO_ID           ENTERO_ID,
    ALMACEN_ID             ENTERO_ID,
    DESCRIPCION            DESCRIPCION_LARGA,
    TIPO_DOCTO             CHAR(1),
    FECHA_AUT1             FECHA_Y_HORA,
    NIVEL_AUT1             SI_NO_N,
    FECHA_AUT2             FECHA_Y_HORA,
    NIVEL_AUT2             SI_NO_N,
    FECHA_AUT3             FECHA_Y_HORA,
    NIVEL_AUT3             SI_NO_N,
    DESCRIP_SOLICITADO     NOMBRE_LARGO,
    DESCRIP_AUTORIZADO     NOMBRE_LARGO,
    TIPO_AUT               FECHA,
    ESTATUS                CHAR(1),
    USUARIO_CREADOR        USUARIO_TYPE,
    FECHA_Y_HORA_CREACION  FECHA_Y_HORA,
    USUARIO_ULT_MODIF      USUARIO_TYPE,
    FECHA_HORA_ULT_MODIF   FECHA_Y_HORA
);


CREATE TABLE MGRQ_DOCTOS_RQ_DET (
    DOCTO_RQ_DET_ID       INTEGER NOT NULL,
    DOCTO_RQ_ID           INTEGER,
    PROVEEDOR_ID          ENTERO_ID,
    FECHA_SOLICITADA      FECHA,
    FECHA_ENTREGA         FECHA,
    ARTICULO_ID           ENTERO_ID,
    CLAVE_ARTICULO        CLAVE_MAESTRO_TYPE,
    DESCRIPCION_ARTICULO  NOMBRE_LARGO,
    CANTIDAD              UNIDADES_0 NOT NULL,
    CANTIDAD_COT_DEV      UNIDADES_0,
    CANTIDAD_A_COT        UNIDADES_0,
    PRECIO_UNITARIO       IMPORTE_UNITARIO,
    PCTJE_DSCTO           PORCENTAJE_0,
    PRECIO_TOTAL_NETO     IMPORTE_MONETARIO_0,
    IMPORTE_IMPUESTO      IMPORTE_MONETARIO_0,
    FECHA_AUT1            FECHA_Y_HORA,
    NIVEL_AUT1            SI_NO_N,
    FECHA_AUT2            FECHA_Y_HORA,
    NIVEL_AUT2            SI_NO_N,
    FECHA_AUT3            FECHA_Y_HORA,
    NIVEL_AUT3            SI_NO_N,
    USUARIO_CREADOR       USUARIO_TYPE,
    FECHA_HORA_CREACION   FECHA_Y_HORA,
    USUARIO_ULT_MODIF     USUARIO_TYPE,
    FECHA_HORA_ULT_MODIF  FECHA_Y_HORA
);


CREATE TABLE MGRQ_DOCTOS_RQ_LIGAS (
    DOCTO_RQ_LIGA_ID  INTEGER NOT NULL,
    DOCTO_RQ_FTE_ID   INTEGER NOT NULL,
    DOCTO_RQ_DEST_ID  INTEGER NOT NULL
);


CREATE TABLE MGRQ_DOCTOS_RQ_LIGAS_DET (
    DOCTO_RQ_LIGA_ID      INTEGER NOT NULL,
    DOCTO_RQ_DET_FTE_ID   INTEGER NOT NULL,
    DOCTO_RQ_DET_DEST_ID  INTEGER NOT NULL
);


CREATE TABLE MGRQ_FOLIOS (
    FOLIO_ID     INTEGER NOT NULL,
    SERIE        CHAR(1),
    CONSECUTIVO  INTEGER,
    TIPO_DOCTO   CHAR(1)
);


CREATE TABLE MGRQ_PERMISOS_USUARIOS (
    CLAVE_OBJETO  CHAR(5) NOT NULL,
    NOMBRE        NOMBRE_MEDIO,
    POSICION      ENTERO_CORTO,
    TIENE_HIJOS   SI_NO_N,
    AUTORIZABLE   SI_NO_N,
    CLAVE_PADRE   CHAR(5) NOT NULL
);


CREATE TABLE MGRQ_PREFER_MOD (
    ELEMENTO_ID  ENTERO_ID NOT NULL,
    NOMBRE       NOMBRE_MEDIO NOT NULL,
    VALOR        NOMBRE_LARGO
);


CREATE TABLE MGRQ_REQUISITANTES (
    REQUISITANTE_ID       INTEGER NOT NULL,
    NOMBRE                VARCHAR(50) NOT NULL,
    USUARIO               VARCHAR(50) NOT NULL,
    MAIL                  VARCHAR(50),
    DEPARTAMENTO_ID       INTEGER NOT NULL,
    USUARIO_CREADOR       USUARIO_TYPE,
    FECHA_HORA_CREACION   FECHA_Y_HORA,
    USUARIO_ULT_MODIF     USUARIO_TYPE,
    FECHA_HORA_ULT_MODIF  FECHA_Y_HORA
);




/* Check constraints definition */

ALTER TABLE MGRQ_DOCTOS_RQ ADD CONSTRAINT CHK3_MGRQ_DOCTOS_RQ check (TIPO_DOCTO IN ('R','C'));
ALTER TABLE MGRQ_DOCTOS_RQ ADD CONSTRAINT CHK2_MGRQ_DOCTOS_RQ check (ESTATUS IN ('N', 'C','A'));
ALTER TABLE MGRQ_FOLIOS ADD CONSTRAINT CHK1_MGRQ_FOLIOS check (TIPO_DOCTO IN ('R','C','O'));


/******************************************************************************/
/****                             Primary Keys                             ****/
/******************************************************************************/

ALTER TABLE MGRQ_DEPARTAMENTOS ADD CONSTRAINT PK_MGRQ_DEPARTAMENTOS PRIMARY KEY (DEPARTAMENTO_ID);
ALTER TABLE MGRQ_DOCTOS_COT_LIGAS ADD CONSTRAINT PK_MGRQ_DOCTOS_COT_LIGAS PRIMARY KEY (DOCTO_COT_LIGA_ID);
ALTER TABLE MGRQ_DOCTOS_RQ ADD CONSTRAINT PK_MGRQ_DOCTOS_RQ PRIMARY KEY (DOCTO_RQ_ID);
ALTER TABLE MGRQ_DOCTOS_RQ_DET ADD CONSTRAINT PK_MGRQ_DOCTOS_RQ_DET PRIMARY KEY (DOCTO_RQ_DET_ID);
ALTER TABLE MGRQ_DOCTOS_RQ_LIGAS ADD CONSTRAINT PK_MGRQ_DOCTOS_RQ_LIGAS PRIMARY KEY (DOCTO_RQ_LIGA_ID);
ALTER TABLE MGRQ_DOCTOS_RQ_LIGAS_DET ADD CONSTRAINT PK_MGRQ_DOCTOS_RQ_LIGAS_DET PRIMARY KEY (DOCTO_RQ_LIGA_ID, DOCTO_RQ_DET_FTE_ID, DOCTO_RQ_DET_DEST_ID);
ALTER TABLE MGRQ_FOLIOS ADD CONSTRAINT PK_MGRQ_FOLIOS PRIMARY KEY (FOLIO_ID);
ALTER TABLE MGRQ_PREFER_MOD ADD CONSTRAINT PK_MGRQ_PREFER_MOD PRIMARY KEY (ELEMENTO_ID);
ALTER TABLE MGRQ_REQUISITANTES ADD CONSTRAINT PK_MGRQ_REQUISITANTES PRIMARY KEY (REQUISITANTE_ID);


/******************************************************************************/
/****                             Foreign Keys                             ****/
/******************************************************************************/

ALTER TABLE MGRQ_DOCTOS_RQ_DET ADD CONSTRAINT FK_MGRQ_DOCTOS_RQ_DET_1 FOREIGN KEY (DOCTO_RQ_ID) REFERENCES MGRQ_DOCTOS_RQ (DOCTO_RQ_ID);
ALTER TABLE MGRQ_DOCTOS_RQ_LIGAS ADD CONSTRAINT FK_MGRQ_DOCTOS_RQ_LIGAS_2 FOREIGN KEY (DOCTO_RQ_FTE_ID) REFERENCES MGRQ_DOCTOS_RQ (DOCTO_RQ_ID) ON DELETE CASCADE;
ALTER TABLE MGRQ_DOCTOS_RQ_LIGAS ADD CONSTRAINT FK_MGRQ_DOCTOS_RQ_LIGAS_3 FOREIGN KEY (DOCTO_RQ_DEST_ID) REFERENCES MGRQ_DOCTOS_RQ (DOCTO_RQ_ID) ON DELETE CASCADE;
ALTER TABLE MGRQ_REQUISITANTES ADD CONSTRAINT FK_MGRQ_REQUISITANTES_1 FOREIGN KEY (DEPARTAMENTO_ID) REFERENCES MGRQ_DEPARTAMENTOS (DEPARTAMENTO_ID);


/******************************************************************************/
/****                               Indices                                ****/
/******************************************************************************/

CREATE UNIQUE INDEX MGRQ_DEPARTAMENTOS_IDX1 ON MGRQ_DEPARTAMENTOS (NOMBRE);
CREATE UNIQUE INDEX MGRQ_DOCTOS_RQ_IDX1 ON MGRQ_DOCTOS_RQ (FOLIO, TIPO_DOCTO, DOCTO_RQ_ID);
CREATE UNIQUE INDEX MGRQ_FOLIOS_IDX1 ON MGRQ_FOLIOS (SERIE, TIPO_DOCTO);
CREATE UNIQUE INDEX MGRQ_REQUISITANTES_IDX1 ON MGRQ_REQUISITANTES (NOMBRE, USUARIO);


/******************************************************************************/
/****                               Triggers                               ****/
/******************************************************************************/




/******************************************************************************/
/****                         Triggers for tables                          ****/
/******************************************************************************/



/* Trigger: MGRQ_DEPARTAMENTOS_BI */
CREATE TRIGGER MGRQ_DEPARTAMENTOS_BI FOR MGRQ_DEPARTAMENTOS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.DEPARTAMENTO_ID = -1) THEN
    NEW.DEPARTAMENTO_ID = GEN_ID(ID_CATALOGOS,1);
END;


/* Trigger: MGRQ_DOCTOS_COT_LIGAS_BI */
CREATE TRIGGER MGRQ_DOCTOS_COT_LIGAS_BI FOR MGRQ_DOCTOS_COT_LIGAS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.DOCTO_COT_LIGA_ID = -1) THEN
    NEW.DOCTO_COT_LIGA_ID = GEN_ID(ID_LIGAS_DOCTOS,1);
END;


/* Trigger: MGRQ_DOCTOS_RQ_BD0 */
CREATE TRIGGER MGRQ_DOCTOS_RQ_BD0 FOR MGRQ_DOCTOS_RQ
ACTIVE BEFORE DELETE POSITION 0
AS
begin
  /* Trigger text */
  DELETE FROM MGRQ_DOCTOS_RQ_DET
  WHERE DOCTO_RQ_ID = OLD.DOCTO_RQ_ID;
end;

/* Trigger: MGRQ_DOCTOS_RQ_LIGAS_BD0 */
CREATE TRIGGER MGRQ_DOCTOS_RQ_LIGAS_BD0 FOR MGRQ_DOCTOS_RQ_LIGAS
ACTIVE BEFORE DELETE POSITION 0
AS
begin
  /* Borrar sus ligas detalle */
  DELETE FROM MGRQ_DOCTOS_RQ_LIGAS_DET
  WHERE DOCTO_RQ_LIGA_ID = OLD.DOCTO_RQ_LIGA_ID;
end;


/* Trigger: MGRQ_FOLIOS_BI */
CREATE TRIGGER MGRQ_FOLIOS_BI FOR MGRQ_FOLIOS
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.FOLIO_ID = -1) THEN
    NEW.FOLIO_ID = GEN_ID(ID_CATALOGOS,1);
END;


/* Trigger: MGRQ_REQUISITANTES_BI */
CREATE TRIGGER MGRQ_REQUISITANTES_BI FOR MGRQ_REQUISITANTES
ACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  IF (NEW.REQUISITANTE_ID = -1) THEN
    NEW.REQUISITANTE_ID = GEN_ID(ID_CATALOGOS,1);
END;


/******************************************************************************/
/****                          Stored Procedures                           ****/
/******************************************************************************/


ALTER PROCEDURE MGRQ_ARTS_XCOT (
    V_DOCTO_RQ_ID INTEGER,
    V_PROVEEDOR_ID INTEGER,
    V_PROCESO CHAR(1))
RETURNS (
    DOCTO_RQ_ID INTEGER,
    DOCTO_RQ_DET_ID INTEGER,
    ARTICULO_ID INTEGER,
    PROVEEDOR_ID INTEGER,
    NOMBRE_PROVEEDOR VARCHAR(100),
    SELECCIONADO CHAR(1),
    CLAVE_ARTICULO VARCHAR(20),
    NOMBRE_ARTICULO VARCHAR(100),
    DESCRIPCION_ARTICULO VARCHAR(100),
    UNIDAD_COMPRA VARCHAR(5),
    CANTIDAD_COT_DEV NUMERIC(18,5),
    CANTIDAD_X_COT NUMERIC(18,5),
    CANTIDAD_A_COT NUMERIC(18,5))
AS
BEGIN
/*
    V_DOCTO_RQ_ID = DOCUMENTO DEL CUAL SE EXTRAEN ARTICULOS PARA SER SELECCIONADOS
                    Y FORMAR PARTE DE COTIZACION
    V_PROVEEDOR_ID = 0 TODOS LOS PROVEEDORES
    V_PROCESO = CONVERTIR REQUISICION EN COTIZACION DE FORMA
                P = PARCIAL T = TOTAL
     CANTIDAD_X_COT
      Se dejo el mismo nombre que en MGRQ_ARTS_XCOT
       Unidades pendientes de ordenar del artículo.
     CANTIDAD_A_COT
      Se dejo el mismo nombre que en MGRQ_ARTS_XCOT
       Se regresa el mismo valor que en unidades por ordenar pero sobre
       este campo el usuario podrá hacer modificaciones.
*/
  DOCTO_RQ_ID = V_DOCTO_RQ_ID;
  if (V_PROCESO = 'P') then
  BEGIN
    SELECCIONADO = 'N';
    /* Inicializar las unidades a recibir de toda la requisicion */
    UPDATE MGRQ_DOCTOS_RQ_DET
    /*SET CANTIDAD_A_COT = CANTIDAD - CANTIDAD_COT_DEV*//*linea original mostrar pendientes*/
    SET CANTIDAD_A_COT = CANTIDAD, CANTIDAD_COT_DEV = 0
    WHERE DOCTO_RQ_ID = :V_DOCTO_RQ_ID;
  END

  if (V_PROCESO = 'T') then
  BEGIN
    SELECCIONADO = 'S';
    /* Inicializar las unidades a recibir de toda la requisicion */
    UPDATE MGRQ_DOCTOS_RQ_DET
    /*SET CANTIDAD_A_COT = CANTIDAD - CANTIDAD_COT_DEV*//*linea original mostrar pendientes*/
    SET CANTIDAD_A_COT = CANTIDAD, CANTIDAD_COT_DEV = CANTIDAD
    WHERE DOCTO_RQ_ID = :V_DOCTO_RQ_ID;
  END
  
  /* obtener los artículos pendientes de cotizar de la requisición */
  FOR SELECT DOCTO_RQ_DET_ID, ARTICULO_ID, DESCRIPCION_ARTICULO, CANTIDAD_COT_DEV, CANTIDAD_A_COT, PROVEEDOR_ID
      FROM MGRQ_DOCTOS_RQ_DET
      WHERE DOCTO_RQ_ID = :V_DOCTO_RQ_ID
      AND CANTIDAD_A_COT > 0
      AND (:V_PROVEEDOR_ID = 0 OR PROVEEDOR_ID =:V_PROVEEDOR_ID )
      ORDER BY DOCTO_RQ_DET_ID
      INTO DOCTO_RQ_DET_ID, ARTICULO_ID, DESCRIPCION_ARTICULO, CANTIDAD_COT_DEV, CANTIDAD_A_COT, PROVEEDOR_ID
  DO
  BEGIN
    NOMBRE_ARTICULO = '';
    UNIDAD_COMPRA = '';
    CLAVE_ARTICULO = '';
    NOMBRE_PROVEEDOR = '';

    SELECT NOMBRE,UNIDAD_COMPRA
    FROM ARTICULOS
    WHERE ARTICULO_ID = :ARTICULO_ID
    INTO NOMBRE_ARTICULO,UNIDAD_COMPRA;

    SELECT CLAVE_ARTICULO
    FROM GET_CLAVE_ART(:ARTICULO_ID)
    INTO CLAVE_ARTICULO;

    SELECT NOMBRE
    FROM PROVEEDORES
    WHERE PROVEEDOR_ID =:PROVEEDOR_ID
    INTO NOMBRE_PROVEEDOR;

    CANTIDAD_X_COT = CANTIDAD_A_COT;

    SUSPEND;
  END
END;

ALTER PROCEDURE MGRQ_ARTS_XORD (
    V_DOCTO_RQ_ID INTEGER,
    V_PROVEEDOR_ID INTEGER)
RETURNS (
    DOCTO_RQ_ID INTEGER,
    DOCTO_RQ_DET_ID INTEGER,
    ARTICULO_ID INTEGER,
    PROVEEDOR_ID INTEGER,
    NOMBRE_PROVEEDOR VARCHAR(100),
    SELECCIONADO CHAR(1),
    CLAVE_ARTICULO VARCHAR(20),
    NOMBRE_ARTICULO VARCHAR(100),
    UNIDAD_COMPRA VARCHAR(5),
    CANTIDAD_COT_DEV NUMERIC(18,5),
    CANTIDAD_X_COT NUMERIC(18,5),
    CANTIDAD_A_COT NUMERIC(18,5))
AS
BEGIN
/*   CANTIDAD_X_COT
      Se dejo el mismo nombre que en MGRQ_ARTS_XCOT
       Unidades pendientes de ordenar del artículo.
     CANTIDAD_A_COT
      Se dejo el mismo nombre que en MGRQ_ARTS_XCOT
       Se regresa el mismo valor que en unidades por ordenar pero sobre
       este campo el usuario podrá hacer modificaciones.
*/
  DOCTO_RQ_ID = V_DOCTO_RQ_ID;
  SELECCIONADO = 'N';
  /* Inicializar las unidades a recibir de toda la cotización */
  UPDATE MGRQ_DOCTOS_RQ_DET
/*  SET CANTIDAD_A_COT = CANTIDAD - CANTIDAD_COT_DEV*//*linea original mostrar pendientes*/
  SET CANTIDAD_A_COT = CANTIDAD, CANTIDAD_COT_DEV = 0
  WHERE DOCTO_RQ_ID = :V_DOCTO_RQ_ID;
  /* obtener los artículos pendientes de ordenar de la cotización */
  FOR SELECT DOCTO_RQ_DET_ID, ARTICULO_ID, CANTIDAD_COT_DEV, CANTIDAD_A_COT, PROVEEDOR_ID
      FROM MGRQ_DOCTOS_RQ_DET
      WHERE DOCTO_RQ_ID = :V_DOCTO_RQ_ID
      AND CANTIDAD_A_COT > 0
      AND (:V_PROVEEDOR_ID = 0 OR PROVEEDOR_ID =:V_PROVEEDOR_ID )
      AND ARTICULO_ID IS NOT NULL
      ORDER BY DOCTO_RQ_DET_ID
      INTO DOCTO_RQ_DET_ID, ARTICULO_ID, CANTIDAD_COT_DEV, CANTIDAD_A_COT, PROVEEDOR_ID
  DO
  BEGIN
    NOMBRE_ARTICULO = '';
    UNIDAD_COMPRA = '';
    CLAVE_ARTICULO = '';
    NOMBRE_PROVEEDOR = '';

    SELECT NOMBRE,UNIDAD_COMPRA
    FROM ARTICULOS
    WHERE ARTICULO_ID = :ARTICULO_ID
    INTO NOMBRE_ARTICULO,UNIDAD_COMPRA;

    SELECT CLAVE_ARTICULO
    FROM GET_CLAVE_ART(:ARTICULO_ID)
    INTO CLAVE_ARTICULO;

    SELECT NOMBRE
    FROM PROVEEDORES
    WHERE PROVEEDOR_ID =:PROVEEDOR_ID
    INTO NOMBRE_PROVEEDOR;

    CANTIDAD_X_COT = CANTIDAD_A_COT;

    SUSPEND;
  END
END;

ALTER PROCEDURE MGRQ_CALC_TOTALES (
    V_DOCTO_RQ_ID INTEGER)
RETURNS (
    SUBTOTAL NUMERIC(15,2),
    DESCUENTO NUMERIC(15,2),
    IMPORTE_NETO NUMERIC(15,2),
    IMPUESTOS NUMERIC(15,2),
    TOTAL NUMERIC(15,2))
AS
declare variable cantidad numeric(18,5);
declare variable precio_unitario numeric(18,6);
declare variable precio_total_neto numeric(15,2);
declare variable importe_impuesto numeric(15,2);
begin
  /* Procedure Text */
  SUBTOTAL = 0;
  DESCUENTO = 0;
  IMPORTE_NETO = 0;
  IMPUESTOS = 0;
  TOTAL = 0;
  FOR SELECT CANTIDAD,PRECIO_UNITARIO,
  PRECIO_TOTAL_NETO,IMPORTE_IMPUESTO
  FROM MGRQ_DOCTOS_RQ_DET
  WHERE DOCTO_RQ_ID =:V_DOCTO_RQ_ID
  INTO CANTIDAD,PRECIO_UNITARIO,PRECIO_TOTAL_NETO,IMPORTE_IMPUESTO
  DO
  BEGIN
    SUBTOTAL = SUBTOTAL + (CANTIDAD * PRECIO_UNITARIO);
    DESCUENTO = DESCUENTO + ((CANTIDAD * PRECIO_UNITARIO) - PRECIO_TOTAL_NETO);
    IMPORTE_NETO = IMPORTE_NETO + PRECIO_TOTAL_NETO;
    IMPUESTOS = IMPUESTOS + IMPORTE_IMPUESTO;
    TOTAL = TOTAL + (PRECIO_TOTAL_NETO + IMPORTE_IMPUESTO);
  END
  SUSPEND;
end;

ALTER PROCEDURE MGRQ_CONSULTA_DOCTOS (
    V_PROCESO CHAR(1),
    V_DOCTO_RQ_ID INTEGER,
    V_REQUISITANTE_ID INTEGER,
    V_DEPARTAMENTO_ID INTEGER,
    V_DOCTO_RQ_DET_ID INTEGER,
    V_ARTICULO_ID INTEGER,
    V_FOLIO_COT CHAR(9),
    V_ESTATUS CHAR(1))
RETURNS (
    DOCTO_RQ_ID INTEGER,
    FOLIO CHAR(9),
    FECHA DATE,
    NOM_REQUISITANTE VARCHAR(50),
    NOM_DEPARTAMENTO VARCHAR(50),
    DOCTO_RQ_DET_ID INTEGER,
    NOM_PROVEEDOR VARCHAR(100),
    ARTICULO_ID INTEGER,
    CLAVE_ARTICULO VARCHAR(20),
    DESCRIPCION_ARTICULO VARCHAR(100),
    NOM_ARTICULO VARCHAR(100),
    UNIDAD_COMPRA VARCHAR(5),
    CANTIDAD NUMERIC(18,5),
    PRECIO_UNITARIO NUMERIC(18,6),
    PCTJE_DSCTO NUMERIC(9,6),
    PRECIO_TOTAL_NETO NUMERIC(15,2),
    FECHA_SOLICITADA DATE,
    FECHA_ENTREGA DATE,
    NOM_ALMACEN VARCHAR(50),
    NIVEL_AUT1 CHAR(1),
    NIVEL_AUT2 CHAR(1),
    ORDEN_CM CHAR(1),
    NO_ORDENES_CM INTEGER,
    TOTAL_UNIDADES NUMERIC(18,5),
    FOLIO_COT CHAR(9))
AS
declare variable requisitante_id integer;
declare variable departamento_id integer;
declare variable proveedor_id integer;
declare variable almacen_id integer;
declare variable estatus char(1);
declare variable tot_unids numeric(18,5);
declare variable tot_ordenes_cm integer;
declare variable articulo_id_aux integer;
BEGIN
/*V_PROCESO = TIPO DE CONSULTA
  R = CONSULTA REQ
  C = CONSULTA SOL COT
  O = CONSULTA OCM

  V_DOCTO_RQ_ID (CONSULTA REQ) = FILTRO POR DOCTO 0 = TODOS
  V_REQUISITANTE_ID (CONSULTA REQ) = FILTRO POR REQUISITANTE 0 = TODOS
  V_DEPARTAMENTO_ID (CONSULTA REQ) = FILTRO POR DEPARTAMENTO 0 = TODOS

  V_DOCTO_RQ_DET_ID (CONSULTA SOL COT) HIJO DE CONSULTA REQ

  V_FOLIO_COT (CONSULTA OCM) HIJO DE CONSULTA SOL COT
  V_ESTATUS = SOLO EN REQUISICIONES C=CANCELADAS A=APLICADAS N=NORMALES %=TODAS
  */

  /*CONSULTA REQ*/


  IF (V_PROCESO = 'R') THEN
  BEGIN
    FOR SELECT A.DOCTO_RQ_ID,A.FOLIO,A.FECHA,A.REQUISITANTE_ID,A.DEPARTAMENTO_ID,
    B.DOCTO_RQ_DET_ID,B.ARTICULO_ID,B.PROVEEDOR_ID,B.CLAVE_ARTICULO,
    B.DESCRIPCION_ARTICULO,B.CANTIDAD,B.FECHA_SOLICITADA,A.NIVEL_AUT1,A.NIVEL_AUT2
    FROM MGRQ_DOCTOS_RQ A
    INNER JOIN MGRQ_DOCTOS_RQ_DET B ON(A.DOCTO_RQ_ID = B.DOCTO_RQ_ID)
    WHERE (:V_DOCTO_RQ_ID = 0 OR A.DOCTO_RQ_ID =:V_DOCTO_RQ_ID)
    AND (:V_REQUISITANTE_ID = 0 OR A.REQUISITANTE_ID =:V_REQUISITANTE_ID)
    AND (:V_DEPARTAMENTO_ID = 0 OR A.DEPARTAMENTO_ID =:V_DEPARTAMENTO_ID)
    AND A.TIPO_DOCTO = 'R'
    AND A.ESTATUS LIKE :V_ESTATUS
    ORDER BY A.FOLIO,B.DOCTO_RQ_DET_ID
    INTO DOCTO_RQ_ID,FOLIO,FECHA,REQUISITANTE_ID,DEPARTAMENTO_ID,
    DOCTO_RQ_DET_ID,ARTICULO_ID,PROVEEDOR_ID,CLAVE_ARTICULO,
    DESCRIPCION_ARTICULO,CANTIDAD,FECHA_SOLICITADA,NIVEL_AUT1,NIVEL_AUT2
    DO
    BEGIN
      NOM_REQUISITANTE = '';
      SELECT NOMBRE FROM MGRQ_REQUISITANTES
      WHERE REQUISITANTE_ID =:REQUISITANTE_ID
      INTO NOM_REQUISITANTE;

      NOM_DEPARTAMENTO = '';
      SELECT NOMBRE FROM MGRQ_DEPARTAMENTOS
      WHERE DEPARTAMENTO_ID =:DEPARTAMENTO_ID
      INTO NOM_DEPARTAMENTO;
  
      NOM_ARTICULO = '';
      UNIDAD_COMPRA = '';
      SELECT NOMBRE,UNIDAD_COMPRA FROM ARTICULOS
      WHERE ARTICULO_ID =:ARTICULO_ID
      INTO NOM_ARTICULO,UNIDAD_COMPRA;
    
      NOM_PROVEEDOR = '';
      SELECT NOMBRE FROM PROVEEDORES
      WHERE PROVEEDOR_ID =:PROVEEDOR_ID
      INTO NOM_PROVEEDOR;

      TOTAL_UNIDADES = 0;
      NO_ORDENES_CM = 0;
      FOR SELECT C.FOLIO
      FROM MGRQ_DOCTOS_RQ A
      INNER JOIN MGRQ_DOCTOS_RQ_LIGAS B ON(A.DOCTO_RQ_ID = B.DOCTO_RQ_FTE_ID)
      INNER JOIN MGRQ_DOCTOS_RQ C ON(B.DOCTO_RQ_DEST_ID = C.DOCTO_RQ_ID)
      WHERE A.DOCTO_RQ_ID =:DOCTO_RQ_ID
      AND C.ESTATUS <> 'C'
      INTO FOLIO_COT
      DO
      BEGIN
        ARTICULO_ID_AUX = 0;
        if (ARTICULO_ID IS NULL) then
        BEGIN
          SELECT B.ARTICULO_ID FROM MGRQ_DOCTOS_RQ_LIGAS_DET A
          INNER JOIN MGRQ_DOCTOS_RQ_DET B ON(A.DOCTO_RQ_DET_DEST_ID = B.DOCTO_RQ_DET_ID)
          INNER JOIN MGRQ_DOCTOS_RQ C ON(B.DOCTO_RQ_ID = C.DOCTO_RQ_ID)
          WHERE A.DOCTO_RQ_DET_FTE_ID =:DOCTO_RQ_DET_ID
          AND C.FOLIO =:FOLIO_COT
          INTO ARTICULO_ID_AUX;
        END

        SELECT COALESCE(COUNT(C.DOCTO_CM_DET_ID),0) AS NO_REGS, COALESCE(SUM(C.UNIDADES),0) AS TOTUNIDS
        FROM MGRQ_DOCTOS_COT_LIGAS A
        INNER JOIN DOCTOS_CM B ON(A.FOLIO_OCM_DEST = B.FOLIO)
        INNER JOIN DOCTOS_CM_DET C ON(B.DOCTO_CM_ID = C.DOCTO_CM_ID)
        WHERE A.FOLIO_COT_FTE =:FOLIO_COT
        AND B.TIPO_DOCTO = 'O' AND B.ESTATUS <> 'C'
        AND ((C.ARTICULO_ID =:ARTICULO_ID) OR (C.ARTICULO_ID =:ARTICULO_ID_AUX))
        INTO TOT_ORDENES_CM,TOT_UNIDS;

        NO_ORDENES_CM = NO_ORDENES_CM + TOT_ORDENES_CM;
        TOTAL_UNIDADES = TOTAL_UNIDADES + TOT_UNIDS;
      END
      SUSPEND;
    END
  END

  /*CONSULTA COT*/
  IF (V_PROCESO = 'C') THEN
  BEGIN
    FOR SELECT D.DOCTO_RQ_ID,D.FOLIO,D.FECHA,D.REQUISITANTE_ID,D.DEPARTAMENTO_ID,
    C.DOCTO_RQ_DET_ID,C.ARTICULO_ID,C.PROVEEDOR_ID,C.CLAVE_ARTICULO,C.DESCRIPCION_ARTICULO,
    C.CANTIDAD,C.PRECIO_UNITARIO,C.PCTJE_DSCTO,C.PRECIO_TOTAL_NETO,
    C.FECHA_SOLICITADA,C.FECHA_ENTREGA
    FROM MGRQ_DOCTOS_RQ_DET A
    INNER JOIN MGRQ_DOCTOS_RQ_LIGAS_DET B ON(A.DOCTO_RQ_DET_ID = B.DOCTO_RQ_DET_FTE_ID)
    INNER JOIN MGRQ_DOCTOS_RQ_DET C ON(B.DOCTO_RQ_DET_DEST_ID = C.DOCTO_RQ_DET_ID)
    INNER JOIN MGRQ_DOCTOS_RQ D ON(C.DOCTO_RQ_ID = D.DOCTO_RQ_ID)
    WHERE A.DOCTO_RQ_DET_ID =:V_DOCTO_RQ_DET_ID
    AND D.ESTATUS <> 'C'
    INTO DOCTO_RQ_ID,FOLIO,FECHA,REQUISITANTE_ID,DEPARTAMENTO_ID,
    DOCTO_RQ_DET_ID,ARTICULO_ID,PROVEEDOR_ID,CLAVE_ARTICULO,DESCRIPCION_ARTICULO,
    CANTIDAD,PRECIO_UNITARIO,PCTJE_DSCTO,PRECIO_TOTAL_NETO,
    FECHA_SOLICITADA,FECHA_ENTREGA
    DO
    BEGIN
      SELECT COUNT(C.DOCTO_CM_DET_ID) AS NO_REGS
      FROM MGRQ_DOCTOS_COT_LIGAS A
      INNER JOIN DOCTOS_CM B ON(A.FOLIO_OCM_DEST = B.FOLIO)
      INNER JOIN DOCTOS_CM_DET C ON(B.DOCTO_CM_ID = C.DOCTO_CM_ID)
      WHERE A.FOLIO_COT_FTE =:FOLIO
      AND B.TIPO_DOCTO = 'O' AND B.ESTATUS <> 'C'
      AND C.ARTICULO_ID =:ARTICULO_ID
      INTO NO_ORDENES_CM;
      IF (NO_ORDENES_CM > 0) THEN
        ORDEN_CM = 'S';
      ELSE
        ORDEN_CM = 'N';

      NOM_REQUISITANTE = '';
      SELECT NOMBRE FROM MGRQ_REQUISITANTES
      WHERE REQUISITANTE_ID =:REQUISITANTE_ID
      INTO NOM_REQUISITANTE;

      NOM_DEPARTAMENTO = '';
      SELECT NOMBRE FROM MGRQ_DEPARTAMENTOS
      WHERE DEPARTAMENTO_ID =:DEPARTAMENTO_ID
      INTO NOM_DEPARTAMENTO;
  
      NOM_ARTICULO = '';
      UNIDAD_COMPRA = '';
      SELECT NOMBRE,UNIDAD_COMPRA FROM ARTICULOS
      WHERE ARTICULO_ID =:ARTICULO_ID
      INTO NOM_ARTICULO,UNIDAD_COMPRA;
    
      NOM_PROVEEDOR = '';
      SELECT NOMBRE FROM PROVEEDORES
      WHERE PROVEEDOR_ID =:PROVEEDOR_ID
      INTO NOM_PROVEEDOR;

      SUSPEND;
    END
  END

  /*CONSULTA OCM*/
  IF (V_PROCESO = 'O') THEN
  BEGIN
    FOR SELECT B.FOLIO,B.FECHA,B.PROVEEDOR_ID,B.ALMACEN_ID,C.ARTICULO_ID,C.CLAVE_ARTICULO,
    SUM(C.UNIDADES) AS TOTUNIDS ,C.PRECIO_UNITARIO,C.PRECIO_TOTAL_NETO
    FROM MGRQ_DOCTOS_COT_LIGAS A
    INNER JOIN DOCTOS_CM B ON(A.FOLIO_OCM_DEST = B.FOLIO)
    INNER JOIN DOCTOS_CM_DET C ON(B.DOCTO_CM_ID = C.DOCTO_CM_ID)
    WHERE A.FOLIO_COT_FTE =:V_FOLIO_COT
    AND B.TIPO_DOCTO = 'O' AND B.ESTATUS <> 'C'
    AND C.ARTICULO_ID =:V_ARTICULO_ID
    GROUP BY B.FOLIO,B.FECHA,B.PROVEEDOR_ID,B.ALMACEN_ID,C.ARTICULO_ID,C.CLAVE_ARTICULO,
    C.PRECIO_UNITARIO,C.PRECIO_TOTAL_NETO
    INTO FOLIO,FECHA,PROVEEDOR_ID,ALMACEN_ID,ARTICULO_ID,CLAVE_ARTICULO,
    CANTIDAD,PRECIO_UNITARIO,PRECIO_TOTAL_NETO
    DO
    BEGIN
      NOM_ARTICULO = '';
      UNIDAD_COMPRA = '';
      SELECT NOMBRE,UNIDAD_COMPRA FROM ARTICULOS
      WHERE ARTICULO_ID =:ARTICULO_ID
      INTO NOM_ARTICULO,UNIDAD_COMPRA;
    
      NOM_PROVEEDOR = '';
      SELECT NOMBRE FROM PROVEEDORES
      WHERE PROVEEDOR_ID =:PROVEEDOR_ID
      INTO NOM_PROVEEDOR;      

      SELECT NOMBRE
      FROM ALMACENES
      WHERE ALMACEN_ID =:ALMACEN_ID
      INTO NOM_ALMACEN;

      SUSPEND;
    END
  END
END;

ALTER PROCEDURE MGRQ_COPIA_FTE_DEST (
    V_DOCTO_RQ_ID INTEGER,
    V_PROVEEDOR_ID INTEGER,
    V_DOCTO_COT_ID INTEGER,
    V_PROCESO CHAR(1))
RETURNS (
    NUEVO_DOCTO_ID INTEGER)
AS
declare variable docto_rq_id integer;
declare variable departamento_id integer;
declare variable requisitante_id integer;
declare variable almacen_id integer;
declare variable fecha_aut1 date;
declare variable nivel_aut1 char(1) character set none;
declare variable fecha_aut2 date;
declare variable nivel_aut2 char(1) character set none;
declare variable tipo_aut date;
declare variable nuevo_docto_det_id integer;
declare variable docto_rq_det_id integer;
declare variable fecha_solicitada date;
declare variable clave_articulo varchar(20) character set none;
declare variable articulo_id integer;
declare variable cantidad_a_cot numeric(18,5);
declare variable precio_unitario numeric(18,6);
declare variable nueva_liga_id integer;
declare variable folio char(9) character set none;
declare variable cond_pago_id integer;
declare variable descripcion_articulo varchar(100) character set none;
declare variable descrip_solicitado varchar(100) character set none;
declare variable descrip_autorizado varchar(100) character set none;
declare variable precio_total_neto numeric(15,2);
declare variable importe_impuesto numeric(15,2);
declare variable factor double precision;
declare variable proveedor_id integer;
BEGIN
/* V_DOCTO_RQ_ID =  documento tipo requisicion del cual se extraeran datos
                    para encabezado y ligas
   V_PROVEEDOR_ID = proveedor que se insertara en el nuevo docto solic de cotización
   V_DOCTO_COT_ID = smallint el proceso es agregar docto req a docto cot servirá
                    para generar la liga entre doctos
   V_PROCESO = N = Convertir docto req a cot
               A = Agregar un doto req a una cot
*/

  IF (V_PROCESO = 'N') THEN
  BEGIN
    /* ENCABEZADO */
    SELECT DOCTO_RQ_ID,DEPARTAMENTO_ID,REQUISITANTE_ID,
    FECHA_AUT1,NIVEL_AUT1,FECHA_AUT2,NIVEL_AUT2,TIPO_AUT,
    DESCRIP_SOLICITADO,DESCRIP_AUTORIZADO
    FROM MGRQ_DOCTOS_RQ
    WHERE DOCTO_RQ_ID =:V_DOCTO_RQ_ID
    INTO DOCTO_RQ_ID,DEPARTAMENTO_ID,REQUISITANTE_ID,FECHA_AUT1,
    NIVEL_AUT1,FECHA_AUT2,NIVEL_AUT2,TIPO_AUT,
    DESCRIP_SOLICITADO,DESCRIP_AUTORIZADO;

    FOR SELECT SERIE FROM MGRQ_FOLIOS
    WHERE TIPO_DOCTO ='C'
    ORDER BY SERIE DESC
    INTO FOLIO
    DO
    BEGIN
    END
  
    SELECT COND_PAGO_ID FROM PROVEEDORES
    WHERE PROVEEDOR_ID =:V_PROVEEDOR_ID
    INTO COND_PAGO_ID;
  
    SELECT ALMACEN_ID
    FROM ALMACENES
    WHERE ES_PPAL = 'S'
    INTO ALMACEN_ID;
    /*SELECT MAX(FECHA_ENTREGA)
    FROM MGRQ_DOCTOS_RQ_DET
    WHERE DOCTO_RQ_ID =:V_DOCTO_RQ_ID
    INTO MAX_FECHA_ENTREGA;*/

    NUEVO_DOCTO_ID = GEN_ID(ID_DOCTOS,1);
    INSERT INTO MGRQ_DOCTOS_RQ (DOCTO_RQ_ID,FOLIO,FECHA,PROVEEDOR_ID,
    FECHA_ENTREGA,DEPARTAMENTO_ID,REQUISITANTE_ID,ALMACEN_ID,TIPO_DOCTO,
    FECHA_AUT1,NIVEL_AUT1,FECHA_AUT2,NIVEL_AUT2,TIPO_AUT,COND_PAGO_ID,ESTATUS,
    DESCRIP_SOLICITADO,DESCRIP_AUTORIZADO)
    VALUES(:NUEVO_DOCTO_ID,:FOLIO,CURRENT_DATE,:V_PROVEEDOR_ID,
    CURRENT_DATE,:DEPARTAMENTO_ID,:REQUISITANTE_ID,:ALMACEN_ID,'C',
    :FECHA_AUT1,:NIVEL_AUT1,:FECHA_AUT2,:NIVEL_AUT2,:TIPO_AUT,:COND_PAGO_ID,'N',
    :DESCRIP_SOLICITADO,:DESCRIP_AUTORIZADO);

    /*LIGA DE ENCABEZADOS*/
    NUEVA_LIGA_ID = GEN_ID(ID_LIGAS_DOCTOS,1);
    INSERT INTO MGRQ_DOCTOS_RQ_LIGAS(DOCTO_RQ_LIGA_ID,DOCTO_RQ_FTE_ID,DOCTO_RQ_DEST_ID)
    VALUES(:NUEVA_LIGA_ID,:V_DOCTO_RQ_ID,:NUEVO_DOCTO_ID);
  END

  IF (V_PROCESO = 'A') THEN
  BEGIN
    /*LIGA DE ENCABEZADOS*/
    NUEVA_LIGA_ID = GEN_ID(ID_LIGAS_DOCTOS,1);
    INSERT INTO MGRQ_DOCTOS_RQ_LIGAS(DOCTO_RQ_LIGA_ID,DOCTO_RQ_FTE_ID,DOCTO_RQ_DEST_ID)
    VALUES(:NUEVA_LIGA_ID,:V_DOCTO_RQ_ID,:V_DOCTO_COT_ID);
  END

  /*DETALLE*/
  FOR SELECT DOCTO_RQ_DET_ID,PROVEEDOR_ID,FECHA_SOLICITADA,CLAVE_ARTICULO,
  ARTICULO_ID,CANTIDAD_A_COT,PRECIO_UNITARIO,DESCRIPCION_ARTICULO
  FROM MGRQ_DOCTOS_RQ_DET
  WHERE DOCTO_RQ_ID =:V_DOCTO_RQ_ID AND CANTIDAD_COT_DEV <> 0
  ORDER BY DOCTO_RQ_DET_ID
  INTO DOCTO_RQ_DET_ID,PROVEEDOR_ID,FECHA_SOLICITADA,CLAVE_ARTICULO,
  ARTICULO_ID,CANTIDAD_A_COT,PRECIO_UNITARIO,DESCRIPCION_ARTICULO
  DO
  BEGIN
    IF (PRECIO_UNITARIO = 0) THEN
    BEGIN
      SELECT COSTO_ULTIMA_COMPRA
      FROM ARTICULOS
      WHERE ARTICULO_ID =:ARTICULO_ID
      INTO PRECIO_UNITARIO;
    END

    /*AUN NO HAY DESCUENTOS YA QUE NO SE MANEJAN EN REQ SOLO EN COT*/
    PRECIO_TOTAL_NETO = CANTIDAD_A_COT * PRECIO_UNITARIO;

    FACTOR = 0;
    /*
    SELECT (1+SUM(FACTOR_IMPUESTO)) AS FACT_IMPTO
    FROM FACTORES_IMPTO_ART(:ARTICULO_ID,'N',0)
    INTO FACTOR;
    IF (FACTOR IS NULL) THEN
      FACTOR = 0;
      */
    IMPORTE_IMPUESTO = (PRECIO_TOTAL_NETO * FACTOR) - PRECIO_TOTAL_NETO;

    IF (V_PROCESO = 'N') THEN
    BEGIN
      /*INSERTA NUEVO_DOCTO_ID Y V_PROVEEDOR_ID*/
      NUEVO_DOCTO_DET_ID = GEN_ID(ID_DOCTOS,1);
      INSERT INTO MGRQ_DOCTOS_RQ_DET (DOCTO_RQ_DET_ID,DOCTO_RQ_ID,PROVEEDOR_ID,FECHA_SOLICITADA,
      FECHA_ENTREGA,CLAVE_ARTICULO,ARTICULO_ID,CANTIDAD,PRECIO_UNITARIO,DESCRIPCION_ARTICULO,
      PRECIO_TOTAL_NETO,IMPORTE_IMPUESTO)
      VALUES(:NUEVO_DOCTO_DET_ID,:NUEVO_DOCTO_ID,:V_PROVEEDOR_ID,:FECHA_SOLICITADA,
      :FECHA_SOLICITADA,:CLAVE_ARTICULO,:ARTICULO_ID,:CANTIDAD_A_COT,:PRECIO_UNITARIO,:DESCRIPCION_ARTICULO,
      :PRECIO_TOTAL_NETO,:IMPORTE_IMPUESTO);
    END

    IF (V_PROCESO = 'A') THEN
    BEGIN
      /*INSERTA V_DOCTO_COT_ID Y PROVEEDOR_ID DE DETALLE REQ*/
      NUEVO_DOCTO_DET_ID = GEN_ID(ID_DOCTOS,1);
      INSERT INTO MGRQ_DOCTOS_RQ_DET (DOCTO_RQ_DET_ID,DOCTO_RQ_ID,PROVEEDOR_ID,FECHA_SOLICITADA,
      FECHA_ENTREGA,CLAVE_ARTICULO,ARTICULO_ID,CANTIDAD,PRECIO_UNITARIO,DESCRIPCION_ARTICULO,
      PRECIO_TOTAL_NETO,IMPORTE_IMPUESTO)
      VALUES(:NUEVO_DOCTO_DET_ID,:V_DOCTO_COT_ID,:PROVEEDOR_ID,:FECHA_SOLICITADA,
      :FECHA_SOLICITADA,:CLAVE_ARTICULO,:ARTICULO_ID,:CANTIDAD_A_COT,:PRECIO_UNITARIO,:DESCRIPCION_ARTICULO,
      :PRECIO_TOTAL_NETO,:IMPORTE_IMPUESTO);
    END

    /*LIGA DE DETALLE*/
/*    NUEVA_LIGA_DET_ID = GEN_ID(ID_LIGAS_DOCTOS,1);*/
    INSERT INTO MGRQ_DOCTOS_RQ_LIGAS_DET (DOCTO_RQ_LIGA_ID,DOCTO_RQ_DET_FTE_ID,DOCTO_RQ_DET_DEST_ID)
    VALUES(:NUEVA_LIGA_ID,:DOCTO_RQ_DET_ID,:NUEVO_DOCTO_DET_ID);
  END
END;

ALTER PROCEDURE MGRQ_REP_COMP_FECHAS_C (
    E_DOCTO_RQ_ID INTEGER,
    E_ESTATUS CHAR(10),
    E_FECHA_INI DATE,
    E_FECHA_FIN DATE,
    E_PROCESO CHAR(1))
RETURNS (
    DOCTO_RQ_ID INTEGER,
    FOLIO_COT CHAR(9),
    FECHA_COT DATE,
    ESTATUS_COT CHAR(1),
    DOCTO_REC_ID INTEGER,
    FOLIO_REC CHAR(9),
    FECHA_REC DATE,
    DOCTO_OCM_ID INTEGER,
    FOLIO_OCM CHAR(9),
    DOCTO_RQ_DET_ID INTEGER,
    ARTICULO_ID INTEGER,
    CLAVE_ARTICULO VARCHAR(20),
    NOMBRE_ARTICULO VARCHAR(100),
    CANTIDAD_COT NUMERIC(18,5),
    CANTIDAD_REC NUMERIC(18,5),
    FECHA_SOLICITUD DATE,
    FECHA_ENTREGA DATE,
    FECHA_DIFERENCIA DOUBLE PRECISION)
AS
BEGIN
  /*E_PROCESO = 'E' ANALIZA FECHA DE ENTREGA VS FECHA REAL ENTREGA (RECEPCIÓN DE CM)
    E_PROCESO = 'S' ANALIZA FECHA DE SOLICITUD VS FECHA REAL ENTREGA (RECEPCIÓN DE CM)
  */
  FOR SELECT A.DOCTO_RQ_ID,A.FOLIO,A.FECHA,A.ESTATUS,
  B.DOCTO_RQ_DET_ID,B.ARTICULO_ID,B.CLAVE_ARTICULO,
  B.FECHA_SOLICITADA,B.FECHA_ENTREGA,B.CANTIDAD
  FROM MGRQ_DOCTOS_RQ A
  INNER JOIN MGRQ_DOCTOS_RQ_DET B ON(A.DOCTO_RQ_ID = B.DOCTO_RQ_ID)
  WHERE (:E_DOCTO_RQ_ID = 0 OR A.DOCTO_RQ_ID =:E_DOCTO_RQ_ID)
  AND (:E_ESTATUS = 'T' OR A.ESTATUS =:E_ESTATUS)
  AND A.FECHA BETWEEN :E_FECHA_INI AND :E_FECHA_FIN
  AND A.TIPO_DOCTO = 'C'
  INTO DOCTO_RQ_ID,FOLIO_COT,FECHA_COT,ESTATUS_COT,
  DOCTO_RQ_DET_ID,ARTICULO_ID,CLAVE_ARTICULO,
  FECHA_SOLICITUD,FECHA_ENTREGA,CANTIDAD_COT
  DO
  BEGIN
    NOMBRE_ARTICULO = '';
    SELECT NOMBRE
    FROM ARTICULOS
    WHERE ARTICULO_ID =:ARTICULO_ID
    INTO NOMBRE_ARTICULO;

    FOR SELECT B1.DOCTO_CM_ID,B1.FOLIO
    FROM MGRQ_DOCTOS_COT_LIGAS A1
    INNER JOIN DOCTOS_CM B1 ON(A1.FOLIO_OCM_DEST = B1.FOLIO)
    WHERE A1.FOLIO_COT_FTE =:FOLIO_COT
    AND B1.ESTATUS <> 'C'
    INTO DOCTO_OCM_ID,FOLIO_OCM
    DO
    BEGIN
      FOR SELECT B2.DOCTO_CM_ID,B2.FOLIO,B2.FECHA,C2.UNIDADES
      FROM DOCTOS_CM_LIGAS A2
      INNER JOIN DOCTOS_CM B2 ON(A2.DOCTO_CM_DEST_ID = B2.DOCTO_CM_ID)
      INNER JOIN DOCTOS_CM_DET C2 ON(B2.DOCTO_CM_ID = C2.DOCTO_CM_ID)
      WHERE A2.DOCTO_CM_FTE_ID =:DOCTO_OCM_ID
      AND B2.ESTATUS <> 'C'
      AND C2.ARTICULO_ID =:ARTICULO_ID
      INTO DOCTO_REC_ID,FOLIO_REC,FECHA_REC,CANTIDAD_REC
      DO
      BEGIN
        IF (E_PROCESO = 'E') THEN
          FECHA_DIFERENCIA = FECHA_REC - FECHA_ENTREGA;
        IF (E_PROCESO = 'S') THEN
          FECHA_DIFERENCIA = FECHA_REC - FECHA_SOLICITUD;
        SUSPEND;
      END
    END/*FOR 2*/
  END/*FOR 1*/
END;

ALTER PROCEDURE MGRQ_REP_COMP_FECHAS_R (
    E_DOCTO_RQ_ID INTEGER,
    E_ESTATUS CHAR(10),
    E_FECHA_INI DATE,
    E_FECHA_FIN DATE)
RETURNS (
    DOCTO_RQ_ID INTEGER,
    FOLIO_REQ CHAR(9),
    FECHA_REQ DATE,
    ESTATUS_REQ CHAR(1),
    FECHA_Y_HORA_CREACION DATE,
    FECHA_AUTORIZACION DATE,
    DOCTO_RQ_DET_ID INTEGER,
    ARTICULO_ID INTEGER,
    CLAVE_ARTICULO VARCHAR(20),
    NOMBRE_ARTICULO VARCHAR(100),
    CANTIDAD_REQ NUMERIC(18,5),
    FECHA_DIFERENCIA NUMERIC(15,2))
AS
declare variable descrip_articulo varchar(100) character set none;
BEGIN
  /*
  */
  FOR SELECT A.DOCTO_RQ_ID,A.FOLIO,A.FECHA,A.ESTATUS,
  A.FECHA_Y_HORA_CREACION,A.FECHA_AUT1,B.DOCTO_RQ_DET_ID,
  B.ARTICULO_ID,B.CLAVE_ARTICULO,B.CANTIDAD,B.DESCRIPCION_ARTICULO
  FROM MGRQ_DOCTOS_RQ A
  INNER JOIN MGRQ_DOCTOS_RQ_DET B ON(A.DOCTO_RQ_ID = B.DOCTO_RQ_ID)
  WHERE (:E_DOCTO_RQ_ID = 0 OR A.DOCTO_RQ_ID =:E_DOCTO_RQ_ID)
  AND (:E_ESTATUS = 'T' OR A.ESTATUS =:E_ESTATUS)
  AND A.FECHA BETWEEN :E_FECHA_INI AND :E_FECHA_FIN
  AND A.TIPO_DOCTO = 'R'
  INTO DOCTO_RQ_ID,FOLIO_REQ,FECHA_REQ,ESTATUS_REQ,
  FECHA_Y_HORA_CREACION,FECHA_AUTORIZACION,DOCTO_RQ_DET_ID,
  ARTICULO_ID,CLAVE_ARTICULO,CANTIDAD_REQ,DESCRIP_ARTICULO
  DO
  BEGIN
    if (ARTICULO_ID <> 0) then
    BEGIN
      NOMBRE_ARTICULO = '';
      SELECT NOMBRE
      FROM ARTICULOS
      WHERE ARTICULO_ID =:ARTICULO_ID
      INTO NOMBRE_ARTICULO;
    END
    ELSE
      NOMBRE_ARTICULO = DESCRIP_ARTICULO;

    FECHA_DIFERENCIA = FECHA_AUTORIZACION - FECHA_Y_HORA_CREACION;

    SUSPEND;
  END/*FOR 1*/
END;

ALTER PROCEDURE MGRQ_REP_COMP_PRECIOS (
    E_DOCTO_RQ_ID VARCHAR(9),
    E_ARTICULO_ID INTEGER)
RETURNS (
    PROVEEDOR VARCHAR(100),
    COND_PAGO VARCHAR(50),
    FOLIO_COT VARCHAR(9),
    FOLIO_REQ VARCHAR(9),
    CLAVE_ARTICULO VARCHAR(20),
    NOMBRE VARCHAR(100),
    CANTIDAD NUMERIC(15,2),
    PRECIO_UNITARIO NUMERIC(15,2),
    PCTJE_DSCTO NUMERIC(15,2),
    PRECIO_TOTAL_NETO NUMERIC(15,2),
    UNIDAD_VENTA VARCHAR(5),
    FECHA_ENTREGA DATE,
    PROVEEDOR_ID INTEGER,
    ARTICULO_ID INTEGER,
    COND_PAGO_ID INTEGER)
AS
BEGIN
  /*
  DOCTO_RQ_ID -> ID DE DOCUMENTO DE REQUISICION
  ARTICULO_ID -> SMALLINT SE DESEA ANALIZAR UN ARTICULO EN ESPECIFICO
  PUEDE ENVIAR 0 PARA TODOS LOS ARTICULOS
  */

  SELECT FOLIO
  FROM MGRQ_DOCTOS_RQ
  WHERE DOCTO_RQ_ID = :E_DOCTO_RQ_ID AND TIPO_DOCTO = 'R'
  INTO FOLIO_REQ;

  FOR SELECT B.ARTICULO_ID, CANTIDAD, PRECIO_UNITARIO, PCTJE_DSCTO,
  PRECIO_TOTAL_NETO, B.CLAVE_ARTICULO, A.PROVEEDOR_ID, A.COND_PAGO_ID,
  A.FOLIO, B.DESCRIPCION_ARTICULO, B.FECHA_ENTREGA
  FROM MGRQ_DOCTOS_RQ A
  INNER JOIN MGRQ_DOCTOS_RQ_DET B ON (A.DOCTO_RQ_ID = B.DOCTO_RQ_ID)
  INNER JOIN MGRQ_DOCTOS_RQ_LIGAS C ON (C.DOCTO_RQ_DEST_ID = A.DOCTO_RQ_ID)
  WHERE C.DOCTO_RQ_FTE_ID = :E_DOCTO_RQ_ID AND A.TIPO_DOCTO = 'C'
  AND ESTATUS <> 'C'
  AND ((B.ARTICULO_ID = :E_ARTICULO_ID) OR (:E_ARTICULO_ID = 0))
  ORDER BY B.DOCTO_RQ_DET_ID
  INTO  ARTICULO_ID, CANTIDAD, PRECIO_UNITARIO, PCTJE_DSCTO,
  PRECIO_TOTAL_NETO, CLAVE_ARTICULO, PROVEEDOR_ID, COND_PAGO_ID,
  FOLIO_COT, NOMBRE, FECHA_ENTREGA
  DO
  BEGIN
    IF (ARTICULO_ID IS NOT NULL) THEN
    BEGIN
      SELECT NOMBRE, UNIDAD_VENTA
      FROM ARTICULOS
      WHERE ARTICULO_ID = :ARTICULO_ID
      INTO NOMBRE, UNIDAD_VENTA;
    END

    IF (CLAVE_ARTICULO = '') THEN
    BEGIN
      SELECT CLAVE_ARTICULO
      FROM GET_CLAVE_ART(:ARTICULO_ID)
      INTO CLAVE_ARTICULO;
    END

    SELECT NOMBRE
    FROM PROVEEDORES A
    WHERE PROVEEDOR_ID = :PROVEEDOR_ID
    INTO PROVEEDOR;

    SELECT NOMBRE
    FROM CONDICIONES_PAGO_CP
    WHERE COND_PAGO_ID = :COND_PAGO_ID
    INTO COND_PAGO;

    SUSPEND;
  END
END;


GRANT ALL ON MGRQ_DEPARTAMENTOS TO USUARIO_MICROSIP;
GRANT ALL ON MGRQ_DERECHOS_USUARIOS TO USUARIO_MICROSIP;
GRANT ALL ON MGRQ_DOCTOS_COT_LIGAS TO USUARIO_MICROSIP;
GRANT ALL ON MGRQ_DOCTOS_RQ TO USUARIO_MICROSIP;
GRANT ALL ON MGRQ_DOCTOS_RQ_DET TO USUARIO_MICROSIP;
GRANT ALL ON MGRQ_DOCTOS_RQ_LIGAS TO USUARIO_MICROSIP;
GRANT ALL ON MGRQ_DOCTOS_RQ_LIGAS_DET TO USUARIO_MICROSIP;
GRANT ALL ON MGRQ_FOLIOS TO USUARIO_MICROSIP;
GRANT ALL ON MGRQ_PERMISOS_USUARIOS TO USUARIO_MICROSIP;
GRANT ALL ON MGRQ_REQUISITANTES TO USUARIO_MICROSIP;
GRANT ALL ON MGRQ_PREFER_MOD TO USUARIO_MICROSIP;

GRANT EXECUTE ON PROCEDURE MGRQ_ARTS_XCOT TO USUARIO_MICROSIP;
GRANT EXECUTE ON PROCEDURE MGRQ_ARTS_XORD TO USUARIO_MICROSIP;
GRANT EXECUTE ON PROCEDURE MGRQ_CALC_TOTALES TO USUARIO_MICROSIP;
GRANT EXECUTE ON PROCEDURE MGRQ_CONSULTA_DOCTOS TO USUARIO_MICROSIP;
GRANT EXECUTE ON PROCEDURE MGRQ_COPIA_FTE_DEST TO USUARIO_MICROSIP;
GRANT EXECUTE ON PROCEDURE MGRQ_REP_COMP_FECHAS_C TO USUARIO_MICROSIP;
GRANT EXECUTE ON PROCEDURE MGRQ_REP_COMP_FECHAS_R TO USUARIO_MICROSIP;
GRANT EXECUTE ON PROCEDURE MGRQ_REP_COMP_PRECIOS TO USUARIO_MICROSIP;

