Skip to content

Commit

Permalink
Merge pull request #97 from qa-florian-wende/feature-leere-vorzeichen…
Browse files Browse the repository at this point in the history
…-werte

Methode getBetragMitVorzeichen in Satz erweitert, damit auch leere Vorzeichen für Betrag 0 erlaubt sind.
  • Loading branch information
oboehm authored Aug 31, 2024
2 parents e2a5521 + bf32117 commit e93c1c6
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 9 deletions.
31 changes: 22 additions & 9 deletions lib/src/main/java/gdv/xport/satz/Satz.java
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,7 @@ private void setSatzversion(final String version) {

/**
* Liefert die Satzversion
*
*
* @return die Satzversion
*/
public final AlphaNumFeld getSatzversion() {
Expand Down Expand Up @@ -613,12 +613,25 @@ public <T extends Feld> T getFeld(final Bezeichner bezeichner, final Class<T> cl
}

private BetragMitVorzeichen getBetragMitVorzeichen(final Bezeichner bezeichner) {
Betrag betrag = getFeld(bezeichner, Betrag.class);
Feld vorzeichen = getVorzeichenOf(bezeichner);
BetragMitVorzeichen bmv = new BetragMitVorzeichen(Bezeichner.of(bezeichner.getName() + " mit Vorzeichen"),
betrag.getAnzahlBytes()+1, ByteAdresse.of(betrag.getByteAdresse()));
bmv.setInhalt(betrag.getInhalt() + vorzeichen.getInhalt());
return bmv;
Betrag betrag = getFeld(bezeichner, Betrag.class);

// Das Vorzeichenfeld darf leer sein (aber nur, wenn der Betrag dazu 0 ist!), in diesem Fall ersetzen wir es vor
// der Instanziierung von BetragMitVorzeichen durch ein "+", damit die weitere numerische Verarbeitung funktioniert.
Feld vorzeichen = getVorzeichenOf(bezeichner);
String vorzeichenInhalt = vorzeichen.getInhalt();
if (StringUtils.isBlank(vorzeichenInhalt)) {
if (StringUtils.isNotBlank(betrag.getInhalt()) && !StringUtils.repeat('0', betrag.getAnzahlBytes()).equals(betrag.getInhalt())) {
throw new IllegalStateException("Vorzeichenfeld ist leer fuer " + bezeichner + ", aber Betrag ist nicht 0.");
}
vorzeichenInhalt = "+";
}

BetragMitVorzeichen bmv = new BetragMitVorzeichen(
Bezeichner.of(bezeichner.getName() + " mit Vorzeichen"),
betrag.getAnzahlBytes() + 1, ByteAdresse.of(betrag.getByteAdresse())
);
bmv.setInhalt(betrag.getInhalt() + vorzeichenInhalt);
return bmv;
}

private Feld getVorzeichenOf(final Bezeichner bezeichner) {
Expand Down Expand Up @@ -928,7 +941,7 @@ public void export(final OutputStream ostream) throws IOException {
public Satz importFrom(final String s) throws IOException {
return importFrom(new PushbackLineNumberReader(new StringReader(s), 256));
}

protected void removeUnusedTeildatensaetze(SortedSet<Integer> usedIndexes) {
Teildatensatz[] usedTeildatensaetze = new Teildatensatz[usedIndexes.size()];
int i = 0;
Expand Down Expand Up @@ -1314,7 +1327,7 @@ private static boolean contains(Bezeichner bezeichner, List<Feld> felder) {

/**
* Legt eine Kopie des Satzes an.
*
*
* @return Kopie
* @throws CloneNotSupportedException sollte nicht auftreten
* @see Cloneable
Expand Down
18 changes: 18 additions & 0 deletions lib/src/test/java/gdv/xport/satz/SatzTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,24 @@ public void testGetBetragMitVorzeichen() {
assertEquals(new BigDecimal("-1.23"), betrag.toBigDecimal());
}

@Test
public void testGetBetragMitLeeremVorzeichen() {
Satz satz = SatzFactory.getSatz(SatzTyp.of(500));
satz.setFeld(Bezeichner.SCHADENBEARBEITUNGSKOSTEN_IN_WAEHRUNGSEINHEITEN, "00000001234");
satz.getTeildatensatz(1).setFeld(ByteAdresse.of(167), "");

// Leeres Vorzeichen, aber nicht leerer Betrag -> IllegalStateException
assertThrows(IllegalStateException.class, () -> satz.getFeld(Bezeichner.SCHADENBEARBEITUNGSKOSTEN_IN_WAEHRUNGSEINHEITEN, BetragMitVorzeichen.class));

// Leeres Vorzeichen und Betrag 0 -> Vorzeichen-Feld weiter leer, aber der Betrag mit Vorzeichen ist "+0"
satz.setFeld(Bezeichner.SCHADENBEARBEITUNGSKOSTEN_IN_WAEHRUNGSEINHEITEN, "00000000000");
BetragMitVorzeichen betrag = satz.getFeld(Bezeichner.SCHADENBEARBEITUNGSKOSTEN_IN_WAEHRUNGSEINHEITEN, BetragMitVorzeichen.class);
assertEquals(14, betrag.getAnzahlBytes());
assertEquals('+', betrag.getVorzeichen());
assertEquals(" ", satz.getFeld(ByteAdresse.of(167)).getInhalt());
assertEquals(0, betrag.toBigDecimal().compareTo(BigDecimal.ZERO));
}

/**
* Testfall fuer Issue #12.
*/
Expand Down

0 comments on commit e93c1c6

Please sign in to comment.