
CREATE OR REPLACE FUNCTION public.sp_crud_ingreso_vehiculo_valorizacion(p_id_ingreso_vehiculo integer, p_aten_establecimiento integer, p_placa character varying, p_ejes integer, p_empresa_transporte character varying, p_procedencia character varying, p_conductor character varying, p_dueno_carga_documento character varying, p_dueno_carga_nombre character varying, p_servicio character varying, p_peso_ingreso character varying, p_peso_salida character varying, p_descuento_por_hielo character varying, p_peso_a_cobrar character varying, p_estadia character varying, p_costo_de_carga character varying, p_permanencia character varying, p_sobre_estadia character varying, p_subtotal character varying, p_igv character varying, p_total character varying, p_direccion character varying, p_email character varying, p_estado character varying, p_id_chofer integer, p_id_ubicacion integer, p_persona_id integer, p_id_caja integer, p_id_usuario integer, p_id_estacionamiento integer, p_moneda_id integer, p_observacion character varying, p_producto character varying[], p_smodulo character varying[])
 RETURNS character varying
 LANGUAGE plpgsql
AS $function$
declare

	v_procedencia varchar;
	v_conductor varchar;
	p_nombre_producto varchar;
	p_peso varchar;
	p_porcentaje integer;
	p_nom_producto varchar[];
	
	v_id_ingreso_vehiculo integer;
	v_id_atencion integer;
	v_id_valoriza integer;
	v_id_valoriza_ integer;
	
	v_modulo integer;
	v_smodulo integer;
	v_precio numeric;
	_nombres character varying;
	_id_valoriza integer;
	_tipo character varying;
	_moneda character varying;
	
	_monto_act numeric;
	v_val_total numeric;

