Está en la página 1de 9

Ejercicio resuelto

Ferreteria Industrial
Una ferretería industrial que se dedica al alquiler de herramientas desea confeccionar un
sistema para gestionar dichos alquileres.

La ferretería cuenta con herramientas de las cuales se conoce: código, descripción, costo por
día y si está disponible o no. Las herramientas pueden ser manuales o pesadas. En caso de
ser manuales se conocerá también la cantidad de piezas que tiene y un costo por pieza. En el
caso de ser pesadas se le asignará un seguro que es un monto igual para todas las
herramientas pesadas.

De los clientes se conoce: dni, nombre y apellido.

Cuando un cliente quiere alquilar herramientas informará su dni, en caso de no existir el cliente
debe ser dado de alta en el sistema. Los datos que se registrarán del alquiler son: código
(numérico incremental y asignado automáticamente por el sistema), la fecha del día y la
cantidad de días que el cliente quiere alquilar las herramientas. Para que el cliente pueda
seleccionar las herramientas, se le mostrará un listado por pantalla de todas las herramientas
disponibles en ese momento, mostrando: código y descripción, este listado debe estar
ordenado de forma creciente por código de herramienta. En base a esta información el cliente
seleccionará las herramientas deseadas y se deberá actualizar el estado de disponibilidad de
las mismas.

El cálculo del costo total por día de las herramientas se realiza de la siguiente manera:
● Herramientas manuales = costo + (cantidad de piezas * costo por pieza)
● Herramientas Pesadas = costo + Seguro

Se pide:
1. Desarrollar el diagrama de clases completo indicando: clases, subclases, variables de
instancia, variables de clase, métodos de instancia, métodos de clase, relaciones de
ensamble y de herencia que considere necesarios para resolver el problema.
2. Codificar en lenguaje Smalltalk un menú principal y los métodos necesarios para:
(a) Dar de alta un alquiler.
(b) Imprimir el detalle de un alquiler de acuerdo al código ingresado. Se debe mostrar el
código, dni y nombre del cliente, la fecha, cantidad de días y por cada herramienta el
código, descripción, costo de la misma (costo total por día multiplicado la cantidad
de días de alquiler). Al final del reporte se debe informar el costo total del alquiler.

Nota: Considerar que las herramientas ya se encuentran cargadas en el sistema.


Diagrama de Clases
Browser de Clases
Object subclass: #Herramienta
instanceVariableNames: 'codigo descripcion costoPorDia
disponible'
classVariableNames: ''
poolDictionaries: ''
category: ''

Browser de Clases
Herramienta subclass: #HerramientaManual
instanceVariableNames: 'cantidadPiezas costoPorPieza'
classVariableNames: ''
poolDictionaries: ''
category: ''

Browser de Clases
Herramienta subclass: #HerramientaPesada
instanceVariableNames: ''
classVariableNames: 'Seguro'
poolDictionaries: ''
category: ''

Browser de Clases
Object subclass: #Cliente
instanceVariableNames: 'dni nombre apellido'
classVariableNames: ''
poolDictionaries: ''
category: ''

Browser de Clases
Object subclass: #Alquiler
instanceVariableNames: 'codigo fecha cantidadDias cliente
herramientas'
classVariableNames: 'UltimoCodigo'
poolDictionaries: ''
category: ''
Browser de Clases
Object subclass: #Ferreteria
instanceVariableNames: 'herramientas clientes alquileres'
classVariableNames: ''
poolDictionaries: ''
category: ''
#Ferreteria

Métodos de instancia

#altaAlquiler
| cli alq cont cod |
alq := Alquiler new.
alq inicializa.
alq cargaDatos.
cli := self buscarOCrearCliiente.
alq cliente: cli.
cont := true.
[ cont ] whileTrue: [
self mostrarHerramientasDisponibles.
cod := (Prompter prompt: ‘Ingrese el codigo de la herramienta’) asNumber.
herr := herramientas detect: [:unaHerramienta | unaHerramienta codigo =
cod] ifNone: [ nil ].
herr notNil ifTrue: [
herr ocupar.
alq agregarHerramienta: herr.
].
cont := MessageBox confirm: ‘¿Desea continuar agregando herramientas?’.
].
alquileres add: alq.

