Functional Weave
Code in Python

property.completion-statement@1.0.0

vectors.json

12,246 bytes · view raw

[
 {
  "name": "a leasehold flat: service charge paid by the seller refunded, ground rent unpaid allowed, fees added",
  "args": [
   {
    "minor": 25000000,
    "currency": "GBP"
   },
   {
    "minor": 2500000,
    "currency": "GBP"
   },
   "2025-06-30",
   [
    {
     "label": "Service charge",
     "amount": {
      "minor": 120000,
      "currency": "GBP"
     },
     "periodStart": "2025-04-01",
     "periodEnd": "2025-09-30",
     "paidBySeller": true
    },
    {
     "label": "Ground rent",
     "amount": {
      "minor": 25000,
      "currency": "GBP"
     },
     "periodStart": "2025-01-01",
     "periodEnd": "2025-12-31",
     "paidBySeller": false
    }
   ],
   [
    {
     "label": "Legal fees",
     "amount": {
      "minor": 120000,
      "currency": "GBP"
     }
    },
    {
     "label": "SDLT",
     "amount": {
      "minor": 250000,
      "currency": "GBP"
     }
    }
   ]
  ],
  "expect": {
   "price": {
    "minor": 25000000,
    "currency": "GBP"
   },
   "depositPaid": {
    "minor": 2500000,
    "currency": "GBP"
   },
   "apportionments": [
    {
     "label": "Service charge",
     "sellerDays": 91,
     "buyerDays": 92,
     "adjustment": {
      "minor": 60328,
      "currency": "GBP"
     }
    },
    {
     "label": "Ground rent",
     "sellerDays": 181,
     "buyerDays": 184,
     "adjustment": {
      "minor": -12397,
      "currency": "GBP"
     }
    }
   ],
   "balanceToSeller": {
    "minor": 22547931,
    "currency": "GBP"
   },
   "fees": [
    {
     "label": "Legal fees",
     "amount": {
      "minor": 120000,
      "currency": "GBP"
     }
    },
    {
     "label": "SDLT",
     "amount": {
      "minor": 250000,
      "currency": "GBP"
     }
    }
   ],
   "feesTotal": {
    "minor": 370000,
    "currency": "GBP"
   },
   "totalDue": {
    "minor": 22917931,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "a freehold with nothing to apportion and no fees",
  "args": [
   {
    "minor": 30000000,
    "currency": "GBP"
   },
   {
    "minor": 3000000,
    "currency": "GBP"
   },
   "2025-06-30",
   [],
   []
  ],
  "expect": {
   "price": {
    "minor": 30000000,
    "currency": "GBP"
   },
   "depositPaid": {
    "minor": 3000000,
    "currency": "GBP"
   },
   "apportionments": [],
   "balanceToSeller": {
    "minor": 27000000,
    "currency": "GBP"
   },
   "fees": [],
   "feesTotal": {
    "minor": 0,
    "currency": "GBP"
   },
   "totalDue": {
    "minor": 27000000,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "no deposit paid",
  "args": [
   {
    "minor": 15000000,
    "currency": "GBP"
   },
   {
    "minor": 0,
    "currency": "GBP"
   },
   "2025-06-30",
   [],
   [
    {
     "label": "Searches",
     "amount": {
      "minor": 35000,
      "currency": "GBP"
     }
    }
   ]
  ],
  "expect": {
   "price": {
    "minor": 15000000,
    "currency": "GBP"
   },
   "depositPaid": {
    "minor": 0,
    "currency": "GBP"
   },
   "apportionments": [],
   "balanceToSeller": {
    "minor": 15000000,
    "currency": "GBP"
   },
   "fees": [
    {
     "label": "Searches",
     "amount": {
      "minor": 35000,
      "currency": "GBP"
     }
    }
   ],
   "feesTotal": {
    "minor": 35000,
    "currency": "GBP"
   },
   "totalDue": {
    "minor": 15035000,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "completion on the last day of the period: nothing to refund",
  "args": [
   {
    "minor": 20000000,
    "currency": "GBP"
   },
   {
    "minor": 2000000,
    "currency": "GBP"
   },
   "2025-09-30",
   [
    {
     "label": "Service charge",
     "amount": {
      "minor": 120000,
      "currency": "GBP"
     },
     "periodStart": "2025-04-01",
     "periodEnd": "2025-09-30",
     "paidBySeller": true
    }
   ],
   []
  ],
  "expect": {
   "price": {
    "minor": 20000000,
    "currency": "GBP"
   },
   "depositPaid": {
    "minor": 2000000,
    "currency": "GBP"
   },
   "apportionments": [
    {
     "label": "Service charge",
     "sellerDays": 183,
     "buyerDays": 0,
     "adjustment": {
      "minor": 0,
      "currency": "GBP"
     }
    }
   ],
   "balanceToSeller": {
    "minor": 18000000,
    "currency": "GBP"
   },
   "fees": [],
   "feesTotal": {
    "minor": 0,
    "currency": "GBP"
   },
   "totalDue": {
    "minor": 18000000,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "completion on the first day: the seller keeps just that day",
  "args": [
   {
    "minor": 20000000,
    "currency": "GBP"
   },
   {
    "minor": 2000000,
    "currency": "GBP"
   },
   "2025-01-01",
   [
    {
     "label": "Ground rent",
     "amount": {
      "minor": 36500,
      "currency": "GBP"
     },
     "periodStart": "2025-01-01",
     "periodEnd": "2025-12-31",
     "paidBySeller": true
    }
   ],
   []
  ],
  "expect": {
   "price": {
    "minor": 20000000,
    "currency": "GBP"
   },
   "depositPaid": {
    "minor": 2000000,
    "currency": "GBP"
   },
   "apportionments": [
    {
     "label": "Ground rent",
     "sellerDays": 1,
     "buyerDays": 364,
     "adjustment": {
      "minor": 36400,
      "currency": "GBP"
     }
    }
   ],
   "balanceToSeller": {
    "minor": 18036400,
    "currency": "GBP"
   },
   "fees": [],
   "feesTotal": {
    "minor": 0,
    "currency": "GBP"
   },
   "totalDue": {
    "minor": 18036400,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "the next quarter paid in advance by the seller is refunded in full",
  "args": [
   {
    "minor": 20000000,
    "currency": "GBP"
   },
   {
    "minor": 2000000,
    "currency": "GBP"
   },
   "2025-06-30",
   [
    {
     "label": "Service charge Q3",
     "amount": {
      "minor": 92000,
      "currency": "GBP"
     },
     "periodStart": "2025-07-01",
     "periodEnd": "2025-09-30",
     "paidBySeller": true
    }
   ],
   []
  ],
  "expect": {
   "price": {
    "minor": 20000000,
    "currency": "GBP"
   },
   "depositPaid": {
    "minor": 2000000,
    "currency": "GBP"
   },
   "apportionments": [
    {
     "label": "Service charge Q3",
     "sellerDays": 0,
     "buyerDays": 92,
     "adjustment": {
      "minor": 92000,
      "currency": "GBP"
     }
    }
   ],
   "balanceToSeller": {
    "minor": 18092000,
    "currency": "GBP"
   },
   "fees": [],
   "feesTotal": {
    "minor": 0,
    "currency": "GBP"
   },
   "totalDue": {
    "minor": 18092000,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "unpaid arrears for a past quarter are allowed in full",
  "args": [
   {
    "minor": 20000000,
    "currency": "GBP"
   },
   {
    "minor": 2000000,
    "currency": "GBP"
   },
   "2025-06-30",
   [
    {
     "label": "Service charge Q1",
     "amount": {
      "minor": 50000,
      "currency": "GBP"
     },
     "periodStart": "2025-01-01",
     "periodEnd": "2025-03-31",
     "paidBySeller": false
    }
   ],
   []
  ],
  "expect": {
   "price": {
    "minor": 20000000,
    "currency": "GBP"
   },
   "depositPaid": {
    "minor": 2000000,
    "currency": "GBP"
   },
   "apportionments": [
    {
     "label": "Service charge Q1",
     "sellerDays": 90,
     "buyerDays": 0,
     "adjustment": {
      "minor": -50000,
      "currency": "GBP"
     }
    }
   ],
   "balanceToSeller": {
    "minor": 17950000,
    "currency": "GBP"
   },
   "fees": [],
   "feesTotal": {
    "minor": 0,
    "currency": "GBP"
   },
   "totalDue": {
    "minor": 17950000,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "a leap year: completion on 29 February is 60 of 366 days",
  "args": [
   {
    "minor": 20000000,
    "currency": "GBP"
   },
   {
    "minor": 2000000,
    "currency": "GBP"
   },
   "2024-02-29",
   [
    {
     "label": "Ground rent",
     "amount": {
      "minor": 36600,
      "currency": "GBP"
     },
     "periodStart": "2024-01-01",
     "periodEnd": "2024-12-31",
     "paidBySeller": false
    }
   ],
   []
  ],
  "expect": {
   "price": {
    "minor": 20000000,
    "currency": "GBP"
   },
   "depositPaid": {
    "minor": 2000000,
    "currency": "GBP"
   },
   "apportionments": [
    {
     "label": "Ground rent",
     "sellerDays": 60,
     "buyerDays": 306,
     "adjustment": {
      "minor": -6000,
      "currency": "GBP"
     }
    }
   ],
   "balanceToSeller": {
    "minor": 17994000,
    "currency": "GBP"
   },
   "fees": [],
   "feesTotal": {
    "minor": 0,
    "currency": "GBP"
   },
   "totalDue": {
    "minor": 17994000,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "£9.99 over two days splits 500p/499p, never 500p both ways",
  "args": [
   {
    "minor": 20000000,
    "currency": "GBP"
   },
   {
    "minor": 2000000,
    "currency": "GBP"
   },
   "2025-06-30",
   [
    {
     "label": "Rent",
     "amount": {
      "minor": 999,
      "currency": "GBP"
     },
     "periodStart": "2025-06-30",
     "periodEnd": "2025-07-01",
     "paidBySeller": true
    }
   ],
   []
  ],
  "expect": {
   "price": {
    "minor": 20000000,
    "currency": "GBP"
   },
   "depositPaid": {
    "minor": 2000000,
    "currency": "GBP"
   },
   "apportionments": [
    {
     "label": "Rent",
     "sellerDays": 1,
     "buyerDays": 1,
     "adjustment": {
      "minor": 499,
      "currency": "GBP"
     }
    }
   ],
   "balanceToSeller": {
    "minor": 18000499,
    "currency": "GBP"
   },
   "fees": [],
   "feesTotal": {
    "minor": 0,
    "currency": "GBP"
   },
   "totalDue": {
    "minor": 18000499,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "the whole price as deposit leaves only apportionments and fees",
  "args": [
   {
    "minor": 10000000,
    "currency": "GBP"
   },
   {
    "minor": 10000000,
    "currency": "GBP"
   },
   "2025-06-30",
   [],
   [
    {
     "label": "Land Registry",
     "amount": {
      "minor": 15000,
      "currency": "GBP"
     }
    }
   ]
  ],
  "expect": {
   "price": {
    "minor": 10000000,
    "currency": "GBP"
   },
   "depositPaid": {
    "minor": 10000000,
    "currency": "GBP"
   },
   "apportionments": [],
   "balanceToSeller": {
    "minor": 0,
    "currency": "GBP"
   },
   "fees": [
    {
     "label": "Land Registry",
     "amount": {
      "minor": 15000,
      "currency": "GBP"
     }
    }
   ],
   "feesTotal": {
    "minor": 15000,
    "currency": "GBP"
   },
   "totalDue": {
    "minor": 15000,
    "currency": "GBP"
   }
  }
 },
 {
  "name": "a deposit above the price is refused",
  "args": [
   {
    "minor": 10000000,
    "currency": "GBP"
   },
   {
    "minor": 10000001,
    "currency": "GBP"
   },
   "2025-06-30",
   [],
   []
  ],
  "expectError": "depositPaid must be between 0 and the price"
 },
 {
  "name": "a fee in another currency is refused",
  "args": [
   {
    "minor": 10000000,
    "currency": "GBP"
   },
   {
    "minor": 1000000,
    "currency": "GBP"
   },
   "2025-06-30",
   [],
   [
    {
     "label": "Legal fees",
     "amount": {
      "minor": 120000,
      "currency": "EUR"
     }
    }
   ]
  ],
  "expectError": "currency mismatch: \"Legal fees\" is EUR"
 },
 {
  "name": "a period that ends before it starts is refused",
  "args": [
   {
    "minor": 10000000,
    "currency": "GBP"
   },
   {
    "minor": 1000000,
    "currency": "GBP"
   },
   "2025-06-30",
   [
    {
     "label": "Ground rent",
     "amount": {
      "minor": 25000,
      "currency": "GBP"
     },
     "periodStart": "2025-12-31",
     "periodEnd": "2025-01-01",
     "paidBySeller": false
    }
   ],
   []
  ],
  "expectError": "\"Ground rent\": periodEnd 2025-01-01 is before periodStart 2025-12-31"
 },
 {
  "name": "a negative fee is refused",
  "args": [
   {
    "minor": 10000000,
    "currency": "GBP"
   },
   {
    "minor": 1000000,
    "currency": "GBP"
   },
   "2025-06-30",
   [],
   [
    {
     "label": "Refund",
     "amount": {
      "minor": -100,
      "currency": "GBP"
     }
    }
   ]
  ],
  "expectError": "\"Refund\" must not be negative"
 },
 {
  "name": "a malformed completion date is refused",
  "args": [
   {
    "minor": 10000000,
    "currency": "GBP"
   },
   {
    "minor": 1000000,
    "currency": "GBP"
   },
   "30/06/2025",
   [
    {
     "label": "Service charge",
     "amount": {
      "minor": 120000,
      "currency": "GBP"
     },
     "periodStart": "2025-04-01",
     "periodEnd": "2025-09-30",
     "paidBySeller": true
    }
   ],
   []
  ],
  "expectError": "is not an ISO date"
 }
]