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;