/*******************************************************************************
* Copyright (c) 2006-2016, 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
* M. Descher - extracted from elexis main and adapted for usage
* <office@medevit.at> - 3.2 format introduction (products and items)
*******************************************************************************/
package ch.elexis.core.eigenartikel;
import static ch.elexis.core.model.eigenartikel.Constants.FLD_EXT_HI_COST_ABSORPTION;
import static ch.elexis.core.model.eigenartikel.Constants.FLD_EXT_MEASUREMENT_UNIT;
import static ch.elexis.core.model.eigenartikel.Constants.*;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import ch.elexis.core.constants.StringConstants;
import ch.elexis.core.data.activator.CoreHub;
import ch.elexis.core.data.util.IRunnableWithProgress;
import ch.elexis.core.model.eigenartikel.Constants;
import ch.elexis.core.model.eigenartikel.EigenartikelTyp;
import ch.elexis.data.Artikel;
import ch.elexis.data.PersistentObject;
import ch.elexis.data.Query;
import ch.rgw.tools.JdbcLink;
import ch.rgw.tools.Money;
public class Eigenartikel extends Artikel {
static {
final String isConvertedTo32Key = "Eigenartikel32Format";
boolean converted = CoreHub.globalCfg.get(isConvertedTo32Key, false);
if (!converted) {
log.info("Migrating Eigenartikel to v3.2");
IRunnableWithProgress irwp = new IRunnableWithProgress() {
@Override
public void run(IProgressMonitor monitor)
throws InvocationTargetException, InterruptedException{
EigenartikelDatabaseConverter.performConversionTo32Format(monitor);
}
};
PersistentObject.cod.showProgress(irwp);
CoreHub.globalCfg.set(isConvertedTo32Key, true);
}
transferAllStockInformationToNew32StockModel(new Query<Eigenartikel>(Eigenartikel.class),
Eigenartikel.class);
}
public static final String TYPNAME = Constants.TYPE_NAME;
public Eigenartikel(final String articleName, final String productName){
create(null);
set(new String[] {
FLD_NAME, EIGENNAME, FLD_TYP
}, new String[] {
articleName, productName, TYPNAME
});
}
@Override
protected String getConstraint(){
return new StringBuilder(Artikel.FLD_TYP).append(Query.EQUALS)
.append(JdbcLink.wrap(TYPNAME)).toString();
}
protected void setConstraint(){
set(Artikel.FLD_TYP, TYPNAME);
}
@Override
public String getCodeSystemName(){
return TYPNAME;
}
@Override
public String getLabel(){
String name = get(Artikel.FLD_NAME);
if (!isProduct()) {
name += StringConstants.SPACE + getPackageSizeLabel();
}
return name;
}
@Override
public String getCode(){
return get(Artikel.FLD_SUB_ID);
}
public String getGroup(){
return checkNull(get(Artikel.FLD_CODECLASS));
}
public static Eigenartikel load(String id){
return new Eigenartikel(id);
}
protected Eigenartikel(){}
protected Eigenartikel(String id){
super(id);
}
@Override
public boolean delete(){
if (isProduct()) {
List<Eigenartikel> packages = getPackages();
for (Eigenartikel p : packages) {
p.delete();
}
}
return super.delete();
}
@Override
public boolean isProduct(){
String extId = get(FLD_EXTID);
return (extId == null || extId.length() == 0);
}
@Override
public boolean isDragOK(){
return true;
}
@Override
public String getInternalName(){
return getLabel();
}
@Override
public VatInfo getVatInfo(){
EigenartikelTyp eat = getTyp();
switch (eat) {
case PHARMA:
case MAGISTERY:
return VatInfo.VAT_CH_ISMEDICAMENT;
case NONPHARMA:
return VatInfo.VAT_CH_NOTMEDICAMENT;
default:
break;
}
return VatInfo.VAT_NONE;
}
/**
* Synchronizes a products description with is "child" packages and adds as package to product
*
* @param product
* @param eaPackage
* if <code>null</code> all current children are fetched and updated, if an
* Eigenartikel is provided it is added as a package
*/
public static void copyProductAttributesToArticleSetAsChild(Eigenartikel product,
Eigenartikel eaPackage){
List<Eigenartikel> eaPackages = new ArrayList<Eigenartikel>();
if (eaPackage != null) {
eaPackages.add(eaPackage);
} else {
Query<Eigenartikel> qre = new Query<Eigenartikel>(Eigenartikel.class);
qre.add(Eigenartikel.FLD_EXTID, Query.EQUALS, product.getId());
eaPackages.addAll(qre.execute());
}
for (Eigenartikel ea : eaPackages) {
String[] keys = new String[] {
FLD_EXTID, FLD_CODECLASS, FLD_ATC_CODE, FLD_TYP, FLD_NAME,
};
String[] values = new String[] {
product.getId(), product.get(FLD_CODECLASS), product.getATC_code(),
product.get(FLD_TYP), product.getName()
};
ea.set(keys, values);
}
}
public String getPackageSizeLabel(){
if (getPackageSizeString() != null && getPackageSizeString().length() > 0) {
return getPackageSizeString();
} else if (getPackageSize() != null && getMeasurementUnit() != null) {
return getPackageSize() + " " + getMeasurementUnit();
} else if (getPackageSize() != null) {
return Integer.toString(getPackageSize());
}
return StringConstants.EMPTY;
}
/**
*
* @return all {@link Eigenartikel} packages belonging to this product, if {@link #isProduct()}
*/
public List<Eigenartikel> getPackages(){
if (isProduct()) {
Query<Eigenartikel> qbe = new Query<Eigenartikel>(Eigenartikel.class);
qbe.add(Eigenartikel.FLD_EXTID, Query.EQUALS, getId());
return qbe.execute();
}
return Collections.emptyList();
}
public EigenartikelTyp getTyp(){
String value = get(Artikel.FLD_CODECLASS);
return EigenartikelTyp.byCharSafe(value);
}
public void setTyp(EigenartikelTyp type){
set(Artikel.FLD_CODECLASS, Character.toString(type.getTypeChar()));
}
/**
*
* @param value
* @return a positive Integer (natural number) or <code>null</code>
*/
private Integer returnNaturalNumberIntegerOrNull(int value){
if (value > 0) {
return Integer.valueOf(value);
}
return null;
}
private int getNaturalIntOrZeroIfNull(Integer intVal){
if (intVal == null) {
return 0;
}
return intVal.intValue();
}
public Integer getPackageSize(){
return returnNaturalNumberIntegerOrNull(getPackungsGroesse());
}
public void setPackageSize(Integer packageSize){
setPackungsGroesse(getNaturalIntOrZeroIfNull(packageSize));
}
public void setPackageSizeString(String pss){
setExtInfoStoredObjectByKey(FLD_EXT_PACKAGE_SIZE_STRING, pss);
}
public String getPackageSizeString(){
return (String) getExtInfoStoredObjectByKey(FLD_EXT_PACKAGE_SIZE_STRING);
}
public String getSellUnit(){
return (String) getExtInfoStoredObjectByKey(FLD_EXT_SELL_UNIT);
}
public void setSellUnit(String sellUnit){
setExtInfoStoredObjectByKey(FLD_EXT_SELL_UNIT, sellUnit);
}
public void setMeasurementUnit(String mu){
setExtInfoStoredObjectByKey(FLD_EXT_MEASUREMENT_UNIT, mu);
}
public String getMeasurementUnit(){
return (String) getExtInfoStoredObjectByKey(FLD_EXT_MEASUREMENT_UNIT);
}
public String getExfPrice(){
return getEKPreis().getCentsAsString();
}
public void setExfPrice(String exfPrice){
Money m = new Money();
m.addCent(exfPrice);
setEKPreis(m);
}
@Override
public String getPharmaCode(){
return get(FLD_SUB_ID);
}
@Override
public void setPharmaCode(String pharmacode){
set(FLD_SUB_ID, pharmacode);
}
public String getPubPrice(){
return getVKPreis().getCentsAsString();
}
public void setPubPrice(String pubPrice){
Money m = new Money();
m.addCent(pubPrice);
setVKPreis(m);
}
public boolean isHealthInsuranceCostAbsorption(){
return Boolean.valueOf((String) getExtInfoStoredObjectByKey(FLD_EXT_HI_COST_ABSORPTION));
}
public void setHealthInsuranceCostAbsorption(boolean hica){
setExtInfoStoredObjectByKey(FLD_EXT_HI_COST_ABSORPTION, Boolean.toString(hica));
}
public boolean isValidPackage(){
String extId = get(FLD_EXTID);
return (Eigenartikel.load(extId).isValid());
}
}