# Features — filmspace (Everyspace)

Evidence date: 2026-10-15. Source: `git@bitbucket.org:overdrive/filmspace.git`, `main` at `f19c1dc` (2024-11-14).

Status words used here:

- **Current** — present and wired on `main` at `f19c1dc`.
- **Documented only** — named in the README or a design note, and the behaviour was not found as a finished flow.
- **Commented out** — the code is in git and does not run.
- **Data snapshot** — stored in a dump or settings file, not executed as a feature by itself.

Git history is two commits on 2024-11-14. Nothing older was removed in a later commit that this inspection can see. The README still describes work from 2021 and 2022.

## Current

### Marketing and legal

| Feature | Location | Notes |
|---|---|---|
| Everyspace landing page | `imports/ui/pages/general/EveryspaceLandingPage.tsx`, route `/` | Guest and host "how it works", location slider, link to create a listing |
| Legal tabs | `/legal` | Meta: "We don’t like hidden terms & conditions…" |
| Contact page | `/contact` | Meta describes film-friendly locations in South Africa |
| Static legal PDFs | `public/*.pdf` | Includes booking agreement, location agreement, mobile space hire and release, sexual harassment policy, social media and confidentiality policy, ECT Act extract |
| In-app policy components | `imports/ui/components/documents/`, `imports/ui/pages/general/documents/` | Terms and policy markup rendered in the app |

### Accounts

| Feature | Location | Notes |
|---|---|---|
| Email and password accounts | `accounts-password`, `AccountSchema` | Verified email required for password login |
| Google and Facebook login | `authentication_services.js` | Popup login. Secrets are committed |
| Email verification and password reset | auth routes, `private/email-templates/users/` | Reset and verification templates |
| Mobile number and verification route | `addMobileToCurrentUser`, `/verify-mobile/:token` | SMS via Twilio outside development |
| Newsletter flag and collection | `NewsletterDB` (`newsletter`), `user.newsletter.subscribe` / `unsubscribe` / `isSubscribed` | Default subscribed on the account schema |
| Ban | `user.banned`, admin `users.all.settings.set` | Login rejected |
| Profile, password change | `/dashboard/profile`, `/dashboard/account-settings/password-change` | |
| Notification setting | `/dashboard/account-settings/notifications` | `send_chat_messages_to_cellphone`, default true |
| Saved cards | `profile.cards` | Written when Peach returns a registration id |
| Payout bank accounts | `user.addPayoutMethod` and related | Digit-only account number and postal code |
| Bootstrap admins | `create_admin.js` | Three emails, role `admin`, password `admin` if the user is created here |

### Listings

| Feature | Location | Notes |
|---|---|---|
| Multi-step listing wizard | `imports/routes/listings/forms.jsx` | Address through pricing and additional fees. Category-specific style steps |
| Listing statuses | `listing.status.set` | `inactive`, `in-review`, `active`, plus `published` |
| Host listing lists | `/dashboard/my-listings/active`, `/in-review`, `/inactive`, `/all` | |
| Photos and watermark | `listing.photo.add` / `remove`, `createWatermarkedVersionForImage.js` | Bucket `filmspace-assets` |
| Pricing tiers and additional fees | `pricing-tier-helpers.ts`, `ListingPricing`, `ListingAdditionalFees` | Host payout preview uses a 12-hour assumption |
| Availability calendar | `ListingCalendar`, `cleanCalendar` job | Past calendar entries are pulled every 30 minutes |
| Activities on a listing | `ListingActivitiesSelection`, `ActivitiesForListingEnum` | Events, Film & Photo, Celebrations, Meetings, Weddings |
| Space tags on images | `spaces_tags.ts`, `spaces_tags_images_link.ts` | Admin can create, assign, and toggle public |
| Featured listings | `listing.toggleIsFeatured`, publication limit 6 | Active and published only |
| Admin sort rating | `listings.setSortRating` | Affects search `sortWeight` |
| Change request | `admin.listing.sendChangeRequest`, collection `change_requests` | |
| Category to form mapping | `forms_for_categories`, `/admin/listing-forms` | |
| Category name snapshot | `db/meteor/categories.bson` | Names include Residential, Commercial, Studio, Mobile, and subtypes. Not a runtime seed |

