Search in sources :

Example 61 with SubMonitor

use of eu.ggnet.dwoss.progress.SubMonitor in project dwoss by gg-net.

the class ContractorPricePartNoImporterOperation method fromContractorXls.

// Manufacturer PartNo | EAN | Name | Contractor Reference Price | ContractorPartNo <br />
/**
 * See {@link ContractorPricePartNoImporter#fromContractorXls(de.dw.rules.TradeName, de.dw.util.FileJacket, java.lang.String) }.
 * <p/>
 * @param inFile   the inFile
 * @param arranger the arranger
 * @return
 */
@Override
public Reply<Void> fromContractorXls(TradeName contractor, FileJacket inFile, String arranger) {
    final SubMonitor m = monitorFactory.newSubMonitor(contractor + " Preise und Artikelnummern importieren", 100);
    m.start();
    m.message("Reading File");
    ProductEao productEao = new ProductEao(uuEm);
    ReportLineEao reportLineEao = new ReportLineEao(reportEm);
    LucidCalcReader reader = new JExcelLucidCalcReader();
    reader.addColumn(0, String.class).addColumn(1, String.class).addColumn(2, String.class).addColumn(3, Double.class).addColumn(4, String.class);
    List<ContractorImport> imports = reader.read(inFile.toTemporaryFile(), ContractorImport.class);
    List<String> errors = reader.getErrors();
    List<String> info = new ArrayList<>();
    // here for size, needed down below
    List<ReportLine> missingContractorPartNo = reportLineEao.findMissingContractorPartNo(contractor);
    m.worked(5);
    m.setWorkRemaining((int) (imports.size() + imports.size() * 0.5 + missingContractorPartNo.size()));
    int databaseLines = 0;
    int updatedGtin = 0;
    int newPrices = 0;
    int updatedPrices = 0;
    int updatedContractorPartNo = 0;
    Map<Product, SortedSet<ContractorImport>> importable = new HashMap<>();
    for (ContractorImport ci : imports) {
        m.worked(1, "Preparing and Sorting (" + ci.manufacturerPartNo + ")");
        if (!ci.hasManufacturerPartNoOrGtin()) {
            errors.add("No ManufacturerPartNo or EAN found for " + ci);
            continue;
        }
        Product p = null;
        // First, try finding it via gtin
        if (ci.hasValidGtin())
            p = productEao.findByGtin(Long.parseLong(ci.gtin));
        // Second try finding it via the partNo field raw
        if (p == null && !StringUtils.isBlank(ci.manufacturerPartNo))
            p = productEao.findByPartNo(ci.manufacturerPartNo);
        if (p == null) {
            // Third, try it by regex matching of part no patterns
            // Todo: implement more partno patterns an use them here, or add the type of import to this method.
            Matcher matcher = AcerRules.PART_NO_PATTERN.matcher(ci.manufacturerPartNo);
            if (matcher.find())
                p = productEao.findByPartNo(matcher.group());
        }
        if (p == null) {
            errors.add("No UniqueUnit.Product Entity found for PartNo " + ci.manufacturerPartNo + " bzw. Gtin " + ci.gtin + ", Ignoring");
            continue;
        }
        databaseLines++;
        if (importable.containsKey(p)) {
            // sorting based on product
            importable.get(p).add(ci);
        } else {
            SortedSet<ContractorImport> set = new TreeSet<>(Comparator.comparing(ContractorImport::getReferencePrice));
            set.add(ci);
            importable.put(p, set);
        }
    }
    // update size
    m.setWorkRemaining(missingContractorPartNo.size() + importable.size());
    for (Entry<Product, SortedSet<ContractorImport>> entry : importable.entrySet()) {
        Product p = entry.getKey();
        // only us the importline with the lowest price.
        ContractorImport ci = entry.getValue().first();
        m.worked(1, "Importing " + ProductFormater.toDetailedName(p));
        if (p.getGtin() == 0 && ci.hasValidGtin()) {
            // Optional set of gtin, if it is missing.
            p.setGtin(Long.parseLong(ci.gtin));
            updatedGtin++;
        }
        if (ci.getReferencePrice() > 0.01 && !TwoDigits.equals(p.getPrice(CONTRACTOR_REFERENCE), ci.getReferencePrice())) {
            // If price is valid and not equal, set it.
            double oldPrice = p.getPrice(CONTRACTOR_REFERENCE);
            if (p.hasPrice(CONTRACTOR_REFERENCE))
                updatedPrices++;
            else
                newPrices++;
            p.setPrice(CONTRACTOR_REFERENCE, ci.getReferencePrice(), "Import by " + arranger);
            info.add(ProductFormater.toDetailedName(p) + " added/updated contractor reference price from " + oldPrice + " to " + ci.getReferencePrice());
        } else {
            errors.add(ci + " hat keinen Preis");
        }
        if (ci.hasValidContractorPartNo(contractor)) {
            // If partNo is valid, set it.
            String contractorPartNo = ci.toNormalizeContractorPart(contractor);
            if (!contractorPartNo.equals(p.getAdditionalPartNo(contractor))) {
                info.add(ProductFormater.toDetailedName(p) + " added/updated contractor partno from " + p.getAdditionalPartNo(contractor) + " to " + contractorPartNo);
                p.setAdditionalPartNo(contractor, contractorPartNo);
                updatedContractorPartNo++;
            }
        } else {
            errors.add(ci.violationMessagesOfContractorPartNo(contractor));
        }
    }
    uuEm.flush();
    // Also update existing report lines, which have unset values.
    // TODO: This should happen from the report component on needed basis or as event call. not here.
    m.message("Updateing existing Reportlines");
    int updatedReportLinePartNo = 0;
    int updatedReportLineReferencePrice = 0;
    int updatedReportLineGtin = 0;
    for (ReportLine line : missingContractorPartNo) {
        Product product = uuEm.find(Product.class, line.getProductId());
        m.worked(1, "Updating ReportLine: " + line.getId());
        String head = "ReportLine(id=" + line.getId() + ") of " + ProductFormater.toDetailedName(product);
        String msg = "";
        if (product.getAdditionalPartNo(contractor) != null) {
            line.setContractorPartNo(product.getAdditionalPartNo(contractor));
            msg += " contractorPartNo:" + line.getContractorPartNo();
            updatedReportLinePartNo++;
        }
        if (product.hasPrice(CONTRACTOR_REFERENCE) && line.getContractorReferencePrice() == 0) {
            line.setContractorReferencePrice(product.getPrice(CONTRACTOR_REFERENCE));
            msg += " contractorReferencePrice:" + line.getContractorReferencePrice();
            updatedReportLineReferencePrice++;
        }
        if (product.getGtin() != line.getGtin()) {
            line.setGtin(product.getGtin());
            msg += " gtin:" + line.getGtin();
            updatedReportLineGtin++;
        }
        if (StringUtils.isBlank(msg)) {
            errors.add(head + ", no updateable values found in product.");
        } else {
            info.add(head + " updated " + msg);
        }
    }
    String summary = "Zeilen, mit gefunden (db)Artikeln: " + databaseLines + " (Entweder über PartNo oder Gtin)\n" + "GTIN/EAN aktuallisiert: " + updatedGtin + "\n" + "Neue Preise hinterlegt: " + newPrices + "\n" + "Preise aktualisiert: " + updatedPrices + "\n" + "Lieferantenartikelnummer aktualisiert: " + updatedContractorPartNo + "\n" + "Report-Fehlende GTIN/Preise/Artikelnummern Zeilen: " + missingContractorPartNo.size() + "\n" + "Report-GTIN/EAN aktuallisiert: " + updatedReportLineGtin + "\n" + "Report-Preise aktualisiert: " + updatedReportLineReferencePrice + "\n" + "Report-Lieferantenartikelnummer aktualisiert: " + updatedReportLinePartNo;
    StringBuilder details = new StringBuilder();
    if (!info.isEmpty()) {
        details.append("Infos\n-----\n");
        info.forEach((i) -> details.append(i).append("\n"));
    }
    details.append("-----------------\nFehler/Nicht importierbar\n-----------------\n");
    errors.forEach((error) -> details.append(error).append("\n"));
    m.finish();
    if (updatedGtin + newPrices + updatedPrices + updatedContractorPartNo == 0)
        return Reply.failure(summary, details.toString());
    else
        return Reply.success(null, summary, details.toString());
}
Also used : JExcelLucidCalcReader(eu.ggnet.lucidcalc.jexcel.JExcelLucidCalcReader) ReportLine(eu.ggnet.dwoss.report.ee.entity.ReportLine) Matcher(java.util.regex.Matcher) SubMonitor(eu.ggnet.dwoss.progress.SubMonitor) Product(eu.ggnet.dwoss.uniqueunit.ee.entity.Product) ProductEao(eu.ggnet.dwoss.uniqueunit.ee.eao.ProductEao) ReportLineEao(eu.ggnet.dwoss.report.ee.eao.ReportLineEao) JExcelLucidCalcReader(eu.ggnet.lucidcalc.jexcel.JExcelLucidCalcReader) LucidCalcReader(eu.ggnet.lucidcalc.LucidCalcReader)

