/*******************************************************************************
* Copyright (c) 2007-2008, 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
*
*******************************************************************************/
package ch.elexis.privatrechnung.data;
import java.io.File;
import java.io.FileReader;
import java.util.List;
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 au.com.bytecode.opencsv.CSVReader;
import ch.elexis.data.Query;
import ch.elexis.core.ui.util.ImporterPage;
import ch.elexis.core.ui.util.Log;
import ch.elexis.core.data.util.ResultAdapter;
import ch.elexis.core.importer.div.importers.ExcelWrapper;
import ch.elexis.core.ui.util.SWTHelper;
import ch.rgw.tools.ExHandler;
import ch.rgw.tools.Result;
import ch.rgw.tools.TimeTool;
/**
* A class to import codes from an external source to this code system. the external source must be
* an CSV or Excel(tm) file with the fields:
* parentCode,codeID,codeName,cost,price,time,validFrom,validUntil,factor
* <ul>
* <li>parentCode: If this code system is organized as tree: codeID of the parent or 'NIL' if this
* is a top level code. If this code system is a flat list, parentCode is always 'NIL'</li>
* <li>codeID: The (within this code system unique) identification of the code. e.g. 10.00.01 for al
* Tarmed-style system</li>
* <li>codeName: the human understandable name of the code</li>
* <li>cost: the internal cost of this service (what do we have to pay for it), in cents/Rp</li>
* <li>price: the external cost of this service (what have cliebnts to pay us for it), in cents/Rp</li>
* <li>time: the average time needed (in minutes) for this service
* <li>validFrom: the date as YYYYMMDD when this code with this price starts being valid</li>
* <li>validUntil: the date as YYYYMMDD when the validity of this entry expires</li>
* <li>factor: a multiplicator to apply to the price before calculating the end-user-price.
* Sometimes referred to as "Taxpunktwert"</li>
* </ul>
*
* Please note: the codeID needs not to be a unique key. instead we might have several entries with
* the same codeID, but different validity-dates and prices/factors. At a given date however, only
* one ellement of each code should be valid.
*
*
* This Importer will be displayed, when the user selects "Import" from the Details-View of the
* codes of this plugin
*/
public class Importer extends ImporterPage {
/**
* Create the page that will let the user select a file to import. For simplicity, we use the
* default FileBasedImporter of our superclass.
*/
@Override
public Composite createPage(final Composite parent){
FileBasedImporter fbi = new FileBasedImporter(parent, this);
fbi.setFilter(new String[] {
"*.csv", "*.xls", "*"
}, new String[] {
"Character Separated Values", "Microsoft Excel 97", "All Files"
});
fbi.setLayoutData(SWTHelper.getFillGridData(1, true, 1, true));
return fbi;
}
/**
* The import process starts when the user has selected a file and clicked "OK". Warning: We can
* not read fields of the page created in createPage here! (The page is already disposed when
* doImport is called). If we have to transfer field values between createPage and doImport, we
* must override collect(). Our file based importer saves the user input in results[0]
*/
@Override
public IStatus doImport(final IProgressMonitor monitor) throws Exception{
// PersistentObject.getConnection().exec("DROP TABLE " + Leistung.TABLENAME + ";");
// Leistung.createTable();
File file = new File(results[0]);
if (!file.canRead()) {
log.log("Can't read " + results[0], Log.ERRORS);
return new Status(Status.ERROR, "ch.elexis.privatrechnung", "Can't read " + results[0]);
}
Result<String> res;
if (results[0].endsWith(".xls")) {
res = importExcel(file.getAbsolutePath(), monitor);
;
} else if (results[0].endsWith(".csv")) {
res = importCSV(file.getAbsolutePath(), monitor);
} else {
return new Status(Status.ERROR, "ch.elexis.privatrechnung", "Unsupported file format");
}
if (res.isOK()) {
}
return ResultAdapter.getResultAsStatus(res);
}
/**
* return a description to display in the message area of the import dialog
*/
@Override
public String getDescription(){
return "Import aus CSV und Excel";
}
/**
* return a title to display in the title bar of the import dialog
*/
@Override
public String getTitle(){
return "Privatleistungen";
}
private Result<String> importExcel(final String file, final IProgressMonitor mon){
ExcelWrapper xl = new ExcelWrapper();
if (!xl.load(file, 0)) {
return new Result<String>(Result.SEVERITY.ERROR, 1, "Bad file format", file, true);
}
xl.setFieldTypes(new Class[] {
String.class, String.class, String.class, Integer.class, Integer.class, Integer.class,
TimeTool.class, TimeTool.class, Double.class
});
for (int i = xl.getFirstRow(); i <= xl.getLastRow(); i++) {
List<String> row = xl.getRow(i);
importLine(row.toArray(new String[0]));
}
return new Result<String>("OK");
}
private Result<String> importCSV(final String file, final IProgressMonitor mon){
try {
CSVReader cr = new CSVReader(new FileReader(file));
String[] line;
while ((line = cr.readNext()) != null) {
importLine(line);
}
return new Result<String>("OK");
} catch (Exception ex) {
ExHandler.handle(ex);
return new Result<String>(Result.SEVERITY.ERROR, 1, "Could not read " + file,
ex.getMessage(), true);
}
}
// parentCode 0,codeID 1,codeName 2,cost 3,price 4 ,time 5, validFrom
// 6,validUntil 7,factor 8
private void importLine(final String[] line){
if (line.length == 9) {
if (line[6].equals("")) {
line[6] = TimeTool.BEGINNING_OF_UNIX_EPOCH;
}
if (line[7].equals("")) {
line[7] = TimeTool.END_OF_UNIX_EPOCH;
}
Query<Leistung> qbe = new Query<Leistung>(Leistung.class);
qbe.add("Kuerzel", "=", line[1]);
List<Leistung> res = qbe.execute();
Leistung lst;
if (res.size() > 0) {
lst = res.get(0);
lst.set(new String[] {
"parent", "Name", "Kosten", "Preis", "Zeit", "DatumVon", "DatumBis"
}, line[0], line[2], line[3], line[4], line[5], line[6], line[7]);
} else {
new Leistung(null, line[0], line[2], line[1], line[3], line[4], line[5], line[6],
line[7]);
}
}
}
}