invoiceList = null;
@Inject
protected WorkflowController workflowController;
@Inject
protected WorkflowService workflowService;
@Inject
ZahlungseingangService zahlungseingangService;
@Inject
protected DocumentService documentService;
@Inject
protected InvoiceService invoiceService;
/**
* Diese Methode wird für Zahlungseingänge und Mahnläufe verwendet.
*
* Die Methode liefert die Rechnungen zur gegebenen dbtrNumber. Die Methode
* nutzt
* einen lokalen cache um die Zugriffe zu beschleunigen.
*
* Befindet sich ein Zahlungseingang in Erstellung (Task=1000) werden alle
* offenen Rechnungen geholt.
*
* Befindet sich ein Zahlungseingang nicht mehr in erstellung werden nur die
* Rechnugnen aus $workitemRef geholt!
*
* Bei verwendung im Mahnlauf werden zusätzlich auch alle diese Rechnungen
* vorselektiert (Anforderung von Mary Mwangi). D.h. es werden alle Checkboxen
* in der Maske 'selection_opliste_Mahnluaf' angewählt. D.h auch, dass man ggf.
* Rechnungen manuell delselktieren muss, wenn man diese nicht im Mahnlauf haben
* will.
*
* Beim Mahnlauf werden Inkasso Rechnungen ausgenommen.
*
*
* @param _dbtrNumber
* @return
*/
@SuppressWarnings("unchecked")
public List getInvoices(String _dbtrNumber) {
if (_dbtrNumber == null) {
return new ArrayList();
}
// Compute all open invoices if TASK_ERSTELLUNG....
if (workflowController.getWorkitem().getTaskID() == 0
|| workflowController.getWorkitem().getTaskID() == TASK_ERSTELLUNG) {
// return empty list if dbtr is not set
if (_dbtrNumber == null || _dbtrNumber.isEmpty()) {
invoiceList = new ArrayList();
return invoiceList;
}
// if last dbtr number is equal then return the current list....
if (invoiceList != null && //
lastDbtrNumber != null && lastDbtrNumber.equals(_dbtrNumber) && //
lastCurrencyFilter != null && lastCurrencyFilter.equals(currencyFilter) //
) {
return invoiceList;
}
// load new invoice list....
lastDbtrNumber = _dbtrNumber;
lastCurrencyFilter = currencyFilter;
invoiceList = new ArrayList();
logger.fine("....loading open 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);
}
try {
String query = "(type:workitem) AND ($modelversion:rechnungsausgang-*) AND (dbtr.number:" + _dbtrNumber
+ ")";
List invoiceListTemp = documentService.find(query, 999, 0, "invoice.number", false);
// Jetzt nur noch die Rechnungen nehmen die zum ausgewählten Währungsfilter
// passen
invoiceList = new ArrayList();
for (ItemCollection _invoice : invoiceListTemp) {
// Test if we have 'invoice.base.amount' and 'invoice.rate'
if (!_invoice.hasItem("invoice.base.amount")) {
_invoice.setItemValue("invoice.base.amount", 0.0);
}
if (!_invoice.hasItem("invoice.rate")) {
_invoice.setItemValue("invoice.rate", 0.0);
}
if (currencyFilter == null || currencyFilter.isEmpty() || currencyFilter.equals("-")) {
invoiceList.add(_invoice);
} else {
if (currencyFilter.equals(_invoice.getItemValueString("invoice.currency"))) {
invoiceList.add(_invoice);
}
}
}
} catch (QueryException e) {
logger.severe("Failed to get op liste:" + e.getMessage());
}
/*
* Zahlugnseingang?
*
* Wir berechnen den saldo.
*/
if (workflowController.getWorkitem().getModelVersion().startsWith("zahlungseingang")) {
// berechnung des Basisumsatzes bei Fremdwährungen
for (ItemCollection invoice : invoiceList) {
float rate = invoice.getItemValueFloat("invoice.rate");
float maxSaldo = invoice.getItemValueFloat("invoice.saldo");
if (rate != 0) {
maxSaldo = maxSaldo / rate;
invoice.setItemValue("invoice.saldo.byrate", maxSaldo);
}
}
}
/*
* Mahnlauf ?
*
* Bei einem Mahnlauf selektieren wir alle Rechnungne immer vor. Das ist eine
* Anforderung von AGL Der Benutzer kann dann einzelne Rechnungen wieder
* abwählen.
*
* Eine Ausnahme ist hier nur wenn jemand auf Speichern oder mahnen drückt
* (Event = 10|20). Dann ändern wir die Liste nicht!
*
* Hinweis: in der Liste befinden sich keine Inkasso Rechnungen, da man diese
* nicht anwählen kann.
*/
if (workflowController.getWorkitem().getModelVersion().startsWith("mahnlauf")) {
// wir selektieren hier immer alle fälligen Rechnungen vor falls wir aus
// einer Rechnung mit dem Event 100 (Mahnlauf erstellen) kommen, oder
// wenn der Mahnlauf von außen gerate eben neu erzeugt wurde
if (workflowController.getWorkitem().getItemValueInteger("$lastevent") == 100
||
workflowController.getWorkitem().getItemValueInteger("$lastevent") == 0) {
List intialSelection = new ArrayList();
for (ItemCollection invoice : invoiceList) {
// ist die Rechnung fällig?
if ("workitem".equals(invoice.getType()) && invoice.getTaskID() >= 5100) {
intialSelection.add(invoice.getUniqueID());
}
}
workflowController.getWorkitem().setItemValue("$workitemref", intialSelection);
}
}
} else {
// We are no longer in TASK_ERSTELLUNG, so
// fetch only selected invoices
invoiceList = new ArrayList();
if (!workflowController.getWorkitem().isItemEmpty("$workitemref")) {
List selection = workflowController.getWorkitem().getItemValue("$workitemref");
for (String id : selection) {
if (id != null && !id.isEmpty()) {
ItemCollection _invoice = documentService.load(id);
// Test if we have 'invoice.base.amount' and 'invoice.rate'
if (!_invoice.hasItem("invoice.base.amount")) {
_invoice.setItemValue("invoice.base.amount", 0.0);
}
if (!_invoice.hasItem("invoice.rate")) {
_invoice.setItemValue("invoice.rate", 0.0);
}
invoiceList.add(_invoice);
}
}
}
}
// finally we set the 'selection' item depending on the $workitemList
// and the payment amount form the 'payment.details'
if (invoiceList != null) {
List selection = workflowController.getWorkitem().getItemValue("$workitemref");
List paymentList = zahlungseingangService
.loadPaymentDetails(workflowController.getWorkitem());
for (ItemCollection invoice : invoiceList) {
if (selection.contains(invoice.getUniqueID())) {
invoice.setItemValue("selected", true);
// set amount
for (ItemCollection payment : paymentList) {
if (invoice.getUniqueID().equals(payment.getUniqueID())) {
invoice.setItemValue("payment.amount", payment.getItemValue("payment.amount"));
break;
}
}
}
}
} else {
// empty list
invoiceList = new ArrayList();
}
return invoiceList;
}
/**
* On Before Process we store the selected invoices in $worktiemRef
*
* @param workflowEvent
*/
public void onWorkflowEvent(@Observes WorkflowEvent workflowEvent) {
if (workflowEvent == null || workflowEvent.getWorkitem() == null) {
return;
}
// store a collection of child items if you are in a Zahlungseingang
if (workflowEvent.getWorkitem().getModelVersion().startsWith("zahlungseingang")
&& workflowEvent.getEventType() == WorkflowEvent.WORKITEM_BEFORE_PROCESS) {
updateChildList(workflowEvent.getWorkitem());
}
}
public ItemCollection loadInvoice(String id) {
return documentService.load(id);
}
/**
* Diese Methode aktualisiert das item ChildWOrkitems mit allen selektierten
* Invoices udn berechnet den payment total
*/
@SuppressWarnings("rawtypes")
public void updateChildList(ItemCollection workitem) {
double paymentTotal = 0;
List