Está en la página 1de 7

Introduccin a la Ingeniera del Software y a los Sistemas de Informacin

Gestin de nminas
diciembre 2011

Contexto del problema

Una empresa ha decidido desarrollar un sistema de informacin cuyo objetivo principal es la


gestin de las nminas de sus empleados. Iniciado el estudio del dominio del problema, de las
necesidades de negocio y de la situacin actual y realizadas varias entrevistas, se ha desarrollado
un primer borrador del siguiente glosario de trminos y de los siguientes requisitos que debe
cumplir el sistema a desarrollar.

Glosario de trminos (por orden alfabtico)

Categora: cada uno de los perfiles profesionales fijados en el convenio colectivo de la


empresa. A cada categora le corresponde un salario base. Todos los empleados de la empresa
pertenecen a alguna categora, aunque esa adscripcin puede cambiar a lo largo del tiempo.

Complemento personal: cantidad acordada individualmente entre cada empleado y la empresa


que se incluye como parte de la nmina. Puede variar a lo largo del tiempo.

Convenio colectivo: acuerdo peridico entre la empresa y los trabajadores por el que se
establecen, entre otras cuestiones, las cantidades de los salarios base correspondientes a las
categoras.

Empleado: persona contratada alguna vez por la empresa.

Grupo de trabajo: unidad organizativa de la empresa compuesta por un grupo de empleados,


uno de los cuales es el jefe del grupo de trabajo y el resto, los subordinados.

Nmina: retribucin devengada mensualmente por la empresa a cada empleado en funcin de


su categora y de su complemento personal.

Salario base: cantidad correspondiente a una categora que se abona en las nminas de los
empleados. Su importe vara en funcin de los acuerdos alcanzados en los convenios
colectivos.

Requisitos de informacin

RI-001 Informacin sobre categoras - El sistema deber almacenar la informacin


correspondiente a las categoras profesionales por las que puede pasar un empleado de la
empresa. En concreto: nombre de la categora y salario base correspondiente actualmente a la
categora.

RI-002 Informacin sobre empleados - El sistema deber almacenar la informacin


correspondiente a los empleados que trabajan o han trabajado en la empresa. En concreto:
dni, nombre, apellidos, domicilio, poblacin, cdigo postal, fecha de alta en la empresa, fecha
de baja en la empresa (si ya no trabaja en la empresa) y la categora y el complemento salarial
en vigor. Tambin se deber conocer el jefe del empleado (si lo tuviera) y los subordinados a
su cargo (si los tuviera).

Pgina 1 de 7
Introduccin a la Ingeniera del Software y a los Sistemas de Informacin

Gestin de nminas
diciembre 2011

RI-003 Informacin sobre nminas - El sistema deber almacenar la informacin


correspondiente a las nminas emitidas de cada empleado. En concreto: mes y ao
correspondiente a la nmina y el salario abonado, especificando el salario base, la categora y
el complemento personal vigentes en el mes en el que se emite la nmina.

Requisitos de reglas de negocio

RN-001 Jefes y subordinados - El sistema deber respetar la siguiente regla de negocio: un jefe
tiene cmo mximo cinco empleados bajo su supervisin.

RN-002 Bajas en la empresa - El sistema deber respetar la siguiente regla de negocio: para
que se pueda dar de baja un empleado en la empresa la fecha de baja debe ser, como mnimo,
un da posterior a la fecha del alta.

Requisitos funcionales

RF-001 Generacin mensual de la nmina El sistema deber generar automticamente la


nmina mensual para todos los empleados en funcin de su categora y complemento salarial
personal.

RF-002 Salario actual El sistema deber ser capaz de calcular automticamente el salario
actual de un empleado dado, sumando para ello el salario base de su categora actual y su
complemento personal en vigor.

Ejercicios

1. Teniendo en cuenta el enunciado anterior, elabore un modelo conceptual usando tantos


diagramas de clases UML como considere necesario.

2. Plantee un posible escenario con varios empleados, categoras y nminas. Elabore el diagrama
de objetos correspondiente al escenario.

