/* PROCEDIMIENTO PARA EMITIR UN DOCUMENTO */
/* EDGAR MARTIN CANCHO RUIZ */

DROP PROCEDURE IN_EmitirProc
GO
CREATE PROCEDURE IN_EmitirProc
(@SITEID1 UD_IDSITE,
@BATNBR1 char(10)
)
AS
BEGIN
    
    DECLARE   @SITEID            UD_IDSITE
    DECLARE   @BATNBR            char(10)
    DECLARE   @TYPEDOCID         UD_TYPEMOVEID
    DECLARE   @INVTIDSKU         UD_IDCORPORATIVO
    DECLARE   @QTY               UD_STOCK
    DECLARE   @STDCOSTPEN        UD_COSTO
    DECLARE   @STDCOSTUSD        UD_COSTO
    DECLARE   @INTRDATE          smalldatetime
    DECLARE   @INTRDATEPROCE     smalldatetime
    DECLARE   @CURYRATE		 numeric(6,4)
    DECLARE   @PERPOST           char(6) 
    DECLARE   @SWTINOUT		 bit    
    DECLARE   @COMPONENT         bit
    DECLARE   @SLSPRICE          numeric(9, 2)  
    DECLARE   @REFNBR		 char(15)
    DECLARE   @ERROR             integer
    DECLARE   @DOCTYPEID	 UD_DOCTYPEID

/***** PARA ACTUALIZAR VENDORINVT***********/
    DECLARE   @VENDIDSS          UD_IDVENDOR
    DECLARE   @CURYID 		 char(3)
    DECLARE   @MONEDABASE	 char(3)    -- almacena la moneda base
/*******************************************/
    DECLARE   @STKFISI           bit
    DECLARE   @DATEPROCE	 smalldatetime
    DECLARE   @STKSTOCK		 BIT
    DECLARE   @VALOR		 UD_STOCK
    DECLARE   @DESCRIPCION	 VARCHAR(40) -- DESCRIPCION DEL ARTICULO
    DECLARE   @MENSAJE		 VARCHAR(80) -- MENSAJE EN CASO DE STOCK INSUFICIENTE
/*******************************************************************************************************/
    	-- VERIFICAR LA TOMA DE INVENTARIO
   	SET @STKFISI=(SELECT STKFISI FROM IN_SETUP) -- PARA CONTROLAR LA TOMA DE INVENTARIO
	SET @STKSTOCK=(SELECT STKSTOCK FROM IN_SETUP) -- PARA LA VALIDACION DE STOCK NEGATIVO
/*******************************************************************************************************/
	-- CARGO LA FECHA DE PROCESO COMO FECHA DE EMISION
	SET @DATEPROCE=(SELECT DATEPROCE FROM SETUP)
	SET @MONEDABASE =(SELECT CURYORIG FROM SETUP)
