ch.medshare.mediport.MediportOutputter.java Source code

Java tutorial

Introduction

Here is the source code for ch.medshare.mediport.MediportOutputter.java

Source

/*******************************************************************************
 * 2.12.2008, T. Schaller (moved from immis code in V1.3.4)
 *    
 *******************************************************************************/

package ch.medshare.mediport;

import java.io.File;
import java.io.IOException;
import java.util.Collection;
import java.util.List;
import java.util.Properties;
import java.util.Vector;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.dialogs.ErrorDialog;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.operation.IRunnableWithProgress;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.ui.PlatformUI;
import org.eclipse.ui.progress.IProgressService;
import org.jdom.Element;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import ch.elexis.TarmedRechnung.XMLExporterUtil;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.interfaces.IRnOutputter;
import ch.elexis.core.data.util.ResultAdapter;
import ch.elexis.core.ui.preferences.SettingsPreferenceStore;
import ch.elexis.core.ui.util.Log;
import ch.elexis.core.ui.util.SWTHelper;
import ch.elexis.data.Fall;
import ch.elexis.data.Kontakt;
import ch.elexis.data.Mandant;
import ch.elexis.data.Rechnung;
import ch.elexis.data.RnStatus;
import ch.elexis.data.RnStatus.REJECTCODE;
import ch.elexis.tarmedprefs.TarmedRequirements;
import ch.medshare.mediport.config.Client;
import ch.medshare.mediport.config.ClientParam;
import ch.medshare.mediport.config.ConfigKeys;
import ch.medshare.mediport.config.MPCProperties;
import ch.medshare.mediport.util.MediPortHelper;
import ch.medshare.util.UtilFile;
import ch.rgw.tools.ExHandler;
import ch.rgw.tools.Result;

public class MediportOutputter extends ch.elexis.TarmedRechnung.XMLExporter {

    protected static String TIER_PAYANT = "TP";
    protected static String TIER_GARANT = "TG";

    private final static int OUTPUT_MEDIPORT = 0;
    private final static int OUTPUT_ALTERNATIVE = 1;
    private final static int OUTPUT_ERROR = 2;
    private static Logger log = LoggerFactory.getLogger(MediportOutputter.class);

    static Combo cbParamNames;

    private boolean alternativeRun = false;

    MPCProperties props = null;

    ClientParam selectedParam;

    SettingsPreferenceStore prefs = new SettingsPreferenceStore(CoreHub.globalCfg);

