PL/SQL

PL/SQL


--Procesar procedure

--Ejecutar por cada iteración de solicitud

Proceso aislado

--Producto --PRD_ID_PRODUCTO

NB_PRODUCTO

CO_PRODUCTO

UNM_ID_UNIDAD_MED_INVENTARIO

--Almacen --ID_INSTALACION_EQUIPO

CO_INSTALACION_EQUIPO

ID_UBA_ALMACEN

INE_CO_ALMACEN

--Credito --CODCRE

CODCAT

--Lote --CODLOT

PERLOT

CODFIN

--Pedido --PEC_ID_PEDIDO

--Organizacion --ORG_ID_ORGANIZACION

CODPRO

--CANT_APROB

Elementales

PRD_ID_PRODUCTO

ID_INSTALACION_EQUIPO

CODCRE

CODLOT

PEC_ID_PEDIDO

ORG_ID_ORGANIZACION

CANT_APROB

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

DECLARE

    r_serie           sk00_gestiona_serie_documentos.t_serie;

    v_cv1            s00_variable_control_r%rowtype;

    v_sed_id_serie_documento  number;

    v_co_serie_pedido      varchar2(6);

    v_nu_pedido         varchar2(20);

    v_co_partida_presupuestaria varchar2(40);

    v_ca_del_lote        number;

    v_mn_total_lotes      number;

    v_co_presupuestario     varchar2(32);

    v_resultado_partida     boolean;

    p_tx_mensaje        varchar2(200);

    v_arr_lote         sk03_gestiona_existencias.t_lote;

    --Variables del detalle del pedido

    v_det_pr_producto      number;

    v_det_lop_id_lote_producto number;

    v_det_ca_producto_original number;