3. Transforme el modelo conceptual desarrollado en el punto anterior en un esquema relacional.

4. Genere un esquema SQL para ORACLE correspondiente a los requisitos y al esquema


conceptual con los artefactos que considere necesarios: triggers, secuencias, funciones,
procedimientos, etc.

Pgina 2 de 7
Introduccin a la Ingeniera del Software y a los Sistemas de Informacin

Gestin de nminas
diciembre 2011

Solucin (modelo conceptual)

c l ass G est i n de nm i nas

subordinado
0..5

di ri geA Em pl eado
C at egor a
dni t i ene
nombre nombre
jefe apellidos * 1 salarioBase
0..1 domicilio
poblacin
cdigoPostal 1
fechaAlta
fechaBaja [0..1]
complemento
{A l m enos un d a de al t a:
la fecha de baja (si existe)
debe ser al menos un da
posterior a la de alta.}
*
dev engadaC om o
Nm i na

mes *
ao
salarioBase
complemento

Figura 1: Modelo conceptual

Solucin (escenario)

n1: Nmina e2: Empleado


mes = noviembre dni = 23.456.789
ao = 2011 c1: Categora
tiene nombre = Joseph
salarioBase = 1.100 apellidos = Ingls Ingls
complemento = 600 nombre = Traductor
salarioBase = 1.200 domicilio = c/ Vieja, 13
poblacin = Sevilla
cdigoPostal = 41092
fechaAlta = 1/12/2011
devengadaComo c2: Categora complemento = 800

nombre = Administrativo devengadaComo


salarioBase = 1.100

e1: Empleado

dni = 12.345.678 tiene c3: Categora


nombre = Juan n3: Nmina
nombre = Contable
apellidos = Espaol Espaol
salarioBase = 1.500 mes = diciembre
domicilio = c/ Nueva, 4
poblacin = Sevilla ao = 2011
cdigoPostal = 41092 salarioBase = 1.200
fechaAlta = 1/1/2008 complemento = 800
devengadaComo
complemento = 600

n2: Nmina

mes = diciembre
ao = 2011
salarioBase = 1.500
complemento = 600

Figura 2: Escenario con dos empleados en activo, uno de los cules ha cambiado de categora entre noviembre
y diciembre de 2011

Pgina 3 de 7
Introduccin a la Ingeniera del Software y a los Sistemas de Informacin

Gestin de nminas
diciembre 2011

Solucin (modelo relacional)

Figura 3: Modelo relacional

Solucin (SQL Oracle)

/*
-----------------------------------------------------------------------------
Archivo: Gestin de nminas.sql
Contenido: Esquema Oracle del boletn de IISSI
Fecha: 12/12/2011
Autor: Carlos Arvalo
Versin: 1.0
-----------------------------------------------------------------------------
*/

/*
-----------------------------------------------------------------------------
ltima actualizacin: 16/12/2011-20/12/2011 (Amador Durn)
Revisin y pequeos cambios.
-----------------------------------------------------------------------------
*/

/* Borrado de tablas por orden jerrquico */

drop table Nominas;


drop table Empleados;
drop table Categorias;

Pgina 4 de 7
Introduccin a la Ingeniera del Software y a los Sistemas de Informacin

Gestin de nminas
diciembre 2011

/* Tabla de Categoras */

create table Categorias (


id smallint primary key,
nombre varchar(50) not null,
salarioBase number(6,2) not null
);

/* Tabla de Empleados */

create table Empleados (


dni number(8) primary key,
nombre varchar(20) not null,
apellidos varchar(50) not null,
domicilio varchar(50) not null,
poblacion varchar(50) not null,
codigoPostal number(5) not null,
fechaAlta date not null,
fechaBaja date,
complemento number(6,2) not null,
jefe number(8),
categoria smallint not null,
foreign key(jefe) references Empleados,
foreign key(categoria) references Categorias
);

/* Tabla de Nminas */

create table Nominas (


dni number(8),
mes number(2) check( mes between 1 and 12 ),
anyo number(4),
categoria smallint not null,
salarioBase number(6,2) not null,
complemento number(6,2) not null,
primary key(dni,mes,anyo),
foreign key(dni) references Empleados,
foreign key(categoria) references Categorias
);

