Partner formal data model
Purpose¶
This document formalizes the Partner data model required by the internal workflow and partnership contract used by Portugal Odyssey.
Goals: - Ensure all data required to fulfill the partnership contract is captured. - Separate data by logical aggregations. - Clearly distinguish partner-managed vs platform/admin-managed data. - Add fields helpful for operations, workflows, verification, and notifications.
Ownership conventions¶
- Partner-managed: data the partner can create/update.
- Admin-managed: data only the platform can create/update.
- Mutually agreed / locked: fields that become immutable after both parties consent/sign (changes require new contract/version).
A) Partner basic profile (Partner-managed)¶
Required for onboarding and general identification.
- Identifiers
id(UUID, system)short_name(string, 3–5 uppercase) (immutable, used as tenant slug)- Display / marketing
name(string, required)legal_name(string)website(url)description(text)industry(string)business_type(string)- Primary contact
email(string, required)phone(string)contact_person_name(string)- Addresses
business_address(Address)
B) Legal & compliance (Partner-managed + Admin-verified)¶
Covers contract parties + licensure + insurance + banking/invoicing.
B1) Legal identification (Partner-managed)¶
company_name(string, required)tax_id/ NIF (string, required)registration_number(string)legal_address(Address)
B2) Representative (Partner-managed)¶
Required by contract header.
- legal_representative.name (string, required)
- legal_representative.role (string, required)
- legal_representative.document_file_key (file key, optional)
B3) Banking & invoicing (Partner-managed)¶
Required by payments/invoicing clause.
- banking.iban (string, recommended)
- banking.bank_name (string)
- banking.beneficiary_name (string)
- billing.email (string)
- billing.vat_number (string)
- billing.invoice_requirements (text/json)
B4) Licenses, certifications, insurance (Partner-managed)¶
Required by contract clauses 3 and 9 + workflow pre-qualification.
Stored as a list of records:
- type (enum) e.g. RNAAT, AL_REGISTRATION, LIABILITY_INSURANCE, PERSONAL_ACCIDENT, OTHER
- number (string)
- issuer (string)
- valid_from / valid_to (date)
- coverage (text/json)
- document_file_key (file key)
B5) Admin verification (Admin-managed)¶
Per document/licence/insurance record:
- verification.status (enum PENDING|VERIFIED|REJECTED)
- verification.reviewed_by (admin user id)
- verification.reviewed_at (timestamp)
- verification.reason (text)
C) Operational contacts & channels (Partner-managed)¶
Required by workflow section 3.1.
contacts.reservations(name/email/phone)contacts.finance(name/email/phone)contacts.emergency(name/phone)public_links:instagram,facebook,tripadvisor,booking,google_maps,other[]
D) Service catalog / Annex I (Partner-managed + Admin-approved/locked)¶
Services already exist in partner_services and should be standardized to support contract annex snapshots.
Per service (Partner-managed fields):
- name, short_description, description
- parameters:
- type_category (tour/accommodation/transport/etc)
- location (address + geo)
- schedule (days/times)
- duration (minutes/hours)
- languages[]
- capacity.min, capacity.max
- included[], not_included[]
- customer_requirements[]
- safety.measures[]
- sustainability.practices[] + free text
Admin-managed fields:
- status, type (service taxonomy), approval_required, approved_by, approved_at, admin_notes
Locked after mutual consent (examples): - price currency, core pricing terms, location (if contractually fixed)
E) Financial model / Annex II (Admin-managed + mutually agreed)¶
Required by contract clause 5 and workflow negotiation.
Partner-level defaults (Admin-managed):
- commercial.model (enum NET_RATE|COMMISSION)
- commercial.who_charges_customer (enum PLATFORM|PARTNER)
- commercial.commission_percent (number, when COMMISSION)
- payments.schedule:
- frequency (enum WEEKLY|MONTHLY|AFTER_SERVICE)
- due_days (int)
- currency (ISO)
- pricing_fairness.mfn (boolean: partner must not offer worse conditions to PO than other intermediaries)
Service-level overrides (mutually agreed):
- net_price, rrp, discount_policies, cancellation_fees
F) Operational conditions & SLAs (Mutually agreed)¶
Required by contract clauses 6–7.
sla.confirm_within_hours(int)sla.min_booking_lead_time_hours(int)sla.min_free_cancel_lead_time_hours(int)sla.punctuality_tolerance_minutes(int)sla.overbooking_rules(text/json)
G) Contract management (Admin-created + Partner-consented)¶
Required by contract section and workflow steps 5.1–5.2.
Contract (Admin-managed):
- status (enum DRAFT|SENT|SIGNED|ACTIVE|SUSPENDED|TERMINATED|EXPIRED)
- effective_from, effective_to
- initial_term_months
- auto_renew (bool) + renewal_term_months
- notice_period_days
- confidentiality_years
- forum (string)
Signature (mutually agreed):
- partner_signed_at, partner_signed_by_user_id
- signed_document_file_key
Annex snapshots: - Annex I: list of service ids + per-service snapshot - Annex II: commercial terms snapshot - Annex III: cancellation policy set snapshot
Versioning:
- immutable contract_versions snapshots for audit.
H) KPIs / performance (Admin-managed; mostly derived)¶
Required by workflow section 8.
kpi.avg_ratingkpi.complaints_countkpi.partner_caused_cancellationskpi.punctuality_incidentskpi.revenue_volumekpi.last_reviewed_at
I) Tasks & notifications (System/Admin-generated)¶
Required to drive actionable UI notifications with deep links.
Task:
- assignee_type (PARTNER|ADMIN)
- assignee_partner_id (when partner)
- type (COMPLETE_PROFILE|UPLOAD_DOC|VERIFY_DOC|SIGN_CONTRACT|REVIEW_SERVICE_PROPOSAL|...)
- status (OPEN|COMPLETED|DISMISSED)
- priority, due_at
- title, description
- link (route for deep-link in partner-console/admin-console)
- metadata (json)
Notes¶
- File storage is via
file-service; partner-service stores onlyfile_key+ metadata. short_nameis the canonical tenant slug; it should be immutable once set.