
ALTER
--alter
procedure [dbo].[P_GEN_AJU_INV]
	@tdo_tdo	char(3),		-- Tipo de documento
	@ndo_doc	int,		-- Numero de documento
	@fec_doc	datetime,		-- Fecha del documento
	@alm_tda	char(3)			-- Almacen
as

declare
		@ref_doc  char(60),			--Rererencia del documento
		@cop_nom  char(1),			--Tipo C=Cliente P=Proveedor
		@cod_nom  char(12),			--Codigo de cliente o proveedor
		@fve_doc  datetime,			--Fecha de vencimiento
		@ven_ven  int,			    --Número de vendedor
		@con_con  int,			    --Número de consignatario
		@imp_doc  numeric(19,5),		--Importe
		@im1_doc  numeric(19,5),		--Impuesto 1
		@im2_doc  numeric(19,5),		--Impuesto 2
		@im3_doc  numeric(19,5),		--Impuesto 3
		@im4_doc  numeric(19,5),		--Impuesto 3
		@im5_doc  numeric(19,5),		--Impuesto 3
		@im0_doc  numeric(19,5),		--Impuesto 3
		@mon_doc  int,			--Moneda del documento
		@vmo_doc  numeric(16,5),		--Valor de la moneda
		@vm1_doc  numeric(16,5),		--Valor de la moneda 1
		@vm2_doc  numeric(16,5),		--Valor de la moneda 2
		@vm3_doc  numeric(16,5),		--Valor de la moneda 3
		@vm4_doc  numeric(16,5),		--Valor de la moneda 4
		@vm5_doc  numeric(16,5),		--Valor de la moneda 5
		@sta_doc  char(1),			--Estaus del documento
		@als_doc  char(3),			--Alamcen de salida
		@ale_doc  char(3),			--Almacen de entrada

							--Datos del movimientos	
		@mov_mov int,			--Número de movimiento
		@ens_mov int,			--Ensamble
		@med_mov int,			--medida
		@inv_tdo char(1),			--Tipo de afectacion de inventario
		@ped_ped char(15),			--Pedimento aduanal
		@ser_mov varchar(40),		--Serie o lote
		@can_mov numeric(19,6),		--Cantidad del movimiento
		@pve_mov numeric(16,5),		--precio de venta
		@de1_mov numeric(16,5),			--descuento 1
		@de2_mov numeric(16,5),			--descuento 2
		@de3_mov numeric(16,5),			--descuento 3
		@de4_mov numeric(16,5),			--descuento 4
		@de5_mov numeric(16,5),			--descuento 5
		@im1_mov numeric(16,5),		--impuesto 1
		@im2_mov numeric(16,5),		--impuesto 2
		@im3_mov numeric(16,5),		--impuesto 3
		@im4_mov numeric(16,5),		--impuesto 3
		@im5_mov numeric(16,5),		--impuesto 3
		@im0_mov numeric(16,5),		--impuesto 3
		@mon_mov int,			--moneda 
		@cen_mov numeric(19,6),		--Cantidad entregada
		@dpe_mov char(3),			--Tipo de documento de pedido
		@npe_mov int,			--Número de documento del pedido
		@mpe_mov int,			--Movimiento dentro del pedido

							-- Datos de insumos
		@cla_isu char(30),			-- Clave del insumo

		@pim_pro bit,			-- Producto importado
		@sse_pro char(1),			-- Control de producto
		@pco_pro numeric(12,5),		-- Precio de costeo
		@pu1_pro numeric(12,5),		-- Precio ultimo de compra
		@mo1_pro int,			-- Moneda ultima compra
		
        @pco_tif numeric(12,5),		-- Primer conteo
        @sco_tif numeric(12,5),              -- Segundo conteo
        @tco_tif numeric(12,5),              -- Tercer conteo

		@can_tif numeric(12,5),		-- Cantidad toma inventario fisico
		@exi_tot numeric(12,5),		-- Existencia total
		@sw_doc  bit,				-- Switch de documento nuevo
		@key_tdo int,			-- Key principal de cometdo
		@men_err varchar(512)		-- Mensaje de error


