/* PROCEDIMIENTO QUE GENERA UN DOCUMENTO DE INGRESO Y OTRO DE
   SALIDA POR DESENSAMBLE */
/* EDGAR MARTIN CANCHO RUIZ */

DROP PROCEDURE IN_GenerarDocumentosPorDesensambleProc
GO
CREATE PROCEDURE IN_GenerarDocumentosPorDesensambleProc
(@SITEID1 	UD_IDSITE,
 @BATNBR1 	char(10),
 @TYPEDOCID1	UD_TYPEMOVEID,  -- CODIGO DEL INGRESO POR DESENSAMBLE
 @TYPEDOCID2	UD_TYPEMOVEID,  -- CODIGO DE LA SALIDA POR DESENSAMBLE
 @INOUT		BIT,		-- 1 SI LOS DOCUMENTOS A GENERAR PROVIENEN DE UN INGRESO Y 0 SI PROVIENEN DE UNA SALIDA
 @VENDIDSS	UD_IDVENDOR		-- ULILIZADO PARA GENERAR EL DETALLE DEL DOCUMENTO2
)
AS
BEGIN

	DECLARE	@BATNBR		CHAR(10)
	DECLARE @BATNBR_NEXT 	char(10)
	DECLARE @BATNBR_AUX 	char(10) --GUARDARA EL CORRELATIVO DEL PRIMER DOCUMENTO GENERADO PARA SER REFERENCIADAÇ
					 -- DESDE EL SEGUNDO DOCUMENTO
	DECLARE @SITEID 	UD_IDSITE
	DECLARE @TYPEDOCID	UD_TYPEMOVEID 
	DECLARE @NUM_BATNBR NUMERIC(10,0)
   	DECLARE @ERROR Integer
   	DECLARE @TSTAMP timestamp
   	DECLARE @ROWCOUNT Integer
	SELECT @ERROR=0   

/****** VARIABLES QUE VIENEN DEL SETUP PARA EL REDONDEO ********************/ 
	DECLARE @ND_COSTOSETUP Tinyint
	DECLARE @ND_STOCKSETUP Tinyint
	DECLARE @ND_RESULTADOSETUP Tinyint

	SET @ND_COSTOSETUP=(Select Floatcost from setup)
 	SET @ND_STOCKSETUP=(Select Floatqty from setup)
	SET @ND_RESULTADOSETUP=(Select Floatoutput from setup)
/**********************************************************************************/
/************************* PROCESO DE DOCUMENTO1 **********************************/
/**********************************************************************************/

   	SELECT @BATNBR=BATNBRTYPEDOC FROM IN_SETUP
   	SELECT @NUM_BATNBR=cast(@BATNBR AS NUMERIC(10,0))+1
   	SELECT @BATNBR_NEXT =replicate('0',10-len(@NUM_BATNBR))+cast(@NUM_BATNBR as char(10))


	IF (@INOUT=1)	 
		SET @TYPEDOCID=@TYPEDOCID2
	ELSE
		SET @TYPEDOCID=@TYPEDOCID1		

	SET @SITEID=@SITEID1	 	

  /*** ACTUALIZACION DEL CORRELATIVO DE TIPO DE MOVIMIENTO ***/
    	UPDATE IN_SETUP
    	SET    BATNBRTYPEDOC=@BATNBR_NEXT    
	WHERE  BATNBRTYPEDOC=@BATNBR

	IF (@@error!=0 OR @@ROWCOUNT=0 )
    	BEGIN
		RAISERROR  20000 'Error Actualizando en IN_SETUP'
        	RETURN(1)
    	END

  /*************** GENERANDO CABECERA DE DOCUMENTO1 **************************/

--------------RECALCULANDO MONTOS DE CABECERA ------------------------------------------

--VARIABLES PARA LA CABECERA
DECLARE @INTRTOTPEN UD_MONTO
DECLARE @INTRTAXPEN UD_IMPUESTO
DECLARE @INTRTOTUSD UD_MONTO
DECLARE @INTRTAXUSD UD_IMPUESTO
DECLARE @INTRSUBTOTPEN UD_MONTO
DECLARE @INTRSUBTOTUSD UD_MONTO

