From f1b7c04603d615f712a2d72d43d86576a9b16b73 Mon Sep 17 00:00:00 2001 From: Ralph Soika Date: Sat, 14 Sep 2024 18:03:25 +0200 Subject: [PATCH] update analyse zoll/eust --- .../AGLAnalyticController.java | 139 +++++++++++++----- ....0.bpmn => analyse-zolleust-de-1.0.0.bpmn} | 24 +-- 2 files changed, 116 insertions(+), 47 deletions(-) rename workflow/{analyse-de-1.0.0.bpmn => analyse-zolleust-de-1.0.0.bpmn} (96%) diff --git a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticController.java b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticController.java index 7994eb0..bfd2bf6 100644 --- a/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticController.java +++ b/office-alexander-logistics-app/src/main/java/com/alexanderlogistics/AGLAnalyticController.java @@ -62,7 +62,7 @@ public class AGLAnalyticController implements Serializable { } if ("analytic.steuer.trend".equals(event.getKey())) { - event.setValue(computeSteuerbescheideByWeek()); + event.setValue(accumulateSteuerbescheideByWeek()); event.setLabel("Zoll & EUST"); event.setDescription("Fälligkeiten nach KW"); } @@ -81,12 +81,38 @@ public class AGLAnalyticController implements Serializable { double result = 0; for (ItemCollection steuerItemCol : list) { - List positionsTabelle = InvoiceUtil.explodeChildList(steuerItemCol); - for (ItemCollection pos : positionsTabelle) { - if ("EUST".equalsIgnoreCase(pos.getItemValueString("activity.type"))) { - result = result + pos.getItemValueDouble("amount"); - } - } + result = result + getZollBySteuerBeleg(steuerItemCol, "EUST"); + // List positionsTabelle = + // InvoiceUtil.explodeChildList(steuerItemCol); + // for (ItemCollection pos : positionsTabelle) { + // if ("EUST".equalsIgnoreCase(pos.getItemValueString("activity.type"))) { + // result = result + pos.getItemValueDouble("amount"); + // } + // } + + } + return InvoiceUtil.round(result); + } + + /** + * Berechnet die Summe aller offenen Zoll Beträge + * + * @return + */ + private double computeSteuerbescheideZoll() { + logger.info("compute Zoll..."); + List list = getSteuerbescheide(); + double result = 0; + + for (ItemCollection steuerItemCol : list) { + result = result + getZollBySteuerBeleg(steuerItemCol, "ZOLL"); + // List positionsTabelle = + // InvoiceUtil.explodeChildList(steuerItemCol); + // for (ItemCollection pos : positionsTabelle) { + // if ("ZOLL".equalsIgnoreCase(pos.getItemValueString("activity.type"))) { + // result = result + pos.getItemValueDouble("amount"); + // } + // } } return InvoiceUtil.round(result); @@ -111,25 +137,20 @@ public class AGLAnalyticController implements Serializable { } /** - * Berechnet die Summe aller offenen Zoll Beträge + * Berechnet die summ zoll/eust für einen Beleg * + * @param steuerItemCol * @return */ - private double computeSteuerbescheideZoll() { - logger.info("compute Zoll..."); - List list = getSteuerbescheide(); + private double getZollBySteuerBeleg(ItemCollection steuerItemCol, String type) { double result = 0; - - for (ItemCollection steuerItemCol : list) { - List positionsTabelle = InvoiceUtil.explodeChildList(steuerItemCol); - for (ItemCollection pos : positionsTabelle) { - if ("ZOLL".equalsIgnoreCase(pos.getItemValueString("activity.type"))) { - result = result + pos.getItemValueDouble("amount"); - } + List positionsTabelle = InvoiceUtil.explodeChildList(steuerItemCol); + for (ItemCollection pos : positionsTabelle) { + if (type.equalsIgnoreCase(pos.getItemValueString("activity.type"))) { + result = result + pos.getItemValueDouble("amount"); } - } - return InvoiceUtil.round(result); + return result; } private List getSteuerbescheide() { @@ -168,16 +189,11 @@ public class AGLAnalyticController implements Serializable { * * @return */ - private String computeSteuerbescheideByWeek() { - logger.info("compute steuer by kw..."); + private String accumulateSteuerbescheideByWeek() { + logger.info("accumulate steuer by week..."); List list = getSteuerbescheide(); - - Map saldoByWeek = new HashMap<>(); - // SimpleDateFormat weekFormat = new SimpleDateFormat("w"); // 'w' gives the - // week number - // SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy"); // 'yyyy' for the - // year + Map saldoByWeek = new HashMap<>(); Calendar calendar = Calendar.getInstance(); int earliestWeek = Integer.MAX_VALUE; int latestWeek = Integer.MIN_VALUE; @@ -194,7 +210,12 @@ public class AGLAnalyticController implements Serializable { int yearWeek = year * 100 + weekNumber; // Unique key for each year + week combination // Accumulate the saldo per week - saldoByWeek.put(yearWeek, saldoByWeek.getOrDefault(yearWeek, 0.0) + saldo); + SteuerData steuerDataByWeek = saldoByWeek.getOrDefault(yearWeek, new SteuerData()); + double eust = getZollBySteuerBeleg(steuerItemCol, "EUST"); + double zoll = getZollBySteuerBeleg(steuerItemCol, "ZOLL"); + steuerDataByWeek.add(eust, zoll, saldo); + + saldoByWeek.put(yearWeek, steuerDataByWeek); // Track the earliest and latest weeks earliestWeek = Math.min(earliestWeek, yearWeek); @@ -203,7 +224,9 @@ public class AGLAnalyticController implements Serializable { // Step 2: Prepare the JSON structure and ensure we have all weeks from earliest // to latest - JsonArrayBuilder dataBuilder = Json.createArrayBuilder(); + JsonArrayBuilder dataBuilderSaldo = Json.createArrayBuilder(); + JsonArrayBuilder dataBuilderEust = Json.createArrayBuilder(); + JsonArrayBuilder dataBuilderZoll = Json.createArrayBuilder(); JsonArrayBuilder labelsBuilder = Json.createArrayBuilder(); Calendar startCal = Calendar.getInstance(); @@ -220,7 +243,10 @@ public class AGLAnalyticController implements Serializable { int yearWeek = year * 100 + weekNumber; // Add the saldo for the week or 0.0 if no data - dataBuilder.add(saldoByWeek.getOrDefault(yearWeek, 0.0)); + SteuerData steuerData = saldoByWeek.getOrDefault(yearWeek, new SteuerData()); + dataBuilderSaldo.add(steuerData.saldo); + dataBuilderEust.add(steuerData.eust); + dataBuilderZoll.add(steuerData.zoll); labelsBuilder.add(weekNumber + "/" + year); // Label as 'week/year' // Move to the next week @@ -232,14 +258,57 @@ public class AGLAnalyticController implements Serializable { .add("type", "bar") .add("data", Json.createObjectBuilder() .add("datasets", Json.createArrayBuilder() - .add(Json.createObjectBuilder() - .add("data", dataBuilder))) + + .add(Json.createObjectBuilder() // First dataset for 'tax' + .add("label", "Zoll") + .add("backgroundColor", "#96f") + .add("borderWidth", 1) + .add("data", dataBuilderZoll)) + .add(Json.createObjectBuilder() // Second dataset for 'eust' + .add("label", "EUSt") + .add("backgroundColor", "#36a2eb") + .add("borderWidth", 1) + .add("data", dataBuilderEust)) + .add(Json.createObjectBuilder() // Third dataset for 'Saldo' + .add("label", "Saldo") + .add("backgroundColor", "#ff6384") + .add("borderWidth", 1) + .add("data", dataBuilderSaldo))) + .add("labels", labelsBuilder)); // Step 4: Return the JSON structure as a string JsonObject chartCfg = jsonBuilder.build(); - return chartCfg.toString(); // JSON as string - + return chartCfg.toString(); } + /** + * Helper method to hold zoll and eust totls in an object. Needed to build + * totals per week. + */ + class SteuerData { + double total = 0.0; + double zoll = 0.0; + double eust = 0.0; + double saldo = 0.0; + + public SteuerData() { + // default constructor + } + + /** + * Adds new zoll and eust values and updates the total + * + * @param eustNew eust value to be added + * @param zollNew zoll value to be added + */ + public void add(double eustNew, double zollNew, double saldoNew) { + eust = eust + eustNew; + zoll = zoll + zollNew; + saldo = saldo + saldoNew; + // update total + total = eust + zoll; + } + + } } diff --git a/workflow/analyse-de-1.0.0.bpmn b/workflow/analyse-zolleust-de-1.0.0.bpmn similarity index 96% rename from workflow/analyse-de-1.0.0.bpmn rename to workflow/analyse-zolleust-de-1.0.0.bpmn index 470d4ee..2cbae9e 100644 --- a/workflow/analyse-de-1.0.0.bpmn +++ b/workflow/analyse-zolleust-de-1.0.0.bpmn @@ -2,18 +2,18 @@ - + - - - + + + - - - + + + @@ -74,7 +74,7 @@ th { font-weight: bold;} ]]> - + @@ -82,7 +82,7 @@ th { font-weight: bold;} - + StartEvent_1 @@ -250,7 +250,7 @@ th { font-weight: bold;} - + ]]> @@ -329,10 +329,10 @@ th { font-weight: bold;} - + - +