AntwoordBodyFactory.java

/*
 * Copyright (C) 2017 B3Partners B.V.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package nl.b3p.brmo.stufbg204;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.List;
import java.util.Map;
import nl.egem.stuf.sector.bg._0204.ACDTabel;
import nl.egem.stuf.sector.bg._0204.ADLTabel;
import nl.egem.stuf.sector.bg._0204.ADRAntwoord;
import nl.egem.stuf.sector.bg._0204.ADRFund;
import nl.egem.stuf.sector.bg._0204.ADRRelFund;
import nl.egem.stuf.sector.bg._0204.ANummerE;
import nl.egem.stuf.sector.bg._0204.AcademischeTitelPositieTovNaam;
import nl.egem.stuf.sector.bg._0204.AdellijkeTitelPredikaatE;
import nl.egem.stuf.sector.bg._0204.AdellijkeTitelSoort;
import nl.egem.stuf.sector.bg._0204.BsnNummerE;
import nl.egem.stuf.sector.bg._0204.CodeGeboortelandE;
import nl.egem.stuf.sector.bg._0204.GEMTabel;
import nl.egem.stuf.sector.bg._0204.GeboortedatumE;
import nl.egem.stuf.sector.bg._0204.GeboorteplaatsE;
import nl.egem.stuf.sector.bg._0204.Geslachtsaanduiding;
import nl.egem.stuf.sector.bg._0204.GeslachtsaanduidingE;
import nl.egem.stuf.sector.bg._0204.GeslachtsnaamE;
import nl.egem.stuf.sector.bg._0204.LNDTabel;
import nl.egem.stuf.sector.bg._0204.NATTabel;
import nl.egem.stuf.sector.bg._0204.ObjectFactory;
import nl.egem.stuf.sector.bg._0204.PRSAntwoord;
import nl.egem.stuf.sector.bg._0204.PRSFund.AanduidingNaamgebruik;
import nl.egem.stuf.sector.bg._0204.PRSFund.AcademischeTitel;
import nl.egem.stuf.sector.bg._0204.PRSFund.BurgerlijkeStaat;
import nl.egem.stuf.sector.bg._0204.PRSFund.CodeGemeenteVanInschrijving;
import nl.egem.stuf.sector.bg._0204.PRSFund.CodeLandOverlijden;
import nl.egem.stuf.sector.bg._0204.PRSFund.DatumVerkrijgingVerblijfstitel;
import nl.egem.stuf.sector.bg._0204.PRSFund.DatumVerliesVerblijfstitel;
import nl.egem.stuf.sector.bg._0204.PRSFund.OmschrijvingRedenOpschortingBijhouding;
import nl.egem.stuf.sector.bg._0204.PRSFund.PlaatsOverlijden;
import nl.egem.stuf.sector.bg._0204.PRSVraag;
import nl.egem.stuf.sector.bg._0204.SIBTabel;
import nl.egem.stuf.sector.bg._0204.VBTTabel;
import nl.egem.stuf.sector.bg._0204.VoorlettersE;
import nl.egem.stuf.sector.bg._0204.VoornamenE;
import nl.egem.stuf.sector.bg._0204.VoorvoegselGeslachtsnaamE;
import nl.egem.stuf.stuf0204.DatumMetIndicator;
import nl.egem.stuf.stuf0204.ExtraElement;
import nl.egem.stuf.stuf0204.ExtraElementen;
import nl.egem.stuf.stuf0204.NoValue;
import nl.egem.stuf.stuf0204.Verwerkingssoort;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * @author Meine Toonen
 */
public class AntwoordBodyFactory {

  private static final Log LOG = LogFactory.getLog(AntwoordBodyFactory.class);

  private static final ObjectFactory objFac = new ObjectFactory();

  public AntwoordBodyFactory() {}

  // <editor-fold defaultstate="collapsed" desc="Answermessage creators">
  public static VBTTabel createVerblijfstitel(String omschrijving, BigInteger code) {
    VBTTabel l = new VBTTabel();

    VBTTabel.Omschrijving o = new VBTTabel.Omschrijving();
    o.setValue(omschrijving);

    VBTTabel.Code c = new VBTTabel.Code();
    c.setValue(code);

    l.setOmschrijving(objFac.createVBTTabelOmschrijving(o));
    l.setCode(objFac.createVBTTabelCode(c));

    return l;
  }

