` block containing the "Fax" label and `{formField name="fax" ...}` (currently lines 45–48).
+
+ In `_rejestracja/Admin/template/partial/Calc/Reg.tpl`:
+ - Remove the line `Fax: {$obj->getFax()}` from the participant contact cell (currently line 49).
+
+ In `_rejestracja/Admin/template/partial/Calc/RegEdit.tpl`:
+ - Remove the line `Fax: {$objParticipant->getFax()|default:$registrationMissing}` from the edit view (currently line 36).
+
+ Do NOT modify the PHP model, controller, or database schema — the `fax` column stays in DB for existing records.
+
+
+ Visually inspect the public form — no "Fax" row present.
+ Grep: `grep -n "fax\|Fax" _rejestracja/template/partial/Index/Index.tpl _rejestracja/Admin/template/partial/Calc/Reg.tpl _rejestracja/Admin/template/partial/Calc/RegEdit.tpl`
+ Expected: no matches in the three template files.
+
+
AC-1 and AC-2 satisfied: FAX absent from public form and both admin templates.
+
+
+
+ Task 2: Hide surcharge checkboxes when one-day-no-lodging is selected
+ _rejestracja/template/partial/Index/Index.tpl
+
+ In the `showSelectDate()` JavaScript function (inside the `{literal}...{/literal}` block in Index.tpl), update the logic as follows:
+
+ Current behaviour:
+ - Full conference radio (`conference_fee`, onclick): calls `$('#conference_1').show()` explicitly in its `onclick` attribute.
+ - One-day-no-lodging radio (`conference_fee_1`, onclick): only calls `calculatePrice()`.
+ - `showSelectDate()` does not touch `#conference_1`.
+
+ Required change — inside `showSelectDate()`, add visibility toggling for `#conference_1`:
+ 1. At the start of `showSelectDate()`, after the existing hide/reset lines, add: `$('#conference_1').hide();` (default to hidden when option changes).
+ 2. In the `if (selectedId === 'conference_fee')` branch (full conference — note: there is no such branch yet, add it): show `#conference_1`.
+ Actually the full conference radio id is `conference_fee` (the radio with `checked="true"` and value=1). Add the branch:
+ ```
+ if (selectedId === 'conference_fee') {
+ $('#conference_1').show();
+ }
+ ```
+ 3. In the `if (selectedId === 'conference_fee_1')` branch (one day no lodging): already handled by the default hide above, but also uncheck both checkboxes:
+ ```
+ if (selectedId === 'conference_fee_1') {
+ $('#participation_option').val('one_day_no_lodging');
+ $('#one-day-no-lodging-days').css('display', 'flex');
+ $('#price_plus_room').prop('checked', false);
+ $('#price_plus_person').prop('checked', false);
+ }
+ ```
+
+ Also remove the inline `onclick="$('#conference_1').show(); $('#conference_2').hide(); calculatePrice();"` from the full conference radio input and replace it with just `onclick="showSelectDate(); calculatePrice();"` — or simply add `showSelectDate()` logic to handle it, keeping existing calculatePrice() calls.
+
+ Simpler approach to minimise risk: Keep the inline onclick on the full conference radio as-is (`$('#conference_1').show(); ...`) and only modify `showSelectDate()` to:
+ - After the three existing hide/reset lines (lines ~218-222), add: `$('#conference_1').hide();`
+ - In the `if (selectedId === 'conference_fee_1')` block, add unchecking of the two checkboxes:
+ ```js
+ $('#price_plus_room').prop('checked', false);
+ $('#price_plus_person').prop('checked', false);
+ ```
+ This way, when `showSelectDate()` fires on `conference_fee_1` change, `#conference_1` is hidden and checkboxes are cleared. When the full conference radio fires its inline onclick, it explicitly calls `$('#conference_1').show()` before `calculatePrice()` — unchanged behaviour.
+
+ Avoid: touching calculatePrice() logic or any server-side code.
+
+
+ Manual test flow:
+ 1. Load the registration form.
+ 2. Select "udział jeden dzień bez noclegu" — confirm #conference_1 block disappears and both checkboxes are unchecked.
+ 3. Re-select full conference — confirm #conference_1 block reappears.
+ 4. Verify price calculation still works correctly for both options.
+
+ AC-3 and AC-4 satisfied: surcharge block hidden on one-day-no-lodging, visible on full conference.
+
+
+
+
+
+
+## DO NOT CHANGE
+- `_rejestracja/controller/IndexController.php` — FAX is still saved from POST (will just be empty); no controller changes needed.
+- `_rejestracja/core/model/MfParticipant.class.php` — DB model unchanged.
+- Any database schema or migration files.
+- Pricing calculation logic (`calculatePrice()` function body).
+- Any other form fields or admin templates not listed above.
+
+## SCOPE LIMITS
+- Do not remove FAX from the DB column or PHP model.
+- Do not change the admin edit form inputs for FAX (RegEdit.tpl input field, if any) — only remove the display line; if there's an editable FAX input in RegEdit.tpl, remove that display label only, not the save logic.
+- Do not redesign or refactor the showSelectDate() function beyond the targeted change.
+
+
+
+
+Before declaring plan complete:
+- [ ] `grep -n "Fax\|fax" _rejestracja/template/partial/Index/Index.tpl` returns no results (or only comments/model)
+- [ ] `grep -n "Fax" _rejestracja/Admin/template/partial/Calc/Reg.tpl` returns no results
+- [ ] `grep -n "Fax" _rejestracja/Admin/template/partial/Calc/RegEdit.tpl` returns no results
+- [ ] Public form loads without PHP errors
+- [ ] Selecting one-day-no-lodging hides #conference_1 surcharges
+- [ ] Selecting full conference shows #conference_1 surcharges
+- [ ] Price calculation works correctly for all options
+
+
+
+- All tasks completed
+- FAX field absent from public form and both admin templates
+- Surcharge block toggles correctly with participation option selection
+- No regressions in pricing, form submission, or admin display
+
+
+
diff --git a/.paul/phases/04-post-launch-fixes/04-01-SUMMARY.md b/.paul/phases/04-post-launch-fixes/04-01-SUMMARY.md
new file mode 100644
index 0000000..721c1be
--- /dev/null
+++ b/.paul/phases/04-post-launch-fixes/04-01-SUMMARY.md
@@ -0,0 +1,108 @@
+---
+phase: 04-post-launch-fixes
+plan: 01
+subsystem: ui
+tags: [php, smarty, javascript, form]
+
+requires: []
+provides:
+ - FAX field removed from public registration form and admin participant views
+ - Surcharge checkboxes hidden when one-day-no-lodging option selected
+ - PHP 7.2 count() warning fixed in FrontController
+
+key-files:
+ modified:
+ - _rejestracja/template/partial/Index/Index.tpl
+ - _rejestracja/Admin/template/partial/Calc/Reg.tpl
+ - _rejestracja/Admin/template/partial/Calc/RegEdit.tpl
+ - _rejestracja/core/class/FrontController.class.php
+
+key-decisions:
+ - "FAX kept in DB/model — only removed from templates; existing records preserved"
+ - "showSelectDate() default-hides #conference_1; full-conference inline onclick restores it"
+
+duration: ~15min
+completed: 2026-04-28T00:00:00Z
+---
+
+# Phase 4 Plan 01: Post-Launch Fixes Summary
+
+**FAX field removed from form and admin views; surcharge block now hidden when one-day-no-lodging is selected; PHP 7.2 count() warning fixed.**
+
+## Performance
+
+| Metric | Value |
+|--------|-------|
+| Duration | ~15 min |
+| Completed | 2026-04-28 |
+| Tasks | 2 completed |
+| Files modified | 4 |
+
+## Acceptance Criteria Results
+
+| Criterion | Status | Notes |
+|-----------|--------|-------|
+| AC-1: FAX removed from public form | Pass | Div block with label + formField removed from Index.tpl |
+| AC-2: FAX removed from admin views | Pass | Line removed from Reg.tpl and RegEdit.tpl |
+| AC-3: Surcharges hidden on one-day-no-lodging | Pass | showSelectDate() hides #conference_1 by default; conference_fee_1 branch unchecks both checkboxes |
+| AC-4: Surcharges shown on full conference | Pass | Full conference radio inline onclick still calls `$('#conference_1').show()` |
+
+## Accomplishments
+
+- Removed obsolete FAX field from public form (Index.tpl) — no longer collected or displayed to registrants
+- Removed FAX display line from both admin participant views (Reg.tpl, RegEdit.tpl)
+- Updated `showSelectDate()` JS: adds `$('#conference_1').hide()` as default reset, plus unchecks `#price_plus_room` and `#price_plus_person` when one-day-no-lodging is selected
+- Fixed pre-existing PHP 7.2 compatibility warning in `FrontController::GenerateTitle()` — `count(null)` replaced with safe array cast
+
+## Files Created/Modified
+
+| File | Change | Purpose |
+|------|--------|---------|
+| `_rejestracja/template/partial/Index/Index.tpl` | Modified | Removed FAX field div; updated showSelectDate() JS |
+| `_rejestracja/Admin/template/partial/Calc/Reg.tpl` | Modified | Removed Fax display line from participant list |
+| `_rejestracja/Admin/template/partial/Calc/RegEdit.tpl` | Modified | Removed Fax display line from participant edit view |
+| `_rejestracja/core/class/FrontController.class.php` | Modified | Fixed count(null) PHP 7.2 warning in GenerateTitle() |
+
+## Decisions Made
+
+| Decision | Rationale | Impact |
+|----------|-----------|--------|
+| Keep FAX in DB/model, remove only from templates | Preserves existing records; no migration needed | Historical FAX data remains accessible via DB direct query |
+| Default-hide #conference_1 in showSelectDate(), keep inline .show() on full-conference radio | Minimal change — avoids refactoring working onclick; showSelectDate fires on change only | Clean toggle behaviour with fewest lines changed |
+
+## Deviations from Plan
+
+### Summary
+
+| Type | Count | Impact |
+|------|-------|--------|
+| Auto-fixed | 1 | PHP 7.2 warning eliminated |
+| Scope additions | 0 | — |
+| Deferred | 0 | — |
+
+**Total impact:** One opportunistic fix outside plan scope — essential (was causing visible red error on every page load).
+
+### Auto-fixed Issues
+
+**1. PHP 7.2 `count()` warning in FrontController**
+- **Found during:** User reported red error immediately after APPLY
+- **Issue:** `FrontController::GenerateTitle()` called `count($headers['title'])` where `$headers['title']` can be `null`; PHP 7.2+ raises E_WARNING
+- **Fix:** `$t = isset($headers['title']) && is_array($headers['title']) ? $headers['title'] : [];`
+- **Files:** `_rejestracja/core/class/FrontController.class.php:358`
+- **Verification:** Error no longer appears on page load
+
+## Next Phase Readiness
+
+**Ready:**
+- Milestone v0.2 complete — both client requests implemented
+- No open deferred issues
+
+**Concerns:**
+- None
+
+**Blockers:**
+- None
+
+---
+*Phase: 04-post-launch-fixes, Plan: 01*
+*Completed: 2026-04-28*
diff --git a/.vscode/ftp-kr.sync.cache.json b/.vscode/ftp-kr.sync.cache.json
index a94255b..a772589 100644
--- a/.vscode/ftp-kr.sync.cache.json
+++ b/.vscode/ftp-kr.sync.cache.json
@@ -1102,8 +1102,8 @@
},
"Index.tpl": {
"type": "-",
- "size": 29256,
- "lmtime": 1777296501335,
+ "size": 28666,
+ "lmtime": 1777368403260,
"modified": false
},
"Index.tpl.bak": {
diff --git a/_rejestracja/Admin/template/partial/Calc/Reg.tpl b/_rejestracja/Admin/template/partial/Calc/Reg.tpl
index 5bda0a4..afe5b71 100644
--- a/_rejestracja/Admin/template/partial/Calc/Reg.tpl
+++ b/_rejestracja/Admin/template/partial/Calc/Reg.tpl
@@ -46,7 +46,6 @@
Tytuł/stop. naukowy:{$obj->getDegree()}
Stanowisko: {$obj->getPosition()}
Telefon: {$obj->getPhone()}
- Fax: {$obj->getFax()}
Email: {$obj->getEmail()} |
Instytucja: {$obj->getInstitution()}
Ulica i numer: {$obj->getAddress()}
diff --git a/_rejestracja/Admin/template/partial/Calc/RegEdit.tpl b/_rejestracja/Admin/template/partial/Calc/RegEdit.tpl
index 03c8020..b21ac22 100644
--- a/_rejestracja/Admin/template/partial/Calc/RegEdit.tpl
+++ b/_rejestracja/Admin/template/partial/Calc/RegEdit.tpl
@@ -33,7 +33,6 @@ urlStatic = '{$urlStatic}';
Tytuł/stop. naukowy:{$objParticipant->getDegree()}
Stanowisko: {$objParticipant->getPosition()|default:$registrationMissing}
Telefon: {$objParticipant->getPhone()}
- Fax: {$objParticipant->getFax()|default:$registrationMissing}
Email: {$objParticipant->getEmail()}
|
diff --git a/_rejestracja/core/class/FrontController.class.php b/_rejestracja/core/class/FrontController.class.php
index 07c7729..1e8e663 100644
--- a/_rejestracja/core/class/FrontController.class.php
+++ b/_rejestracja/core/class/FrontController.class.php
@@ -355,7 +355,7 @@ class FrontController {
private function GenerateTitle() {
$headers = Registry::Get('headers');
//Utils::ArrayDisplay($headers);
- $t = $headers['title'];
+ $t = isset($headers['title']) && is_array($headers['title']) ? $headers['title'] : [];
if(count($t)>1) {
$title = implode($this->titleDelimiter, $t);
} else if (count($t) == 1) {
diff --git a/_rejestracja/template/partial/Index/Index.tpl b/_rejestracja/template/partial/Index/Index.tpl
index e43dbff..029b07b 100644
--- a/_rejestracja/template/partial/Index/Index.tpl
+++ b/_rejestracja/template/partial/Index/Index.tpl
@@ -42,10 +42,6 @@
{translate word='Telefon'}:
{formField name="phone" type="text" errorClass="warning"}
-
-
{translate word='Fax'}:
-
{formField name="fax" type="text" errorClass="warning"}
-
{translate word='email'}:
{formField name="email" type="text" errorClass="warning"}
@@ -220,6 +216,7 @@
$('#participation_option').val('full');
$('#one-day-lodging-days').hide();
$('#one-day-no-lodging-days').hide();
+ $('#conference_1').hide();
if (selectedId === 'conference_fee_1_lodging') {
$('#participation_option').val('one_day_lodging');
@@ -229,6 +226,8 @@
if (selectedId === 'conference_fee_1') {
$('#participation_option').val('one_day_no_lodging');
$('#one-day-no-lodging-days').css('display', 'flex');
+ $('#price_plus_room').prop('checked', false);
+ $('#price_plus_person').prop('checked', false);
}
}