/*
* Copyright (C) 2014 GG-Net GmbH - Oliver Günther
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package eu.ggnet.dwoss.misc.op;
import eu.ggnet.dwoss.util.UserInfoException;
import eu.ggnet.dwoss.util.FileJacket;
import eu.ggnet.dwoss.progress.SubMonitor;
import eu.ggnet.dwoss.progress.MonitorFactory;
import eu.ggnet.dwoss.stock.assist.Stocks;
import eu.ggnet.dwoss.uniqueunit.entity.Product;
import eu.ggnet.dwoss.uniqueunit.eao.ProductEao;
import eu.ggnet.dwoss.uniqueunit.entity.UniqueUnit;
import eu.ggnet.dwoss.uniqueunit.eao.UniqueUnitEao;
import eu.ggnet.dwoss.uniqueunit.assist.UniqueUnits;
import eu.ggnet.lucidcalc.CCalcDocument;
import eu.ggnet.lucidcalc.LucidCalc;
import eu.ggnet.lucidcalc.CSheet;
import eu.ggnet.lucidcalc.STable;
import eu.ggnet.lucidcalc.CFormat;
import eu.ggnet.lucidcalc.TempCalcDocument;
import eu.ggnet.lucidcalc.STableModelList;
import eu.ggnet.lucidcalc.LucidCalcReader;
import eu.ggnet.lucidcalc.SUtil;
import eu.ggnet.lucidcalc.STableColumn;
import java.io.File;
import java.util.*;
import javax.ejb.Stateless;
import javax.inject.Inject;
import javax.persistence.EntityManager;
import org.slf4j.*;
import eu.ggnet.dwoss.mandator.api.value.Mandator;
import eu.ggnet.lucidcalc.jexcel.JExcelLucidCalcReader;
import eu.ggnet.dwoss.rules.SalesChannel;
import eu.ggnet.dwoss.stock.eao.StockUnitEao;
import lombok.Data;
import static eu.ggnet.lucidcalc.CFormat.FontStyle.*;
import static eu.ggnet.lucidcalc.CFormat.HorizontalAlignment.*;
import static eu.ggnet.lucidcalc.CFormat.VerticalAlignment.*;
import static java.awt.Color.*;
/**
*
* @author oliver.guenther
*/
@Stateless
public class ImageIdHandlerOperation implements ImageIdHandler {
@Data
public final static class ImageIdLine {
private final String partNo;
private final String group;
private final String brand;
private final String name;
private final Integer imageId;
}
private final static Logger L = LoggerFactory.getLogger(ImageIdHandlerOperation.class);
@Inject
@UniqueUnits
private EntityManager uuEm;
@Inject
@Stocks
private EntityManager stockEm;
@Inject
private MonitorFactory monitorFactory;
@Inject
private Mandator mandator;
@Override
public void importMissing(FileJacket inFile) throws UserInfoException {
final SubMonitor m = monitorFactory.newSubMonitor("Image Ids importieren", 100);
m.message("Reading File");
m.start();
LucidCalcReader reader = new JExcelLucidCalcReader();
reader.addColumn(0, String.class);
reader.addColumn(1, String.class);
reader.addColumn(2, String.class);
reader.addColumn(3, String.class);
reader.addColumn(4, Integer.class);
reader.setHeadline(true);
reader.setTrim(true);
File f = inFile.toTemporaryFile();
List<ImageIdLine> lines = reader.read(f, ImageIdLine.class);
List<String> errors = reader.getErrors();
ProductEao productEao = new ProductEao(uuEm);
m.message("Importing Data");
m.setWorkRemaining(lines.size());
for (ImageIdLine line : lines) {
m.worked(1, "importing " + line.getPartNo());
if ( line.getImageId() == null ) {
errors.add("No ImageId for " + line.getPartNo());
continue;
}
Product p = productEao.findByPartNo(line.getPartNo());
if ( p != null ) {
p.setImageId(line.getImageId());
} else {
errors.add("No Product for '" + line.getPartNo() + "'");
}
}
m.finish();
if ( !errors.isEmpty() ) throw new UserInfoException(errors);
}
/**
* Returns a FileJacket of XLS, which contains all Products with missing ImageIds.
* <p/>
* Acitve Filters are:
* <ul>
* <li>If SalesChannel is supplied, only Products, which have units in the SalesChannel.</li>
* <li>Only Products, which don't have an image id.</li>
* <li>Only Products, which have Unit in stock.</li>
* </ul>
* <p/>
* @param salesChannel
* @return
*/
@Override
public FileJacket exportMissing(SalesChannel salesChannel) {
SubMonitor m = monitorFactory.newSubMonitor("Fehlende Image Ids exportieren", 100);
m.message("Loading Missing IDs");
m.start();
List<Integer> uniqueUnitIds = new StockUnitEao(stockEm).findByNoLogicTransactionAsUniqueUnitId();
List<UniqueUnit> uniqueUnits = new UniqueUnitEao(uuEm).findByIds(uniqueUnitIds);
SortedSet<Product> products = new TreeSet<>();
for (UniqueUnit uniqueUnit : uniqueUnits) {
if ( uniqueUnit.getProduct() == null ) continue;
if ( salesChannel != null && uniqueUnit.getSalesChannel() != salesChannel ) continue;
if ( uniqueUnit.getProduct().getImageId() > 0 ) continue;
products.add(uniqueUnit.getProduct());
}
STable table = new STable();
table.setHeadlineFormat(new CFormat(BOLD, BLACK, LIGHT_GRAY, CENTER, MIDDLE));
table.add(new STableColumn("ArtikelNr", 15).setAction(SUtil.getBeanProperty("partNo")));
table.add(new STableColumn("Warengruppe", 22).setAction(SUtil.getBeanProperty("group.name")));
table.add(new STableColumn("Hersteller", 16).setAction(SUtil.getBeanProperty("tradeName.name")));
table.add(new STableColumn("Bezeichnung", 45).setAction(SUtil.getBeanProperty("name")));
table.add(new STableColumn("Image Id", 10).setAction(SUtil.getNull()));
table.setModel(new STableModelList(products));
CCalcDocument doc = new TempCalcDocument("ImageIds");
doc.add(new CSheet("ImageIds", table));
FileJacket fj = new FileJacket("MissingImageIds", ".xls", LucidCalc.createWriter(LucidCalc.Backend.XLS).write(doc));
m.finish();
return fj;
}
}