begin 
	
	if p_id_ingreso_vehiculo=0 then 
		
		if (select count(id) from ingreso_vehiculos where placa=p_placa And estado='Adentro')=0 Then
	
			select denominacion into v_procedencia from procedencias where id = p_procedencia::integer;
			select apellido_paterno || ' ' || apellido_materno || ' ' || nombres into v_conductor from personas where id = p_conductor::integer;
				
			if p_id_ubicacion > 0 then
				
				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;
				if p_moneda_id = 1 then _moneda:='SOLES'; else _moneda:='DOLARES'; end if;
				
				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;
				
			End if;
			
			insert into ingreso_vehiculos (
			aten_numero,aten_establecimiento,fecha_ingreso,placa,ejes,empresa_transporte,procedencia,conductor,dueno_carga_documento,
			dueno_carga_nombre,servicio,peso_ingreso,peso_salida,descuento_por_hielo,peso_a_cobrar,estadia,costo_de_carga,
			permanencia,sobre_estadia,subtotal,igv,total,direccion,email,estado,id_chofer,id_ubicacion,persona_id,id_caja,
			id_usuario,id_estacionamiento,created_at, id_moneda)
			values (
			v_id_atencion,p_aten_establecimiento,now(),p_placa,p_ejes,p_empresa_transporte,v_procedencia,v_conductor,p_dueno_carga_documento,
			p_dueno_carga_nombre,p_servicio,p_peso_ingreso,p_peso_salida,p_descuento_por_hielo,p_peso_a_cobrar,p_estadia,p_costo_de_carga,
			p_permanencia,p_sobre_estadia,p_subtotal,p_igv,p_total,p_direccion,p_email,p_estado,p_id_chofer,p_id_ubicacion,p_persona_id,p_id_caja,
			p_id_usuario,p_id_estacionamiento,now(),p_moneda_id) RETURNING id into v_id_ingreso_vehiculo;
		
		else
			
			select id into v_id_ingreso_vehiculo from ingreso_vehiculos where placa=p_placa And estado='Adentro' order by 1 desc limit 1;
			
			select (case when v.val_codigo=v.id then v.id else v.val_codigo end),v.id into v_id_valoriza,v_id_valoriza_
			from ingreso_vehiculos iv 
			inner join ind_atenciones ia on iv.aten_establecimiento=ia.aten_establecimiento And iv.aten_numero=ia.aten_numero
			inner join valorizaciones v on v.val_estab=ia.aten_establecimiento and v.val_aten_codigo=ia.aten_numero
			Where iv.id=v_id_ingreso_vehiculo limit 1;
		
		End if;
	
	else
	
		v_id_ingreso_vehiculo := p_id_ingreso_vehiculo;
	
		update ingreso_vehiculos set
			estado = p_estado,fecha_salida = now(),updated_at = now(),peso_salida = p_peso_salida,descuento_por_hielo = p_descuento_por_hielo,
			peso_a_cobrar = p_peso_a_cobrar,estadia = p_estadia,costo_de_carga = p_costo_de_carga,permanencia = p_permanencia,
			sobre_estadia = p_sobre_estadia,subtotal = p_subtotal,igv = p_igv,total = p_total,id_caja=p_id_caja, id_usuario=p_id_usuario,id_moneda= p_moneda_id
		where id = v_id_ingreso_vehiculo;
	
		--v_id_valoriza
		
		/*
		select v.id into v_id_valoriza
		from ingreso_vehiculos iv 
		inner join ind_atenciones ia on iv.aten_establecimiento=ia.aten_establecimiento And iv.aten_numero=ia.aten_numero
		inner join valorizaciones v on v.val_estab=ia.aten_establecimiento and v.val_aten_codigo=ia.aten_numero
		Where iv.id=v_id_ingreso_vehiculo limit 1;
		*/
	
		select (case when v.val_codigo=v.id then v.id else v.val_codigo end),v.id into v_id_valoriza,v_id_valoriza_
		from ingreso_vehiculos iv 
		inner join ind_atenciones ia on iv.aten_establecimiento=ia.aten_establecimiento And iv.aten_numero=ia.aten_numero
		inner join valorizaciones v on v.val_estab=ia.aten_establecimiento and v.val_aten_codigo=ia.aten_numero
		Where iv.id=v_id_ingreso_vehiculo limit 1;
		
	end if;
	
	if array_length(p_producto, 1)>0 then 
		for i in array_lower(p_producto, 1) .. array_upper(p_producto,1) loop 
			p_nombre_producto := p_producto[i][1];
			p_peso := p_producto[i][2];
			p_porcentaje := p_producto[i][3];
			p_nom_producto[i] = p_nombre_producto;

			if(select count(1) from producto_cargas where ingreso_vehiculos_id=v_id_ingreso_vehiculo And producto=p_nombre_producto)>0 Then
				update producto_cargas set 
				peso = to_number(p_peso, '9999999999.99'),
				porcentaje = p_porcentaje
				Where ingreso_vehiculos_id=v_id_ingreso_vehiculo And producto=p_nombre_producto;
			Else
				insert into producto_cargas(ingreso_vehiculos_id,producto,peso,created_at,porcentaje)
				values (v_id_ingreso_vehiculo,p_nombre_producto,to_number(p_peso, '9999999999.99'),now(),p_porcentaje);
			End If;
		
		end loop;
	end if;

	Delete From producto_cargas where ingreso_vehiculos_id=v_id_ingreso_vehiculo and Not producto = Any(p_nom_producto);

	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 valorizaciones set 
					val_subtotal= (val_total + v_precio)/1.18, 
					val_impuesto = ((val_total + v_precio)/1.18) * 0.18, 
					val_total = (val_total + v_precio)
					where val_codigo = v_id_valoriza and val_estab = p_aten_establecimiento;
				End If;
				*/
				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;
					/*
					update valorizaciones set 
					val_subtotal= (val_total - _monto_act)/1.18, 
					val_impuesto = ((val_total - _monto_act)/1.18) * 0.18, 
					val_total = (val_total - _monto_act)
					where val_codigo = v_id_valoriza and val_estab = p_aten_establecimiento;
					*/
				end if;
				
			end if;		
		
		end loop;
	end if;
	
	/*
	If modulo=2 And smodulo=23 Then
	else
		update valorizaciones set 
		val_subtotal= (val_total + precio)/1.18, 
		val_impuesto = ((val_total + precio)/1.18) * 0.18, 
		val_total = (val_total + precio)
		where val_codigo = v_id_valoriza and val_estab = p_aten_establecimiento;
	End If;
	*/

	/*
	update valorizaciones set 
	val_subtotal= (val_total + precio)/1.18, 
	val_impuesto = ((val_total + precio)/1.18) * 0.18, 
	val_total = (val_total + precio)
	where val_codigo = v_id_valoriza and val_estab = p_aten_establecimiento;
	*/
	
	
	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;
	
	--return v_id_ingreso_vehiculo;
	
	if p_id_ingreso_vehiculo!=0 then v_id_valoriza:=v_id_valoriza_; end if;

	return v_id_valoriza;

	
end;

$function$
;

