- * Zusätzlich bietet er die funktionen zum auszifferne..(??)
+ * Zusätzlich bietet er die funktionen zum auszifferne. Dies bedeutet, der
+ * controller ermittelt zunächst alle offenen Rechnungen zu einem Debitor. Diese
+ * Rechnungen werden in eine ChildItems Collection überführt. Der User kann nun
+ * im Interface einzelne Rechnungen selektieren. Wird das Workitem gespeichert,
+ * errechnet der Controller die selectieren Invoices und verknpüft diese final
+ * mit dem Zahlungseingang.
+ *
*
* @author rsoika
*
@@ -30,151 +44,239 @@ public class OPListController implements Serializable {
private static final long serialVersionUID = 1L;
+ public static final int TASK_ERSTELLUNG = 1000;
+ public static final String ITEM_PAYMENT_DETAILS="payment.details";
+
private static Logger logger = Logger.getLogger(OPListController.class.getName());
-
- private String lastDbtrNumber=null;
-
- private List invoiceCache=null;
+
+ private String lastDbtrNumber = null;
+
+ private List invoiceList = null;
@Inject
protected WorkflowController workflowController;
+
+ @Inject
+ protected WorkflowService workflowService;
+ @Inject
+ protected WorkitemLinkController workitemLinkController;
@Inject
protected DocumentService documentService;
-
/**
- * Diese Methode liefert die Rechnungen zur gegebenen dbtrNumber.
- * Die Methode nutzt einen lokalen cache um die Zugriffe zu beschleunigen.
+ * Diese Methode liefert die Rechnungen zur gegebenen dbtrNumber. Die Methode
+ * nutzt einen lokalen cache um die Zugriffe zu beschleunigen.
+ *
+ * Befindet sich der Zahlungseingang in Erstellung (Task=1000) werden alle
+ * offenen Rechnungen geholt
+ *
+ * Befindet sich der Zahlungseingang nicht mehr in erstellung werden nur die
+ * Rechnugnen aus $workitemRef geholt!
*
* @param _dbtrNumber
* @return
*/
+ @SuppressWarnings("unchecked")
public List getInvoices(String _dbtrNumber) {
-
- // return empty cache if data is not
- if ( _dbtrNumber==null || _dbtrNumber.isEmpty()) {
- invoiceCache= new ArrayList();
- 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();
- 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 + ")";
+ // Compute all open invoices if TASK_ERSTELLUNG....
+ if (workflowController.getWorkitem().getTaskID() == TASK_ERSTELLUNG) {
- try {
- invoiceCache = documentService.find(query, 999, 0, "$created", false);
- } catch (QueryException e) {
- logger.severe("Failed to get op liste:" + e.getMessage());
+ // 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)) {
+ return invoiceList;
+ }
+
+ // load new invoice list....
+
+ lastDbtrNumber = _dbtrNumber;
+ invoiceList = new ArrayList();
+ logger.info("....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);
+ }
+ String query = "(type:workitem OR type:workitemarchive) AND ($modelversion:rechnungsausgang-*) AND (dbtr.number:"
+ + _dbtrNumber + ")";
+
+ try {
+ invoiceList = documentService.find(query, 999, 0, "$created", false);
+ } catch (QueryException e) {
+ logger.severe("Failed to get op liste:" + e.getMessage());
+ }
+
+ } else {
+ // We are no longer in TASK_ERSTELLUNG, so
+ // fetch only selected invoices
+ invoiceList = new ArrayList();
+ List selection = workflowController.getWorkitem().getItemValue("$workitemref");
+ for (String id : selection) {
+ invoiceList.add(documentService.load(id));
+ }
}
- return invoiceCache;
+ // finally we set the 'selection' item depending on the $workitemList
+ // and the payment amount form the 'payment.details'
+ List selection = workflowController.getWorkitem().getItemValue("$workitemref");
+ List paymentList=explodePaymentDetails(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;
+ }
+ }
+ }
+ }
+
+ return invoiceList;
+ }
+
+
+// /**
+// * Liefert die Payments die mit diesem workitem verbunden sind...
+// * @return
+// */
+// public List getPayments() {
+// List result=new ArrayList();
+//
+//
+// result=workitemLinkController.getExternalReferences("($WorkflowGroup:Zahlungseingang");
+//// if (workflowController.getWorkitem()!=null) {
+//// List liste = workflowService.getWorkListByRef(workflowController.getWorkitem().getUniqueID());
+////
+//// for (ItemCollection refWorkitem: liste) {
+//// if (refWorkitem.getItemValueString(WorkflowKernel.WORKFLOWGROUP).startsWith("Zahlungseingang")) {
+//// result.add(refWorkitem);
+//// }
+//// }
+//// }
+////
+// return result;
+// }
+
+ /**
+ * Convert the List of ItemCollections back into a List of Map elements
+ *
+ * @param workitem
+ */
+ @SuppressWarnings({ "rawtypes" })
+ protected List explodePaymentDetails(ItemCollection workitem) {
+ // convert current list of childItems into ItemCollection elements
+ ArrayList childItems = new ArrayList();
+
+ List