CREATE OR REPLACE FUNCTION sp_crud_ind_atencion_valoriza_addms(id_atencion integer, establecimiento integer, persona integer, modulo integer, smodulo integer, ubicacion integer, precio numeric, observacion character varying)
  RETURNS character varying AS
$BODY$
declare
	_id_atencion integer;
	_plan integer;
	idp integer;
	_id_valoriza integer;
	_nombres character varying;
	_modulod character varying;
	_smodulod character varying;
	_tipo character varying;
	_monto_act numeric;

begin

	if ubicacion > 0 Then
		if id_atencion = 0 then
			select max(aten_numero) + 1 into _id_atencion from ind_atenciones where aten_establecimiento = establecimiento;

			Insert Into ind_atenciones (aten_numero, 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 (_id_atencion, establecimiento, persona, now(), 'P', ubicacion, 'S', '', 'A', 'N',  0, '', now(), now());
		else
			_id_atencion:=id_atencion;
		end if;

		idp:=_id_atencion;


		if (select count(*) from ind_atencion_modulos where atenmod_establecimiento = establecimiento and atenmod_atencion = _id_atencion and atenmod_modulo = modulo) = 0 then

			insert into ind_atencion_modulos(atenmod_atencion, atenmod_establecimiento, atenmod_modulo, atenmod_orden, atenmod_resultado, atenmod_avance, atenmod_eliminado)
				Values(_id_atencion, establecimiento, modulo, 1, 'PENDIENTE', '', 'N'
				);
			idp:=_id_atencion;
		else
			idp:=-1;
		end if;


		if (select count(*) from ind_atencion_smodulos where atensmod_establecimiento = establecimiento and atensmod_atencion = _id_atencion and atensmod_modulo = modulo and atensmod_smodulo = smodulo) = 0 then

			insert into ind_atencion_smodulos(atensmod_atencion, atensmod_establecimiento, atensmod_modulo, atensmod_smodulo, atensmod_orden, atensmod_resultado, atensmod_eliminado)
				Values(_id_atencion, establecimiento, modulo, smodulo, 1, 'PENDIENTE', 'N'
				);
			idp:=_id_atencion;

		else
			idp:=-1;
		end if;


		select (apellido_paterno ||' '|| apellido_materno ||' '|| nombres) into _nombres from personas where id = persona;

		if id_atencion = 0 then
			select max(val_codigo) + 1 into _id_valoriza from valorizaciones where val_estab = establecimiento;

			if persona = 0 then
				_tipo:='E';
			else
				_tipo:='P';
			end if;

			Insert Into valorizaciones (val_codigo, 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(_id_valoriza, establecimiento, now(), _tipo, persona,
					_nombres, precio/1.18, precio, (precio/1.18) * 0.18,
					precio, 1, 'SOLES', 18, 'E',
					ubicacion, 0, '', ubicacion,
					0, establecimiento, _id_atencion,'N', 'N',
					'G', '00001', 'N', 'N', 0, 0,
					0, 0, 'N'
				);
		else
		
			select val_codigo into _id_valoriza from valorizaciones where val_aten_estab = establecimiento and val_aten_codigo =  _id_atencion;
			
			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 = _id_valoriza and val_estab = establecimiento;
			End If;

		end if;
		idp:=_id_atencion;


		if (select count(*) from val_atencion_modulos where vm_vestab = establecimiento and vm_vnumero = _id_valoriza and vm_modulo = 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(_id_valoriza, establecimiento, modulo, 0, (select mod_denominacion from modulos where mod_codigo = modulo), '',
				precio, 1, 'A', 'N', 'N',
				0, precio, 0, 0, 0
				);
			idp:=_id_atencion;

		else
			If modulo=2 And smodulo=23 Then
			else
				update val_atencion_modulos set vm_costo = (precio + vm_costo), vm_precio = (precio + vm_costo)
					where vm_vestab = establecimiento and vm_vnumero = _id_valoriza and vm_modulo = modulo;
			end if;
				idp:=_id_atencion;
		end if;

		--select (smod_denominacion) into _smodulod from sub_modulos where smod_modulo = modulo and smod_codigo = smodulo;

		if (select count(*) from val_atencion_smodulos where vsm_vestab = establecimiento and vsm_vnumero = _id_valoriza and vsm_modulo = modulo and vsm_smodulo = 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(_id_valoriza, establecimiento, modulo, smodulo, (select smod_denominacion from sub_modulos where smod_modulo = modulo and smod_codigo = smodulo),
				observacion, precio, 1, 'A', 'N',
				'N', 0, precio, 0,
				0, 0, 'N', 'G'
				);
			idp:=_id_atencion;
		else

			select vsm_precio into _monto_act from val_atencion_smodulos
				where vsm_vestab = establecimiento and vsm_vnumero = _id_valoriza and vsm_modulo = modulo and vsm_smodulo = smodulo;
			
			If modulo=2 And smodulo=23 Then
			else
				update val_atencion_smodulos set vsm_costo= precio, vsm_precio = precio
					where vsm_vestab = establecimiento and vsm_vnumero = _id_valoriza and vsm_modulo = modulo and vsm_smodulo = smodulo;

				update val_atencion_modulos set vm_costo = (vm_costo - _monto_act), vm_precio = (vm_precio  - _monto_act)
					where vm_vestab = establecimiento and vm_vnumero = _id_valoriza and vm_modulo = 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 = _id_valoriza and val_estab = establecimiento;
			end if;
			
		end if;


		--idp:=_id_atencion;
	Else
		idp:=0;
	End if;


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

select sp_crud_ind_atencion_valoriza_addms (0,1,1,1,15,1,'10','OBS');
select sp_crud_ind_atencion_valoriza_addms (1,1,1,2,1,1,'10','OBS');
select sp_crud_ind_atencion_valoriza_addms (1,1,1,2,2,1,'10','OBS');
select sp_crud_ind_atencion_valoriza_addms (1,1,1,2,3,1,'10','OBS');

select sp_crud_ind_atencion_valoriza_addms (1,1,1,1,15,1,'20','OBS');
select sp_crud_ind_atencion_valoriza_addms (1,1,1,2,1,1,'20','OBS');
select sp_crud_ind_atencion_valoriza_addms (1,1,1,2,2,1,'20','OBS');
select sp_crud_ind_atencion_valoriza_addms (1,1,1,2,3,1,'20','OBS');


select * from ind_atenciones;
select * from ind_atencion_modulos;
select * from ind_atencion_smodulos;

select * from valorizaciones;
select * from val_atencion_modulos;
select * from val_atencion_smodulos;
*/
/*
delete from ind_atenciones;
delete from ind_atencion_modulos;
delete from ind_atencion_smodulos;
delete from valorizaciones;
delete from val_atencion_modulos;
delete from val_atencion_smodulos;


TRUNCATE TABLE ind_atenciones RESTART IDENTITY;
TRUNCATE TABLE ind_atencion_modulos RESTART IDENTITY;
TRUNCATE TABLE ind_atencion_smodulos RESTART IDENTITY;

TRUNCATE TABLE valorizaciones RESTART IDENTITY;
TRUNCATE TABLE val_atencion_modulos RESTART IDENTITY;
TRUNCATE TABLE val_atencion_smodulos RESTART IDENTITY;

*/

end;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;



