Firebase Data Model — RBA Dev Team Portal v1.0.0

Build Docs · Gold

Firebase Data Model

Complete Firebase database schemas for both projects — the RBAMGR case management system and the RBA Dev Team Portal. Field-level documentation with types and example values.

Overview

The RBA system uses two completely separate Firebase Realtime Database projects. They share no data and operate independently. Each uses the compat SDK (v9.23.0) via CDN script tags — never Firestore, never npm/ESM imports.

Project
Firebase ID
Database URL
RBAMGR
rba-mgr
https://rba-mgr-default-rtdb.firebaseio.com
Dev Team Portal
rba-dev-team-portal
https://rba-dev-team-portal-default-rtdb.firebaseio.com

Type Legend

String  ·  Boolean  ·  Number  ·  Object  ·  Array  ·  Auto-assigned

Project 1 — RBAMGR Case Management

rba-mgr

Top-Level Structure

rba-mgr-default-rtdb/ ├── arbitrators/ │ └── [arbitratorId]/ ← string key, arbitrator's unique ID │ ├── profile/ │ ├── settings/ │ └── cases/ ├── counters/ │ └── [arbitratorId]/ │ └── [year] ← e.g., "2026": 17 └── resources/ └── [arbitratorId]/ └── [resourceId]/

arbitrators / [id] / profile

Field
Type
Example
Notes
name
String
"John Gann"
Arbitrator's full name
email
String
"john@rbamgr.com"
phone
String
"817-939-9645"

arbitrators / [id] / settings / fieldToggles

One boolean per toggleable intake field. Read by C3 Case Intake Form on load — hidden fields are suppressed and not saved to the case record.

Field
Type
Example
Notes
cadArbNumber
Boolean
true
Show/hide CAD Arb Number field
notificationDate
Boolean
false
acceptanceDate
Boolean
true
arbOrderReceived
Boolean
true
ownershipType
Boolean
true
appealValueType
Boolean
true
appealReasons
Boolean
true
taxAgentFields
Boolean
true
Tax agent email + phone together

arbitrators / [id] / cases / [caseId]

Case ID format: case_[timestamp]_[random] — generated at intake. Never changes once created.

meta/

Field
Type
Example
Notes
fileNumber
Auto
"2026-001"
YYYY-###, resets Jan 1 each year
arbitrationNumber
String
"RBAE-019443"
Assigned by Comp
appraisalDistrictArbNumber
String
"CAD-2026-55"
Optional, toggleable
status
String
"Hearing Scheduled"
Current workflow status
statusHistory
Array
[{status, timestamp}]
Auto-appended on every status change
createdAt
Auto
1714000000000
Unix timestamp (ms)
lastModified
Auto
1714005000000
Updated on every save

property/

Field
Type
Example
Notes
taxAccountNumber
String
"R-123456-001"
address
String
"123 Main St, Austin TX"
county
String
"Travis"
One of 254 TX counties
taxYear
String
"2025"
ownershipType
String
"Individual"
"Individual" | "Corporation"
propertyType
String
"Residential"
"Residential" | "Commercial" | "Land"
residenceHomestead
Boolean
true
Affects fee schedule tier
appealValueType
String
"Market Value"
"Market Value" | "Unequal Appraisal"

parties/

Node
Type
Example
Notes
propertyOwner
Object
{name, email, phone}
Required
taxAgent
Object
{name, email, phone}
Optional, toggleable
taxDistrict
Object
{name, email, phone}
Required
assistants
Array
[{name, email, phone}]
Unlimited — added in Case Detail

financials/

Field
Type
Example
Notes
depositAmount
String
"450.00"
Manual entry — as communicated by Comp
arbitratorFee
String
"400.00"
Manual entry — actual fee per Comp
partyResponsibleForFee
String
"Filer's Deposit"
"Filer's Deposit" | "Appraisal District"
refundRecipientPayment
String
"50.00"
Manual entry
amountReceivable
String
"400.00"
Manual entry
paymentReceivedFrom
String
"Comptroller"
"Comptroller" | "Appraisal District"
paymentReceivedDate
String
"2026-03-15"
Triggers Payment Received status (5.10)

counters / [arbitratorId] / [year]

A single integer per year, incremented atomically on each case save to generate the next File Number. Seeded at 0 manually before first use.

counters/ └── arb_abc123/ ├── 2026: 17 ← next case will be 2026-018 └── 2025: 43

resources / [arbitratorId] / [resourceId]

Field
Type
Example
Notes
title
String
"Dismissal Procedures"
body
String
"When a case is dismissed..."
Free-text, arbitrator-editable
category
String
"workflow"
Optional grouping tag

Project 2 — Dev Team Portal

rba-dev-team-portal

Top-Level Structure

rba-dev-team-portal-default-rtdb/ ├── volunteers/ │ └── [uid]/ ← Firebase Auth UID (auto-assigned on first login) │ ├── profile/ │ ├── tier/ │ ├── compensation/ │ └── submissions/ ├── assignments/ │ └── [assignmentId]/ ← key: "assign_" + timestamp └── admin/ └── invites/ └── [inviteCode]/ ← key: random 8-char code

volunteers / [uid] / profile

Field
Type
Example
Notes
name
String
"Jane Smith"
From registration form
email
String
"jane@example.com"
Must match Firebase Auth email
joinedAt
Auto
1714000000000
Set on first login (invite redeemed)
invitedBy
String
"john@rbamgr.com"
Admin email that generated the invite

volunteers / [uid] / tier

Field
Type
Example
Notes
level
String
"silver"
"bronze" | "silver" | "gold"
assignedAt
Auto
1714001000000
Timestamp of last tier assignment
assignedBy
String
"admin_uid_xxx"
UID of admin who set the tier

volunteers / [uid] / compensation

Field
Type
Example
Notes
type
String
"coupon"
"coupon" | "lifetime"
couponCode
String
"RBA-BETA-2026"
Populated for Bronze and Silver
lifetimeFree
Boolean
true
Set manually for Gold volunteers
notes
String
"Promoted April 2026"
Admin notes, optional

volunteers / [uid] / submissions / [submissionId]

Field
Type
Example
Notes
type
String
"bug"
"feedback" | "bug"
component
String
"Case Intake Form"
Which feature/form
severity
String
"high"
"critical" | "high" | "medium" | "low"
content
Object
{steps, expected, actual}
Bug: steps/expected/actual. Feedback: structured form fields.
submittedAt
Auto
1714002000000
Unix timestamp (ms)

assignments / [assignmentId]

Field
Type
Example
Notes
title
String
"Review Case Intake Form"
description
String
"Test all 29 fields..."
component
String
"rba-intake-v2.0.html"
Which feature to review
assignedTo
Array
["uid1", "uid2"]
Array of volunteer UIDs
dueDate
String
"2026-05-15"
ISO date string
status
String
"active"
"active" | "closed"
createdAt
Auto
1714003000000

admin / invites / [inviteCode]

Field
Type
Example
Notes
email
String
"jane@example.com"
Must match the invited volunteer's email
tier
String
"bronze"
Starting tier on first login
createdAt
Auto
1714003500000
used
Boolean
false
Set true on first login; prevents re-use

Node Relationships

In the Portal project, assignments[].assignedTo contains volunteer UIDs. When a volunteer loads their assignments page, the system reads all assignments where assignedTo includes their UID. When they submit feedback or a bug report, it writes to volunteers/[uid]/submissions/ . Security rules ensure volunteers can only write to their own node.