SET @INTRTOTPEN=0
SET @INTRTAXPEN=0
SET @INTRTOTUSD=0
SET @INTRTAXUSD=0
SET @INTRSUBTOTPEN=0
SET @INTRSUBTOTUSD=0


--VARIABLES PARA EL DETALLE QUE SERA MANEJADO POR EL CURSOR PARA EL RECALCULO DE LOS TOTALES DE LA CABECERA
DECLARE @QTY	UD_STOCK
DECLARE @TAXIGV	UD_IMPUESTO
DECLARE @STDCOSTPEN	UD_COSTO
DECLARE @STDCOSTUSD	UD_COSTO

DECLARE @VAL_IMP UD_IMPUESTO

	DECLARE CUR_TEMPORAL CURSOR 
	FOR 	SELECT QTY,TAXIGV,STDCOSTPEN,STDCOSTUSD
        	FROM IN_INTRAITEM 
		WHERE SITEID=@SITEID AND BATNBR=@BATNBR1 AND INVTIDSKU IN (SELECT INVTIDSKU FROM IN_INVENTORYDES)

    	OPEN CUR_TEMPORAL
	FETCH NEXT FROM CUR_TEMPORAL INTO @QTY,@TAXIGV,@STDCOSTPEN,@STDCOSTUSD

	IF (@@FETCH_STATUS!=0)
          BEGIN       
            CLOSE CUR_TEMPORAL
            DEALLOCATE CUR_TEMPORAL
            RAISERROR 20000  'No tiene registros en Detalle'
            RETURN(1)  
          END         
     

      WHILE @@FETCH_STATUS=0
        BEGIN    
		
		SET @VAL_IMP=@TAXIGV
		
 		SET @INTRSUBTOTPEN=@INTRSUBTOTPEN + ROUND((@QTY*@STDCOSTPEN),@ND_RESULTADOSETUP)
		SET @INTRSUBTOTUSD=@INTRSUBTOTUSD + ROUND((@QTY*@STDCOSTUSD),@ND_RESULTADOSETUP)
		SET @INTRTAXPEN=@INTRTAXPEN + ROUND(((@TAXIGV*@QTY*@STDCOSTPEN)/100),@ND_RESULTADOSETUP)
		SET @INTRTAXUSD=@INTRTAXUSD + ROUND(((@TAXIGV*@INTRSUBTOTUSD)/100),@ND_RESULTADOSETUP)		

    	  FETCH NEXT FROM CUR_TEMPORAL INTO @QTY,@TAXIGV,@STDCOSTPEN,@STDCOSTUSD 
        
        END /* Termina while */


	SELECT DISTINCT TAXIGV
	FROM IN_INTRAITEM 
	WHERE SITEID=@SITEID AND BATNBR=@BATNBR1 AND INVTIDSKU IN (SELECT INVTIDSKU FROM IN_INVENTORYDES)

	IF(@@ROWCOUNT>=2)
		BEGIN
			SET @INTRTOTPEN=ROUND(@INTRSUBTOTPEN + @INTRTAXPEN,@ND_RESULTADOSETUP)
			SET @INTRTOTUSD=ROUND(@INTRSUBTOTUSD + @INTRTAXUSD,@ND_RESULTADOSETUP)
		END
	ELSE
 		BEGIN
			SET @INTRTAXPEN=ROUND(((@VAL_IMP*@INTRSUBTOTPEN)/100),@ND_RESULTADOSETUP)
			SET @INTRTOTPEN=@INTRSUBTOTPEN + @INTRTAXPEN
			SET @INTRTAXUSD=ROUND(((@VAL_IMP*@INTRSUBTOTUSD)/100),@ND_RESULTADOSETUP)
			SET @INTRTOTUSD=@INTRSUBTOTUSD + @INTRTAXUSD
		END
 

  CLOSE CUR_TEMPORAL
  DEALLOCATE CUR_TEMPORAL

