Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 20 additions & 9 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ APP_NAME="Danks & Strydom Physiotherapy"
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=https://danksandstrydom.co.za
APP_URL=http://localhost

DEPLOY_TOKEN=

Expand Down Expand Up @@ -63,11 +63,22 @@ AWS_USE_PATH_STYLE_ENDPOINT=false

VITE_APP_NAME="${APP_NAME}"

# Contact form notification recipient(s). Comma-separate for multiple.
CONTACT_MAIL_TO=info@danksandstrydom.co.za

# Public-facing practice details (shown on the site).
CONTACT_PHONE="+27 00 000 0000"
CONTACT_EMAIL="hello@danksandstrydom.co.za"
CONTACT_ADDRESS="123 Wellness Avenue, Suite 4, Cape Town, 8001"
CONTACT_MAP_EMBED_URL="'https://www.google.com/maps/embed?pb=!3m2!1sen!2sza!4v1781261744374!5m2!1sen!2sza!6m8!1m7!1sxjKimELv0brVyDOlsBgq_g!2m2!1d-26.07852308781387!2d28.25012390275597!3f175.0676123469271!4f-11.99162658894005!5f0.7820865974627469' width='600' height='450' style='border:0;' allowfullscreen='' loading='lazy' referrerpolicy='no-referrer-when-downgrade'
# Contact details supplied by the practice; verify entrance/map before release. No sample recipient or map.
CONTACT_MAIL_TO="admin@danksandstrydom.co.za"
CONTACT_PHONE="011 391 3126"
CONTACT_EMAIL="admin@danksandstrydom.co.za"
CONTACT_ADDRESS="Suite 102, Surgiklin Studios, Unit 12, Glen Eagle Office Park, Koorsboom Avenue, Glen Marais, Kempton Park, 1619, Gauteng, South Africa"
CONTACT_LOCATION_VERIFIED=true
CONTACT_STREET="Suite 102, Surgiklin Studios, Unit 12, Glen Eagle Office Park, Koorsboom Avenue, Glen Marais"
CONTACT_LOCALITY="Kempton Park"
CONTACT_REGION="Gauteng"
CONTACT_POSTCODE="1619"
CONTACT_HOURS="Monday–Friday: 07:30–17:30. Saturday: By appointment. Sunday and public holidays: Closed."
CONTACT_MAP_EMBED_URL="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d3583.7425911415435!2d28.2610527!3d-26.074667599999998!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x1e9515b5389c59e3%3A0xc9913cffe2473c26!2sDanks%20And%20Strydom!5e0!3m2!1sen!2sza!4v1789387905460!5m2!1sen!2sza"
CONTACT_DIRECTIONS_URL="https://maps.app.goo.gl/WoxWSjSzNbtEkTr66"

# Enable on production only after release review; APP_URL is this environment's origin.
SITE_INDEXABLE=false
SITE_CANONICAL_REDIRECTS=false
# Opt-in event adapter; no analytics provider is loaded automatically.
SITE_ANALYTICS_ENABLED=false
85 changes: 85 additions & 0 deletions CONTENT-TODO.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# Optional content to complete

All eight service pages, About and Patient Information are enabled for public release. Contact's booking information is public content. The user waived Cheryl's approval step; none of the optional items below blocks publication. This branch has not been merged or deployed.

Unknown values are `null` or empty arrays in `config/site.php`. Keep them empty until real information is supplied. Every environment omits incomplete fields without website notices. Optional profile fields are not used in metadata or structured data. Photographs require both an approved asset path (relative to `public/`) and descriptive alt text. Do not use stock people as practitioner portraits.

## Testimonials — three quotations confirmed and approved

The user has now explicitly confirmed that the supplied screenshot quotations are genuine and that the practice has permission to publish their quotes and display names. The top-row quotations from Sarah M., Priya N. and Lerato K. are recorded as approved, in that order. This records the user’s confirmation, not independent source verification. Public source URLs were not supplied, so the cards have no source links or ratings.