BEGIN

  v_cv1.co_variable_control    := 'CO_TIPO_DOCUMENTO_PEDIDO';

  v_cv1              := sk00_buscar.f_registro(v_cv1);

  r_serie             := sk00_gestiona_serie_documentos.f_obtiene_serie_tipo_documento(

                     v_cv1.va_texto_variable

                     ,sk00_define_control_acceso_ctx.obtiene_id_persona_activa

                     );

  v_sed_id_serie_documento    := r_serie.id_registro;

  v_co_serie_pedido        :=r_serie.co_serie;

  r_serie             := sk00_gestiona_serie_documentos.f_obtiene_correlativos_serie(

                    v_sed_id_serie_documento, 

                    SYSDATE

                    );

  v_nu_pedido           := r_serie.nu_documento;

  --Inserta el maestro de la orden

  INSERT INTO v05_pedido_cliente_r_asop (

      ID_REGISTRO,

      EMP_ID_EMPRESA,

      GRD_ID_GRUPO_DATO,

      ORG_ID_CLIENTE,

      PER_ID_VENDEDOR,

      CO_CLIENTE,

      CTV_ID_TIPO_DOCUMENTO,

      CO_SERIE_PEDIDO,

      NU_PEDIDO,

      SED_ID_SERIE_DOCUMENTO,

      EMS_ID_SUCURSAL,

      NU_ORDEN_CLIENTE,

      FE_EMISION,

      PRY_ID_PROYECTO,

      UNM_ID_UNIDAD_MONETARIA,

      CTV_ID_ESTADO_DOCUMENTO,

      CTV_ID_MODO_CARGA_DATO,

      IN_CONDICION_PAGO,

      CTV_ID_CONDICION_COMPRA,

      FC_TASA_CAMBIO,

      TX_OBSERVACION,

      PGP_ID_PROGRAMA_PRODUCCION,

      CTV_ID_TIPO_GARANTIA,

      NU_DOCUMENTO_SIST_EXTERNO

      ) VALUES

      (

      :BLOQUE_DET.PEC_ID_PEDIDO ,    --ID_REGISTRO

      6321839,            --EMP_ID_EMPRESA ('ASOCIACIÓN DE PRODU...')

      6322436,            --GRD_ID_GRUPO_DATO

      :BLOQUE_DET.ORG_ID_ORGANIZACION,  --ORG_ID_CLIENTE,

      ID_REGISTRO:T00_PERSONA,    --PER_ID_VENDEDOR

      :BLOQUE_DET.CODPRO,        --CO_CLIENTE fnproductor(codpro)

      6322747,            --CTV_ID_TIPO_DOCUMENTO ('PEDIDO DE CLIENTE')

      v_co_serie_pedido,       --CO_SERIE_PEDIDO

      v_nu_pedido,          --NU_PEDIDO

      v_sed_id_serie_documento,   --SED_ID_SERIE_DOCUMENTO

      NULL,             --EMS_ID_SUCURSAL

      NULL,             --NU_ORDEN_CLIENTE

      SYSDATE,            --FE_EMISION

      NULL,             --PRY_ID_PROYECTO

      5974069,            --UNM_ID_UNIDAD_MONETARIA ('BOLIVARES')

      6322658,            --CTV_ID_ESTADO_DOCUMENTO ('EMITIDO')

      55342,             --CTV_ID_MODO_CARGA_DATO ('MANUAL')

      'CR',             --IN_CONDICION_PAGO

      NULL,             --CTV_ID_CONDICION_COMPRA

      NULL,             --FC_TASA_CAMBIO

      'Generada automaticamente.',  --TX_OBSERVACION,

      NULL,             --PGP_ID_PROGRAMA_PRODUCCION

      NULL,             --CTV_ID_TIPO_GARANTIA

      v_nu_pedido,          --NU_DOCUMENTO_SIST_EXTERNO

      );

  v_arr_lote    := sk03_gestiona_existencias.f_lotes_disponibles(

            :BLOQUE.CO_PRODUCTO,

            :BLOQUE.CO_INSTALACION_EQUIPO,

            :BLOQUE_DET.CANT_APROB,

            :BLOQUE_DET.ORG_ID_ORGANIZACION

            );

  v_ca_requerida  := :BLOQUE_DET.CANT_APROB;

  v_ca_del_lote  := 0;

  v_mn_total_lotes := 0;

  for i in 1 .. v_arr_lote.count loop

   v_det_pr_producto       := nvl(v_arr_lote(i).mn_costo,0);

   v_det_lop_id_lote_producto   := nvl(v_arr_lote(i).id_lote,0);

   IF v_ca_requerida >= nvl(v_arr_lote(i).ca_existencia,0) THEN

     v_ca_del_lote       :=nvl(v_arr_lote(i).ca_existencia,0);

     v_det_ca_producto_original := nvl(v_arr_lote(i).ca_existencia,0);

     v_ca_requerida       := v_ca_requerida - v_det_ca_producto_original;

   ELSE

     v_ca_del_lote       :=v_ca_requerida;

     v_det_ca_producto_original :=v_ca_requerida;

     v_ca_requerida       :=0;

   END IF;

   --Inserta detalle de la orden

   INSERT INTO v05_pedido_cliente_producto_r (

       ID_REGISTRO,

       PEC_ID_PEDIDO_CLIENTE,

       PRD_ID_PRODUCTO,

       PR_PRODUCTO,

       UNM_ID_UNIDAD_MEDIDA,

       CA_PRODUCTO_ORIGINAL,

       FE_PEDIDO,

       PC_DESCUENTO,

       NU_RENGLON,

       CTV_ID_ESTADO_PEDIDO_PRODUCTO,

       TX_PRODUCTO,

       LOP_ID_LOTE_PRODUCTO,

       INE_ID_ALMACEN,

       UBA_ID_UBICACION_ALMACEN,

       ORG_ID_PROPIETARIO_EXISTENCIA,

       PC_ALICUOTA_IVA

       ) VALUES 

       (

       f00_id_registro,             --ID_REGISTRO

       :BLOQUE_DET.PEC_ID_PEDIDO_CLIENTE,      --PEC_ID_PEDIDO_CLIENTE (ID_REGISTRO:MAESTRO)

       :BLOQUE.PRD_ID_PRODUCTO,         -- PRD_ID_PRODUCTO

       v_det_pr_producto,            --PR_PRODUCTO

       :BLOQUE.UNM_ID_UNIDAD_MED_INVENTARIO,  --UNM_ID_UNIDAD_MEDIDA

       v_det_ca_producto_original,       --CA_PRODUCTO_ORIGINAL

       SYSDATE,                 --FE_PEDIDO

       0,                    --PC_DESCUENTO

       NULL,                  --NU_RENGLON

       NULL,                  --CTV_ID_ESTADO_PEDIDO_PRODUCTO

       :BLOQUE.NB_PRODUCTO,           --TX_PRODUCTO

       v_det_lop_id_lote_producto,       --LOP_ID_LOTE_PRODUCTO

       :BLOQUE.ID_INSTALACION_EQUIPO,      --INE_ID_ALMACEN

       :BLOQUE.ID_UBA_ALMACEN,         --UBA_ID_UBICACION_ALMACEN

       NULL,                  --ORG_ID_PROPIETARIO_EXISTENCIA

       sk04_gestiona_alicuota_prod.f_obtiene_alicuota_pdc(:BLOQUE.PRD_ID_PRODUCTO,'IVA'), --PC_ALICUOTA_IVA

       );

   v_mn_total_lotes := v_mn_total_lotes+v_ca_del_lote*nvl(v_arr_lote(i).mn_costo,0);

   exit when v_ca_requerida = 0;

  end loop;

  --Confirmar que el monto total no supera al patrón

  select  

     rtrim(d.co_partida_presupuestaria) codpre

  into 

     v_co_partida_presupuestaria

  from  

     s03_producto b,

     s21_entidad_partida_presup c,

     s21_partida_presupuestaria d

  where  

     c.pap_id_partida_presupuestaria = d.id_registro 

     and  c.id_referencia      = b.id_registro 

     and  b.id_registro       = :BLOQUE.PRD_ID_PRODUCTO;

  v_co_presupuestario := rpad (:BLOQUE_DET.CODCAT||''||v_co_partida_presupuestaria,32,' ');

  v_resultado_partida := k00_asop_apoyo.f_valida_patron(

              BLOQUE_DET.CODCRE,

              BLOQUE_DET.PERLOT,

              v_mn_total_lotes,

              v_co_presupuestario

              );

  IF NOT v_resultado_partida THEN

   P_MENSAJE('El monto supera la partida');

   rollback;

  ELSE

    --Genera plan de entrega

    p_generar_plan_entrega(:BLOQUE_DET.PEC_ID_PEDIDO);

    --Orden de despacho

    sk05_gestiona_orden_despacho.p_crea_ode_desde_pec(

      :BLOQUE_DET.PEC_ID_PEDIDO,

      'S',

      'S',

      'ODI',

      v_nu_pedido);

    --Registra orden SIGA (Maestro)

    INSERT INTO SASOP_CAORDENI

    (

       ordeni,

       fecord,

       codpro,

       codalm,

       codfin,

       codlot,

       desord,

       monord,

       dtoord,

       staord,

       refcom,

       afepre,

       fecanu,

       codprd,

       codcon,

       tipmon,

       valmon,

       codcre,

       numcom,

       percre,

       ordcer,

       afepat,

       aplint,

       desanu,

       tipint,

       conliq,

       devord,

       numcomdev,

       feccomdev,

       refmov,

       fechainc,

       id_registro

    )

 values

    (

       v_nu_pedido             --ordeni  

       ,SYSDATE              --fecord

       ,rpad(:BLOQUE_DET.CODPRO,10,' ')  --codpro

       ,:BLOQUE.INE_CO_ALMACEN       --codalm

       ,:BLOQUE_DET.CODFIN         --codfin

       ,:BLOQUE_DET.CODLOT         --codlot

       ,'Generada automaticamente'     --desord

       ,:control2.v_mn_total_productos   --monord

       ,0                 --dtoord

       ,'A'                --staord

       ,null                --refcom 

       ,'N'                --afepre

       ,null                --fecanu

       ,:pec.codprd            --codprd

       ,null                --codcon

       ,'2 '                --tipmon

       ,1                 --valmon

       ,:pec.codcre            --codcre

       ,NULL                --numcom

       ,:BLOQUE_DET.PERLOT         --percre

       ,'N'        

       ,'S'

       ,null

       ,null

       ,'I'

       ,null

       ,null

       ,null

       ,null

       ,null

       ,sysdate

       ,:BLOQUE_DET.PEC_ID_PEDIDO

    );

    --Registra orden SIGA (Detalle)

    INSERT INTO S_ASOP_CAARTOEI

       SELECT  

           B.NU_PEDIDO,              -- ordeni

           C.CO_PRODUCTO,             -- codart

           :BLOQUE_DET.CODCAT,          -- codcat

           A.CA_PRODUCTO_ORIGINAL,        -- canord

           0,                   -- canaju

           0,                   -- canrec

           0,                   -- candev

           A.CA_PRODUCTO_ORIGINAL,        -- cantot 

           A.PR_PRODUCTO,             -- preart

           A.PR_PRODUCTO,             -- cosart AQUI BUSCAR EL COSTO

           0,                   -- dtoart

           NULL,                 -- codrgo

           0,                   -- rgoart

           A.CA_PRODUCTO_ORIGINAL*A.PR_PRODUCTO, -- totart

           NULL,                 -- fecent

           NULL,                 -- desart         

           'N',                  -- artcon 

           'N',                  -- conpor

           0,                   -- MONAJU

           0,                   -- rgocos

           G.NU_LOTE_PRODUCTO,          -- numlot

           NULL,                 -- nronot

           0,                   -- canpre 

           H.CO_INSTALACION_EQUIPO,        -- codalm

           NULL,                 -- numlot_id

           NULL                  -- id_registro

       FROM  

           S05_PEDIDO_CLIENTE_PRODUCTO A ,

           S05_PEDIDO_CLIENTE B,

           S03_PRODUCTO C,

           S03_LOTE_PRODUCTO G, 

           S03_INSTALACION_EQUIPO H

       WHERE  

           A.pec_id_pedido_cliente=B.ID_REGISTRO 

           AND C.ID_REGISTRO=A.PRD_ID_PRODUCTO

           AND G.ID_REGISTRO=A.LOP_ID_LOTE_PRODUCTO

           AND H.ID_REGISTRO=A.INE_ID_ALMACEN

           and b.id_registro =:BLOQUE_DET.PEC_ID_PEDIDO;

    --Registra resumen orden

    INSERT INTO S_ASOP_CAresordeni

       SELECT  

           A.ORDENI,   --ordeni

           B.NB_PRODUCTO, --desres

           NULL,     --codartpro

           SUM(A.CANORD), --canord

           SUM(A.CANAJU), --canaju

           SUM(A.CANREC), --canrec

           SUM(A.CANTOT), --cantot

           A.COSART,   --costo

           SUM(A.RGOART), --rgoart

           SUM(A.TOTART), --totart

           A.CODART    --codart

       FROM  

           S_ASOP_CAARTOEI A,

           S03_PRODUCTO B 

       WHERE  

           A.CODART   =B.CO_PRODUCTO 

           AND A.ORDENI =v_nu_pedido

       GROUP BY 

            A.ORDENI,

            B.NB_PRODUCTO,

            A.COSART,

            A.CODART;

    --Reserva inventario

    sk08_gestiona_reserva_inv.p_genera_riv_desde_pec(

      :BLOQUE_DET.PEC_ID_PEDIDO,

      ID_REGISTRO (Tabla de procesos, la pantalla actual),

      'N',

      p_tx_mensaje

    );

    

    P_MENSAJE(p_tx_mensaje);

    --evaluar el mensaje

    --si todo correcto COMMIT;

    --sino ROLLBACK;

  END IF;

