
CREATE OR REPLACE FUNCTION public.sp_crud_ind_atencion_valoriza_v2(
p_aten_establecimiento integer, 
p_persona_id integer,
p_id_ubicacion integer,
p_smodulo character varying[]
/*
modulo integer, 
smodulo integer, 
precio numeric, 
observacion character varying
*/
)
 RETURNS character varying
 LANGUAGE plpgsql
AS $function$



declare
	_id_atencion integer;
	_plan integer;
	idp integer;
	_id_valoriza integer;
	_nombres character varying;
	_modulod character varying;
	_smodulod character varying;
	
	v_id_atencion integer;
	v_id_valoriza integer;

	v_modulo integer;
	v_smodulo integer;
	v_precio numeric;
	
	_tipo character varying;
	_moneda character varying;
	p_moneda_id integer;

	_monto_act numeric;
	v_val_total numeric;
	p_observacion character varying;

begin

	if p_id_ubicacion > 0 Then
		
		p_observacion := 'atención y valorización';
	
		Insert Into ind_atenciones(aten_establecimiento, aten_persona, aten_fecha, aten_tipo, aten_ubicacion, aten_ultimo, aten_proviene, aten_cerrado, aten_eliminado, aten_plan, aten_lugar, aten_hora,aten_hora_ini)
		Values (p_aten_establecimiento, p_persona_id, now(), 'P', p_id_ubicacion, 'S', '', 'A', 'N',  0, '', now(), now()) RETURNING id into v_id_atencion;
		
		update ind_atenciones set aten_numero=id where id=v_id_atencion;
		
		if array_length(p_smodulo, 1)>0 then 
			for i in array_lower(p_smodulo, 1) .. array_upper(p_smodulo, 1) loop 
				v_modulo := p_smodulo[i][1];
				v_smodulo := p_smodulo[i][2];
				v_precio := p_smodulo[i][3];
			
				if (select count(*) from ind_atencion_modulos where atenmod_establecimiento = p_aten_establecimiento 
					and atenmod_atencion = v_id_atencion and atenmod_modulo = v_modulo) = 0 then

					insert into ind_atencion_modulos(atenmod_atencion, atenmod_establecimiento, atenmod_modulo, atenmod_orden, atenmod_resultado, atenmod_avance, atenmod_eliminado)
					Values(v_id_atencion, p_aten_establecimiento, v_modulo, 1, 'PENDIENTE', '', 'N');
					
				end if;
		
				if (select count(*) from ind_atencion_smodulos where atensmod_establecimiento = p_aten_establecimiento 
					and atensmod_atencion = v_id_atencion and atensmod_modulo = v_modulo and atensmod_smodulo = v_smodulo) = 0 then
		
					insert into ind_atencion_smodulos(atensmod_atencion, atensmod_establecimiento, atensmod_modulo, atensmod_smodulo, atensmod_orden, atensmod_resultado, atensmod_eliminado)
					Values(v_id_atencion, p_aten_establecimiento, v_modulo, v_smodulo, 1, 'PENDIENTE', 'N');
					
				end if;

			end loop;
		end if;
	
		select (apellido_paterno ||' '|| apellido_materno ||' '|| nombres) into _nombres from personas where id = p_persona_id;
			
		if p_persona_id = 0 then _tipo:='E'; else _tipo:='P'; end if;
		
		p_moneda_id = 1;
		_moneda:='SOLES'; 
	
		Insert Into valorizaciones (val_estab, val_fecha, val_tipo, val_persona,
		val_pac_nombre, /*val_subtotal, val_subtotal_plan, val_impuesto,
		val_total,*/ val_moneda_id, val_moneda, val_fact_impuesto, val_asume,
		val_emp_asume, val_descuento, val_observaciones, val_ubicacion,
		val_plan, val_aten_estab, val_aten_codigo, val_liquidado, val_facturado,
		val_estado_atencion, val_cod_contable, val_cancelado, val_anulado, val_costo, val_margen,
		val_costo_plan, val_margen_plan, val_eliminado)
		Values(p_aten_establecimiento, now(), _tipo, p_persona_id,
		_nombres, /*precio/1.18, precio, (precio/1.18) * 0.18,
		precio,*/ p_moneda_id, _moneda, 18, 'E',
		p_id_ubicacion, 0, '', p_id_ubicacion,
		0, p_aten_establecimiento, v_id_atencion,'N', 'N',
		'G', '00001', 'N', 'N', 0, 0,
		0, 0, 'N')  RETURNING id into v_id_valoriza;
	
		update valorizaciones set val_codigo=id where id=v_id_valoriza;
		
		if array_length(p_smodulo, 1)>0 then 
			for i in array_lower(p_smodulo, 1) .. array_upper(p_smodulo, 1) loop 
				v_modulo := p_smodulo[i][1];
				v_smodulo := p_smodulo[i][2];
				v_precio := p_smodulo[i][3];
			
				if (select count(*) from val_atencion_modulos where vm_vestab = p_aten_establecimiento and vm_vnumero = v_id_valoriza and vm_modulo = v_modulo) = 0 then
			
					insert into val_atencion_modulos(vm_vnumero, vm_vestab, vm_modulo, vm_plan, vm_modulod, vm_descripcion,
					vm_costo, vm_orden, vm_estado, vm_eliminado,  vm_opcional,
					vm_costo_plan, vm_precio, vm_precio_plan, vm_margen, vm_margen_plan)
					Values(v_id_valoriza, p_aten_establecimiento, v_modulo, 0, (select mod_denominacion from modulos where mod_codigo = v_modulo), '',
					v_precio, 1, 'A', 'N', 'N',
					0, v_precio, 0, 0, 0);
				else
					If v_modulo=2 And v_smodulo=23 Then
					else
						update val_atencion_modulos set 
						vm_costo = (v_precio + vm_costo), 
						vm_precio = (v_precio + vm_costo)
						where vm_vestab = p_aten_establecimiento and vm_vnumero = v_id_valoriza and vm_modulo = v_modulo;
					end if;
						
				end if;
		
				if (select count(*) from val_atencion_smodulos where vsm_vestab = p_aten_establecimiento and vsm_vnumero = v_id_valoriza and vsm_modulo = v_modulo and vsm_smodulo = v_smodulo) = 0 then
					
					insert into val_atencion_smodulos(vsm_vnumero, vsm_vestab, vsm_modulo, vsm_smodulo, vsm_smodulod,
					vsm_descripcion, vsm_costo, vsm_orden, vsm_estado, vsm_eliminado,
					vsm_opcional, vsm_costo_plan, vsm_precio, vsm_precio_plan,
					vsm_margen, vsm_margen_plan, vsm_facturado, vsm_estado_atencion)
					Values(v_id_valoriza, p_aten_establecimiento, v_modulo, v_smodulo, (select smod_denominacion from sub_modulos where smod_modulo = v_modulo and smod_codigo = v_smodulo),
					p_observacion, v_precio, 1, 'A', 'N',
					'N', 0, v_precio, 0,
					0, 0, 'N', 'G');
					
				else
		
					select vsm_precio into _monto_act from val_atencion_smodulos
					where vsm_vestab = p_aten_establecimiento and vsm_vnumero = v_id_valoriza and vsm_modulo = v_modulo and vsm_smodulo = v_smodulo;
					
					If v_modulo=2 And v_smodulo=23 Then
					else
						update val_atencion_smodulos set 
						vsm_costo=v_precio, 
						vsm_precio=v_precio
						where vsm_vestab = p_aten_establecimiento and vsm_vnumero = v_id_valoriza and vsm_modulo = v_modulo and vsm_smodulo = v_smodulo;
		
						update val_atencion_modulos set 
						vm_costo = (vm_costo - _monto_act), 
						vm_precio = (vm_precio  - _monto_act)
						where vm_vestab = p_aten_establecimiento and vm_vnumero = v_id_valoriza and vm_modulo = v_modulo;
						
					end if;
					
				end if;		
			
			end loop;
		end if;
		
		select sum(vsm_precio) into v_val_total
		from val_atencion_smodulos where vsm_vnumero = v_id_valoriza 
		and vsm_modulo::varchar||vsm_smodulo::varchar!='223';
	
		update valorizaciones set
		val_total = v_val_total,
		val_subtotal= v_val_total/1.18, 
		val_impuesto = (v_val_total/1.18) * 0.18
		where val_codigo = v_id_valoriza and val_estab = p_aten_establecimiento;
		
		idp:=v_id_atencion;
	Else
		idp:=0;
	End if;


	return idp;
	/*
	EXCEPTION
	WHEN OTHERS THEN
        idp:=-1;
	return idp;
	*/
end;
$function$
;