set @sw_doc=0					-- No hay documento generado
set @fve_doc=@fec_doc				
set @vmo_doc=1					-- Valor de la moneda 1
set @con_con=0					-- Consignatario

						-- Obtenemos el valor de las monedas
select @vm2_doc=va2_pge,@vm3_doc=va3_pge,@vm4_doc=va4_pge,@vm5_doc=va5_pge from comepge  with (nolock)
						-- Obtenemos la afectación de inventario
select @inv_tdo=inv_tdo from cometdo with (nolock) where @tdo_tdo=tdo_tdo 
						-- Declaramos cursor para traernos todas el 
						-- inventario fisico tomado a una fecha determinada
						-- y almacen
declare aju_inv cursor for
    select cometif.cla_isu,ser_tif,ped_tif,
               sum(pco_tif* 
                  case med_tif
                     when 1 then 1
                     when 2 then fa2_isu
                     when 3 then fa3_isu
                  end) as pco_tif,
               sum(sco_tif* 
                  case med_tif
                     when 1 then 1
                     when 2 then fa2_isu
                     when 3 then fa3_isu
                  end) as Sco_tif,
               sum(tco_tif* 
                  case med_tif
                     when 1 then 1
                     when 2 then fa2_isu
                     when 3 then fa3_isu
                  end) as Tco_tif

  from cometif join comeisu  with (nolock) on cometif.cla_isu=comeisu.cla_isu
   where fec_tif=@fec_doc and alm_tda=@alm_tda and tin_tti='P'
   group by cometif.cla_isu,ser_tif,ped_tif 

open aju_inv					-- Abrimos cursor

begin tran					-- Comenzamos Transacción
   						-- Nos traemos el primer producto
   fetch next from aju_inv into @cla_isu,@ser_mov,@ped_ped,@pco_tif,@sco_tif,@tco_tif
     while (@@FETCH_STATUS=0) 
      begin


        				-- Obtiene cual es conteo correcto
					-- Si el primer conteo es = al segundo
        if (@pco_tif=@sco_tif)  set @can_tif=@pco_tif
         else
           set @can_tif=@tco_tif 
	 					-- Lee el datos de producto
        select @pco_pro=prr_pro,@sse_pro=sse_pro,@pim_pro=pim_pro,@pu1_pro=pu1_pro,
                @mo1_pro=mo1_pro from comeisu with (nolock) join comepro 
                on comeisu.cla_isu=comepro.cla_isu
                where comeisu.cla_isu=@cla_isu 

       if (@pco_pro is null)
          set @pco_pro=0 
      
--         if @pim_pro=0 set @ped_ped=null	-- Si no es importado
						-- Si no lleva control por serie y lote
         if isnull(@sse_pro,' ')<>'S' and isnull(@sse_pro,' ')<>'L' set @ser_mov=null 
         if isnull(@ped_ped,' ')=' ' and @pim_pro=0 set @ped_ped=null
						-- Calcula la existencia del producto	
						-- del almacen
      --   exec cal_exi_gen              @cla_isu,0,@fec_doc,@alm_tda,@ser_mov,@ped_ped,NULL,@exi_tot OUTPUT
        set @exi_tot=dbo.f_cal_exi_gen(@cla_isu,0,@fec_doc,@alm_tda,@ser_mov,@ped_ped,NULL)
--         print 'Existencia '+@cla_isu+cast(@exi_tot as char(15))+' '+cast(@can_tif as char(15))+@ped_ped
 
         if @ser_mov is null set @ser_mov=space(17) 
         if @ped_ped is null set @ped_ped=space(15) 

						-- Si el documento es nuevo y hay diferecia en 
						-- existencia
         if @sw_doc=0 and (( @inv_tdo='S' and @exi_tot>@can_tif) or 
                           ( @inv_tdo='E' and @exi_tot<@can_tif))
          begin					-- Busca si exite el documento

