/* Meridian — the one fixture set. Every screen reads these arrays; a record
   that appears twice is this entry read twice, never a second literal written
   to match. Timestamps are offsets from load so the time column and the
   countdowns are always true.

   Money is authored in CENTS everywhere in this file, with no exceptions: the
   formatters and every helper in metrics.js assume it.

   Narrative check: notifications and blocked reasons below name real records —
   dsp_2XB, po_7739, pay_9K1H7, crd_2093 and crd_6642 — and agree with their
   status, their derived flags and their clock. */

const MERIDIAN_NOW = Date.now();
const H = 3600e3;
const ago = (h) => MERIDIAN_NOW - h * H;
const ahead = (h) => MERIDIAN_NOW + h * H;

/* The workspace's people. One record each: `role` is the job title shown in the
   account menu, `teamRole` is the permission value from TEAM_ROLES, and the
   signed-in user is one of these entries rather than a second literal — the
   profile screen and the team screen edit the same record.

   `approvalLimit` is the most money this person can release on their own, and
   it is read: PAYOUT_FLAGS.isApprovable takes the approver as an argument, the
   same way the receipt rule takes the policy. A payout above the signed-in
   user's limit is not approvable by her at any altitude — badge, figure, row or
   bulk bar — and the row names who can. Margit sits above Dana so the state is
   a real escalation rather than a dead end. */
const MEMBERS = [
  { id: "usr_dana", name: "Dana Whitfield", role: "Treasury operations", teamRole: "admin", email: "dana@northwind.example", avatar: "../../assets/img/avatar-40-02.jpg", approvalLimit: 5000000, canIssueCards: true, notify: ["payout_approval", "dispute_evidence", "expense_review"] },
  { id: "usr_tomas", name: "Tomas Weir", role: "Platform engineering", teamRole: "approver", email: "tomas@northwind.example", avatar: "../../assets/img/avatar-40-01.jpg", approvalLimit: 2500000, canIssueCards: false, notify: ["payment_failed"] },
  { id: "usr_priya", name: "Priya Raman", role: "Marketing", teamRole: "member", email: "priya@northwind.example", avatar: "../../assets/img/avatar-40-03.jpg", approvalLimit: 0, canIssueCards: false, notify: [] },
  { id: "usr_ines", name: "Ines Duarte", role: "Sales", teamRole: "member", email: "ines@northwind.example", avatar: "../../assets/img/avatar-40-04.jpg", approvalLimit: 0, canIssueCards: false, notify: [] },
  { id: "usr_margit", name: "Margit Solberg", role: "Finance director", teamRole: "admin", email: "margit@northwind.example", avatar: "../../assets/img/avatar-40-05.jpg", approvalLimit: 50000000, canIssueCards: true, notify: ["payout_approval", "balance_low"] },
];
const MERIDIAN_SIGNED_IN = "usr_dana";
const MERIDIAN_USER = MEMBERS[0];
/* The statement descriptor and the payout schedule are workspace settings, not
   status: they are edited on /settings and read nowhere else. */
const MERIDIAN_WORKSPACE = { name: "Northwind Markets", plan: "Scale", descriptor: "NORTHWIND MKTS", schedule: "weekly" };

const PAYMENTS = [
  { id: "pay_9K4T2", customer: "Harborview Freight", method: "wire", amount: 4820000, status: "succeeded", createdAt: ago(1.5) },
  { id: "pay_9K3Q8", customer: "Lumen Retail Group", method: "card", amount: 128450, status: "succeeded", createdAt: ago(3) },
  { id: "pay_9K2M1", customer: "Delta Provisions", method: "ach", amount: 964000, status: "pending", createdAt: ago(5) },
  { id: "pay_9K1H7", customer: "Kestrel Software", method: "card", amount: 31200, status: "failed", createdAt: ago(9), failureReason: "Card declined" },
  { id: "pay_9J9D4", customer: "Alcove Interiors", method: "wallet", amount: 218075, status: "succeeded", createdAt: ago(14) },
  { id: "pay_9J8B0", customer: "Brightline Labs", method: "ach", amount: 1500000, status: "authorized", createdAt: ago(20) },
  { id: "pay_9J6X3", customer: "Sable & Finch", method: "card", amount: 84520, status: "refunded", createdAt: ago(30) },
  { id: "pay_9J2R6", customer: "Northbeam Logistics", method: "wire", amount: 2750000, status: "succeeded", createdAt: ago(48) },
  { id: "pay_9H8L9", customer: "Onyx Dental", method: "card", amount: 41000, status: "succeeded", createdAt: ago(72) },
  { id: "pay_9H4F2", customer: "Kestrel Software", method: "card", amount: 31200, status: "succeeded", createdAt: ago(96) },
  { id: "pay_9H1C5", customer: "Vantage Fitness", method: "ach", amount: 630000, status: "succeeded", createdAt: ago(120) },
  { id: "pay_9G7Z8", customer: "Copperline Coffee", method: "card", amount: 12840, status: "failed", createdAt: ago(156), failureReason: "Insufficient funds" },
  { id: "pay_9G2V1", customer: "Harborview Freight", method: "wire", amount: 5290000, status: "succeeded", createdAt: ago(216) },
  { id: "pay_9F8S4", customer: "Meadowlark Farms", method: "ach", amount: 375000, status: "succeeded", createdAt: ago(288) },
  { id: "pay_9F1N7", customer: "Lumen Retail Group", method: "card", amount: 294010, status: "succeeded", createdAt: ago(408) },
  { id: "pay_9E6J0", customer: "Ridgeway Legal", method: "card", amount: 110000, status: "refunded", createdAt: ago(528) },
  { id: "pay_9E2G3", customer: "Brightline Labs", method: "wire", amount: 1840000, status: "succeeded", createdAt: ago(624) },
  { id: "pay_9D5P6", customer: "Copperline Coffee", method: "card", amount: 9600, status: "succeeded", createdAt: ago(984) },
  { id: "pay_9C9K9", customer: "Vantage Fitness", method: "ach", amount: 512000, status: "succeeded", createdAt: ago(1392) },
  { id: "pay_9B4E2", customer: "Onyx Dental", method: "card", amount: 98000, status: "succeeded", createdAt: ago(1776) },
];

/* Each dispute's amount is its payment's amount — the payment owns the figure. */
const DISPUTES = [
  { id: "dsp_31A", paymentId: "pay_9F1N7", customer: "Lumen Retail Group", amount: 294010, reason: "Product not received", status: "needs_response", openedAt: ago(40), evidenceDueAt: ahead(96) },
  { id: "dsp_2XB", paymentId: "pay_9H1C5", customer: "Vantage Fitness", amount: 630000, reason: "Unrecognised charge", status: "needs_response", openedAt: ago(72), evidenceDueAt: ahead(22) },
  { id: "dsp_19K", paymentId: "pay_9H8L9", customer: "Onyx Dental", amount: 41000, reason: "Duplicate charge", status: "under_review", openedAt: ago(144), evidenceDueAt: null, evidenceSubmittedAt: ago(96) },
];

const PAYOUTS = [
  { id: "po_7742", destination: "Harborview Freight", account: "•••• 4417", amount: 6148000, status: "awaiting_approval", requestedAt: ago(4), expectedAt: ahead(26) },
  { id: "po_7741", destination: "Lumen Retail Group", account: "•••• 8802", amount: 1290560, status: "awaiting_approval", requestedAt: ago(9), expectedAt: ahead(30) },
  { id: "po_7739", destination: "Vantage Fitness", account: "•••• 2130", amount: 630000, status: "awaiting_approval", requestedAt: ago(50), expectedAt: ahead(18), blockedBy: { team: "Risk", reason: "Compliance review — open dispute dsp_2XB" } },
  { id: "po_7736", destination: "Brightline Labs", account: "•••• 6651", amount: 1840000, status: "approved", requestedAt: ago(30), approvedAt: ago(26), approvedBy: "Dana Whitfield", expectedAt: ahead(8) },
  { id: "po_7733", destination: "Meadowlark Farms", account: "•••• 0094", amount: 375000, status: "in_transit", requestedAt: ago(80), expectedAt: ahead(6) },
  { id: "po_7728", destination: "Onyx Dental", account: "•••• 7725", amount: 98000, status: "paid", requestedAt: ago(96), paidAt: ago(68) },
  { id: "po_7725", destination: "Sable & Finch", account: "•••• 3318", amount: 84520, status: "returned", requestedAt: ago(200), returnedAt: ago(176), returnReason: "Account closed" },
  { id: "po_7719", destination: "Copperline Coffee", account: "•••• 5540", amount: 12840, status: "rejected", requestedAt: ago(268), rejectedAt: ago(240), rejectedBy: "Dana Whitfield", rejectReason: "Duplicate of po_7712" },
];

/* Available is the only stored money figure. Reserved and committed are
   computed from the disputes and payouts above — see metrics.js. */
