CursoPropioDAO.java

package persistencia;

import java.sql.SQLException;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import java.util.ArrayList;
import negocio.entities.*;
import negocio.controllers.CursoException.*;

public class CursoPropioDAO {

	private DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
	
	public int crearNuevoCurso(CursoPropio curso) throws SQLException {
		Date fechaCreacion =  new Date();
		Date fechaActualizacion = fechaCreacion;

		int contador = 0;
		
		contador += GestorBD.getInstancia().insert("INSERT INTO cursoPropio (id, nombre, ECTS, fechaInicio, fechaFin, tasaMatricula, edicion, estadoCurso, tipoCurso, centro_nombre, secretario_Profesor_DNI, director_Profesor_DNI, requisitos, fechaCreacion, fechaActualizacion) VALUES ('"
				+ curso.getId()+"', '"
				+ curso.getNombre()+"', "
				+ curso.getECTS()+", '"
				+ dateFormat.format(curso.getFechaInicio())+"', '"
				+ dateFormat.format(curso.getFechaFin())+"', "
				+ curso.getTasaMatricula()+", "
				+ curso.getEdicion()+", '"
				+ curso.estado.toString()+"', '"
				+ curso.tipo.toString()+"', '"
				+ curso.centro.getNombre()+"', '"
				+ curso.secretario.getDni()+"', '"
				+ curso.director.getDni()+"', '"
				+ curso.requisitos+"', '"
				+ dateFormat.format(fechaCreacion)+"', '"
				+ dateFormat.format(fechaActualizacion)+"')");
		
		Materia[] materias = curso.materias.toArray(new Materia[curso.materias.size()]);

		for (int i=0; i<materias.length; i++){
			contador += materias[i].materiaDao.crearNuevaMateria(materias[i], curso.getId(), curso.getEdicion());
		}
		
		if (contador == curso.materias.size() + 1){
			return 1;	
		} else {
			return 0;
		}
	}

	public CursoPropio seleccionarCurso(CursoPropio curso) throws SQLException, CursoNoExisteException {
		Vector datosCurso = GestorBD.getInstancia().select("SELECT * FROM cursoPropio WHERE id='"+curso.getId()+"' AND edicion="+curso.getEdicion());
		
		if (datosCurso.isEmpty())
			throw new CursoNoExisteException("No existe el curso seleccionado en la base de datos");
		
		datosCurso = (Vector) datosCurso.get(0);

		String id = (String) datosCurso.get(0);
		String nombre = (String) datosCurso.get(1);
		int eCTS = (Integer) datosCurso.get(2);
		Date fechainicio = (Date) datosCurso.get(3);
		Date fechafin = (Date) datosCurso.get(4);
		double tasaMatricula = (Double) datosCurso.get(5);
		int edicion = (Integer) datosCurso.get(6);
		EstadoCurso estado = EstadoCurso.valueOf((String) datosCurso.get(7));
		TipoCurso tipo = TipoCurso.valueOf((String) datosCurso.get(8));
		Centro centro = new Centro((String) datosCurso.get(9));
		ProfesorUCLM secretario = new ProfesorUCLM((String) datosCurso.get(10));
		ProfesorUCLM director = new ProfesorUCLM((String) datosCurso.get(11));
		String requisitos = (String) datosCurso.get(12);
		
		CursoPropio cursoDevolver = new CursoPropio(id, nombre, eCTS, fechainicio, fechafin, tasaMatricula, edicion, estado, tipo, centro, secretario, director, requisitos);
		
		List<Materia> materiasCurso = new Materia().materiaDao.listarMateriasPorCurso(cursoDevolver);
		cursoDevolver.materias = materiasCurso;
		
		List<Matricula> matriculasCurso = new Matricula().matriculaDAO.listarMatriculasPorCurso(cursoDevolver);
		cursoDevolver.matriculas = matriculasCurso;
		
		return cursoDevolver;
	}