  public static SIBTabel createSoortIdentiteitsbewijs(String omschrijving, BigInteger soort) {
    SIBTabel l = new SIBTabel();

    SIBTabel.Soort s = new SIBTabel.Soort();
    s.setValue(soort);

    SIBTabel.Omschrijving o = new SIBTabel.Omschrijving();
    o.setValue(omschrijving);

    l.setOmschrijving(objFac.createSIBTabelOmschrijving(o));
    l.setSoort(objFac.createSIBTabelSoort(s));
    l.setSoortEntiteit("SIB");
    return l;
  }

  public static PRSAntwoord createPersoon(Map<String, Object> values, PRSVraag prs) {
    BigDecimal bsnBD = (BigDecimal) values.get("bsn");
    BigInteger bsnInt = bsnBD.toBigInteger();

    PRSAntwoord p = new PRSAntwoord();

    BsnNummerE bsn = new BsnNummerE();
    bsn.setValue(bsnInt);
    calculateNoValue(bsn);

    p.setBsnNummer(objFac.createPRSFundBsnNummer(bsn));

    if (prs.getVoornamen() != null) {
      VoornamenE v = new VoornamenE();
      v.setGegevengroep("PRS1");
      v.setValue(nullIfEmpty(values.get("nm_voornamen")));
      p.setVoornamen(objFac.createPRSFundVoornamen(v));
      calculateNoValue(v);
    }
    if (prs.getGeslachtsnaam() != null) {
      GeslachtsnaamE g = new GeslachtsnaamE();
      g.setGegevengroep("PRS1");
      g.setValue(nullIfEmpty(values.get("nm_geslachtsnaam")));
      p.setGeslachtsnaam(objFac.createPRSFundGeslachtsnaam(g));
      calculateNoValue(g);
    }
    if (prs.getGeboortedatum() != null) {
      GeboortedatumE gd = new GeboortedatumE();
      gd.setValue(nullIfEmptyBD(values.get("gb_geboortedatum")));
      p.setGeboortedatum(objFac.createPRSFundGeboortedatum(gd));
      calculateNoValue(gd);
    }
    if (prs.getVoorletters() != null) {
      VoorlettersE vl = new VoorlettersE();
      vl.setGegevengroep("PRS1");
      vl.setValue(nullIfEmpty(values.get("na_voorletters_aanschrijving")));
      p.setVoorletters(objFac.createPRSFundVoorletters(vl));
      calculateNoValue(vl);
    }
    if (prs.getVoorvoegselGeslachtsnaam() != null) {
      VoorvoegselGeslachtsnaamE vvgn = new VoorvoegselGeslachtsnaamE();
      vvgn.setGegevengroep("PRS1");
      vvgn.setValue(nullIfEmpty(values.get("nm_voorvoegsel_geslachtsnaam")));
      p.setVoorvoegselGeslachtsnaam(objFac.createPRSFundVoorvoegselGeslachtsnaam(vvgn));
      calculateNoValue(vvgn);
    }
    if (prs.getAdellijkeTitelPredikaat() != null) {
      AdellijkeTitelPredikaatE a = new AdellijkeTitelPredikaatE();
      a.setValue(nullIfEmpty(values.get("nm_adellijke_titel_predikaat")));
      p.setAdellijkeTitelPredikaat(objFac.createPRSFundAdellijkeTitelPredikaat(a));
      calculateNoValue(a);
    }

    if (prs.getAcademischeTitel() != null && prs.getAcademischeTitel().size() > 0) {
      AcademischeTitel at = new AcademischeTitel();
      at.setValue(nullIfEmpty(values.get("fk_2acd_code")));
      p.getAcademischeTitel().add(at);
      calculateNoValue(at);
    }
    if (prs.getANummer() != null) {
      ANummerE aN = new ANummerE();
      aN.setValue(nullIfEmptyBI(values.get("a_nummer")));
      p.setANummer(objFac.createPRSFundANummer(aN));
      calculateNoValue(aN);
    }
    if (prs.getBurgerlijkeStaat() != null) {
      BurgerlijkeStaat bu = new BurgerlijkeStaat();
      bu.setValue(nullIfEmptyBI(values.get("burgerlijke_staat")));
      calculateNoValue(bu);
      p.setBurgerlijkeStaat(objFac.createPRSFundBurgerlijkeStaat(bu));
    }

    if (prs.getDatumInschrijvingGemeente() != null) {
      DatumMetIndicator da = new DatumMetIndicator();
      da.setValue(nullIfEmptyBD(values.get("datum_inschrijving_in_gemeente")));
      calculateNoValue(da);
      p.setDatumInschrijvingGemeente(objFac.createPRSFundDatumInschrijvingGemeente(da));
    }
    if (prs.getDatumVerkrijgingVerblijfstitel() != null) {
      DatumVerkrijgingVerblijfstitel dav = new DatumVerkrijgingVerblijfstitel();
      dav.setValue(nullIfEmptyBD(values.get("datum_verkr_nation")));
      calculateNoValue(dav);
      p.setDatumVerkrijgingVerblijfstitel(objFac.createPRSFundDatumVerkrijgingVerblijfstitel(dav));
    }
    if (prs.getDatumVerliesVerblijfstitel() != null) {
      DatumVerliesVerblijfstitel dvt = new DatumVerliesVerblijfstitel();
      dvt.setValue(nullIfEmptyBD(values.get("datum_verlies_nation")));
      calculateNoValue(dvt);
      p.setDatumVerliesVerblijfstitel(objFac.createPRSFundDatumVerliesVerblijfstitel(dvt));
    }
    if (prs.getDatumVertrekUitNederland() != null) {
      DatumMetIndicator da = new DatumMetIndicator();
      da.setValue(nullIfEmptyBD(values.get("datum_vertrek_uit_nederland")));
      calculateNoValue(da);
      p.setDatumVertrekUitNederland(objFac.createPRSFundDatumVertrekUitNederland(da));
    }
    if (prs.getDatumVestigingInNederland() != null) {
      DatumMetIndicator da = new DatumMetIndicator();
      da.setValue(nullIfEmptyBD(values.get("datum_vestg_in_nederland")));
      calculateNoValue(da);
      p.setDatumVestigingInNederland(objFac.createPRSFundDatumVestigingInNederland(da));
    }
    if (prs.getCodeGemeenteVanInschrijving() != null) {
      CodeGemeenteVanInschrijving co = new CodeGemeenteVanInschrijving();
      co.setValue(nullIfEmptyBI(values.get("gemeente_van_inschrijving")));
      calculateNoValue(co);
      p.setCodeGemeenteVanInschrijving(objFac.createPRSFundCodeGemeenteVanInschrijving(co));
    }
    if (prs.getGeboorteplaats() != null) {
      GeboorteplaatsE gp = new GeboorteplaatsE();
      gp.setValue(nullIfEmpty(values.get("gb_geboorteplaats")));
      calculateNoValue(gp);
      p.setGeboorteplaats(objFac.createPRSFundGeboorteplaats(gp));
    }
    if (prs.getCodeGeboorteland() != null) {
      CodeGeboortelandE cg = new CodeGeboortelandE();
      cg.setValue(nullIfEmptyBI(values.get("fk_gb_lnd_code_iso")));
      calculateNoValue(cg);
      p.setCodeGeboorteland(objFac.createPRSFundCodeGeboorteland(cg));
    }
    if (prs.getDatumOverlijden() != null) {
      DatumMetIndicator da = new DatumMetIndicator();
      da.setValue(nullIfEmptyBD(values.get("ol_overlijdensdatum")));
      calculateNoValue(da);
      p.setDatumOverlijden(objFac.createPRSFundDatumOverlijden(da));
    }
    if (prs.getPlaatsOverlijden() != null) {
      PlaatsOverlijden pl = new PlaatsOverlijden();
      pl.setValue(nullIfEmpty(values.get("fk_gb_lnd_code_iso")));
      calculateNoValue(pl);
      p.setPlaatsOverlijden(objFac.createPRSFundPlaatsOverlijden(pl));
    }
    if (prs.getCodeLandOverlijden() != null) {
      CodeLandOverlijden clo = new CodeLandOverlijden();
      clo.setValue(nullIfEmptyBI(values.get("fk_ol_lnd_code_iso")));
      calculateNoValue(clo);
      p.setCodeLandOverlijden(objFac.createPRSFundCodeLandOverlijden(clo));
    }
    if (prs.getDatumOpschortingBijhouding() != null) {
      DatumMetIndicator da = new DatumMetIndicator();
      da.setValue(nullIfEmptyBD(values.get("datum_opschorting_bijhouding")));
      calculateNoValue(da);
      p.setDatumOpschortingBijhouding(objFac.createPRSFundDatumOpschortingBijhouding(da));
    }
    if (prs.getOmschrijvingRedenOpschortingBijhouding() != null) {
      OmschrijvingRedenOpschortingBijhouding om = new OmschrijvingRedenOpschortingBijhouding();
      om.setValue(nullIfEmpty(values.get("reden_opschorting_bijhouding")));
      calculateNoValue(om);
      p.setOmschrijvingRedenOpschortingBijhouding(
          objFac.createPRSFundOmschrijvingRedenOpschortingBijhouding(om));
    }

    if (prs.getAanduidingNaamgebruik() != null && values.get("aand_naamgebruik") != null) {
      AanduidingNaamgebruik an = new AanduidingNaamgebruik();
      an.setValue(
          nl.egem.stuf.sector.bg._0204.AanduidingNaamgebruik.fromValue(
              nullIfEmpty(values.get("aand_naamgebruik"))));
      calculateNoValue(an);
      p.setAanduidingNaamgebruik(objFac.createPRSFundAanduidingNaamgebruik(an));
    }

    if (prs.getGeslachtsaanduiding() != null && values.get("geslachtsaand") != null) {
      GeslachtsaanduidingE ga = new GeslachtsaanduidingE();
      Geslachtsaanduiding ge =
          Geslachtsaanduiding.fromValue(nullIfEmpty(values.get("geslachtsaand")));
      ga.setValue(ge);
      calculateNoValue(ga);
      p.setGeslachtsaanduiding(objFac.createPRSFundGeslachtsaanduiding(ga));
    }

    if (prs.getPRSADRCOR() != null) {
      List<ADRRelFund> adrcor = p.getPRSADRCOR();
      ADRRelFund a =
          createAdres(
              "teststraat",
              new BigInteger("16"),
              "d",
              "1212",
              new BigInteger("0556"),
              prs.getPRSADRCOR().getValue().getADR());
      a.setSoortEntiteit("R");
      a.setVerwerkingssoort(Verwerkingssoort.I);
      adrcor.add(a);
    }

    if (prs.getPRSADRVBL() != null) {
      List<ADRRelFund> adrcor = p.getPRSADRVBL();
      ADRRelFund a =
          createAdres(
              "teststraat",
              new BigInteger("16"),
              "d",
              "1212",
              new BigInteger("0556"),
              prs.getPRSADRVBL().getValue().getADR());
      adrcor.add(a);
    }

    if (prs.getPRSNAT() != null) {
      NATTabel n = createNationaliteit("NL", new BigInteger("42"));
      PRSAntwoord.PRSNAT nat = new PRSAntwoord.PRSNAT();
      nat.setNAT(n);
      nat.setVerwerkingssoort(Verwerkingssoort.I);
      nat.setSoortEntiteit("R");
      p.getPRSNAT().add(nat);
    }

    return p;
  }

