package ch.elexis.core.ui.medication.billing;
import java.util.List;
import java.util.Optional;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import ch.elexis.core.data.events.ElexisEventDispatcher;
import ch.elexis.core.data.interfaces.IVerrechenbar;
import ch.elexis.core.data.interfaces.IVerrechnetAdjuster;
import ch.elexis.core.model.prescription.EntryType;
import ch.elexis.data.Artikel;
import ch.elexis.data.Fall;
import ch.elexis.data.Konsultation;
import ch.elexis.data.Patient;
import ch.elexis.data.Prescription;
import ch.elexis.data.Query;
import ch.elexis.data.Verrechnet;
import ch.rgw.tools.Money;
import ch.rgw.tools.TimeTool;
public class PrescriptionVerrechnetAdjuster implements IVerrechnetAdjuster {
private ExecutorService executor = Executors.newSingleThreadExecutor();
@Override
public void adjust(Verrechnet verrechnet){
executor.submit(new Runnable() {
@Override
public void run(){
IVerrechenbar verrechenbar = verrechnet.getVerrechenbar();
if (verrechenbar instanceof Artikel) {
Artikel article = (Artikel)verrechenbar;
Optional<Patient> patientOpt = getPatient(verrechnet);
if(patientOpt.isPresent()) {
// lookup existing prescriptions
Query<Prescription> query = new Query<>(Prescription.class);
query.add(Prescription.FLD_ARTICLE, Query.EQUALS, article.storeToString());
query.add(Prescription.FLD_PATIENT_ID, Query.EQUALS,
patientOpt.get().getId());
List<Prescription> existingPrescriptions = query.execute();
// create new dispensation
boolean dispensationExists = false;
if (!existingPrescriptions.isEmpty()) {
// only create new dispensation if no dispensation on the same day
for (Prescription prescription : existingPrescriptions) {
if (prescription.getEntryType() == EntryType.SELF_DISPENSED) {
TimeTool prescriptionDate =
new TimeTool(prescription.getBeginDate());
TimeTool verrechnetDate = getVerrechnetDate(verrechnet);
if(prescriptionDate.isSameDay(verrechnetDate)) {
dispensationExists = true;
break;
}
}
}
}
if (!dispensationExists) {
createDispensationPrescription(article, patientOpt.get(), verrechnet);
ElexisEventDispatcher.reload(Prescription.class);
}
}
}
}
});
}
private Optional<Patient> getPatient(Verrechnet verrrechnet){
Konsultation konsultation = verrrechnet.getKons();
if (konsultation != null) {
Fall fall = konsultation.getFall();
if (fall != null) {
return Optional.of(fall.getPatient());
}
}
return Optional.empty();
}
private TimeTool getVerrechnetDate(Verrechnet verrrechnet){
Konsultation konsultation = verrrechnet.getKons();
return new TimeTool(konsultation.getDatum());
}
private Prescription createDispensationPrescription(Artikel article, Patient patient,
Verrechnet verrechnet){
Prescription prescription = new Prescription(article, patient, "", "");
prescription.setExtInfoStoredObjectByKey(Prescription.FLD_EXT_VERRECHNET_ID,
verrechnet.getId());
verrechnet.setDetail(Verrechnet.FLD_EXT_PRESC_ID, prescription.getId());
prescription.setEntryType(EntryType.SELF_DISPENSED);
prescription.stop(null);
return prescription;
}
@Override
public void adjustGetNettoPreis(Verrechnet verrechnet, Money price){
// TODO Auto-generated method stub
}
}