FpML 4.5 Validation Rules - Rules for Loan Messages

This is the Loan part of the validation rule set accompanying the FpML 4.5 Working Draft. 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/2008/FpML-4-5

namespace xs = http://www.w3.org/2001/XMLSchema

Functions

The following shared functions are used in the rules.

Rules

Unique contexts:

ln-1 (Mandatory)
Context: LoanContract (complex type)
currentInterestRatePeriod/startDate >= effectiveDate.
Test cases: [Valid] [Invalid]
ln-2 (Mandatory)
Context: DrawdownNotice (complex type)
[exists(loanContract)] [loanContract/currentInterestRatePeriod/floatingRateIndex = "PRIME"]
loanContract/currentInterestRatePeriod/rateFixingDate = loanContract/effectiveDate.
Comment: For a LoanContract the fixing date for the rate is always the effective date of the contract.
Test cases: [Invalid]
ln-3 (Mandatory)
Context: InterestRatePeriod (complex type)
endDate >= startDate >= rateFixingDate.
Test cases: [Invalid]
ln-4 (Mandatory)
Context: InterestRatePeriod (complex type)
[not(exists(mandatoryCostRate))] [exists(interestRate)] [exists(margin)] [exists(allInRate)]
allInRate = margin + interestRate.
Test cases: [Invalid]
ln-5 (Mandatory)
Context: InterestRatePeriod (complex type)
[exists(mandatoryCostRate)] [exists(interestRate)] [exists(margin)] [exists(allInRate)]
allInRate = margin + interestRate + mandatoryCostRate.
Test cases: [Invalid]
ln-6 (Mandatory)
Context: InterestAccrualSchedule (complex type)
interestRatePeriod/startDate=lenderLoanContractPeriod/startDate=interestAccrualPeriod/startDate, in each period.
Comment: interestRatePeriod/startDate,lenderLoanContractPeriod/startDate, interestAccrualPeriod/startDate must be equal in each period.
Test cases: [Invalid]
ln-7 (Mandatory)
Context: InterestAccrualSchedule (complex type)
[count(interestRatePeriod)>1]
Every $startDate in $interestAccrualSchedule/interestRatePeriod[startDate > min($interestAccrualSchedule/interestRatePeriod/startDate)]/startDate satisfies $startDate - "P1D" = $interestAccrualSchedule/interestRatePeriod/endDate.
Comment: Each interestRatePeriod except the first, starts 1 day after any other interestRatePeriod
Test cases: [Invalid]
ln-8 (Mandatory)
Context: InterestAccrualSchedule (complex type)
[count(lenderLoanContractPeriod)>1]
Every $startDate in $interestAccrualSchedule/lenderLoanContractPeriod[startDate > min($interestAccrualSchedule/lenderLoanContractPeriod/startDate)]/startDate satisfies $startDate - "P1D" = $interestAccrualSchedule/lenderLoanContractPeriod/endDate.
Comment: Each lenderLoanContractPeriod except the first, starts 1 day after any other lenderLoanContractPeriod
Test cases: [Invalid]
ln-9 (Mandatory)
Context: InterestAccrualSchedule (complex type)
[count(interestAccrualPeriod)>1]
Every $startDate in $interestAccrualSchedule/interestAccrualPeriod[startDate > min($interestAccrualSchedule/interestAccrualPeriod/startDate)]/startDate satisfies $startDate - "P1D" = $interestAccrualSchedule/interestAccrualPeriod/endDate.
Comment: Each interestAccrualPeriod except the first, starts 1 day after any other interestAccrualPeriod
Test cases: [Invalid]
ln-10 (Mandatory)
Context: FacilityNotice (complex type)
[exists(facilitySummary/originalCommitmentAmount)] [exists(facilityCommitmentPosition/loanContractPosition/loanContractSummary/originalAmount)] [same-currency((facilitySummary/originalCommitmentAmount,facilityCommitmentPosition/loanContractPosition/loanContractSummary/originalAmount))]
facilitySummary/originalCommitmentAmount/amount >= facilityCommitmentPosition/loanContractPosition/loanContractSummary/originalAmount/amount.
Test cases: [Invalid]
ln-11 (Mandatory)
Context: FacilityNotice (complex type)
[exists(facilityCommitmentPosition/loanContractPosition)] [same-currency((facilityCommitmentPosition/currentAmount/shareAmount/amount,//facilityCommitmentPosition/loanContractPosition/currentAmount/shareAmount/amount))]
facilityCommitmentPosition/currentAmount/shareAmount/amount >= sum(facilityCommitmentPosition/loanContractPosition/currentAmount/shareAmount/amount).
Test cases:
ln-11b (Mandatory)
Context: LoanContractNotice (complex type)
[exists(facilityCommitmentPosition/loanContractPosition)] [same-currency((facilityCommitmentPosition/currentAmount/shareAmount/amount,//facilityCommitmentPosition/loanContractPosition/currentAmount/shareAmount/amount))]
facilityCommitmentPosition/currentAmount/shareAmount/amount >= sum(facilityCommitmentPosition/loanContractPosition/currentAmount/shareAmount/amount).
Test cases: [Invalid]
ln-12 (Mandatory)
Context: FacilityNotice (complex type)
[exists(facilityCommitmentPosition/loanContractPosition)] [same-currency((facilityCommitmentPosition/priorAmount/shareAmount/amount,//facilityCommitmentPosition/loanContractPosition/priorAmount/shareAmount/amount))]
facilityCommitmentPosition/priorAmount/shareAmount/amount >= sum(facilityCommitmentPosition/loanContractPosition/priorAmount/shareAmount/amount).
Test cases:
ln-13 (Mandatory)
Context: LoanContractNotice (complex type)
[exists(facilityCommitmentPosition/loanContractPosition)] [same-currency((facilityCommitmentPosition/priorAmount/shareAmount/amount,//facilityCommitmentPosition/loanContractPosition/priorAmount/shareAmount/amount))]
facilityCommitmentPosition/priorAmount/shareAmount/amount >= sum(facilityCommitmentPosition/loanContractPosition/priorAmount/shareAmount/amount).
Test cases: [Invalid]
ln-14 (Mandatory)
Context: DrawdownNotice (complex type)
[exists(loanContract)]
drawdownPayment/paymentDate >= loanContract/effectiveDate.
Test cases: [Invalid]
ln-15 (Mandatory)
Context: DrawdownNotice (complex type)
[exists(dealSummary/creditAgreementDate)]
(loanContract/effectiveDate >= dealSummary/creditAgreementDate) and (drawdownPayment/paymentDate >= dealSummary/creditAgreementDate).
Test cases: [Invalid]
ln-16 (Mandatory)
Context: DrawdownNotice (complex type)
[exists(facilityCommitmentPosition/priorAmount/shareAmount)] [same-currency((facilityCommitmentPosition/priorAmount/shareAmount,drawdownPayment/shareLoanContractAmount))]
drawdownPayment/shareLoanContractAmount <= facilityCommitmentPosition/priorAmount/shareAmount.
Test cases: [Invalid]
ln-17 (Mandatory)
Context: DrawdownNotice (complex type)
[exists(loanContract)] [same-currency((loanContract/amount/amount,drawdownPayment/shareLoanContractAmount/amount))]
loanContract/amount/amount >= drawdownPayment/shareLoanContractAmount/amount.
Test cases: [Invalid]
ln-18 (Mandatory)
Context: DrawdownNotice (complex type)
[exists(loanContractSummary)] [same-currency((loanContractSummary/originalAmount/amount,drawdownPayment/shareLoanContractAmount/amount))]
loanContractSummary/originalAmount/amount >= drawdownPayment/shareLoanContractAmount/amount.
Test cases:
ln-19 (Mandatory)
Context: DrawdownNotice (complex type)
[drawdownEventType = "RateSetEvent"] [exists(loanContract)]
exists(loanContract/currentInterestRatePeriod/interestRate) and exists(loanContract/currentInterestRatePeriod/margin) and exists(loanContract/currentInterestRatePeriod/allInRate) and exists(loanContract/currentInterestRatePeriod/interestDayBasis) and exists(loanContract/currentInterestRatePeriod/indexTenor).
Comment: loanContract/currentInterestRatePeriod/interestRate and loanContract/currentInterestRatePeriod/margin and loanContract/currentInterestRatePeriod/allInRate and loanContract/currentInterestRatePeriod/interestDayBasis and loanContract/currentInterestRatePeriod/indexTenor must exist.
Test cases: [Invalid]
ln-20 (Mandatory)
Context: InterestPaymentNotice (complex type)
[same-currency((interestPayment/amount/shareAmount/amount,//interestAccrualSchedule/interestAccrualPeriod/shareInterestAccrualAmount/amount))]
interestPayment/amount/shareAmount/amount = sum(interestAccrualSchedule/interestAccrualPeriod/shareInterestAccrualAmount/amount).
Test cases: [Invalid]
ln-21 (Mandatory)
Context: InterestPaymentNotice (complex type)
exists(interestAccrualSchedule/interestRatePeriod/interestRate) and exists(interestAccrualSchedule/interestRatePeriod/margin) and exists(interestAccrualSchedule/interestRatePeriod/allInRate) and exists(interestAccrualSchedule/interestRatePeriod/interestDayBasis) and exists(interestAccrualSchedule/interestRatePeriod/indexTenor).
Comment: interestAccrualSchedule/interestRatePeriod/interestRate and interestAccrualSchedule/interestRatePeriod/margin and interestAccrualSchedule/interestRatePeriod/allInRate and interestAccrualSchedule/interestRatePeriod/interestDayBasis and interestAccrualSchedule/interestRatePeriod/indexTenor must exist.
Test cases: [Invalid]
ln-22 (Mandatory)
Context: LoanContractRepayment (complex type)
[exists(loanContractSummary/originalAmount)] [same-currency((loanContractSummary/originalAmount/amount,amount/globalAmount/amount))]
loanContractSummary/originalAmount/amount >= amount/globalAmount/amount.
Test cases: [Invalid]
ln-23 (Mandatory)
Context: Repayment (complex type)
[same-currency((facilityRepayment/amount/globalAmount/amount,//loanContractRepayment/loanContractSummary/originalAmount/amount))]
facilityRepayment/amount/globalAmount/amount >= sum(loanContractRepayment/loanContractSummary/originalAmount/amount).
Test cases: [Invalid]
ln-24 (Mandatory)
Context: RepaymentNotice (complex type)
[exists(facilityCommitmentPosition)] [same-currency((facilityCommitmentPosition/priorAmount/shareAmount/amount,repayment/facilityRepayment/amount/shareAmount/amount))]
facilityCommitmentPosition/priorAmount/shareAmount/amount >= repayment/facilityRepayment/amount/shareAmount/amount.
Test cases: [Invalid]
ln-25 (Mandatory)
Context: Repayment (complex type)
[same-currency((facilityRepayment/amount/shareAmount/amount,//loanContractRepayment/amount/shareAmount/amount))]
facilityRepayment/amount/shareAmount/amount >= sum(loanContractRepayment/amount/shareAmount/amount).
Test cases: [Invalid]
ln-26 (Mandatory)
Context: Repayment (complex type)
[exists(loanContractRepayment/amount/globalAmount)] [same-currency((facilityRepayment/amount/globalAmount/amount,//loanContractRepayment/amount/globalAmount/amount))]
facilityRepayment/amount/globalAmount/amount >= sum(loanContractRepayment/amount/globalAmount/amount).
Test cases:
ln-27 (Mandatory)
Context: OneOffFeeNotice (complex type)
[feePayment/feeType = "BreakageFee"]
exists(loanContractSummary).
Comment: loanContractSummary must exist.
Test cases: [Invalid]
ln-28 (Mandatory)
Context: OneOffFeeNotice (complex type)
[feePayment/feeType = "AssignmentFee"]
not(exists((loanContractSummary)).
Comment: loanContractSummary must not exist.
Test cases: [Invalid]
ln-29 (Mandatory)
Context: OneOffFeePayment (complex type)
paymentDate >= effectiveDate.
Test cases:
ln-30 (Mandatory)
Context: FacilityNotice (complex type)
[exists(facilityCommitmentPosition/loanContractPosition/currentAmount/globalAmount)] [exists(facilityCommitmentPosition/currentAmount/globalAmount)] [same-currency((facilityCommitmentPosition/currentAmount/globalAmount/amount,//facilityCommitmentPosition/loanContractPosition/currentAmount/globalAmount))]
facilityCommitmentPosition/currentAmount/globalAmount/amount >= sum(facilityCommitmentPosition/loanContractPosition/currentAmount/globalAmount/amount).
Test cases:
ln-31 (Mandatory)
Context: FacilityNotice (complex type)
[exists(facilityCommitmentPosition/loanContractPosition/priorAmount/globalAmount)] [exists(facilityCommitmentPosition/priorAmount/globalAmount)] [same-currency((facilityCommitmentPosition/priorAmount/globalAmount/amount,//facilityCommitmentPosition/loanContractPosition/priorAmount/globalAmount/amount))]
facilityCommitmentPosition/priorAmount/globalAmount/amount >= sum(facilityCommitmentPosition/loanContractPosition/priorAmount/globalAmount/amount).
Test cases:

Deprecated rules

Removed rules