neues JournalAccounting
This commit is contained in:
parent
56a60a990d
commit
f52e76374e
2 changed files with 94 additions and 13 deletions
|
|
@ -27,6 +27,18 @@ public class JournalAccounting {
|
||||||
@Column(precision = 19, scale = 4, nullable = false)
|
@Column(precision = 19, scale = 4, nullable = false)
|
||||||
private BigDecimal amount;
|
private BigDecimal amount;
|
||||||
|
|
||||||
|
// base amount (optional)
|
||||||
|
@Column(precision = 19, scale = 4)
|
||||||
|
private BigDecimal baseAmount;
|
||||||
|
|
||||||
|
// ISO currency code (e.g. "USD", "GBP")
|
||||||
|
@Column(length = 3)
|
||||||
|
private String currency;
|
||||||
|
|
||||||
|
// exchange rate (foreign currency -> base currency)
|
||||||
|
@Column(precision = 19, scale = 6)
|
||||||
|
private BigDecimal exchangeRate;
|
||||||
|
|
||||||
@Column()
|
@Column()
|
||||||
private String reference;
|
private String reference;
|
||||||
|
|
||||||
|
|
@ -94,6 +106,30 @@ public class JournalAccounting {
|
||||||
this.amount = amount;
|
this.amount = amount;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public BigDecimal getBaseAmount() {
|
||||||
|
return baseAmount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setBaseAmount(BigDecimal baseAmount) {
|
||||||
|
this.baseAmount = baseAmount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getCurrency() {
|
||||||
|
return currency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCurrency(String currency) {
|
||||||
|
this.currency = currency;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BigDecimal getExchangeRate() {
|
||||||
|
return exchangeRate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setExchangeRate(BigDecimal exchangeRate) {
|
||||||
|
this.exchangeRate = exchangeRate;
|
||||||
|
}
|
||||||
|
|
||||||
public String getReference() {
|
public String getReference() {
|
||||||
return reference;
|
return reference;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -28,9 +28,11 @@
|
||||||
package org.imixs.workflow.office.journal;
|
package org.imixs.workflow.office.journal;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import java.math.RoundingMode;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.imixs.workflow.ItemCollection;
|
import org.imixs.workflow.ItemCollection;
|
||||||
|
import org.imixs.workflow.engine.DocumentService;
|
||||||
import org.imixs.workflow.exceptions.AccessDeniedException;
|
import org.imixs.workflow.exceptions.AccessDeniedException;
|
||||||
import org.imixs.workflow.faces.data.WorkflowEvent;
|
import org.imixs.workflow.faces.data.WorkflowEvent;
|
||||||
|
|
||||||
|
|
@ -41,6 +43,7 @@ import jakarta.annotation.security.RolesAllowed;
|
||||||
import jakarta.annotation.security.RunAs;
|
import jakarta.annotation.security.RunAs;
|
||||||
import jakarta.ejb.Stateless;
|
import jakarta.ejb.Stateless;
|
||||||
import jakarta.enterprise.event.Observes;
|
import jakarta.enterprise.event.Observes;
|
||||||
|
import jakarta.inject.Inject;
|
||||||
import jakarta.persistence.EntityManager;
|
import jakarta.persistence.EntityManager;
|
||||||
import jakarta.persistence.PersistenceContext;
|
import jakarta.persistence.PersistenceContext;
|
||||||
|
|
||||||
|
|
@ -65,6 +68,9 @@ public class JournalAccountingService {
|
||||||
@PersistenceContext(unitName = "org.imixs.workflow.jpa")
|
@PersistenceContext(unitName = "org.imixs.workflow.jpa")
|
||||||
private EntityManager entityManager;
|
private EntityManager entityManager;
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
DocumentService documentService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* WorkflowEvent listener to store an accounting entry
|
* WorkflowEvent listener to store an accounting entry
|
||||||
*
|
*
|
||||||
|
|
@ -116,16 +122,37 @@ public class JournalAccountingService {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update/set values
|
// Update/set values
|
||||||
accounting.setAmount(new BigDecimal(workitem.getItemValueDouble("invoice.total")));
|
|
||||||
accounting.setDate(workitem.getItemValueDate("invoice.date"));
|
accounting.setDate(workitem.getItemValueDate("invoice.date"));
|
||||||
|
|
||||||
|
BigDecimal amount = BigDecimal.valueOf(workitem.getItemValueDouble("invoice.total"))
|
||||||
|
.setScale(2, RoundingMode.HALF_UP);
|
||||||
|
accounting.setAmount(amount);
|
||||||
|
accounting.setCurrency(workitem.getItemValueString("invoice.currency"));
|
||||||
|
// foreign currency
|
||||||
|
if (workitem.getItemValueDouble("invoice.rate") != 0.0) {
|
||||||
|
// YES
|
||||||
|
BigDecimal exchangeRate = BigDecimal.valueOf(workitem.getItemValueDouble("invoice.rate"))
|
||||||
|
.setScale(6, RoundingMode.HALF_UP);
|
||||||
|
// Hauswährung = Fremdwährung * Wechselkurs (auf 2 Stellen gerundet)
|
||||||
|
BigDecimal baseAmount = amount.divide(exchangeRate, 6, RoundingMode.HALF_UP).setScale(2,
|
||||||
|
RoundingMode.HALF_UP);
|
||||||
|
accounting.setExchangeRate(exchangeRate);
|
||||||
|
accounting.setBaseAmount(baseAmount);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// NO
|
||||||
|
accounting.setExchangeRate(null);
|
||||||
|
accounting.setBaseAmount(null);
|
||||||
|
}
|
||||||
|
|
||||||
// Update attributes
|
// Update attributes
|
||||||
// Clear and add attributes (or use selective update if needed)
|
// Clear and add attributes (or use selective update if needed)
|
||||||
accounting.getAttributes().clear();
|
accounting.getAttributes().clear();
|
||||||
accounting.addAttribute("dbtr.name", workitem.getItemValueString("dbtr.name"));
|
accounting.addAttribute("dbtr.name", workitem.getItemValueString("dbtr.name"));
|
||||||
accounting.addAttribute("dbtr.number", workitem.getItemValueString("dbtr.number"));
|
accounting.addAttribute("dbtr.number", workitem.getItemValueString("dbtr.number"));
|
||||||
accounting.addAttribute("space.name", workitem.getItemValueString("space.name"));
|
accounting.addAttribute("space.name", workitem.getItemValueString("space.name"));
|
||||||
// Add more attributes as needed
|
accounting.addAttribute("country", workitem.getItemValueString("invoice.country"));
|
||||||
|
|
||||||
// Persist or merge
|
// Persist or merge
|
||||||
if (accounting.getId() == null) {
|
if (accounting.getId() == null) {
|
||||||
|
|
@ -142,11 +169,12 @@ public class JournalAccountingService {
|
||||||
List<ItemCollection> paymentDetails = InvoiceUtil.explodeChildList(workitem, "payment.details");
|
List<ItemCollection> paymentDetails = InvoiceUtil.explodeChildList(workitem, "payment.details");
|
||||||
|
|
||||||
for (ItemCollection payment : paymentDetails) {
|
for (ItemCollection payment : paymentDetails) {
|
||||||
String workitemRef = payment.getItemValueString("$uniqueid");
|
String invoiceRef = payment.getItemValueString("$uniqueid");
|
||||||
Double amount = payment.getItemValueDouble("payment.amount");
|
BigDecimal amount = BigDecimal.valueOf(payment.getItemValueDouble("payment.amount"))
|
||||||
|
.setScale(2, RoundingMode.HALF_UP);
|
||||||
|
|
||||||
// Find existing payment entry or create new one
|
// Find existing payment entry or create new one
|
||||||
String paymentBusinessRef = workitem.getUniqueID() + "-" + workitemRef;
|
String paymentBusinessRef = workitem.getUniqueID() + "-" + invoiceRef;
|
||||||
JournalAccounting accounting = findAccountingEntryByBusinessRef(paymentBusinessRef,
|
JournalAccounting accounting = findAccountingEntryByBusinessRef(paymentBusinessRef,
|
||||||
workitem.getWorkflowGroup());
|
workitem.getWorkflowGroup());
|
||||||
|
|
||||||
|
|
@ -157,22 +185,39 @@ public class JournalAccountingService {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update payment values
|
// Update payment values
|
||||||
accounting.setAmount(new BigDecimal(amount));
|
|
||||||
accounting.setDate(workitem.getItemValueDate("payment.date"));
|
accounting.setDate(workitem.getItemValueDate("payment.date"));
|
||||||
|
|
||||||
|
// Find the related invoice entry
|
||||||
|
JournalAccounting invoiceEntry = findAccountingEntryByBusinessRef(invoiceRef, "Rechnungsausgang");
|
||||||
|
if (invoiceEntry != null) {
|
||||||
|
accounting.addAttribute("Invoice-Ref", invoiceEntry.getReference());
|
||||||
|
}
|
||||||
|
|
||||||
|
ItemCollection invoice = documentService.load(invoiceRef);
|
||||||
|
accounting.setCurrency(invoice.getItemValueString("invoice.currency"));
|
||||||
|
accounting.setAmount(amount);
|
||||||
|
// foreign currency
|
||||||
|
if (invoice.getItemValueDouble("invoice.rate") != 0.0) {
|
||||||
|
// YES
|
||||||
|
BigDecimal exchangeRate = BigDecimal.valueOf(invoice.getItemValueDouble("invoice.rate"))
|
||||||
|
.setScale(6, RoundingMode.HALF_UP);
|
||||||
|
// Hauswährung = Fremdwährung * Wechselkurs (auf 2 Stellen gerundet)
|
||||||
|
BigDecimal baseAmount = amount.divide(exchangeRate, 6, RoundingMode.HALF_UP).setScale(2,
|
||||||
|
RoundingMode.HALF_UP);
|
||||||
|
accounting.setExchangeRate(exchangeRate);
|
||||||
|
accounting.setBaseAmount(baseAmount);
|
||||||
|
} else {
|
||||||
|
// NO
|
||||||
|
accounting.setExchangeRate(null);
|
||||||
|
accounting.setBaseAmount(null);
|
||||||
|
}
|
||||||
|
|
||||||
// Update attributes
|
// Update attributes
|
||||||
// Clear and add attributes (or use selective update if needed)
|
// Clear and add attributes (or use selective update if needed)
|
||||||
accounting.getAttributes().clear();
|
accounting.getAttributes().clear();
|
||||||
accounting.addAttribute("dbtr.name", workitem.getItemValueString("dbtr.name"));
|
accounting.addAttribute("dbtr.name", workitem.getItemValueString("dbtr.name"));
|
||||||
accounting.addAttribute("dbtr.number", workitem.getItemValueString("dbtr.number"));
|
accounting.addAttribute("dbtr.number", workitem.getItemValueString("dbtr.number"));
|
||||||
accounting.addAttribute("space.name", workitem.getItemValueString("space.name"));
|
accounting.addAttribute("space.name", workitem.getItemValueString("space.name"));
|
||||||
// Add more attributes as needed
|
|
||||||
|
|
||||||
// Find the related invoice entry
|
|
||||||
JournalAccounting invoiceEntry = findAccountingEntryByBusinessRef(workitemRef, "Rechnungsausgang");
|
|
||||||
if (invoiceEntry != null) {
|
|
||||||
accounting.addAttribute("Invoice-Ref", invoiceEntry.getReference());
|
|
||||||
}
|
|
||||||
|
|
||||||
// Persist or merge
|
// Persist or merge
|
||||||
if (accounting.getId() == null) {
|
if (accounting.getId() == null) {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue