Está en la página 1de 8

La red de talleres de reparacin de automviles MOVILPERU, con delegaciones en casi todos los departamentos del Per, desea gestionar

las citas que solicitan sus clientes para las revisiones de sus vehculos. Para ello han diseado una base de datos que almacena informacin de sus talleres, que se identifican por un cdigo numrico. Cada taller, que tendr su propio nombre (normalmente la zona donde se encuentra situado), esta situado en un departamento. La base de datos almacena las citas concedidas a sus clientes, identificaos por la matricula del vehiculo, adems de la fecha, hora y taller en la cual se ha concedido la cita. Un mismo vehiculo no podr solicitar cita en un mismo da, ni siquiera en talleres distintos. Para cada cita se almacenara tambin si el cliente asisti o no. Existirn penalizaciones para los clientes que no acudan a sus citas, es decir, el precio de cada revisin ser de $40.00, pero se impondr un corte adicional de $ 10.00 en la prxima revisin si el cliente no acudi a una cita $15.00 si no ha acudido a dos, y $20.00 si no ha acudido a tres o ms. Adems cada taller tendr un nmero de puestos y un tiempo de atencin que determina la simultaneidad con la que puede atender a los clientes. Por ejemplos si el taller MOVILHUANUCO tiene dos puestos y el tiempo de atencin es de 20 minutos, se podrn realizar dos revisiones simultneamente, y las citas se darn en intervalos de 20 minutos Todos los talleres tendrn el mismo horario de atencin al pblico, de lunes a sbado de 9:00 a 17:00 pero cada uno de ellos tendr sus propios das festivos, dependiendo del departamento en la que estn ubicados. Cada taller tendr un intervalo mnimo para dar citas, es decir, un periodo de tiempo comprendido entre la solicitud de la cita y la fecha concedida, dentro del cual no podrn dar citas. Por ejemplo, si un cliente llama a las 9:00 al taller de MOVILHUANUCO, que tiene establecido un intervalo mnimo de 2 horas, no se le podr conceder una cita hasta pasadas esas 2 horas, aunque haya hueco antes. As mismo cada taller tendr un tiempo mximo de cita, transcurrido el cual no podr dar cita a ningn usuario. Por ejemplo, si el taller de MOVILLIMA tiene establecido un tiempo mximo de cita de 2 meses, si no hay hueco entre la llamada del usuario y los 2 meses siguientes, el taller no podr dar cita, instando al cliente a llamar pasados unos das.

1) crear un funcion para determinar si un cliente puede solicitar cita en un taller. Para ello habr que comprobar que el cliente no tenga cita asignada en ningn taller, para un da posterior al actual ms el intervalo mnimo. Es decir, si el cliente tiene cita asociada en el taller 28001 para el da 15/01/09 y hoy es 14/01/09, el cliente puede solicitar cita ya que el intervalo mnimo es de 48 horas (14/01/09+2= 16/01/09<15/01/09) create function solicitarCita (@fecha datetime,@cliente char(4)) returns bit BEGIN declare @cond int declare @Rp bit declare @min int declare @vmax int set @vmax = 0 declare ptr cursor for select talintmin from Taller open ptr fetch next from ptr into @min while(@@fetch_status=0) BEGIN IF(@vmax<@min) BEGIN set @vmax=@min fetch next from ptr into @min END END close ptr deallocate ptr set @fecha = @fecha + @vmax + 1 set @cond = (select count(citfechorconcedida)from Cita Ct join Cliente C on C.clicod=Ct.clicod where citfechorconcedida>@fecha and C.clicod=@cliente and citest='0') if(@cond>0) set @Rp=0 else set @Rp=1 RETURN @Rp END 2) crear un funcion que recibiendo como parmetro el numero de matricula y el cdigo de taller devuelva la cita mas prxima disponible es ese taller p un cdigo de error. Para ello tener en cuenta