--------------------------------------------------------


	INSERT 	INTO 	IN_INTRAHEAD(SITEID,BATNBR,TYPEDOCID,VENDIDSS,DOCTYPEID,DOCSTATUSID,REFNBR,CURYRATE,TOCURYID,
			FROMCURYID,SITEPROCES,NBRORDER,DATENBRORDER,USERIDORDER,INTRDATE,INTRDATEPROCE,SITEDEST,
			INTRTOTPEN,INTRTAXPEN,INTRTOTUSD,INTRTAXUSD,PERPOST,RLSED,DISASSEMBLE,INTRSUBTOTPEN,INTRSUBTOTUSD,USERID)
		SELECT 	@SITEID,@BATNBR,@TYPEDOCID,VENDIDSS,DOCTYPEID,DOCSTATUSID,REFNBR,CURYRATE,TOCURYID,
			FROMCURYID,SITEPROCES,NBRORDER,DATENBRORDER,USERIDORDER,INTRDATE,INTRDATEPROCE,SITEDEST,
			@INTRTOTPEN,@INTRTAXPEN,@INTRTOTUSD,@INTRTAXUSD,PERPOST,RLSED,DISASSEMBLE,@INTRSUBTOTPEN,@INTRSUBTOTUSD,USERID
		FROM	IN_INTRAHEAD
		WHERE	SITEID=@SITEID AND BATNBR=@BATNBR1 

	IF (@@error!=0 OR @@ROWCOUNT=0 )
    	BEGIN
		RAISERROR  20000 'Error Insertando en IN_INTRAHEAD: Documento1'
        	RETURN(1)
    	END

  /*************** GENERANDO DETALLE DE DOCUMENTO1 **************************/
	INSERT 	INTO 	IN_INTRAITEM(SITEID,BATNBR,TYPEDOCID,SEQUENCE,INVTIDSKU,INVTIDBARR,QTY,TAXIGV,
			STDCOSTPEN,STDCOSTUSD,STKFISI,INTRDATE,INTRDATEPROCE,RLSED,BUYCOD,DOCSTATUSID)
		SELECT 	@SITEID,@BATNBR,@TYPEDOCID,SEQUENCE,INVTIDSKU,INVTIDBARR,QTY,TAXIGV,
			STDCOSTPEN,STDCOSTUSD,STKFISI,INTRDATE,INTRDATEPROCE,RLSED,BUYCOD,DOCSTATUSID
		FROM	IN_INTRAITEM
		WHERE	SITEID=@SITEID AND BATNBR=@BATNBR1 AND INVTIDSKU IN (SELECT INVTIDSKU FROM IN_INVENTORYDES)

	IF (@@error!=0 OR @@ROWCOUNT=0 )
    	BEGIN
		RAISERROR  20000 'Error Insertando en IN_INTRAITEM: Documento1'
        	RETURN(1)
    	END
 /*************** EMITIENDO DOCUMENTO1 GENERADO **************************/
        SET EXEC @ERROR=IN_EmitirProc @SITEID,@BATNBR
    
	IF (@ERROR!=0)
    	BEGIN
       		RETURN(1)               
    	END 
/*************************   FIN DE DOCUMENTO1 ************************************/

