Skip to content

Felles Kundetabell

Denne siden beskriver anbefalt og delvis implementert struktur for felles kunderegister i golfbilappen.

Formål

Kunderegisteret skal være felles på tvers av tenants, men fortsatt støtte lokale klubbfordeler. En kunde skal kunne booke i flere klubber med samme identitet, mens rabatt, klippekort, års-/månedskort og legeattest kan være lokal per klubb.

Dagens Firestore collection heter:

members

Logisk bør den behandles som:

customers

Et senere rename eller alias kan vurderes, men dagens kode bruker members.

Dokument-ID

Stabil ID bygges i prioritert rekkefølge:

Prioritet Felt Dokument-ID
1 GolfBox-ID / kunde-/medlemsnummer golfbox-{normalisertId}
2 E-post email-{normalisertEpost}
3 Telefon phone-{telefonKunSiffer}

Eksempler:

golfbox-073-1234567
email-kunde-eksempel-no
phone-4790000000

Kjernefelt

type Customer = {
  name: string;
  renterName: string;
  memberName: string;

  email: string;
  phone: string;

  golfboxId: string;
  memberNumber: string;
  membershipNumber: string;

  isMember: boolean;
  status: "active" | "inactive" | "suspended";

  source: "booking" | "member" | "import" | "admin";

  clubId: string;
  clubIds: string[];
  lastBookingClubId: string;
  lastBookingDate: string;

  hasDoctorsNote: boolean;
  lastHasDoctorsNote: boolean;

  createdAt: Timestamp;
  updatedAt: Timestamp;
};

Tenant-Felter

Lokale fordeler skal ligge per klubb-ID:

type CustomerLocalBenefits = {
  localBenefits: {
    [clubId: string]: {
      lastHasDoctorsNote?: boolean;
      updatedAt?: Timestamp;
      pass?: {
        type: "none" | "clipCard" | "monthly" | "yearly";
        status: "active" | "paused" | "expired";
        validFrom?: string;
        validUntil?: string;
        totalClips?: number;
        remainingClips?: number;
        includedHoles?: number[];
        lastUsedAt?: Timestamp;
        lastBookingId?: string;
        updatedAt?: Timestamp;
      };
    };
  };
};

Viktige Regler

  • GolfBox-ID er nasjonal kundeidentifikator, ikke tenant-sperre.
  • clubId er siste eller primær klubbkontekst.
  • clubIds er alle klubber kunden er observert eller administrert i.
  • localBenefits.{clubId} styrer lokale fordeler for den klubben.
  • Legeattest skal lagres som pris-/fordelsgrunnlag, ikke som tilgangsstyring.
  • Medlemsnummer/GolfBox-ID skal ikke endres av proShop eller kunden selv uten tydelig kontrollflyt.

Bookinghistorikk

Bookinghistorikk ligger fortsatt i:

bookings
rentals

Kunderegisteret skal ikke duplisere hele bookinghistorikken permanent. UI kan bygge kundens historikk ved å slå opp booking/rental-data på:

  • golfboxId
  • membershipNumber
  • memberNumber
  • email
  • phone

Skriving Fra Booking

Når createBooking oppretter en kundebooking, skriver backend:

  • bookings/{bookingId}
  • rentals/{bookingId}
  • members/{customerDocId}

Backend bruker { merge: true } på kundekortet. Det betyr at ny booking oppdaterer kontaktdata, siste bookinginfo, legeatteststatus og klubbtilknytning uten å slette eksisterende lokale fordeler.

Anbefalt Neste Datasteg

  1. Definer customers som logisk domenenavn i dokumentasjon og kodekommentarer.
  2. Behold fysisk collection members inntil migrering er planlagt.
  3. Lag en backfill-jobb som normaliserer eksisterende rental-kunder inn i stabile kundedokumenter.
  4. Legg inn tydelig konfliktstrategi når samme e-post og GolfBox-ID peker på ulike personer.
  5. Legg indekser for clubIds, email, membershipNumber og phone etter faktisk query-mønster.