  private static void calculateNoValue(Object element) {
    Class c = element.getClass();
    Object val = null;
    try {
      Method method = element.getClass().getDeclaredMethod("getValue");
      val = method.invoke(element);
    } catch (SecurityException
        | NoSuchMethodException
        | IllegalAccessException
        | IllegalArgumentException
        | InvocationTargetException e) {
      LOG.error("Cannot get value for element " + c.toString(), e);
    }
    if (val == null) {
      try {
        Method method = element.getClass().getDeclaredMethod("setNoValue", NoValue.class);
        val = method.invoke(element, NoValue.GEEN_WAARDE);
      } catch (SecurityException
          | NoSuchMethodException
          | IllegalAccessException
          | IllegalArgumentException
          | InvocationTargetException e) {
        LOG.error("Cannot set NoValue for element " + c.toString(), e);
      }
    }
  }

  public static NATTabel createNationaliteit(String nationaliteit, BigInteger code) {
    NATTabel l = new NATTabel();
    l.setVerwerkingssoort(Verwerkingssoort.I);
    l.setSoortEntiteit("T");
    l.setVerwerkingssoort(Verwerkingssoort.I);
    NATTabel.Omschrijving o = new NATTabel.Omschrijving();
    o.setValue(nationaliteit);

    NATTabel.Code c = new NATTabel.Code();
    c.setValue(code);

    l.setOmschrijving(objFac.createNATTabelOmschrijving(o));
    l.setCode(objFac.createNATTabelCode(c));
    l.setSoortEntiteit("NAT");
    return l;
  }