	public int editarCurso(CursoPropio curso) throws SQLException, CursoNoExisteException {
		Date fechaActualizacion = new Date();

		int contador = 0;
		int materiasAModificar = 0;
		
		CursoPropio cursoEnBBDD = curso.cursoPropioDao.seleccionarCurso(curso);
		
		//curso.materias y cursoEnBBDD.materias
		
		//comprobar los nuevos a aƱadir
		Iterator<Materia> recorrerMateriaCurso = curso.materias.iterator();
		while(recorrerMateriaCurso.hasNext()) {
			boolean materiaYaEnBBDD = false;
			Materia materiaCurso = recorrerMateriaCurso.next();
			
			Iterator<Materia> recorrerMateriaCursoEnBBDD = cursoEnBBDD.materias.iterator();
			while(recorrerMateriaCursoEnBBDD.hasNext()) {
				Materia materiaCursoEnBBDD = recorrerMateriaCursoEnBBDD.next();
				if (materiaCurso.getNombre().equals(materiaCursoEnBBDD.getNombre())) {
					materiaYaEnBBDD = true;
					break;
				}
			}
			
			if (!materiaYaEnBBDD) {
				materiasAModificar++;
				contador += materiaCurso.materiaDao.crearNuevaMateria(materiaCurso, curso.getId(), curso.getEdicion());
			}
		}
		
		
		//comprobar los antiguos a borrar	
		Iterator<Materia> recorrerMateriaCursoEnBBDD = cursoEnBBDD.materias.iterator();
		while(recorrerMateriaCursoEnBBDD.hasNext()) {
			boolean materiaSeMantiene = false;
			Materia materiaCursoEnBBDD = recorrerMateriaCursoEnBBDD.next();
			
			Iterator<Materia> recorrerMateriaCurso2 = curso.materias.iterator();
			while(recorrerMateriaCurso2.hasNext()) {
				Materia materiaCurso = recorrerMateriaCurso2.next();
				if (materiaCursoEnBBDD.getNombre().equals(materiaCurso.getNombre())) {
					materiaSeMantiene = true;
					break;
				}
			}
			
			if (!materiaSeMantiene) {
				materiasAModificar++;
				contador += materiaCursoEnBBDD.materiaDao.eliminarMateria(materiaCursoEnBBDD, curso.getId(), curso.getEdicion());
			}
		}
		
		contador+= GestorBD.getInstancia().update("UPDATE cursoPropio SET "
				+ "nombre='" + curso.getNombre() + "', "
				+ "ECTS=" + curso.getECTS() + ", "
				+ "fechaInicio='" + dateFormat.format(curso.getFechaInicio()) + "', "
				+ "fechaFin='" + dateFormat.format(curso.getFechaFin()) + "', "
				+ "tasaMatricula=" + curso.getTasaMatricula() + ", "
				+ "estadoCurso='" + curso.estado.toString() + "', "
				+ "tipoCurso='" + curso.tipo.toString() + "', "
				+ "centro_nombre='" + curso.centro.getNombre() + "', "
				+ "secretario_Profesor_DNI='" + curso.secretario.getDni() + "', "
				+ "director_Profesor_DNI='" + curso.director.getDni() + "', "
				+ "requisitos='" + curso.requisitos + "', "
				+ "fechaActualizacion='" + dateFormat.format(fechaActualizacion)
				+ "' WHERE id='"+curso.getId()+"' AND edicion="+curso.getEdicion());
		
		if (contador == materiasAModificar + 1){
			return 1;	
		} else {
			return 0;
		}
	}
	
	public int eliminarCursoPropio(CursoPropio curso) throws SQLException {
		int contador = 0;
		if (curso.materias == null)
			return 0;
		Materia[] materias = curso.materias.toArray(new Materia[curso.materias.size()]);
		for (int i=0; i<materias.length; i++){
			contador += materias[i].materiaDao.eliminarMateria(materias[i], curso.getId(), curso.getEdicion());
		}
		
		contador+= GestorBD.getInstancia().delete("DELETE FROM cursoPropio WHERE id='"+curso.getId()+"' AND edicion="+curso.getEdicion());
		if (contador == curso.materias.size() + 1){
			return 1;	
		} else {
			return 0;
		}
	}

	public List<CursoPropio> listarCursos() throws SQLException {
		Vector cursosDatos=  GestorBD.getInstancia().select("SELECT * FROM cursoPropio");
		List <CursoPropio> listaCursos=new ArrayList<>();
		
		for(int i=0; i<cursosDatos.size(); i++) {
			Vector curDatosTemp=(Vector) cursosDatos.get(i);
			
			String id = (String) curDatosTemp.get(0);
			String nombre = (String) curDatosTemp.get(1);
			int eCTS = (Integer)curDatosTemp.get(2);
			Date fechainicio = (Date) curDatosTemp.get(3);
			Date fechafin = (Date) curDatosTemp.get(4);
			double tasaMatricula = (Double) curDatosTemp.get(5);
			int edicion = (Integer) curDatosTemp.get(6);
			EstadoCurso estadoObtenido = EstadoCurso.valueOf((String) curDatosTemp.get(7));
			TipoCurso tipo = TipoCurso.valueOf((String) curDatosTemp.get(8));
			Centro centro = new Centro((String) curDatosTemp.get(9));
			ProfesorUCLM secretario = new ProfesorUCLM((String) curDatosTemp.get(10));
			ProfesorUCLM director = new ProfesorUCLM((String) curDatosTemp.get(11));
			String requisitos = (String) curDatosTemp.get(12);			
			
			CursoPropio cursoDevolver = new CursoPropio(id, nombre, eCTS, fechainicio, fechafin, tasaMatricula, edicion, estadoObtenido, tipo, centro, secretario, director, requisitos);
			
			List<Matricula> matriculasCurso = new Matricula().matriculaDAO.listarMatriculasPorCurso(cursoDevolver);
			cursoDevolver.matriculas = matriculasCurso;
			
			List<Materia> materiasCurso = new Materia().materiaDao.listarMateriasPorCurso(cursoDevolver);
			cursoDevolver.materias = materiasCurso;
			
			listaCursos.add(cursoDevolver);
		}
		
		return listaCursos;

	}