END;


--Generador de plan de entrega

CREATE PROCEDURE P_GENERAR_PLAN_ENTREGA (p_id_pedido number) AS

    cursor c_aso is

       select 

           aso.ors_id_sucursal

           ,nvl(ors.tx_direccion_ubicacion,org.tx_direccion_ubicacion) tx_direccion_ubicacion

           ,nvl(ors.nu_telefono_principal,org.nu_telefono_principal)  nu_telefono_principal

           ,pec.fe_emision

       from  

           s05_pedido_cliente      pec

           ,s06_asignacion_organizacion aso

           ,s00_organizacion_r     org

           ,s03_organizacion_sucursal_r ors

       where  

           pec.id_registro       = p_id_pedido

           and aso.org_id_organizacion = pec.org_id_cliente

           and aso.id_referencia    = pec.per_id_vendedor

           and org.id_registro     = aso.org_id_organizacion

           and ors.id_registro   (+) = aso.ors_id_sucursal

       order by 

           ors.co_sucursal;

       r_aso          c_aso%rowtype;

       v_contador        number;

       v_tx_direccion_ubicacion s05_pedido_cliente_entrega.tx_direccion_entrega%type;

       v_nu_telefono_principal s05_pedido_cliente_entrega.nu_telefono_principal%type;

       v_fe_emision       date;

