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.
ln-2 (Mandatory)
Context:
DrawdownNotice (complex type)
[exists(loanContract)] [loanContract/currentInterestRatePeriod/floatingRateIndex = "PRIME"]
loanContract/currentInterestRatePeriod/rateFixingDate = loanContract/effectiveDate.
ln-3 (Mandatory)
Context:
InterestRatePeriod (complex type)
endDate >= startDate >= rateFixingDate.
ln-4 (Mandatory)
Context:
InterestRatePeriod (complex type)
[not(exists(mandatoryCostRate))] [exists(interestRate)] [exists(margin)] [exists(allInRate)]
allInRate = margin + interestRate.
ln-5 (Mandatory)
Context:
InterestRatePeriod (complex type)
[exists(mandatoryCostRate)] [exists(interestRate)] [exists(margin)] [exists(allInRate)]
allInRate = margin + interestRate + mandatoryCostRate.
ln-6 (Mandatory)
Context:
InterestAccrualSchedule (complex type)
interestRatePeriod/startDate=lenderLoanContractPeriod/startDate=interestAccrualPeriod/startDate, in each period.
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.
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.
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.
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.
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).
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).
ln-14 (Mandatory)
Context:
DrawdownNotice (complex type)
[exists(loanContract)]
drawdownPayment/paymentDate >= loanContract/effectiveDate.
ln-15 (Mandatory)
Context:
DrawdownNotice (complex type)
[exists(dealSummary/creditAgreementDate)]
(loanContract/effectiveDate >= dealSummary/creditAgreementDate) and (drawdownPayment/paymentDate >= dealSummary/creditAgreementDate).
ln-16 (Mandatory)
Context:
DrawdownNotice (complex type)
[exists(
facilityCommitmentPosition/priorAmount/shareAmount)] [
same-currency((
facilityCommitmentPosition/priorAmount/shareAmount,
drawdownPayment/shareLoanContractAmount))]
drawdownPayment/shareLoanContractAmount <= facilityCommitmentPosition/priorAmount/shareAmount.
ln-17 (Mandatory)
Context:
DrawdownNotice (complex type)
[exists(
loanContract)] [
same-currency((
loanContract/amount/amount,
drawdownPayment/shareLoanContractAmount/amount))]
loanContract/amount/amount >= drawdownPayment/shareLoanContractAmount/amount.
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).
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).
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).
ln-22 (Mandatory)
Context:
LoanContractRepayment (complex type)
[exists(
loanContractSummary/originalAmount)] [
same-currency((
loanContractSummary/originalAmount/amount,
amount/globalAmount/amount))]
loanContractSummary/originalAmount/amount >= amount/globalAmount/amount.
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).
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.
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).
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).
ln-28 (Mandatory)
Context:
OneOffFeeNotice (complex type)
[feePayment/feeType = "AssignmentFee"]
not(exists((loanContractSummary)).
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