Edit **`config/site.php`**, under **`site.testimonials.entries`**, to add genuine testimonials. The separate **`site.testimonials.samples`** list contains three neutral design examples and is restricted to local/staging; changing a sample's approval flag cannot publish it. When no approved entries exist, production omits the whole section, while local/staging show labelled samples. Once approved entries exist, those replace the sample set.

| Done | Field | What to supply / where it appears |
|---|---|---|
| [x] | `site.testimonials.entries.<index>.quote` | Exact genuine quotation with permission for website use; homepage card below the treatment images. |
| [x] | `site.testimonials.entries.<index>.display_name` | The reviewer's permitted public display name; card attribution. Do not infer an identity. |
| [ ] | `site.testimonials.entries.<index>.source_url` | Optional original review's HTTP(S) URL; use `null` when unavailable. Only valid supplied links are displayed. A link does not establish permission by itself. |
| [x] | `site.testimonials.entries.<index>.approved` | Set the boolean `true` only after verifying provenance and permission for that exact quote and display name. Unapproved or incomplete entries never display. |

Entry structure (fill the empty values with genuine content first):

```php
'entries' => [
['quote' => null, 'display_name' => null, 'source_url' => null, 'approved' => false],
],
```

Keep permission evidence privately with the practice; do not commit consent documents or private patient details. Do not copy neutral sample text into the production entries. No ratings, Review schema or aggregate ratings are supported. These publication controls are specific to testimonials; they do not reinstate page approval or password access. Rebuild the Laravel configuration cache through the normal release process after content changes.

## Practitioner information

All keys below are in **`config/site.php`**. `site.pages.about.practitioners.0` is **Cheryl Myburgh**; `site.pages.about.practitioners.1` is **Elize Strydom**. Keep this order when editing the numeric entries.

Edit the visible draft biographies directly in this file:

- **Cheryl:** `site.pages.about.practitioners.0.biography` — About, below her name/title. Uses only her physiotherapy degree and extensive human/equine experience. Equine experience is biographical, not an offering at this practice.
- **Elize:** `site.pages.about.practitioners.1.biography` — About, below her name/title. Uses only her physiotherapy degree and human physiotherapy experience.

These are editable drafts based on confirmed facts, not missing biography notices. Additional detail is optional. Keep unknown values empty; no registration numbers, years, employment history or specialist credentials have been supplied. After editing configuration on a deployed site, the operator must rebuild Laravel's configuration cache through the normal release process.

| Done | Person / missing item | Configuration key | What to supply / where it appears |
|---|---|---|---|
| [ ] | Cheryl: exact qualifications | `site.pages.about.practitioners.0.qualifications` | List of exact degree/qualification titles, without inferred specialist credentials; About profile below the short biography. |
| [ ] | Cheryl: universities | `site.pages.about.practitioners.0.universities` | List of awarding universities; About profile. |
| [ ] | Cheryl: longer biography | `site.pages.about.practitioners.0.expanded_biography` | Optional factual expansion of the existing short biography; About profile. Do not invent years, employment history or clinical interests. |
| [ ] | Cheryl: languages | `site.pages.about.practitioners.0.languages` | List of languages offered in consultations; About profile. |
| [ ] | Cheryl: approved photograph | `site.pages.about.practitioners.0.photo.path` and `.photo.alt` | Approved image asset and accurate alternative text; About profile. Both must be filled before an image appears. |
| [ ] | Elize: exact qualifications | `site.pages.about.practitioners.1.qualifications` | List of exact degree/qualification titles; About profile below the short biography. |
| [ ] | Elize: universities | `site.pages.about.practitioners.1.universities` | List of awarding universities; About profile. |
| [ ] | Elize: longer biography | `site.pages.about.practitioners.1.expanded_biography` | Optional factual expansion; About profile. Existing short biography is already recorded. |
| [ ] | Elize: languages | `site.pages.about.practitioners.1.languages` | List of languages offered in consultations; About profile. |
| [ ] | Elize: approved photograph | `site.pages.about.practitioners.1.photo.path` and `.photo.alt` | Approved image asset and accurate alternative text; About profile. Both must be filled before an image appears. |

