This commit is contained in:
Ralph Soika 2022-08-31 15:30:23 +02:00
parent 45530d4be5
commit c124d06d74
5 changed files with 363 additions and 212 deletions

View file

@ -3,23 +3,37 @@ package com.alexanderlogistics;
import java.io.Serializable; import java.io.Serializable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.logging.Logger; import java.util.logging.Logger;
import javax.enterprise.context.ConversationScoped; import javax.enterprise.context.ConversationScoped;
import javax.enterprise.event.Observes;
import javax.faces.context.FacesContext; import javax.faces.context.FacesContext;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import org.imixs.workflow.ItemCollection; import org.imixs.workflow.ItemCollection;
import org.imixs.workflow.WorkflowKernel;
import org.imixs.workflow.engine.DocumentService; import org.imixs.workflow.engine.DocumentService;
import org.imixs.workflow.engine.WorkflowService;
import org.imixs.workflow.exceptions.QueryException; import org.imixs.workflow.exceptions.QueryException;
import org.imixs.workflow.faces.data.WorkflowController; import org.imixs.workflow.faces.data.WorkflowController;
import org.imixs.workflow.faces.data.WorkflowEvent;
import org.imixs.workflow.office.forms.ChildItemController;
import org.imixs.workflow.office.forms.WorkitemLinkController;
/** /**
* Der OPListeController dient dazu eine liste aller offenen Ausgangsrechnungen * Der OPListeController dient dazu eine liste aller offenen Ausgangsrechnungen
* zu bilden * zu bilden
* <p> * <p>
* 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 * @author rsoika
* *
@ -30,133 +44,233 @@ public class OPListController implements Serializable {
private static final long serialVersionUID = 1L; 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 static Logger logger = Logger.getLogger(OPListController.class.getName());
private String lastDbtrNumber=null; private String lastDbtrNumber = null;
private List<ItemCollection> invoiceCache=null; private List<ItemCollection> invoiceList = null;
@Inject @Inject
protected WorkflowController workflowController; protected WorkflowController workflowController;
@Inject
protected WorkflowService workflowService;
@Inject
protected WorkitemLinkController workitemLinkController;
@Inject @Inject
protected DocumentService documentService; protected DocumentService documentService;
/** /**
* Diese Methode liefert die Rechnungen zur gegebenen dbtrNumber. * Diese Methode liefert die Rechnungen zur gegebenen dbtrNumber. Die Methode
* Die Methode nutzt einen lokalen cache um die Zugriffe zu beschleunigen. * nutzt einen lokalen cache um die Zugriffe zu beschleunigen.
* <p>
* Befindet sich der Zahlungseingang in Erstellung (Task=1000) werden alle
* offenen Rechnungen geholt
* <p>
* Befindet sich der Zahlungseingang nicht mehr in erstellung werden nur die
* Rechnugnen aus $workitemRef geholt!
* *
* @param _dbtrNumber * @param _dbtrNumber
* @return * @return
*/ */
@SuppressWarnings("unchecked")
public List<ItemCollection> getInvoices(String _dbtrNumber) { public List<ItemCollection> getInvoices(String _dbtrNumber) {
// Compute all open invoices if TASK_ERSTELLUNG....
if (workflowController.getWorkitem().getTaskID() == TASK_ERSTELLUNG) {
// return empty cache if data is not // return empty list if dbtr is not set
if ( _dbtrNumber==null || _dbtrNumber.isEmpty()) { if (_dbtrNumber == null || _dbtrNumber.isEmpty()) {
invoiceCache= new ArrayList<ItemCollection>(); invoiceList = new ArrayList<ItemCollection>();
return invoiceCache; 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<ItemCollection>();
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<ItemCollection>();
List<String> selection = workflowController.getWorkitem().getItemValue("$workitemref");
for (String id : selection) {
invoiceList.add(documentService.load(id));
}
} }
// if last dbtr number is equal then return the current cache.... // finally we set the 'selection' item depending on the $workitemList
if (invoiceCache!=null && lastDbtrNumber!=null && lastDbtrNumber.equals(_dbtrNumber)) { // and the payment amount form the 'payment.details'
return invoiceCache; List<String> selection = workflowController.getWorkitem().getItemValue("$workitemref");
List<ItemCollection> 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;
}
}
}
} }
// refresh cache.... return invoiceList;
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 // * Liefert die Payments die mit diesem workitem verbunden sind...
// Das ganze ist ein übles Relikt aus Cargosoft und kann nicht vermieden werden // * @return
if (_dbtrNumber.startsWith("D")) { // */
_dbtrNumber = _dbtrNumber.substring(1); // public List<ItemCollection> getPayments() {
// List<ItemCollection> result=new ArrayList();
//
//
// result=workitemLinkController.getExternalReferences("($WorkflowGroup:Zahlungseingang");
//// if (workflowController.getWorkitem()!=null) {
//// List<ItemCollection> 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<ItemCollection> explodePaymentDetails(ItemCollection workitem) {
// convert current list of childItems into ItemCollection elements
ArrayList<ItemCollection> childItems = new ArrayList<ItemCollection>();
List<Object> mapOrderItems = workitem.getItemValue(ITEM_PAYMENT_DETAILS);
int pos = 1;
for (Object mapOderItem : mapOrderItems) {
if (mapOderItem instanceof Map) {
ItemCollection itemCol = new ItemCollection((Map) mapOderItem);
itemCol.replaceItemValue("numPos", pos);
childItems.add(itemCol);
pos++;
}
} }
String query = "(type:workitem OR type:workitemarchive) AND ($modelversion:rechnungsausgang-*) AND (dbtr.number:" return childItems;
+ _dbtrNumber + ")"; }
/**
* 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;
try {
invoiceCache = documentService.find(query, 999, 0, "$created", false);
} catch (QueryException e) {
logger.severe("Failed to get op liste:" + e.getMessage());
} }
// store a collection of child items
if (workflowEvent.getEventType() == WorkflowEvent.WORKITEM_BEFORE_PROCESS) {
updateChildList(workflowEvent.getWorkitem());
return invoiceCache; }
}
public ItemCollection loadInvoice(String id) {
return documentService.load(id);
} }
/** /**
* THis Method is called by cargosft-debitor-serach.xhtml after the user has selected * Diese Methode aktualisiert das item ChildWOrkitems mit allen selektierten
* a new debitor. * Invoices udn berechnet den payment total
* The meothod updates the dbtr.number of the current workitem.
* The form will rerender the opList seciton
*/ */
public void loadOPList() { @SuppressWarnings("rawtypes")
public void updateChildList(ItemCollection workitem) {
double paymentTotal = 0;
List<Map> mapInvoiceItems = new ArrayList<Map>();
// convert the child ItemCollection elements into a List of Map
logger.info("Convert child items into Map...");
// iterate over all order items..
List<String> selectionList = new ArrayList<String>();
for (ItemCollection invoice : invoiceList) {
if (invoice.getItemValueBoolean("selected")) {
logger.info("calculate - " + invoice.getUniqueID());
selectionList.add(invoice.getUniqueID());
paymentTotal = paymentTotal + invoice.getItemValueDouble("payment.amount");
ItemCollection invoiceStub = new ItemCollection();
invoiceStub.setItemValue(WorkflowKernel.UNIQUEID, invoice.getUniqueID());
invoiceStub.setItemValue("payment.amount", invoice.getItemValue("payment.amount"));
mapInvoiceItems.add(invoiceStub.getAllItems());
}
}
// rond with 2 digits
workitem.replaceItemValue("payment.total", Math.round(paymentTotal * 100.0) / 100.0);
// update childitems
workitem.replaceItemValue(ITEM_PAYMENT_DETAILS, mapInvoiceItems);
// Update $workitemref
workitem.setItemValue("$workitemref", selectionList);
}
/**
* This JSF backing method is called by cargosft-debitor-serach.xhtml after the
* user has selected a new debitor.
* <p>
* The new dbtrNumber is slected form the curren ajax request param 'dbtrNumber'
* <p>
* The method just updates the dbtr.number of the current workitem. The form
* will than rerender the opList section.
*/
public void updateDbtrNumber() {
FacesContext fc = FacesContext.getCurrentInstance(); FacesContext fc = FacesContext.getCurrentInstance();
String dbtrNumber = fc.getExternalContext().getRequestParameterMap().get("dbtrNumber"); String dbtrNumber = fc.getExternalContext().getRequestParameterMap().get("dbtrNumber");
logger.info(".........dbtrNumber = "+dbtrNumber); logger.fine(".........dbtrNumber = " + dbtrNumber);
workflowController.getWorkitem().setItemValue("dbtr.number", 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 * Berechnet den gesammten OP Saldo
*
* @return * @return
*/ */
public double calculateSaldo(List<ItemCollection> invoices ) { public double calculateInvoiceTotal() {
double result = 0; double result = 0;
for (ItemCollection invoice : invoices) { for (ItemCollection invoice : invoiceList) {
result = result + invoice.getItemValueDouble("invoice.total"); result = result + invoice.getItemValueDouble("invoice.total");
} }
// rond with 2 digits // rond with 2 digits
@ -165,16 +279,4 @@ public class OPListController implements Serializable {
} }
/**
* 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);
}
} }

View file

@ -23,7 +23,7 @@
--> -->
<h:commandScript name="cargosoftSearch" action="#{cargosoftController.searchDebitor()}" <h:commandScript name="cargosoftSearch" action="#{cargosoftController.searchDebitor()}"
render="autocomplete-resultlist-cargosoft" onevent="autocompleteShowResult" /> render="autocomplete-resultlist-cargosoft" onevent="autocompleteShowResult" />
<h:commandScript name="loadOPList" action="#{opListController.loadOPList()}" <h:commandScript name="updateDbtrNumber" action="#{opListController.updateDbtrNumber()}"
render="#{opListContainer.clientId}" onevent="ajaxUpdateInvoiceSelection" /> render="#{opListContainer.clientId}" onevent="ajaxUpdateInvoiceSelection" />
<script type="text/javascript"> <script type="text/javascript">
/*<![CDATA[*/ /*<![CDATA[*/
@ -63,9 +63,9 @@
} }
// finally we do a trick and trigger the commandScript loadOPList which // finally we do a trick and trigger the commandScript updateDbtrNumber which
// refreshes the op section // refreshes the op section
loadOPList({ dbtrNumber: dbtrData.no }); updateDbtrNumber({ dbtrNumber: dbtrData.no });
} }
/*]]>*/ /*]]>*/

