Sparte anlegen

Modul Business

Modul Business anlegen

Im Modul business wird die Geschäftslogik implementiert. Abhängigkeiten sind auf das Modul verkaufsprodukte und auf die business Komponente von IOS-Basis.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>de.faktorzehn.ios</groupId>
        <artifactId>ios-expert-unfall</artifactId>
        <version>25.7.0-SNAPSHOT</version>
    </parent>

    <artifactId>ios-expert-unfall-business</artifactId>
    <name>Faktor-IOS-Expert Unfall-Business</name>
    <packaging>jar</packaging>

    <properties>
        <checkstyle.header.file>${project.basedir}/../../checkstyle.java.header</checkstyle.header.file>
    </properties>

    <dependencies>
        <dependency>
            <groupId>de.faktorzehn.ios</groupId>
            <artifactId>ios-core-impl</artifactId>
        </dependency>
        <dependency>
            <groupId>de.faktorzehn.ios</groupId>
            <artifactId>ios-expert-unfall-verkaufsprodukte</artifactId>
        </dependency>
        <dependency>
            <groupId>de.faktorzehn.systems</groupId>
            <artifactId>ios-basis-business</artifactId>
        </dependency>
        <!-- Faktor Zehn Dependencies -->
        <dependency>
            <groupId>de.faktorzehn.muster.shu-privat</groupId>
            <artifactId>vm-unfall-extapi</artifactId>
        </dependency>
        <dependency>
            <groupId>de.faktorzehn.muster.shu-privat</groupId>
            <artifactId>vm-unfall-extapimapper</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
                        <manifest>
                            <addClasspath>false</addClasspath>
                        </manifest>
                    </archive>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

Sparte konfigurieren

Folgende Klassen müssen im Modul business erstellt werden.

UvLobConfig

In der Klasse UvLobConfig wird die Sparte konfiguriert.

/**
 * Konfiguration der Sparte Unfall.
 */
@Component
public class UvLobConfig extends VbLobConfig {

    public static final String LOB_ID = "uv";

    @Autowired
    @Lazy
    @CheckForNull
    private IUvPolicyManagementFacade uvFacade;

    @Autowired
    public UvLobConfig(LobInitializationContainer initContainer, PartnerRepository partnerRepository) {
        super(LOB_ID, initContainer, partnerRepository);
    }

    @Override
    public IProductConfiguration getProductConfiguration() {
        return UvProductConfigurationProvider.getProductConfiguration();
    }

    @Override
    public UvVersicherungOperations getVersicherungOperations() {
        return new UvVersicherungOperations();
    }

    @Override
    public String getName(Locale locale) {
        return "Unfall";
    }

    @Override
    public VorversicherungsInfoConfiguration getVorversicherungsInfoConfiguration() {
        VuVerzeichnis vuVerzeichnis = VuVerzeichnis.getInstance(getProductConfiguration().getRepository());
        return new UvVorversicherungsInfoConfiguration(vuVerzeichnis);
    }

    @Override
    public CreateOfferProcess getCreateOfferProcess(ProcessContext context) {
        // Im context muss eine Instanz des Users hinzugefügt sein
        return new UvCreateOfferProcessImpl(VbProcessContext.Builder.from((VbProcessContext)context)//
                .offerNumberGenerator(getOfferNumberGenerator())//
                .iosApplication(getIOSApplication())//
                .productConfiguration(getProductConfiguration())//
                .partnerCache(getPartnerCache())//
                .versicherungOperations(getVersicherungOperations())//
                .get());
    }

    @Override
    protected IPolicyManagementFacade getPolicyManagementFacade() {
        return requireNonNull(uvFacade, "uvFacade darf nicht null sein");
    }


    ...
}
UvProductConfigurationProvider

In der Klasse UvProductConfigurationProvider werden alle Modell- und Produktrepositories zusammengeführt. Der Provider ordnet die Struktur der Repositories in folgender Weise an:

  • Das neu erstellte Verkaufsprodukte-Modul ist die Ausgangsbasis, die weitere RuntimeRepositories referenziert,

  • Referenz auf ein Repository, das alle Repositories aus dem Faktor-IOS-Core-Projekt beinhaltet,

  • Referenz auf das Repository aus der Faktor-IOS-Versicherungsbasis,

  • Referenz auf ein Repository mit den spartenspezifischen Produktdaten, welches alle notwendigen Modell- und Produktrepositories des spartenspezifischen (kundenindividuellen) und releasefesten Versicherungsmodells beinhaltet,

  • ggf. Referenz auf das F10-Partnermodell und (kundenindividuelle) Partner-Produktdaten,

  • ggf. Referenz auf sonstige kundenindividuelle oder F10 Modell- und Produktrepositories (z.B. das Fragebogenmodell).

/**
 * Produktkonfiguration mit allen benötigten FIPS-RuntimeRepositories.
 */
@UtilityClass
public class UvProductConfigurationProvider {
    private static final String DE_FAKTORZEHN_PARTNER_MODELL = "de/faktorzehn/partnerinterface/model/internal/partner-model-repository-toc.xml";

    private static final IRuntimeRepository RUNTIME_REPOSITORY = createRuntimeRepository();
    private static final IProductConfiguration PRODUCT_CONFIGURATION = new DefaultProductConfiguration(
            RUNTIME_REPOSITORY);

    private UvProductConfigurationProvider() {
        //
    }

    /**
     * Gibt das {@link IRuntimeRepository} zurück.
     */
    public static IRuntimeRepository getRuntimeRepository() {
        return RUNTIME_REPOSITORY;
    }