const BALANCE = { currency: "USD", availableCents: 41280644, bank: "Northwind Operating •••• 1182" };

/* Corporate cards. `spendLimit` is per rolling 30 days — the window the cards
   screen measures spend over, so the meter is never empty at the start of a
   calendar month. A cancelled card keeps its limit for the record. */
const CARDS = [
  { id: "crd_4471", label: "Operations", last4: "4471", holderId: "usr_dana", type: "physical", status: "active", spendLimit: 750000, openedAt: ago(9000), expiresAt: ahead(24 * 300) },
  { id: "crd_2093", label: "Marketing", last4: "2093", holderId: "usr_priya", type: "physical", status: "active", spendLimit: 500000, openedAt: ago(7400), expiresAt: ahead(24 * 40) },
  { id: "crd_8810", label: "Cloud vendors", last4: "8810", holderId: "usr_tomas", type: "virtual", status: "active", spendLimit: 1200000, openedAt: ago(5200), expiresAt: ahead(24 * 500) },
  { id: "crd_6642", label: "Travel — sales", last4: "6642", holderId: "usr_ines", type: "physical", status: "frozen", spendLimit: 400000, openedAt: ago(4300), expiresAt: ahead(24 * 200), frozenAt: ago(30), frozenBy: "Dana Whitfield", frozenReason: "Two receipts outstanding on trip spend" },
  { id: "crd_1157", label: "Contractor pool", last4: "1157", holderId: "usr_priya", type: "virtual", status: "pending_activation", spendLimit: 150000, openedAt: ago(52), expiresAt: ahead(24 * 700) },
  { id: "crd_9930", label: "Operations (replaced)", last4: "9930", holderId: "usr_dana", type: "physical", status: "cancelled", spendLimit: 250000, openedAt: ago(14000), expiresAt: ahead(24 * 100), cancelledAt: ago(600), cancelledBy: "Dana Whitfield", cancelReason: "Replaced by crd_4471" },
];

/* Card spend. `receiptAt` is a fact about the record; whether the receipt is
   REQUIRED is policy, so it lives in MERIDIAN_POLICY_DEFAULTS and the flag that
   reads it is derived. A pending row is an authorisation that has not settled —
   there is nothing to review yet and it is outside every spend total. */
