FpML 4.4 Validation Rules - Rules for Loan Messages
This is the Loan part of the validation rule set accompanying the FpML 4.4 Recommendation. The introductory section in the
validation section of the specifications contains background information and documentation for this page.
The rules contained on this page contain links to cut down versions of valid and invalid test cases. The cut down test cases
are non-normative and are provided for the purpose of documentation only.
Content
Namespace
default element namespace = http://www.fpml.org/2007/FpML-4-4
Preconditions
The Validation Preconditions only apply when specific rules reference them. The following preconditions are always to be executed
relative to the root of the FpML document being validated. The context of the rule is NOT carried through to the precondition.
Precondition: SameCurrency
(context: FacilityNotice)
(context: DrawdownNotice)
(context: InterestPaymentNotice)
(context: LoanContractRepayment)
(context: Repayment)
All instances of currency values within the context of this rule must be identical.
Precondition: MultipleInterestRatePeriod
(context: InterestAccrualSchedule)
More than one interestRatePeriod exists.
Precondition: MultipleLenderLoanContractPeriod
(context: InterestAccrualSchedule)
More than one lenderLoanContractPeriod exists.
Precondition: MultipleInterestAccrualPeriod
(context: InterestAccrualSchedule)
More than one interestAccrualPeriod exists.
Rules
Unique contexts:
Context:
LoanContract (complex type)
ln-1 (Mandatory)
currentInterestRatePeriod/startDate >= effectiveDate.
Context:
DrawdownNotice (complex type)
ln-2 (Mandatory)
If loanContract exists and loanContract/currentInterestRatePeriod/floatingRateIndex contains the string PRIME then loanContract/currentInterestRatePeriod/rateFixingDate = loanContract/effectiveDate.
ln-14 (Mandatory)
If loanContract exists, then drawdownPayment/paymentDate >= loanContract/effectiveDate.
ln-15 (Mandatory)
If dealSummary/creditAgreementDate exists, then loanContract/effectiveDate >= dealSummary/creditAgreementDate and drawdownPayment/paymentDate >= dealSummary/creditAgreementDate.
ln-16 (Mandatory)
If facilityCommitmentPosition/priorAmount/shareAmount exists, then drawdownPayment/shareLoanContractAmount <= facilityCommitmentPosition/priorAmount/shareAmount.
ln-17 (Mandatory)
If loanContract exists, then loanContract/amount/amount >= drawdownPayment/shareLoanContractAmount/amount.
ln-18 (Mandatory)
If loanContractSummary exists, then loanContractSummary/originalAmount/amount >= drawdownPayment/shareLoanContractAmount/amount.
Test cases:
ln-19 (Mandatory)
If drawdownEventType = RateSetEvent and loanContract exists, then loanContract/currentInterestRatePeriod/interestRate and loanContract/currentInterestRatePeriod/margin and loanContract/currentInterestRatePeriod/allInRate and loanContract/currentInterestRatePeriod/interestDayBasis and loanContract/currentInterestRatePeriod/indexTenor must exist.
Context:
InterestRatePeriod (complex type)
ln-3 (Mandatory)
endDate >= startDate >= rateFixingDate.
ln-4 (Mandatory)
If mandatoryCostRate doesn't exist and interestRate and margin and allInRate exist, then allInRate = margin + interestRate.
ln-5 (Mandatory)
If mandatoryCostRate and interestRate and margin and allInRate exist, then allInRate = margin + interestRate + mandatoryCostRate.
Context:
InterestAccrualSchedule (complex type)
ln-6 (Mandatory)
interestRatePeriod/startDate,lenderLoanContractPeriod/startDate, interestAccrualPeriod/startDate must be equal in each period.
ln-7 (Mandatory)
The [n]th interestRatePeriod/endDate must be the previous calendar day of the [n+1]th interestRatePeriod/startDate.
ln-8 (Mandatory)
The [n]th lenderLoanContractPeriod/endDate must be the previous calendar day of the [n+1]th lenderLoanContractPeriod/startDate.
ln-9 (Mandatory)
The [n]th interestAccrualPeriod/endDate must be the previous calendar day of the [n+1]th interestAccrualPeriod/startDate.
Context:
FacilityNotice (complex type)
ln-10 (Mandatory)
If facilitySummary/originalCommitmentAmount and facilityCommitmentPosition/loanContractPosition/loanContractSummary/originalAmount exist, then facilitySummary/originalCommitmentAmount/amount >= facilityCommitmentPosition/loanContractPosition/loanContractSummary/originalAmount/amount.
ln-11 (Mandatory)
If facilityCommitmentPosition/loanContractPosition exists, then facilityCommitmentPosition/currentAmount/shareAmount/amount >= the sum of all facilityCommitmentPosition/loanContractPosition/currentAmount/shareAmount/amount.
Test cases:
ln-12 (Mandatory)
If facilityCommitmentPosition/loanContractPosition exists, then facilityCommitmentPosition/priorAmount/shareAmount/amount >= the sum of all facilityCommitmentPosition/loanContractPosition/priorAmount/shareAmount/amount.
Test cases:
ln-30 (Mandatory)
If facilityCommitmentPosition/loanContractPosition/currentAmount/globalAmount and facilityCommitmentPosition/currentAmount/globalAmount/ exist, then facilityCommitmentPosition/currentAmount/globalAmount/amount >= the sum of all facilityCommitmentPosition/loanContractPosition/currentAmount/globalAmount/amount.
Test cases:
ln-31 (Mandatory)
If facilityCommitmentPosition/loanContractPosition/priorAmount/globalAmount and facilityCommitmentPosition/priorAmount/globalAmount exist, then facilityCommitmentPosition/priorAmount/globalAmount/amount >= the sum of all facilityCommitmentPosition/loanContractPosition/priorAmount/globalAmount/amount.
Test cases:
Context:
LoanContractNotice (complex type)
ln-11b (Mandatory)
If facilityCommitmentPosition/loanContractPosition exists, then facilityCommitmentPosition/currentAmount/shareAmount/amount >= the sum of all facilityCommitmentPosition/loanContractPosition/currentAmount/shareAmount/amount.
ln-13 (Mandatory)
If facilityCommitmentPosition/loanContractPosition exists, then facilityCommitmentPosition/priorAmount/shareAmount/amount >= the sum of all facilityCommitmentPosition/loanContractPosition/priorAmount/shareAmount/amount.
Context:
InterestPaymentNotice (complex type)
ln-20 (Mandatory)
interestPayment/amount/shareAmount/amount must be equal to the sum of all interestAccrualSchedule/interestAccrualPeriod/shareInterestAccrualAmount/amount.
ln-21 (Mandatory)
interestAccrualSchedule/interestRatePeriod/interestRate and interestAccrualSchedule/interestRatePeriod/margin and interestAccrualSchedule/interestRatePeriod/allInRate and interestAccrualSchedule/interestRatePeriod/interestDayBasis and interestAccrualSchedule/interestRatePeriod/indexTenor must exist.
Context:
LoanContractRepayment (complex type)
ln-22 (Mandatory)
If loanContractSummary/originalAmount exists, then loanContractSummary/originalAmount/amount >= amount/globalAmount/amount.
Context:
Repayment (complex type)
ln-23 (Mandatory)
facilityRepayment/amount/globalAmount/amount must be >= the sum of all loanContractRepayment/loanContractSummary/originalAmount/amount.
ln-25 (Mandatory)
facilityRepayment/amount/shareAmount/amount must be >= the sum of all loanContractRepayment/amount/shareAmount/amount.
ln-26 (Mandatory)
If loanContractRepayment/amount/globalAmount exists, then facilityRepayment/amount/globalAmount/amount must be >= the sum of all loanContractRepayment/amount/globalAmount/amount.
Test cases:
Context:
RepaymentNotice (complex type)
ln-24 (Mandatory)
If facilityCommitmentPosition exists, then facilityCommitmentPosition/priorAmount/shareAmount/amount >= repayment/facilityRepayment/amount/shareAmount/amount.
Context:
OneOffFeeNotice (complex type)
ln-27 (Mandatory)
If feePayment/feeType = BreakageFee then loanContractSummary must exist.
ln-28 (Mandatory)
If feePayment/feeType = AssignmentFee then loanContractSummary must not exist.
Context:
OneOffFeePayment (complex type)
ln-29 (Mandatory)
paymentDate >= effectiveDate.
Test cases:
Deprecated rules
Removed rules