	public List<CursoPropio> listarCursosPorEstado(EstadoCurso estado, Date fechaInicio, Date fechaFin) throws SQLException {
		Vector cursosDatos=  GestorBD.getInstancia().select("SELECT * FROM cursoPropio WHERE estadoCurso = '"+estado.toString()+"' AND fechaInicio >= '" + dateFormat.format(fechaInicio) + "' AND fechaFin <= '" + dateFormat.format(fechaFin) + "'");
		List <CursoPropio> listaCursos=new ArrayList<>();
		
		for(int i=0; i<cursosDatos.size(); i++) {
			Vector curDatosTemp=(Vector) cursosDatos.get(i);
			
			String id = (String) curDatosTemp.get(0);
			String nombre = (String) curDatosTemp.get(1);
			int eCTS = (Integer)curDatosTemp.get(2);
			Date fechainicio = (Date) curDatosTemp.get(3);
			Date fechafin = (Date) curDatosTemp.get(4);
			double tasaMatricula = (Double) curDatosTemp.get(5);
			int edicion = (Integer) curDatosTemp.get(6);
			EstadoCurso estadoObtenido = EstadoCurso.valueOf((String) curDatosTemp.get(7));
			TipoCurso tipo = TipoCurso.valueOf((String) curDatosTemp.get(8));
			Centro centro = new Centro((String) curDatosTemp.get(9));
			ProfesorUCLM secretario = new ProfesorUCLM((String) curDatosTemp.get(10));
			ProfesorUCLM director = new ProfesorUCLM((String) curDatosTemp.get(11));
			String requisitos = (String) curDatosTemp.get(12);
			
			CursoPropio cursoDevolver = new CursoPropio(id, nombre, eCTS, fechainicio, fechafin, tasaMatricula, edicion, estadoObtenido, tipo, centro, secretario, director, requisitos);
			
			List<Materia> materiasCurso = new Materia().materiaDao.listarMateriasPorCurso(cursoDevolver);
			cursoDevolver.materias = materiasCurso;
			
			List<Matricula> matriculasCurso = new Matricula().matriculaDAO.listarMatriculasPorCurso(cursoDevolver);
			cursoDevolver.matriculas = matriculasCurso;
			
			listaCursos.add(cursoDevolver);
		}
	
		return listaCursos;	
	}
	
	public List<CursoPropio> listarCursosPorDirector(ProfesorUCLM director, Date fechaInicio, Date fechaFin) throws SQLException {
		Vector cursosDatos=  GestorBD.getInstancia().select("SELECT * FROM cursoPropio WHERE director_Profesor_DNI = '"+director.getDni()+"' AND fechaInicio >= '" + dateFormat.format(fechaInicio) + "' AND fechaFin <= '" + dateFormat.format(fechaFin) + "'");
		List <CursoPropio> listaCursos=new ArrayList<>();
		
		for(int i=0; i<cursosDatos.size(); i++) {
			Vector curDatosTemp=(Vector) cursosDatos.get(i);
			
			String id = (String) curDatosTemp.get(0);
			String nombre = (String) curDatosTemp.get(1);
			int eCTS = (Integer) curDatosTemp.get(2);
			Date fechainicio = (Date) curDatosTemp.get(3);
			Date fechafin = (Date) curDatosTemp.get(4);
			double tasaMatricula = (Double) curDatosTemp.get(5);
			int edicion = (Integer) curDatosTemp.get(6);
			EstadoCurso estado = EstadoCurso.valueOf((String) curDatosTemp.get(7));
			TipoCurso tipo = TipoCurso.valueOf((String) curDatosTemp.get(8));
			Centro centro = new Centro((String) curDatosTemp.get(9));
			ProfesorUCLM secretario = new ProfesorUCLM((String) curDatosTemp.get(10));
			ProfesorUCLM directorObtenido = new ProfesorUCLM((String) curDatosTemp.get(11));
			String requisitos = (String) curDatosTemp.get(12);
			
			CursoPropio cursoDevolver = new CursoPropio(id, nombre, eCTS, fechainicio, fechafin, tasaMatricula, edicion, estado, tipo, centro, secretario, directorObtenido, requisitos);
			
			List<Materia> materiasCurso = new Materia().materiaDao.listarMateriasPorCurso(cursoDevolver);
			cursoDevolver.materias = materiasCurso;
			
			List<Matricula> matriculasCurso = new Matricula().matriculaDAO.listarMatriculasPorCurso(cursoDevolver);
			cursoDevolver.matriculas = matriculasCurso;
			
			listaCursos.add(cursoDevolver);
		}

		return listaCursos;	
	}