const EXPENSES = [
  { id: "exp_8754", cardId: "crd_4471", spenderId: "usr_dana", merchant: "Kestrel Software", category: "software", amount: 31200, status: "pending", occurredAt: ago(3), receiptAt: null },
  { id: "exp_8758", cardId: "crd_8810", spenderId: "usr_tomas", merchant: "Vercel", category: "software", amount: 24000, status: "pending", occurredAt: ago(6), receiptAt: null },
  { id: "exp_8762", cardId: "crd_2093", spenderId: "usr_priya", merchant: "Craftline Print", category: "advertising", amount: 95000, status: "needs_review", occurredAt: ago(20), receiptAt: ago(19) },
  { id: "exp_8776", cardId: "crd_4471", spenderId: "usr_dana", merchant: "Copperline Coffee", category: "meals", amount: 9200, status: "needs_review", occurredAt: ago(36), receiptAt: ago(35) },
  { id: "exp_8770", cardId: "crd_4471", spenderId: "usr_dana", merchant: "Statewide Notary", category: "services", amount: 15000, status: "queried", occurredAt: ago(64), receiptAt: null, queriedAt: ago(40), queriedBy: "Dana Whitfield", queryNote: "Which closing was this for?" },
  { id: "exp_8774", cardId: "crd_4471", spenderId: "usr_dana", merchant: "Postal Union", category: "services", amount: 12400, status: "approved", occurredAt: ago(90), receiptAt: ago(89), reviewedAt: ago(80), reviewedBy: "Dana Whitfield" },
  { id: "exp_8798", cardId: "crd_2093", spenderId: "usr_priya", merchant: "Meta Ads", category: "advertising", amount: 210000, status: "approved", occurredAt: ago(120), receiptAt: ago(119), reviewedAt: ago(110), reviewedBy: "Dana Whitfield" },
  { id: "exp_8780", cardId: "crd_4471", spenderId: "usr_dana", merchant: "Fernwood Office", category: "equipment", amount: 128000, status: "approved", occurredAt: ago(170), receiptAt: ago(168), reviewedAt: ago(160), reviewedBy: "Tomas Weir" },
  { id: "exp_8801", cardId: "crd_8810", spenderId: "usr_tomas", merchant: "Amazon Web Services", category: "software", amount: 862000, status: "approved", occurredAt: ago(200), receiptAt: ago(198), reviewedAt: ago(150), reviewedBy: "Dana Whitfield" },
  { id: "exp_8784", cardId: "crd_6642", spenderId: "usr_ines", merchant: "Calder & Sons", category: "meals", amount: 21800, status: "needs_review", occurredAt: ago(240), receiptAt: null },
  { id: "exp_8786", cardId: "crd_6642", spenderId: "usr_ines", merchant: "Harbour Grand Hotel", category: "travel", amount: 96500, status: "needs_review", occurredAt: ago(250), receiptAt: null },
  { id: "exp_8788", cardId: "crd_6642", spenderId: "usr_ines", merchant: "Meridian Air", category: "travel", amount: 184000, status: "approved", occurredAt: ago(260), receiptAt: ago(255), reviewedAt: ago(230), reviewedBy: "Dana Whitfield" },
  { id: "exp_8795", cardId: "crd_2093", spenderId: "usr_priya", merchant: "Google Ads", category: "advertising", amount: 165000, status: "approved", occurredAt: ago(300), receiptAt: ago(299), reviewedAt: ago(290), reviewedBy: "Dana Whitfield" },
  { id: "exp_8790", cardId: "crd_8810", spenderId: "usr_tomas", merchant: "Datadog", category: "software", amount: 129000, status: "needs_review", occurredAt: ago(400), receiptAt: ago(399) },
  { id: "exp_8766", cardId: "crd_2093", spenderId: "usr_priya", merchant: "LinkedIn Ads", category: "advertising", amount: 42000, status: "approved", occurredAt: ago(500), receiptAt: ago(498), reviewedAt: ago(480), reviewedBy: "Dana Whitfield" },
  { id: "exp_8750", cardId: "crd_8810", spenderId: "usr_tomas", merchant: "GitHub", category: "software", amount: 45000, status: "approved", occurredAt: ago(760), receiptAt: ago(758), reviewedAt: ago(740), reviewedBy: "Dana Whitfield" },
  { id: "exp_8744", cardId: "crd_8810", spenderId: "usr_tomas", merchant: "Cloudflare", category: "software", amount: 78000, status: "approved", occurredAt: ago(1100), receiptAt: ago(1098), reviewedAt: ago(1080), reviewedBy: "Dana Whitfield" },
  { id: "exp_8740", cardId: "crd_2093", spenderId: "usr_priya", merchant: "Sable & Finch", category: "meals", amount: 18400, status: "denied", occurredAt: ago(1180), receiptAt: ago(1179), deniedAt: ago(1100), deniedBy: "Dana Whitfield", denyReason: "Personal spend — repaid through payroll" },
  { id: "exp_8736", cardId: "crd_9930", spenderId: "usr_dana", merchant: "Fernwood Office", category: "equipment", amount: 64000, status: "approved", occurredAt: ago(1400), receiptAt: ago(1398), reviewedAt: ago(1380), reviewedBy: "Tomas Weir" },
  { id: "exp_8730", cardId: "crd_6642", spenderId: "usr_ines", merchant: "Rail North", category: "travel", amount: 38600, status: "approved", occurredAt: ago(1500), receiptAt: ago(1495), reviewedAt: ago(1470), reviewedBy: "Dana Whitfield" },
  { id: "exp_8724", cardId: "crd_4471", spenderId: "usr_dana", merchant: "Halloway Insurance", category: "services", amount: 21000, status: "approved", occurredAt: ago(1700), receiptAt: ago(1698), reviewedAt: ago(1680), reviewedBy: "Tomas Weir" },
  { id: "exp_8718", cardId: "crd_8810", spenderId: "usr_tomas", merchant: "Sentry", category: "software", amount: 33000, status: "approved", occurredAt: ago(2000), receiptAt: ago(1999), reviewedAt: ago(1980), reviewedBy: "Dana Whitfield" },
];

/* The companies on the other side of the money. A payment, a payout and a
   dispute each carry the customer's NAME, and this is the record that name
   refers to — the name is written once per company here, and every screen that
   needs the company behind a row looks it up by it (see metrics.js). `since` is
   when they were onboarded; `payoutAccount` is the bank account their payouts
   land in, and matches the account printed on those payout rows.

   Every value of customer.status has a fixture, and each one is here for a
   reason the rest of the data agrees with: Vantage Fitness is on hold while
   dsp_2XB runs and po_7739 is held for it, Sable & Finch is suspended because
   po_7725 came back "account closed", and Ridgeway Legal is closed — both its
   payments were refunded and nothing has arrived since. */