begin

   for r_pcp in (select pcp.* from s05_pedido_cliente_producto pcp where pcp.pec_id_pedido_cliente = p_id_pedido) 

   loop

     select count(*)

      into v_contador

      from s05_pedido_cliente_entrega

      where pcp_id_pedido_producto = r_pcp.id_registro;

     if v_contador = 0 then

      open c_aso;

      fetch c_aso into r_aso;

      close c_aso;

      if r_aso.tx_direccion_ubicacion is null then

        select 

           org.tx_direccion_ubicacion

           ,org.nu_telefono_principal

           ,pec.fe_emision

        into  

           v_tx_direccion_ubicacion

           ,v_nu_telefono_principal

           ,v_fe_emision

        from  

           s05_pedido_cliente pec

           ,s00_organizacion_r org

        where  

           pec.id_registro   = p_id_pedido

           and org.id_registro = pec.org_id_cliente;

      else

        v_tx_direccion_ubicacion := r_aso.tx_direccion_ubicacion;

        v_nu_telefono_principal := r_aso.nu_telefono_principal;

        v_fe_emision    := r_aso.fe_emision;

      end if;

      if v_fe_emision < trunc(sysdate) then

        v_fe_emision := trunc(sysdate);

      end if;

      insert into s05_pedido_cliente_entrega

      (

          id_registro

          ,pcp_id_pedido_producto

          ,ca_producto

          ,ors_id_sucursal

          ,tx_direccion_entrega

          ,nu_telefono_principal

          ,fe_requerida_entrega

          ,fe_estimada_entrega

      )

      values

      (

         sf00_id_registro

         ,r_pcp.id_registro

         ,r_pcp.ca_producto_original

         ,r_aso.ors_id_sucursal

         ,v_tx_direccion_ubicacion

         ,v_nu_telefono_principal

         ,v_fe_emision

         ,v_fe_emision

      );

    end if;

   end loop;

end;    

END;

Report Page