DROP FUNCTION VALIDA_EXPEDICAO
/

DROP TYPE ERROEXPEDICAO_TABLE
/

DROP TYPE ERROEXPEDICAO_TYPE
/

CREATE TYPE ERROEXPEDICAO_TYPE AS
OBJECT (CDFILIAL VARCHAR2(04),
NRPEDIDO VARCHAR2(10),
DSERRO VARCHAR2(200));
/

CREATE TYPE ERROEXPEDICAO_TABLE AS
TABLE OF ERROEXPEDICAO_TYPE
/

create or replace FUNCTION VALIDA_EXPEDICAO(
	P_CDFILIAL       IN PEDIDO.CDFILIAL%TYPE,
	P_NRPEDIDO       IN PEDIDO.NRPEDIDO%TYPE,
	P_CDTIPOOPER     IN PEDIDO.CDTIPOOPER%TYPE DEFAULT NULL,
	P_CDSERIEENTR    IN SERIEENTR.CDSERIEENTR%TYPE DEFAULT NULL,
	P_CDTIPOOPERENTR IN PEDIDO.CDTIPOOPER%TYPE DEFAULT NULL) RETURN ERROEXPEDICAO_TABLE PIPELINED
IS

V_CDFILIALPED PEDIDO.CDFILIALPED%TYPE;
V_IDGERAREPLIC PAREXPEDICAO.IDGERAREPLIC%TYPE;
V_CDTIPOOPER PEDIDO.CDTIPOOPER%TYPE;
V_CDTIPOOPERUT PEDIDO.CDTIPOOPER%TYPE;
V_IDORIGDESTOP TIPOOPERAC.IDORIGDESTOP%TYPE;

OUT_RECORD ERROEXPEDICAO_TYPE := ERROEXPEDICAO_TYPE (NULL, NULL, NULL);

BEGIN

	SELECT MAX(CDFILIALPED), MAX(CDTIPOOPER)
	INTO V_CDFILIALPED, V_CDTIPOOPER
	FROM PEDIDO
	WHERE CDFILIAL = P_CDFILIAL
	AND NRPEDIDO = P_NRPEDIDO;

	SELECT NVL(MAX(IDGERAREPLIC), '1')
	INTO V_IDGERAREPLIC
	FROM PAREXPEDICAO
	WHERE CDFILIAL = P_CDFILIAL;

	V_CDTIPOOPERUT := NVL(P_CDTIPOOPER, V_CDTIPOOPER);

	SELECT NVL(MAX(IDORIGDESTOP), 'C')
		INTO V_IDORIGDESTOP
		FROM TIPOOPERAC
		WHERE (IDENTRSAIDOP = 'S')
		AND (CDTIPOOPER = V_CDTIPOOPERUT);

	IF ((V_CDFILIALPED IS NOT NULL) AND (V_IDGERAREPLIC = '2')) THEN

	    ----INCIO TPNREPLIC -------
	    -- Par. Expedicao parametrizado para Gerar Entrada na filial de destino e--
	    -- o pedido tem filial de destino e                                      --
	    -- Tp. Operacao nao tem destino de Filial                                --
		IF (V_IDORIGDESTOP <> 'L') THEN
			OUT_RECORD.CDFILIAL := P_CDFILIAL;
			OUT_RECORD.NRPEDIDO := P_NRPEDIDO;
			OUT_RECORD.DSERRO := 'TPNREPLIC';
			PIPE ROW (OUT_RECORD);
		END IF;
		----FIM TPNREPLIC -------

		----INCIO SERIEENTR -------
        -- Par. Expedicao parametrizado para Gerar Entrada na filial de destino e--
	    -- o pedido tem filial de destino e                                      --
	    -- Serie da nota de entrada nao foi informada                            --
		IF (P_CDSERIEENTR IS NULL) THEN
			OUT_RECORD.CDFILIAL := P_CDFILIAL;
			OUT_RECORD.NRPEDIDO := P_NRPEDIDO;
			OUT_RECORD.DSERRO := 'SERIEENTR';
			PIPE ROW (OUT_RECORD);
		END IF;
        ----FIM SERIEENTR -------

		----INCIO TIPOOPERENTR -------
        -- Par. Expedicao parametrizado para Gerar Entrada na filial de destino e--
	    -- o pedido tem filial de destino e                                      --
	    -- Tp. Operacao de entrada nao foi informada                            --
		IF (P_CDTIPOOPERENTR IS NULL) THEN
			OUT_RECORD.CDFILIAL := P_CDFILIAL;
			OUT_RECORD.NRPEDIDO := P_NRPEDIDO;
			OUT_RECORD.DSERRO := 'TIPOOPERENTR';
			PIPE ROW (OUT_RECORD);
		END IF;
        ----FIM TIPOOPERENTR -------

	END IF;
	
	
	----INCIO PEDNFILDEST -------
	--Tp. Operacao com destino filial e pedido sem filial de destino informada --
	IF ((V_IDORIGDESTOP = 'L') AND (V_CDFILIALPED IS NULL)) THEN
	   OUT_RECORD.CDFILIAL := P_CDFILIAL;
	   OUT_RECORD.NRPEDIDO := P_NRPEDIDO;
	   OUT_RECORD.DSERRO := 'PEDNFILDEST';
	   PIPE ROW (OUT_RECORD);
	END IF;
	----FIM PEDNFILDEST -------
	
	
	
END;