const CUSTOMERS = [
  { id: "cus_harborview", name: "Harborview Freight", ownerId: "usr_dana", status: "live", country: "United States", currency: "USD", since: ago(9800), payoutAccount: "•••• 4417", contact: { name: "Ruth Callan", email: "ruth@harborview.example" } },
  { id: "cus_lumen", name: "Lumen Retail Group", ownerId: "usr_ines", status: "live", country: "United States", currency: "USD", since: ago(8600), payoutAccount: "•••• 8802", contact: { name: "Marco Deniz", email: "marco@lumenretail.example" } },
  { id: "cus_vantage", name: "Vantage Fitness", ownerId: "usr_dana", status: "on_hold", country: "United States", currency: "USD", since: ago(6100), payoutAccount: "•••• 2130", contact: { name: "Neve Ashworth", email: "neve@vantagefitness.example" } },
  { id: "cus_brightline", name: "Brightline Labs", ownerId: "usr_tomas", status: "live", country: "Ireland", currency: "USD", since: ago(5400), payoutAccount: "•••• 6651", contact: { name: "Aoife Kerr", email: "aoife@brightlinelabs.example" } },
  { id: "cus_kestrel", name: "Kestrel Software", ownerId: "usr_tomas", status: "live", country: "United Kingdom", currency: "USD", since: ago(4900), payoutAccount: null, contact: { name: "Owen Pryce", email: "owen@kestrelsoftware.example" } },
  { id: "cus_northbeam", name: "Northbeam Logistics", ownerId: "usr_dana", status: "live", country: "Canada", currency: "USD", since: ago(4300), payoutAccount: null, contact: { name: "Simone Vail", email: "simone@northbeam.example" } },
  { id: "cus_delta", name: "Delta Provisions", ownerId: "usr_ines", status: "live", country: "United States", currency: "USD", since: ago(3800), payoutAccount: null, contact: { name: "Hal Brenner", email: "hal@deltaprovisions.example" } },
  { id: "cus_alcove", name: "Alcove Interiors", ownerId: "usr_ines", status: "live", country: "United States", currency: "USD", since: ago(3200), payoutAccount: null, contact: { name: "Perla Nunes", email: "perla@alcove.example" } },
  { id: "cus_onyx", name: "Onyx Dental", ownerId: "usr_ines", status: "live", country: "United States", currency: "USD", since: ago(2600), payoutAccount: "•••• 7725", contact: { name: "Dr Iris Falk", email: "iris@onyxdental.example" } },
  { id: "cus_meadowlark", name: "Meadowlark Farms", ownerId: "usr_ines", status: "live", country: "United States", currency: "USD", since: ago(2200), payoutAccount: "•••• 0094", contact: { name: "Jonah Reyes", email: "jonah@meadowlark.example" } },
  { id: "cus_copperline", name: "Copperline Coffee", ownerId: "usr_ines", status: "live", country: "United States", currency: "USD", since: ago(1900), payoutAccount: "•••• 5540", contact: { name: "Bea Toft", email: "bea@copperline.example" } },
  { id: "cus_sable", name: "Sable & Finch", ownerId: "usr_ines", status: "suspended", country: "United States", currency: "USD", since: ago(1600), payoutAccount: "•••• 3318", contact: { name: "Cleo Sable", email: "cleo@sableandfinch.example" } },
  { id: "cus_ridgeway", name: "Ridgeway Legal", ownerId: "usr_ines", status: "closed", country: "United States", currency: "USD", since: ago(1400), payoutAccount: null, contact: { name: "Tom Ridgeway", email: "tom@ridgewaylegal.example" } },
];

/* Notes — the product's social record, and the only one that is written BY the
   people in MEMBERS rather than by the money. A mention is a member id, never a
   name (`@usr_tomas`), so a person's name exists once in this file; whether the
   mention is still owed a reply is derived, not stored (COMMENT_FLAGS).

   Notes are only on records that have a screen — a dispute and a card — so a
   mention always opens onto its own thread.

   Narrative check: cmt_301/302 sit inside dsp_2XB's 22-hour evidence clock and
   agree with po_7739 being held for that dispute; cmt_304/305 straddle
   crd_6642's freeze at ago(30) and name the two receipts frozenReason gives as
   the cause; cmt_307 is priya on the card ntf_5 says is over its limit. */