/* Trigger para la restriccin "Al menos un da de alta" */

create or replace trigger AlMenosUnDiaDeAlta


before insert or update of fechaAlta, fechaBaja
on empleados for each row
begin
if ( :new.fechaBaja is not null ) and
( :new.fechaBaja <= :new.fechaAlta ) then
raise_application_error( -20600,
'La fecha de baja (si existe) debe ser al menos un da posterior a la de baja.' );
end if;
end;

/* Trigger para el RN-001 Jefes y subordinados */

create or replace trigger NoMasDe5Subordinados


before insert or update of jefe
on empleados for each row
declare
subordinados integer; -- nmero de empleados subordinados
begin
-- cuenta los subordinados antes de actualizar o insertar
select count(*) into subordinados
from empleados
where jefe = :new.jefe;

-- si ya tiene 5 o ms subordinados...
if ( subordinados >= 5 ) then
raise_application_error( -20601,
'Superado el lmite de subordinados con ' || :new.nombre || ' ' || :new.apellidos );
end if;
end;

Pgina 5 de 7
Introduccin a la Ingeniera del Software y a los Sistemas de Informacin

Gestin de nminas
diciembre 2011

/* Procedimiento para generar las nminas de un mes (RF-001) */

create or replace procedure GenerarNomina( mesNomina number, anyoNomina number ) is


begin
-- comprobar validez de los parmetros
if ( mesNomina < 1 ) or ( mesNomina > 12 ) then
raise_application_error( -20602, 'GenerarNomina: mes invlido' );
end if;

-- insertamos el resultado de la consulta


insert into Nominas( dni, mes, anyo, categoria, salarioBase, complemento )
select e.dni, mesNomina, anyoNomina, e.categoria, c.salarioBase, e.complemento
from empleados e inner join categorias c on ( e.categoria = c.id );
end;

/* Procedimiento para generar un listado de las nminas de un mes con un cursor */

create or replace procedure ListarNomina( mesNomina number, anyoNomina number ) is


cursor c is
select e.dni, e.apellidos, e.nombre as nombreEmp,
c.nombre as nombreCat, n.salarioBase, n.complemento
from ( empleados e inner join categorias c on ( e.categoria = c.id ) )
inner join nominas n on ( e.dni = n.dni )
where n.mes = mesNomina
and n.anyo = anyoNomina
order by nombreCat, e.apellidos, nombreEmp;

fila c%rowtype;
begin
dbms_output.put_line('Listado de nminas de ' || mesNomina || ' de '|| anyoNomina );
dbms_output.put_line(' ');

for fila in c loop


dbms_output.put_line(
rpad( fila.nombreCat, 20 ) ||
rpad( fila.apellidos, 20 ) ||
rpad( fila.nombreEmp, 20 ) ||
rpad( fila.salarioBase, 20 ) ||
rpad( fila.complemento, 20 )
);
end loop;
end ;

/* Funcin para calcular el salario bruto actual de un empleado (RF-002) */

create or replace function SalarioActual ( dniEmpleado number ) return number is


salarioBruto number;
begin
select ( e.complemento + c.salarioBase ) into salarioBruto
from categorias c inner join empleados e on ( c.id = e.categoria )
where e.dni = dniEmpleado;

return salarioBruto;
end;

/* Carga de datos inicial */

create or replace procedure CargarDatos is


mes number;
begin
dbms_output.put_line( 'Cargando base de datos de nminas' );
dbms_output.put_line( '---------------------------------' );

dbms_output.put_line( 'Creando categoras...' );

/* Carga de categoras */
insert into categorias( id, nombre, salarioBase ) values ( 1, 'Programador', 800 );
insert into categorias( id, nombre, salarioBase ) values ( 2, 'Analista', 1200 );
insert into categorias( id, nombre, salarioBase ) values ( 3, 'Jefe de proyecto', 2000 );
insert into categorias( id, nombre, salarioBase ) values ( 4, 'Administrativo', 1000 );
insert into categorias( id, nombre, salarioBase ) values ( 5, 'Traductor', 1100 );