--            PRINT @TDO_TDO+CAST(@NDO_DOC AS CHAR(15))
        
            if exists(select key_pri from comedoc where @ndo_doc=ndo_doc and @tdo_tdo=tdo_tdo)
             begin				-- Si el documento ya existe
               set @men_err='El documento ya existe '
  	       raiserror(@men_err,16,1)
       	       ROLLBACK TRAN
               close aju_inv
               deallocate aju_inv
   	       return
             end
            set @cod_nom='            '
            set @cop_nom=' '
            set @ven_ven=0
            set @ref_doc='Ajuste de inventario'
            set @sta_doc='P'
            set @imp_doc=0
            set @im1_doc=0
            set @im2_doc=0
            set @im3_doc=0
            set @im4_doc=0
            set @im5_doc=0
            set @im0_doc=0
            set @mon_doc=1
            set @vmo_doc=1
            set @als_doc='  '
            set @ale_doc='  '
            if @inv_tdo='S'				-- Asiganmos almacen
               set @als_doc=@alm_tda
            if @inv_tdo='E'
               set @ale_doc=@alm_tda


							-- Insertamos el documento
           insert dbo.comedoc (tdo_tdo,ndo_doc,ref_doc,cop_nom,cod_nom,fec_doc,fve_doc,ven_ven,
                         con_con,imp_doc,
		          im1_doc,im2_doc,im3_doc,im4_doc,im5_doc,im0_doc,mon_doc,vmo_doc,vm2_doc,vm3_doc,vm4_doc,
		    	  vm5_doc,sta_doc,als_doc,ale_doc)
                          values
                         (@tdo_tdo,@ndo_doc,@ref_doc,' ','      ',@fec_doc,@fec_doc,0,0,@imp_doc,
		          @im1_doc,@im2_doc,@im3_doc,@im4_doc,@im5_doc,@im0_doc,@mon_doc,@vmo_doc,@vm2_doc,@vm3_doc,@vm4_doc,
		    	  @vm5_doc,@sta_doc,@als_doc,@ale_doc) 


           set @mov_mov=0			-- Inicializamos el número de movimientos del docto
           set @sw_doc=1			-- Prendemos que ya se genero el documento
 
          end  -- Fin de alta de documento

						-- Si la existencia calculada es mayor que la
						-- capturada genera salida
--        print 'Antes de entrar '+@inv_tdo+' Existencia  exi_tot='+cast(@exi_tot as char(15))+' can_tif='+cast(@can_tif as char(15))

         if (@inv_tdo='S' and @exi_tot>@can_tif) or (@inv_tdo='E' and @exi_tot<@can_tif)
          begin

            set @can_mov=0
            if (@inv_tdo='S' and @exi_tot>@can_tif) -- Calculamos la cantidad 
                set @can_mov=@exi_tot-@can_tif		
         
            if (@inv_tdo='E' and @exi_tot<@can_tif) -- Calculamos la cantidad 
                set @can_mov=@can_tif-@exi_tot
                         