    /**
     * Gibt die {@link IProductConfiguration} zum Zugriff auf die Produktdaten zurück.
     */
    public static IProductConfiguration getProductConfiguration() {
        return PRODUCT_CONFIGURATION;
    }

    private static IRuntimeRepository createRuntimeRepository() {

        AbstractRuntimeRepository uvExpertVerkaufsprodukteRepo = UvIosVerkaufsprodukteClassloaderRuntimeRepository.INSTANCE;

        // Basis-Modell
        uvExpertVerkaufsprodukteRepo.addDirectlyReferencedRepository(createRepository(DE_FAKTORZEHN_PARTNER_MODELL));
        uvExpertVerkaufsprodukteRepo.addDirectlyReferencedRepository(
                IosCoreClassloaderRuntimeRepositoryUtil.createIosCoreRuntimeRepository());
        uvExpertVerkaufsprodukteRepo.addDirectlyReferencedRepository(IosBasisVmClassloaderRuntimeRepository.INSTANCE);

        return uvExpertVerkaufsprodukteRepo;
    }

    private static ClassloaderRuntimeRepository createRepository(String tocPath) {
        ClassloaderRuntimeRepository repository = ClassloaderRuntimeRepository.create(tocPath);
        repository.setFormulaEvaluatorFactory(new GroovyFormulaEvaluatorFactory());
        return repository;
    }

}

Die Runtime-Repository-Klasse UvIosVerkaufsprodukteClassloaderRuntimeRepository führt alle Modell- und Produktrepositories für das spartenspezifische Versicherungsmodell zusammen.

/**
 * Produktrepository mit allen für die Sparte Unfall relevanten Verkaufsproduktdaten sowie allen
 * transitiv verfügbaren Daten des Versicherungsmodells.
 */
public class UvIosVerkaufsprodukteClassloaderRuntimeRepository {

    public static final ClassloaderRuntimeRepository INSTANCE = ClassloaderRuntimeRepository
            .create("de/faktorzehn/ios/uv/produkte/internal/uvverkaufsprodukte-repository-toc.xml");

    static {
        INSTANCE.setFormulaEvaluatorFactory(new GroovyFormulaEvaluatorFactory());

        INSTANCE.addDirectlyReferencedRepository(UvProduktClassloaderRuntimeRepository.INSTANCE);
    }

    private UvIosVerkaufsprodukteClassloaderRuntimeRepository() {
        // Util-Klasse
    }

}
UvCreateOfferProcessImpl

In der Klasse UvCreateOfferProcessImpl werden zusätzlich zum Angebotserstellungsprozess im Standard konkrete Feinheiten der Sparte gesteuert.

/**
 * Unfall Implementierung.
 */
public class UvCreateOfferProcessImpl extends VbCreateOfferProcessImpl {

	public UvCreateOfferProcessImpl(ProcessContext context) {
        super(context);
    }

    @Override
    protected UvVersicherungOperations getVersicherungOperations() {
        return (UvVersicherungOperations)super.getVersicherungOperations();
    }

    @Override
    protected Optional<DefaultVariantBuilderSupport> variantBuilderSupport() {
        return Optional.of(new UvVariantBuilderSupport(getVersicherungOperations(), getInitialOfferVariantStatus(),
                getPartnerCache()));
    }

}

Hierbei sind zwei Anwendungsfälle üblich:

  • Wenn das Versicherungsmodell das direkte Anlegen von Varianten zulässt, kann createOffer(StartOfferData data) überschrieben und um den Methodenaufruf createVariants(offer) erweitert werden.

  • Wenn vor dem Erstellen von Angebotsvarianten noch Angaben zur Versicherung während des Angebotsprozesses vorgenommen werden müssen, kann createVersicherung(VbStartNewOfferData data) überschrieben werden, um eine Versicherung mit minimalen Daten zu erstellen, die im Angebot in den VbInitializationData abgelegt wird.

UvVariantBuilderSupport

Um während der Erstellung der Angebotsvarianten die Versicherungdaten zu initialisieren, wird die Klasse UvVariantBuilderSupport in der Methode UvCreateOfferProcessImpl.variantBuilderSupport() erzeugt und zurückgegeben.

/**
 * Varianten Builder Support wird aufgerufen, wenn eine Variante erzeugt wird.
 */
public class UvVariantBuilderSupport extends VbVariantenBuilderSupport {

    public UvVariantBuilderSupport(RvVersicherungOperations operations, EditingStatus editingStatus,
            PartnerCache partnerCache) {
        super(operations, editingStatus, partnerCache);
    }

    @Override
    public void postCreation(int index, OfferVariant variant) {
        super.postCreation(index, variant);

        // weitere Initialisierungen

    }
}
UvPolicyManagementFacade

Zuerst wird ein Interface erstellt, das von IPolicyManagementFacade ableitet, damit die Spring-Technologie über die UvLobConfig die spartenspezifsche PolicyManagementFacade erkennt.

/**
 * Spartenspezifisches Interface für Unfall zur Unterscheidung der Implementierung der
 * Bestandssystemanbindung.
 */
public interface IUvPolicyManagementFacade extends IPolicyManagementFacade {
    //
}

Danach wird von diesem Interface die konkrete Klasse UvPolicyManagementFacade implementiert. Implementierungsdetails können entweder direkt in der Klasse vorgenommen werden, oder diese kommen von einer Klasse mit Standardimplementierungen (z.B. die im Standard enthaltene Klasse IpmPolicyRestService bei einer IPM-Anbindung), von der die UvPolicyManagementFacade ableiten kann.

/**
 * Implementierung der Schnittstelle zur Anlage einer neuen Police
 */
public interface UvPolicyManagementFacade implements IUvPolicyManagementFacade {

    //Implementierungsdetails
}