    public Control createSettingsControl(Composite parent) {
        Composite ret = new Composite(parent, SWT.NONE);
        ret.setLayout(new GridLayout(2, false));
        ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));

        MPCProperties props = getProperties();
        if (props != null) {
            Client client = MediPortHelper.getCurrentClient();
            if (client == null) {
                addMessage(ret, Messages.getString("MediportOutputter.error.msg1.NoMPCClient"), //$NON-NLS-1$
                        Messages.getString("MediportOutputter.error.msg2.NoMPCClient")); //$NON-NLS-1$
            } else {
                if (client.getParamNames().size() == 0) {
                    addMessage(ret, Messages.getString("MediportOutputter.error.msg1.NoMPCParam"), //$NON-NLS-1$
                            Messages.getString("MediportOutputter.error.msg2.NoMPCParam")); //$NON-NLS-1$
                } else {
                    Label lblParam = new Label(ret, SWT.NONE);
                    lblParam.setText(Messages.getString("MediportOutputter.lbl.Parameter")); //$NON-NLS-1$
                    cbParamNames = new Combo(ret, SWT.BORDER | SWT.READ_ONLY);
                    cbParamNames.setLayoutData(SWTHelper.getFillGridData(1, true, 1, false));

                    for (String name : client.getParamNames()) {
                        cbParamNames.add(name);
                    }
                    if (client.getParamNames().size() > 0) {
                        cbParamNames.select(0);
                    }

                    cbParamNames.setLayoutData(SWTHelper.getFillGridData(1, false, 1, false));

                    // new ErrorInvoiceForm(ret, SWT.NONE, client);
                }
            }
        } else {
            addMessage(ret, Messages.getString("MediportOutputter.error.msg1.NoMPCConfig"), //$NON-NLS-1$
                    Messages.getString("MediportOutputter.error.msg2.NoMPCConfig")); //$NON-NLS-1$
        }

        return ret;
    }

    @Override
    public Result<Rechnung> doOutput(final IRnOutputter.TYPE type, final Collection<Rechnung> rnn,
            final Properties props) {
        IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
        final Result<Rechnung> res = new Result<Rechnung>();

        final ClientParam param = getSelectedParam();
        if (param == null) {
            return res;
        }

        IRnOutputter alternativeAusgabe = null;
        if (!alternativeRun) {
            if (!clientParamsOk(param)) {
                return res;
            }
            String selectedOutput = prefs.getString(MediPortAbstractPrefPage.MPC_AUSGABE);
            if (selectedOutput != null) {
                // Alternative Ausgabe
                List<IRnOutputter> lo = MediPortHelper.getRnOutputter();
                for (IRnOutputter ro : lo) {
                    if (selectedOutput.equals(ro.getDescription())) {
                        alternativeAusgabe = ro;
                    }
                }
            }
        }
        final boolean alternativeIsMediPort = (alternativeAusgabe instanceof MediportOutputter);

        final Collection<Rechnung> alternativeRnn = new Vector<Rechnung>();

        try {
            progressService.runInUI(PlatformUI.getWorkbench().getProgressService(), new IRunnableWithProgress() {
                @Override
                public void run(final IProgressMonitor monitor) {
                    monitor.beginTask(Messages.getString("MediportOutputter.info.exportiereRechnungen"), //$NON-NLS-1$
                            rnn.size());

                    Log log = Log.get("MediPortOutputter");

                    for (Rechnung rn : rnn) {
                        // getSenderEAN(rn.getMandant());

                        boolean isMediPortParticipant = partnerInfoContainsEan(getRecipientEAN(rn));
                        boolean fromDefaultOutputter = "asDefault"
                                .equals(props.getProperty(IRnOutputter.PROP_OUTPUT_METHOD));

                        // Ausgabe Varianten:
                        // Outputter | MediPort Teilnehmer | MediPort ist Alternative | Ausgabe
                        // nach
                        // Mediport | Ja | Ja | MediPort
                        // Mediport | Ja | Nein | MediPort
                        // Mediport | Nein | Ja | MediPort
                        // Mediport | Nein | Nein | Error
                        // Fall Standard | Ja | Ja | MediPort
                        // Fall Standard | Ja | Nein | MediPort
                        // Fall Standard | Nein | Ja | MediPort
                        // Fall Standard | Nein | Nein | Alternative Ausgabe
                        int outputMethod = 0;
                        if (!fromDefaultOutputter && !isMediPortParticipant && !alternativeIsMediPort)
                            outputMethod = OUTPUT_ERROR;
                        if (fromDefaultOutputter && !isMediPortParticipant && !alternativeIsMediPort)
                            outputMethod = OUTPUT_ALTERNATIVE;

                        log.log("doLicensedOutput: rn.getNr()=" + rn.getNr() + "; getRecipientEAN(rn)="
                                + getRecipientEAN(rn) + "; TarmedRequirements.getEAN(getKostentraeger(rn))="
                                + TarmedRequirements.getEAN(getKostentraeger(rn))
                                + "; partnerInfoContainsEan(getRecipientEAN(rn))="
                                + partnerInfoContainsEan(getRecipientEAN(rn)) + "; isMediPortParticipant="
                                + isMediPortParticipant + "; fromDefaultOutputter=" + fromDefaultOutputter
                                + "; alternativeRun=" + alternativeRun + "; alternativeIsMediPort="
                                + alternativeIsMediPort + "; outputMethod=" + outputMethod, Log.DEBUGMSG);

                        if (outputMethod == OUTPUT_ALTERNATIVE) {
                            log.log("MediPortOutputter.doLicensedOutput: alternativeRun=" + alternativeRun,
                                    Log.DEBUGMSG);
                            alternativeRnn.add(rn);
                        }

                        if (outputMethod == OUTPUT_ERROR) {
                            log.log("MediPortOutputter.doLicensedOutput: isMediPortParticipant="
                                    + isMediPortParticipant, Log.DEBUGMSG);
                            String errorMsg = Messages.getString("MediportOutputter.error.NotMediPortParticipant"); //$NON-NLS-1$
                            if (rn.getStatus() == RnStatus.OFFEN) {
                                rn.reject(REJECTCODE.INTERNAL_ERROR, errorMsg);
                            } else {
                                String title = Messages.getString("MediportOutputter.error.Rechnung"); //$NON-NLS-1$
                                title = title + " " + rn.getNr();
                                MessageDialog.openError(new Shell(), title, errorMsg);
                            }
                        }

                        if (outputMethod == OUTPUT_MEDIPORT) {
                            String billFilenamePath = param.getDir() + File.separator + rn.getNr() + ".xml"; //$NON-NLS-1$
                            log.log("doLicensedOutput: rn.getNr()=" + rn.getNr() + "; billFilenamePath="
                                    + billFilenamePath, Log.DEBUGMSG);
                            if (checkTier(rn, param.getDocattr())) {
                                if (doExport(rn, billFilenamePath, type, true) == null) {
                                    res.add(Result.SEVERITY.ERROR, 1,
                                            Messages.getString("MediportOutputter.error.Rechnung") //$NON-NLS-1$
                                                    + rn.getNr(),
                                            rn, true);
                                }
                            } else {
                                String errorMsg = Messages.getString("MediportOutputter.error.WrongTier"); //$NON-NLS-1$
                                if (rn.getStatus() == RnStatus.OFFEN) {
                                    rn.reject(REJECTCODE.INTERNAL_ERROR, errorMsg);
                                } else {
                                    String title = Messages.getString("MediportOutputter.error.Rechnung"); //$NON-NLS-1$
                                    title = title + " " + rn.getNr();
                                    MessageDialog.openError(new Shell(), title, errorMsg);
                                }
                            }
                            log.log("MediPortOutputter.doLicensedOutput: rn.getStatus()=" + rn.getStatus(),
                                    Log.DEBUGMSG);
                            if (rn.getStatus() == RnStatus.FEHLERHAFT) {
                                res.add(Result.SEVERITY.ERROR, 1,
                                        Messages.getString("MediportOutputter.error.Rechnung") //$NON-NLS-1$
                                                + rn.getNr(),
                                        rn, true);
                            }
                            monitor.worked(1);
                            if (monitor.isCanceled()) {
                                break;
                            }
                        }
                        monitor.done();
                    }
                }
            }, null);

            Log log = Log.get("MediPortOutputter");
            if (alternativeAusgabe != null && alternativeRnn.size() > 0) {
                boolean abort = false;
                log.log("doLicensedOutput: alternativeAusgabe.doOutput alternativeRnn.size()="
                        + alternativeRnn.size() + "; type=" + type.toString(), Log.DEBUGMSG);
                if (alternativeAusgabe instanceof MediportOutputter) {
                    ((MediportOutputter) alternativeAusgabe).setAlternative();
                } else {
                    final IRnOutputter iro = alternativeAusgabe;
                    SWTHelper.SimpleDialog dlg = new SWTHelper.SimpleDialog(new SWTHelper.IControlProvider() {
                        @Override
                        public Control getControl(Composite parent) {
                            parent.getShell().setText(iro.getDescription());
                            return (Control) iro.createSettingsControl(parent);

                        }

                        @Override
                        public void beforeClosing() {
                            iro.saveComposite();
                        }
                    });
                    if (dlg.open() != Dialog.OK) {
                        abort = true;
                    }
                }
                if (!abort) {
                    alternativeAusgabe.doOutput(type, alternativeRnn, props);
                }
            }
        } catch (Exception ex) {
            ExHandler.handle(ex);
            res.add(Result.SEVERITY.ERROR, 2, ex.getMessage(), null, true);
        }

        if (!res.isOK()) {
            ErrorDialog.openError(null, Messages.getString("MediportOutputter.error.Output"), //$NON-NLS-1$
                    Messages.getString("MediportOutputter.error.MediPortTransmit"), //$NON-NLS-1$
                    ResultAdapter.getResultAsStatus(res));
        }

        return res;
    }

    @Override
    public boolean canStorno(final Rechnung rn) {
        // 26.11.2008 ts:
        // Storno ist jetzt fr TP grundstzlich untersttzt
        // Offen bleibt aber die Frage zu Stornos bei TG
        // Nach Rcksprache mit MediData (Jan Gehrig) ist Storno von MediData gar nicht empfohlen.
        // Wir bauen das also vorderhand nicht ein.
        return false;
    }

    @Override
    public String getDescription() {
        return Messages.getString("MediportOutputter.description.MediPortTransmit"); //$NON-NLS-1$
    }

    @Override
    public void saveComposite() {
        super.saveComposite();
        String paramName = null;
        if (cbParamNames != null && !cbParamNames.isDisposed()) {
            if (cbParamNames.getSelectionIndex() >= 0) {
                paramName = cbParamNames.getItem(cbParamNames.getSelectionIndex());
            }
            selectedParam = MediPortHelper.getCurrentParam(paramName);
        }
    }

    @Override
    protected String getIntermediateEAN(final Fall fall) {
        String retVal = prefs.getString(MediPortAbstractPrefPage.MPC_INTERMEDIAER_EAN);
        if (retVal == null) {
            retVal = super.getIntermediateEAN(fall);
        }
        return retVal;
    }

    @Override
    protected String getRole(final Fall fall) {
        String retVal = prefs.getString(MediportMainPrefPage.MPC_SERVER);
        if (retVal == null) {
            retVal = super.getRole(fall);
        }
        return retVal;
    }

    @Override
    protected Element buildGuarantor(Kontakt garant, Kontakt patient) {
        // Hinweis:
        // XML Standard: http://www.forum-datenaustausch.ch/mdinvoicerequest_xml4.00_v1.2_d.pdf
        // Dort steht beim Feld 11310: Gesetzlicher Vertreter des Patienten.
        Element guarantor = new Element("guarantor", XMLExporter.nsinvoice);
        guarantor.addContent(XMLExporterUtil.buildAdressElement(patient, true)); // use "Anschrift" instead of
        // contact details (e.g. for
        // "gesetzliche Vertretung")
        return guarantor;
    }

    @Override
    protected String getSenderEAN(Mandant actMandant) {
        String senderEan = null;
        MPCProperties props = getProperties();
        if (props != null) {
            Client client = MediPortHelper.getCurrentClient();
            senderEan = client.getEan();
        }
        if (senderEan == null) {
            senderEan = TarmedRequirements.getEAN(actMandant);
        }
        return senderEan;
    }

    private MPCProperties getProperties() {
        if (props == null) {
            try {
                props = MPCProperties.getCurrent();
            } catch (IOException e) {
                log.warn(e.getMessage());
            }
        }
        return props;
    }

    private void addMessage(Composite parent, String msg1, String msg2) {
        Label lblConfigError1 = new Label(parent, SWT.NONE);
        lblConfigError1.setText(msg1);
        Label lblConfigError2 = new Label(parent, SWT.NONE);
        lblConfigError2.setText(msg2);
    }

    private ClientParam getSelectedParam() {
        if (selectedParam == null) {
            SWTHelper.SimpleDialog dlg = new SWTHelper.SimpleDialog(new SWTHelper.IControlProvider() {
                @Override
                public Control getControl(Composite parent) {
                    parent.getShell().setText(getDescription());
                    return createSettingsControl(parent);
                }

                @Override
                public void beforeClosing() {
                    saveComposite();
                }
            });
            if (dlg.open() != Dialog.OK) {
                return null;
            }
        }
        return selectedParam;
    }

    private boolean clientParamsOk(ClientParam param) {
        if (param == null) {
            MessageDialog.openError(new Shell(), getDescription(),
                    Messages.getString("MediportOutputter.error.msg.unknownParameter")); //$NON-NLS-1$
            return false;
        }

        String message = null;

        MPCProperties props = getProperties();
        if (props != null) {
            String serverIp = props.getProperty(ConfigKeys.MEDIPORT_IP);
            if (MediportMainPrefPage.VALUE_SERVER_URL_TEST.equals(serverIp)) {
                message = Messages.getString("MediportOutputter.info.testServer"); //$NON-NLS-1$
            } else if (MediportMainPrefPage.LBL_SERVER_TEST
                    .equals(prefs.getString(MediportMainPrefPage.MPC_SERVER))) {
                message = Messages.getString("MediportOutputter.info.test"); //$NON-NLS-1$
            }
        }

        if (message != null) {
            return MessageDialog.openQuestion(new Shell(), getDescription(),
                    message + "\n" + Messages.getString("MediportOutputter.question.Fortfahren")); //$NON-NLS-1$ //$NON-NLS-2$
        }

        return true;
    }

    // private String getSenderEAN(Rechnung rn){
    // String senderEan = null;
    // MPCProperties props = getProperties();
    // if (props != null) {
    // Client client = MediPortHelper.getCurrentClient();
    // senderEan = client.getEan();
    // }
    // if (senderEan == null) {
    // senderEan = TarmedRequirements.getEAN(rn.getMandant());
    // }
    // return senderEan;
    // }

    private String getRecipientEAN(Rechnung rn) {
        String retVal = TarmedRequirements.getRecipientEAN(getKostentraeger(rn));
        if (retVal.equals("unknown")) {
            retVal = TarmedRequirements.getEAN(getKostentraeger(rn));
        }
        return retVal;
    }

    private boolean partnerInfoContainsEan(String ean) {
        final Client client = MediPortHelper.getCurrentClient();
        if (client != null) {
            log.debug("partnerInfoContainsEan: client.getPartner_file()=" + client.getPartner_file());
            File partnerInfoFile = new File(client.getPartner_file());
            if (partnerInfoFile.exists()) {
                String content;
                try {
                    content = UtilFile.readTextFile(partnerInfoFile.getAbsolutePath());
                    log.debug("partnerInfoContainsEan: ean=" + ean + "; content.indexOf(ean)="
                            + content.indexOf(ean));
                    // log.log("----- content -----------", Log.DEBUGMSG);
                    // log.log(content, Log.DEBUGMSG);
                    // log.log("----- end of content -----------", Log.DEBUGMSG);
                    return content.indexOf(ean) >= 0;
                } catch (IOException e) {
                    log.warn(e.getMessage());
                }

            }
        }

        log.debug("partnerInfoContainsEan: return false");
        return false;
    }

    private boolean checkTier(Rechnung rn, String mediPortTiers) {
        String tierRn = getTier(rn);
        String tierMP = "XX";
        if (MediPortAbstractPrefPage.TIER_PAYANT.equals(mediPortTiers)) {
            tierMP = TIER_PAYANT;
        } else if (MediPortAbstractPrefPage.TIER_GARANT_MANUELL.equals(mediPortTiers)) {
            tierMP = TIER_GARANT;
        } else if (MediPortAbstractPrefPage.TIER_GARANT_DIRECT.equals(mediPortTiers)) {
            tierMP = TIER_GARANT;
        }
        return (tierRn == tierMP);
    }

    private void setAlternative() {
        this.alternativeRun = true;
    }

    private Kontakt getKostentraeger(Rechnung rn) {
        Fall tempFall = rn.getFall();
        Kontakt tempPatient = tempFall.getPatient();

        Kontakt kostentraeger = tempFall.getRequiredContact(TarmedRequirements.INSURANCE);
        Kontakt rnAdressat = tempFall.getGarant();

        if (kostentraeger == null || !kostentraeger.isValid()) {
            kostentraeger = rnAdressat;
        }

        if (kostentraeger == null) {
            kostentraeger = tempPatient;
        }

        return kostentraeger;
    }

    /**
     * We try to figure out whether we should use Tiers Payant or Tiers Garant. if unsure, we make
     * it TG
     */
    private String getTier(Rechnung rn) {
        Fall tempFall = rn.getFall();

        Kontakt kostentraeger = tempFall.getRequiredContact(TarmedRequirements.INSURANCE);
        Kontakt rnAdressat = tempFall.getGarant();
        String tiers = TIER_GARANT;

        if ((kostentraeger != null) && (kostentraeger.isValid())) {
            if (rnAdressat.equals(kostentraeger)) {
                tiers = TIER_PAYANT;
            } else {
                tiers = TIER_GARANT;
            }
        } else {
            tiers = TIER_GARANT;
        }

        return tiers;
    }

}