Skip to main content

Payments and Reconciliation

The model separates expected amounts from actual bank movements. Expected rent and expenses are scheduled in dedicated entities. Actual movements are imported into bank_transactions and normalized through bank_transaction_splits.

bank_transaction_splits

Purpose

Normalized accounting and fiscal representation of actual transaction lines. This is the main source for reporting.

Suggested attributes

FieldDescription
idPrimary identifier.
bank_transaction_idSource bank transaction.
property_idProperty attribution for the split line.
contract_idOptional contract attribution.
expected_expense_idOptional expected expense attribution.
rent_installment_idOptional rent installment attribution.
category_idMandatory transaction category.
amountSplit amount.
descriptionSplit description.
created_atCreation timestamp.

Relationships

RelationshipDescription
bank_transaction_splits.bank_transaction_id to bank_transactions.idOne transaction can have many splits.
bank_transaction_splits.category_id to transaction_categories.idEvery split has one governed category.
bank_transaction_splits.property_id to properties.idSplit-level property attribution.
bank_transaction_splits.contract_id to contracts.idOptional contract attribution.
bank_transaction_splits.expected_expense_id to expected_expenses.idOptional expense attribution.
bank_transaction_splits.rent_installment_id to rent_installments.idOptional rent attribution.

Notes and design rationale

A EUR 1,200 incoming transaction can be split into EUR 900 rent income, EUR 200 condominium reimbursement, and EUR 100 utilities. Reports should aggregate split lines, not raw bank rows.

rent_installments

Purpose

Expected rent payment schedule generated from contracts.

Suggested attributes

FieldDescription
idPrimary identifier.
contract_idSource contract.
due_dateExpected payment due date.
period_startRental period start.
period_endRental period end.
total_amountExpected total installment amount.
currencyCurrency.
statusEXPECTED, PAID, PARTIALLY_PAID, OVERDUE, or CANCELLED.
notesFree-form notes.
created_atCreation timestamp.
updated_atLast update timestamp.

Relationships

RelationshipDescription
rent_installments.contract_id to contracts.idEach installment belongs to one contract.
rent_installments to rent_installment_linesOne installment has many expected lines.
rent_installments to rent_payment_matchesInstallments can be reconciled with bank transactions.

Notes and design rationale

Installments represent what should happen. They are not proof of payment until matched with bank movements.

rent_installment_lines

Purpose

Expected rent payment line items.

Suggested attributes

FieldDescription
idPrimary identifier.
rent_installment_idParent rent installment.
category_idExpected category.
descriptionLine description.
amountExpected amount.
currencyCurrency.

Relationships

RelationshipDescription
rent_installment_lines.rent_installment_id to rent_installments.idOne installment can have many lines.
rent_installment_lines.category_id to transaction_categories.idEach expected line has one category.

Notes and design rationale

Example for a EUR 1,200 installment: EUR 900 rent, EUR 200 condominium expenses, EUR 100 utilities.

rent_payment_matches

Purpose

Reconciliation between expected rent installments and actual bank transactions.

Suggested attributes

FieldDescription
idPrimary identifier.
rent_installment_idExpected installment.
bank_transaction_idActual bank transaction.
matched_amountAmount reconciled by this match.
match_typeAUTOMATIC or MANUAL.
matched_atMatch timestamp.
notesFree-form notes.

Relationships

RelationshipDescription
rent_payment_matches.rent_installment_id to rent_installments.idOne installment can have many matches.
rent_payment_matches.bank_transaction_id to bank_transactions.idOne transaction can match one or more installments.

Notes and design rationale

Separate match records preserve auditability and support partial payments, overpayments, and manual corrections.

expected_expenses

Purpose

Expected expenses for forecasting, alerting, anomaly detection, and reconciliation.

Suggested attributes

FieldDescription
idPrimary identifier.
property_idLinked property.
property_unit_idOptional linked unit.
property_service_idOptional linked service.
provider_party_idExpected provider party.
category_idExpected expense category.
due_dateExpected due date.
period_startExpense period start.
period_endExpense period end.
expected_amountExpected amount.
currencyCurrency.
statusEXPECTED, PAID, PARTIALLY_PAID, OVERDUE, or CANCELLED.
recurrence_ruleRecurrence rule for future generation.
tolerance_amountAbsolute tolerance for matching/anomaly checks.
tolerance_percentPercentage tolerance for matching/anomaly checks.
notesFree-form notes.
created_atCreation timestamp.
updated_atLast update timestamp.

Relationships

RelationshipDescription
expected_expenses.property_id to properties.idEach expected expense belongs to a property.
expected_expenses.property_unit_id to property_units.idOptional unit-level expense.
expected_expenses.property_service_id to property_services.idOptional service-level expense.
expected_expenses.provider_party_id to parties.idProvider party.
expected_expenses.category_id to transaction_categories.idMandatory category.
expected_expenses to expense_payment_matchesExpected expenses can be matched to actual transactions.

Notes and design rationale

This table is the base for cash-flow forecasting, overdue alerts, and expected-versus-actual analysis.

expense_payment_matches

Purpose

Reconciliation between expected expenses and actual bank transactions.

Suggested attributes

FieldDescription
idPrimary identifier.
expected_expense_idExpected expense.
bank_transaction_idActual bank transaction.
matched_amountAmount reconciled by this match.
match_typeAUTOMATIC or MANUAL.
matched_atMatch timestamp.
notesFree-form notes.

Relationships

RelationshipDescription
expense_payment_matches.expected_expense_id to expected_expenses.idOne expected expense can have many matches.
expense_payment_matches.bank_transaction_id to bank_transactions.idOne transaction can match one or more expected expenses.

Notes and design rationale

This enables partial payment handling and keeps matching decisions separate from raw bank data.

Graphical local diagrams

bank_transaction_splits

rent_installments

rent_installment_lines

rent_payment_matches

expected_expenses

expense_payment_matches