/*******************************************************************************************************/
    SET @BATNBR=@BATNBR1   
    SET @SITEID=@SITEID1
    SET @SLSPRICE=0
    SET @COMPONENT=0	
   
    SELECT @CURYRATE=CURYRATE,@PERPOST=PERPOST,@REFNBR=REFNBR,@DOCTYPEID=DOCTYPEID,@VENDIDSS=VENDIDSS,@CURYID=FROMCURYID
    FROM IN_INTRAHEAD 
    WHERE SITEID=@SITEID AND BATNBR=@BATNBR 

    SELECT @SWTINOUT=IN_TYPEDOC.INOUT
    FROM IN_TYPEDOC,IN_INTRAHEAD
    WHERE IN_TYPEDOC.TYPEDOCID=IN_INTRAHEAD.TYPEDOCID AND  SITEID=@SITEID AND BATNBR=@BATNBR

  
    --ACTUALIZO EL ESTADO DEL DOCUMENTO EN IN_INTRAHEAD 
    UPDATE IN_INTRAHEAD
    SET DOCSTATUSID='OK',
	RLSED=1,INTRDATEPROCE=@DATEPROCE
    WHERE SITEID=@SITEID AND BATNBR=@BATNBR
          
    SET @ERROR=@@error
     
          IF (@ERROR!=0 OR @@ROWCOUNT=0 )
          BEGIN
	    RAISERROR  20000 'Error Actualizando en IN_INTRAHEAD'       
            RETURN(1)  
          END         

    --ACTUALIZO EL ESTADO DEL DOCUMENTO EN IN_INTRAITEM 
    UPDATE IN_INTRAITEM
    SET RLSED=1,INTRDATEPROCE=@DATEPROCE, DOCSTATUSID='OK'
    WHERE SITEID=@SITEID AND BATNBR=@BATNBR
          
    SET @ERROR=@@error
     
          IF (@ERROR!=0 OR @@ROWCOUNT=0 )
          BEGIN
	    RAISERROR  20000 'Error Actualizando en IN_INTRAITEM'       
            RETURN(1)  
          END         
     /*----------------------------------------------------------------------------------------- */

    -- SE DECLARA UN CURSOR PARA IN_INTRAITEM Y REALIZAR LA ACUALIZACION DE INTRAMOV
    DECLARE INTRAITEM cursor 


    FOR SELECT TYPEDOCID, INVTIDSKU, 
	       QTY, STDCOSTPEN, STDCOSTUSD, 
  	       INTRDATE, INTRDATEPROCE
        FROM   IN_INTRAITEM WHERE SITEID=@SITEID AND BATNBR=@BATNBR 

    OPEN INTRAITEM
    FETCH NEXT FROM INTRAITEM INTO  @TYPEDOCID, @INVTIDSKU,
                      		    @QTY, @STDCOSTPEN, @STDCOSTUSD,
                      		    @INTRDATE, @INTRDATEPROCE

      WHILE @@FETCH_STATUS=0
        BEGIN
			-- SE VERIFICA SI ES UNA SALIDA Y SI NO SE PERMITE STOCK NEGATIVO
			IF (@SWTINOUT=0 AND @STKSTOCK=0)
				BEGIN
					SET @VALOR =(SELECT QTYAVAIL-@QTY FROM IN_INVENTORYDAT WHERE SITEID=@SITEID AND INVTIDSKU=@INVTIDSKU)
					IF (@VALOR<0)
						BEGIN
							SET @DESCRIPCION=(SELECT DESCR FROM IN_INVENTORY WHERE INVTIDSKU=@INVTIDSKU)
							SET @MENSAJE='Stock insuficiente en:' + ' ' + LTRIM(RTRIM(@INVTIDSKU)) + ' ' +  LTRIM(RTRIM(@DESCRIPCION))
							RAISERROR 20000  @MENSAJE
							RETURN(1)	
						END
				END
			
	  	        --ACTUALIZANDO LA TABLA IN_INVENTORYDAT CON LAS NUEVAS CANTIDADES INGRESADAS EN EL DOCUMENTO
			IF (@STDCOSTPEN<>0)  -- SI EL COSTO ES CERO INDICA QUE NO ES VALORIZADO
	  			BEGIN
					UPDATE  IN_INVENTORYDAT
	  				SET QTYAVAIL= CASE @SWTINOUT 
						WHEN 1 THEN QTYAVAIL + @QTY
						WHEN 0 THEN QTYAVAIL - @QTY END,
						STDCOSTPEN=@STDCOSTPEN, STDCOSTUSD=@STDCOSTUSD,LASTSTDCOSTPEN=@STDCOSTPEN, LASTSTDCOSTUSD=@STDCOSTUSD
	  				WHERE SITEID=@SITEID AND INVTIDSKU=@INVTIDSKU
			
				END
			ELSE
	  			BEGIN
					UPDATE  IN_INVENTORYDAT
	  				SET QTYAVAIL=CASE @SWTINOUT 
						WHEN 1 THEN QTYAVAIL + @QTY
						WHEN 0 THEN QTYAVAIL - @QTY END
			  		WHERE SITEID=@SITEID AND INVTIDSKU=@INVTIDSKU   
				END
         				

			-- MANEJO DEL ERROR
              		SET @ERROR=@@error
     
              		IF (@ERROR!=0 OR @@ROWCOUNT=0)
               		BEGIN       
              			CLOSE INTRAITEM
               			DEALLOCATE INTRAITEM
				RAISERROR  20000 'Error Actualizando en IN_INVENTORYDAT'
               			RETURN(1)  
               		END


          		---- ACTUALIZO LA TABLA IN_VENDORINVT
        		IF (@STDCOSTPEN<>0 AND @VENDIDSS<>'00000000000')
        			BEGIN
					IF (@CURYID=@MONEDABASE)
	 					BEGIN
                        				UPDATE IN_VENDORINVT
	           					SET CURYID=@CURYID,STDCOST=@STDCOSTPEN
        	        				WHERE VENDIDSS=@VENDIDSS AND INVTIDSKU= @INVTIDSKU AND SITEID=@SITEID
	 					END
					ELSE
	 					BEGIN
                        				UPDATE IN_VENDORINVT
	           					SET CURYID=@CURYID,STDCOST=@STDCOSTUSD
        	        				WHERE VENDIDSS=@VENDIDSS AND INVTIDSKU= @INVTIDSKU AND SITEID=@SITEID
	 					END
	 
					IF (@@ERROR!=0 OR @@ROWCOUNT=0)
               					BEGIN       
                 					CLOSE INTRAITEM
                 					DEALLOCATE INTRAITEM
							RAISERROR  20000 'Error Actualizando en IN_VENDORINVT'
                 					RETURN(1)  
              					END         

       				END         
--------------------------------------------------------------------

  	  --INSERTANDO EN LA TABLA INTRAMOV
          INSERT INTO INTRAMOV (SITEID,INVTIDSKU,BATNBR,INTRDATE,INTRDATEPROCE,
                                TYPEDOCID,CURYRATE,CURYDATE,PERPOST,SWTINOUT,
				QTY,STDCOSTPEN,STDCOSTUSD,COMPONENT,SLSPRICE,
				REFNBR,DOCTYPEID,STKFISI
                               )
          VALUES(@SITEID,@INVTIDSKU,@BATNBR,@INTRDATE,@INTRDATEPROCE,
                 @TYPEDOCID,@CURYRATE,@INTRDATE,@PERPOST,@SWTINOUT,
		 @QTY,@STDCOSTPEN,@STDCOSTUSD,@COMPONENT,@SLSPRICE,
		 @REFNBR,@DOCTYPEID,@STKFISI 
                 )
 	
	  SET @ERROR=@@error
     
          IF (@ERROR!=0)
          BEGIN       
            CLOSE INTRAITEM
            DEALLOCATE INTRAITEM
            RAISERROR 20000 'Documento ya fué Emitido'
            RETURN(1)  
          END         
	-------------------------------------------------------         
    	  FETCH NEXT FROM INTRAITEM INTO  @TYPEDOCID, @INVTIDSKU,
                      		    @QTY, @STDCOSTPEN, @STDCOSTUSD,
                      		    @INTRDATE, @INTRDATEPROCE
        
      END /* Termina while */




  CLOSE INTRAITEM
  DEALLOCATE INTRAITEM   
  RETURN (0)

END   

