package entity.qms; import entity.system.Users; import io.lamma.Date; import io.lamma.Lamma4j; import op.OPDE; import op.tools.SYSCalendar; import op.tools.SYSConst; import op.tools.SYSTools; import org.joda.time.LocalDate; import javax.persistence.EntityManager; import javax.persistence.Query; import javax.swing.*; import java.text.DateFormat; import java.util.ArrayList; import java.util.Collections; /** * Created by tloehr on 28.05.14. */ public class QmsTools { public static final short STATE_OPEN = 0; public static final short STATE_DONE = 1; public static final short STATE_REFUSED = 2; /** * this method generates QMS objects. It uses the lamma.io date sequence generator and checks which occurence is next. * This one will be the new one to generate. Every QMS object knows its * position in the recurrence list. * * @param qmssched the schedule which contains the recurrence pattern * @param numOccurences how many occurences should be generated. */ public static void generate(Qmssched qmssched, int numOccurences) { ArrayList<Qms> listQms = new ArrayList<>(qmssched.getQmsList()); Collections.sort(listQms); int maxSequence = listQms.isEmpty() ? -1 : listQms.get(listQms.size() - 1).getSequence(); ArrayList<Date> listSequence = new ArrayList<>(); if (qmssched.isYearly()){ listSequence.addAll(Lamma4j.sequence(SYSCalendar.toLammaDate(qmssched.getStartingOn()), SYSCalendar.toLammaDate(new LocalDate().plusYears(20).toDate()), QmsschedTools.getRecurrence(qmssched))); } else { listSequence.addAll(Lamma4j.sequence(SYSCalendar.toLammaDate(qmssched.getStartingOn()), SYSCalendar.toLammaDate(new LocalDate().plusYears(Math.max(qmssched.getYearly(), 2)).toDate()), QmsschedTools.getRecurrence(qmssched))); } new ArrayList<>(); if (listSequence.size() >= maxSequence) { for (int element = maxSequence + 1; element < maxSequence + numOccurences + 1; element++) { qmssched.getQmsList().add(new Qms(SYSCalendar.toLocalDate(listSequence.get(element)).toDate(), qmssched, element)); } } } /** * retrieves a list of all due and overdue QMSs. * @param user the list is created only for those users which are supposed to be notified * * @return */ public static ArrayList<Qms> getDueList(Users user) { EntityManager em = OPDE.createEM(); ArrayList<Qms> result = new ArrayList<>(); try { String jpql = " SELECT qms " + " FROM Qms qms " + " WHERE qms.qmssched.state = :schedstate AND qms.qmsplan.state = :planstate AND qms.state = :qmsstate " + " ORDER BY qms.target DESC "; Query query = em.createQuery(jpql); query.setParameter("schedstate", QmsschedTools.STATE_ACTIVE); query.setParameter("planstate", QmsplanTools.STATE_ACTIVE); query.setParameter("qmsstate", QmsTools.STATE_OPEN); ArrayList<Qms> listPre = new ArrayList<Qms>(query.getResultList()); for (Qms qms : listPre) { if (qms.isDue()) { result.add(qms); } } listPre.clear(); } catch (Exception se) { OPDE.fatal(se); } finally { em.close(); } return result; } public static Icon getIcon(Qms qms) { if (qms.getState() == STATE_DONE) { return SYSConst.icon22apply; } if (qms.isPastDue()) { return SYSConst.icon22ledRedOn; } if (qms.isDue()) { return SYSConst.icon22ledYellowOn; } if (qms.isOpen()) { return null; } if (qms.getState() == STATE_REFUSED) { return SYSConst.icon22cancel; } return null; } public static String toHTML(Qms qms) { String result = SYSConst.html_bold(DateFormat.getDateInstance().format(qms.getTarget())); if (qms.isDue()) { result += " // (" + SYSTools.xx(qms.isPastDue() ? "misc.msg.pastdue" : "misc.msg.due") + ")"; } if (!qms.isOpen()) { result += " // " + DateFormat.getDateInstance().format(qms.getActual()) + "; " + qms.getUser().getUID(); } return result; } }