/**********************************************************************************/
/************************* PROCESO DE DOCUMENTO2 **********************************/
/**********************************************************************************/
	
	SET @BATNBR_AUX=@BATNBR

   	SELECT @BATNBR=BATNBRTYPEDOC FROM IN_SETUP
   	SELECT @NUM_BATNBR=cast(@BATNBR AS NUMERIC(10,0))+1
   	SELECT @BATNBR_NEXT =replicate('0',10-len(@NUM_BATNBR))+cast(@NUM_BATNBR as char(10))
	
	
	IF (@INOUT=1)	 
		SET @TYPEDOCID=@TYPEDOCID1
	ELSE
		SET @TYPEDOCID=@TYPEDOCID2
	
	SET @SITEID=@SITEID1	 	

 /*** ACTUALIZACION DEL CORRELATIVO DE TIPO DE MOVIMIENTO ***/

    	UPDATE IN_SETUP
    	SET    BATNBRTYPEDOC=@BATNBR_NEXT    
	WHERE  BATNBRTYPEDOC=@BATNBR

	IF (@@error!=0 OR @@ROWCOUNT=0 )
    	BEGIN
		RAISERROR  20000 'Error Actualizando en IN_SETUP'
        	RETURN(1)
    	END
  /*************** GENERANDO CABECERA DE DOCUMENTO2 **************************/
       INSERT 	INTO 	IN_INTRAHEAD(SITEID,BATNBR,TYPEDOCID,VENDIDSS,DOCTYPEID,DOCSTATUSID,REFNBR,CURYRATE,TOCURYID,
			FROMCURYID,SITEPROCES,NBRORDER,DATENBRORDER,USERIDORDER,INTRDATE,INTRDATEPROCE,SITEDEST,
			INTRTOTPEN,INTRTAXPEN,INTRTOTUSD,INTRTAXUSD,PERPOST,RLSED,DISASSEMBLE,INTRSUBTOTPEN,INTRSUBTOTUSD,USERID)
		SELECT 	@SITEID,@BATNBR,@TYPEDOCID,VENDIDSS,DOCTYPEID,DOCSTATUSID,REFNBR,CURYRATE,TOCURYID,
			FROMCURYID,SITEPROCES,NBRORDER,DATENBRORDER,USERIDORDER,INTRDATE,INTRDATEPROCE,SITEDEST,
			INTRTOTPEN,INTRTAXPEN,INTRTOTUSD,INTRTAXUSD,PERPOST,RLSED,DISASSEMBLE,INTRSUBTOTPEN,INTRSUBTOTUSD,USERID
		FROM	IN_INTRAHEAD
		WHERE	SITEID=@SITEID AND BATNBR=@BATNBR_AUX

	IF (@@error!=0 OR @@ROWCOUNT=0 )
    	BEGIN
		RAISERROR  20000 'Error Insertando en IN_INTRAHEAD: Documento2'
        	RETURN(1)
    	END
  /*************** GENERANDO DETALLE DE DOCUMENTO2 **************************/
	INSERT 	INTO 	IN_INTRAITEM(SITEID,BATNBR,TYPEDOCID,SEQUENCE,INVTIDSKU,INVTIDBARR,QTY,TAXIGV,
			STDCOSTPEN,STDCOSTUSD,STKFISI,INTRDATE,INTRDATEPROCE,RLSED,BUYCOD,DOCSTATUSID)	
	  SELECT        @SITEID,@BATNBR,@TYPEDOCID,SEQUENCE,INVTIDSKUDES,(SELECT TOP 1 INVTIDBARR FROM IN_INVENTORYALTER WHERE IN_INVENTORYALTER.INVTIDSKU=IN_INVENTORYDES.INVTIDSKUDES),ROUND(QTY*WTSTK2,@ND_STOCKSETUP),TAXIGV,
			ROUND(STDCOSTPEN/(WTSTK2),@ND_COSTOSETUP),ROUND(STDCOSTUSD/(WTSTK2),@ND_COSTOSETUP),STKFISI,INTRDATE,INTRDATEPROCE,RLSED,IN_VENDORINVT.BUYCOD,
                        DOCSTATUSID
		FROM	((IN_INTRAITEM INNER JOIN IN_INVENTORYDES ON IN_INTRAITEM.INVTIDSKU=IN_INVENTORYDES.INVTIDSKU)  
                        LEFT JOIN IN_VENDORINVT ON IN_INVENTORYDES.INVTIDSKU=IN_VENDORINVT.INVTIDSKU)
		WHERE	IN_INTRAITEM.SITEID=@SITEID AND BATNBR=@BATNBR_AUX AND IN_VENDORINVT.VENDIDSS=@VENDIDSS
       
	IF (@@error!=0 OR @@ROWCOUNT=0 )
    	BEGIN
		RAISERROR  20000 'Error Insertando en IN_INTRAITEM: Documento2'
        	RETURN(1)
    	END
 /*************** EMITIENDO DOCUMENTO2 GENERADO **************************/
        SET EXEC @ERROR=IN_EmitirProc @SITEID,@BATNBR
    
	IF (@ERROR!=0)
    	BEGIN
       		RETURN(1)               
    	END 

	RETURN(0)
END   
