using System.Xml.Linq; using CRIF.ACTion.Common; using CRIF.ACTion.Common.Builders; using CRIF.ACTion.Configuration; using Landmark.OLA.Models; namespace CRIF.ACTion.Loan.Individuals { public class AppPartiesSection : CrifRequestSection { public AppPartiesSection(XNamespace sectionNamespace, CrifSettings settings) : base(sectionNamespace, "appParties", settings) { } public void AddIndividualParty(IReferenceable individual, PartyType partyType, bool hasOptedOutTCPA = false) { var borrowerTypeString = partyType == PartyType.primaryBorrower ? "primaryBorrower" : "borrower"; var individualParty = new XElement(CrifNamespaces.App + borrowerTypeString, new XAttribute(CrifNamespaces.Common + "idRef", individual.Id), new XAttribute(CrifNamespaces.Common + "partyType", "Individual"), new XAttribute(CrifNamespaces.App + "isCollateralGrantorFL", false) ); individualParty.Add(GetCustomField(partyType, hasOptedOutTCPA)); AddContent(individualParty); } private XElement GetTCPACustomField() { var customField = GetBoolFieldLinkElement(CrifConstants.TCPA_Opt_Out_Field_Id, true, "IndividualApplicant"); return customField; } private XElement GetCustomField(PartyType type, bool includeTCPAOptOut) { var fieldValue = type switch { PartyType.NonSigningSpouseMarriedToCoBorrower => CrifConstants.Borrower_IsApplicantNonSigningSpouse_Field_NonSigningMarriedToCo, PartyType.NonSigningSpouseMarriedToPrimary => CrifConstants.Borrower_IsApplicantNonSigningSpouse_Field_NonSigningMarriedToPrimary, _ => CrifConstants.Borrower_IsApplicantNonSigningSpouse_Field_Borrower, }; var customField = GetLookupFieldLinkElement(CrifConstants.Borrower_IsApplicantNonSigningSpouse_Field_Id, fieldValue, "IndividualApplicant"); if (includeTCPAOptOut) { var tcpaField = GetTCPACustomField(); var fieldsElementWithTCPA = new XElement(CrifNamespaces.App + "fields", customField, tcpaField); return fieldsElementWithTCPA; } var fieldsElement = new XElement(CrifNamespaces.App + "fields", customField); return fieldsElement; } public void SetSourceChannel(Guid channelId) { var sourceChannel = new XElement(CrifNamespaces.App + "sourceChannel", new XAttribute(CrifNamespaces.Common + "idRef", channelId), new XAttribute(CrifNamespaces.Common + "partyType", "Channel")); AddContent(sourceChannel); } public void SetServicingChannel(Guid channelId) { var servicingChannel = new XElement(CrifNamespaces.App + "servicingChannel", new XAttribute(CrifNamespaces.Common + "idRef", channelId), new XAttribute(CrifNamespaces.Common + "partyType", "Channel")); AddContent(servicingChannel); } private static XElement GetLookupFieldLinkElement(int Id, int value, string fieldLevel) { var lookupFieldLinkElement = new XElement(CrifNamespaces.Common + "lookupFieldLink", new XAttribute(CrifNamespaces.Common + "value", value), new XElement(CrifNamespaces.Common + "customLookupField", new XAttribute(CrifNamespaces.Common + "ID", Id), new XAttribute(CrifNamespaces.Common + "fieldLevel", fieldLevel))); return lookupFieldLinkElement; } private static XElement GetBoolFieldLinkElement(int Id, bool value, string fieldLevel) { var lookupFieldLinkElement = new XElement(CrifNamespaces.Common + "boolFieldLink", new XAttribute(CrifNamespaces.Common + "value", value), new XElement(CrifNamespaces.Common + "customLookupField", new XAttribute(CrifNamespaces.Common + "ID", Id), new XAttribute(CrifNamespaces.Common + "fieldLevel", fieldLevel))); return lookupFieldLinkElement; } public enum PartyType { primaryBorrower, borrower, NonSigningSpouseMarriedToPrimary, NonSigningSpouseMarriedToCoBorrower, } } }