Skip to content

Commit

Permalink
Merge pull request #22 from fedesartu/develop
Browse files Browse the repository at this point in the history
Develop
  • Loading branch information
alorodlla authored Mar 30, 2020
2 parents f019537 + fd321f0 commit 2cffa54
Show file tree
Hide file tree
Showing 77 changed files with 3,557 additions and 340 deletions.
Binary file added Sprint 2/Documentación Sprint 2.docx
Binary file not shown.
21 changes: 21 additions & 0 deletions Sprint 2/Documentación Sprint 2.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
Nivel de acabado
El equipo aspira a un nivel de 8 puntos con una aplicación de nivel 2.


Justificación de nivel
Tras el primer sprint redactamos las historias de usuario que implementaría el sistema, las cuales, en consenso, repartimos entre las distintas parejas de trabajo.
En un principio se repartieron las historias de forma que cada subgrupo trabajara sobre servicios independientes de los otros y que en conjunto se realizaran el 66% de las historias de usuario.
El grupo empezó a trabajar adecuadamente por parejas en sus respectivas tareas y aunque debido al virus el porcentaje de historias de usuario requeridas pasó a ser de un 50% el grupo ha intentado mantener el ritmo, habiendo finalmente completado un porcentaje algo superior al 50% pero menor que el 66%.
Cuando las tareas individuales fueron acabadas, cada subgrupo revisó que todas sus historias fueron completadas correctamente. Tras esto se puso todo lo realizado en común y entre todos los integrantes se revisó que todo funcionase como debía.
Finalmente se procedió a hacer la documentación del sprint sin que esta tarea fuera asignada ya que se realizó de manera grupal al acabar el sprint.