## Other optional practice information

All keys below are also in **`config/site.php`**. Populating a `body` adds its labelled section to Patient Information. Keep the existing confirmed sections consistent if adding more detail.

| Done | Missing item | Configuration key | What to supply / where it appears |
|---|---|---|---|
| [ ] | Consultation fee amounts | `site.pages.patient-information.optional_sections.consultation_fees.body` | Current amounts and currency, only if you want prices displayed. Patient Information: Current consultation fees. The existing “contact the practice” wording is usable without prices. |
| [ ] | Payment timing | `site.pages.patient-information.optional_sections.payment_timing.body` | When payment is due. Patient Information: When payment is due. Cash/card acceptance is already confirmed. |
| [ ] | Medical-aid submission process | `site.pages.patient-information.optional_sections.medical_aid_claims.body` | Whether the practice submits claims, whether patients pay first, and the actual process; no assumptions about scheme coverage. Patient Information: Submitting medical-aid claims. |
| [ ] | Declined claims | `site.pages.patient-information.optional_sections.declined_claims.body` | Who is responsible and what happens if a claim is declined. Patient Information: Declined medical-aid claims. |
| [ ] | Separate missed-appointment policy | `site.pages.patient-information.optional_sections.missed_appointments.body` | A no-show policy, if there is one. Patient Information: Missed appointments. Do not infer this from the confirmed cancellation policy. |

## Confirmed information already recorded

Do not treat these as missing or replace them with placeholders:

- **Names, professional title and short biographies:** `config/site.php`, `site.pages.about.practitioners.{0,1}.name`, `.title`, `.biography`. Both hold physiotherapy degrees; exact degree titles/universities remain unknown. Cheryl's supplied human/equine experience is biographical and does not create an equine service offering at these rooms.
- **Eight service offerings and patient-facing descriptions:** `config/site.php`, `site.pages.<service-name>`. All eight are now published in configuration.
- **One-hour appointments, patient-information form, assessment-first approach, nothing to bring, booking/confirmation, referrals and follow-up:** `config/site.php`, `site.pages.patient-information.sections` and `site.pages.contact.sections`.
- **Cash/card acceptance and cancellation wording:** `site.pages.patient-information.sections`. At least 24 hours' notice; with less notice the patient may be liable for the full appointment fee. Do not turn “may” into an automatic charge.
- **Address, arrival, parking/access, hours, telephone, public email and verified map/directions:** `config/contact.php`, `contact.practice.*`. Suite 102, Surgiklin Studios, Unit 12, Glen Eagle Office Park, Koorsboom Avenue, Glen Marais, Kempton Park, 1619; phone 011 391 3126; email admin@danksandstrydom.co.za.
- **Intended enquiry inbox:** admin@danksandstrydom.co.za, recorded in `.env.example`. The actual recipient list is read by `config/contact.php`, `contact.recipients`, from the server's `CONTACT_MAIL_TO`; verifying it is an operational task, not an unknown business fact.

## External release tasks, not missing website content

- Valourite must verify existing production environment overrides, mail delivery configuration, recipients, location fields and effective cached configuration. Production preflight must pass before deployment; safe indexing defaults remain false.
- Merge and deployment still require separate authorisation. Publishing configuration here does not change the live site.
- Establish Google Business Profile/Search Console ownership and access through Valourite, reconcile listing details and submit the indexable sitemap after release. No Google-account changes have been made.

## Image editing

Illustrative image inventory, alt text and responsive paths: `config/imagery.php`, `imagery.images.<scene>`. Internal-page selection: `imagery.pages` keyed by URL. Homepage selections: `resources/views/sections/{hero,services,about,benefits,visit}.blade.php`. See `IMAGE-ASSETS.md` for the full generated-asset map and prompt record. These files must not be used for Cheryl/Elize portrait fields; approved real practitioner photographs remain outstanding as listed above.
Loading
Loading