const COMMENTS = [
  { id: "cmt_301", record: { type: "dispute", id: "dsp_2XB" }, authorId: "usr_dana", at: ago(26), mentions: ["usr_tomas"], body: "@usr_tomas Vantage say they never recognised this charge. Did anything ever come back signed for it? Evidence is due inside a day and the $6,300.00 is held against the balance until it closes." },
  { id: "cmt_302", record: { type: "dispute", id: "dsp_2XB" }, authorId: "usr_tomas", at: ago(19), mentions: ["usr_dana"], body: "Nothing signed. The shipping log stops at the depot, so it shows we sent it and not that they got it. @usr_dana your call whether we send that or accept it and keep the fee." },
  { id: "cmt_303", record: { type: "dispute", id: "dsp_31A" }, authorId: "usr_ines", at: ago(20), mentions: [], body: "Lumen's ops contact thinks the pallet went to their old warehouse. They are looking for the signed manifest — worth holding a day before we answer, the clock is four days out." },
  { id: "cmt_304", record: { type: "card", id: "crd_6642" }, authorId: "usr_dana", at: ago(31), mentions: ["usr_ines"], body: "@usr_ines the hotel and the Calder & Sons meal are the two receipts holding this card. Send them over and I will unfreeze it the same day." },
  { id: "cmt_305", record: { type: "card", id: "crd_6642" }, authorId: "usr_ines", at: ago(28), mentions: ["usr_dana"], body: "The hotel folio has to be reissued by the venue and they said Monday. @usr_dana can the card stay frozen until then, or do you want the statement line instead?" },
  { id: "cmt_306", record: { type: "card", id: "crd_6642" }, authorId: "usr_tomas", at: ago(24), mentions: [], body: "Both open items are travel on the same trip — nothing else on this card is waiting on anyone." },
  { id: "cmt_307", record: { type: "card", id: "crd_2093" }, authorId: "usr_priya", at: ago(5), mentions: ["usr_dana"], body: "@usr_dana the Craftline print run took this past the 30-day limit. The campaign ends Friday — can the limit go up until then, or should the rest go on the contractor card?" },
  { id: "cmt_308", record: { type: "customer", id: "cus_vantage" }, authorId: "usr_dana", at: ago(48), mentions: ["usr_ines"], body: "@usr_ines Vantage are on hold while the chargeback runs, so their payout is sitting rather than lost. If they call, that is the line — nothing is decided until the network answers." },
  { id: "cmt_309", record: { type: "customer", id: "cus_sable" }, authorId: "usr_ines", at: ago(170), mentions: [], body: "Their bank closed the account on us, which is why the payout came back. Suspended until they send new details in writing — they know." },
  { id: "cmt_310", record: { type: "member", id: "usr_ines" }, authorId: "usr_dana", at: ago(29), mentions: [], body: "Ines is on the road until Thursday, so her accounts sit with me this week. Travel receipts are the only thing outstanding on her card." },
];

/* Each route must be one nav.js registers. There are no per-record screens for
   payments and payouts, so those two land on the list that holds the record;
   a dispute has one, because the disputes screen is list-detail. */
const NOTIFICATIONS = [
  { id: "ntf_5", title: "Card past its 30-day limit", body: "crd_2093 · Marketing · $5,120.00 of $5,000.00", at: ago(3), route: "/cards/crd_2093" },
  { id: "ntf_4", title: "Two receipts outstanding", body: "crd_6642 · Ines Duarte · $1,183.00 waiting on a receipt", at: ago(8), route: "/expenses" },
  { id: "ntf_3", title: "Evidence due in under a day", body: "dsp_2XB · Vantage Fitness · $6,300.00", at: ago(2), route: "/disputes/dsp_2XB" },
  { id: "ntf_2", title: "Payout held for compliance review", body: "po_7739 · Vantage Fitness · $6,300.00", at: ago(12), route: "/payouts" },
  { id: "ntf_1", title: "Payment failed — card declined", body: "pay_9K1H7 · Kestrel Software · $312.00", at: ago(9), route: "/payments" },
  { id: "ntf_6", title: "Tomas Weir is waiting on your call", body: "dsp_2XB · send the shipping log, or accept the dispute", at: ago(19), route: "/disputes/dsp_2XB" },
];

Object.assign(window, { MERIDIAN_NOW, MERIDIAN_USER, MERIDIAN_SIGNED_IN, MEMBERS, MERIDIAN_WORKSPACE, PAYMENTS, DISPUTES, PAYOUTS, CARDS, EXPENSES, BALANCE, NOTIFICATIONS, COMMENTS, CUSTOMERS });