  public static LNDTabel createLand(String naam, BigInteger code) {
    LNDTabel l = new LNDTabel();

    LNDTabel.Landnaam n = new LNDTabel.Landnaam();
    n.setValue(naam);

    LNDTabel.Landcode c = new LNDTabel.Landcode();
    c.setValue(code);

    l.setLandnaam(objFac.createLNDTabelLandnaam(n));
    l.setLandcode(objFac.createLNDTabelLandcode(c));
    l.setSoortEntiteit("LND");
    return l;
  }

  public static GEMTabel createGemeente(String naam, BigInteger code) {
    GEMTabel g = new GEMTabel();
    GEMTabel.Gemeentenaam n = new GEMTabel.Gemeentenaam();
    n.setValue(naam);

    GEMTabel.Gemeentecode c = new GEMTabel.Gemeentecode();
    c.setValue(code);

    g.setGemeentenaam(objFac.createGEMTabelGemeentenaam(n));
    g.setGemeentecode(objFac.createGEMTabelGemeentecode(c));

    g.setSoortEntiteit("GEM");
    return g;
  }

  public static ACDTabel createAcademischeTitel(String titel, boolean posVoorNaam, String code) {
    ACDTabel t = new ACDTabel();
    ACDTabel.Code c = new ACDTabel.Code();
    c.setExact(true);
    c.setKerngegeven(true);
    c.setNoValue(NoValue.GEEN_WAARDE);
    c.setValue(code);

    ACDTabel.Omschrijving o = new ACDTabel.Omschrijving();
    o.setValue(titel);
    o.setExact(Boolean.FALSE);

    ACDTabel.PositieTovNaam p = new ACDTabel.PositieTovNaam();
    p.setValue(posVoorNaam ? AcademischeTitelPositieTovNaam.V : AcademischeTitelPositieTovNaam.N);

    ExtraElementen e = new ExtraElementen();
    ExtraElement ex = new ExtraElement();
    ex.setNaam("ex1");
    ex.setValue("val1");
    e.getExtraElement().add(ex);

    t.setNoValue(NoValue.NIET_ONDERSTEUND);
    t.setSoortEntiteit("ACD");
    t.setCode(objFac.createACDTabelCode(c));
    t.setOmschrijving(objFac.createACDTabelOmschrijving(o));
    t.setVerwerkingssoort(Verwerkingssoort.V);
    t.setPositieTovNaam(objFac.createACDTabelPositieTovNaam(p));
    t.setExtraElementen(e);

    return t;
  }

