package entity.staff;
import entity.system.Commontags;
import entity.system.CommontagsTools;
import entity.system.Users;
import entity.system.UsersTools;
import op.OPDE;
import op.tools.Pair;
import op.tools.SYSCalendar;
import op.tools.SYSConst;
import op.tools.SYSTools;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import javax.persistence.EntityManager;
import javax.persistence.Query;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
/**
* Created by tloehr on 17.05.14.
*/
public class TrainingTools {
public static final byte STATE_INTERNAL = 0;
public static final byte STATE_WORK_PLACE_RELATED = 1;
public static final byte STATE_EXTERNAL = 2;
public static final String[] STATES = new String[]{"opde.training.state.internal", "opde.training.state.workplace", "opde.training.state.external"};
/**
* retrieves the PITs of the first and the last entry in the training table.
*
* @return
*/
public static Pair<LocalDate, LocalDate> getMinMax() {
Pair<LocalDate, LocalDate> result = null;
EntityManager em = OPDE.createEM();
Query queryMin = em.createQuery("SELECT t FROM Training t ORDER BY t.starting ASC ");
queryMin.setMaxResults(1);
Query queryMax = em.createQuery("SELECT t FROM Training t ORDER BY t.starting DESC ");
queryMax.setMaxResults(1);
try {
ArrayList<Training> min = new ArrayList<Training>(queryMin.getResultList());
ArrayList<Training> max = new ArrayList<Training>(queryMax.getResultList());
if (min.isEmpty()) {
result = null;
} else {
result = new Pair<LocalDate, LocalDate>(new LocalDate(min.get(0).getStarting()), new LocalDate(max.get(0).getStarting()));
}
} catch (Exception e) {
OPDE.fatal(e);
}
em.close();
return result;
}
public static Pair<LocalDate, LocalDate> getMinMax(Commontags commontag) {
if (commontag == null) {
return getMinMax();
}
Pair<LocalDate, LocalDate> result = null;
EntityManager em = OPDE.createEM();
Query queryMin = em.createQuery("SELECT t FROM Training t WHERE :commontag MEMBER OF t.commontags ORDER BY t.starting ASC ");
queryMin.setParameter("commontag", commontag);
queryMin.setMaxResults(1);
Query queryMax = em.createQuery("SELECT t FROM Training t WHERE :commontag MEMBER OF t.commontags ORDER BY t.starting DESC ");
queryMax.setParameter("commontag", commontag);
queryMax.setMaxResults(1);
try {
ArrayList<Training> min = new ArrayList<Training>(queryMin.getResultList());
ArrayList<Training> max = new ArrayList<Training>(queryMax.getResultList());
if (min.isEmpty()) {
result = null;
} else {
result = new Pair<LocalDate, LocalDate>(new LocalDate(min.get(0).getStarting()), new LocalDate(max.get(0).getStarting()));
}
} catch (Exception e) {
OPDE.fatal(e);
}
em.close();
return result;
}
private static ArrayList<Training> getAll() {
ArrayList<Training> list = new ArrayList<>();
EntityManager em = OPDE.createEM();
Query queryMin = em.createQuery("SELECT t FROM Training t ORDER BY t.starting DESC ");
list.addAll(queryMin.getResultList());
em.close();
return list;
}
private static ArrayList<Training> getTrainings4(int iYear) {
if (iYear <= 0) return getAll();
ArrayList<Training> list = new ArrayList<>();
EntityManager em = OPDE.createEM();
Query queryMin = em.createQuery("SELECT t FROM Training t WHERE t.starting >= :from AND t.starting <= :to ORDER BY t.starting DESC ");
queryMin.setParameter("from", SYSCalendar.boy(iYear).toDate());
queryMin.setParameter("to", SYSCalendar.eoy(iYear).toDate());
list.addAll(queryMin.getResultList());
em.close();
return list;
}
public static ArrayList<Training> getTrainings4(int iYear, Commontags commontag) {
if (commontag == null) return getTrainings4(iYear);
ArrayList<Training> list = new ArrayList<>();
EntityManager em = OPDE.createEM();
Query queryMin = em.createQuery("SELECT t FROM Training t WHERE :commontag MEMBER OF t.commontags AND t.starting >= :from AND t.starting <= :to ORDER BY t.starting DESC ");
queryMin.setParameter("commontag", commontag);
queryMin.setParameter("from", SYSCalendar.boy(iYear).toDate());
queryMin.setParameter("to", SYSCalendar.eoy(iYear).toDate());
list.addAll(queryMin.getResultList());
em.close();
return list;
}
public static String getAsHTML(List<Training> trainingList) {
String html = SYSConst.html_h1("opde.training");
for (Training training : trainingList) {
boolean withTime = !new LocalDate(training.getStarting()).toDateTimeAtStartOfDay().toDate().equals(training.getStarting());
DateTime starting = new DateTime(training.getStarting());
html += SYSConst.html_h2(
training.getTitle() + ", [" +
(withTime ? starting.toString("EEE, dd.MM.yy HH:mm") : starting.toString("EEE, dd.MM.yy")) +
"]"
);
html += (training.getCommontags().isEmpty() ? "" : " " + CommontagsTools.getAsHTML(training.getCommontags(), SYSConst.html_16x16_tagPurple) + "<br/>");
html += SYSTools.xx(STATES[training.getState()]) + "<br/>";
if (!SYSTools.catchNull(training.getDocent()).isEmpty()) {
html += SYSTools.xx("opde.training.docent") + ": " + training.getDocent() + "<br/>";
}
if (!SYSTools.catchNull(training.getText()).isEmpty()) {
html += SYSConst.html_paragraph(SYSTools.xx("misc.msg.details") + ": " + training.getText());
}
ArrayList<Training2Users> listDone = getDone(training);
ArrayList<Training2Users> listRefused = getRefused(training);
ArrayList<Training2Users> listOpen = getOpen(training);
if (!listOpen.isEmpty()) {
html += SYSConst.html_h3("opde.t2u.state.open");
}
html += Training2UsersTools.getAsHTML(listOpen);
if (!listRefused.isEmpty()) {
html += SYSConst.html_h3("opde.t2u.state.refused");
}
html += Training2UsersTools.getAsHTML(listRefused);
if (!listDone.isEmpty()) {
html += SYSConst.html_h3("opde.t2u.state.done");
}
html += Training2UsersTools.getAsHTML(listDone);
}
return SYSConst.html_div(html);
}
public static String getTraining2Attendees(int year) {
String html = SYSConst.html_h1(SYSTools.xx("opde.controlling.staff.training") + " " + year);
ArrayList<Users> listUsers = UsersTools.getUsers(false);
ArrayList<Training> listTraining = getTrainings4(year);
for (Users user : listUsers) {
// boolean nothing = true;
html += SYSConst.html_h2(user.getFullname());
String list = "";
// ArrayList<Training> listTrainingsForThisUser = new ArrayList<>();
for (Training training : listTraining) {
Training2Users match = Training2UsersTools.get4User(training.getAttendees(), user);
if (match != null) {
boolean withTime = !new LocalDate(training.getStarting()).toDateTimeAtStartOfDay().toDate().equals(training.getStarting());
DateTime starting = new DateTime(training.getStarting());
list += SYSConst.html_li(Training2UsersTools.getHTMLIcon(match) + training.getTitle() + ", [" +
(withTime ? starting.toString("EEE, dd.MM.yy HH:mm") : starting.toString("EEE, dd.MM.yy")) +
"]");
}
}
if (list.isEmpty()) {
html += SYSTools.xx("opde.controlling.staff.nothing.yet");
} else {
html += SYSConst.html_ul(list);
}
}
return SYSConst.html_div(html);
}
public static ArrayList<Training2Users> getDone(Training training) {
ArrayList<Training2Users> listResult = new ArrayList<>();
for (Training2Users training2Users : training.getAttendees()) {
if (training2Users.getState() == Training2UsersTools.STATE_DONE) {
listResult.add(training2Users);
}
}
Collections.sort(listResult);
return listResult;
}
public static ArrayList<Training2Users> getRefused(Training training) {
ArrayList<Training2Users> listResult = new ArrayList<>();
for (Training2Users training2Users : training.getAttendees()) {
if (training2Users.getState() == Training2UsersTools.STATE_REFUSED) {
listResult.add(training2Users);
}
}
Collections.sort(listResult);
return listResult;
}
public static ArrayList<Training2Users> getOpen(Training training) {
ArrayList<Training2Users> listResult = new ArrayList<>();
for (Training2Users training2Users : training.getAttendees()) {
if (training2Users.getState() == Training2UsersTools.STATE_OPEN) {
listResult.add(training2Users);
}
}
Collections.sort(listResult);
return listResult;
}
}