Example 62 with SubMonitor

use of eu.ggnet.dwoss.progress.SubMonitor in project dwoss by gg-net.

the class ContractorPricePartNoImporterOperation method fromManufacturerXls.

@Override
public Reply<Void> fromManufacturerXls(TradeName contractorManufacturer, FileJacket inFile, String arranger) {
    if (!contractorManufacturer.isManufacturer())
        throw new RuntimeException(contractorManufacturer + " is not a Manufacturer");
    final SubMonitor m = monitorFactory.newSubMonitor(contractorManufacturer.getName() + " Costpreise importieren", 100);
    m.start().message("Reading File");
    ProductEao productEao = new ProductEao(uuEm);
    LucidCalcReader reader = new JExcelLucidCalcReader();
    reader.addColumn(0, String.class).addColumn(1, Double.class);
    List<ManufacturerImport> imports = reader.read(inFile.toTemporaryFile(), ManufacturerImport.class);
    List<String> errors = reader.getErrors();
    m.worked(5);
    m.setWorkRemaining(imports.size());
    L.info("Imports: {}", imports);
    PartNoSupport partNoSupport = contractorManufacturer.getPartNoSupport();
    int databaseLines = 0;
    int newPrices = 0;
    int updatedPrices = 0;
    for (ManufacturerImport mi : imports) {
        m.worked(1);
        if (partNoSupport != null && !partNoSupport.isValid(mi.partNo)) {
            errors.add(partNoSupport.violationMessages(mi.partNo));
            continue;
        }
        if (mi.costPrice == null || mi.costPrice <= 0.01) {
            errors.add("PartNo " + mi.costPrice + " hat keinen Preis");
            continue;
        }
        m.message("Importing (" + mi.partNo + ")");
        Product p = productEao.findByPartNo(mi.partNo);
        if (p == null) {
            errors.add("No UniqueUnit Entity for PartNo " + mi.partNo);
            continue;
        }
        databaseLines++;
        if (mi.getCostPrice() > 0.01 && !TwoDigits.equals(mi.getCostPrice(), p.getPrice(MANUFACTURER_COST))) {
            if (p.hasPrice(MANUFACTURER_COST))
                updatedPrices++;
            else
                newPrices++;
            p.setPrice(PriceType.MANUFACTURER_COST, mi.costPrice, "Import by " + arranger);
        }
    }
    m.finish();
    String summary = "Zeilen, mit gefunden (db)Artikeln: " + databaseLines + " \n" + "Neue Preise hinterlegt: " + newPrices + "\n" + "Preise aktualisiert: " + updatedPrices;
    StringBuilder details = new StringBuilder();
    for (Object error : errors) {
        details.append(error.toString()).append("\n");
    }
    m.finish();
    if (newPrices + updatedPrices == 0)
        return Reply.failure(summary, details.toString());
    else
        return Reply.success(null, summary, details.toString());
}
Also used : JExcelLucidCalcReader(eu.ggnet.lucidcalc.jexcel.JExcelLucidCalcReader) SubMonitor(eu.ggnet.dwoss.progress.SubMonitor) Product(eu.ggnet.dwoss.uniqueunit.ee.entity.Product) ProductEao(eu.ggnet.dwoss.uniqueunit.ee.eao.ProductEao) JExcelLucidCalcReader(eu.ggnet.lucidcalc.jexcel.JExcelLucidCalcReader) LucidCalcReader(eu.ggnet.lucidcalc.LucidCalcReader) PartNoSupport(eu.ggnet.dwoss.rules.partno.PartNoSupport)