a. determinar si se puede dar cita para ese matricula (utilizar la anterior funcion) b. los tiempos mnimos y mximos c. las festividades especificas para cada taller d. El numero de puestos y el tiempo de atencin create function solicitarCitaA (@fecha datetime,@matricula char(4)) returns bit BEGIN declare @cond int declare @Rp bit declare @min int declare @vmax int set @vmax = 0 declare ptr cursor for select talintmin from Taller open ptr fetch next from ptr into @min while(@@fetch_status=0) BEGIN IF(@vmax<@min) BEGIN set @vmax=@min fetch next from ptr into @min END END close ptr deallocate ptr set @fecha = @fecha + @vmax + 1 set @cond = (select count(citfechorconcedida)from Cita Ct join movil C on C.movmatricula=Ct.movmatricula where citfechorconcedida>@fecha and C.movmatricula=@matricula and citest='0') if(@cond>0) set @Rp=0 else set @Rp=1 RETURN @Rp END create function solicitarCitar (@talcod numeric(5),@matricula char(4)) returns datetime begin

declare @cita bit declare @fecha datetime set @fecha=0 set @cita=(select dbo.SolicitarCitaA(c.citfechorconcedida,@matricula) from cita c where c.movmatricula=@matricula) if(@cita=1) begin set @fecha=(select c.citfechoradisponible from cita c where c.movmatricula=@matricula) end return @fecha end 3) Crear un procedimiento almacenado que reciba como parmetro la matricula, la fecha actual y el cdigo de taller y se encargue de asignar una cita a un cliente en caso de que sea posible. Adems deber asignar el importe, teniendo en cuenta las ausencias como se ha comentado anteriormente. create procedure asignacionfechacita @matricula char(6),@fechaact datetime,@codtal numeric(5) as select c.clinom,fechacita=dbo.solicitarcita(@codtal,@matricula),ci.citfechora, precio=(co.cobprecio+co.cobmora)from cita ci join cliente c on c.clicod=ci.clicod join cobranza co on c.clicod=co.clicod where ci.citfechora=@fechaact go 4) Probar el anterior procedimiento realizando las siguientes acciones. a. Solicitar cita para matricula 1234ABC en el taller 28001 solicitndole el 01/02/09 exec asignacionfechacita '1234abc','01/02/09',28001 b. Solicitar cita para matricula 1234BBB en el taller 28001 solicitndole el 01/02/09 exec asignacionfechacita '1234bbb','01/02/09',28001 c. Solicitar cita para matricula 123CCC en el taller 28002 solicitndole el 01/02/09 exec asignacionfechacita '1234ccc','01/02/09',28002 d. Solicitar cita para matricula 1234DDD en el taller 28002 solicitndole el 01/02/09 exec asignacionfechacita '1234ddd','01/02/09',28002 e. Solicitar cita para matricula 1234EEE en el taller 28002 solicitndole el 01/02/09 exec asignacionfechacita '1234eee','01/02/09',28002 f. Actualizar el campo asiste=verdadero para todas las citas excepto la 1234EEE

g. Solicitar cita para matricula 1234EEE en el taller 28002 solicitndole el 01/04/09 exec asignacionfechacita '1234eee','01/04/09',28002 5) Modificar el procedimiento almacenado del apartado 3 para que en caso de que no haya citas disponibles para el taller seleccionado asigne la cita ms prxima de otro taller del mismo departamento. alter procedure asignacionfechacita @matricula char(7),@fechaact datetime,@codtal numeric(5) as while(@@fetch_status=0) begin if(dbo.solicitarcita(@codtal,@matricula)=0) begin set @codtal=@codtal+1 end end select c.clinom,fechacita=dbo.solicitarcita(@codtal,@matricula),ci.citfechora,ci.talcod, precio=(co.cobprecio+co.cobmora)from cita ci join cliente c on c.clicod=ci.clicod join cobranza co on c.clicod=co.clicod where ci.citfechora=@fechaact go 6) Realizar un reporte para ver los ingresos diarios, mensual y anual por departamento Dia create procedure reporteDiario @citfechora datetime as select Taller=t.talnombre, departamento=t.taldep, ingreso=sum(c.cobprecio+c.cobmora), fecha=a.citfechora from taller t join atencion a on a.talcod=t.talcod join cobranza c on a.atecod=c.atecod where a.citfechora=@citfechora group by t.talnombre, t.taldep,a.citfechora order by day(a.citfechora) go execute reporteDiario '13/12/2008' Mes create procedure reporteMes @citfechora datetime as select Taller=t.talnombre, departamento=t.taldep, ingreso=sum(c.cobprecio+c.cobmora), fecha=a.citfechora from taller t join atencion a on a.talcod=t.talcod join cobranza c on a.atecod=c.atecod where a.citfechora=@citfechora group by t.talnombre, t.taldep,a.citfechora order by month(a.citfechora) go

