package entity.prescription;
import entity.EntityTools;
import entity.info.Resident;
import op.OPDE;
import op.care.prescription.PnlPrescription;
import op.tools.Pair;
import op.tools.SYSConst;
import op.tools.SYSTools;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.NonUniqueResultException;
import javax.persistence.Query;
import javax.swing.*;
import java.awt.*;
import java.util.ArrayList;
import java.util.List;
/**
* Created by IntelliJ IDEA.
* User: tloehr
* Date: 18.11.11
* Time: 16:29
* To change this template use File | Settings | File Templates.
*/
public class TradeFormTools {
public static final int SHORT = 0;
public static final int MEDIUM = 1;
public static final int LONG = 2;
public static ListCellRenderer getRenderer(int verbosity) {
final int v = verbosity;
return (jList, o, i, isSelected, cellHasFocus) -> {
String text;
if (o == null) {
text = SYSTools.toHTML("<i>Keine Auswahl</i>");
} else if (o instanceof TradeForm) {
TradeForm darreichung = (TradeForm) o;
if (v == SHORT) {
text = darreichung.getSubtext();
} else if (v == MEDIUM) {
text = toPrettyStringMedium(darreichung);
} else {
text = toPrettyString(darreichung);
}
} else {
text = o.toString();
}
return new DefaultListCellRenderer().getListCellRendererComponent(jList, text, i, isSelected, cellHasFocus);
};
}
public static String toPrettyString(TradeForm tradeForm) {
String preparation = SYSTools.catchNull(tradeForm.getDosageForm().getPreparation());
String usageText = SYSTools.catchNull(tradeForm.getDosageForm().getUsageText());
String subtext = SYSTools.catchNull(tradeForm.getSubtext());
String text = tradeForm.getMedProduct().getText();
text += subtext.isEmpty() ? "" : " " + subtext;
text += preparation.isEmpty() ? " " : ", " + preparation + ", ";
text += usageText.isEmpty() ? SYSConst.UNITS[tradeForm.getDosageForm().getUsageUnit()] : usageText;
return text;
}
public static String toPrettyHTML(TradeForm tradeForm) {
String preparation = SYSTools.catchNull(tradeForm.getDosageForm().getPreparation());
String usageText = SYSTools.catchNull(tradeForm.getDosageForm().getUsageText());
String subtext = SYSTools.catchNull(tradeForm.getSubtext());
String text = tradeForm.getMedProduct().getText();
text += subtext.isEmpty() ? "" : " " + subtext;
text = SYSConst.html_bold(text);
text += preparation.isEmpty() ? " " : ", " + preparation + ", ";
text += usageText.isEmpty() ? SYSConst.UNITS[tradeForm.getDosageForm().getUsageUnit()] : usageText;
return text;
}
public static String toPrettyHTMLalternative(TradeForm alternative) {
String text = "";
if (alternative != null) {
String altPreparation = SYSTools.catchNull(alternative.getDosageForm().getPreparation());
String altUsageText = SYSTools.catchNull(alternative.getDosageForm().getUsageText());
String altSubtext = SYSTools.catchNull(alternative.getSubtext());
text += "(" + SYSTools.xx( "nursingrecords.prescription.originalprescription") + ": " + alternative.getMedProduct().getText() + (altSubtext.isEmpty() ? "" : " " + altSubtext);
text += altPreparation.isEmpty() ? " " : ", " + altPreparation + ", ";
text += altUsageText.isEmpty() ? SYSConst.UNITS[alternative.getDosageForm().getUsageUnit()] : altUsageText;
text += ")";
}
return text;
}
public static String toPrettyStringMedium(TradeForm tradeForm) {
String preparation = SYSTools.catchNull(tradeForm.getDosageForm().getPreparation());
String usageText = SYSTools.catchNull(tradeForm.getDosageForm().getUsageText());
String subtext = SYSTools.catchNull(tradeForm.getSubtext());
String text = subtext;
text += preparation.isEmpty() ? " " : " " + preparation + ", ";
text += usageText.isEmpty() ? SYSConst.UNITS[tradeForm.getDosageForm().getUsageUnit()] : usageText;
return text;
}
public static String toPrettyStringMediumWithExpiry(TradeForm tradeForm) {
String text = toPrettyStringMedium(tradeForm);
text += SYSTools.catchNull(getExpiresInAsString(tradeForm), ", " + SYSTools.xx("tradeform.subtext.expiresAfterOpenedIn") + " ", "");
text += tradeForm.isWeightControlled() ? ", " + SYSTools.xx("opde.medication.tradeform.weightControlled") : "";
return text;
}
public static String getPackUnit(TradeForm tradeForm) {
return SYSConst.UNITS[tradeForm.getDosageForm().getPackUnit()];
}
public static List<TradeForm> findTradeFormByMedProductText(EntityManager em, String suche) {
suche = "%" + suche.trim() + "%";
Query query = em.createQuery(" " +
" SELECT d FROM TradeForm d " +
" WHERE d.medProduct.text like :suche" +
" ORDER BY d.medProduct.text, d.subtext, d.dosageForm.preparation ");
query.setParameter("suche", suche);
List<TradeForm> list = query.getResultList();
return list;
}
public static List<TradeForm> findDarreichungByMedProduktText(String suche) {
suche = "%" + suche.trim() + "%";
EntityManager em = OPDE.createEM();
Query query = em.createQuery(" " +
" SELECT d FROM TradeForm d " +
" WHERE d.medProduct.text like :suche" +
" ORDER BY d.medProduct.text, d.subtext, d.dosageForm.preparation ");
query.setParameter("suche", suche);
List<TradeForm> list = query.getResultList();
em.close();
return list;
}
public static MedInventory getInventory4Prescription(Prescription prescription) {
return getInventory4TradeForm(prescription.getResident(), prescription.getTradeForm());
}
/**
* Die genaue Erläuterung zu dieser Methode befindet sich in der Methode <code>getSuitableInventoriesForThisTradeForm</code>.
* Sie implementiert Punkt 1 der dort beschriebenen 2 Antworten.
*
* @param bewohner
* @param tradeform
* @return Wenn die Darreichung zu einem früheren Zeitpunkt schonmal zugeordnet war, dann wird dieser Vorrat zurück gegeben. Ansonsten <code>null</code>.
* @see #getSuitableInventoriesForThisTradeForm(entity.info.Resident, TradeForm)
*/
public static MedInventory getInventory4TradeForm(Resident bewohner, TradeForm tradeform) {
MedInventory result = null;
EntityManager em = OPDE.createEM();
try {
result = getInventory4TradeForm(em, bewohner, tradeform);
} catch (NoResultException nre) {
result = null;
} catch (NonUniqueResultException nure) {
result = null;
} catch (Exception e) {
OPDE.fatal(e);
} finally {
em.close();
}
return result;
}
public static MedInventory getInventory4TradeForm(EntityManager em, Resident resident, TradeForm tradeform) throws Exception {
Query query = em.createQuery(" SELECT DISTINCT inv FROM MedInventory inv " +
" JOIN inv.medStocks stock " +
" WHERE inv.resident = :resident AND stock.tradeform = :tradeform " +
" AND inv.to = :to");
query.setParameter("resident", resident);
query.setParameter("tradeform", tradeform);
query.setParameter("to", SYSConst.DATE_UNTIL_FURTHER_NOTICE);
return (MedInventory) query.getSingleResult();
}
/**
* Um diese Methode zu verstehen muss man sich einige Fakten und Konzepte klar machen,
* die wir bei der Entwicklung von OPDE bzgl. der Medikamente angewendet haben. Bitte beachten Sie
* dass mit dieser Methode der Punkt 2 der beschrieben Antworten implementiert wird. Punkt 1 finden
* sie in der Methode <code>getInventory4TradeForm</code> umgesetzt.
* <p/>
* Eine <b>Darreichung</b> ist eine genaue Definition eines Medikaments, bei einer bestimmten Stärke, ein
* Hersteller, eine Darreichungsform (bitte vom Begriff Darreichung unterscheiden), eine Anwendungseinheit,
* eine Packungseinheit. usw. Das heisst, bei einer Verordnung wird immer eine Darreichung verordnet.
* Diese ist ausreichend, ja viel genauer als eine Medikamentenangabe.
* <p/>
* Über die Zeit kann es immer wieder vorkommen, dass eine Verordnung zwar bestehen bleibt, aber
* das Medikament sich verändert. Allerdings nicht beliebig sondern <b>wirkstoffgleich</b>. Das passiert
* z.B. wenn zu Beginn, sagen wir Aspirin von Bayer verordnet wurde. Nach einigen Wochen schreibt der
* GP dann aber statt dessen ASS 100 von ratiopharm auf. Diese Medikament kommt dann an und passt aber
* nicht zu der ursprünglichen Verordnung (aus Sicht von OPDE). Es ist ja eine andere <b>Darreichung</b>.
* </p>
* Trotzdem muss dieses neue Präparat ebenfalls mit auf den Vorrat, der für die Verordnung verwendet wird,
* draufgebucht werden. Das einzige auf dem OPDE hier besteht ist, dass die beiden Präparate dieselbe bzw.
* eine äquivalente PrinterForm haben.So können mit der Zeit die Vorräte Bestände mit ganz unterschiedlichen Darreichungen besessen haben.
* <p>
* Bei der täglichen Arbeit, besonders bei dem Einbuchen von neuen Medikamenten stellt sich aber immer wieder die
* Frage: <b>auf welchen Vorrat muss ich dieses Produkt buchen ? Wozu gehört es ?</b>
* <p>
* Natürlich sind alle nachfolgenden Überlegungen <i>bewohnerbezogen</i>. Ein Vorrat gehört immer <b>genau einem</b> Bewohner.
* <p>
* Die Antwort kann ganz unterschiedlich ausfallen:
* <ol>
* <li>Wenn eine Darreichung zu <b>einem früheren Zeitpunkt</b> schonmal zu einem Vorrat zugeordnet war, <b>dann wird diese jetzt wieder</b> zugeordnet. Fall erledigt.</li>
* <li>Trifft Punkt 1 nicht zu, dann suchen wir alle Vorräte, die Darreichungen enthalten mit einer passenden PrinterForm. Passend heisst hier entweder dieselbe PrinterForm oder eine
* äquivalente PrinterForm (z.B. Tabletten sind zu Dragees gleichwertig wie zu Filmtabletten etc.).</li>
* </ol>
*
* @param resident
* @param tradeform
* @return
* @see #getInventory4TradeForm(entity.info.Resident, TradeForm)
*/
public static List<MedInventory> getSuitableInventoriesForThisTradeForm(Resident resident, TradeForm tradeform) {
EntityManager em = OPDE.createEM();
List<MedInventory> liste;
// 1. PrinterForm der gesuchten darreichung bestimmen.
DosageForm meineForm = tradeform.getDosageForm();
// 2. Alle äquivalenten Formen dazu finden
List<DosageForm> aehnlicheFormen;
if (meineForm.getSameAs() != 0) {
Query query = em.createQuery("SELECT m FROM DosageForm m WHERE m.sameas = :equiv");
query.setParameter("equiv", meineForm.getSameAs());
aehnlicheFormen = query.getResultList();
} else {
aehnlicheFormen = new ArrayList<DosageForm>();
aehnlicheFormen.add(meineForm);
}
// 3. Anhand der Bestände die passenden Vorräte ermitteln
Query queryVorraete = em.createQuery(" " +
" SELECT DISTINCT b.inventory FROM MedStock b " +
" WHERE b.inventory.resident = :resident " +
" AND b.inventory.to = :to " +
" AND b.tradeform.dosageForm.id IN " +
" ( " + EntityTools.getIDList(aehnlicheFormen) + " ) "
);
queryVorraete.setParameter("resident", resident);
queryVorraete.setParameter("to", SYSConst.DATE_UNTIL_FURTHER_NOTICE);
liste = queryVorraete.getResultList();
em.close();
return liste;
}
/**
* returns a pair of integers. the first one stands for the days. if there are more than 7 days then the second integer is used as the weeks figure.
* the days are set to 0 then.
*
* @param tradeForm
* @return
*/
public static Pair<Integer, Integer> getExpiresIn(TradeForm tradeForm) {
// expires after being opened
if (tradeForm.getDaysToExpireAfterOpened() == null) {
return null;
} else {
int days = tradeForm.getDaysToExpireAfterOpened();
int weeks = 0;
if (days >= 7) {
weeks = days / 7;
days = 0;
}
return new Pair<Integer, Integer>(days, weeks);
}
}
public static String getExpiresInAsString(TradeForm tradeForm) {
Pair<Integer, Integer> pair = getExpiresIn(tradeForm);
// expires after being opened
if (pair == null) {
return "";
} else {
int days = pair.getFirst();
int weeks = pair.getSecond();
return weeks > 0 ? weeks + " " + SYSTools.xx("misc.msg.weeks") : days + " " + SYSTools.xx("misc.msg.Days");
}
}
}