Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Methode getBetragMitVorzeichen in Satz erweitert, damit auch leere Vorzeichen für Betrag 0 erlaubt sind. #97

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading