TreasuryConfig.java

package com.tradecloud.domain.configuration;

import com.tradecloud.common.base.PersistenceBase;
import com.tradecloud.domain.model.deal.AutoLinkReversalDealOptions;
import com.tradecloud.domain.model.deal.ExtensionDealCreationTrigger;
import com.tradecloud.domain.treasury.*;
import org.joda.time.Period;

import javax.persistence.*;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import java.io.IOException;
import java.io.InputStream;
import java.util.*;

@Entity
@Table(name = "treasuryconfig")
@Access(AccessType.FIELD)
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "TreasuryConfig")
public final class TreasuryConfig extends PersistenceBase {

    public static final String REQUIRE_FEC_AUTH_PROPERTY = "treasury.requireFECAuthorization";
    public static final String PREVENT_LINKED_DEAL_TO_BE_AUDITED = "treasury.preventLinkedDealToBeAudited";
    public static final String EXPIRY_PERIOD = "treasury.dealExpiryPeriod";
    public static final String EXPIRY_RATES_PERIOD = "treasury.dealRateExpiryPeriod";

    public static final String NON_BUSINESS_DAYS_OF_WEEK = "treasury.nonBusinessDaysOfWeek";
    public static final String NON_BUSINESS_DAYS_OF_MONTH = "treasury.nonBusinessDaysOfMonth";
    public static final String NON_BUSINESS_DAYS_OF_YEAR = "treasury.nonBusinessDaysOfYear";
    public static final String NON_BUSINESS_DAY_RECALCULATION_POLICY = "treasury.nonBusinessDayRecalculationPolicy";
    public static final String ALLOW_DEAL_SETTLEMENT_BEFORE_INVOICE = "treasury.allowDealSettlementBeforeInvoice";

    public static final String BULKING_POLICY = "treasury.bulkingPolicy";
    public static final String BULKING_POLICY_DATE_RANGE = "treasury.bulkingPolicyDateRange";
    public static final String BULKING_POLICY_DAY_OF_WEEK = "treasury.bulkingPolicyDayOfWeek";
    public static final String BULKING_POLICY_DAY_OF_MONTH = "treasury.bulkingPolicyDayOfMonth";

    public static final String WARN_OF_GROUP_DEAL_AMOUNT_AMENDMENTS = "treasury.warnOfGroupDealAmountAmendments";
    public static final String GROUP_DEAL_AMOUNT_AMENDMENTS = "treasury.groupDealAmountAmendments";
    public static final String MAINTAIN_ORIGINAL_DEAL_RATES = "treasury.maintainOriginalDealRates";
    public static final String ALLOW_ZERO_LINKS = "treasury.allowedZeroLinks";
    public static final String ENABLE_DIVISION_SELECTION_FOR_FEC = "treasury.enableDivisionSelectionForFEC";

