
CREATE OR REPLACE FUNCTION public.sp_crud_ind_atencion_valoriza_automatico(
    establecimiento integer,
    plan integer,
    persona integer,
    ubicacion integer,
    accion character varying,
    fecha character varying)
  RETURNS character varying AS
$BODY$
declare
	_id_atencion integer;
	_plan integer;
	idp integer;
	_id_valoriza integer;
	_nombres character varying;

begin

	Case accion
		When 'ce' then

			if plan > 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, 0, fecha::date, 'E', ubicacion, 'S', '', 'A', 'N',  plan, '', now(), now());

				insert into ind_atencion_modulos(atenmod_atencion, atenmod_establecimiento, atenmod_modulo, atenmod_orden, atenmod_resultado, atenmod_avance, atenmod_eliminado)
					(select _id_atencion, establecimiento, m.pam_modulo, m.pam_orden, 'PENDIENTE', '', 'N'
					from plan_atenciones p Inner Join plan_atencion_modulos m On m.pam_plan = p.id
					where p.id = plan and p.plan_eliminado = 'N' and m.pam_eliminado = 'N'
					);

				insert into ind_atencion_smodulos(atensmod_atencion, atensmod_establecimiento, atensmod_modulo, atensmod_smodulo, atensmod_orden, atensmod_resultado, atensmod_eliminado)
					(select _id_atencion, establecimiento, sm.pasm_modulo, sm.pasm_smodulo, sm.pasm_orden, 'PENDIENTE', 'N'
					from plan_atenciones p
					Inner Join plan_atencion_modulos m On m.pam_plan = p.id Inner Join plan_atencion_smodulos sm On sm.pasm_plan = m.pam_plan and sm.pasm_modulo = m.pam_modulo
					where p.id = plan and p.plan_eliminado = 'N' and m.pam_eliminado = 'N' and sm.pasm_eliminado= 'N'
					);

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

				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)
					(select _id_valoriza, establecimiento, fecha::date, p.plan_tipo, 0,
						'', p.plan_precio * p.cantidad/1.18, p.plan_precio * p.cantidad, (p.plan_precio * p.cantidad/1.18) * 0.18,
						p.plan_precio * p.cantidad, 1, 'SOLES', 18, 'E',
						p.plan_ubicacion, 0, '', p.plan_ubicacion,
						p.id, establecimiento, _id_atencion,'N', 'N',
						'G', '00001', 'N', 'N', p.plan_costo * p.cantidad, p.plan_margen * p.cantidad,
						p.plan_costo * p.cantidad, p.plan_margen * p.cantidad, 'N'
					from plan_atenciones p
					where p.id = plan and p.plan_eliminado = 'N'
					);


				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)
					(select _id_valoriza, establecimiento, m.pam_modulo, m.pam_plan, m.pam_modulod, m.pam_descripcion,
					m.pam_costo * p.cantidad, m.pam_orden, 'A', 'N', m.pam_opcional,
					m.pam_costo * p.cantidad, m.pam_precio  * p.cantidad, m.pam_precio * p.cantidad, m.pam_margen * p.cantidad, m.pam_margen * p.cantidad
					from plan_atenciones p Inner Join plan_atencion_modulos m On m.pam_plan = p.id
					where p.id = plan and p.plan_eliminado = 'N' and m.pam_eliminado = 'N'
					);

				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)
					(select _id_valoriza, establecimiento, sm.pasm_modulo, sm.pasm_smodulo, sm.pasm_smodulod,
					sm.pasm_descripcion, sm.pasm_costo * p.cantidad, sm.pasm_orden, 'A', 'N',
					sm.pasm_opcional, sm.pasm_costo * p.cantidad, sm.pasm_precio * p.cantidad, sm.pasm_precio * p.cantidad,
					sm.pasm_margen * p.cantidad, sm.pasm_margen * p.cantidad, 'N', 'G'
					from plan_atenciones p
					Inner Join plan_atencion_modulos m On m.pam_plan = p.id Inner Join plan_atencion_smodulos sm On sm.pasm_plan = m.pam_plan and sm.pasm_modulo = m.pam_modulo
					where p.id = plan and p.plan_eliminado = 'N' and m.pam_eliminado = 'N' and sm.pasm_eliminado= 'N'
					);
				idp:=_id_atencion;
			Else
				idp:=0;
			End if;
		When 'cp' then

			if plan > 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, fecha::date, 'P', ubicacion, 'S', '', 'A', 'N',  plan, '', now(), now());

				insert into ind_atencion_modulos(atenmod_atencion, atenmod_establecimiento, atenmod_modulo, atenmod_orden, atenmod_resultado, atenmod_avance, atenmod_eliminado)
					(select _id_atencion, establecimiento, m.pam_modulo, m.pam_orden, 'PENDIENTE', '', 'N'
					from plan_atenciones p Inner Join plan_atencion_modulos m On m.pam_plan = p.id
					where p.id = plan and p.plan_eliminado = 'N' and m.pam_eliminado = 'N'
					);

				insert into ind_atencion_smodulos(atensmod_atencion, atensmod_establecimiento, atensmod_modulo, atensmod_smodulo, atensmod_orden, atensmod_resultado, atensmod_eliminado)
					(select _id_atencion, establecimiento, sm.pasm_modulo, sm.pasm_smodulo, sm.pasm_orden, 'PENDIENTE', 'N'
					from plan_atenciones p
					Inner Join plan_atencion_modulos m On m.pam_plan = p.id Inner Join plan_atencion_smodulos sm On sm.pasm_plan = m.pam_plan and sm.pasm_modulo = m.pam_modulo
					where p.id = plan and p.plan_eliminado = 'N' and m.pam_eliminado = 'N' and sm.pasm_eliminado= 'N'
					);

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

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

				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)
					(select _id_valoriza, establecimiento, fecha::date, p.plan_tipo, persona,
						_nombres, (p.plan_precio/1.18), p.plan_precio , (p.plan_precio/1.18)  * 0.18,
						p.plan_precio , 1, 'SOLES', 18, 'E',
						p.plan_ubicacion, 0, '', p.plan_ubicacion,
						p.id, establecimiento, _id_atencion,'N', 'N',
						'G', '00001', 'N', 'N', p.plan_costo , p.plan_margen ,
						p.plan_costo , p.plan_margen , 'N'
					from plan_atenciones p
					where p.id = plan and p.plan_eliminado = 'N'
					);

				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)
					(select _id_valoriza, establecimiento, m.pam_modulo, m.pam_plan, m.pam_modulod, m.pam_descripcion,
					m.pam_costo, m.pam_orden, 'A', 'N', m.pam_opcional,
					m.pam_costo, m.pam_precio, m.pam_precio, m.pam_margen, m.pam_margen
					from plan_atenciones p Inner Join plan_atencion_modulos m On m.pam_plan = p.id
					where p.id = plan and p.plan_eliminado = 'N' and m.pam_eliminado = 'N'
					);

				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)
					(select _id_valoriza, establecimiento, sm.pasm_modulo, sm.pasm_smodulo, sm.pasm_smodulod,
					sm.pasm_descripcion, sm.pasm_costo, sm.pasm_orden, 'A', 'N',
					sm.pasm_opcional, sm.pasm_costo, sm.pasm_precio, sm.pasm_precio,
					sm.pasm_margen, sm.pasm_margen, 'N', 'G'
					from plan_atenciones p
					Inner Join plan_atencion_modulos m On m.pam_plan = p.id Inner Join plan_atencion_smodulos sm On sm.pasm_plan = m.pam_plan and sm.pasm_modulo = m.pam_modulo
					where p.id = plan and p.plan_eliminado = 'N' and m.pam_eliminado = 'N' and sm.pasm_eliminado= 'N'
					);
				idp:=_id_atencion;
			Else
				idp:=0;
			End if;

	End Case;

	return idp;
	/*EXCEPTION
	WHEN OTHERS THEN
        idp:=-1;
	return idp;*/
/*
--select sp_crud_ind_atencion (0,1,0,'',1,'','',2,'ce');
--select sp_crud_ind_atencion_empresa (1,2,1);
--select sp_crud_ind_atencion_valoriza (1,2,1,1,'ce');
--select sp_crud_ind_atencion_valoriza (1,1,1,1,'cp');

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;
ALTER FUNCTION public.sp_crud_ind_atencion_valoriza_automatico(integer, integer, integer, integer, character varying, character varying)
  OWNER TO postgres;
