# PRD — Sheriff (Sheriff for Wynberg North)

Evidence date: 2026-10-04.

Source: `git@bitbucket.org:overdrive/sheriff.git`, `master` at `6269872` (2025-05-20).

This document records behaviour that is in the repository. It does not decide what the product should become. Labels:

- **Documented** — written in a page, comment, or commit message.
- **Implemented** — present in code or markup that the public scripts use.
- **Inferred** — a reasonable reading of that evidence, not an explicit requirement.
- **Planned** — described as future work. None was found.
- **Unknown / Requires Confirmation** — the repository does not settle it.

There is no separate requirements document in the repository. Requirements below were recovered from the implementation and from the text the pages publish.

## Product purpose

Publish a public website for the Sheriff for Wynberg North (Balju vir Wynberg-Noord) so a visitor can read sale-in-execution notices, see which suburbs the office says it services, and find how to contact the office.

Provenance: **Inferred** from `layouts/Layout1.php` and the six HTML bodies. The office name itself is **Documented** in the layout.

## Users and roles

| Actor | What they do in this repository | Provenance |
|---|---|---|
| Public visitor | Opens one of the six pages and reads it | **Implemented** |
| Person who edits the HTML or PHP and commits | Not a role inside the application. Git history shows Uriel Balela, Uriel_Balela, Wessels, and Jaco Brits changing files | **Inferred** from git |
| Signed-in Nemo user | `Nemo::__construct()` in `_nemo.cls.php` redirects when `$_SESSION[USER]` is unset. No public script constructs `Nemo`. No login page is in the tree | **Implemented** as unused code |

No permission model is applied to the six pages. Anyone who can request the URL receives the page.

## Information the site publishes

| Information | Where a visitor sees it | Provenance |
|---|---|---|
| Bilingual welcome and the three sale categories | `home.htm` via `index.php` | **Documented** on the page |
| Physical office address and telephone | `home.htm` | **Documented** |
| One immovable auction notice, including conditions of sale | `immovable.htm` | **Documented** |
| One movable auction catalogue and attendance conditions | `movable.htm` | **Documented** |
| Shipping heading and one contact | `shipping.htm` | **Documented** |
| Suburb list | `jurisdiction.htm` | **Documented** |
| Named contacts and email addresses | `contact.htm` | **Documented** |
| Related courts, the Board for Sheriffs, and neighbouring sheriffs | Footer in `layouts/Layout1.php` | **Documented** |

The site does not store bids, deposits, buyer registrations, or messages. No `<form>` element exists in the page scripts, the layout, or the six content files.

## Major workflows

### Read a section

1. The visitor requests `index.php`, `immovable.php`, `movable.php`, `shipping.php`, `jurisdiction.php`, or `contact.php`.
2. The script includes `_nemo.basic.cls.php`, which includes `system.php`.
3. The script sets `heading`, `activePage`, and `includes`.
4. `NemoBasic::Display()` sends the shared chrome and includes the HTML file.
5. The matching menu item receives `class='Active'`.

There is no login step, no search, and no second page of results.

### Change what is published

No in-application editor exists. The history of content changes is replacement of HTML (and, once, a footer telephone) in git. Provenance: **Inferred** from commits `089abd8`, `578206c`, and `497d493`.

## Functional requirements

### FR-001 — Home page

**Requirement:** A visitor who opens `index.php` sees the heading `Sheriff :: Home`, the shared chrome, and `home.htm`.

**Who:** Public visitor.

**Trigger:** Request `index.php`.

**Behaviour:** `activePage` is `Index`. The included page is bilingual. Afrikaans welcomes the visitor to the website and names sales in execution. English invites the visitor to browse for items which will be sold by way of sales in execution. Both languages list three categories: immovable property (houses, flats, and other buildings), movable property, and ships including yachts.

The address block shows, in both languages:

- Coates Building / Coates Gebou
- 32 Maynard Road / Maynardweg 32
- Wynberg
- 7824
- Tel: 021 761 3439

**Output:** HTML page.

**Validation:** None.

**Evidence:** `index.php`, `home.htm`. **Implemented** and **Documented**.

**Confidence:** High.

### FR-002 — Shared chrome and menu

**Requirement:** Every public page shows the same header, menu, banner, and footer. The current section is marked active.

**Who:** Public visitor.

**Trigger:** `NemoBasic::Display()` from any of the six scripts.

**Menu, in order:**

| Label | Target | Active when |
|---|---|---|
| Home | `index.php` | `Index` |
| Immovable | `immovable.php` | `Immovable` |
| Movable | `movable.php` | `Movable` |
| Shipping | `shipping.php` | `Shipping` |
| Jurisdiction | `jurisdiction.php` | `Jurisdiction` |
| Contact Us | `contact.php` | `Contact` |

