use of eu.ggnet.dwoss.stock.ee.entity.LogicTransaction in project dwoss by gg-net.
the class ResolveRepaymentBean method resolveUnit.
@Override
public ResolveResult resolveUnit(String identifier, TradeName contractor, String arranger, String comment) throws UserInfoException {
// search with refurbishid and serial number.
List<SimpleReportLine> reportLines = reportLineEao.findReportLinesByIdentifiers(identifier.trim());
List<ReportLine> repaymentLines = getRepaymentLines(contractor);
ReportLine line = null;
List<Long> repaymentIds = repaymentLines.stream().map((l) -> l.getId()).collect(Collectors.toList());
for (SimpleReportLine reportLine : reportLines) {
if (repaymentIds.contains(reportLine.getId())) {
line = reportLineEao.findById(reportLine.getId());
}
}
if (line == null)
throw new UserInfoException("Es konnte keine ReportLine mit diesem Identifier gefunden werden");
if (!line.getReports().isEmpty())
throw new UserInfoException("ReportLine ist schon in einem Report.\nReports:" + line.getReports());
ReportLine reference = line.getReference(SingleReferenceType.WARRANTY);
// Rolling out the unit if still in Stock.
StockUnit stockUnit = // Saftynet, e.g. unit annex shoud not clear units.
line.getPositionType() == UNIT ? stockUnitEao.findByRefurbishId(line.getRefurbishId()) : null;
if (stockUnit != null && stockUnit.isInTransaction())
throw new UserInfoException("Unit is in einer StockTransaction. ID:" + stockUnit.getTransaction().getId());
ResolveResult msgs = new ResolveResult();
if (stockUnit == null) {
msgs.stockMessage = "Es existiert keine Stock Unit (mehr) zu dem Gerät";
msgs.redTapeMessage = "Keine StockUnit, Kein Vorgang";
} else {
LogicTransaction lt = stockUnit.getLogicTransaction();
long dossierId = lt.getDossierId();
Dossier dossier = dossierEao.findById(dossierId);
if (!repaymentCustomers.get(contractor).isPresent() || !repaymentCustomers.get(contractor).get().equals(dossier.getCustomerId())) {
throw new UserInfoException("Unit is nicht auf einem Auftrag eines Repayment Customers. DossierId:" + dossier.getId());
}
List<Document> activeDocuments = dossier.getActiveDocuments(DocumentType.BLOCK);
if (activeDocuments.size() != 1) {
throw new UserInfoException("Der Gutschriftsvorgang " + dossier.toSimpleLine() + " ist fehlerhaft, entweder kein oder zu viele akive Blocker");
}
Position pos = activeDocuments.get(0).getPositionByUniqueUnitId(stockUnit.getUniqueUnitId());
if (pos == null) {
throw new UserInfoException("Auf Gutschriftsvorgang " + dossier.toSimpleLine() + " ist das Gerät " + stockUnit.toSimple() + " nicht auffindbar");
}
msgs.redTapeMessage = "Kid: " + dossier.getCustomerId() + ", Vorgang:" + dossier.getIdentifier() + " wurde Gerät entfernt";
convertToComment(pos, arranger, comment);
lt.remove(stockUnit);
StockTransaction st = stEmo.requestRollOutPrepared(stockUnit.getStock().getId(), arranger, "Resolved Repayment");
st.addUnit(stockUnit);
msgs.stockMessage = stockUnit.toSimple() + " aus Lager ausgerollt auf StockTransaction(id=" + st.getId() + ")";
history.fire(new UnitHistory(stockUnit.getUniqueUnitId(), "Resolved Repayment", arranger));
stEmo.completeRollOut(arranger, Arrays.asList(st));
stockEm.flush();
if (lt.getUnits().isEmpty()) {
msgs.stockMessage += ", LogicTransaction " + lt.getId() + " ist jetzt leer, wird gelöscht";
stockEm.remove(lt);
}
}
Date startOfYear = Date.from(LocalDate.of(LocalDate.now().getYear(), 1, 1).atStartOfDay(systemDefault()).toInstant());
Date endOfYear = Date.from(LocalDate.of(LocalDate.now().getYear(), 12, 31).atStartOfDay(systemDefault()).toInstant());
Report report = reportEmo.request(toReportName(contractor), contractor, startOfYear, endOfYear);
line.setComment(comment);
report.add(line);
msgs.reportMessage = "Repayment Unit " + line.getRefurbishId() + " line " + line.getId() + " resolved in " + report.getName();
if (reference != null) {
L.info("Warrenty Reference exist. Putted also into the report. ReportLine ID of Warrenty:{}", reference.getId());
reference.setComment(comment);
report.add(reference);
msgs.reportMessage += ", including warranty " + reference.getId();
}
return msgs;
}
use of eu.ggnet.dwoss.stock.ee.entity.LogicTransaction in project dwoss by gg-net.
the class PersistenceValidatorOperation method validateDatabase.
/**
* This Method Validate all Databases.
* It's validate:
* - RedTape
* - UniqueUnit
* - Sopo
* - Stock
* <p/>
* @return a Filejacket where a xls from the JExcel api is, that contains all Errors.
*/
@Override
public Optional<FileJacket> validateDatabase() {
List<Vm> vms = new ArrayList<>();
UniqueUnitEao uuEao = new UniqueUnitEao(uuEm);
DossierEao dossierEao = new DossierEao(redTapeEm);
LogicTransactionEao logicEao = new LogicTransactionEao(stockEm);
StockUnitEao stockUnitEao = new StockUnitEao(stockEm);
int uuMax = uuEao.count();
int dossierMax = dossierEao.count();
int logicMax = logicEao.count();
int stockUnitMax = stockUnitEao.count();
SubMonitor m = monitorFactory.newSubMonitor("DatenbankValidation", 100);
// All Listen
List<Dossier> dossiers;
List<UniqueUnit> uniqueUnits;
List<LogicTransaction> logicTransactions;
List<StockUnit> stockUnits;
m.message("Hole alle Unique Units. " + uuMax);
uniqueUnits = uuEao.findAll();
m.worked(10, "Hole Alle Dossiers. " + dossierMax);
dossiers = dossierEao.findAll();
m.worked(10, "Hole Alle LogicTransaction. " + logicMax);
logicTransactions = logicEao.findAll();
m.worked(10, "Hole Alle StockUnit. " + stockUnitMax);
stockUnits = stockUnitEao.findAll();
m.worked(10, "Validieren.");
validateRedTape(vms, dossiers, convertUnitListToMap(uniqueUnits), m.newChild(10));
validateUniqueUnit(vms, uniqueUnits, m.newChild(10));
validateLogicTransaction(vms, logicTransactions, dossiers, m.newChild(10));
// TODO: split:
// 1. Sopo Validation <-> RedTape
// 2. Sopo Only.
m.finish();
return createFileJacket(vms);
}
use of eu.ggnet.dwoss.stock.ee.entity.LogicTransaction in project dwoss by gg-net.
the class MovementListingProducerOperation method generateList.
@Override
public JasperPrint generateList(ListType listType, Stock stock) {
SubMonitor m = monitorFactory.newSubMonitor("Versand und Abholung", 100);
m.message("lade Vorgänge");
m.start();
LogicTransactionEao ltEao = new LogicTransactionEao(stockEm);
UniqueUnitEao uniqueUnitEao = new UniqueUnitEao(uuEm);
List<Document> documents = new DocumentEao(redTapeEm).findActiveByDirective(listType.getDirective());
m.worked(5);
m.setWorkRemaining(documents.size() + 2);
List<MovementLine> lines = new ArrayList<>();
List<String> dossierids = new ArrayList<>();
List<Long> systemCustomers = customerService.allSystemCustomerIds();
for (Document document : documents) {
if (systemCustomers.contains(document.getDossier().getCustomerId()))
continue;
m.worked(1, "verarbeite " + document.getDossier().getIdentifier());
LogicTransaction lt = ltEao.findByDossierId(document.getDossier().getId());
// Filter by stock
if (!hasUnitOnStock(lt, stock))
continue;
MovementLine line = new MovementLine();
line.setCustomerId(document.getDossier().getCustomerId());
line.setCustomerComment(customerService.findComment(document.getDossier().getCustomerId()));
line.setComment(document.getDossier().getComment());
line.setInvoiceAddress(document.getInvoiceAddress().getDescription());
line.setDeliveryAddress(document.getShippingAddress().getDescription());
line.setDossierIdentifier(document.getDossier().getIdentifier());
dossierids.add(document.getDossier().getIdentifier());
line.setPaymentMethod(document.getDossier().getPaymentMethod().getNote());
for (StockUnit stockUnit : lt.getUnits()) {
UniqueUnit uniqueUnit = uniqueUnitEao.findById(stockUnit.getUniqueUnitId());
Product p = uniqueUnit.getProduct();
MovementSubline elem = new MovementSubline(1, (p == null ? "Kein Produkt" : ProductFormater.toName(p) + " (" + p.getGroup().getNote() + ")"), uniqueUnit.getRefurbishId(), (stockUnit.getStock() == null ? stockUnit.getTransaction().toString() : stockUnit.getStock().getName()), uniqueUnit.getInternalComments().contains(UniqueUnit.StaticInternalComment.PREPARED_SHIPMENT));
line.addMovementSubline(elem);
}
lines.add(line);
}
String title = listType.getName() + " - " + stock.getName();
L.info("generateList {} containing {}", title, dossierids);
m.message("erzeuge Report");
Map<String, Object> reportParameter = new HashMap<>();
reportParameter.put("TITLE", title);
JRBeanCollectionDataSource datasource = new JRBeanCollectionDataSource(lines);
String name = "MovementList.jrxml";
URL url = Objects.requireNonNull(getClass().getResource(name), "The Resource " + getClass().getPackage() + "/" + name + " not found.");
try (InputStream is = url.openStream()) {
JasperReport jasperReport = JasperCompileManager.compileReport(is);
JasperPrint result = JasperFillManager.fillReport(jasperReport, reportParameter, datasource);
return result;
} catch (IOException | JRException e) {
L.error("Exception during movementList", e);
throw new RuntimeException(e);
} finally {
m.finish();
}
}
use of eu.ggnet.dwoss.stock.ee.entity.LogicTransaction in project dwoss by gg-net.
the class LogicTransactionEmo method optionalRemoveUnits.
/**
* Removes StockUnits identified by UniqueUnitIds from a LogicTransaction, if it exists.
*
* @param dossierId the dossierId of the LogicTransaction
* @param uniqueUnitIds the uniqueUnitIds
* @return the LogicTransaction after the removal, always returns a list.
*/
// TODO: Test
public List<StockUnit> optionalRemoveUnits(long dossierId, Collection<Integer> uniqueUnitIds) {
if (uniqueUnitIds == null)
throw new NullPointerException("uniqueUnitIds must not be null");
// Null is possible
LogicTransaction logicTransaction = new LogicTransactionEao(em).findByDossierId(dossierId);
if (logicTransaction == null)
return new ArrayList<>();
List<StockUnit> stockUnits = new ArrayList<>();
for (Integer uniqueUnitId : uniqueUnitIds) {
// check stockunit if not in LogicTransaction.
StockUnit unit = new StockUnitEao(em).findByUniqueUnitId(uniqueUnitId);
if (unit == null)
continue;
if (unit.getLogicTransaction() == null)
throw new IllegalStateException(unit + " is not on a LogicTransaction, shoud be on " + logicTransaction);
if (!logicTransaction.equals(unit.getLogicTransaction()))
throw new IllegalStateException(unit + " is on a different LogicTransaction than " + logicTransaction);
logicTransaction.remove(unit);
stockUnits.add(unit);
}
return stockUnits;
}
use of eu.ggnet.dwoss.stock.ee.entity.LogicTransaction in project dwoss by gg-net.
the class LogicTransactionEmo method equilibrate.
/**
* Brings the LogicTransaction identified by the dossierId and the supplied uniqueUnitIds in equilibrium.
* <p/>
* Handles the following states:
* <ul>
* <li>If uniqueUnitIds is empty a possible LogicTransaction is emptied and removed</li>
* <li>Otherwise the LogicTransaction is synchronised with the uniqueUnitIds. possibly creating the LogicTransaction</li>
* </ul>
* TODO: Test (is Tested in RedTapeOperationTest)
* <p/>
* @param dossierId the id of the dossier
* @param newUniqueUnitIds List of uniqueUnitIds may not be null
* @return a Result containing uniqueUnitIds which have been added an removed, or null if nothing happend.
* @throws NullPointerException if uniqueUnitIds is null
* @throws IllegalArgumentException if a uniqueUnitId has no StockUnit
* @throws IllegalStateException if a StockUnit, that should be free, is already on a LogicTransaction.
*/
// TODO: Return removed, added.
public EquilibrationResult equilibrate(long dossierId, final Collection<Integer> newUniqueUnitIds) throws IllegalArgumentException, IllegalStateException, NullPointerException {
L.debug("equilibrate dossierId={}, uniqueUnitIds={}", dossierId, newUniqueUnitIds);
if (newUniqueUnitIds == null)
throw new NullPointerException("uniqueUnitIds must not be null");
// Null is possible
LogicTransaction logicTransaction = new LogicTransactionEao(em).findByDossierId(dossierId, LockModeType.PESSIMISTIC_WRITE);
if (logicTransaction == null && newUniqueUnitIds.isEmpty()) {
L.debug("Both are empty, nothing to equilibrate");
return null;
}
NavigableSet<Integer> adding = new TreeSet<>(newUniqueUnitIds);
Map<Integer, StockUnit> oldStockUnits = new HashMap<>();
NavigableSet<Integer> removal = new TreeSet<>();
// Remove possible old stockuntis
if (logicTransaction != null) {
for (StockUnit stockUnit : logicTransaction.getUnits()) {
oldStockUnits.put(stockUnit.getUniqueUnitId(), stockUnit);
}
removal.addAll(oldStockUnits.keySet());
removal.removeAll(newUniqueUnitIds);
// newUniqueUnitIds - oldUniqueUnitIds = notJetAdded
adding.removeAll(oldStockUnits.keySet());
L.debug("Removal: removing StockUnits with UniqueUnit.ids={} ", removal);
for (Integer uniqueUnitId : removal) {
logicTransaction.remove(oldStockUnits.get(uniqueUnitId));
}
if (newUniqueUnitIds.isEmpty()) {
L.debug("Rqmoval: removing empty {}", logicTransaction);
em.remove(logicTransaction);
return null;
}
}
// Non LT exists, but we need one.
if (logicTransaction == null) {
L.debug("Request: New LogicTransaction needed");
logicTransaction = request(dossierId, LockModeType.PESSIMISTIC_WRITE);
L.debug("Request: Result={}", logicTransaction);
}
L.debug("Adding: StockUnits with UniqueUnit.ids={}", adding);
for (Integer uniqueUnitId : adding) {
// check stockunit if not in LogicTransaction.
StockUnit unit = new StockUnitEao(em).findByUniqueUnitId(uniqueUnitId);
if (unit == null)
throw new IllegalArgumentException("The supplied uniqueUnitId=" + uniqueUnitId + " has no StockUnit");
if (unit.getLogicTransaction() != null)
throw new IllegalStateException(unit + " is already in a LogicTransaction");
else
logicTransaction.add(unit);
}
L.debug("Adding: Result = {}", logicTransaction);
return new EquilibrationResult(adding, removal, logicTransaction);
}
Aggregations