	public double listarIngresos(TipoCurso tipo, Date fechaInicio, Date fechaFin) throws SQLException {
		Vector listaCursos = GestorBD.getInstancia().select("SELECT * FROM cursoPropio WHERE tipoCurso = '"+ tipo.toString() +"' AND fechaInicio >= '" + dateFormat.format(fechaInicio) + "' AND fechaFin <= '" + dateFormat.format(fechaFin) + "'");
		
		double ingresosTotales = 0;
		
		for (int i=0; i<listaCursos.size(); i++) {
			Vector datosCursoTemp = (Vector) listaCursos.get(i);
			
			String id = (String) datosCursoTemp.get(0);
			int edicion = (Integer) datosCursoTemp.get(6);
			double tasaMatricula = (Double) datosCursoTemp.get(5);
			
			CursoPropio cursoTemp = new CursoPropio(id, edicion);
			
			List<Matricula> matriculasCurso = new Matricula().matriculaDAO.listarMatriculasPorCurso(cursoTemp);
			
			for (int j = 0; j<matriculasCurso.size();j++) {
				if (matriculasCurso.get(j).isPagado())
					ingresosTotales+=tasaMatricula;
			}
		}		
		
		return ingresosTotales;
	}

	public List<CursoPropio> listarEdicionesCursos(Date fechaInicio, Date fechaFin) throws SQLException {
		Vector listaEdicicionDatos = GestorBD.getInstancia().select("SELECT * FROM cursoPropio WHERE fechaInicio = '" + dateFormat.format(fechaInicio) + "' AND fechaFin <= '" + dateFormat.format(fechaFin) + "'");
		
		List<CursoPropio> listaEdiciones = new ArrayList<>();
		
		for (int i=0; i<listaEdicicionDatos.size(); i++) {
			Vector lEdicnDatosTemp = (Vector) listaEdicicionDatos.get(i);
			
			String id = (String) lEdicnDatosTemp.get(0);
			String nombre = (String) lEdicnDatosTemp.get(1);
			int eCTS = (Integer) lEdicnDatosTemp.get(2);
			Date fechainicio = (Date) lEdicnDatosTemp.get(3);
			Date fechafin = (Date) lEdicnDatosTemp.get(4);
			double tasaMatricula = (Double) lEdicnDatosTemp.get(5);
			int edicion = (Integer) lEdicnDatosTemp.get(6);
			EstadoCurso estado = EstadoCurso.valueOf((String) lEdicnDatosTemp.get(7));
			TipoCurso tipo = TipoCurso.valueOf((String) lEdicnDatosTemp.get(8));
			Centro centro = new Centro((String) lEdicnDatosTemp.get(9));
			ProfesorUCLM secretario = new ProfesorUCLM((String) lEdicnDatosTemp.get(10));
			ProfesorUCLM director = new ProfesorUCLM((String) lEdicnDatosTemp.get(11));
			String requisitos = (String) lEdicnDatosTemp.get(12);
			
			CursoPropio cursoDevolver = new CursoPropio(id, nombre, eCTS, fechainicio, fechafin, tasaMatricula, edicion, estado, tipo, centro, secretario, director, requisitos);
			
			List<Materia> materiasCurso = new Materia().materiaDao.listarMateriasPorCurso(cursoDevolver);
			cursoDevolver.materias = materiasCurso;
			
			List<Matricula> matriculasCurso = new Matricula().matriculaDAO.listarMatriculasPorCurso(cursoDevolver);
			cursoDevolver.matriculas = matriculasCurso;
					
			listaEdiciones.add(cursoDevolver);
		}
		
		return listaEdiciones;
	}
}