Synthetic sales/finance reporting exercise

This fictional exercise contains four CRM contract rows and eight finance contract-period rows.
All amounts are USD. The exercise's local bookings rule is the full signed contract amount in its signed month.
The recognized-revenue amounts are explicit inputs supplied by a fictional finance-approved schedule;
they are not calculated from contract value, dates, or any accounting standard. Real teams must use
their controller-approved metric definitions and accounting schedule. This pack is not accounting advice.

Files:
- metric-dictionary-template.csv: an Excel-ready starter with separate owner and approval fields.
- crm-bookings.csv: one row per signed contract.
- finance-approved-revenue-schedule.csv: one explicit row per contract per month. A zero is explicit;
  a missing row is not a zero and must be investigated.
- expected-monthly-comparison.csv: independently calculated monthly totals. The difference is diagnostic only.
- expected-controls.csv: row-count, total, and join-fanout checks.

Important join check:
Joining the one-row-per-contract table directly to the two-row-per-contract-period table repeats each
booking amount twice. The incorrect joined bookings sum is $480,000; the CRM source total is $240,000.
Aggregate bookings from the CRM source by signed month and recognized revenue from the finance source
by finance period before comparing them. Never use the diagnostic difference as a journal entry.

Failure test:
1. In a copy, change CT-101's CRM booking from $120,000 to $121,000. March bookings should rise by $1,000;
   check the signed source before changing a finance figure.
2. Remove CT-102's April schedule row. The contract-period coverage check should fail; do not treat its
   absence as zero revenue or fill it from the booking value.

All names, contracts, values, and schedules are invented for this reproducible example. No customer data
or RowSpeak product output is included.