View file

@ -10,51 +10,48 @@
<!-- Shows the op liste fo rthe current dbtr.number --> <!-- Shows the op liste fo rthe current dbtr.number -->
<h:commandScript name="calculateOpSummary" execute="invoiceRefHolder_ID" render="opcalculater_id" /> <h:commandScript name="calculateOpSummary"
execute="invoiceRefHolder_ID" render="opcalculater_id" />
<h:panelGroup layout="block" styleClass="imixs-form-section" id="oplist-table" binding="#{opListContainer}"> <h:panelGroup layout="block" styleClass="imixs-form-section"
id="oplist-table" binding="#{opListContainer}">
<table style="width:100%;margin:5px;"> <table style="width: 100%; margin: 5px;">
<tr> <tr>
<th style="text-align: left;">#{message['form.invoicenumber']}</th> <th style="text-align: left;">#{message['form.invoicenumber']}</th>
<th style="text-align: left;">#{message['form.date']}</th> <th style="text-align: left;">#{message['form.date']}</th>
<th style="text-align: left;">#{message['form.deadline']}</th> <th style="text-align: left;">#{message['form.deadline']}</th>
<th style="text-align: right;">S/H</th> <th style="text-align: right;">S/H</th>
<th style="width: 40px;"></th> <th style="width: 40px;"></th>
<th style="width:100px;">Saldo</th> <th style="width: 100px;">Saldo</th>
<th style="width:100px;">Teilbetrag</th> <th style="width: 100px;">Zahlbetrag</th>
<th style=""></th> <th style=""></th>
</tr> </tr>
<ui:param name="invoices" value="#{opListController.getInvoices(workitem.item['dbtr.number'])}"></ui:param> <ui:param name="invoices"
<ui:repeat value="#{invoices}" var="invoice"> value="#{opListController.getInvoices(workitem.item['dbtr.number'])}"></ui:param>
<ui:repeat value="#{invoices}" var="invoice">
<tr> <tr>
<td><h:link outcome="/pages/workitems/workitem"> <td><h:link outcome="/pages/workitems/workitem">
#{invoice.item['invoice.number']} #{invoice.item['invoice.number']}
<f:param name="id" value="#{invoice.item['$uniqueid']}" /> <f:param name="id" value="#{invoice.item['$uniqueid']}" />
</h:link> </h:link></td>
</td>
<td> <td><h:outputText value="#{invoice.item['invoice.date']}">
<h:outputText value="#{invoice.item['invoice.date']}">
<f:convertDateTime pattern="#{message.datePatternShort}" <f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" /> timeZone="#{message.timeZone}" />
</h:outputText> </h:outputText></td>
</td>
<td><h:outputText value="#{invoice.item['invoice.duedate']}"> <td><h:outputText value="#{invoice.item['invoice.duedate']}">
<f:convertDateTime pattern="#{message.datePatternShort}" <f:convertDateTime pattern="#{message.datePatternShort}"
timeZone="#{message.timeZone}" /> timeZone="#{message.timeZone}" />
</h:outputText> </h:outputText></td>
</td>
<!-- Rechnngsbetrag --> <!-- Rechnngsbetrag -->
<td style="text-align: right;"><h:outputText <td style="text-align: right;"><h:outputText
value="#{invoice.item['invoice.total']}"> value="#{invoice.item['invoice.total']}">
<f:convertNumber minFractionDigits="2" locale="de" /> <f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText> </h:outputText></td>
</td>
<td><h:outputText value="#{invoice.item['invoice.currency']}" /></td> <td><h:outputText value="#{invoice.item['invoice.currency']}" /></td>
@ -62,24 +59,39 @@
<!-- Saldo / offene Betrag --> <!-- Saldo / offene Betrag -->
<td style="text-align: right;color:red;"><h:outputText <td style="text-align: right; color: red;"><h:outputText
value="#{invoice.item['invoice.saldo']}"> value="#{invoice.item['invoice.saldo']}">
<f:convertNumber minFractionDigits="2" locale="de" /> <f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText> </h:outputText></td>
</td>
<!-- Teilbetrag --> <!-- Teilbetrag -->
<td> <td style="text-align: right;"><h:inputText id="payment_per_invoice" rendered="#{!readonly}"
<input type="text" style="width:100px;text-align: right;"> value="#{invoice.item['payment.amount']}"
</input> style="width:100px;text-align: right;">
<f:convertNumber minFractionDigits="2" locale="de" />
<f:ajax event="change" execute="#{opListContainer.clientId}"
listener="#{opListController.updateChildList(workitem)}"
render="#{opListContainer.clientId}"></f:ajax>
</h:inputText>
<h:outputText rendered="#{readonly}"
value="#{invoice.item['payment.amount']}"
style="width:100px; ">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td> </td>
<!-- CheckBox --> <!-- CheckBox -->
<td><input type="checkbox" class="selection_checkbox" <td><h:selectBooleanCheckbox class="invoice_selector" rendered="#{!readonly}"
id="#{invoice.uniqueID}" /></td> value="#{invoice.item['selected']}"
onclick="initInvoicePayment(this)">
<f:ajax event="change" execute="#{opListContainer.clientId}"
listener="#{opListController.updateChildList(workitem)}"
render="#{opListContainer.clientId}"></f:ajax>
</h:selectBooleanCheckbox></td>
</tr> </tr>
@ -89,29 +101,35 @@
<td /> <td />
<td /> <td />
<td><strong>Summary</strong></td> <td><strong>Summary</strong></td>
<td style="text-align: right;"><strong><h:outputText
value="#{opListController.calculateSaldo(invoices)}"> <!-- Invoice total -->
<f:convertNumber minFractionDigits="2" locale="de" /> <td style="text-align: right;"><strong> <h:panelGroup
</h:outputText></strong></td> id="invoice_total">
<h:outputText value="#{opListController.calculateInvoiceTotal()}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</h:panelGroup>
</strong></td>
<td /> <td />
<td /> <td style="text-align: right;"><strong>
<h:outputText id="opcalculater_id"
value="#{opListController.calculateSum()}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText></strong></td>
<td /> <td />
<!-- Payment total -->
<td style="text-align: right;"><strong> <h:panelGroup
id="payment_saldo">
<h:outputText value="#{workitem.item['payment.total']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</h:panelGroup>
</strong></td>
<td />
</tr> </tr>
</table> </table>
<!-- dieses feld speichert die selection der rechnungen --> <!-- dieses feld speichert die selection der rechnungen -->
<h:inputTextarea id="invoiceRefHolder_ID" converter="org.imixs.VectorConverter" class="invoice_selection_list" <h:inputTextarea id="invoiceRefHolder_ID"
style="display:none;" value="#{workitem.itemList['$workitemref']}"/> converter="org.imixs.VectorConverter" class="invoice_selection_list"
style="display:none;" value="#{workitem.itemList['$workitemref']}" />
</h:panelGroup> </h:panelGroup>
@ -120,10 +138,31 @@
$(document).ready( $(document).ready(
function() { function() {
// update the checkboxes of the stored invoice uniqueIDs // update the checkboxes of the stored invoice uniqueIDs
updateInvoiceSelection(); // updateInvoiceSelection();
}); });
// set the payment amount to the invoice total if the field is still empty
function initInvoicePayment(element) {
console.log('...initInovicePayment...'+element.checked);
var currentTD=$(element).closest('td');
var prevTD=$(currentTD).prev().prev();
var amountValue=$(prevTD).text();
var amountTD=$(currentTD).prev();
var amountInput=$("input",amountTD);
// wenn wir noch keinen wert dann betrag übernehmen
if (element.checked) {
if ($(amountInput).val()=='' || $(amountInput).val()=='0,00') {
$(amountInput).val(amountValue);
}
} else {
// clear value
$(amountInput).val("");
}
}
// This method refreshs the layout of the invoice checkboxes // This method refreshs the layout of the invoice checkboxes
function updateInvoiceSelection() { function updateInvoiceSelection() {
selection = $('.invoice_selection_list').val(); selection = $('.invoice_selection_list').val();

View file

@ -8,7 +8,7 @@
<h:panelGroup layout="block" styleClass="imixs-form-section" <h:panelGroup layout="block" styleClass="imixs-form-section"
id="paymentlist" > id="paymentlist">
@ -18,33 +18,43 @@
<table class="imixsdatatable imixs-orderitems"> <table class="imixsdatatable imixs-orderitems">
<tr>
<th style="width: 20px;">#</th>
<th style="">Datum<span class="imixs-required"> *</span></th>
<th style="width: 100px;">Betrag</th>
<th style="width: 40px;">Währung</th>
</tr>
<ui:param name="payments"
value="#{workitemLinkController.getExternalReferences('($WorkflowGroup:Zahlungseingang)')}"></ui:param>
<ui:repeat var="payment_stub" value="#{payments}">
<ui:param name="payment"
value="#{opListController.loadInvoice(payment_stub.getUniqueID())}"></ui:param>
<tr> <tr>
<th style="width: 20px;">#</th> <td><h:link outcome="/pages/workitems/workitem">
<th style="">Datum<span class="imixs-required"> #{payment.item['name']}
*</span></th> <f:param name="id" value="#{payment.item['$uniqueid']}" />
<th style="width: 100px;">Betrag</th> </h:link></td>
<td>#{payment.item['payment.total']}
<th style="width: 40px;">Währung</th> </td>
</tr> </tr>
</ui:repeat>
<!-- summary -->
<tr>
<td />
<td style="text-align: right;">Summe:</td>
<td class="orderlist_summary" style="text-align: right;"><h:outputText
value="#{workitem.item['invoice.total']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText></td>
<td />
</tr>
<!-- summary --> </table>
<tr>
<td />
<td style="text-align: right;">Summe:</td>
<td class="orderlist_summary" style="text-align: right;">
<h:outputText
value="#{workitem.item['invoice.total']}">
<f:convertNumber minFractionDigits="2" locale="de" />
</h:outputText>
</td>
<td />
</tr>
</table>

View file

@ -155,7 +155,7 @@ result.isValid=true;
<imixs:value><![CDATA[typcn-cloud-storage||||typcn-tick,imixs-success]]></imixs:value> <imixs:value><![CDATA[typcn-cloud-storage||||typcn-tick,imixs-success]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="txteditorid" type="xs:string"> <imixs:item name="txteditorid" type="xs:string">
<imixs:value><![CDATA[]]></imixs:value> <imixs:value><![CDATA[form_basic_read]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="txttype" type="xs:string"> <imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitemarchive]]></imixs:value> <imixs:value><![CDATA[workitemarchive]]></imixs:value>
@ -235,7 +235,7 @@ result.isValid=true;
<imixs:value><![CDATA[typcn-cloud-storage||||typcn-tick,imixs-error]]></imixs:value> <imixs:value><![CDATA[typcn-cloud-storage||||typcn-tick,imixs-error]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="txteditorid" type="xs:string"> <imixs:item name="txteditorid" type="xs:string">
<imixs:value><![CDATA[]]></imixs:value> <imixs:value><![CDATA[form_basic_read]]></imixs:value>
</imixs:item> </imixs:item>
<imixs:item name="txttype" type="xs:string"> <imixs:item name="txttype" type="xs:string">
<imixs:value><![CDATA[workitemarchive]]></imixs:value> <imixs:value><![CDATA[workitemarchive]]></imixs:value>
@ -485,11 +485,11 @@ result.isValid=true;
<imixs-form-section columns="2" label="Zahlungsdaten"> <imixs-form-section columns="2" label="Zahlungsdaten">
<item name="name" type="text" required="true" label="Referenz:" /> <item name="name" type="text" required="true" label="Referenz:" />
<item name="dbtr.number" type="text" required="true" label="Debitor:" /> <item name="dbtr.number" type="text" required="true" label="Debitor:" />
<item name="payment.total" type="currency" required="true" label="Zahlbetrag:" /> <item name="payment.amount" type="currency" required="true" label="Zahlbetrag:" />
<item name="payment.currency" type="selectOneMenu" required="true" options="EUR;CHF;SEK;RUB;NOK;GBP;USD;CAD" label="Währung:" /> <item name="payment.currency" type="selectOneMenu" required="true" options="EUR;CHF;SEK;RUB;NOK;GBP;USD;CAD" label="Währung:" />
</imixs-form-section> </imixs-form-section>
<imixs-form-section label="Offene Posten" path="alexander/section_opliste" /> <imixs-form-section label="Offene Posten" path="alexander/section_opliste" readonly="false" />
</imixs-form>]]></bpmn2:documentation> </imixs-form>]]></bpmn2:documentation>
<bpmn2:dataState id="DataState_1"/> <bpmn2:dataState id="DataState_1"/>