#imprimirAlquiler
| cod alq |
cod := (Prompter prompt: ‘Ingrese el codigo de la herramienta’) asNumber.
alq := alquileres detect: [:unAlquiler | unAlquiler codigo = cod] ifNone: [
nil ].
alq notNil
ifTrue: [ alq imprimirDetalle ]
ifFalse: [ MessageBox notify: ‘No se encontro el alquiler’ ].

#buscarOCrearCliente
|dni cli |
dni := Prompter prompt: ‘Ingrese el DNI del cliente’.
cli := clientes detect: [:unCliente | unCliente dni = dni ] ifNone: [nil].
cli isNil ifTrue: [ cli := self nuevoCliente ].
^ cli
#nuevoCliente
| cli |
cli := Cliente new.
cli cargaDatos.
^ cli

#mostrarHerramientasDisponibles
|disponibles|
disponibles := self herramientas select: [:unaHerramienta | unaHerramienta
estaDisponible ].
disponibles := disponibles asSortedCollection: [:unaHerr :otraHerr | unaHerr
codigo < unaHerr codigo ].

Transcript
show: ‘Listado de Herramientas disponibles:’; cr;
show: ‘Codigo’; tab;
show: ‘Descripcion’; cr.

disponibles do: [:unaHerramienta |


Transcript
show: unaHerramienta codigo; tab;
show: unaHerramienta descripcion; cr ].
#Alquiler

Métodos de clase
#incrementaUltimoCodigo
UltimoCodigo := UltimoCodigo + 1

Métodos de instancia
#inicializa
herramientas := OrderedCollection new.

#cargaDatos
codigo := UltimoCodigo.
Alquiler incrementaUltimoCodigo.
fecha := Date today.
cantidadDias := (Prompter prompt: ‘Ingrese la cantidad de dias a alquilar’)
asNumber.

#cliente: unCliente
cliente := unCliente

#agregarHerramienta: unaHerramienta
herramientas add: unaHerramienta.

#codigo
^ codigo

#imprimirDetalle
|costoTotalHerramienta|
Transcript
show: ‘Detalle del alquiler: ‘, codigo printString; cr;
show: ‘Cliente: ‘, cliente nombreYApellido, ‘ - ‘, cliente dni; cr;
show: ‘Fecha: ‘, fecha printString; cr;
show: ‘Dias: ‘, cantidadDias printString; cr;
show: ‘Herramientas: ‘; cr.
Transcript
show: ‘Codigo’; tab;
show: ‘Descripcion’; tab;
show: ‘Costo total por dia’; tab;
show: ‘Costo total’; cr.
herramientas do: [:unaHerramienta |
costoTotalHerramienta := unaHerramienta costoTotal * cantidadDias
Transcript
show: unaHerramienta codigo printString; tab;
show: unaHerramienta descripcion; tab;
show: unaHerramienta costoTotal printString; tab;
show: costoTotalHerramienta printString; cr.
].
Transcript show: ‘Costo total del alquiler: ‘, self costoTotal.

#costoTotal
|tot|
tot := 0.
herramientas do: [:unaHerramienta | tot := tot + unaHerramienta costoTotal ].
^ tot * cantidadDias

#Cliente

Métodos de instancia
#dni
^dni

#cargaDatos
dni := Prompter prompt: ‘Ingrese el DNI’.
nombre := Prompter prompt: ‘Ingrese el Nombre del cliente’.
apellido := Prompter prompt: ‘Ingrese el Apellido del cliente’.
#Herramienta

Métodos de instancia
#estaDisponible
^ disponible = ‘D’

disponibilizar
disponible := ‘D’

ocupar
disponible := ‘ND’

#codigo
^ codigo

#descripcion
^ descripcion

#HerramientaManual

Métodos de instancia
#costoTotal
^ costo + (cantidadPiezas * costoPorPieza)

#HerramientaPesada

Métodos de instancia
#costoTotal
^ costo + Seguro

También podría gustarte