Retrospectiva
En general, el equipo de desarrollo ha realizado el Sprint con ciertos inconvenientes por falta de conocimiento del framework y los tests a implementar que fueron solventados gracias a la cooperación de todo el grupo.
El trabajo en parejas ha resultado útil a la hora de resolver dudas de manera rápida, y la corrección por parejas nos ha ayudado a detectar problemas con relativa facilidad.
No se ha computado el número de horas y al llevar tanto tiempo trabajando en el sprint es difícil dictaminar una media del esfuerzo realizado , pese a ello se han estimado unas 20 horas de trabajo por persona.
Subgrupo de Jose y Alonso - La adaptación al framework fue algo dificultosa al principio y empleamos mucho tiempo en entender cómo funcionaba realmente antes de poder implementar correctamente. Por otro lado, la división de historias de usuarios por parejas ha sido muy útil a la hora de consultarnos dudas y repartirnos tareas al ser un "grupo" de trabajo pequeño en el que la coordinación es mucho más sencilla.
Subgrupo de Enrique y Antonio - Por parte de nuestro subgrupo se ha trabajado bien, de manera independiente pero apoyándonos mutuamente. Uno de nosotros se encargó de la parte de implementación mientras que el otro se ha encargado de la parte de los tests. Así mismo, cuando ni entre los dos podíamos resolver algún problema, hemos acudido al resto del grupo y entre todos hemos sacado el trabajo adelante. En definitiva consideramos que se ha trabajado bien y poco a poco nos vamos adaptando al framework. Además algunos problemas se resolvieron en una tutoría con la tutora.
Subgrupo de David, Federico e Ian - En nuestro grupo decidimos dividirnos el trabajo en base a user stories. Esto es, nuestras stories fueron asignadas a uno de nosotros tres, y esa persona se encargó de hacerlas realidad, tanto a nivel de modelo (tuvimos que hacer cambios en Trainer y Training), de servicio, de controlador, de vista y de testing. El trabajo fue distribuido de forma equitativa. No surgieron inconvenientes mayores, y cualquier duda que le surgió a un integrante pudo ser resuelta dentro del subgrupo con la ayuda de los otros dos. Consideramos que el ritmo de trabajo fue bueno y constante, comenzando el desarrollo del sprint en fecha, haciendo que no se nos acumulara una gran carga de trabajo sobre el final del mismo. La comunicación dentro del subgrupo fue fluida y sin inconvenientes, que es una de las ventajas de habernos dividido en grupos de trabajo pequeños.
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,15 @@ protected void configure(HttpSecurity http) throws Exception {
.antMatchers("/resources/**","/webjars/**","/h2-console/**").permitAll()
.antMatchers(HttpMethod.GET, "/","/oups").permitAll()
.antMatchers("/users/new").permitAll()
.antMatchers("/hairdressing").permitAll()
.antMatchers("/hairdressing/**").hasAnyAuthority("admin")
.antMatchers("/owners/new").permitAll()
.antMatchers("/admin/**").hasAnyAuthority("admin")
.antMatchers("/owners/**").hasAnyAuthority("owner","admin")
.antMatchers("/vets/**").authenticated()
.antMatchers("/trainers/**").hasAnyAuthority("admin", "owner")
.antMatchers("/daycare/**").hasAnyAuthority("admin")
.antMatchers("/trainings/**").hasAnyAuthority("owner", "admin")
.anyRequest().denyAll()
.and()
.formLogin()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,35 @@

import java.time.LocalDate;


import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.MappedSuperclass;
import javax.validation.constraints.Future;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.springframework.format.annotation.DateTimeFormat;

import lombok.Data;

@Data
@MappedSuperclass
public class Booking extends BaseEntity{

@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinColumn(name = "pet_id")
private Pet pet;


@NotEmpty(message="must not be empty")
@NotNull(message="must not be empty")
private String description;

@NotNull(message="must not be empty")
@DateTimeFormat(pattern = "yyyy/MM/dd")
private LocalDate date;

Expand All @@ -22,11 +42,20 @@ public void setDescription(String description) {
this.description = description;
}

public String getDate() {
return this.description;
public LocalDate getDate() {
return this.date;
}

public void setDate(LocalDate date) {
this.date = date;
}

public Pet getPet() {
return this.pet;
}

public void setPet(Pet pet) {
this.pet = pet;
}

}
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package org.springframework.samples.petclinic.model;

import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

import lombok.Data;

@Data
@Entity
@Table(name = "daycare")
@Table(name = "daycares")
public class Daycare extends Booking{
private Integer aforo;

private Integer capacity;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@
import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.validation.constraints.Digits;
import javax.validation.constraints.Email;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;

@MappedSuperclass
public class Employee extends Person {

@Column(name = "salary")
@NotEmpty
@Min(value = 0, message = "Salary must be a positive number")
@NotNull(message = "Must not be empty")
private double salary;

@Column(name = "dni")
Expand All @@ -22,6 +26,7 @@ public class Employee extends Person {
private String telephone;

@Column(name = "email")
@Email
@NotEmpty
private String email;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package org.springframework.samples.petclinic.model;

public enum TipoPista {
public enum GroundType {
OBEDIENCIA, AGILIDAD, HABILIDAD, OBSTÁCULOS
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,17 @@

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

import lombok.Data;

@Data
@Entity
@Table(name = "hairdressing")
@Table(name = "hairdressings")
public class Hairdressing extends Booking{
@NotNull(message="must not be empty")
private TipoCuidado cuidado;

@NotNull(message="must not be empty")
private String time;
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,10 +24,12 @@
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.validation.Valid;
import javax.validation.constraints.Digits;
import javax.validation.constraints.NotEmpty;

Expand Down Expand Up @@ -57,15 +59,17 @@ public class Owner extends Person {

@Column(name = "telephone")
@NotEmpty
@Digits(fraction = 0, integer = 10)
@Digits(fraction = 1, integer = 10, message = "The telephone must have between 1 and 10 digits.")
private String telephone;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner")
@OneToMany(cascade = CascadeType.ALL, mappedBy = "owner", fetch = FetchType.LAZY)
private Set<Pet> pets;

//
@OneToOne(cascade = CascadeType.ALL)
//Agregar restriccion de UNIQUE
@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "username", referencedColumnName = "username")
@Valid
private User user;
//

Expand Down
114 changes: 112 additions & 2 deletions src/main/java/org/springframework/samples/petclinic/model/Pet.java
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
*/
package org.springframework.samples.petclinic.model;

import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;
import org.springframework.beans.support.MutableSortDefinition;
import org.springframework.beans.support.PropertyComparator;
import org.springframework.format.annotation.DateTimeFormat;
Expand Down Expand Up @@ -56,12 +58,22 @@ public class Pet extends NamedEntity {
@JoinColumn(name = "type_id")
private PetType type;

@ManyToOne
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "owner_id")
private Owner owner;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "pet", fetch = FetchType.LAZY)
private Set<Training> trainings;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "pet", fetch = FetchType.EAGER)
@OneToMany(cascade = CascadeType.ALL, mappedBy = "pet", fetch = FetchType.LAZY)
private Set<Visit> visits;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "pet", fetch = FetchType.LAZY)
private List<Hairdressing> hairdressings;

@OneToMany(cascade = CascadeType.ALL, mappedBy = "pet", fetch = FetchType.LAZY)
private List<Daycare> daycares;


public void setBirthDate(LocalDate birthDate) {
this.birthDate = birthDate;
Expand Down Expand Up @@ -108,5 +120,103 @@ public void addVisit(Visit visit) {
getVisitsInternal().add(visit);
visit.setPet(this);
}

protected Set<Training> getTrainingsInternal() {
if (this.trainings == null) {
this.trainings = new HashSet<>();
}
return this.trainings;
}

protected void setTrainignsInternal(Set<Training> trainings) {
this.trainings = trainings;
}

public List<Training> getTrainings() {
List<Training> sortedTrainings = new ArrayList<>(getTrainingsInternal());
PropertyComparator.sort(sortedTrainings, new MutableSortDefinition("date", false, false));
return Collections.unmodifiableList(sortedTrainings);
}

public void addTraining(Training training) {
getTrainingsInternal().add(training);
training.setPet(this);
}

public void removeTraining(int trainingId) {
Set<Training> trainings = this.getTrainingsInternal();
for (Training t : trainings) {
if (t.getId() == trainingId) {
trainings.remove(t);
}
}
}

protected List<Hairdressing> getHairdressingsInternal() {
if (this.hairdressings == null) {
this.hairdressings = new ArrayList<>();
}
return this.hairdressings;
}

protected void setHairdressingsInternal(List<Hairdressing> hairdressings) {
this.hairdressings = hairdressings;
}

public List<Hairdressing> getHairdressings() {
List<Hairdressing> sortedHairdressings = new ArrayList<>(getHairdressingsInternal());
PropertyComparator.sort(sortedHairdressings, new MutableSortDefinition("date", false, false));
return Collections.unmodifiableList(sortedHairdressings);
}

public void addHairdressing(Hairdressing hairdressing) {
getHairdressingsInternal().add(hairdressing);
hairdressing.setPet(this);
}

public void deleteHairdressing(Integer id) {
List<Hairdressing> hairdressings = this.getHairdressingsInternal();
Hairdressing aux = new Hairdressing();
for (Hairdressing h : hairdressings) {
if (h.getId() == id) {
aux = h;
break;
}
}
hairdressings.remove(aux);
}

protected List<Daycare> getDaycaresInternal() {
if (this.daycares == null) {
this.daycares = new ArrayList<Daycare>();
}
return this.daycares;
}

protected void setDaycaresInternal(final List<Daycare> daycares) {
this.daycares = daycares;
}

public List<Daycare> getDaycares() {
List<Daycare> sortedDaycares = new ArrayList<>(this.getDaycaresInternal());
PropertyComparator.sort(sortedDaycares, new MutableSortDefinition("date", false, false));
return Collections.unmodifiableList(sortedDaycares);
}

public void addDaycare(Daycare daycare) {
getDaycaresInternal().add(daycare);
daycare.setPet(this);
}

public void deleteDaycare(int daycareId) {
List<Daycare> daycares = this.getDaycaresInternal();
Daycare aux = new Daycare();
for (Daycare d : daycares) {
if (d.getId() == daycareId) {
aux=d;
break;
}
}
daycares.remove(aux);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package org.springframework.samples.petclinic.model;

public enum TipoCuidado {
ESTÉTICA, PELUQUERÍA
ESTETICA, PELUQUERIA
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,33 @@
package org.springframework.samples.petclinic.model;

import java.util.Set;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotEmpty;

import lombok.Data;

@Data
@Entity
public class Trainer extends Employee{
public class Trainer extends Employee {

@OneToMany(cascade = CascadeType.ALL, mappedBy = "trainer", fetch = FetchType.LAZY)
private Set<Training> trainings;

@Column(name = "specialty")
@NotEmpty
private String specialty;

@Column(name = "description")
@NotEmpty
private String description;

@Override
public String toString() {
return "Trainer [specialty=" + specialty + ", firstName=" + firstName + ", lastName=" + lastName + "]";
}
}
Loading

0 comments on commit 2cffa54

Please sign in to comment.