--            PRINT 'Cantidad '+cast(@can_mov as char(20))
            set @mon_mov=@mon_doc			--Asigna moneda
            set @cen_mov=0				--Cantidad por entregar
            set @de1_mov=0				--descuento
            set @de2_mov=0
            set @de3_mov=0
            set @de4_mov=0
            set @de5_mov=0


            set @mov_mov=@mov_mov+1		--Número de movimiento
            set @ens_mov=0			--Ensamble
            set @med_mov=1			--Medida del movimiento
            set @im1_mov=0			--Impuesto 1
            set @im2_mov=0			--Impuesto 2
            set @im3_mov=0			--Impuesto 3
            set @im4_mov=0			--Impuesto 3
            set @im5_mov=0			--Impuesto 3
            set @im0_mov=0			--Impuesto 3
	    set @dpe_mov=''
            set @npe_mov=0
            set @mpe_mov=0
            set @pve_mov=@pco_pro		--Asigna el precio 
            
           
            if @pve_mov=0			-- Si el precio de venta es 0
             begin				-- asigna el precio de la ultima compra
               set @pve_mov=@pu1_pro*case @mo1_pro
                                        when 1 then 1
                                        when 2 then @vm2_doc
                                        when 3 then @vm3_doc
                                        when 4 then @vm4_doc
                                        when 5 then @vm5_doc
                                     end

             end
           if @pve_mov is null or @pve_mov=0			-- Si el precio de venta sigue en 0
              begin		
                set rowcount 1
                select top 1 @pve_mov=pve_mov*vmo_doc/
                     case med_mov
                        when 1 then 1
                        when 2 then fa2_isu
                        when 3 then fa3_isu
                     end
                  from comemov 
                    join comeisu on comemov.cla_isu=comeisu.cla_isu
                    join cometdo on comemov.tdo_tdo=cometdo.tdo_tdo 
                    join comedoc on comemov.tdo_tdo=comedoc.tdo_tdo and comemov.ndo_doc=comedoc.ndo_doc
                     where comemov.cla_isu=@cla_isu and fec_mov<=@fec_doc and cometdo.inv_tdo='' order by fec_mov desc
                set rowcount 0
              end    

           if @pve_mov is null or @pve_mov=0			-- Si el precio de venta sigue en 0
              begin
                set rowcount 1
                select top 1 @pve_mov=pve_mov*vmo_doc/
                     case med_mov
                        when 1 then 1
                        when 2 then fa2_isu
                        when 3 then fa3_isu
                     end
                  from comemov 
                    join comeisu on comemov.cla_isu=comeisu.cla_isu
                    join cometdo on comemov.tdo_tdo=cometdo.tdo_tdo 
                    join comedoc on comemov.tdo_tdo=comedoc.tdo_tdo and comemov.ndo_doc=comedoc.ndo_doc
                     where comemov.cla_isu=@cla_isu and fec_mov>@fec_doc and cometdo.inv_tdo='E' order by fec_mov 
                 set rowcount 0
              end

           if @pve_mov is null -- Si no encontro ningun precio que asignar
              set @pve_mov=0		


            insert dbo.comemov (tdo_tdo,ndo_doc,mov_mov,ens_mov,inv_tdo,
                      cla_isu,can_mov,med_mov,
                      dpe_mov,npe_mov,mpe_mov,ped_ped,ser_mov,
   		      pve_mov,de1_mov,de2_mov,de3_mov,de4_mov,de5_mov,im1_mov,
		      im2_mov,im3_mov,im4_mov,im5_mov,im0_mov,mon_mov,cen_mov,fec_mov,fme_mov,alm_tda) 
		values
                     (@tdo_tdo,@ndo_doc,@mov_mov,@ens_mov,@inv_tdo,
                      @cla_isu,@can_mov,@med_mov,
                      @dpe_mov,@npe_mov,@mpe_mov,@ped_ped,@ser_mov,
   		      @pve_mov,@de1_mov,@de2_mov,@de3_mov,@de4_mov,@de5_mov,@im1_mov,
		      @im2_mov,@im3_mov,@im4_mov,@im5_mov,@im0_mov,@mon_mov,@cen_mov,@fec_doc,@fec_doc,@alm_tda) 

         end     -- Fin de inserción de movimientos 
         if @mov_mov>=999
            begin

              set @mov_mov=0			-- Inicializamos el número de movimientos del docto
              set @sw_doc=0			-- Apagamos que ya se genero el documento
              set @ndo_doc=@ndo_doc+1		-- Aumentamos concecutivo

--              commit tran					-- Terminamos la Transacción
--              close aju_inv
--              deallocate aju_inv
--              return   
            end
 
		 -- Se trae el siguiente produto
        fetch next from aju_inv into @cla_isu,@ser_mov,@ped_ped,@pco_tif,@sco_tif,@tco_tif
       end       -- fin de lectura de tempora

--rollback tran
commit tran					-- Terminamos la Transacción
close aju_inv
deallocate aju_inv



GO