Example 63 with SubMonitor

use of eu.ggnet.dwoss.progress.SubMonitor in project dwoss by gg-net.

the class SearchSingletonBean method reindexSearch.

@Schedule(hour = "2")
@Override
public void reindexSearch() {
    active = true;
    final SubMonitor m = monitorFactory.newSubMonitor("Recreationg Searchindex");
    m.start();
    try {
        MassIndexer indexer = Search.getFullTextEntityManager(em).createIndexer();
        indexer.progressMonitor(new SimpleIndexingProgressMonitor() {

            private final AtomicLong documentsDoneCounter = new AtomicLong();

            private final AtomicLong totalCounter = new AtomicLong();

            private final AtomicLong entitiesLoaded = new AtomicLong();

            @Override
            public void entitiesLoaded(int size) {
                entitiesLoaded.set(size);
            }

            @Override
            public void addToTotalCount(long count) {
                super.addToTotalCount(count);
                totalCounter.addAndGet(count);
            }

            @Override
            public void documentsAdded(long increment) {
                super.documentsAdded(increment);
                long current = documentsDoneCounter.addAndGet(increment);
                if (current % getStatusMessagePeriod() == 0) {
                    m.message("Prozess " + current + "/" + totalCounter.get() + " | Entities loaded: " + entitiesLoaded.get());
                }
            }
        });
        // Values still not optimal, but the mysql db holds.
        indexer.batchSizeToLoadObjects(10000).threadsToLoadObjects(3).startAndWait();
    } catch (InterruptedException ex) {
        LOG.error("Error on Reindex Search.", ex);
    } finally {
        active = false;
    }
    m.finish();
}
Also used : AtomicLong(java.util.concurrent.atomic.AtomicLong) MassIndexer(org.hibernate.search.MassIndexer) SimpleIndexingProgressMonitor(org.hibernate.search.batchindexing.impl.SimpleIndexingProgressMonitor) SubMonitor(eu.ggnet.dwoss.progress.SubMonitor)