  public static ADLTabel createAdelijkeTitel(String titel) {
    ADLTabel t = new ADLTabel();
    ADLTabel.Soort s = new ADLTabel.Soort();
    s.setValue(AdellijkeTitelSoort.A);

    ADLTabel.Omschrijving o = new ADLTabel.Omschrijving();
    o.setValue(titel);
    o.setExact(Boolean.FALSE);

    t.setNoValue(NoValue.GEEN_WAARDE);
    t.setOmschrijving(objFac.createADLTabelOmschrijving(o));
    t.setSoort(objFac.createADLTabelSoort(s));
    t.setVerwerkingssoort(Verwerkingssoort.R);
    t.setSoortEntiteit("ADL");
    return t;
  }

  public static ADRRelFund createAdres(
      String straat,
      BigInteger huisnummer,
      String huisletter,
      String postcode,
      BigInteger gemeentecode,
      ADRFund vraag) {
    ADRRelFund aa = new ADRRelFund();

    ADRAntwoord a = new ADRAntwoord();
    a.setSoortEntiteit("F");
    a.setVerwerkingssoort(Verwerkingssoort.I);

    ADRFund.Straatnaam s = new ADRFund.Straatnaam();
    s.setValue(straat);
    s.setGegevengroep("ADR1");
    calculateNoValue(s);

    ADRFund.Huisnummer h = new ADRFund.Huisnummer();
    h.setValue(huisnummer);
    h.setGegevengroep("ADR1");
    calculateNoValue(h);

    ADRFund.Gemeentecode g = new ADRFund.Gemeentecode();
    g.setValue(gemeentecode);
    calculateNoValue(g);

    ADRFund.Huisletter hl = new ADRFund.Huisletter();
    hl.setValue(huisletter);
    hl.setGegevengroep("ADR1");
    calculateNoValue(hl);

    ADRFund.Postcode p = new ADRFund.Postcode();
    p.setValue(postcode);
    p.setGegevengroep("ADR1");
    calculateNoValue(p);

    ADRFund.Woonplaatsnaam w = new ADRFund.Woonplaatsnaam();
    w.setValue("Maassluis");
    calculateNoValue(w);

    if (vraag.getStraatnaam() != null) {
      a.setStraatnaam(objFac.createADRFundStraatnaam(s));
    }
    if (vraag.getHuisnummer() != null) {
      a.setHuisnummer(objFac.createADRFundHuisnummer(h));
    }
    if (vraag.getHuisletter() != null) {
      a.setHuisletter(objFac.createADRFundHuisletter(hl));
    }
    if (vraag.getGemeentecode() != null) {
      a.setGemeentecode(objFac.createADRFundGemeentecode(g));
    }
    if (vraag.getPostcode() != null) {
      a.setPostcode(objFac.createADRFundPostcode(p));
    }
    if (vraag.getWoonplaatsnaam() != null) {
      a.setWoonplaatsnaam(objFac.createADRFundWoonplaatsnaam(w));
    }
    if (vraag.getAdresBuitenland1() != null) {
      ADRFund.AdresBuitenland1 ab = new ADRFund.AdresBuitenland1();
      ab.setGegevengroep("ADR4");
      a.setAdresBuitenland1(objFac.createADRFundAdresBuitenland1(ab));
      calculateNoValue(ab);
    }
    if (vraag.getAdresBuitenland2() != null) {
      ADRFund.AdresBuitenland2 ab = new ADRFund.AdresBuitenland2();
      ab.setGegevengroep("ADR4");
      a.setAdresBuitenland2(objFac.createADRFundAdresBuitenland2(ab));
      calculateNoValue(ab);
    }
    if (vraag.getAdresBuitenland3() != null) {
      ADRFund.AdresBuitenland3 ab = new ADRFund.AdresBuitenland3();
      ab.setGegevengroep("ADR4");
      a.setAdresBuitenland3(objFac.createADRFundAdresBuitenland3(ab));
      calculateNoValue(ab);
    }
    if (vraag.getLandcode() != null) {
      ADRFund.Landcode lc = new ADRFund.Landcode();
      calculateNoValue(lc);
      a.setLandcode(objFac.createADRFundLandcode(lc));
    }
    if (vraag.getPostbusnummer() != null) {
      ADRFund.Postbusnummer pn = new ADRFund.Postbusnummer();
      calculateNoValue(pn);
      a.setPostbusnummer(objFac.createADRFundPostbusnummer(pn));
    }
    if (vraag.getAntwoordnummer() != null) {
      ADRFund.Antwoordnummer an = new ADRFund.Antwoordnummer();
      calculateNoValue(an);
      a.setAntwoordnummer(objFac.createADRFundAntwoordnummer(an));
    }
    if (vraag.getHuisnummertoevoeging() != null) {
      ADRFund.Huisnummertoevoeging ht = new ADRFund.Huisnummertoevoeging();
      calculateNoValue(ht);
      a.setHuisnummertoevoeging(objFac.createADRFundHuisnummertoevoeging(ht));
    }
    if (vraag.getAanduidingBijHuisnummer() != null) {
      ADRFund.AanduidingBijHuisnummer ah = new ADRFund.AanduidingBijHuisnummer();
      calculateNoValue(ah);
      a.setAanduidingBijHuisnummer(objFac.createADRFundAanduidingBijHuisnummer(ah));
    }

    aa.setADR(a);
    return aa;
  }

  public static String nullIfEmpty(Object e) {
    return e == null ? null : e.toString();
  }

  public static BigDecimal nullIfEmptyBD(Object e) {
    return e == null ? null : new BigDecimal(e.toString());
  }

  public static BigInteger nullIfEmptyBI(Object e) {
    return e == null ? null : new BigInteger(e.toString());
  }

  // </editor-fold>
}