**Header:** `BALJU VIR WYNBERG-NOORD / SHERIFF FOR WYNBERG NORTH` and `images/SASSLogo.png`.

**Banner:** `images/Banner.png`.

**Footer:** three columns, then a second row.

| Heading | Text |
|---|---|
| Magistrate's Court for Wynberg | Church Street, Wynberg. Tel: 021 799 1800 |
| High Court for the Western Cape | Keerom Street, Cape Town. Tel: 021 480 2411 |
| Board for Sheriffs | 88 Loop Street, Cape Town. Tel: 021 426 0577 |
| Sheriff for Wynberg South | Tel: 021 761 2820 |
| (empty heading) | empty |
| Sheriff for Wynberg East | Tel: 021 224 0055 |

Disclaimer line: `www.sheriff.co.za © 2013 Developed by Silicon Overdrive`, linking to `http://www.overdrive.co.za/`.

The Wynberg East number was `021 761 3439` until commit `578206c` (2023-11-16), which set it to `021 224 0055`. Provenance: **Documented** in that diff. The office's own number `021 761 3439` remains on the home page, not in the footer as this office.

**Evidence:** `layouts/Layout1.php`. **Implemented**.

**Confidence:** High.

### FR-003 — Immovable auction notice

**Requirement:** `immovable.php` shows `immovable.htm` under the heading `Sheriff :: Immovable`.

**Who:** Public visitor.

**Trigger:** Request `immovable.php`.

**Published content at `6269872`:** One notice titled as an immovable property auction for the Sheriff for Wynberg North. The notice states that the sale is conducted in accordance with the Consumer Protection Act 68 of 2008 pursuant to an order for money owing. It says the levy and rates figures are an estimate and that neither the Sheriff nor the execution creditor warrants that estimate.

The notice table:

| Field | Published value |
|---|---|
| Date | 09 October 2023 |
| Time | 11:00 |
| Held at | On site |
| Address | 904 Rondebosch Oaks, 50 Rouwkoop Road, Rondebosch |
| Auctioneer | Mr J Terblanche |
| Levies outstanding | R1562.41 |
| Rates outstanding | R447.34 |

The property description says a plastered ground-floor flat: one bedroom, bathroom, open-plan kitchen/dining/living, built-in cupboards, a dedicated parking bay, and 24-hour manned security.

Also published on that page, as notice text rather than as code:

- A suggestion that buyers arrive at least an hour before the auction.
- Registration fee R1000, by cash, EFT, or cheque. Cash is described as returned after the auction against an ID and bidder number.
- A 10% deposit of the purchase price on the day of the sale, in cash, by bank-guaranteed cheque, or by electronic transfer.
- Sheriff's commission: 6% on the first R100 000.00, 3.5% on R100 001.00 to R400 000.00, and 1.5% on the balance, maximum R40 000.00 plus VAT, minimum R3 000.00 plus VAT.
- FICA registration, proof of residence not older than 3 months, and re-registration at every auction.
- No bidder registered once the auctioneer starts reading the conditions of sale.
- COVID-19 attendance conditions (sanitising, an attendance register with identity number, physical address and telephone number, 1.5 m distancing, face covering). The lettered list on the page goes (a), (b), (d), (e). There is no (c) in `immovable.htm`.
- Sign-off: Zureena Stemmet, Immovable Department, Wynberg North Sheriff's Office, Coates Building, 32 Maynard Road, Wynberg 7824, telephone 021 761 3439, fax 021 797 3212, `stemmet@sheriff.org.za`.

The page does not calculate the commission, take the fee, or check FICA. Provenance of the rules: **Documented** as page text. Provenance of "the application does not enforce them": **Implemented** (no form or calculation).

`immovable.htm` was last changed in `089abd8` (2023-11-14, message: copy files from prod to repo). The May 2025 commits did not change it. Whether this notice is still the one the office wants on the site is **Unknown / Requires Confirmation**.

**Evidence:** `immovable.php`, `immovable.htm`.

**Confidence:** High for what is published. Low for whether it is still current.

### FR-004 — Movable auction catalogue

**Requirement:** `movable.php` shows `movable.htm` under the heading `Sheriff :: Movable`.

**Who:** Public visitor.

**Trigger:** Request `movable.php`.

**Published content at `6269872`:** A sale-in-execution catalogue for a movable auction in September 2023 at 10:00 at Unit B5 Coleman Business Park, Coleman Street, Elsies River. The body lists specific goods (a vehicle and household appliances and furniture). Queries are directed to Candice Knoetzen at 021-9482039.

Also published as notice text:

