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
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 = normalizedString("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 must be equal 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 - xs:dayTimeDuration("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 - xs:dayTimeDuration("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 - xs:dayTimeDuration("P1D") = $interestAccrualSchedule/interestAccrualPeriod/endDate.
ln-10 (Mandatory)
Context:
FacilityNotice (complex type)
[exists(
facilityIdentifier/originalCommitmentAmount)] [exists(
facilityCommitmentPosition/loanContractPosition/loanContractSummary/originalAmount)] [
same-currency((
facilityIdentifier/originalCommitmentAmount,
facilityCommitmentPosition/loanContractPosition/loanContractSummary/originalAmount))]
facilityIdentifier/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 >= the sum of all 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 >= the sum of all facilityCommitmentPosition/loanContractPosition/priorAmount/shareAmount/amount.
ln-13 (Mandatory)
Context:
DrawdownNotice (complex type)
noticeDate <= drawdownPayment/paymentDate.
ln-14 (Mandatory)
Context:
DrawdownNotice (complex type)
[exists(loanContract)]
drawdownPayment/paymentDate >= loanContract/effectiveDate.
ln-15 (Mandatory)
Context:
DrawdownNotice (complex type)
[exists(dealIdentifier/creditAgreementDate)]
loanContract/effectiveDate and drawdownPayment/paymentDate >= dealIdentifier/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.
ln-19 (Mandatory)
Context:
DrawdownNotice (complex type)
[drawdownEventType = RateSetEvent] [exists(loanContract)]
loanContract/currentInterestRatePeriod/interestRate and loanContract/currentInterestRatePeriod/margin and loanContract/currentInterestRatePeriod/allInRate and loanContract/currentInterestRatePeriod/interestDayBasis and loanContract/currentInterestRatePeriod/indexTenor must exist.
ln-20 (Mandatory)
Context:
InterestPaymentNotice (complex type)
[
same-currency((
interestPayment/amount/shareAmount/amount,//
interestAccrualSchedule/interestAccrualPeriod/shareInterestAccrualAmount/amount))]
interestPayment/amount/shareAmount/amount = the sum of all interestAccrualSchedule/interestAccrualPeriod/shareInterestAccrualAmount/amount.
ln-21 (Mandatory)
Context:
InterestPaymentNotice (complex type)
interestAccrualSchedule/interestRatePeriod/interestRate and interestAccrualSchedule/interestRatePeriod/margin and interestAccrualSchedule/interestRatePeriod/allInRate and interestAccrualSchedule/interestRatePeriod/interestDayBasis and interestAccrualSchedule/interestRatePeriod/indexTenor must exist.
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 >= the sum of all 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 >= the sum of all 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 >= the sum of all loanContractRepayment/amount/globalAmount/amount.
ln-27 (Mandatory)
Context:
OneOffFeeNotice (complex type)
[feePayment/feeType = BreakageFee]
loanContractSummary must exist.
ln-28 (Mandatory)
Context:
OneOffFeeNotice (complex type)
[feePayment/feeType = AssignmentFee]
loanContractSummary must not exist.
ln-29 (Mandatory)
Context:
OneOffFeePayment (complex type)
paymentDate >= effectiveDate.
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 >= the sum of all facilityCommitmentPosition/loanContractPosition/currentAmount/globalAmount/amount.
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 >= the sum of all facilityCommitmentPosition/loanContractPosition/priorAmount/globalAmount/amount.
Deprecated rules
Removed rules