### Search and listing detail

| Feature | Location | Notes |
|---|---|---|
| Search page | `/search/:page?`, `listings.search` | Requires a map centre and at least one activity. Radius 45 km |
| Map info window | `listings.search.getListingForMapInfoWindow` | |
| Filters | `getFiltersQuery` | Types, attendees, price, styles, amenities, space tag |
| Attendee buckets | `search.ts` | 1–25, 26–50, 51–100, 100+ |
| Detail page | `/filmspace-detail/:listingId` | Route name still says filmspace |
| Favourites | `/dashboard/favourites` | Toggle and note |
| Locations for landing and search | `locations.ts`, `/admin/locations` | Public and landing flags |

### Bookings and payments

| Feature | Location | Notes |
|---|---|---|
| Pre-booking then Peach pre-authorisation | `bookings.create`, `bookings.preparePeachPaymentCheckout` | ZAR, payment type `PA` |
| Payment result page | `/booking/payment-result/:listingId/:preBookingId` | |
| Pending, approved, cancelled, completed | `BookingStatusEnums` | See business rules for the strings |
| Three-day host window | `approvalExpiresDate` | Timeout declines and reverses |
| 24-hour pending reminder | `bookings.24hourBookingRequestReminder` | Intercom event if still pending |
| Capture on accept | `bookings.hostAccept` | Payment type `CP` |
| Full refund on host cancel | `bookings.hostCancel` | Payment type `RF` |
| Guest cancel rules | `bookings.filmmakerCancel` | Reversal, or 50% plus additional fees, or no Peach call inside 48 hours |
| 48-hour shoot reminder | `bookings.48hourReminder` | Only if the start is more than 96 hours away |
| Complete at end time | `bookings.onBookingEndTime` | Removes the calendar block |
| Overlap lookup | `bookings.findOverlappingBookingRequests` | |
| Reference and receipt counters | `CounterService`, prefix `FS` and `REC` | |
| Receipts, invoices, agreement PDF | `booking.generateBookingPDFs`, Puppeteer | Routes under `/booking/receipt`, `/invoice`, `/booking/agreement` |
| Admin payout flag | `booking.setPayoutMade` | No payout API |
| Dashboard booking lists | `/dashboard/bookings/requests`, `/upcoming`, `/past`, `/cancelled` and detail routes | Marks notification counters seen |

### Messaging and reviews

| Feature | Location | Notes |
|---|---|---|
| Inbox and archive | `/dashboard/messages/inbox`, `/archive`, thread routes | |
| Custom fee on a thread | `Messaging.createCustomFee` | Becomes `customRate` on the next booking from that thread |
| Unread counts | `UnreadMessagesCountDenormalizer` | |
| 5-minute unread SMS and email | `notifyOfNewMessage` | Does not read the SMS preference |
| 25-minute follow-up | `notifyOfRecentDiscussionUnreadMessages` | Comment in the scheduler string says 30 minutes |
| Daily 15:00 unread summary | `notifyOfUnreadMessages` | Respects `send_chat_messages_to_cellphone` |
| Listing, user, and website reviews | `Reviews.createListingReview`, `Reviews.createUserReview`, `Reviews.createWebsiteReview` | |
| Review emails | `imports/api/Reviews/server/jobs/reviews.js` | From `Everyspace <hello@everyspace.co.za>` |

### Admin

| Feature | Location | Notes |
|---|---|---|
| Users, listings, bookings | `imports/routes/admin/routes.jsx` | Role gate on the group |
| Space tags | `/admin/spaces-tags` | |
| Locations | `/admin/locations` | |
| Delete all watermarked images | `admin.deleteAllWatermarkedImages` | Admin only |