- COVID-19 limits: only the sheriff, employees, and permitted persons; not more than 50 people; outdoors where 1.5 m can be kept, or a ventilated indoor space if weather or the goods require it; screening and sanitising; refusal of entry for COVID-19 symptoms; an attendance register; sanitising before and after examining goods; a face covering; removal of anyone who does not comply.
- Goods must be removed no later than 30 minutes after the auction, and the visitor is told to bring transport. Assets are viewable 30 minutes before the sale.
- Existing registered buyers must bring updated copies of ID and proof of residence for FICA or be deregistered. New buyers must bring copies the office can keep. Copies may be emailed ahead so the list can be updated.

The application does not accept those emails. The page gives a telephone number and, on the contact page, an email address. There is no mailto form and no upload.

`movable.htm` was last changed in `089abd8` (2023-11-14). Currency of the catalogue is **Unknown / Requires Confirmation**.

**Evidence:** `movable.php`, `movable.htm`.

**Confidence:** High for what is published.

### FR-005 — Shipping page

**Requirement:** `shipping.php` shows `shipping.htm` under the heading `Sheriff :: Shipping`.

**Who:** Public visitor.

**Trigger:** Request `shipping.php`.

**Behaviour:** The layout title is `Sheriff :: Shipping`. The included Word file's own `<title>` is `SALE OF YACHT "MONDINA"`. The visible body of that file is the heading `Shipping` and `Contact: Mark Withers (withers@sheriff.org.za)`. No yacht specification, date, or price is in the body.

The included file is a full HTML document nested inside the layout, so a browser's handling of the inner `<title>` is outside this repository. Whether a visitor sees the yacht name is **Unknown / Requires Confirmation** until the page is rendered. The string is in the file.

`shipping.htm` was last changed in `16a8f16` (2022-11-25).

**Evidence:** `shipping.php`, `shipping.htm`, `layouts/header.incl.php`.

**Confidence:** High for the file contents.

### FR-006 — Jurisdiction list

**Requirement:** `jurisdiction.php` shows `jurisdiction.htm` under the heading `Sheriff :: Jurisdiction`.

**Who:** Public visitor.

**Trigger:** Request `jurisdiction.php`.

**Behaviour:** The page says "The following suburbs are serviced by this office:" and lists them in a three-column table.

The Constantia line is printed twice, once at the end of the first data row and again at the start of the next row:

- Bishopscourt
- Claremont
- Constantia (North of Main Rd to Hout Bay)
- Constantia (North of Main Rd to Hout Bay)
- Hangberg
- Harfield
- Hiddingh Estate
- Hout Bay
- Imizamo Yethu
- Kenilworth
- Kirstenbosch
- Klaasenbosch
- Llandudno
- Maynardville
- Mowbray (South of N2)
- Newlands
- Plumstead (North of Victoria Rd)
- Rondebosch (West of M5)
- Rosebank
- Sandy Bay
- Southfield (North of Victoria Rd)
- Trovato
- UCT
- Wittebome
- Wynberg

The page does not check an address against this list. Provenance: **Documented** as the published list. Whether the duplicate Constantia line is intentional is **Unknown / Requires Confirmation**.

`jurisdiction.htm` was last changed in `16a8f16` (2022-11-25).

**Evidence:** `jurisdiction.php`, `jurisdiction.htm`.

**Confidence:** High.

### FR-007 — Contact directory

**Requirement:** `contact.php` shows `contact.htm` under the heading `Sheriff :: Contact Us`.

**Who:** Public visitor.

**Trigger:** Request `contact.php`.

**Behaviour:** The page says the visitor may contact the office or send an email. It is not a form. It is a table.

Visible rows at `6269872`:

| Column heading | Person | Published contact |
|---|---|---|
| Immovable Property | Zureena Stemmet | `stemmet@sheriff.org.za` |
| Movable Property | Noreen Baker | `reception@sheriff.org.za` |
| (still the left-hand cell, under Immovable Property) | Auctioneer: Candice Knoetzen | `knoetzen@bvnsheriff.co.za`, cell 074 956 7454 |
| (left-hand cell) | Auctioneer: Jasper Terblanche | `jasper@sheriff.org.za` |

The right-hand cell beside Candice is an HTML comment, not visible text. That comment names Mark Withers as Office Supervisor, telephones `021 7613439 / 082 4922622`, and `withers@sheriff.org.za`. A cell number under Jasper is also inside an HTML comment and is the same cell number as Candice's. Provenance: **Implemented** as comments. They are not part of the rendered directory.

**Discrepancy:** `movable.htm` directs movable-auction queries to Candice Knoetzen. On `contact.htm` her block sits in the left column, whose heading is Immovable Property, while Noreen Baker sits under Movable Property. The repository does not say which column is authoritative. **Requires Confirmation**.

**Discrepancy:** Mark Withers is hidden on the contact page and is the only contact shown on `shipping.htm`. **Requires Confirmation** which presentation is current.