Pgina 6 de 7
Introduccin a la Ingeniera del Software y a los Sistemas de Informacin

Gestin de nminas
diciembre 2011

dbms_output.put_line( 'Creando empleados...' );

/* Carga de empleados */
insert into empleados( dni, nombre, apellidos, domicilio, poblacion, codigoPostal, fechaAlta,
complemento, categoria, jefe )
values ( 12345678, 'Juan', 'Espaol Espaol', 'c/ Nueva, 4', 'Sevilla', 41092,
to_date('1/1/2008','dd/mm/yyyy'), 1000, 3, null );

insert into empleados( dni, nombre, apellidos, domicilio, poblacion, codigoPostal, fechaAlta,
complemento, categoria, jefe )
values ( 23456789, 'Joseph', 'Ingls Ingls', 'c/ Vieja, 13', 'Sevilla', 41092,
to_date('1/12/2011','dd/mm/yyyy'), 800, 5, 12345678 );

insert into empleados( dni, nombre, apellidos, domicilio, poblacion, codigoPostal, fechaAlta,
complemento, categoria, jefe )
values ( 34567890, 'Antonio', 'Francs Francs', 'c/ Cuesta, 10', 'Sevilla', 41092,
to_date('1/10/2010','dd/mm/yyyy'), 300, 1, 34567890 );

insert into empleados( dni, nombre, apellidos, domicilio, poblacion, codigoPostal, fechaAlta,
complemento, categoria, jefe )
values ( 45678901, 'Francisco', 'Portugus Portugus', 'c/ Valle, 7', 'Sevilla', 41092,
to_date('1/9/2008','dd/mm/yyyy'), 500, 2, 34567890 );

insert into empleados( dni, nombre, apellidos, domicilio, poblacion, codigoPostal, fechaAlta,
complemento, categoria, jefe )
values ( 56789012, 'ngela', 'Alemana Alemana', 'c/ Arriba, 1', 'Sevilla', 41092,
to_date('1/9/2011','dd/mm/yyyy'), 400, 4, 34567890 );

insert into empleados( dni, nombre, apellidos, domicilio, poblacion, codigoPostal, fechaAlta,
complemento, categoria, jefe )
values ( 67890123, 'Sarkozy', 'Francs Francs', 'c/ Abajo, 2', 'Sevilla', 41092,
to_date('1/4/2009','dd/mm/yyyy'), 200, 1, 34567890 );

insert into empleados( dni, nombre, apellidos, domicilio, poblacion, codigoPostal, fechaAlta,
complemento, categoria, jefe )
values ( 78901234, 'Rajoy', 'Gallego Gallego', 'c/ Compostela, 23', 'Sevilla', 41092,
to_date('1/5/2009','dd/mm/yyyy'), 600, 4, 34567890 );

dbms_output.put_line( 'Generando nminas de 2011...' );

/* Carga de nminas de 2011 */


for mes in 1..12 loop
GenerarNomina( mes, 2011 );
end loop;

commit;
end;

execute CargarDatos;

/* Pruebas sencillas */

/* Listado de categoras */
select id, nombre, salarioBase
from Categorias;

/* Listado de empleados */
select dni, rpad( nombre || ' ' || apellidos, 30 ) as nombre, fechaAlta, complemento
from Empleados;

/* Listado de nminas */
select *
from Nominas;

/* Prueba de la funcin SalariaActual */


select dni, complemento, salarioBase, SalarioActual( dni )
from Empleados e inner join Categorias c on ( e.categoria = c.id );

/* Prueba del trigger NoMasDe5Subordinados (debe fallar) */


insert into empleados( dni, nombre, apellidos, domicilio, poblacion, codigoPostal, fechaAlta,
complemento, categoria, jefe )
values ( 89012345, 'Empleado', 'Fuera Fuera', 'c/ Fundacin, 100', 'Sevilla', 41092,
to_date('1/5/2006','dd/mm/yyyy'), 1200, 3, 34567890 );

Pgina 7 de 7

También podría gustarte