    public static final String AUTO_LINK_REVERSAL_DEALS = "treasury.autoLinkReversalDeals";
    public static final String AUTO_LINK_CONFIG = "treasury.autoLinkConfig";
    public static final String AUTO_LINK_STRATEGY = "treasury.autoLinkStrategy";
    public static final String AUTO_LINK_ON_DEAL_STATUS = "treasury.autoLinkOnDealStatus";
    public static final String SURRENDER_MATURED_FEC = "treasury.surrenderMaturedFEC";
    public static final String REPORT_SHIPMENT_DATE_LABEL = "treasury.reportShipmentDateLabel";
    public static final String CLIENT_NAME_MENU_LABEL = "treasury.clientNameMenuLabel";
    public static final String LINK_DEAL_FEC_WITH_DIFF_ORG_UNIT = "treasury.linkDealToFecWithDiffOrgUnit";
    public static final String DEAL_ORG_UNIT_TIER_CODE = "treasury.displayOrganisationUnitLabel";
    public static final String ACCEPT_INTEGRATED_MATURITY_DATE = "treasury.acceptIntegratedMaturityDate";
    public static final String REQUIRES_FEC_CONFIRM_SCREEN = "treasury.requiresFECConfirmScreen";
    public static final String INTEGRATE_TTM_TRADECLOUD = "treasury.integrateTTMTradecloud";
    public static final String MATURITY_TERM = "treasury.maturityTerm";
    public static final String EXTENSION_DEAL_CREATION_TRIGGER = "treasury.extensionDealCreationTrigger";
    public static final String ALLOW_QUOTED_DEALS_TO_LINK_TO_FEC = "treasury.allowQuotedDealsToLinkToFec";
    public static final String ALLOW_PARTIAL_DEAL_LINK_TO_FEC = "treasury.allowPartialDealLinkToFec";
    public static final String LINK_EXTENDED_FEC_AMOUNT = "treasury.linkExtendedFecAmount";
    public static final String ALLOW_MORE_THAN_DEAL_AMOUNT_ALLOCATION = "treasury.allowMoreThanDealAmountAllocation";
    public static final String FEC_ORG_UNIT_TIER_CODE = "treasury.FECOrgUnitTierCode";
    public static final String DEAL_ORG_UNIT_LABEL = "treasury.DealOrgUnitLabel";
    public static final String APPLY_FEC_COSTING_RATE = "treasury.applyFecCostingRate";
    public static final String CONFIRM_MULTIPLE_FEC = "treasury.confirmMultipleFEC";
    public static final String VALIDATE_SHIPMENT_INVOICE = "treasury.validateShipmentInvoice";
    public static final String SETTLEMENT_DATE_LABEL = "treasury.SettlementDateLabel";
    public static final String REPORT_PREFIX = "treasury.reportPrefix";
    public static final String REPORT_FEC_LINKED_TO_ORDERS_BY_ORG = "treasury.fecLinkedToOrdersByOrg";
    public static final String HEDGE_DOCUMENT_BY_CLIENT = "treasury.report.hedgeDocumentByClient";
    public static final String INTEGRATE_PAYMENT = "treasury.payment.integrate";
    public static final String DEAL_SEARCH_SORTBY = "treasury.deal.sortby";
    private static String rateService = System.getenv("rateservice");


    // map to the same property for now
    public static final String EDIT_MATURED_FEC = "treasury.surrenderMaturedFEC";

    @XmlTransient
    private static String propertiesFileName = "treasuryConfig.properties";

    private static Currency defaultLocalCurrency = Currency.getInstance("ZAR");
    private static int maxSearchResultsPerPage = 10;

    public static String divisionServiceRootRESTUrl;
    public static String allDivisionsRESTUrl;
    public static String ratesServicePath;
    public static final String INTERNAL_DEALS_RATE = "internal-deals";
    public static final String LINKED_FEC_RATE = "linked-FEC-rates";
    public static final String LINKED_FEC_INTERNAL_DEALS_RATE = "linked_FEC_internal_deals_rates";
    public static final String ESTIMATE_COSTING_CONFIG = "estimated_costing_config";
    public static final String ACTUAL_COSTING_CONFIG = "actual_costing_config";
    public static final String FOREX_GROUP_DUTIES = "forex_group_Duties";
    public static final String FOREX_GROUP_MERCHANDISE = "forex_group_Merchandise";


    //Below is the
    private boolean surrenderMaturedFEC;
    private boolean allowMoreThanDealAmountAllocation;
    private boolean linkExtendedFecAmount;
    private boolean allowPartialDealLinkToFec;
    private boolean allowQuotedDealsToLinkToFec;
    private boolean integrateTTMTradecloud;
    private boolean acceptIntegratedMaturityDate;
    private boolean linkDealToFecWithDiffOrgUnit;
    private boolean autoLinkOnDealStatus;
    //private boolean   autoLinkReversalDeals;
    @Enumerated(value = EnumType.STRING)
    private AutoLinkReversalDealOptions autoLinkReversalDealOptions;
    private boolean enableDivisionSelectionForFEC;
    private boolean requiresFECConfirmScreen;
    private boolean maintainOriginalDealRates;
    private boolean warnOfGroupDealAmountAmendments;
    private boolean groupDealAmountAmendments;
    private boolean allowDealSettlementBeforeInvoice;
    private boolean preventLinkedDealToBeAudited;
    private boolean requireFECAuthorization;
    private boolean allowedZeroLinks;
    private int dealExpiryPeriodInHours;
    @Enumerated(value = EnumType.STRING)
    private ExtensionDealCreationTrigger extensionDealCreationTrigger;
    @Enumerated(value = EnumType.STRING)
    private AutoLinkConfig autoLinkConfig;
    @Enumerated(value = EnumType.STRING)
    private AutoLinkStrategy autoLinkStrategy;
    //day of the month
    private int bulkingPolicyDayOfMonth;