The mailbox `reception@sheriff.org.za` is the only indication of a reception role. A job title "reception" is not printed next to Noreen Baker. **Inferred** from the address.

`contact.htm` was last changed in `578206c` (2023-11-16).

**Evidence:** `contact.php`, `contact.htm`.

**Confidence:** High for the visible table. The column meaning needs confirmation.

### FR-008 — Postal address removed from the home page

**Requirement:** The home page does not show a postal address.

**Who:** Public visitor.

**Trigger:** Commit `497d493` (2025-05-20), message `home page changes: removed postal address`.

**Behaviour:** The labels "Pos Adres" / "Postal Address" and the values were blanked in `home.htm`. The values that were removed, from the parent of that commit, were PO Box / Posbus 18162, Wynberg, 7824, Docex 16. Those strings are not in the current `home.htm`.

The physical address and telephone in FR-001 remain.

**Evidence:** `git show 497d493 -- home.htm`. **Documented** by the commit, **Implemented** in the current file.

**Confidence:** High.

### FR-009 — No account, bid, or message workflow

**Requirement:** The public site does not register a buyer, accept a bid, take a payment, upload FICA documents, or send the contact page as email.

**Who:** Public visitor.

**Trigger:** Any of the six pages.

**Behaviour:** The scripts set three properties and call `Display()`. `NemoBasic`'s database construction is commented out. The layout does not call `NemoBasic::Menu()`, `GoogleAnalytics()`, or the Celestis header and footer methods. No form is present.

**Evidence:** the six scripts, `_nemo.basic.cls.php`, `layouts/Layout1.php`. **Implemented**.

**Confidence:** High.

### FR-010 — Error display on every request

**Requirement:** `system.php` turns on `display_errors` and reports `E_ALL` except `E_NOTICE` and `E_WARNING`.

**Who:** Every request that includes `system.php`. The six pages do, through `NemoBasic`.

**Behaviour:** `6269872` removed `& ~E_STRICT` because that constant was deprecated. Notices and warnings stay suppressed. Other errors can be printed in the response.

**Evidence:** `system.php`. **Implemented**. **Documented** in the commit message.

**Confidence:** High.

## Integrations

| System | Direction | Used by the six pages? | Evidence |
|---|---|---|---|
| MySQL via `mysql_*` | Read `sysSettings` if `$db` is a resource | No. `$db` and `$DATABASE_SETTINGS` are never assigned | `system.php` |
| PHP `mail()` | Outbound | No. Only `NemoEmail::Send()` and `SendFromDatabase()` | `_nemo.email.cls.php` |
| MyMobileAPI `http://www.mymobileapi.com/api5/http5.aspx` | Outbound POST | No. `SendSMS()` is not called by the six pages. Username, password, and live flag would come from `$SystemSettings`, which this tree never loads from a database | `system.functions.inc.php` |
| Google Analytics property `UA-20111494-1` | Outbound script | No. `NemoBasic::GoogleAnalytics()` is not called by the layout | `_nemo.basic.cls.php` |
| `www.overdrive.co.za` | Footer link | Yes, as an ordinary link | `layouts/Layout1.php` |

Failure behaviour for the database branch is commented out. If `$db` is not a resource, `system.php` continues and the page still renders. Provenance: **Implemented**.

## Important constraints

- Content is static HTML. Dates in the notices are part of the file, not generated from a clock or a database.
- The header declares `charset=iso-8859-1` (`layouts/header.incl.php`). The Word files contain their own encoding metadata. A mismatch is possible. It was not measured in a browser for this document.
- `index.php` is the only script with a host switch, and `system.php` overwrites `BASE_URL` before `NemoBasic` copies settings. Asset URLs follow `system.php`: `{protocol}://{host}` plus the directory of the script. Provenance: **Implemented**.
- Several CSS files named by the header are absent. See technical documentation. The pages still render the Word HTML.
- `system.functions.inc.php` calls `localize()` when `$_POST`, `$_GET`, or `$_COOKIE` is non-empty. `localize()` calls `gpc_extract()` with three arguments. `gpc_extract()` declares two parameters and does not take its target by reference. On PHP 8, extra arguments to a user-defined function raise `ArgumentCountError`. A request with a query string, a body, or a cookie can therefore fail before the page renders. A request with all three empty does not call `localize()`. The deployed PHP version was not executed here. **Requires Confirmation**.

## Assumptions that must stay marked as assumptions

- The product's job is public notice of sales in execution. The repository never states a goal in those words.
- Editors update notices by replacing HTML files.
- `www.sheriff.co.za` is the public host. Only the footer string says so.
- `knoetzen@bvnsheriff.co.za` belongs to this office. The page prints it. The repository does not define the domain.
- The October 2023 and September 2023 notices are what production still shows. Git shows they were not edited after November 2023.

## Planned behaviour

None found in the repository.
