/******************************************************************************* * Copyright (c) 2006-2011, G. Weirich and Elexis * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * G. Weirich - initial implementation * G. Weirich 1/08 - major redesign to implement IGM updates etc. * *******************************************************************************/ package ch.elexis.artikel_ch.data; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStreamReader; import java.util.Iterator; import java.util.List; import java.util.Map; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.swt.widgets.Composite; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import ch.elexis.core.ui.util.ImporterPage; import ch.elexis.core.ui.util.SWTHelper; import ch.elexis.data.Artikel; import ch.elexis.data.PersistentObject; import ch.elexis.data.Query; import ch.rgw.tools.Log; /** * Importing articles from an IGM-10 or IGM-11 file. * * @author Gerry * */ public class MedikamentImporter extends ImporterPage { public static final String MWST_TYP = "MWSt-Typ"; //$NON-NLS-1$ private static final String HERSTELLER = "Hersteller"; //$NON-NLS-1$ private static final String LAGERART = "Lagerart"; //$NON-NLS-1$ public static final String KASSENTYP = "Kassentyp"; //$NON-NLS-1$ private static final String EMPTY_PHARMACODE = "0000000"; final static String MEDIKAMENT = "Medikament"; //$NON-NLS-1$ final static String MEDICAL = "Medical"; //$NON-NLS-1$ // Button bClear; // boolean bDelete; public MedikamentImporter(){} @SuppressWarnings("unchecked") @Override public IStatus doImport(final IProgressMonitor monitor) throws Exception{ File file = new File(results[0]); long l = file.length(); InputStreamReader ir = new InputStreamReader(new FileInputStream(file), "iso-8859-1"); //$NON-NLS-1$ BufferedReader br = new BufferedReader(ir); String in; String mode = Messages.MedikamentImporter_ModeOfImport; /* * if(bDelete==true){ if(SWTHelper.askYesNo("Wirklich Daten löschen", "Achtung: Wenn die * alten Daten gelöscht werden, kann es\nsein, dass bestehende Bezüge ungültig werden.")){ * PersistentObject.getConnection().exec("DELETE FROM ARTIKEL WHERE TYP='Medikament'"); * mode=" (Modus: Alles neu erstellen)"; } } */ monitor .beginTask(Messages.MedikamentImporter_MedikamentImportTitle + mode, (int) (l / 100)); Query<Artikel> qbe = new Query<Artikel>(Artikel.class); int counter = 0; int createdCount = 0; int updatedCount = 0; int lineNo = 0; String titel, ek, vk, kasse, cmws; while ((in = br.readLine()) != null) { lineNo++; // Recordart (RECA) - 2stellig // 11: Stamm-Satz (mit Mehrwertsteuer-Code) String reca = new String(in.substring(0, 2)); // Mutationscode (CMUT) - 1stellig // 1: Datensatz (Artikel) neu (im Handel) // 2: Datensatz (Artikel) Update // 3: Datensatz (Artikel) ausser Handel String cmut = new String(in.substring(2, 3)); // Pharmacode (PHAR) - 7stellig String phar = new String(in.substring(3, 10)).trim(); // EAN - 13stellig String ean = new String(in.substring(83, 96)); // EAN String eanCode = null; // String ckzl = new String(in.substring(7,8)); // Kassenpflicht String pk = null; //$NON-NLS-1$ try { long pkl = Long.parseLong(phar); // führende Nullen entfernen if (pkl > 0) pk = Long.toString(pkl); } catch (NumberFormatException ex) {} try { long eank = Long.parseLong(ean); if (eank > 0) eanCode = Long.toString(eank); } catch (NumberFormatException ex) {} if (pk == null && eanCode == null) { log.log(Messages.MedikamentImporter_BadArticleEntry + lineNo, Log.ERRORS); continue; } // String id=qbe.findSingle(SUBID, EQUALS, pk); qbe.clear(); if (!(pk == null)) { qbe.add(Artikel.FLD_SUB_ID, Query.EQUALS, pk); qbe.or(); qbe.add(Artikel.FLD_SUB_ID, Query.EQUALS, phar); } else { qbe.add(Artikel.FLD_EAN, Query.EQUALS, ean); qbe.or(); qbe.add(Artikel.FLD_EAN, Query.EQUALS, eanCode); } List<Artikel> lArt = qbe.execute(); if (lArt.size() > 1) { // Duplikate entfernen, genau einen gültigen und existierenden // Artikel behalten Iterator<Artikel> it = lArt.iterator(); boolean hasValid = false; while (it.hasNext()) { Artikel ax = it.next(); if (hasValid || (!ax.isValid())) { it.remove(); } else { hasValid = true; } } } Artikel a = lArt.size() > 0 ? lArt.get(0) : null; if ((a == null) || (!a.exists())) { if (cmut.equals("3") || (!reca.equals("11"))) { //$NON-NLS-1$ //$NON-NLS-2$ // ausser handel oder kein Stammsatz monitor.worked(1); continue; // Dann Artikel nicht neu erstellen, falls er // nicht existiert } } else { if (cmut.equals("3")) { // Wenn er existiert, muss er gelöscht //$NON-NLS-1$ // werden a.delete(); monitor.worked(1); updatedCount++; continue; } } if (reca.equals("11")) { titel = new String(in.substring(10, 60)).trim(); // Text ek = new String(in.substring(60, 66)).trim(); // EK-Preis vk = new String(in.substring(66, 72)).trim(); // VK-Preis kasse = new String(in.substring(72, 73)); // Kassentyp String lager = new String(in.substring(73, 75)); // Lagerart String hix = new String(in.substring(75, 76)); // iks-listencode String ithe = new String(in.substring(76, 83)); // index // therapeuticus // Code Mehrwertsteuer (CMWS) - 1stellig // 1: voller MWSt-Satz (zur Zeit 6.5%) // 2: reduzierter MWSt-Satz (zur Zeit 2%) // 3: von der MWSt befreit cmws = new String(in.substring(96, 97)); // MWSt-Typ if (a == null) { if (cmws.equals("1")) { //$NON-NLS-1$ a = new Artikel(titel, MEDICAL, (pk == null) ? EMPTY_PHARMACODE : pk); a.set(Artikel.FLD_KLASSE, Medical.class.getName()); } else { a = new Artikel(titel, MEDIKAMENT, (pk == null) ? EMPTY_PHARMACODE : pk); a.set(Artikel.FLD_KLASSE, Medikament.class.getName()); } createdCount++; } else { updatedCount++; } if (vk.matches("0+")) { //$NON-NLS-1$ a.set(Artikel.FLD_EK_PREIS, ek); a.set(Artikel.FLD_EAN, ean); } else { String[] fields = { Artikel.FLD_EK_PREIS, Artikel.FLD_VK_PREIS, Artikel.FLD_EAN }; a.set(fields, ek, vk, ean); } Map ext = a.getMap(Artikel.FLD_EXTINFO); ext.put(Artikel.FLD_PHARMACODE, (pk == null) ? EMPTY_PHARMACODE : pk); ext.put(KASSENTYP, kasse); ext.put(LAGERART, lager); ext.put(HERSTELLER, hix); ext.put(Artikel.FLD_EAN, ean); ext.put(MWST_TYP, cmws); a.setMap(Artikel.FLD_EXTINFO, ext); } else if (reca.equals("10")) { // Update-Satz //$NON-NLS-1$ ek = new String(in.substring(10, 16)); vk = new String(in.substring(16, 22)); kasse = new String(in.substring(22, 23)); cmws = new String(in.substring(23, 24)); if (vk.matches("0+")) { //$NON-NLS-1$ if(a!=null) { a.set(Artikel.FLD_EK_PREIS, ek); } else { log.log("a is null", Log.ERRORS); } } else { String[] fields = { Artikel.FLD_EK_PREIS, Artikel.FLD_VK_PREIS }; if(a!=null) { a.set(fields, ek, vk); } else { log.log("a is null", Log.ERRORS); } } updatedCount++; } else { SWTHelper.showError(Messages.MedikamentImporter_BadFileFormat, Messages.MedikamentImporter_OnlyIGM10AndIGM11); return Status.CANCEL_STATUS; } monitor.worked(1); if (monitor.isCanceled()) { monitor.done(); return Status.CANCEL_STATUS; } monitor.subTask((a!=null) ? a.getLabel() : "a is null"); a = null; in = null; if (counter++ > 1000) { // Speicher freigeben PersistentObject.clearCache(); System.gc(); Thread.sleep(100); counter = 0; } } monitor.done(); SWTHelper.showInfo(Messages.MedikamentImporter_SuccessTitel, String.format(Messages.MedikamentImporter_SuccessContent, createdCount, updatedCount)); return Status.OK_STATUS; } @Override public String getTitle(){ return Messages.MedikamentImporter_WindowTitleMedicaments; } @Override public String getDescription(){ return Messages.MedikamentImporter_PleaseChoseFile; } @Override public Composite createPage(final Composite parent){ Composite ret = new ImporterPage.FileBasedImporter(parent, this); ret.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true)); // bClear=new Button(parent,SWT.CHECK|SWT.WRAP); // bClear.setText("Alle Daten vorher löschen (VORSICHT! Bitte Anleitung // beachten)"); // bClear.setLayoutData(SWTHelper.getFillGridData(1,true,1,false)); return ret; } /* * @Override public void collect() { bDelete=bClear.getSelection(); super.collect(); } */ }