/** * Bundled demo dataset — the local starting contents of every collection. * * These records are plain frontend constants. They are copied into the local * store the first time a collection is read (see store.js) and from then on the * user's own creates/edits take over, persisted in localStorage. * * Field names follow the app's data model (src/api/local/schemas.json), so the * existing pages render this data with no changes. Any entity not listed here * simply starts empty, which is the empty state the UI already handles. * * Dates are computed relative to today so "upcoming", "this week" and overdue * filters stay meaningful however long after this file was written the app runs. */ const DAY_MS = 24 * 60 * 60 * 1000; const today = new Date(); /** ISO calendar date (YYYY-MM-DD) `offset` days from today. */ const day = (offset) => new Date(today.getTime() + offset * DAY_MS).toISOString().slice(0, 10); /* ------------------------------------------------------------ organisations */ const enterprises = [ { id: 'ent-compass', enterprise_name: 'Compass Group North America', enterprise_code: 'CGNA', enterprise_number: 'ENT-0001', primary_contact_name: 'Dana Whitfield', primary_contact_email: 'dana.whitfield@example.com', headquarters_address: '2400 Yorkmont Rd, Charlotte, NC 28217', brand_family: ['Bon Appétit', 'Eurest', 'Chartwells'], is_active: true, }, { id: 'ent-legendary', enterprise_name: 'Legendary Hospitality Group', enterprise_code: 'LHG', enterprise_number: 'ENT-0002', primary_contact_name: 'Marcus Reed', primary_contact_email: 'marcus.reed@example.com', headquarters_address: '55 Mission St, San Francisco, CA 94105', brand_family: ['Legendary Events'], is_active: true, }, ]; const sectors = [ { id: 'sec-ba-west', sector_name: 'Bon Appétit — West', sector_code: 'BA-WEST', sector_number: 'SEC-1001', sector_type: 'Food Service', region: 'West', region_code: 'W', division: 'Corporate Dining', division_code: 'CD', district: 'Bay Area', district_code: 'BA', account_manager: 'Priya Raman', account_manager_department: 'Operations', parent_enterprise_id: 'ent-compass', parent_enterprise_name: 'Compass Group North America', main_contact_city: 'San Francisco', main_contact_state: 'CA', approved_vendors: ['ven-legendary', 'ven-goldengate'], is_active: true, }, { id: 'sec-eurest-campus', sector_name: 'Eurest — Campus Services', sector_code: 'EU-CAMP', sector_number: 'SEC-1002', sector_type: 'Education', region: 'West', region_code: 'W', division: 'Campus Dining', division_code: 'CMP', district: 'Northern California', district_code: 'NC', account_manager: 'Alan Ruiz', account_manager_department: 'Operations', parent_enterprise_id: 'ent-compass', parent_enterprise_name: 'Compass Group North America', main_contact_city: 'Palo Alto', main_contact_state: 'CA', approved_vendors: ['ven-legendary'], is_active: true, }, ]; const partners = [ { id: 'prt-northbay', partner_name: 'Northbay Tech Campus', partner_number: 'PRT-2001', partner_type: 'Corporate', sector_id: 'sec-ba-west', sector_name: 'Bon Appétit — West', primary_contact_name: 'Erin Castillo', primary_contact_email: 'erin.castillo@example.com', primary_contact_phone: '(415) 555-0142', billing_address: '1 Northbay Way, San Francisco, CA 94107', payment_terms: 'Net 30', cost_centers: ['CC-1010', 'CC-1020'], allowed_vendors: ['ven-legendary', 'ven-goldengate'], is_active: true, sites: [ { site_name: 'Northbay HQ — Main Café', address: '1 Northbay Way', city: 'San Francisco', state: 'CA', zip_code: '94107', site_manager: 'Tom Delgado', site_manager_email: 'tom.delgado@example.com', }, ], }, { id: 'prt-stanford-dining', partner_name: 'Peninsula University Dining', partner_number: 'PRT-2002', partner_type: 'Education', sector_id: 'sec-eurest-campus', sector_name: 'Eurest — Campus Services', primary_contact_name: 'Grace Lin', primary_contact_email: 'grace.lin@example.com', primary_contact_phone: '(650) 555-0188', billing_address: '450 Campus Dr, Palo Alto, CA 94305', payment_terms: 'Net 45', cost_centers: ['CC-3300'], allowed_vendors: ['ven-legendary'], is_active: true, sites: [ { site_name: 'Peninsula Commons', address: '450 Campus Dr', city: 'Palo Alto', state: 'CA', zip_code: '94305', site_manager: 'Nina Ortiz', site_manager_email: 'nina.ortiz@example.com', }, ], }, { id: 'prt-bayview-arena', partner_name: 'Bayview Arena', partner_number: 'PRT-2003', partner_type: 'Sports & Entertainment', sector_id: 'sec-ba-west', sector_name: 'Bon Appétit — West', primary_contact_name: 'Devon Marsh', primary_contact_email: 'devon.marsh@example.com', primary_contact_phone: '(510) 555-0119', billing_address: '900 Harbor Blvd, Oakland, CA 94607', payment_terms: 'Net 15', cost_centers: ['CC-9001'], allowed_vendors: ['ven-goldengate', 'ven-summit'], is_active: true, sites: [], }, ]; const sites = [ { id: 'site-northbay-main', site_name: 'Northbay HQ — Main Café', partner_id: 'prt-northbay', partner_name: 'Northbay Tech Campus', address: '1 Northbay Way', city: 'San Francisco', state: 'CA', zip_code: '94107', site_manager: 'Tom Delgado', site_manager_email: 'tom.delgado@example.com', site_manager_phone: '(415) 555-0143', is_active: true, }, { id: 'site-northbay-annex', site_name: 'Northbay Annex — Conference Center', partner_id: 'prt-northbay', partner_name: 'Northbay Tech Campus', address: '18 Brannan St', city: 'San Francisco', state: 'CA', zip_code: '94107', site_manager: 'Alicia Gomez', site_manager_email: 'alicia.gomez@example.com', site_manager_phone: '(415) 555-0166', is_active: true, }, { id: 'site-peninsula-commons', site_name: 'Peninsula Commons', partner_id: 'prt-stanford-dining', partner_name: 'Peninsula University Dining', address: '450 Campus Dr', city: 'Palo Alto', state: 'CA', zip_code: '94305', site_manager: 'Nina Ortiz', site_manager_email: 'nina.ortiz@example.com', site_manager_phone: '(650) 555-0190', is_active: true, }, { id: 'site-bayview-arena', site_name: 'Bayview Arena — Club Level', partner_id: 'prt-bayview-arena', partner_name: 'Bayview Arena', address: '900 Harbor Blvd', city: 'Oakland', state: 'CA', zip_code: '94607', site_manager: 'Devon Marsh', site_manager_email: 'devon.marsh@example.com', site_manager_phone: '(510) 555-0120', is_active: true, }, ]; const businesses = [ { id: 'biz-northbay', business_name: 'Northbay Tech Campus', contact_name: 'Erin Castillo', email: 'erin.castillo@example.com', phone: '(415) 555-0142', rate_group: 'Enterprise', sector: 'Bon Appétit', area: 'Bay Area', address: '1 Northbay Way', city: 'San Francisco', status: 'Active', is_active: true, po_required: true, total_hubs: 2, total_members: 6, active_members: 5, last_order_date: day(-3), hub_building: 'Northbay HQ', hubs: [ { hub_name: 'Northbay HQ', address: '1 Northbay Way', city: 'San Francisco', state: 'CA', zip_code: '94107', manager_name: 'Tom Delgado', manager_email: 'tom.delgado@example.com', is_active: true, }, { hub_name: 'Northbay Annex', address: '18 Brannan St', city: 'San Francisco', state: 'CA', zip_code: '94107', manager_name: 'Alicia Gomez', manager_email: 'alicia.gomez@example.com', is_active: true, }, ], }, { id: 'biz-peninsula', business_name: 'Peninsula University Dining', contact_name: 'Grace Lin', email: 'grace.lin@example.com', phone: '(650) 555-0188', rate_group: 'Standard', sector: 'Eurest', area: 'Northern California', address: '450 Campus Dr', city: 'Palo Alto', status: 'Active', is_active: true, po_required: false, total_hubs: 1, total_members: 4, active_members: 4, last_order_date: day(-9), hub_building: 'Peninsula Commons', hubs: [ { hub_name: 'Peninsula Commons', address: '450 Campus Dr', city: 'Palo Alto', state: 'CA', zip_code: '94305', manager_name: 'Nina Ortiz', manager_email: 'nina.ortiz@example.com', is_active: true, }, ], }, { id: 'biz-bayview', business_name: 'Bayview Arena', contact_name: 'Devon Marsh', email: 'devon.marsh@example.com', phone: '(510) 555-0119', rate_group: 'Premium', sector: 'Other', area: 'Bay Area', address: '900 Harbor Blvd', city: 'Oakland', status: 'Active', is_active: true, po_required: true, total_hubs: 1, total_members: 3, active_members: 3, last_order_date: day(-1), hub_building: 'Bayview Arena', hubs: [ { hub_name: 'Bayview Arena', address: '900 Harbor Blvd', city: 'Oakland', state: 'CA', zip_code: '94607', manager_name: 'Devon Marsh', manager_email: 'devon.marsh@example.com', is_active: true, }, ], }, ]; const vendors = [ { id: 'ven-legendary', legal_name: 'Legendary Event Staffing LLC', doing_business_as: 'Legendary Staffing', vendor_number: 'VEN-4001', primary_contact_name: 'Sasha Kim', primary_contact_email: 'sasha.kim@example.com', primary_contact_phone: '(415) 555-0201', business_type: 'LLC', approval_status: 'approved', approved_by: 'procurement@krow.local', approved_date: day(-120), region: 'Bay Area', state: 'CA', city: 'San Francisco', service_address: '340 Bryant St, San Francisco, CA 94107', billing_address: '340 Bryant St, San Francisco, CA 94107', service_specialty: 'Corporate dining and events', platform_type: 'Building platform (KROW)', coverage_regions: ['Bay Area', 'Northern California'], eligible_roles: ['Server', 'Bartender', 'Prep Cook', 'Dishwasher', 'Event Captain'], vendor_fee_percentage: 18, workforce_count: 240, insurance_expiry: day(210), tax_id: '**-***4412', is_active: true, }, { id: 'ven-goldengate', legal_name: 'Golden Gate Hospitality Partners Inc.', doing_business_as: 'GG Hospitality', vendor_number: 'VEN-4002', primary_contact_name: 'Ray Nolan', primary_contact_email: 'ray.nolan@example.com', primary_contact_phone: '(510) 555-0233', business_type: 'Corporation', approval_status: 'approved', approved_by: 'procurement@krow.local', approved_date: day(-260), region: 'Bay Area', state: 'CA', city: 'Oakland', service_address: '1200 Broadway, Oakland, CA 94612', billing_address: '1200 Broadway, Oakland, CA 94612', service_specialty: 'Arena concessions and high-volume service', platform_type: 'Partial Tech', coverage_regions: ['Bay Area'], eligible_roles: ['Concessions Attendant', 'Bartender', 'Cashier', 'Supervisor'], vendor_fee_percentage: 21, workforce_count: 410, insurance_expiry: day(48), tax_id: '**-***9087', is_active: true, }, { id: 'ven-summit', legal_name: 'Summit Workforce Solutions LLC', doing_business_as: 'Summit Workforce', vendor_number: 'VEN-4003', primary_contact_name: 'Elena Petrov', primary_contact_email: 'elena.petrov@example.com', primary_contact_phone: '(408) 555-0277', business_type: 'LLC', approval_status: 'pending', region: 'Northern California', state: 'CA', city: 'San Jose', service_address: '99 Almaden Blvd, San Jose, CA 95113', service_specialty: 'Facilities and janitorial', platform_type: 'Traditional', coverage_regions: ['Northern California', 'Central Valley'], eligible_roles: ['Janitor', 'Facilities Tech', 'Porter'], vendor_fee_percentage: 16, workforce_count: 85, insurance_expiry: day(-12), tax_id: '**-***2233', is_active: true, }, ]; /* -------------------------------------------------------------------- people */ const STAFF_SEED = [ ['stf-001', 'Marcus Johnson', 'Event Captain', 'Legendary Staffing', 'ven-legendary', 34, 4.9, 98, 'Skilled', 'Full Time', 'Northbay HQ'], ['stf-002', 'Amara Osei', 'Bartender', 'Legendary Staffing', 'ven-legendary', 29, 4.8, 96, 'Skilled', 'Part Time', 'Northbay HQ'], ['stf-003', 'Diego Fernandez', 'Server', 'Legendary Staffing', 'ven-legendary', 24, 4.6, 92, 'Cross-Trained', 'On call', 'Northbay Annex'], ['stf-004', 'Priya Raman', 'Prep Cook', 'Legendary Staffing', 'ven-legendary', 26, 4.7, 94, 'Skilled', 'Full Time', 'Peninsula Commons'], ['stf-005', 'Kelsey Moore', 'Server', 'Legendary Staffing', 'ven-legendary', 23, 4.4, 88, 'Beginner', 'Weekends', 'Peninsula Commons'], ['stf-006', 'Tobias Lang', 'Dishwasher', 'Legendary Staffing', 'ven-legendary', 21, 4.2, 85, 'Beginner', 'Part Time', 'Peninsula Commons'], ['stf-007', 'Nia Bennett', 'Concessions Attendant', 'GG Hospitality', 'ven-goldengate', 22, 4.5, 90, 'Cross-Trained', 'Weekends', 'Bayview Arena'], ['stf-008', 'Hugo Ramirez', 'Bartender', 'GG Hospitality', 'ven-goldengate', 28, 4.7, 93, 'Skilled', 'On call', 'Bayview Arena'], ['stf-009', 'Sofia Duarte', 'Supervisor', 'GG Hospitality', 'ven-goldengate', 33, 4.8, 97, 'Skilled', 'Full Time', 'Bayview Arena'], ['stf-010', 'Ethan Clarke', 'Cashier', 'GG Hospitality', 'ven-goldengate', 20, 4.1, 82, 'Beginner', 'Seasonal', 'Bayview Arena'], ['stf-011', 'Leila Haddad', 'Facilities Tech', 'Summit Workforce', 'ven-summit', 25, 4.5, 91, 'Skilled', 'Full Time', 'Northbay HQ'], ['stf-012', 'Owen Bradley', 'Porter', 'Summit Workforce', 'ven-summit', 19, 4.0, 79, 'Beginner', 'Part Time', 'Northbay Annex'], ]; const staff = STAFF_SEED.map( ( [id, name, position, vendorName, vendorId, rate, rating, reliability, profileType, employment, hub], index ) => ({ id, employee_name: name, initial: name .split(' ') .map((part) => part[0]) .join(''), email: `${name.toLowerCase().replace(/[^a-z]+/g, '.')}@example.com`, phone: `(415) 555-0${(300 + index).toString().padStart(3, '0')}`, contact_number: `(415) 555-0${(300 + index).toString().padStart(3, '0')}`, position, department: position === 'Facilities Tech' || position === 'Porter' ? 'Logistics' : 'Operations', vendor_id: vendorId, vendor_name: vendorName, hub_location: hub, city: hub.startsWith('Bayview') ? 'Oakland' : hub.startsWith('Peninsula') ? 'Palo Alto' : 'San Francisco', pay_rate: rate, pay_rate_type: 'Hourly', pay_rate_overtime: Math.round(rate * 1.5 * 100) / 100, pay_rate_double_time: rate * 2, rating, reliability_score: reliability, shift_coverage_percentage: reliability, profile_type: profileType, employment_type: employment, english: 'Fluent', background_check_status: 'cleared', background_check_date: day(-90 - index * 3), total_shifts: 40 + index * 7, no_show_count: index % 5 === 0 ? 1 : 0, cancellation_count: index % 4 === 0 ? 1 : 0, certifications: position === 'Bartender' ? [{ name: 'RBS Alcohol Server', issuer: 'CA ABC', issued_date: day(-200), expiry_date: day(160) }] : position === 'Prep Cook' ? [{ name: 'ServSafe Food Handler', issuer: 'NRA', issued_date: day(-320), expiry_date: day(40) }] : [], }) ); const workerAvailability = staff.slice(0, 8).map((member, index) => ({ id: `wav-${member.id}`, staff_id: member.id, staff_name: member.employee_name, availability_status: index % 3 === 0 ? 'CONFIRMED_AVAILABLE' : index % 3 === 1 ? 'UNKNOWN' : 'BLOCKED', available_dates: [day(1), day(2), day(4), day(6)], blocked_dates: index % 3 === 2 ? [day(3), day(5)] : [], last_shift_date: day(-(index + 1)), days_since_last_shift: index + 1, desired_hours_this_period: 32, scheduled_hours_this_period: 12 + index * 2, total_shifts_this_period: 2 + (index % 4), utilization_percentage: Math.min(100, 40 + index * 6), acceptance_rate: 78 + index, need_work_index: Math.max(0, 80 - index * 6), predicted_availability_score: Math.max(20, 92 - index * 5), })); /* -------------------------------------------------------------------- orders */ /** Roles on a shift, with the derived money fields the UI reads. */ const role = (name, count, start, end, costPerHour, assigned = 0) => { const [sh, sm] = start.split(':').map(Number); const [eh, em] = end.split(':').map(Number); const hours = Math.max(0, eh + em / 60 - (sh + sm / 60)); return { role: name, count, assigned, department: 'Operations', start_time: start, end_time: end, hours, break_minutes: hours > 6 ? 30 : 0, cost_per_hour: costPerHour, total_value: Math.round(hours * count * costPerHour * 100) / 100, uniform: 'Black tie, white shirt', }; }; const shiftTotal = (shifts) => shifts.reduce( (sum, shift) => sum + (shift.roles || []).reduce((roleSum, r) => roleSum + (r.total_value || 0), 0), 0 ); const requestedTotal = (shifts) => shifts.reduce( (sum, shift) => sum + (shift.roles || []).reduce((roleSum, r) => roleSum + (r.count || 0), 0), 0 ); function order({ id, name, date, status, business, businessId, hub, location, address, vendorId, vendorName, clientName, clientEmail, shifts, assigned = [], isRapid = false, notes, po, }) { return { id, event_name: name, date, status, business_id: businessId, business_name: business, hub, event_location: location, client_name: clientName, client_email: clientEmail, client_phone: '(415) 555-0142', vendor_id: vendorId, vendor_name: vendorName, contract_type: 'W2', is_rapid: isRapid, is_recurring: false, is_multi_day: false, conflict_detection_enabled: true, buffer_time_before: 30, buffer_time_after: 30, po_reference: po, notes, requested: requestedTotal(shifts), total: shiftTotal(shifts), shifts: shifts.map((shift) => ({ location, location_address: address, ...shift })), assigned_staff: assigned, }; } const staffRef = (id, roleName) => { const member = staff.find((s) => s.id === id); return { staff_id: id, staff_name: member?.employee_name || 'Unknown', email: member?.email, role: roleName || member?.position, }; }; const events = [ order({ id: 'evt-1000', name: 'Daily Café Service — Lunch Peak', date: day(0), status: 'Active', business: 'Northbay Tech Campus', businessId: 'biz-northbay', hub: 'Northbay HQ', location: 'Northbay HQ — Main Café', address: '1 Northbay Way, San Francisco, CA 94107', vendorId: 'ven-legendary', vendorName: 'Legendary Staffing', clientName: 'Erin Castillo', clientEmail: 'erin.castillo@example.com', po: 'PO-77160', notes: 'Running today. Standing lunch coverage for the main café.', shifts: [ { shift_name: 'Lunch', shift_contact: 'Tom Delgado', roles: [role('Server', 3, '10:30', '15:00', 32, 3), role('Prep Cook', 1, '08:00', '15:00', 34, 1), role('Dishwasher', 1, '10:00', '15:30', 28, 1)], }, ], assigned: [ staffRef('stf-003', 'Server'), staffRef('stf-005', 'Server'), staffRef('stf-002', 'Server'), staffRef('stf-004', 'Prep Cook'), staffRef('stf-006', 'Dishwasher'), ], }), order({ id: 'evt-1001', name: 'Q3 All-Hands Reception', date: day(2), status: 'Partial Staffed', business: 'Northbay Tech Campus', businessId: 'biz-northbay', hub: 'Northbay HQ', location: 'Northbay HQ — Main Café', address: '1 Northbay Way, San Francisco, CA 94107', vendorId: 'ven-legendary', vendorName: 'Legendary Staffing', clientName: 'Erin Castillo', clientEmail: 'erin.castillo@example.com', po: 'PO-77120', notes: 'Passed appetizers plus two bars. Client requests same captain as last quarter.', shifts: [ { shift_name: 'Evening Reception', shift_contact: 'Tom Delgado', roles: [role('Event Captain', 1, '15:00', '22:00', 46, 1), role('Server', 6, '16:00', '22:00', 32, 2), role('Bartender', 2, '16:00', '22:00', 38, 1)], }, ], assigned: [staffRef('stf-001', 'Event Captain'), staffRef('stf-003', 'Server'), staffRef('stf-005', 'Server'), staffRef('stf-002', 'Bartender')], }), order({ id: 'evt-1002', name: 'Board Dinner — Executive Floor', date: day(5), status: 'Fully Staffed', business: 'Northbay Tech Campus', businessId: 'biz-northbay', hub: 'Northbay Annex', location: 'Northbay Annex — Conference Center', address: '18 Brannan St, San Francisco, CA 94107', vendorId: 'ven-legendary', vendorName: 'Legendary Staffing', clientName: 'Alicia Gomez', clientEmail: 'alicia.gomez@example.com', po: 'PO-77145', notes: 'Plated four-course service for 24 guests.', shifts: [ { shift_name: 'Dinner Service', shift_contact: 'Alicia Gomez', roles: [role('Server', 3, '16:30', '21:30', 32, 3), role('Prep Cook', 1, '14:00', '21:00', 30, 1)], }, ], assigned: [staffRef('stf-003', 'Server'), staffRef('stf-005', 'Server'), staffRef('stf-006', 'Server'), staffRef('stf-004', 'Prep Cook')], }), order({ id: 'evt-1003', name: 'Season Opener — Club Level Concessions', date: day(1), status: 'Partial Staffed', business: 'Bayview Arena', businessId: 'biz-bayview', hub: 'Bayview Arena', location: 'Bayview Arena — Club Level', address: '900 Harbor Blvd, Oakland, CA 94607', vendorId: 'ven-goldengate', vendorName: 'GG Hospitality', clientName: 'Devon Marsh', clientEmail: 'devon.marsh@example.com', po: 'PO-90014', isRapid: true, notes: 'Doors at 17:30. Two additional attendants still needed for the upper concourse.', shifts: [ { shift_name: 'Gates + Game', shift_contact: 'Sofia Duarte', roles: [role('Supervisor', 1, '15:00', '23:00', 44, 1), role('Concessions Attendant', 8, '16:00', '23:00', 26, 2), role('Bartender', 3, '16:00', '23:00', 36, 1)], }, ], assigned: [staffRef('stf-009', 'Supervisor'), staffRef('stf-007', 'Concessions Attendant'), staffRef('stf-010', 'Concessions Attendant'), staffRef('stf-008', 'Bartender')], }), order({ id: 'evt-1004', name: 'Freshman Move-In Dining Surge', date: day(9), status: 'Pending', business: 'Peninsula University Dining', businessId: 'biz-peninsula', hub: 'Peninsula Commons', location: 'Peninsula Commons', address: '450 Campus Dr, Palo Alto, CA 94305', vendorId: 'ven-legendary', vendorName: 'Legendary Staffing', clientName: 'Grace Lin', clientEmail: 'grace.lin@example.com', notes: 'Three meal periods across the day. Awaiting final headcount from the university.', shifts: [ { shift_name: 'Breakfast + Lunch', shift_contact: 'Nina Ortiz', roles: [role('Server', 5, '06:30', '14:30', 28), role('Dishwasher', 2, '07:00', '15:00', 24)], }, { shift_name: 'Dinner', shift_contact: 'Nina Ortiz', roles: [role('Server', 4, '15:30', '21:30', 28), role('Prep Cook', 2, '14:00', '21:00', 30)], }, ], }), order({ id: 'evt-1005', name: 'Vendor Fair — Facilities Support', date: day(14), status: 'Draft', business: 'Northbay Tech Campus', businessId: 'biz-northbay', hub: 'Northbay HQ', location: 'Northbay HQ — Main Café', address: '1 Northbay Way, San Francisco, CA 94107', vendorId: 'ven-summit', vendorName: 'Summit Workforce', clientName: 'Erin Castillo', clientEmail: 'erin.castillo@example.com', notes: 'Draft — pending budget approval.', shifts: [ { shift_name: 'Setup + Teardown', shift_contact: 'Leila Haddad', roles: [role('Facilities Tech', 2, '07:00', '15:00', 27), role('Porter', 3, '08:00', '16:00', 22)], }, ], }), order({ id: 'evt-1006', name: 'Investor Breakfast Briefing', date: day(-2), status: 'Completed', business: 'Northbay Tech Campus', businessId: 'biz-northbay', hub: 'Northbay Annex', location: 'Northbay Annex — Conference Center', address: '18 Brannan St, San Francisco, CA 94107', vendorId: 'ven-legendary', vendorName: 'Legendary Staffing', clientName: 'Alicia Gomez', clientEmail: 'alicia.gomez@example.com', po: 'PO-77098', shifts: [ { shift_name: 'Morning Service', shift_contact: 'Alicia Gomez', roles: [role('Server', 2, '06:00', '11:00', 32, 2), role('Event Captain', 1, '05:30', '11:00', 46, 1)], }, ], assigned: [staffRef('stf-003', 'Server'), staffRef('stf-005', 'Server'), staffRef('stf-001', 'Event Captain')], }), order({ id: 'evt-1007', name: 'Playoff Night — Premium Bars', date: day(-6), status: 'Completed', business: 'Bayview Arena', businessId: 'biz-bayview', hub: 'Bayview Arena', location: 'Bayview Arena — Club Level', address: '900 Harbor Blvd, Oakland, CA 94607', vendorId: 'ven-goldengate', vendorName: 'GG Hospitality', clientName: 'Devon Marsh', clientEmail: 'devon.marsh@example.com', po: 'PO-89977', shifts: [ { shift_name: 'Game Night', shift_contact: 'Sofia Duarte', roles: [role('Bartender', 4, '16:00', '23:30', 36, 4), role('Cashier', 2, '16:00', '23:30', 24, 2)], }, ], assigned: [staffRef('stf-008', 'Bartender'), staffRef('stf-002', 'Bartender'), staffRef('stf-007', 'Bartender'), staffRef('stf-009', 'Bartender'), staffRef('stf-010', 'Cashier')], }), order({ id: 'evt-1008', name: 'Holiday Party (Canceled)', date: day(-15), status: 'Canceled', business: 'Peninsula University Dining', businessId: 'biz-peninsula', hub: 'Peninsula Commons', location: 'Peninsula Commons', address: '450 Campus Dr, Palo Alto, CA 94305', vendorId: 'ven-legendary', vendorName: 'Legendary Staffing', clientName: 'Grace Lin', clientEmail: 'grace.lin@example.com', notes: 'Canceled by client — venue conflict.', shifts: [ { shift_name: 'Evening', shift_contact: 'Nina Ortiz', roles: [role('Server', 6, '17:00', '23:00', 30)], }, ], }), ]; const assignments = [ { id: 'asg-001', assignment_number: 'ASG-5001', order_id: 'evt-1001', order_number: 'evt-1001', workforce_id: 'stf-001', workforce_name: 'Marcus Johnson', vendor_id: 'ven-legendary', vendor_name: 'Legendary Staffing', partner_id: 'prt-northbay', role: 'Event Captain', department: 'Operations', assignment_status: 'Confirmed', scheduled_start: `${day(2)}T15:00:00`, scheduled_end: `${day(2)}T22:00:00`, pay_rate: 34, bill_rate: 46, total_pay: 238, total_bill: 322, }, { id: 'asg-002', assignment_number: 'ASG-5002', order_id: 'evt-1003', order_number: 'evt-1003', workforce_id: 'stf-009', workforce_name: 'Sofia Duarte', vendor_id: 'ven-goldengate', vendor_name: 'GG Hospitality', partner_id: 'prt-bayview-arena', role: 'Supervisor', department: 'Operations', assignment_status: 'Checked In', scheduled_start: `${day(1)}T15:00:00`, scheduled_end: `${day(1)}T23:00:00`, pay_rate: 33, bill_rate: 44, total_pay: 264, total_bill: 352, }, { id: 'asg-003', assignment_number: 'ASG-5003', order_id: 'evt-1006', order_number: 'evt-1006', workforce_id: 'stf-003', workforce_name: 'Diego Fernandez', vendor_id: 'ven-legendary', vendor_name: 'Legendary Staffing', partner_id: 'prt-northbay', role: 'Server', department: 'Operations', assignment_status: 'Completed', scheduled_start: `${day(-2)}T06:00:00`, scheduled_end: `${day(-2)}T11:00:00`, actual_start: `${day(-2)}T05:55:00`, actual_end: `${day(-2)}T11:10:00`, pay_rate: 24, bill_rate: 32, total_pay: 126, total_bill: 168, }, ]; /* ------------------------------------------------------------------- finance */ const invoices = [ { id: 'inv-001', invoice_number: 'INV-2401', business_name: 'Northbay Tech Campus', event_id: 'evt-1006', event_name: 'Investor Breakfast Briefing', event_date: day(-2), hub: 'Northbay Annex', vendor_id: 'ven-legendary', vendor_name: 'Legendary Staffing', manager_name: 'Alicia Gomez', status: 'Pending Review', issue_date: day(-1), due_date: day(29), subtotal: 573, tax_rate: 8.5, tax_amount: 48.71, other_charges: 0, amount: 621.71, po_reference: 'PO-77098', cost_center: 'CC-1010', is_auto_generated: true, roles: [ { role_name: 'Server', role_subtotal: 320, staff_entries: [ { staff_name: 'Diego Fernandez', hours: 5, rate: 32, subtotal: 160 }, { staff_name: 'Kelsey Moore', hours: 5, rate: 32, subtotal: 160 }, ], }, { role_name: 'Event Captain', role_subtotal: 253, staff_entries: [{ staff_name: 'Marcus Johnson', hours: 5.5, rate: 46, subtotal: 253 }], }, ], }, { id: 'inv-002', invoice_number: 'INV-2402', business_name: 'Bayview Arena', event_id: 'evt-1007', event_name: 'Playoff Night — Premium Bars', event_date: day(-6), hub: 'Bayview Arena', vendor_id: 'ven-goldengate', vendor_name: 'GG Hospitality', manager_name: 'Devon Marsh', status: 'Approved', issue_date: day(-5), due_date: day(10), subtotal: 1440, tax_rate: 8.5, tax_amount: 122.4, other_charges: 0, amount: 1562.4, po_reference: 'PO-89977', cost_center: 'CC-9001', approved_by: 'procurement@krow.local', approved_date: day(-3), roles: [ { role_name: 'Bartender', role_subtotal: 1080, staff_entries: [ { staff_name: 'Hugo Ramirez', hours: 7.5, rate: 36, subtotal: 270 }, { staff_name: 'Amara Osei', hours: 7.5, rate: 36, subtotal: 270 }, { staff_name: 'Nia Bennett', hours: 7.5, rate: 36, subtotal: 270 }, { staff_name: 'Sofia Duarte', hours: 7.5, rate: 36, subtotal: 270 }, ], }, { role_name: 'Cashier', role_subtotal: 360, staff_entries: [{ staff_name: 'Ethan Clarke', hours: 15, rate: 24, subtotal: 360 }], }, ], }, { id: 'inv-003', invoice_number: 'INV-2398', business_name: 'Peninsula University Dining', event_name: 'Summer Session Dining', event_date: day(-40), hub: 'Peninsula Commons', vendor_id: 'ven-legendary', vendor_name: 'Legendary Staffing', manager_name: 'Nina Ortiz', status: 'Paid', issue_date: day(-38), due_date: day(-8), paid_date: day(-11), payment_method: 'ACH', payment_reference: 'ACH-55210', subtotal: 2260, tax_rate: 8.5, tax_amount: 192.1, amount: 2452.1, cost_center: 'CC-3300', }, { id: 'inv-004', invoice_number: 'INV-2390', business_name: 'Northbay Tech Campus', event_name: 'Summer Offsite Catering', event_date: day(-62), hub: 'Northbay HQ', vendor_id: 'ven-legendary', vendor_name: 'Legendary Staffing', manager_name: 'Tom Delgado', status: 'Overdue', issue_date: day(-58), due_date: day(-28), subtotal: 1875, tax_rate: 8.5, tax_amount: 159.38, amount: 2034.38, cost_center: 'CC-1020', notes: 'Second reminder sent to accounts payable.', }, { id: 'inv-005', invoice_number: 'INV-2405', business_name: 'Bayview Arena', event_name: 'Concert Series — Night 2', event_date: day(-9), hub: 'Bayview Arena', vendor_id: 'ven-goldengate', vendor_name: 'GG Hospitality', manager_name: 'Devon Marsh', status: 'Disputed', issue_date: day(-7), due_date: day(8), subtotal: 3120, tax_rate: 8.5, tax_amount: 265.2, amount: 3385.2, dispute_reason: 'Hours mismatch', dispute_details: 'Client reports two attendants left before the end of the shift.', disputed_by: 'devon.marsh@example.com', disputed_date: day(-4), cost_center: 'CC-9001', }, ]; const saleRecords = invoices.slice(0, 3).map((invoice, index) => ({ id: `sale-00${index + 1}`, invoice_id: invoice.id, invoice_number: invoice.invoice_number, client_name: invoice.business_name, event_name: invoice.event_name, event_date: invoice.event_date, vendor_id: invoice.vendor_id, vendor_name: invoice.vendor_name, gross_amount: invoice.amount, vendor_fee_percentage: 18, vendor_fee_amount: Math.round(invoice.amount * 0.18 * 100) / 100, net_amount: Math.round(invoice.amount * 0.82 * 100) / 100, amount_paid: invoice.status === 'Paid' ? invoice.amount : 0, balance_due: invoice.status === 'Paid' ? 0 : invoice.amount, payment_status: invoice.status === 'Paid' ? 'Paid' : 'Unpaid', payment_history: invoice.status === 'Paid' ? [{ payment_date: invoice.paid_date, amount: invoice.amount, method: 'ACH', reference: 'ACH-55210', recorded_by: 'finance@krow.local' }] : [], })); const payrollRecords = [ { id: 'pay-001', pay_period_start: day(-14), pay_period_end: day(-1), vendor_id: 'ven-legendary', vendor_name: 'Legendary Staffing', payroll_status: 'Approved', total_regular_pay: 8420, total_overtime_pay: 640, total_gross_pay: 9060, entries: staff.slice(0, 4).map((member) => ({ staff_id: member.id, employee_name: member.employee_name, email: member.email, regular_hours: 64, overtime_hours: 4, overtime_rate: member.pay_rate_overtime, double_time_hours: 0, gross_pay: Math.round((64 * member.pay_rate + 4 * member.pay_rate_overtime) * 100) / 100, status: 'approved', })), }, { id: 'pay-002', pay_period_start: day(-28), pay_period_end: day(-15), vendor_id: 'ven-goldengate', vendor_name: 'GG Hospitality', payroll_status: 'Paid', total_regular_pay: 7150, total_overtime_pay: 410, total_gross_pay: 7560, entries: staff.slice(6, 10).map((member) => ({ staff_id: member.id, employee_name: member.employee_name, email: member.email, regular_hours: 58, overtime_hours: 2, overtime_rate: member.pay_rate_overtime, double_time_hours: 0, gross_pay: Math.round((58 * member.pay_rate + 2 * member.pay_rate_overtime) * 100) / 100, status: 'approved', })), }, ]; const RATE_SEED = [ ['Server', 'Event Staff', 24, 32], ['Bartender', 'Bartending', 29, 38], ['Event Captain', 'Management', 34, 46], ['Prep Cook', 'Kitchen and Culinary', 26, 34], ['Dishwasher', 'Kitchen and Culinary', 21, 28], ['Concessions Attendant', 'Concessions', 22, 29], ]; const vendorRates = RATE_SEED.map(([roleName, category, wage, clientRate], index) => ({ id: `rate-00${index + 1}`, vendor_id: 'ven-legendary', vendor_name: 'Legendary Staffing', rate_book_name: 'Bay Area Standard 2025', rate_book_type: 'default', category, role_name: roleName, region: 'Bay Area', shift_type: 'regular', employee_wage: wage, client_rate: clientRate, overtime_rate: Math.round(clientRate * 1.5 * 100) / 100, double_time_rate: clientRate * 2, markup_percentage: Math.round(((clientRate - wage) / wage) * 1000) / 10, vendor_fee_percentage: 18, minimum_wage_compliance: true, is_active: true, is_approved_rate: true, approved_by_procurement: 'procurement@krow.local', approved_date: day(-60), valid_from: day(-60), valid_until: day(300), negotiation_allowed: true, is_editable_by_vendor: false, })); /* --------------------------------------------------------- teams and tasks */ const teams = [ { id: 'team-ops-west', team_name: 'Bay Area Operations', owner_id: 'local-user', owner_name: 'KROW Operator', owner_role: 'admin', full_name: 'KROW Operator', email: 'operator@krow.local', phone: '(415) 555-0100', city: 'San Francisco', zip_code: '94107', departments: ['Operations', 'Scheduling'], total_members: 3, active_members: 3, total_hubs: 2, }, { id: 'team-arena', team_name: 'Arena Event Crew', owner_id: 'local-user', owner_name: 'KROW Operator', owner_role: 'admin', full_name: 'KROW Operator', email: 'operator@krow.local', city: 'Oakland', zip_code: '94607', departments: ['Concessions'], total_members: 2, active_members: 2, total_hubs: 1, }, ]; const teamMembers = [ { id: 'tm-001', team_id: 'team-ops-west', member_name: 'Tom Delgado', email: 'tom.delgado@example.com', role: 'manager', title: 'Site Manager', department: 'Operations', hub: 'Northbay HQ', is_active: true }, { id: 'tm-002', team_id: 'team-ops-west', member_name: 'Alicia Gomez', email: 'alicia.gomez@example.com', role: 'manager', title: 'Conference Services Lead', department: 'Operations', hub: 'Northbay Annex', is_active: true }, { id: 'tm-003', team_id: 'team-ops-west', member_name: 'Priya Raman', email: 'priya.raman@example.com', role: 'member', title: 'Scheduler', department: 'Scheduling', hub: 'Northbay HQ', is_active: true }, { id: 'tm-004', team_id: 'team-arena', member_name: 'Sofia Duarte', email: 'sofia.duarte@example.com', role: 'manager', title: 'Floor Supervisor', department: 'Concessions', hub: 'Bayview Arena', is_active: true }, { id: 'tm-005', team_id: 'team-arena', member_name: 'Devon Marsh', email: 'devon.marsh@example.com', role: 'admin', title: 'Venue Director', department: 'Concessions', hub: 'Bayview Arena', is_active: true }, ]; const TASK_SEED = [ ['task-001', 'Confirm final headcount for Move-In surge', 'team-ops-west', 'in_progress', 'high', 2, 60, ['tm-003']], ['task-002', 'Fill 2 open concessions slots for Season Opener', 'team-arena', 'in_progress', 'high', 1, 40, ['tm-004']], ['task-003', 'Collect updated COI from Summit Workforce', 'team-ops-west', 'pending', 'high', 3, 0, ['tm-001']], ['task-004', 'Resolve INV-2405 hours dispute', 'team-arena', 'on_hold', 'normal', 4, 25, ['tm-005']], ['task-005', 'Approve Legendary payroll for last period', 'team-ops-west', 'completed', 'normal', -1, 100, ['tm-002']], ['task-006', 'Refresh Bay Area rate book for Q4', 'team-ops-west', 'pending', 'low', 12, 0, ['tm-003']], ]; const tasks = TASK_SEED.map(([id, name, teamId, status, priority, dueOffset, progress, memberIds], index) => ({ id, task_name: name, team_id: teamId, status, priority, progress, order_index: index, due_date: day(dueOffset), owner_id: 'local-user', owner_name: 'KROW Operator', description: '', comment_count: index % 3, attachment_count: 0, assigned_members: memberIds.map((memberId) => { const member = teamMembers.find((m) => m.id === memberId); return { member_id: memberId, member_name: member?.member_name || 'Member', avatar_url: '' }; }), })); /* --------------------------------------------------------------- activity */ const announcements = [ { id: 'ann-001', team_id: 'team-ops-west', title: 'New uniform standard starts next month', body: 'All front-of-house staff move to the black-tie standard on the 1st. Vendors: please confirm inventory by the end of this week.', audience: ['Operations', 'Scheduling'], status: 'active', priority: 'normal', publish_date: day(-2), expire_date: day(20), created_by_name: 'KROW Operator', pin_to_top: true, view_count: 34, }, { id: 'ann-002', team_id: 'team-arena', title: 'Season Opener — call time moved to 15:00', body: 'Gates open 30 minutes earlier than planned. Supervisors, please brief your sections at 15:15.', audience: ['Concessions'], status: 'active', priority: 'urgent', publish_date: day(-1), expire_date: day(2), created_by_name: 'Sofia Duarte', pin_to_top: false, view_count: 12, }, ]; const activityLog = [ { id: 'act-001', title: 'Order partially staffed', description: 'Q3 All-Hands Reception is 4 of 9 filled.', activity_type: 'staff_assigned', user_id: 'local-user', related_entity_type: 'event', related_entity_id: 'evt-1001', icon_type: 'user', icon_color: 'blue', is_read: false, action_label: 'View order', action_link: '/Events', }, { id: 'act-002', title: 'Invoice disputed', description: 'Bayview Arena disputed INV-2405 (hours mismatch).', activity_type: 'invoice_created', user_id: 'local-user', related_entity_type: 'invoice', related_entity_id: 'inv-005', icon_type: 'alert', icon_color: 'red', is_read: false, action_label: 'Review invoice', action_link: '/Invoices', }, { id: 'act-003', title: 'RAPID order created', description: 'Season Opener — Club Level Concessions needs 12 staff tomorrow.', activity_type: 'event_created', user_id: 'local-user', related_entity_type: 'event', related_entity_id: 'evt-1003', icon_type: 'calendar', icon_color: 'yellow', is_read: false, action_label: 'Open order', action_link: '/Events', }, { id: 'act-004', title: 'Invoice paid', description: 'INV-2398 was paid by Peninsula University Dining.', activity_type: 'invoice_paid', user_id: 'local-user', related_entity_type: 'invoice', related_entity_id: 'inv-003', icon_type: 'invoice', icon_color: 'green', is_read: true, }, { id: 'act-005', title: 'Order completed', description: 'Investor Breakfast Briefing closed out with full coverage.', activity_type: 'event_updated', user_id: 'local-user', related_entity_type: 'event', related_entity_id: 'evt-1006', icon_type: 'check', icon_color: 'green', is_read: true, }, ]; /** * Teammates for the User Management page. The local operator (see local/auth.js) * is added to this collection on first load and is always row one. */ const users = [ { id: 'usr-client-erin', full_name: 'Erin Castillo', email: 'erin.castillo@example.com', role: 'user', user_role: 'client', company_name: 'Northbay Tech Campus', phone: '(415) 555-0142', is_active: true, }, { id: 'usr-vendor-sasha', full_name: 'Sasha Kim', email: 'sasha.kim@example.com', role: 'user', user_role: 'vendor', company_name: 'Legendary Staffing', phone: '(415) 555-0201', vendor_id: 'ven-legendary', is_active: true, }, ]; /* ------------------------------------------------------------------ exports */ export const seedData = { User: users, Enterprise: enterprises, Sector: sectors, Partner: partners, Site: sites, Business: businesses, Vendor: vendors, Staff: staff, WorkerAvailability: workerAvailability, Event: events, Assignment: assignments, Invoice: invoices, SaleRecord: saleRecords, PayrollRecord: payrollRecords, VendorRate: vendorRates, Team: teams, TeamMember: teamMembers, Task: tasks, Announcement: announcements, ActivityLog: activityLog, }; export default seedData;