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.
Test cases: [Valid] [Invalid]

Context: DrawdownNotice (complex type)

ln-2 (Mandatory)
If loanContract exists and loanContract/currentInterestRatePeriod/floatingRateIndex contains the string PRIME then loanContract/currentInterestRatePeriod/rateFixingDate = loanContract/effectiveDate.
Test cases: [Invalid]
ln-14 (Mandatory)
If loanContract exists, then drawdownPayment/paymentDate >= loanContract/effectiveDate.
Test cases: [Invalid]
ln-15 (Mandatory)
If dealSummary/creditAgreementDate exists, then loanContract/effectiveDate >= dealSummary/creditAgreementDate and drawdownPayment/paymentDate >= dealSummary/creditAgreementDate.
Test cases: [Invalid]
ln-16 (Mandatory)
Preconditions: SameCurrency
If facilityCommitmentPosition/priorAmount/shareAmount exists, then drawdownPayment/shareLoanContractAmount <= facilityCommitmentPosition/priorAmount/shareAmount.
Test cases: [Invalid]
ln-17 (Mandatory)
Preconditions: SameCurrency
If loanContract exists, then loanContract/amount/amount >= drawdownPayment/shareLoanContractAmount/amount.
Test cases: [Invalid]
ln-18 (Mandatory)
Preconditions: SameCurrency
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.
Test cases: [Invalid]

Context: InterestRatePeriod (complex type)

ln-3 (Mandatory)
endDate >= startDate >= rateFixingDate.
Test cases: [Invalid]
ln-4 (Mandatory)
If mandatoryCostRate doesn't exist and interestRate and margin and allInRate exist, then allInRate = margin + interestRate.
Test cases: [Invalid]
ln-5 (Mandatory)
If mandatoryCostRate and interestRate and margin and allInRate exist, then allInRate = margin + interestRate + mandatoryCostRate.
Test cases: [Invalid]

Context: InterestAccrualSchedule (complex type)

ln-6 (Mandatory)
interestRatePeriod/startDate,lenderLoanContractPeriod/startDate, interestAccrualPeriod/startDate must be equal in each period.
Test cases: [Invalid]
ln-7 (Mandatory)
Preconditions: MultipleInterestRatePeriod
The [n]th interestRatePeriod/endDate must be the previous calendar day of the [n+1]th interestRatePeriod/startDate.
Test cases: [Invalid]
ln-8 (Mandatory)
Preconditions: MultipleLenderLoanContractPeriod
The [n]th lenderLoanContractPeriod/endDate must be the previous calendar day of the [n+1]th lenderLoanContractPeriod/startDate.
Test cases: [Invalid]
ln-9 (Mandatory)
Preconditions: MultipleInterestAccrualPeriod
The [n]th interestAccrualPeriod/endDate must be the previous calendar day of the [n+1]th interestAccrualPeriod/startDate.
Test cases: [Invalid]

Context: FacilityNotice (complex type)

ln-10 (Mandatory)
Preconditions: SameCurrency
If facilitySummary/originalCommitmentAmount and facilityCommitmentPosition/loanContractPosition/loanContractSummary/originalAmount exist, then facilitySummary/originalCommitmentAmount/amount >= facilityCommitmentPosition/loanContractPosition/loanContractSummary/originalAmount/amount.
Test cases: [Invalid]
ln-11 (Mandatory)
Preconditions: SameCurrency
If facilityCommitmentPosition/loanContractPosition exists, then facilityCommitmentPosition/currentAmount/shareAmount/amount >= the sum of all facilityCommitmentPosition/loanContractPosition/currentAmount/shareAmount/amount.
Test cases:
ln-12 (Mandatory)
Preconditions: SameCurrency
If facilityCommitmentPosition/loanContractPosition exists, then facilityCommitmentPosition/priorAmount/shareAmount/amount >= the sum of all facilityCommitmentPosition/loanContractPosition/priorAmount/shareAmount/amount.
Test cases:
ln-30 (Mandatory)
Preconditions: SameCurrency
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)
Preconditions: SameCurrency
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)
Preconditions: SameCurrency
If facilityCommitmentPosition/loanContractPosition exists, then facilityCommitmentPosition/currentAmount/shareAmount/amount >= the sum of all facilityCommitmentPosition/loanContractPosition/currentAmount/shareAmount/amount.
Test cases: [Invalid]
ln-13 (Mandatory)
Preconditions: SameCurrency
If facilityCommitmentPosition/loanContractPosition exists, then facilityCommitmentPosition/priorAmount/shareAmount/amount >= the sum of all facilityCommitmentPosition/loanContractPosition/priorAmount/shareAmount/amount.
Test cases: [Invalid]

Context: InterestPaymentNotice (complex type)

ln-20 (Mandatory)
Preconditions: SameCurrency
interestPayment/amount/shareAmount/amount must be equal to the sum of all interestAccrualSchedule/interestAccrualPeriod/shareInterestAccrualAmount/amount.
Test cases: [Invalid]
ln-21 (Mandatory)
interestAccrualSchedule/interestRatePeriod/interestRate and interestAccrualSchedule/interestRatePeriod/margin and interestAccrualSchedule/interestRatePeriod/allInRate and interestAccrualSchedule/interestRatePeriod/interestDayBasis and interestAccrualSchedule/interestRatePeriod/indexTenor must exist.
Test cases: [Invalid]

Context: LoanContractRepayment (complex type)

ln-22 (Mandatory)
Preconditions: SameCurrency
If loanContractSummary/originalAmount exists, then loanContractSummary/originalAmount/amount >= amount/globalAmount/amount.
Test cases: [Invalid]

Context: Repayment (complex type)

ln-23 (Mandatory)
Preconditions: SameCurrency
facilityRepayment/amount/globalAmount/amount must be >= the sum of all loanContractRepayment/loanContractSummary/originalAmount/amount.
Test cases: [Invalid]
ln-25 (Mandatory)
Preconditions: SameCurrency
facilityRepayment/amount/shareAmount/amount must be >= the sum of all loanContractRepayment/amount/shareAmount/amount.
Test cases: [Invalid]
ln-26 (Mandatory)
Preconditions: SameCurrency
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)
Preconditions: SameCurrency
If facilityCommitmentPosition exists, then facilityCommitmentPosition/priorAmount/shareAmount/amount >= repayment/facilityRepayment/amount/shareAmount/amount.
Test cases: [Invalid]

Context: OneOffFeeNotice (complex type)

ln-27 (Mandatory)
If feePayment/feeType = BreakageFee then loanContractSummary must exist.
Test cases: [Invalid]
ln-28 (Mandatory)
If feePayment/feeType = AssignmentFee then loanContractSummary must not exist.
Test cases: [Invalid]

Context: OneOffFeePayment (complex type)

ln-29 (Mandatory)
paymentDate >= effectiveDate.
Test cases:

Deprecated rules

Removed rules