Implement stores and refills, improve testing
This commit is contained in:
parent
9f416903ef
commit
5536acd67d
137 changed files with 21218 additions and 221 deletions
129
docs/design/src/data.jsx
Normal file
129
docs/design/src/data.jsx
Normal file
|
|
@ -0,0 +1,129 @@
|
|||
// Mock data for MeshiTrack. Grounded in the real household ("Red Panda Den"),
|
||||
// extended with plausible timestamps, quantities, purchases and price history.
|
||||
|
||||
const MEDICINES = [
|
||||
{ id: 'semaglutide', name: 'Semaglutide', strength: '14 mg', form: 'Tablet', category: 'Prescription', color: 1, notes: 'Weekly GLP-1. Store at room temp.' },
|
||||
{ id: 'estradiol', name: 'Estradiol Valerate', strength: '10 mg', form: 'Injection', category: 'Prescription', color: 4, notes: 'Intramuscular, weekly.' },
|
||||
{ id: 'spironolactone', name: 'Spironolactone', strength: '100 mg', form: 'Tablet', category: 'Prescription', color: 3 },
|
||||
{ id: 'tadalafil', name: 'Tadalafil', strength: '5 mg', form: 'Tablet', category: 'Prescription', color: 3 },
|
||||
{ id: 'dutasteride', name: 'Dutasteride', strength: '0.5 mg', form: 'Tablet', category: 'Prescription', color: 3 },
|
||||
{ id: 'progesterone', name: 'Progesterone', strength: '200 mg', form: 'Capsule', category: 'Prescription', color: 4 },
|
||||
{ id: 'magnesium', name: 'Magnesium', strength: '400 mg', form: 'Capsule', category: 'Supplement', color: 5 },
|
||||
{ id: 'vitamin-d', name: 'Vitamin D', strength: '2000 IU', form: 'Capsule', category: 'Supplement', color: 2 },
|
||||
{ id: 'vitamin-a', name: 'Vitamin A', strength: '5000 IU', form: 'Capsule', category: 'Supplement', color: 2 },
|
||||
];
|
||||
|
||||
const MED = Object.fromEntries(MEDICINES.map(m => [m.id, m]));
|
||||
|
||||
// Cabinet inventory — summed across item lots
|
||||
const CABINET = [
|
||||
{ medId: 'dutasteride', qty: 80, unit: 'tablets', lots: 1, daysPerUnit: 1, perDose: 1, expiry: '2027-08-12', lowAt: 14 },
|
||||
{ medId: 'estradiol', qty: 2, unit: 'vials', lots: 1, daysPerUnit: 14, perDose: 0.5, expiry: '2026-11-30', lowAt: 1 },
|
||||
{ medId: 'magnesium', qty: 115, unit: 'capsules', lots: 1, daysPerUnit: 1, perDose: 1, expiry: '2028-02-01', lowAt: 20 },
|
||||
{ medId: 'progesterone', qty: 35, unit: 'capsules', lots: 1, daysPerUnit: 1, perDose: 1, expiry: '2027-04-30', lowAt: 14 },
|
||||
{ medId: 'semaglutide', qty: 26, unit: 'tablets', lots: 1, daysPerUnit: 1, perDose: 1, expiry: '2026-09-15', lowAt: 7 },
|
||||
{ medId: 'spironolactone', qty: 62, unit: 'tablets', lots: 1, daysPerUnit: 1, perDose: 2, expiry: '2027-01-20', lowAt: 14 },
|
||||
{ medId: 'tadalafil', qty: 7, unit: 'tablets', lots: 1, daysPerUnit: 1, perDose: 1, expiry: '2026-12-01', lowAt: 7 },
|
||||
{ medId: 'vitamin-a', qty: 211, unit: 'capsules', lots: 1, daysPerUnit: 1, perDose: 1, expiry: '2028-05-05', lowAt: 30 },
|
||||
{ medId: 'vitamin-d', qty: 96, unit: 'capsules', lots: 1, daysPerUnit: 1, perDose: 1, expiry: '2028-03-10', lowAt: 30 },
|
||||
];
|
||||
|
||||
// Daily schedule regimens
|
||||
const REGIMENS = [
|
||||
{
|
||||
id: 'morning', name: 'Morning Pills', time: '08:00', freq: 'daily', active: true,
|
||||
items: [
|
||||
{ medId: 'semaglutide', qty: 1, unit: 'tablet' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'evening', name: 'Evening Pills', time: '21:00', freq: 'daily', active: true,
|
||||
items: [
|
||||
{ medId: 'spironolactone', qty: 1, unit: 'tablet' },
|
||||
{ medId: 'tadalafil', qty: 1, unit: 'tablet' },
|
||||
{ medId: 'dutasteride', qty: 1, unit: 'tablet' },
|
||||
{ medId: 'progesterone', qty: 1, unit: 'capsule' },
|
||||
{ medId: 'vitamin-a', qty: 1, unit: 'capsule' },
|
||||
{ medId: 'magnesium', qty: 1, unit: 'capsule' },
|
||||
{ medId: 'vitamin-d', qty: 1, unit: 'capsule' },
|
||||
],
|
||||
},
|
||||
{
|
||||
id: 'injections', name: 'Injections', time: 'Sun 10:00', freq: 'weekly', active: true,
|
||||
items: [
|
||||
{ medId: 'estradiol', qty: 0.5, unit: 'vial' },
|
||||
],
|
||||
},
|
||||
];
|
||||
|
||||
// Today's intake — some done, some upcoming
|
||||
const TODAY_INTAKE = [
|
||||
{ id: 't1', regimen: 'morning', medId: 'semaglutide', qty: 1, scheduled: '08:00', status: 'taken', takenAt: '08:12' },
|
||||
{ id: 't2', regimen: 'evening', medId: 'spironolactone', qty: 1, scheduled: '21:00', status: 'upcoming' },
|
||||
{ id: 't3', regimen: 'evening', medId: 'tadalafil', qty: 1, scheduled: '21:00', status: 'upcoming' },
|
||||
{ id: 't4', regimen: 'evening', medId: 'dutasteride', qty: 1, scheduled: '21:00', status: 'upcoming' },
|
||||
{ id: 't5', regimen: 'evening', medId: 'progesterone', qty: 1, scheduled: '21:00', status: 'upcoming' },
|
||||
{ id: 't6', regimen: 'evening', medId: 'vitamin-a', qty: 1, scheduled: '21:00', status: 'upcoming' },
|
||||
{ id: 't7', regimen: 'evening', medId: 'magnesium', qty: 1, scheduled: '21:00', status: 'upcoming' },
|
||||
{ id: 't8', regimen: 'evening', medId: 'vitamin-d', qty: 1, scheduled: '21:00', status: 'upcoming' },
|
||||
];
|
||||
|
||||
// Stores
|
||||
const STORES = [
|
||||
{ id: 'osakado', name: 'Osakado', url: 'osakado.clinic', tags: ['pharmacy', 'online'], currency: 'JPY', active: true },
|
||||
{ id: 'inhouse', name: 'In-House Pharmacy', url: 'local', tags: ['pharmacy'], currency: 'JPY', active: true },
|
||||
{ id: 'amazon-jp', name: 'Amazon JP', url: 'amazon.co.jp', tags: ['online', 'bulk'], currency: 'JPY', active: true },
|
||||
{ id: 'matsumoto', name: 'Matsumoto Kiyoshi', url: 'matsukiyo.co.jp', tags: ['pharmacy', 'grocery'], currency: 'JPY', active: true },
|
||||
];
|
||||
|
||||
// Prices — multiple stores per med where it makes sense
|
||||
const PRICES = [
|
||||
{ medId: 'semaglutide', store: 'osakado', price: 24862, pkg: 30, unit: 'tablet', date: '2026-03-29' },
|
||||
{ medId: 'semaglutide', store: 'inhouse', price: 31200, pkg: 30, unit: 'tablet', date: '2026-02-10' },
|
||||
{ medId: 'tadalafil', store: 'osakado', price: 4537, pkg: 30, unit: 'tablet', date: '2026-04-02' },
|
||||
{ medId: 'tadalafil', store: 'amazon-jp', price: 5180, pkg: 30, unit: 'tablet', date: '2026-03-15' },
|
||||
{ medId: 'spironolactone', store: 'osakado', price: 2190, pkg: 100, unit: 'tablet', date: '2026-03-01' },
|
||||
{ medId: 'dutasteride', store: 'osakado', price: 3860, pkg: 30, unit: 'tablet', date: '2026-03-20' },
|
||||
{ medId: 'estradiol', store: 'osakado', price: 9800, pkg: 5, unit: 'vial', date: '2026-02-28' },
|
||||
{ medId: 'progesterone', store: 'osakado', price: 2980, pkg: 30, unit: 'capsule', date: '2026-03-05' },
|
||||
{ medId: 'magnesium', store: 'amazon-jp', price: 1480, pkg: 120, unit: 'capsule', date: '2026-01-22' },
|
||||
{ medId: 'magnesium', store: 'matsumoto', price: 1680, pkg: 120, unit: 'capsule', date: '2026-02-14' },
|
||||
{ medId: 'vitamin-d', store: 'amazon-jp', price: 890, pkg: 100, unit: 'capsule', date: '2026-02-10' },
|
||||
{ medId: 'vitamin-a', store: 'amazon-jp', price: 1240, pkg: 250, unit: 'capsule', date: '2026-01-08' },
|
||||
];
|
||||
|
||||
// Purchases
|
||||
const PURCHASES = [
|
||||
{ id: 'p1', store: 'osakado', date: '2026-04-02', status: 'pending', items: [{ medId: 'tadalafil', qty: 28, unit: 'tablet', price: 4537 }] },
|
||||
{ id: 'p2', store: 'osakado', date: '2026-04-02', status: 'received', items: [{ medId: 'semaglutide', qty: 30, unit: 'tablet', price: 24862 }] },
|
||||
{ id: 'p3', store: 'amazon-jp', date: '2026-03-22', status: 'received', items: [{ medId: 'magnesium', qty: 120, unit: 'capsule', price: 1480 }, { medId: 'vitamin-d', qty: 100, unit: 'capsule', price: 890 }] },
|
||||
{ id: 'p4', store: 'osakado', date: '2026-03-20', status: 'received', items: [{ medId: 'dutasteride', qty: 30, unit: 'tablet', price: 3860 }, { medId: 'spironolactone', qty: 100, unit: 'tablet', price: 2190 }] },
|
||||
{ id: 'p5', store: 'osakado', date: '2026-02-28', status: 'received', items: [{ medId: 'estradiol', qty: 5, unit: 'vial', price: 9800 }] },
|
||||
];
|
||||
|
||||
// Cabinet activity events (consumed / adjusted / added)
|
||||
const ACTIVITY = [
|
||||
{ id: 'a1', type: 'consumed', medId: 'vitamin-d', delta: -7, before: 103, after: 96, at: '2026-04-03 08:52' },
|
||||
{ id: 'a2', type: 'consumed', medId: 'magnesium', delta: -7, before: 122, after: 115, at: '2026-04-03 08:52' },
|
||||
{ id: 'a3', type: 'adjusted', medId: 'estradiol', delta: -1, before: 3, after: 2, at: '2026-04-03 08:57' },
|
||||
{ id: 'a4', type: 'consumed', medId: 'vitamin-a', delta: -7, before: 218, after: 211, at: '2026-04-03 08:52' },
|
||||
{ id: 'a5', type: 'consumed', medId: 'spironolactone', delta: -14, before: 76, after: 62, at: '2026-04-03 08:52' },
|
||||
{ id: 'a6', type: 'added', medId: 'tadalafil', delta: +30, before: -23, after: 7, at: '2026-04-02 14:10', ref: 'Purchase p2' },
|
||||
{ id: 'a7', type: 'consumed', medId: 'semaglutide', delta: -1, before: 27, after: 26, at: '2026-04-01 08:15' },
|
||||
{ id: 'a8', type: 'consumed', medId: 'progesterone', delta: -1, before: 36, after: 35, at: '2026-04-03 21:04' },
|
||||
];
|
||||
|
||||
// Monthly spending (last 6 months), JPY
|
||||
const SPENDING = [
|
||||
{ month: '2025-11', amount: 28400 },
|
||||
{ month: '2025-12', amount: 41200 },
|
||||
{ month: '2026-01', amount: 19600 },
|
||||
{ month: '2026-02', amount: 38480 },
|
||||
{ month: '2026-03', amount: 35780 },
|
||||
{ month: '2026-04', amount: 9937 },
|
||||
];
|
||||
|
||||
window.MESHI = {
|
||||
MEDICINES, MED, CABINET, REGIMENS, TODAY_INTAKE,
|
||||
STORES, PRICES, PURCHASES, ACTIVITY, SPENDING,
|
||||
};
|
||||
Loading…
Add table
Add a link
Reference in a new issue