### Integrations that are wired

| Feature | Location | Notes |
|---|---|---|
| Intercom events | `EveryspaceIntercomClient` calls throughout bookings, listings, messages | Router calls `Intercom("update")` |
| ActiveCampaign | `imports/api/ActiveCampaign/` | Contact fields such as listing counts |
| Google Tag Manager and Facebook page view | `imports/routes/router.js` | Id `UA-158596565-1` |
| Google Maps key | `dev.settings.json` `public.GOOGLE_API_KEY` | Value not reproduced |

## README stories and where they landed

The January 2021 list in `README.md` is **Documented**. Mapping to this tree:

| Story | In this tree |
|---|---|
| US-5 Filepull / download image | Watermark and object upload exist. The word "filepull" does not. **Partial / requires confirmation** |
| US-2 Spaces tags | **Current** (`spaces_tags`) |
| US-3 Search mapping CPT, JHB, DRB, GR | Locations are admin-managed. Those four abbreviations are not constants in the search method. **Unknown** whether they are location records |
| US-4 Back-end user content override | Admin listing edit and change requests exist. The story name is not in code. **Requires confirmation** |
| US-11 Message notifications | **Current** (email and SMS jobs) |
| US-8 Zero service fees | Filmmaker fee is calculated and then subtracted from `pricing.total`. Host fee remains. **Current** as a promotion, not as "no fees at all" |
| US-7 Keep comms on Filmspace | Threads are in-app. SMS and email still leave the platform as notifications. **Partial** |
| US-6 Minimum hours tooltip | `canOverrideMinHours` exists on custom fees. A tooltip component was not singled out. **Requires confirmation** |
| US-10 Listing process remove items | Not identifiable as a removed step. **Unknown** |
| US-9 User feedback modal | `user.sendFeedbackEmail` exists. **Partial** |
| US-12 Intercom chatbot | **Current** |

## Commented out or not running

| Item | Location | Notes |
|---|---|---|
| Server render startup | `server/main.js` | Import and `Meteor.startup` block commented, including a hard-coded mail URL |
| Marketing and style-guide routes | `imports/routes/general/routes.jsx` | `/matthew-test` and `/marketing` commented |
| Admin gate on `/dev-test` | same file | Route still mounts the landing page for anyone |
| Peach sandbox constants | `PeachPaymentsService.js` | Commented. Live `oppwa.com` constants are what run |
| DigitalOcean endpoint | `digital-ocean-spaces-client.js` | Commented. Region `af-south-1` is what runs |
| Old Meteor method `peachpayments.prepareCheckout` | bottom of `PeachPaymentsService.js` | Commented |
| Postgres in Helm | `chart/values.yaml` | `postgresql.enabled: false` |

## Development leftovers that are still routed

| Path | Behaviour |
|---|---|
| `/testing` | Renders `SexualHarassmentPolicy` in the dev layout. No login check |
| `/dev-test` | Renders the landing page. Admin check commented out |
| `/loader` | Full-page loader |
| `tests/main.js` | Asserts package name `filmspace-meteor_react` |

## Static site pipeline

`src/`, `gulpfile.babel.js`, and `config.yml` are a Foundation Sites build (port 8000, Panini, UnCSS). The Meteor app imports `/dist/assets/css/app.css`. **Unknown / Requires Confirmation** whether gulp output is still how CSS is produced. The README says to clone `foundation-sites` 6.5.3 into `/packages`, while `package.json` depends on `foundation-sites` 6.6.3 from npm.

## Not in this repository as a product feature

- A payout disbursement to a bank.
- An insurance policy record or claim.
- A native mobile app. `mobile-experience` is a Meteor package. Cordova is excluded in the npm start script (`--exclude-archs web.browser.legacy,web.cordova`).
- A test suite for bookings, search, or payments.