Aggregations

SubMonitor (eu.ggnet.dwoss.progress.SubMonitor)63 UniqueUnitEao (eu.ggnet.dwoss.uniqueunit.ee.eao.UniqueUnitEao)23 UniqueUnit (eu.ggnet.dwoss.uniqueunit.ee.entity.UniqueUnit)21 FileJacket (eu.ggnet.dwoss.util.FileJacket)18 Document (eu.ggnet.dwoss.redtape.ee.entity.Document)16 Product (eu.ggnet.dwoss.uniqueunit.ee.entity.Product)14 StockUnitEao (eu.ggnet.dwoss.stock.ee.eao.StockUnitEao)12 File (java.io.File)12 StockUnit (eu.ggnet.dwoss.stock.ee.entity.StockUnit)11 UiCustomer (eu.ggnet.dwoss.customer.opi.UiCustomer)9 ProductEao (eu.ggnet.dwoss.uniqueunit.ee.eao.ProductEao)8 MonitorFactory (eu.ggnet.dwoss.progress.MonitorFactory)7 Inject (javax.inject.Inject)7 Test (org.junit.Test)7 PriceEngineResult (eu.ggnet.dwoss.price.engine.PriceEngineResult)6 DocumentEao (eu.ggnet.dwoss.redtape.ee.eao.DocumentEao)6 CCalcDocument (eu.ggnet.lucidcalc.CCalcDocument)6 CFormat (eu.ggnet.lucidcalc.CFormat)6 CSheet (eu.ggnet.lucidcalc.CSheet)6 STable (eu.ggnet.lucidcalc.STable)6