diff --git a/db-init/01-create-crm.sql b/db-init/01-create-crm.sql new file mode 100644 index 0000000..cd54882 --- /dev/null +++ b/db-init/01-create-crm.sql @@ -0,0 +1,100 @@ +CREATE DATABASE IF NOT EXISTS crm CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; +USE crm; + +CREATE TABLE IF NOT EXISTS direcciones ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + calle VARCHAR(255), + numero VARCHAR(50), + piso VARCHAR(50), + ciudad VARCHAR(100), + provincia VARCHAR(100), + codigo_postal VARCHAR(20) +); + +CREATE TABLE IF NOT EXISTS propietarios ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + nombre VARCHAR(255) NOT NULL, + telefono VARCHAR(50), + email VARCHAR(255), + direccion_id BIGINT, + FOREIGN KEY (direccion_id) REFERENCES direcciones(id) +); + +CREATE TABLE IF NOT EXISTS proveedores ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + nombre VARCHAR(255) NOT NULL, + telefono VARCHAR(50), + email VARCHAR(255), + direccion_id BIGINT, + FOREIGN KEY (direccion_id) REFERENCES direcciones(id) +); + +CREATE TABLE IF NOT EXISTS contacto_proveedor ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + proveedor_id BIGINT NOT NULL, + nombre VARCHAR(255) NOT NULL, + telefono VARCHAR(50), + email VARCHAR(255), + FOREIGN KEY (proveedor_id) REFERENCES proveedores(id) +); + +CREATE TABLE IF NOT EXISTS servicios ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + nombre VARCHAR(255) NOT NULL, + descripcion TEXT, + proveedor_id BIGINT, + FOREIGN KEY (proveedor_id) REFERENCES proveedores(id) +); + +CREATE TABLE IF NOT EXISTS inmuebles ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + referencia_catastral VARCHAR(255) UNIQUE, + descripcion TEXT, + precio DECIMAL(15,2), + estado VARCHAR(100), + direccion_id BIGINT, + propietario_id BIGINT, + FOREIGN KEY (direccion_id) REFERENCES direcciones(id), + FOREIGN KEY (propietario_id) REFERENCES propietarios(id) +); + +CREATE TABLE IF NOT EXISTS contratos ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + inmueble_id BIGINT NOT NULL, + propietario_id BIGINT NOT NULL, + tipo VARCHAR(50), + fecha_inicio DATE, + fecha_fin DATE, + importe DECIMAL(15,2), + estado VARCHAR(50), + cliente_nombre VARCHAR(255), + FOREIGN KEY (inmueble_id) REFERENCES inmuebles(id), + FOREIGN KEY (propietario_id) REFERENCES propietarios(id) +); + +CREATE TABLE IF NOT EXISTS compran ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + inmueble_id BIGINT NOT NULL, + comprador_nombre VARCHAR(255), + fecha_compra DATE, + precio_compra DECIMAL(15,2), + FOREIGN KEY (inmueble_id) REFERENCES inmuebles(id) +); + +CREATE TABLE IF NOT EXISTS alquilados ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + inmueble_id BIGINT NOT NULL, + inquilino_nombre VARCHAR(255), + fecha_inicio DATE, + fecha_fin DATE, + renta_mensual DECIMAL(15,2), + FOREIGN KEY (inmueble_id) REFERENCES inmuebles(id) +); + +CREATE TABLE IF NOT EXISTS users ( + id BIGINT PRIMARY KEY AUTO_INCREMENT, + username VARCHAR(255) NOT NULL UNIQUE, + password VARCHAR(255) NOT NULL, + role VARCHAR(50) NOT NULL, + enabled BOOLEAN NOT NULL DEFAULT TRUE +); \ No newline at end of file diff --git a/db-init/CRMBasesDatos.drawio b/db-init/CRMBasesDatos.drawio new file mode 100644 index 0000000..f71769d --- /dev/null +++ b/db-init/CRMBasesDatos.drawio @@ -0,0 +1 @@ +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 \ No newline at end of file diff --git a/db-init/CRMBasesDatos.svg b/db-init/CRMBasesDatos.svg new file mode 100644 index 0000000..e2d889d --- /dev/null +++ b/db-init/CRMBasesDatos.svg @@ -0,0 +1 @@ +
personas
personas
DNI
DNI
nombre
nombre
email
email
telefono
telefono
direccion
direccion
Inmuebles
Inmuebles
Dirección
Dirección
Referencia catastral
Referencia ca...
CUPS suministros
CUPS suminist...
N
N
compran
compran
contratos
contratos
propietarios
propietarios
Referencia catastral inmueble
Referencia ca...
alquilados
alquilados
proveedores
proveedores
nombre
nombre
id proveedor
id proveedor
contacto proveedor
contacto prov...
nombre
nombre
direccion
direccion
servicios
servicios
id servicio
id servicio
servicios de proveedores
servicios de...
precio
precio
Los servicios pueden ser por ejemplo, caldera, pintores, mudanzas, etc.
Los servicios pueden ser por ej...
compradores
e
inquilinos
compradores...
terminos de busqueda (zona, dormitorios, alquiler o venta, ...)
terminos de busq...
visitan
visitan
id  estado
id  estado
Estados inmueble 
Estados inmuebl...
nombre
(alquiler, venta, alquilado, vendido, reservado)
nombre...
id del contrato
id del contra...
contrato digitalizado (¿se puede poner un pdf?)
contrato digi...
Text is not SVG - cannot display
\ No newline at end of file diff --git a/src/main/java/es/tatvil/crminmobiliario/controller/CrmController.java b/src/main/java/es/tatvil/crminmobiliario/controller/CrmController.java new file mode 100644 index 0000000..70f7ff6 --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/controller/CrmController.java @@ -0,0 +1,358 @@ +package es.tatvil.crminmobiliario.controller; + +import es.tatvil.crminmobiliario.model.*; +import es.tatvil.crminmobiliario.repository.*; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.server.ResponseStatusException; + +import java.util.List; + +@RestController +@RequestMapping("/api/crm") +public class CrmController { + + private final DireccionRepository direccionRepository; + private final PropietarioRepository propietarioRepository; + private final ProveedorRepository proveedorRepository; + private final ContactoProveedorRepository contactoProveedorRepository; + private final ServicioRepository servicioRepository; + private final InmuebleRepository inmuebleRepository; + private final ContratoRepository contratoRepository; + private final CompraRepository compraRepository; + private final AlquiladoRepository alquiladoRepository; + + public CrmController(DireccionRepository direccionRepository, + PropietarioRepository propietarioRepository, + ProveedorRepository proveedorRepository, + ContactoProveedorRepository contactoProveedorRepository, + ServicioRepository servicioRepository, + InmuebleRepository inmuebleRepository, + ContratoRepository contratoRepository, + CompraRepository compraRepository, + AlquiladoRepository alquiladoRepository) { + this.direccionRepository = direccionRepository; + this.propietarioRepository = propietarioRepository; + this.proveedorRepository = proveedorRepository; + this.contactoProveedorRepository = contactoProveedorRepository; + this.servicioRepository = servicioRepository; + this.inmuebleRepository = inmuebleRepository; + this.contratoRepository = contratoRepository; + this.compraRepository = compraRepository; + this.alquiladoRepository = alquiladoRepository; + } + + // Direcciones + @GetMapping("/direcciones") + public List listDirecciones() { + return direccionRepository.findAll(); + } + + @GetMapping("/direcciones/{id}") + public Direccion getDireccion(@PathVariable Long id) { + return direccionRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Dirección no encontrada")); + } + + @PostMapping("/direcciones") + @ResponseStatus(HttpStatus.CREATED) + public Direccion createDireccion(@RequestBody Direccion direccion) { + return direccionRepository.save(direccion); + } + + @PutMapping("/direcciones/{id}") + public Direccion updateDireccion(@PathVariable Long id, @RequestBody Direccion direccion) { + Direccion existing = getDireccion(id); + existing.setCalle(direccion.getCalle()); + existing.setNumero(direccion.getNumero()); + existing.setPiso(direccion.getPiso()); + existing.setCiudad(direccion.getCiudad()); + existing.setProvincia(direccion.getProvincia()); + existing.setCodigoPostal(direccion.getCodigoPostal()); + return direccionRepository.save(existing); + } + + @DeleteMapping("/direcciones/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteDireccion(@PathVariable Long id) { + direccionRepository.delete(getDireccion(id)); + } + + // Propietarios + @GetMapping("/propietarios") + public List listPropietarios() { + return propietarioRepository.findAll(); + } + + @GetMapping("/propietarios/{id}") + public Propietario getPropietario(@PathVariable Long id) { + return propietarioRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Propietario no encontrado")); + } + + @PostMapping("/propietarios") + @ResponseStatus(HttpStatus.CREATED) + public Propietario createPropietario(@RequestBody Propietario propietario) { + return propietarioRepository.save(propietario); + } + + @PutMapping("/propietarios/{id}") + public Propietario updatePropietario(@PathVariable Long id, @RequestBody Propietario propietario) { + Propietario existing = getPropietario(id); + existing.setNombre(propietario.getNombre()); + existing.setTelefono(propietario.getTelefono()); + existing.setEmail(propietario.getEmail()); + existing.setDireccion(propietario.getDireccion()); + return propietarioRepository.save(existing); + } + + @DeleteMapping("/propietarios/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deletePropietario(@PathVariable Long id) { + propietarioRepository.delete(getPropietario(id)); + } + + // Proveedores + @GetMapping("/proveedores") + public List listProveedores() { + return proveedorRepository.findAll(); + } + + @GetMapping("/proveedores/{id}") + public Proveedor getProveedor(@PathVariable Long id) { + return proveedorRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Proveedor no encontrado")); + } + + @PostMapping("/proveedores") + @ResponseStatus(HttpStatus.CREATED) + public Proveedor createProveedor(@RequestBody Proveedor proveedor) { + return proveedorRepository.save(proveedor); + } + + @PutMapping("/proveedores/{id}") + public Proveedor updateProveedor(@PathVariable Long id, @RequestBody Proveedor proveedor) { + Proveedor existing = getProveedor(id); + existing.setNombre(proveedor.getNombre()); + existing.setTelefono(proveedor.getTelefono()); + existing.setEmail(proveedor.getEmail()); + existing.setDireccion(proveedor.getDireccion()); + return proveedorRepository.save(existing); + } + + @DeleteMapping("/proveedores/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteProveedor(@PathVariable Long id) { + proveedorRepository.delete(getProveedor(id)); + } + + // ContactoProveedor + @GetMapping("/contactos-proveedor") + public List listContactosProveedor() { + return contactoProveedorRepository.findAll(); + } + + @GetMapping("/contactos-proveedor/{id}") + public ContactoProveedor getContactoProveedor(@PathVariable Long id) { + return contactoProveedorRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Contacto de proveedor no encontrado")); + } + + @PostMapping("/contactos-proveedor") + @ResponseStatus(HttpStatus.CREATED) + public ContactoProveedor createContactoProveedor(@RequestBody ContactoProveedor contactoProveedor) { + return contactoProveedorRepository.save(contactoProveedor); + } + + @PutMapping("/contactos-proveedor/{id}") + public ContactoProveedor updateContactoProveedor(@PathVariable Long id, @RequestBody ContactoProveedor contactoProveedor) { + ContactoProveedor existing = getContactoProveedor(id); + existing.setProveedor(contactoProveedor.getProveedor()); + existing.setNombre(contactoProveedor.getNombre()); + existing.setTelefono(contactoProveedor.getTelefono()); + existing.setEmail(contactoProveedor.getEmail()); + return contactoProveedorRepository.save(existing); + } + + @DeleteMapping("/contactos-proveedor/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteContactoProveedor(@PathVariable Long id) { + contactoProveedorRepository.delete(getContactoProveedor(id)); + } + + // Servicios + @GetMapping("/servicios") + public List listServicios() { + return servicioRepository.findAll(); + } + + @GetMapping("/servicios/{id}") + public Servicio getServicio(@PathVariable Long id) { + return servicioRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Servicio no encontrado")); + } + + @PostMapping("/servicios") + @ResponseStatus(HttpStatus.CREATED) + public Servicio createServicio(@RequestBody Servicio servicio) { + return servicioRepository.save(servicio); + } + + @PutMapping("/servicios/{id}") + public Servicio updateServicio(@PathVariable Long id, @RequestBody Servicio servicio) { + Servicio existing = getServicio(id); + existing.setNombre(servicio.getNombre()); + existing.setDescripcion(servicio.getDescripcion()); + existing.setProveedor(servicio.getProveedor()); + return servicioRepository.save(existing); + } + + @DeleteMapping("/servicios/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteServicio(@PathVariable Long id) { + servicioRepository.delete(getServicio(id)); + } + + // Inmuebles + @GetMapping("/inmuebles") + public List listInmuebles() { + return inmuebleRepository.findAll(); + } + + @GetMapping("/inmuebles/{id}") + public Inmueble getInmueble(@PathVariable Long id) { + return inmuebleRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Inmueble no encontrado")); + } + + @PostMapping("/inmuebles") + @ResponseStatus(HttpStatus.CREATED) + public Inmueble createInmueble(@RequestBody Inmueble inmueble) { + return inmuebleRepository.save(inmueble); + } + + @PutMapping("/inmuebles/{id}") + public Inmueble updateInmueble(@PathVariable Long id, @RequestBody Inmueble inmueble) { + Inmueble existing = getInmueble(id); + existing.setReferenciaCatastral(inmueble.getReferenciaCatastral()); + existing.setDescripcion(inmueble.getDescripcion()); + existing.setPrecio(inmueble.getPrecio()); + existing.setEstado(inmueble.getEstado()); + existing.setDireccion(inmueble.getDireccion()); + existing.setPropietario(inmueble.getPropietario()); + return inmuebleRepository.save(existing); + } + + @DeleteMapping("/inmuebles/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteInmueble(@PathVariable Long id) { + inmuebleRepository.delete(getInmueble(id)); + } + + // Contratos + @GetMapping("/contratos") + public List listContratos() { + return contratoRepository.findAll(); + } + + @GetMapping("/contratos/{id}") + public Contrato getContrato(@PathVariable Long id) { + return contratoRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Contrato no encontrado")); + } + + @PostMapping("/contratos") + @ResponseStatus(HttpStatus.CREATED) + public Contrato createContrato(@RequestBody Contrato contrato) { + return contratoRepository.save(contrato); + } + + @PutMapping("/contratos/{id}") + public Contrato updateContrato(@PathVariable Long id, @RequestBody Contrato contrato) { + Contrato existing = getContrato(id); + existing.setInmueble(contrato.getInmueble()); + existing.setPropietario(contrato.getPropietario()); + existing.setTipo(contrato.getTipo()); + existing.setFechaInicio(contrato.getFechaInicio()); + existing.setFechaFin(contrato.getFechaFin()); + existing.setImporte(contrato.getImporte()); + existing.setEstado(contrato.getEstado()); + existing.setClienteNombre(contrato.getClienteNombre()); + return contratoRepository.save(existing); + } + + @DeleteMapping("/contratos/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteContrato(@PathVariable Long id) { + contratoRepository.delete(getContrato(id)); + } + + // Compras + @GetMapping("/compras") + public List listCompras() { + return compraRepository.findAll(); + } + + @GetMapping("/compras/{id}") + public Compra getCompra(@PathVariable Long id) { + return compraRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Compra no encontrada")); + } + + @PostMapping("/compras") + @ResponseStatus(HttpStatus.CREATED) + public Compra createCompra(@RequestBody Compra compra) { + return compraRepository.save(compra); + } + + @PutMapping("/compras/{id}") + public Compra updateCompra(@PathVariable Long id, @RequestBody Compra compra) { + Compra existing = getCompra(id); + existing.setInmueble(compra.getInmueble()); + existing.setCompradorNombre(compra.getCompradorNombre()); + existing.setFechaCompra(compra.getFechaCompra()); + existing.setPrecioCompra(compra.getPrecioCompra()); + return compraRepository.save(existing); + } + + @DeleteMapping("/compras/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteCompra(@PathVariable Long id) { + compraRepository.delete(getCompra(id)); + } + + // Alquilados + @GetMapping("/alquilados") + public List listAlquilados() { + return alquiladoRepository.findAll(); + } + + @GetMapping("/alquilados/{id}") + public Alquilado getAlquilado(@PathVariable Long id) { + return alquiladoRepository.findById(id) + .orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND, "Alquiler no encontrado")); + } + + @PostMapping("/alquilados") + @ResponseStatus(HttpStatus.CREATED) + public Alquilado createAlquilado(@RequestBody Alquilado alquilado) { + return alquiladoRepository.save(alquilado); + } + + @PutMapping("/alquilados/{id}") + public Alquilado updateAlquilado(@PathVariable Long id, @RequestBody Alquilado alquilado) { + Alquilado existing = getAlquilado(id); + existing.setInmueble(alquilado.getInmueble()); + existing.setInquilinoNombre(alquilado.getInquilinoNombre()); + existing.setFechaInicio(alquilado.getFechaInicio()); + existing.setFechaFin(alquilado.getFechaFin()); + existing.setRentaMensual(alquilado.getRentaMensual()); + return alquiladoRepository.save(existing); + } + + @DeleteMapping("/alquilados/{id}") + @ResponseStatus(HttpStatus.NO_CONTENT) + public void deleteAlquilado(@PathVariable Long id) { + alquiladoRepository.delete(getAlquilado(id)); + } +} diff --git a/src/main/java/es/tatvil/crminmobiliario/controller/CrmPageController.java b/src/main/java/es/tatvil/crminmobiliario/controller/CrmPageController.java new file mode 100644 index 0000000..a507447 --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/controller/CrmPageController.java @@ -0,0 +1,19 @@ +package es.tatvil.crminmobiliario.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +import java.security.Principal; + +@Controller +public class CrmPageController { + + @GetMapping("/crm") + public String crmPage(Model model, Principal principal) { + if (principal != null) { + model.addAttribute("username", principal.getName()); + } + return "crm"; + } +} diff --git a/src/main/java/es/tatvil/crminmobiliario/model/Alquilado.java b/src/main/java/es/tatvil/crminmobiliario/model/Alquilado.java new file mode 100644 index 0000000..f4db850 --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/model/Alquilado.java @@ -0,0 +1,76 @@ +package es.tatvil.crminmobiliario.model; + +import jakarta.persistence.*; +import java.time.LocalDate; + +@Entity +@Table(name = "alquilados") +public class Alquilado { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(optional = false) + @JoinColumn(name = "inmueble_id") + private Inmueble inmueble; + + @Column(name = "inquilino_nombre") + private String inquilinoNombre; + + @Column(name = "fecha_inicio") + private LocalDate fechaInicio; + + @Column(name = "fecha_fin") + private LocalDate fechaFin; + + @Column(name = "renta_mensual") + private Double rentaMensual; + + public Alquilado() { + } + + public Long getId() { + return id; + } + + public Inmueble getInmueble() { + return inmueble; + } + + public void setInmueble(Inmueble inmueble) { + this.inmueble = inmueble; + } + + public String getInquilinoNombre() { + return inquilinoNombre; + } + + public void setInquilinoNombre(String inquilinoNombre) { + this.inquilinoNombre = inquilinoNombre; + } + + public LocalDate getFechaInicio() { + return fechaInicio; + } + + public void setFechaInicio(LocalDate fechaInicio) { + this.fechaInicio = fechaInicio; + } + + public LocalDate getFechaFin() { + return fechaFin; + } + + public void setFechaFin(LocalDate fechaFin) { + this.fechaFin = fechaFin; + } + + public Double getRentaMensual() { + return rentaMensual; + } + + public void setRentaMensual(Double rentaMensual) { + this.rentaMensual = rentaMensual; + } +} diff --git a/src/main/java/es/tatvil/crminmobiliario/model/Compra.java b/src/main/java/es/tatvil/crminmobiliario/model/Compra.java new file mode 100644 index 0000000..7ed9b82 --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/model/Compra.java @@ -0,0 +1,65 @@ +package es.tatvil.crminmobiliario.model; + +import jakarta.persistence.*; +import java.time.LocalDate; + +@Entity +@Table(name = "compran") +public class Compra { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(optional = false) + @JoinColumn(name = "inmueble_id") + private Inmueble inmueble; + + @Column(name = "comprador_nombre") + private String compradorNombre; + + @Column(name = "fecha_compra") + private LocalDate fechaCompra; + + @Column(name = "precio_compra") + private Double precioCompra; + + public Compra() { + } + + public Long getId() { + return id; + } + + public Inmueble getInmueble() { + return inmueble; + } + + public void setInmueble(Inmueble inmueble) { + this.inmueble = inmueble; + } + + public String getCompradorNombre() { + return compradorNombre; + } + + public void setCompradorNombre(String compradorNombre) { + this.compradorNombre = compradorNombre; + } + + public LocalDate getFechaCompra() { + return fechaCompra; + } + + public void setFechaCompra(LocalDate fechaCompra) { + this.fechaCompra = fechaCompra; + } + + public Double getPrecioCompra() { + return precioCompra; + } + + public void setPrecioCompra(Double precioCompra) { + this.precioCompra = precioCompra; + } +} diff --git a/src/main/java/es/tatvil/crminmobiliario/model/ContactoProveedor.java b/src/main/java/es/tatvil/crminmobiliario/model/ContactoProveedor.java new file mode 100644 index 0000000..0f41e4d --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/model/ContactoProveedor.java @@ -0,0 +1,61 @@ +package es.tatvil.crminmobiliario.model; + +import jakarta.persistence.*; + +@Entity +@Table(name = "contacto_proveedor") +public class ContactoProveedor { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(optional = false) + @JoinColumn(name = "proveedor_id") + private Proveedor proveedor; + + @Column(nullable = false) + private String nombre; + + private String telefono; + private String email; + + public ContactoProveedor() { + } + + public Long getId() { + return id; + } + + public Proveedor getProveedor() { + return proveedor; + } + + public void setProveedor(Proveedor proveedor) { + this.proveedor = proveedor; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getTelefono() { + return telefono; + } + + public void setTelefono(String telefono) { + this.telefono = telefono; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } +} diff --git a/src/main/java/es/tatvil/crminmobiliario/model/Contrato.java b/src/main/java/es/tatvil/crminmobiliario/model/Contrato.java new file mode 100644 index 0000000..d09a3dc --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/model/Contrato.java @@ -0,0 +1,101 @@ +package es.tatvil.crminmobiliario.model; + +import jakarta.persistence.*; +import java.time.LocalDate; + +@Entity +@Table(name = "contratos") +public class Contrato { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @ManyToOne(optional = false) + @JoinColumn(name = "inmueble_id") + private Inmueble inmueble; + + @ManyToOne(optional = false) + @JoinColumn(name = "propietario_id") + private Propietario propietario; + + private String tipo; + private LocalDate fechaInicio; + private LocalDate fechaFin; + private Double importe; + private String estado; + + @Column(name = "cliente_nombre") + private String clienteNombre; + + public Contrato() { + } + + public Long getId() { + return id; + } + + public Inmueble getInmueble() { + return inmueble; + } + + public void setInmueble(Inmueble inmueble) { + this.inmueble = inmueble; + } + + public Propietario getPropietario() { + return propietario; + } + + public void setPropietario(Propietario propietario) { + this.propietario = propietario; + } + + public String getTipo() { + return tipo; + } + + public void setTipo(String tipo) { + this.tipo = tipo; + } + + public LocalDate getFechaInicio() { + return fechaInicio; + } + + public void setFechaInicio(LocalDate fechaInicio) { + this.fechaInicio = fechaInicio; + } + + public LocalDate getFechaFin() { + return fechaFin; + } + + public void setFechaFin(LocalDate fechaFin) { + this.fechaFin = fechaFin; + } + + public Double getImporte() { + return importe; + } + + public void setImporte(Double importe) { + this.importe = importe; + } + + public String getEstado() { + return estado; + } + + public void setEstado(String estado) { + this.estado = estado; + } + + public String getClienteNombre() { + return clienteNombre; + } + + public void setClienteNombre(String clienteNombre) { + this.clienteNombre = clienteNombre; + } +} diff --git a/src/main/java/es/tatvil/crminmobiliario/model/Direccion.java b/src/main/java/es/tatvil/crminmobiliario/model/Direccion.java new file mode 100644 index 0000000..5ee02bd --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/model/Direccion.java @@ -0,0 +1,78 @@ +package es.tatvil.crminmobiliario.model; + +import jakarta.persistence.*; + +@Entity +@Table(name = "direcciones") +public class Direccion { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String calle; + private String numero; + private String piso; + private String ciudad; + + @Column(name = "provincia") + private String provincia; + + @Column(name = "codigo_postal") + private String codigoPostal; + + public Direccion() { + } + + public Long getId() { + return id; + } + + public String getCalle() { + return calle; + } + + public void setCalle(String calle) { + this.calle = calle; + } + + public String getNumero() { + return numero; + } + + public void setNumero(String numero) { + this.numero = numero; + } + + public String getPiso() { + return piso; + } + + public void setPiso(String piso) { + this.piso = piso; + } + + public String getCiudad() { + return ciudad; + } + + public void setCiudad(String ciudad) { + this.ciudad = ciudad; + } + + public String getProvincia() { + return provincia; + } + + public void setProvincia(String provincia) { + this.provincia = provincia; + } + + public String getCodigoPostal() { + return codigoPostal; + } + + public void setCodigoPostal(String codigoPostal) { + this.codigoPostal = codigoPostal; + } +} diff --git a/src/main/java/es/tatvil/crminmobiliario/model/Inmueble.java b/src/main/java/es/tatvil/crminmobiliario/model/Inmueble.java new file mode 100644 index 0000000..8a38d61 --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/model/Inmueble.java @@ -0,0 +1,84 @@ +package es.tatvil.crminmobiliario.model; + +import jakarta.persistence.*; + +@Entity +@Table(name = "inmuebles") +public class Inmueble { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(name = "referencia_catastral", unique = true) + private String referenciaCatastral; + + @Column(columnDefinition = "TEXT") + private String descripcion; + + private Double precio; + private String estado; + + @ManyToOne + @JoinColumn(name = "direccion_id") + private Direccion direccion; + + @ManyToOne + @JoinColumn(name = "propietario_id") + private Propietario propietario; + + public Inmueble() { + } + + public Long getId() { + return id; + } + + public String getReferenciaCatastral() { + return referenciaCatastral; + } + + public void setReferenciaCatastral(String referenciaCatastral) { + this.referenciaCatastral = referenciaCatastral; + } + + public String getDescripcion() { + return descripcion; + } + + public void setDescripcion(String descripcion) { + this.descripcion = descripcion; + } + + public Double getPrecio() { + return precio; + } + + public void setPrecio(Double precio) { + this.precio = precio; + } + + public String getEstado() { + return estado; + } + + public void setEstado(String estado) { + this.estado = estado; + } + + public Direccion getDireccion() { + return direccion; + } + + public void setDireccion(Direccion direccion) { + this.direccion = direccion; + } + + public Propietario getPropietario() { + return propietario; + } + + public void setPropietario(Propietario propietario) { + this.propietario = propietario; + } +} diff --git a/src/main/java/es/tatvil/crminmobiliario/model/Propietario.java b/src/main/java/es/tatvil/crminmobiliario/model/Propietario.java new file mode 100644 index 0000000..51012ee --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/model/Propietario.java @@ -0,0 +1,61 @@ +package es.tatvil.crminmobiliario.model; + +import jakarta.persistence.*; + +@Entity +@Table(name = "propietarios") +public class Propietario { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String nombre; + + private String telefono; + private String email; + + @ManyToOne + @JoinColumn(name = "direccion_id") + private Direccion direccion; + + public Propietario() { + } + + public Long getId() { + return id; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getTelefono() { + return telefono; + } + + public void setTelefono(String telefono) { + this.telefono = telefono; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Direccion getDireccion() { + return direccion; + } + + public void setDireccion(Direccion direccion) { + this.direccion = direccion; + } +} diff --git a/src/main/java/es/tatvil/crminmobiliario/model/Proveedor.java b/src/main/java/es/tatvil/crminmobiliario/model/Proveedor.java new file mode 100644 index 0000000..4235542 --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/model/Proveedor.java @@ -0,0 +1,61 @@ +package es.tatvil.crminmobiliario.model; + +import jakarta.persistence.*; + +@Entity +@Table(name = "proveedores") +public class Proveedor { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String nombre; + + private String telefono; + private String email; + + @ManyToOne + @JoinColumn(name = "direccion_id") + private Direccion direccion; + + public Proveedor() { + } + + public Long getId() { + return id; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getTelefono() { + return telefono; + } + + public void setTelefono(String telefono) { + this.telefono = telefono; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public Direccion getDireccion() { + return direccion; + } + + public void setDireccion(Direccion direccion) { + this.direccion = direccion; + } +} diff --git a/src/main/java/es/tatvil/crminmobiliario/model/Servicio.java b/src/main/java/es/tatvil/crminmobiliario/model/Servicio.java new file mode 100644 index 0000000..e460ac9 --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/model/Servicio.java @@ -0,0 +1,53 @@ +package es.tatvil.crminmobiliario.model; + +import jakarta.persistence.*; + +@Entity +@Table(name = "servicios") +public class Servicio { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + @Column(nullable = false) + private String nombre; + + @Column(columnDefinition = "TEXT") + private String descripcion; + + @ManyToOne + @JoinColumn(name = "proveedor_id") + private Proveedor proveedor; + + public Servicio() { + } + + public Long getId() { + return id; + } + + public String getNombre() { + return nombre; + } + + public void setNombre(String nombre) { + this.nombre = nombre; + } + + public String getDescripcion() { + return descripcion; + } + + public void setDescripcion(String descripcion) { + this.descripcion = descripcion; + } + + public Proveedor getProveedor() { + return proveedor; + } + + public void setProveedor(Proveedor proveedor) { + this.proveedor = proveedor; + } +} diff --git a/src/main/java/es/tatvil/crminmobiliario/model/Usuario.java b/src/main/java/es/tatvil/crminmobiliario/model/Usuario.java index c41a8ce..dc3d3a8 100644 --- a/src/main/java/es/tatvil/crminmobiliario/model/Usuario.java +++ b/src/main/java/es/tatvil/crminmobiliario/model/Usuario.java @@ -8,7 +8,7 @@ import jakarta.persistence.Id; import jakarta.persistence.Table; @Entity -@Table(name = "usuarios") +@Table(name = "users") public class Usuario { @Id diff --git a/src/main/java/es/tatvil/crminmobiliario/repository/AlquiladoRepository.java b/src/main/java/es/tatvil/crminmobiliario/repository/AlquiladoRepository.java new file mode 100644 index 0000000..2a61671 --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/repository/AlquiladoRepository.java @@ -0,0 +1,9 @@ +package es.tatvil.crminmobiliario.repository; + +import es.tatvil.crminmobiliario.model.Alquilado; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface AlquiladoRepository extends JpaRepository { +} diff --git a/src/main/java/es/tatvil/crminmobiliario/repository/CompraRepository.java b/src/main/java/es/tatvil/crminmobiliario/repository/CompraRepository.java new file mode 100644 index 0000000..86d73fa --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/repository/CompraRepository.java @@ -0,0 +1,9 @@ +package es.tatvil.crminmobiliario.repository; + +import es.tatvil.crminmobiliario.model.Compra; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CompraRepository extends JpaRepository { +} diff --git a/src/main/java/es/tatvil/crminmobiliario/repository/ContactoProveedorRepository.java b/src/main/java/es/tatvil/crminmobiliario/repository/ContactoProveedorRepository.java new file mode 100644 index 0000000..1ca340c --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/repository/ContactoProveedorRepository.java @@ -0,0 +1,9 @@ +package es.tatvil.crminmobiliario.repository; + +import es.tatvil.crminmobiliario.model.ContactoProveedor; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ContactoProveedorRepository extends JpaRepository { +} diff --git a/src/main/java/es/tatvil/crminmobiliario/repository/ContratoRepository.java b/src/main/java/es/tatvil/crminmobiliario/repository/ContratoRepository.java new file mode 100644 index 0000000..404197d --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/repository/ContratoRepository.java @@ -0,0 +1,9 @@ +package es.tatvil.crminmobiliario.repository; + +import es.tatvil.crminmobiliario.model.Contrato; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ContratoRepository extends JpaRepository { +} diff --git a/src/main/java/es/tatvil/crminmobiliario/repository/DireccionRepository.java b/src/main/java/es/tatvil/crminmobiliario/repository/DireccionRepository.java new file mode 100644 index 0000000..c6cdf4c --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/repository/DireccionRepository.java @@ -0,0 +1,9 @@ +package es.tatvil.crminmobiliario.repository; + +import es.tatvil.crminmobiliario.model.Direccion; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface DireccionRepository extends JpaRepository { +} diff --git a/src/main/java/es/tatvil/crminmobiliario/repository/InmuebleRepository.java b/src/main/java/es/tatvil/crminmobiliario/repository/InmuebleRepository.java new file mode 100644 index 0000000..04de5bc --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/repository/InmuebleRepository.java @@ -0,0 +1,9 @@ +package es.tatvil.crminmobiliario.repository; + +import es.tatvil.crminmobiliario.model.Inmueble; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface InmuebleRepository extends JpaRepository { +} diff --git a/src/main/java/es/tatvil/crminmobiliario/repository/PropietarioRepository.java b/src/main/java/es/tatvil/crminmobiliario/repository/PropietarioRepository.java new file mode 100644 index 0000000..f11cd7e --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/repository/PropietarioRepository.java @@ -0,0 +1,9 @@ +package es.tatvil.crminmobiliario.repository; + +import es.tatvil.crminmobiliario.model.Propietario; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface PropietarioRepository extends JpaRepository { +} diff --git a/src/main/java/es/tatvil/crminmobiliario/repository/ProveedorRepository.java b/src/main/java/es/tatvil/crminmobiliario/repository/ProveedorRepository.java new file mode 100644 index 0000000..cd97106 --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/repository/ProveedorRepository.java @@ -0,0 +1,9 @@ +package es.tatvil.crminmobiliario.repository; + +import es.tatvil.crminmobiliario.model.Proveedor; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProveedorRepository extends JpaRepository { +} diff --git a/src/main/java/es/tatvil/crminmobiliario/repository/ServicioRepository.java b/src/main/java/es/tatvil/crminmobiliario/repository/ServicioRepository.java new file mode 100644 index 0000000..b9a80c8 --- /dev/null +++ b/src/main/java/es/tatvil/crminmobiliario/repository/ServicioRepository.java @@ -0,0 +1,9 @@ +package es.tatvil.crminmobiliario.repository; + +import es.tatvil.crminmobiliario.model.Servicio; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ServicioRepository extends JpaRepository { +} diff --git a/src/main/resources/static/js/crm.js b/src/main/resources/static/js/crm.js new file mode 100644 index 0000000..9c57cc7 --- /dev/null +++ b/src/main/resources/static/js/crm.js @@ -0,0 +1,109 @@ +document.addEventListener('DOMContentLoaded', function () { + const propietariosList = document.getElementById('propietarios-list'); + const inmueblesList = document.getElementById('inmuebles-list'); + const propietarioForm = document.getElementById('propietario-form'); + const inmuebleForm = document.getElementById('inmueble-form'); + const propietarioMessage = document.getElementById('propietario-message'); + const inmuebleMessage = document.getElementById('inmueble-message'); + + function showMessage(container, message, success = true) { + container.textContent = message; + container.className = success ? 'alert success' : 'alert error'; + } + + function fetchPropietarios() { + propietariosList.textContent = 'Cargando propietarios...'; + fetch('/api/crm/propietarios') + .then(response => { if (!response.ok) throw new Error('Error al cargar propietarios'); return response.json(); }) + .then(data => { + if (data.length === 0) { + propietariosList.innerHTML = '

No hay propietarios registrados.

'; + return; + } + propietariosList.innerHTML = '
    ' + data.map(prop => + `
  • ${prop.nombre} | Tel: ${prop.telefono || '-'} | Email: ${prop.email || '-'} | Dirección ID: ${prop.direccion ? prop.direccion.id : 'N/A'}
  • ` + ).join('') + '
'; + }) + .catch(error => { + propietariosList.textContent = error.message; + }); + } + + function fetchInmuebles() { + inmueblesList.textContent = 'Cargando inmuebles...'; + fetch('/api/crm/inmuebles') + .then(response => { if (!response.ok) throw new Error('Error al cargar inmuebles'); return response.json(); }) + .then(data => { + if (data.length === 0) { + inmueblesList.innerHTML = '

No hay inmuebles registrados.

'; + return; + } + inmueblesList.innerHTML = '
    ' + data.map(inmueble => + `
  • ${inmueble.referenciaCatastral || 'Sin referencia'} | Precio: ${inmueble.precio || '-'} | Estado: ${inmueble.estado || '-'} | Propietario ID: ${inmueble.propietario ? inmueble.propietario.id : 'N/A'}
  • ` + ).join('') + '
'; + }) + .catch(error => { + inmueblesList.textContent = error.message; + }); + } + + propietarioForm.addEventListener('submit', function (event) { + event.preventDefault(); + const payload = { + nombre: document.getElementById('propietario-nombre').value, + telefono: document.getElementById('propietario-telefono').value, + email: document.getElementById('propietario-email').value, + direccion: document.getElementById('propietario-direccion-id').value ? { id: Number(document.getElementById('propietario-direccion-id').value) } : null + }; + + fetch('/api/crm/propietarios', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload) + }) + .then(response => { + if (!response.ok) throw new Error('No se pudo guardar el propietario'); + return response.json(); + }) + .then(() => { + showMessage(propietarioMessage, 'Propietario creado correctamente.'); + propietarioForm.reset(); + fetchPropietarios(); + }) + .catch(error => showMessage(propietarioMessage, error.message, false)); + }); + + inmuebleForm.addEventListener('submit', function (event) { + event.preventDefault(); + const payload = { + referenciaCatastral: document.getElementById('inmueble-referencia').value, + descripcion: document.getElementById('inmueble-descripcion').value, + precio: document.getElementById('inmueble-precio').value ? Number(document.getElementById('inmueble-precio').value) : null, + estado: document.getElementById('inmueble-estado').value, + direccion: document.getElementById('inmueble-direccion-id').value ? { id: Number(document.getElementById('inmueble-direccion-id').value) } : null, + propietario: document.getElementById('inmueble-propietario-id').value ? { id: Number(document.getElementById('inmueble-propietario-id').value) } : null + }; + + fetch('/api/crm/inmuebles', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify(payload) + }) + .then(response => { + if (!response.ok) throw new Error('No se pudo guardar el inmueble'); + return response.json(); + }) + .then(() => { + showMessage(inmuebleMessage, 'Inmueble creado correctamente.'); + inmuebleForm.reset(); + fetchInmuebles(); + }) + .catch(error => showMessage(inmuebleMessage, error.message, false)); + }); + + document.getElementById('reload-propietarios').addEventListener('click', fetchPropietarios); + document.getElementById('reload-inmuebles').addEventListener('click', fetchInmuebles); + + fetchPropietarios(); + fetchInmuebles(); +}); diff --git a/src/main/resources/templates/crm.html b/src/main/resources/templates/crm.html new file mode 100644 index 0000000..33af941 --- /dev/null +++ b/src/main/resources/templates/crm.html @@ -0,0 +1,68 @@ + + + + + + CRM Inmobiliario + + + + +
+

CRM Inmobiliario

+
+

Usuario:

+ Cerrar sesión + Volver al inicio +
+
+ +
+
+

Propietarios

+ +
Cargando propietarios...
+

Crear propietario

+
+ + + + + + + + + +
+
+
+ +
+

Inmuebles

+ +
Cargando inmuebles...
+

Crear inmueble

+
+ + + + + + + + + + + + + +
+
+
+
+ +
+

Gestión de CRM inmobiliario con Spring Boot.

+
+ + diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 2109238..c2df2e2 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -22,6 +22,7 @@ Registrarse