office-alexander-logistics/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/OPListController.java
2022-08-23 16:22:41 +02:00

180 lines
5.5 KiB
Java

package com.alexanderlogistics;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;
import javax.enterprise.context.ConversationScoped;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.faces.data.WorkflowController;
/**
* Der OPListeController dient dazu eine liste aller offenen Ausgangsrechnungen
* zu bilden
* <p>
* Zusätzlich bietet er die funktionen zum auszifferne..(??)
*
* @author rsoika
*
*/
@Named("opListController")
@ConversationScoped
public class OPListController implements Serializable {
private static final long serialVersionUID = 1L;
private static Logger logger = Logger.getLogger(OPListController.class.getName());
private String lastDbtrNumber=null;
private List<ItemCollection> invoiceCache=null;
@Inject
protected WorkflowController workflowController;
@Inject
protected DocumentService documentService;
/**
* Diese Methode liefert die Rechnungen zur gegebenen dbtrNumber.
* Die Methode nutzt einen lokalen cache um die Zugriffe zu beschleunigen.
*
* @param _dbtrNumber
* @return
*/
public List<ItemCollection> getInvoices(String _dbtrNumber) {
// return empty cache if data is not
if ( _dbtrNumber==null || _dbtrNumber.isEmpty()) {
invoiceCache= new ArrayList<ItemCollection>();
return invoiceCache;
}
// if last dbtr number is equal then return the current cache....
if (invoiceCache!=null && lastDbtrNumber!=null && lastDbtrNumber.equals(_dbtrNumber)) {
return invoiceCache;
}
// refresh cache....
lastDbtrNumber=_dbtrNumber;
invoiceCache= new ArrayList<ItemCollection>();
logger.info("....caching Invoices for " + _dbtrNumber);
// Aus der dbtrNummer muss das führendde D entfernt werden
// wir speichern dieses zwar im Zahlungseingangs Workflow, aber eine
// Ausganksrechnung kennt das nicht
// Das ganze ist ein übles Relikt aus Cargosoft und kann nicht vermieden werden
if (_dbtrNumber.startsWith("D")) {
_dbtrNumber = _dbtrNumber.substring(1);
}
String query = "(type:workitem OR type:workitemarchive) AND ($modelversion:rechnungsausgang-*) AND (dbtr.number:"
+ _dbtrNumber + ")";
try {
invoiceCache = documentService.find(query, 999, 0, "$created", false);
} catch (QueryException e) {
logger.severe("Failed to get op liste:" + e.getMessage());
}
return invoiceCache;
}
/**
* THis Method is called by cargosft-debitor-serach.xhtml after the user has selected
* a new debitor.
* The meothod updates the dbtr.number of the current workitem.
* The form will rerender the opList seciton
*/
public void loadOPList() {
FacesContext fc = FacesContext.getCurrentInstance();
String dbtrNumber = fc.getExternalContext().getRequestParameterMap().get("dbtrNumber");
logger.info(".........dbtrNumber = "+dbtrNumber);
workflowController.getWorkitem().setItemValue("dbtr.number", dbtrNumber);
}
/**
* This method computes the sum for a given item in a list of workitems. The
* result is rounded to 2 digits.
* <p>
* Gutschriften werden abgezogen
*
* @param refids - list of workitem uniqueIds
* @param item - name of the item to summarize
* @return sum rounded to 2 digits
*/
public double calculateSum() {
double result = 0;
List<String> refids=workflowController.getWorkitem().getItemValueList("$workitemref",String.class);
for (String id : refids) {
if (id.isEmpty()) {
continue;
}
ItemCollection doc = getInvoiceFromCache(id);
if (doc!=null) {
result = result + doc.getItemValueDouble("invoice.total");
}
}
// rond with 2 digits
return Math.round(result * 100.0) / 100.0;
}
/**
* Hilfsmethode holt eine Rechnung aus dem Cache.
* @param id
* @return
*/
private ItemCollection getInvoiceFromCache(String id) {
if (invoiceCache==null) {
return null;
}
for (ItemCollection invoice: invoiceCache) {
if (invoice.getUniqueID().equals(id)) {
return invoice;
}
}
return null;
}
/**
* Berechnet den gesammten OP Saldo
* @return
*/
public double calculateSaldo(List<ItemCollection> invoices ) {
double result = 0;
for (ItemCollection invoice : invoices) {
result = result + invoice.getItemValueDouble("invoice.total");
}
// rond with 2 digits
return Math.round(result * 100.0) / 100.0;
}
/**
* This method removes an uniqueid form the item $workitemref
*/
@SuppressWarnings("unchecked")
public void removeInvoice(String id) {
List<String> refList = workflowController.getWorkitem().getItemValue("$workitemref");
refList.remove(id);
workflowController.getWorkitem().setItemValue("$workitemref", refList);
}
}