Legacy Claims Portal Home Patterns Handbuch
Java-Quellcode · HTML-first

ProcessClaimDecisionHandler.java

Browserlesbare Ansicht der unveränderten Java-Quelldatei. Die Originaldatei bleibt im Maven-Projekt erhalten.

Zuordnung

Command Handler / Use Case Interactor
Originalpfad03_after_refactoring_modular/claim-application/src/main/java/com/seb4u/demo/claims/application/handler/ProcessClaimDecisionHandler.java

Quellcode

package com.seb4u.demo.claims.application.handler;


/**
 * Entwurfsmuster: Command Handler / Use Case Interactor. Orchestriert einen fachlichen Anwendungsfall über Ports, Repository und Policies.
 */
import com.seb4u.demo.claims.application.command.ProcessClaimDecisionCommand;
import com.seb4u.demo.claims.application.command.ProcessClaimDecisionResult;
import com.seb4u.demo.claims.application.policy.AuthorizationPolicy;
import com.seb4u.demo.claims.application.port.AuditLogPort;
import com.seb4u.demo.claims.application.port.ClaimRepository;
import com.seb4u.demo.claims.application.port.PaymentReleasePort;
import com.seb4u.demo.claims.domain.Claim;
import com.seb4u.demo.claims.domain.ClaimDecisionType;
import com.seb4u.demo.claims.domain.ClaimStatus;
import com.seb4u.demo.claims.domain.ClaimTransitionPolicy;

public class ProcessClaimDecisionHandler {
    private final ClaimRepository repository;
    private final PaymentReleasePort paymentReleasePort;
    private final AuditLogPort auditLogPort;
    private final ClaimTransitionPolicy transitionPolicy;
    private final AuthorizationPolicy authorizationPolicy;

    public ProcessClaimDecisionHandler(
            ClaimRepository repository,
            PaymentReleasePort paymentReleasePort,
            AuditLogPort auditLogPort,
            ClaimTransitionPolicy transitionPolicy,
            AuthorizationPolicy authorizationPolicy) {
        this.repository = repository;
        this.paymentReleasePort = paymentReleasePort;
        this.auditLogPort = auditLogPort;
        this.transitionPolicy = transitionPolicy;
        this.authorizationPolicy = authorizationPolicy;
    }

    public ProcessClaimDecisionResult handle(ProcessClaimDecisionCommand command) {
        authorizationPolicy.requireClaimsDecisionRole(command.roles());
        Claim claim = repository.getRequired(command.claimId());
        ClaimStatus target = targetStatus(command.decisionType());
        transitionPolicy.requireAllowed(claim.status(), target);
        claim.transitionTo(target, command.reason());

        boolean paymentPrepared = false;
        if (command.decisionType() == ClaimDecisionType.RELEASE_PAYMENT) {
            paymentReleasePort.preparePayment(command.claimId(), command.requestedPayment(), command.claimId().value() + ":release-payment");
            paymentPrepared = true;
        }

        repository.save(claim);
        String auditReference = auditLogPort.append(command.claimId(), command.actor(), "PROCESS_CLAIM_DECISION", command.reason());
        return new ProcessClaimDecisionResult(claim.status(), paymentPrepared, auditReference);
    }

    private ClaimStatus targetStatus(ClaimDecisionType decisionType) {
        return switch (decisionType) {
            case APPROVE -> ClaimStatus.APPROVED;
            case REJECT -> ClaimStatus.REJECTED;
            case ESCALATE -> ClaimStatus.ESCALATED;
            case REQUEST_DOCUMENTS -> ClaimStatus.DOCUMENTS_PENDING;
            case RELEASE_PAYMENT -> ClaimStatus.PAYMENT_RELEASED;
        };
    }
}
⌂ Cockpit