    private int dealRateExpiryPeriodInHours;

    private int maturityTerm;
    @Enumerated(value = EnumType.STRING)
    private BulkingPolicyDateRange bulkingPolicyDateRange;
    //sat to fri just the first 3 letters.
    private String bulkingPolicyDayOfWeek;

    private String reportShipmentDateLabel;
    @Enumerated(value = EnumType.STRING)
    private BulkingPolicy bulkingPolicy;
    //sat to fri just the first 3 letters.
    @ElementCollection
    @CollectionTable(name = "nonbusinessdaysofweek", joinColumns = @JoinColumn(name = "treasuryconfig_id"))
    private List<String> nonBusinessDaysOfWeek;

    //handled by P::ublicHolidayConfig.
    //private List nonBusinessDaysOfMonth;
    //obsolute is is not used
    //private Set nonBusinessDaysOfYear;
    ;
    //not sure if we need this.
    // private RateSourceType rateSource;

    private String displayOrganisationUnitLabel;

    @ManyToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "treasuryconfig_currencies", joinColumns = {@JoinColumn(name = "treasuryconfig_id", unique = true)},
            inverseJoinColumns = {@JoinColumn(name = "currencies_id", unique = true)})
    private Set<com.tradecloud.domain.common.Currency> currencies = new HashSet<>();

    @ManyToMany
    @JoinTable(name = "treasuryconfig_banks", joinColumns = {@JoinColumn(name = "treasuryconfig_id", unique = true)},
            inverseJoinColumns = {@JoinColumn(name = "banks_id", unique = false)})
    private List<TreasuryBank> banks;

    private String clientNameMenuLabel;


    static {
        Properties properties = retrieveProperties(propertiesFileName);
        populateFrom(properties);
    }

    public static Properties retrieveProperties(String propertiesFileName) {
        InputStream inputStream = TreasuryConfig.class.getResourceAsStream(propertiesFileName);
        Properties properties = new Properties();
        try {
            properties.load(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return properties;
    }

    public static void populateFrom(Properties properties) {
        divisionServiceRootRESTUrl = properties.getProperty("divisionServiceRootRESTUrl");
        allDivisionsRESTUrl = properties.getProperty("allDivisionsRESTUrl");
        ratesServicePath = rateService != null ? rateService + properties.getProperty("ratesServiceEnvPath") :
                properties.getProperty("ratesServicePath");
    }

    // Use GlobalClientConfig.getCurrency
    @Deprecated
    public static Currency getDefaultLocalCurrency() {
        return defaultLocalCurrency;
    }

    public static int getMaxSearchResultsPerPage() {
        return maxSearchResultsPerPage;
    }

    public static Period extractExpiryPeriod(String expiryPeriodStr) {
        int expiryPeriodInt = Integer.parseInt(expiryPeriodStr.split(" ")[0].trim());
        return Period.hours(expiryPeriodInt);
    }

    public boolean isSurrenderMaturedFEC() {
        return surrenderMaturedFEC;
    }

    public void setSurrenderMaturedFEC(boolean surrenderMaturedFEC) {
        this.surrenderMaturedFEC = surrenderMaturedFEC;
    }

    public boolean isAllowMoreThanDealAmountAllocation() {
        return allowMoreThanDealAmountAllocation;
    }

    public void setAllowMoreThanDealAmountAllocation(boolean allowMoreThanDealAmountAllocation) {
        this.allowMoreThanDealAmountAllocation = allowMoreThanDealAmountAllocation;
    }

    public boolean isLinkExtendedFecAmount() {
        return linkExtendedFecAmount;
    }

    public void setLinkExtendedFecAmount(boolean linkExtendedFecAmount) {
        this.linkExtendedFecAmount = linkExtendedFecAmount;
    }

    public boolean isAllowPartialDealLinkToFec() {
        return allowPartialDealLinkToFec;
    }

    public void setAllowPartialDealLinkToFec(boolean allowPartialDealLinkToFec) {
        this.allowPartialDealLinkToFec = allowPartialDealLinkToFec;
    }

    public boolean isAllowQuotedDealsToLinkToFec() {
        return allowQuotedDealsToLinkToFec;
    }

    public void setAllowQuotedDealsToLinkToFec(boolean allowQuotedDealsToLinkToFec) {
        this.allowQuotedDealsToLinkToFec = allowQuotedDealsToLinkToFec;
    }

    public boolean isIntegrateTTMTradecloud() {
        return integrateTTMTradecloud;
    }

    public void setIntegrateTTMTradecloud(boolean integrateTTMTradecloud) {
        this.integrateTTMTradecloud = integrateTTMTradecloud;
    }

    public boolean isAcceptIntegratedMaturityDate() {
        return acceptIntegratedMaturityDate;
    }

    public void setAcceptIntegratedMaturityDate(boolean acceptIntegratedMaturityDate) {
        this.acceptIntegratedMaturityDate = acceptIntegratedMaturityDate;
    }

    public boolean isLinkDealToFecWithDiffOrgUnit() {
        return linkDealToFecWithDiffOrgUnit;
    }

    public void setLinkDealToFecWithDiffOrgUnit(boolean linkDealToFecWithDiffOrgUnit) {
        this.linkDealToFecWithDiffOrgUnit = linkDealToFecWithDiffOrgUnit;
    }

    public boolean isAutoLinkOnDealStatus() {
        return autoLinkOnDealStatus;
    }

    public void setAutoLinkOnDealStatus(boolean autoLinkOnDealStatus) {
        this.autoLinkOnDealStatus = autoLinkOnDealStatus;
    }

    public AutoLinkReversalDealOptions getAutoLinkReversalDealOptions() {
        return autoLinkReversalDealOptions;
    }

    public void setAutoLinkReversalDealOptions(AutoLinkReversalDealOptions autoLinkReversalDealOptions) {
        this.autoLinkReversalDealOptions = autoLinkReversalDealOptions;
    }

    public boolean isEnableDivisionSelectionForFEC() {
        return enableDivisionSelectionForFEC;
    }

    public void setEnableDivisionSelectionForFEC(boolean enableDivisionSelectionForFEC) {
        this.enableDivisionSelectionForFEC = enableDivisionSelectionForFEC;
    }

    public boolean isRequiresFECConfirmScreen() {
        return requiresFECConfirmScreen;
    }

    public void setRequiresFECConfirmScreen(boolean requiresFECConfirmScreen) {
        this.requiresFECConfirmScreen = requiresFECConfirmScreen;
    }

    public boolean isMaintainOriginalDealRates() {
        return maintainOriginalDealRates;
    }

    public void setMaintainOriginalDealRates(boolean maintainOriginalDealRates) {
        this.maintainOriginalDealRates = maintainOriginalDealRates;
    }

    public boolean isWarnOfGroupDealAmountAmendments() {
        return warnOfGroupDealAmountAmendments;
    }

    public void setWarnOfGroupDealAmountAmendments(boolean warnOfGroupDealAmountAmendments) {
        this.warnOfGroupDealAmountAmendments = warnOfGroupDealAmountAmendments;
    }

    public boolean isGroupDealAmountAmendments() {
        return groupDealAmountAmendments;
    }

    public void setGroupDealAmountAmendments(boolean groupDealAmountAmendments) {
        this.groupDealAmountAmendments = groupDealAmountAmendments;
    }

    public boolean isAllowDealSettlementBeforeInvoice() {
        return allowDealSettlementBeforeInvoice;
    }

    public void setAllowDealSettlementBeforeInvoice(boolean allowDealSettlementBeforeInvoice) {
        this.allowDealSettlementBeforeInvoice = allowDealSettlementBeforeInvoice;
    }

    public boolean isPreventLinkedDealToBeAudited() {
        return preventLinkedDealToBeAudited;
    }

    public void setPreventLinkedDealToBeAudited(boolean preventLinkedDealToBeAudited) {
        this.preventLinkedDealToBeAudited = preventLinkedDealToBeAudited;
    }

    public boolean isRequireFECAuthorization() {
        return requireFECAuthorization;
    }

    public void setRequireFECAuthorization(boolean requireFECAuthorization) {
        this.requireFECAuthorization = requireFECAuthorization;
    }

    public boolean isAllowedZeroLinks() {
        return allowedZeroLinks;
    }

    public void setAllowedZeroLinks(boolean allowedZeroLinks) {
        this.allowedZeroLinks = allowedZeroLinks;
    }

    public int getDealExpiryPeriodInHours() {
        return dealExpiryPeriodInHours;
    }

    public void setDealExpiryPeriodInHours(int dealExpiryPeriodInHours) {
        this.dealExpiryPeriodInHours = dealExpiryPeriodInHours;
    }

    public ExtensionDealCreationTrigger getExtensionDealCreationTrigger() {
        return extensionDealCreationTrigger;
    }

    public void setExtensionDealCreationTrigger(ExtensionDealCreationTrigger extensionDealCreationTrigger) {
        this.extensionDealCreationTrigger = extensionDealCreationTrigger;
    }

    public AutoLinkConfig getAutoLinkConfig() {
        return autoLinkConfig;
    }

    public void setAutoLinkConfig(AutoLinkConfig autoLinkConfig) {
        this.autoLinkConfig = autoLinkConfig;
    }

    public AutoLinkStrategy getAutoLinkStrategy() {
        return autoLinkStrategy;
    }

    public void setAutoLinkStrategy(AutoLinkStrategy autoLinkStrategy) {
        this.autoLinkStrategy = autoLinkStrategy;
    }

    public int getBulkingPolicyDayOfMonth() {
        return bulkingPolicyDayOfMonth;
    }

    public void setBulkingPolicyDayOfMonth(int bulkingPolicyDayOfMonth) {
        this.bulkingPolicyDayOfMonth = bulkingPolicyDayOfMonth;
    }

    public int getDealRateExpiryPeriodInHours() {
        return dealRateExpiryPeriodInHours;
    }

    public void setDealRateExpiryPeriodInHours(int dealRateExpiryPeriodInHours) {
        this.dealRateExpiryPeriodInHours = dealRateExpiryPeriodInHours;
    }

    public int getMaturityTerm() {
        return maturityTerm;
    }

    public void setMaturityTerm(int maturityTerm) {
        this.maturityTerm = maturityTerm;
    }

    public BulkingPolicyDateRange getBulkingPolicyDateRange() {
        return bulkingPolicyDateRange;
    }

    public void setBulkingPolicyDateRange(BulkingPolicyDateRange bulkingPolicyDateRange) {
        this.bulkingPolicyDateRange = bulkingPolicyDateRange;
    }

    public String getBulkingPolicyDayOfWeek() {
        return bulkingPolicyDayOfWeek;
    }

    public void setBulkingPolicyDayOfWeek(String bulkingPolicyDayOfWeek) {
        this.bulkingPolicyDayOfWeek = bulkingPolicyDayOfWeek;
    }

    public String getReportShipmentDateLabel() {
        return reportShipmentDateLabel;
    }

    public void setReportShipmentDateLabel(String reportShipmentDateLabel) {
        this.reportShipmentDateLabel = reportShipmentDateLabel;
    }

    public BulkingPolicy getBulkingPolicy() {
        return bulkingPolicy;
    }

    public void setBulkingPolicy(BulkingPolicy bulkingPolicy) {
        this.bulkingPolicy = bulkingPolicy;
    }

    public List<String> getNonBusinessDaysOfWeek() {
        return nonBusinessDaysOfWeek;
    }

    public void setNonBusinessDaysOfWeek(List<String> nonBusinessDaysOfWeek) {
        this.nonBusinessDaysOfWeek = nonBusinessDaysOfWeek;
    }

    public String getDisplayOrganisationUnitLabel() {
        return displayOrganisationUnitLabel;
    }

    public void setDisplayOrganisationUnitLabel(String displayOrganisationUnitLabel) {
        this.displayOrganisationUnitLabel = displayOrganisationUnitLabel;
    }

    public Set<com.tradecloud.domain.common.Currency> getCurrencies() {
        return currencies;
    }

    public void setCurrencies(Set<com.tradecloud.domain.common.Currency> currencies) {
        this.currencies = currencies;
    }

    public List<TreasuryBank> getBanks() {
        return banks;
    }

    public void setBanks(List<TreasuryBank> banks) {
        this.banks = banks;
    }

    public String getClientNameMenuLabel() {
        return clientNameMenuLabel;
    }

    public void setClientNameMenuLabel(String clientNameMenuLabel) {
        this.clientNameMenuLabel = clientNameMenuLabel;
    }
}