execute reporteMes '13/12/2008' ao create procedure reporteAo @citfechora datetime as select Taller=t.talnombre, departamento=t.taldep, ingreso=sum(c.cobprecio+c.cobmora), fecha=a.citfechora from taller t join atencion a on a.talcod=t.talcod join cobranza c on a.atecod=c.atecod where a.citfechora=@citfechora group by t.talnombre, t.taldep,a.citfechora order by year(a.citfechora) go execute reporteAo '11/12/2008' 7) Listar todo los talleres en orden de ingresos por da create procedure IngresoTallerDia @citfechora datetime as select Taller=t.talnombre, departamento=t.taldep, ingreso=sum(c.cobprecio+c.cobmora), fecha=a.citfechora from taller t join atencion a on a.talcod=t.talcod join cobranza c on a.atecod=c.atecod where a.citfechora=@citfechora group by t.talnombre, t.taldep,a.citfechora order by day(a.citfechora) go execute IngresoTallerDia '15/12/2008' 8) Listar los materiales que se emplearon en la atencin a un cliente create procedure Materialcliente @clicod char(4) as select Nombre_Cliente=cl.clinom, Apellido_Cliente=cl.cliape, matricula_auto=ci.movmatricula,material=m.matdes from cliente cl join cita ci on ci.clicod=cl.clicod join atencion a on a.movmatricula=ci.movmatricula join material m on m.matcod=a.matcod where cl.clicod=@clicod go execute Materialcliente '2001' 9) Generar la boleta de pago a los empleados de los talleres create procedure boletaEmpleados as select Nombre_Taller=t.talnombre, Departamento=t.taldep, Empleado_Nombre=e.empnom, empleado_apellido=e.empape, monto=p.pagmonto,concepto= c.condes from taller t join empleado e on t.talcod=e.talcod join pago p on e.empcod=p.empcod join concepto c on p.concod=c.concod go exec boletaEmpleados

10) Generar el orden de compra de materiales por taller create procedure OrdenDeCompra as select taller=t.talnombre, departamento=t.taldep, descripcion=m.matdes from taller t join compra c on t.talcod=c.talcod join material m on m.talcod=c.talcod go exec OrdenDeCompra 11) Listar las citas de los clientes create procedure listarCitas as select cliente=cl.clinom,fecha=ci.citfechora,taller=ci.talcod,descripcion=ci.citdes, hora=ci.citfechorconcedida from cliente cl join cita ci on cl.clicod=ci.clicod join atencion a on a.movmatricula=ci.movmatricula go execute listarCitas 12) Lista de las citas de clientes no atendidos create procedure ClienteNoAtendido as select cl.clinom from cliente cl join cita ci on cl.clicod=ci.clicod join atencion a on a.movmatricula=ci.movmatricula where a.ateest=0 go exec clienteNoAtendido 13) Reporte de toda las atenciones que se realizo a un determinado cliente create procedure atencionesxCliente @clicod char (4), @ateest bit as select cl.clinom, ci.movmatricula, ci.talcod, ci.citdes from cliente cl join cita ci on cl.clicod = cl.clicod join atencion a on a.movmatricula=ci.movmatricula where a.ateest=@ateest and cl.clicod= @clicod go exec atencionesxCliente 1, '56' 14) Reporte de certificado de revisin create procedure certificadorevision as select Cliente=c.clinom,Matricula_vehiculo=a.movmatricula,taller=a.talcod,dia=a.citfe chora,hora=a.citfechora, c.descripcion , precio=c.cobprecio,mora= c.cobmora from cobranza c join atencion a on c.atecod=a.atecod where a.ateest=1 go

execute certificadorevision