feat(stand,seed): reproducible demo data on both stands, make seed, smoke and prodlike
This commit is contained in:
1 parent
772047c0a1
commit
8b3f7e78a3
8 files changed
+3037
-1
No files matched your search
@@ -0,0 +1,742 @@
|
||||
import { type Code, type expenses, SAVINGS } from "./catalog.ts";
|
||||
|
||||
export type Kind = "withdrawal" | "deposit" | "transfer";
|
||||
type Place = keyof typeof expenses;
|
||||
type Odds<T> = readonly [T, number];
|
||||
|
||||
export interface Habit {
|
||||
budget?: Odds<string>;
|
||||
category: Odds<string>;
|
||||
count: readonly [number, number];
|
||||
currency?: Code;
|
||||
notes?: Odds<readonly string[]>;
|
||||
places: readonly (readonly [
|
||||
Place,
|
||||
number,
|
||||
number,
|
||||
number,
|
||||
readonly string[],
|
||||
])[];
|
||||
sources: readonly Odds<string>[];
|
||||
tags?: Odds<readonly (readonly string[])[]>;
|
||||
url?: Odds<string>;
|
||||
}
|
||||
|
||||
export interface Plan {
|
||||
amount: number | readonly [number, number];
|
||||
budget?: string;
|
||||
category?: string;
|
||||
currency?: Code;
|
||||
days?: readonly number[];
|
||||
description: string | readonly string[];
|
||||
destination: string | readonly string[];
|
||||
key?: readonly [string, number];
|
||||
months: readonly number[] | "all";
|
||||
notes?: string;
|
||||
piggy?: string;
|
||||
source: string;
|
||||
step?: number;
|
||||
tags?: readonly string[];
|
||||
trip?: "krakow" | "lisbon";
|
||||
type: Kind;
|
||||
}
|
||||
|
||||
export const groceryNotes = [
|
||||
"weekly shop",
|
||||
"split with Ivan, he owes 43 zł",
|
||||
"forgot bags again",
|
||||
"stuff for the Friday party",
|
||||
"Moose's food included",
|
||||
"promo on coffee, took 3",
|
||||
"self-checkout was broken, queued 15 min",
|
||||
];
|
||||
|
||||
export const transferNotes = [
|
||||
"for rent",
|
||||
"topping up for groceries",
|
||||
"rate was ok today",
|
||||
"moving money before the weekend",
|
||||
];
|
||||
|
||||
export const billNotes = [
|
||||
"price went up again",
|
||||
"charged in USD, bank fee ~1.5%",
|
||||
"switch to yearly?",
|
||||
"invoice in email",
|
||||
];
|
||||
|
||||
export const habits: Habit[] = [
|
||||
{
|
||||
budget: ["Groceries", 0.85],
|
||||
category: ["Groceries", 0.9],
|
||||
count: [26, 32],
|
||||
notes: [groceryNotes, 0.28],
|
||||
places: [
|
||||
[
|
||||
"biedronka",
|
||||
6,
|
||||
25,
|
||||
220,
|
||||
["Groceries — Biedronka", "Weekly shop — Biedronka"],
|
||||
],
|
||||
["lidl", 5, 30, 240, ["Groceries — Lidl", "Food — Lidl"]],
|
||||
["zabka", 4, 8, 45, ["Żabka — snacks", "Żabka — hot dog and coffee"]],
|
||||
["carrefour", 2, 15, 120, ["Carrefour Express"]],
|
||||
["kaufland", 2, 60, 320, ["Groceries — Kaufland"]],
|
||||
],
|
||||
sources: [
|
||||
["mono", 55],
|
||||
["pko", 25],
|
||||
["cash", 14],
|
||||
["credit", 6],
|
||||
],
|
||||
tags: [[["moose"]], 0.12],
|
||||
},
|
||||
{
|
||||
budget: ["Eating out", 0.7],
|
||||
category: ["Eating out", 0.9],
|
||||
count: [24, 30],
|
||||
notes: [
|
||||
[
|
||||
"lunch with Marta",
|
||||
"team lunch, will expense",
|
||||
"dinner with Artem, he paid tips",
|
||||
"coffee before standup",
|
||||
"date night",
|
||||
"worked from here half the day",
|
||||
"ordered too much again",
|
||||
],
|
||||
0.32,
|
||||
],
|
||||
places: [
|
||||
["starbucks", 4, 14, 32, ["Coffee — Starbucks"]],
|
||||
["costa", 3, 12, 28, ["Coffee — Costa"]],
|
||||
["mcdonalds", 2, 22, 55, ["Quick bite — McDonald's"]],
|
||||
["bar", 2, 18, 40, ["Lunch — Bar Mleczny"]],
|
||||
["bistro", 2, 55, 160, ["Dinner — pierogi"]],
|
||||
["hamsa", 1, 70, 240, ["Dinner — Hamsa"]],
|
||||
["sushi", 1, 80, 260, ["Sushi"]],
|
||||
["wolt", 3, 45, 120, ["Delivery — Wolt"]],
|
||||
["glovo", 2, 40, 110, ["Delivery — Glovo"]],
|
||||
],
|
||||
sources: [
|
||||
["mono", 50],
|
||||
["credit", 25],
|
||||
["pko", 15],
|
||||
["cash", 10],
|
||||
],
|
||||
tags: [[["reimbursable"], ["programming/side-project"]], 0.16],
|
||||
},
|
||||
{
|
||||
budget: ["Transport", 0.8],
|
||||
category: ["Transport", 0.92],
|
||||
count: [12, 16],
|
||||
notes: [
|
||||
[
|
||||
"airport",
|
||||
"late night ride home",
|
||||
"rain, no bus",
|
||||
"to the coworking",
|
||||
"surge pricing, ugh",
|
||||
],
|
||||
0.3,
|
||||
],
|
||||
places: [
|
||||
["bolt", 3, 14, 65, ["Bolt ride"]],
|
||||
["uber", 1, 14, 65, ["Uber trip"]],
|
||||
],
|
||||
sources: [
|
||||
["mono", 60],
|
||||
["credit", 40],
|
||||
],
|
||||
},
|
||||
{
|
||||
budget: ["Everything else", 0.5],
|
||||
category: ["Health", 0.9],
|
||||
count: [1, 3],
|
||||
places: [
|
||||
[
|
||||
"gemini",
|
||||
1,
|
||||
18,
|
||||
140,
|
||||
["Pharmacy", "Vitamins", "Ibuprofen and plasters", "Allergy pills"],
|
||||
],
|
||||
],
|
||||
sources: [
|
||||
["mono", 1],
|
||||
["pko", 1],
|
||||
],
|
||||
},
|
||||
{
|
||||
budget: ["Everything else", 0.5],
|
||||
category: ["Household", 0.85],
|
||||
count: [2, 3],
|
||||
notes: [["shampoo + toothpaste", "cleaning stuff", "gift wrap"], 0.15],
|
||||
places: [["rossmann", 1, 20, 150, ["Rossmann — toiletries"]]],
|
||||
sources: [
|
||||
["mono", 1],
|
||||
["pko", 1],
|
||||
["cash", 1],
|
||||
],
|
||||
},
|
||||
{
|
||||
budget: ["Fun", 0.7],
|
||||
category: ["Entertainment", 0.9],
|
||||
count: [1, 2],
|
||||
places: [
|
||||
[
|
||||
"cinema",
|
||||
1,
|
||||
32,
|
||||
70,
|
||||
["Cinema — two tickets", "Cinema + popcorn", "IMAX"],
|
||||
],
|
||||
],
|
||||
sources: [["mono", 1]],
|
||||
},
|
||||
{
|
||||
budget: ["Fun", 0.7],
|
||||
category: ["Entertainment", 1],
|
||||
count: [0, 1],
|
||||
currency: "USD",
|
||||
places: [
|
||||
[
|
||||
"steam",
|
||||
1,
|
||||
5,
|
||||
40,
|
||||
[
|
||||
"Steam — Factorio DLC",
|
||||
"Steam sale",
|
||||
"Steam — Balatro",
|
||||
"Steam — gift for Dmytro",
|
||||
],
|
||||
],
|
||||
],
|
||||
sources: [["wise", 1]],
|
||||
},
|
||||
{
|
||||
budget: ["Fun", 0.7],
|
||||
category: ["Gifts", 1],
|
||||
count: [0, 1],
|
||||
notes: [
|
||||
["for Marta's birthday", "mom's name day", "housewarming at Artem's"],
|
||||
0.4,
|
||||
],
|
||||
places: [
|
||||
["flowers", 1, 60, 180, ["Flowers"]],
|
||||
["empik", 1, 50, 200, ["Book as a gift"]],
|
||||
],
|
||||
sources: [
|
||||
["mono", 1],
|
||||
["credit", 1],
|
||||
],
|
||||
},
|
||||
{
|
||||
category: ["Hardware", 1],
|
||||
count: [0, 1],
|
||||
places: [
|
||||
[
|
||||
"xkom",
|
||||
1,
|
||||
80,
|
||||
2500,
|
||||
[
|
||||
"Mechanical keyboard switches",
|
||||
"USB-C hub",
|
||||
"SSD 2 TB",
|
||||
"Monitor arm",
|
||||
"Webcam",
|
||||
],
|
||||
],
|
||||
],
|
||||
sources: [
|
||||
["credit", 1],
|
||||
["pko", 1],
|
||||
],
|
||||
tags: [[["programming"], ["Programming"]], 0.3],
|
||||
},
|
||||
{
|
||||
category: ["Household", 0.6],
|
||||
count: [0, 1],
|
||||
places: [
|
||||
[
|
||||
"allegro",
|
||||
1,
|
||||
30,
|
||||
400,
|
||||
["Phone case", "Kitchen scale", "Desk lamp", "LED strip", "Plant pots"],
|
||||
],
|
||||
],
|
||||
sources: [
|
||||
["credit", 1],
|
||||
["pko", 1],
|
||||
],
|
||||
url: ["https://allegro.pl/moje-allegro/zakupy/kupione/", 0.6],
|
||||
},
|
||||
];
|
||||
|
||||
const EVEN = [0, 2, 4, 6, 8, 10];
|
||||
const ODD = [1, 3, 5, 7, 9, 11];
|
||||
|
||||
export const plans: Plan[] = [
|
||||
{
|
||||
amount: 14_500,
|
||||
category: "Housing",
|
||||
days: [15],
|
||||
description: "Mortgage payment",
|
||||
destination: "mortgage",
|
||||
months: "all",
|
||||
source: "mono",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 800,
|
||||
days: [5],
|
||||
description: "MacBook installment",
|
||||
destination: "loan",
|
||||
months: "all",
|
||||
source: "pko",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: SAVINGS,
|
||||
days: [11],
|
||||
description: "Savings — emergency fund",
|
||||
destination: "savings",
|
||||
months: "all",
|
||||
piggy: "emergency",
|
||||
source: "mono",
|
||||
type: "transfer",
|
||||
},
|
||||
{
|
||||
amount: 4000,
|
||||
days: [26],
|
||||
description: "Savings — MacBook",
|
||||
destination: "savings",
|
||||
months: "all",
|
||||
piggy: "macbook",
|
||||
source: "mono",
|
||||
type: "transfer",
|
||||
},
|
||||
{
|
||||
amount: [150, 250],
|
||||
days: [15],
|
||||
description: "Wise → Binance",
|
||||
destination: "usdt",
|
||||
months: "all",
|
||||
piggy: "japan",
|
||||
source: "wise",
|
||||
step: 10,
|
||||
type: "transfer",
|
||||
},
|
||||
{
|
||||
amount: [750, 950],
|
||||
days: [7],
|
||||
description: "ATM withdrawal",
|
||||
destination: "cash",
|
||||
months: "all",
|
||||
source: "pko",
|
||||
step: 50,
|
||||
type: "transfer",
|
||||
},
|
||||
{
|
||||
amount: 110,
|
||||
budget: "Transport",
|
||||
category: "Transport",
|
||||
days: [2],
|
||||
description: "ZTM 30-day ticket",
|
||||
destination: "ztm",
|
||||
months: "all",
|
||||
source: "pko",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: [120, 260],
|
||||
category: "Household",
|
||||
description: "Zooplus — cat food and litter",
|
||||
destination: "zooplus",
|
||||
months: "all",
|
||||
source: "pko",
|
||||
tags: ["moose"],
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: [150, 450],
|
||||
category: "Health",
|
||||
days: [12],
|
||||
description: "Vet — Moose check-up",
|
||||
destination: "vet",
|
||||
months: [2, 6, 10],
|
||||
notes: "vaccines next time",
|
||||
source: "pko",
|
||||
tags: ["moose"],
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: [250, 900],
|
||||
category: "Health",
|
||||
description: [
|
||||
"Dentist — filling",
|
||||
"Dentist — cleaning",
|
||||
"Dentist — check-up",
|
||||
],
|
||||
destination: "dentist",
|
||||
months: [1, 5, 10],
|
||||
source: "pko",
|
||||
step: 10,
|
||||
tags: ["dentist"],
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: [150, 1200],
|
||||
budget: "Everything else",
|
||||
category: "Household",
|
||||
days: [7],
|
||||
description: [
|
||||
"IKEA — shelves and boxes",
|
||||
"IKEA — kitchen stuff",
|
||||
"IKEA — lamp and plants",
|
||||
],
|
||||
destination: "ikea",
|
||||
key: ["ikea", 4],
|
||||
months: [1, 4, 7, 10],
|
||||
source: "credit",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 5000,
|
||||
days: [9],
|
||||
description: "Lent Ivan for the car repair",
|
||||
destination: "ivan",
|
||||
key: ["lendIvan", 1],
|
||||
months: [1],
|
||||
notes: "he'll return 2k every other month",
|
||||
source: "mono",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 2000,
|
||||
days: [4],
|
||||
description: "Ivan paid back",
|
||||
destination: "mono",
|
||||
key: ["ivanPaid", 3],
|
||||
months: [3, 5, 7, 9, 11],
|
||||
source: "ivan",
|
||||
type: "deposit",
|
||||
},
|
||||
{
|
||||
amount: [85, 160],
|
||||
category: "Eating out",
|
||||
description: "Artem paid for dinner",
|
||||
destination: ["hamsa", "sushi"],
|
||||
key: ["artemDinner", 2],
|
||||
months: EVEN,
|
||||
notes: "I owe him, settle up next month",
|
||||
source: "artem",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 200,
|
||||
description: "Paid back Artem",
|
||||
destination: "artem",
|
||||
key: ["payArtem", 3],
|
||||
months: [1, 3, 5, 7, 9],
|
||||
notes: "BLIK",
|
||||
source: "pko",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 1500,
|
||||
days: [6],
|
||||
description: "Paid back Taras",
|
||||
destination: "taras",
|
||||
months: EVEN,
|
||||
source: "mono",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 1500,
|
||||
description: "Oksana paid back",
|
||||
destination: "mono",
|
||||
months: [4, 8, 10],
|
||||
notes: "for the dinners",
|
||||
source: "oksana",
|
||||
type: "deposit",
|
||||
},
|
||||
{
|
||||
amount: 200,
|
||||
days: [17],
|
||||
description: "Lent Dmytro",
|
||||
destination: "dmytro",
|
||||
months: [2],
|
||||
notes: "until his salary",
|
||||
source: "wise",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 500,
|
||||
days: [3],
|
||||
description: "Dmytro paid back",
|
||||
destination: "wise",
|
||||
months: [6],
|
||||
notes: "all settled with Dmytro",
|
||||
source: "dmytro",
|
||||
type: "deposit",
|
||||
},
|
||||
{
|
||||
amount: 240,
|
||||
days: [12],
|
||||
description: "Marta — BLIK for concert tickets",
|
||||
destination: "pko",
|
||||
months: [7],
|
||||
source: "marta",
|
||||
type: "deposit",
|
||||
},
|
||||
{
|
||||
amount: [450, 1600],
|
||||
budget: "Groceries",
|
||||
category: "Groceries",
|
||||
days: [21, 24, 28],
|
||||
description: "Silpo — groceries in Kyiv",
|
||||
destination: "silpo",
|
||||
months: [1],
|
||||
source: "mono",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: [250, 600],
|
||||
category: "Eating out",
|
||||
days: [22, 27],
|
||||
description: "Puzata Hata",
|
||||
destination: "puzata",
|
||||
months: [1],
|
||||
source: "mono",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: [1500, 3500],
|
||||
category: "Gifts",
|
||||
days: [23],
|
||||
description: "Rozetka — gift for parents",
|
||||
destination: "rozetka",
|
||||
months: [1],
|
||||
notes: "air purifier for mom",
|
||||
source: "mono",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 389,
|
||||
category: "Hardware",
|
||||
days: [14],
|
||||
description: "USB-C dock for client work",
|
||||
destination: "xkom",
|
||||
key: ["dock", 3],
|
||||
months: [3],
|
||||
source: "credit",
|
||||
tags: ["reimbursable", "programming/client-b"],
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 89.99,
|
||||
category: "Hardware",
|
||||
days: [9],
|
||||
description: "Bluetooth headphones (returned)",
|
||||
destination: "allegro",
|
||||
key: ["allegroPurchase", 4],
|
||||
months: [4],
|
||||
source: "pko",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 89.99,
|
||||
days: [20],
|
||||
description: "Allegro refund — headphones",
|
||||
destination: "pko",
|
||||
key: ["allegroRefund", 4],
|
||||
months: [4],
|
||||
source: "refunds",
|
||||
type: "deposit",
|
||||
},
|
||||
{
|
||||
amount: 1840,
|
||||
days: [22],
|
||||
description: "PIT refund",
|
||||
destination: "pko",
|
||||
months: [6],
|
||||
notes: "tax return for last year",
|
||||
source: "taxOffice",
|
||||
type: "deposit",
|
||||
},
|
||||
{
|
||||
amount: [120, 250],
|
||||
category: "Hardware",
|
||||
days: [19],
|
||||
description: "Thomann — MIDI controller",
|
||||
destination: "thomann",
|
||||
months: [2],
|
||||
source: "wiseEur",
|
||||
tags: ["music", "music/gear"],
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: [90, 200],
|
||||
category: "Hardware",
|
||||
days: [3],
|
||||
description: "Thomann — cables and stand",
|
||||
destination: "thomann",
|
||||
months: [10],
|
||||
source: "wiseEur",
|
||||
tags: ["music/gear"],
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: [89, 149],
|
||||
category: "Travel",
|
||||
days: [14],
|
||||
description: "PKP Intercity Warszawa–Kraków",
|
||||
destination: "pkp",
|
||||
months: [6],
|
||||
source: "pko",
|
||||
trip: "krakow",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 640,
|
||||
category: "Travel",
|
||||
days: [14],
|
||||
description: "Hotel Stary — 2 nights",
|
||||
destination: "booking",
|
||||
months: [6],
|
||||
notes: "booked via Booking.com, free cancellation",
|
||||
source: "credit",
|
||||
trip: "krakow",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: [89, 149],
|
||||
category: "Travel",
|
||||
days: [16],
|
||||
description: "PKP Intercity Kraków–Warszawa",
|
||||
destination: "pkp",
|
||||
months: [6],
|
||||
notes: "train delayed 40 min",
|
||||
source: "pko",
|
||||
trip: "krakow",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: [25, 140],
|
||||
category: "Eating out",
|
||||
days: [14, 15, 15, 16],
|
||||
description: [
|
||||
"Pierogi on Kazimierz",
|
||||
"Lunch near Wawel",
|
||||
"Coffee on Rynek",
|
||||
"Zapiekanka at Plac Nowy",
|
||||
],
|
||||
destination: ["bistro", "bar", "starbucks"],
|
||||
months: [6],
|
||||
source: "mono",
|
||||
trip: "krakow",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 189,
|
||||
category: "Travel",
|
||||
currency: "EUR",
|
||||
days: [9],
|
||||
description: "Ryanair WAW–LIS",
|
||||
destination: "ryanair",
|
||||
months: [7],
|
||||
source: "credit",
|
||||
trip: "lisbon",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: 900,
|
||||
days: [2],
|
||||
description: "Wise USD → EUR",
|
||||
destination: "wiseEur",
|
||||
months: [9],
|
||||
notes: "for Lisbon",
|
||||
source: "wise",
|
||||
type: "transfer",
|
||||
},
|
||||
{
|
||||
amount: 420,
|
||||
category: "Travel",
|
||||
days: [3],
|
||||
description: "Airbnb Alfama — 5 nights",
|
||||
destination: "airbnb",
|
||||
months: [9],
|
||||
source: "wiseEur",
|
||||
trip: "lisbon",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: [18, 65],
|
||||
category: "Eating out",
|
||||
days: [8, 9, 10, 11, 12],
|
||||
description: [
|
||||
"Pastéis de nata",
|
||||
"Dinner in Bairro Alto",
|
||||
"Seafood at Time Out Market",
|
||||
"Coffee in Alfama",
|
||||
"Bifana",
|
||||
],
|
||||
destination: ["bistro", "starbucks", "sushi"],
|
||||
months: [9],
|
||||
source: "wiseEur",
|
||||
trip: "lisbon",
|
||||
type: "withdrawal",
|
||||
},
|
||||
{
|
||||
amount: [8, 20],
|
||||
category: "Travel",
|
||||
days: [8, 13],
|
||||
description: "Uber in Lisbon",
|
||||
destination: "uber",
|
||||
months: [9],
|
||||
source: "wiseEur",
|
||||
trip: "lisbon",
|
||||
type: "withdrawal",
|
||||
},
|
||||
];
|
||||
|
||||
export interface SharedDinner {
|
||||
budget?: string;
|
||||
friend: string;
|
||||
months: readonly number[];
|
||||
place: Place;
|
||||
ratio: readonly [number, number];
|
||||
share: string;
|
||||
source: string;
|
||||
title: string;
|
||||
total: readonly [number, number];
|
||||
}
|
||||
|
||||
export const sharedDinners: SharedDinner[] = [
|
||||
{
|
||||
budget: "Eating out",
|
||||
friend: "oksana",
|
||||
months: ODD,
|
||||
place: "hamsa",
|
||||
ratio: [0.4, 0.5],
|
||||
share: "Oksana's share",
|
||||
source: "mono",
|
||||
title: "Dinner at Hamsa",
|
||||
total: [160, 320],
|
||||
},
|
||||
{
|
||||
friend: "marta",
|
||||
months: [2, 6, 10],
|
||||
place: "sushi",
|
||||
ratio: [0.5, 0.5],
|
||||
share: "Marta's half",
|
||||
source: "pko",
|
||||
title: "Sushi with Marta",
|
||||
total: [120, 240],
|
||||
},
|
||||
];
|
||||
Reference in new issue
Block a user