update
This commit is contained in:
@@ -2,9 +2,9 @@
|
||||
|
||||
## Milestone v0.1: XXXV Konferencja Registration Update
|
||||
|
||||
Status: Complete
|
||||
Status: In progress
|
||||
|
||||
Progress: 2 of 2 phases complete (100%)
|
||||
Progress: 2 of 3 phases complete (67%)
|
||||
|
||||
### Phase 1: Registration Form Update
|
||||
Status: Complete
|
||||
@@ -23,3 +23,11 @@ Goal: Move new and related registration phrases into the editable dictionary so
|
||||
|
||||
Planned:
|
||||
- `02-01`: Complete - seeded dictionary phrases and updated registration templates to use translations.
|
||||
|
||||
### Phase 3: Registration Form Settings
|
||||
Status: Applying
|
||||
|
||||
Goal: Add an administrator "Ustawienia formularza" page for editable registration participation days and all prices used by the public form, mail/summary output, and server-side price calculation.
|
||||
|
||||
Planned:
|
||||
- `03-01`: Applied, awaiting unify - created settings helper, admin page, deployment seed, and connected public form pricing/day options to editable settings.
|
||||
|
||||
@@ -1,29 +1,29 @@
|
||||
## Current Position
|
||||
|
||||
Milestone: v0.1 XXXV Konferencja Registration Update
|
||||
Phase: 2 of 2 (Registration Dictionary Phrases) - Complete
|
||||
Plan: 02-01 complete
|
||||
Status: UNIFY complete, loop closed
|
||||
Last activity: 2026-04-24 21:25:19 +02:00 - Created `.paul/phases/02-registration-dictionary-phrases/02-01-SUMMARY.md`
|
||||
Phase: 3 of 3 (Registration Form Settings) - Planning
|
||||
Plan: 03-01 applied, awaiting unify
|
||||
Status: APPLY complete, ready for UNIFY
|
||||
Last activity: 2026-04-24 23:09:13 +02:00 - Added in-plan KSeF helper note under NIP field
|
||||
|
||||
Progress:
|
||||
- Milestone: [##########] 100%
|
||||
- Phase 2: [##########] 100%
|
||||
- Milestone: [#######---] 67%
|
||||
- Phase 3: [----------] 0%
|
||||
|
||||
## Loop Position
|
||||
|
||||
Current loop state:
|
||||
```text
|
||||
PLAN --> APPLY --> UNIFY
|
||||
* * * [Loop complete - milestone complete]
|
||||
* * o [Apply complete, awaiting unify]
|
||||
```
|
||||
|
||||
## Session Continuity
|
||||
|
||||
Last session: 2026-04-24 21:25:19 +02:00
|
||||
Stopped at: Plan 02-01 unified
|
||||
Next action: Apply dictionary seed on target server, then deploy/test as needed
|
||||
Resume file: `.paul/phases/02-registration-dictionary-phrases/02-01-SUMMARY.md`
|
||||
Last session: 2026-04-24 23:09:13 +02:00
|
||||
Stopped at: Plan 03-01 applied
|
||||
Next action: Run $paul-unify `.paul/phases/03-registration-form-settings/03-01-PLAN.md`
|
||||
Resume file: `.paul/phases/03-registration-form-settings/03-01-APPLY.md`
|
||||
|
||||
## Accumulated Context
|
||||
|
||||
@@ -32,9 +32,11 @@ Resume file: `.paul/phases/02-registration-dictionary-phrases/02-01-SUMMARY.md`
|
||||
|----------|-------|--------|
|
||||
| 2026-04-24: Use stable `registration_*` dictionary keys for registration-specific phrases | Phase 2 | Admin can edit visible registration wording without template changes. |
|
||||
| 2026-04-24: Preserve form values, persistence, pricing logic, and payment status values during dictionary refactor | Phase 2 | Registration behavior remains aligned with Phase 1. |
|
||||
| 2026-04-24: Plan form settings around `wp_setup` for new scalar/list settings and `mf_parameters` for existing price rows | Phase 3 | Avoids schema changes while exposing current calculation values in one admin screen. |
|
||||
|
||||
### Blockers/Concerns
|
||||
- Production must run `_rejestracja/sql/apply-2026-04-24-registration-dictionary-phrases.php?run=20260424` or apply the SQL file before dictionary entries are visible/editable.
|
||||
- Phase 3 will require applying `_rejestracja/sql/apply-2026-04-24-registration-form-settings.php?run=20260424` or the matching SQL seed after implementation.
|
||||
|
||||
### Deferred Issues
|
||||
- None.
|
||||
|
||||
51
.paul/phases/03-registration-form-settings/03-01-APPLY.md
Normal file
51
.paul/phases/03-registration-form-settings/03-01-APPLY.md
Normal file
@@ -0,0 +1,51 @@
|
||||
# APPLY Results: 03-01
|
||||
|
||||
Date: 2026-04-24 23:04:32 +02:00
|
||||
|
||||
## Completed Tasks
|
||||
|
||||
### Task 1: Add Shared Registration Settings Helper
|
||||
Status: pass
|
||||
|
||||
Notes:
|
||||
- Added `_rejestracja/core/class/RegistrationFormSettings.class.php` to centralize participation day lists, VAT multiplier, one-day prices, and existing `mf_parameters` price rows.
|
||||
- Added `_rejestracja/sql/2026-04-24-registration-form-settings.sql` with idempotent `wp_setup` inserts.
|
||||
- Added `_rejestracja/sql/apply-2026-04-24-registration-form-settings.php` as a guarded browser/CLI seed runner.
|
||||
- New list/scalar settings use `wp_setup`; existing calculator prices remain in `mf_parameters`.
|
||||
|
||||
### Task 2: Build Admin Form Settings Page
|
||||
Status: pass
|
||||
|
||||
Notes:
|
||||
- Added `_rejestracja/Admin/controller/FormSettingsController.php`.
|
||||
- Added `_rejestracja/Admin/template/partial/FormSettings/Index.tpl`.
|
||||
- Added the `Ustawienia formularza` admin menu link to Dictionary, Setup, and the new controller.
|
||||
- The admin form can edit participation days, one-day prices, VAT multiplier, and relevant `mf_parameters` price rows.
|
||||
|
||||
### Task 3: Use Settings in Public Form and Submit Pricing
|
||||
Status: pass
|
||||
|
||||
Notes:
|
||||
- Updated `_rejestracja/controller/IndexController.php` to load registration settings, pass them to Smarty/JavaScript, calculate VAT from the configured multiplier, and save one-day participant prices from settings.
|
||||
- Updated `_rejestracja/template/partial/Index/Index.tpl` to render configured `participation_days` lists and use configured one-day prices in `calculatePrice`.
|
||||
- Added a small KSeF ID helper note under the public NIP field as an in-plan follow-up.
|
||||
- Preserved public field names and stored values for existing registration flow compatibility.
|
||||
|
||||
## Verification
|
||||
|
||||
- `php -l _rejestracja/core/class/RegistrationFormSettings.class.php`: pass
|
||||
- `php -l _rejestracja/Admin/controller/FormSettingsController.php`: pass
|
||||
- `php -l _rejestracja/controller/IndexController.php`: pass
|
||||
- `php -l _rejestracja/sql/apply-2026-04-24-registration-form-settings.php`: pass
|
||||
- Hardcoded day/one-day price scan: pass; matches remain only in helper defaults and deployment seed files.
|
||||
- Admin menu scan: pass; Dictionary, Setup, and FormSettings include `Ustawienia formularza`.
|
||||
- NIP field helper note: pass; rendered under the existing NIP input without changing form field names.
|
||||
|
||||
## Deviations
|
||||
|
||||
- No schema changes were introduced; the plan's no-schema approach was followed.
|
||||
- Unrelated working tree entries were present and left untouched: `_rejestracja/Static/image/Admin/Thumbs.db` and `.vscode/ftp-kr.sync.cache.json`.
|
||||
|
||||
## Next Step
|
||||
|
||||
Run `$paul-unify .paul/phases/03-registration-form-settings/03-01-PLAN.md` to reconcile the plan and close the loop.
|
||||
179
.paul/phases/03-registration-form-settings/03-01-PLAN.md
Normal file
179
.paul/phases/03-registration-form-settings/03-01-PLAN.md
Normal file
@@ -0,0 +1,179 @@
|
||||
---
|
||||
phase: 03-registration-form-settings
|
||||
plan: 01
|
||||
type: execute
|
||||
wave: 1
|
||||
depends_on: []
|
||||
files_modified:
|
||||
- _rejestracja/core/class/RegistrationFormSettings.class.php
|
||||
- _rejestracja/Admin/controller/FormSettingsController.php
|
||||
- _rejestracja/Admin/template/partial/FormSettings/Index.tpl
|
||||
- _rejestracja/Admin/controller/DictionaryController.php
|
||||
- _rejestracja/Admin/controller/SetupController.php
|
||||
- _rejestracja/controller/IndexController.php
|
||||
- _rejestracja/template/partial/Index/Index.tpl
|
||||
- _rejestracja/sql/2026-04-24-registration-form-settings.sql
|
||||
- _rejestracja/sql/apply-2026-04-24-registration-form-settings.php
|
||||
autonomous: true
|
||||
delegation: off
|
||||
---
|
||||
|
||||
<objective>
|
||||
## Goal
|
||||
Add an administrator "Ustawienia formularza" page next to "Slowniki" and "Zmienne serwisu", and make registration day options plus every price used by the registration price calculation editable from that page.
|
||||
|
||||
## Purpose
|
||||
The registration form currently mixes editable `mf_parameters` prices with hardcoded one-day prices and hardcoded `participation_days` labels in the Smarty/JavaScript template. The client needs those operational values changeable at any time without editing source code.
|
||||
|
||||
## Output
|
||||
- New admin controller and template for form settings.
|
||||
- Shared settings helper for reading defaults from `wp_setup` and `mf_parameters`.
|
||||
- Public registration form and submit flow using the shared settings for day labels and pricing.
|
||||
- SQL and PHP migration runner to seed default settings on production.
|
||||
</objective>
|
||||
|
||||
<context>
|
||||
## Project Context
|
||||
@.paul/PROJECT.md
|
||||
@.paul/ROADMAP.md
|
||||
@.paul/STATE.md
|
||||
|
||||
## Prior Work
|
||||
@.paul/phases/01-registration-form-update/01-01-SUMMARY.md
|
||||
@.paul/phases/02-registration-dictionary-phrases/02-01-SUMMARY.md
|
||||
|
||||
## Source Files
|
||||
@_rejestracja/controller/IndexController.php
|
||||
@_rejestracja/template/partial/Index/Index.tpl
|
||||
@_rejestracja/Admin/controller/SetupController.php
|
||||
@_rejestracja/Admin/controller/DictionaryController.php
|
||||
@_rejestracja/Admin/template/partial/Setup/Index.tpl
|
||||
@_rejestracja/Admin/controller/CalcController.php
|
||||
@_rejestracja/Admin/template/partial/Calc/Add.tpl
|
||||
@_rejestracja/Admin/template/partial/Calc/Edit.tpl
|
||||
@_rejestracja/core/_model/SetupDAL.class.php
|
||||
@_rejestracja/core/_model/MfParameters.class.php
|
||||
@_rejestracja/core/_model/MfParametersDAL.class.php
|
||||
</context>
|
||||
|
||||
<acceptance_criteria>
|
||||
|
||||
## AC-1: Admin Menu Entry
|
||||
```gherkin
|
||||
Given an administrator is on the Dictionary or Setup admin area
|
||||
When the admin side menu renders
|
||||
Then the menu includes "Ustawienia formularza" linking to /_rejestracja/Admin/FormSettings/Index next to "Slowniki" and "Zmienne serwisu"
|
||||
```
|
||||
|
||||
## AC-2: Editable Participation Days
|
||||
```gherkin
|
||||
Given an administrator opens "Ustawienia formularza"
|
||||
When they edit the one-day with lodging and one-day without lodging day labels
|
||||
Then the public registration form renders those labels as participation_days radio options and submitted registrations store the selected configured label
|
||||
```
|
||||
|
||||
## AC-3: Editable Calculation Prices
|
||||
```gherkin
|
||||
Given an administrator opens "Ustawienia formularza"
|
||||
When they edit full conference prices, single-room/accompanying-person/English-conference surcharges, one-day prices, or VAT multiplier
|
||||
Then calculatePrice on the public form and the server-side saved participant price use the edited values consistently
|
||||
```
|
||||
|
||||
## AC-4: Deployment Seed
|
||||
```gherkin
|
||||
Given production has not yet created the new form settings variables
|
||||
When the deployment SQL or PHP runner is applied
|
||||
Then default settings are inserted without overwriting existing values and the form still shows the current three November day options and current prices
|
||||
```
|
||||
|
||||
</acceptance_criteria>
|
||||
|
||||
<tasks>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 1: Add Shared Registration Settings Helper</name>
|
||||
<files>_rejestracja/core/class/RegistrationFormSettings.class.php, _rejestracja/sql/2026-04-24-registration-form-settings.sql, _rejestracja/sql/apply-2026-04-24-registration-form-settings.php</files>
|
||||
<action>
|
||||
Create a `RegistrationFormSettings` helper that centralizes editable values:
|
||||
- Read/write day labels from `wp_setup` variables using a clear prefix such as `registration_form_days_lodging` and `registration_form_days_no_lodging`; store list values as newline-separated text to keep the existing `wp_setup` table unchanged.
|
||||
- Read/write the VAT multiplier from `wp_setup` as `registration_form_vat_multiplier`, defaulting to `1.23`.
|
||||
- Read/write one-day net prices from `wp_setup` as `registration_form_one_day_price_prom` and `registration_form_one_day_price_normal`, defaulting to `1300` and `1600`.
|
||||
- Read/write existing full conference and surcharge prices through `mf_parameters` rows, preserving IDs currently used by the form: `1` full conference, `2` single-room surcharge, `3` accompanying person/driver, `4` English conference, `5` legacy one-day.
|
||||
- Return a normalized settings array for templates containing `days_lodging`, `days_no_lodging`, `prices`, and `vat_multiplier`.
|
||||
- Provide save methods that normalize commas to dots for numbers, trim list entries, and leave unrelated `wp_setup` variables untouched.
|
||||
Add SQL and PHP runner files that seed the new `wp_setup` variables only when missing. Do not change database schema.
|
||||
</action>
|
||||
<verify>Run `php -l _rejestracja/core/class/RegistrationFormSettings.class.php` and `php -l _rejestracja/sql/apply-2026-04-24-registration-form-settings.php`.</verify>
|
||||
<done>AC-2, AC-3, and AC-4 have a shared source of truth and deployment defaults.</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 2: Build Admin Form Settings Page</name>
|
||||
<files>_rejestracja/Admin/controller/FormSettingsController.php, _rejestracja/Admin/template/partial/FormSettings/Index.tpl, _rejestracja/Admin/controller/DictionaryController.php, _rejestracja/Admin/controller/SetupController.php</files>
|
||||
<action>
|
||||
Add `FormSettingsController` with `IndexAction` and a `preDispatch` matching the existing admin controller style.
|
||||
- On GET, load settings through `RegistrationFormSettings` and assign them to Smarty.
|
||||
- On POST, validate required numeric fields with the existing `Validator` style where practical, save through the helper, and show an admin info/error message without redirect loops.
|
||||
- Template should group fields into participation days, main prices, surcharge prices, one-day prices, and VAT multiplier.
|
||||
- Update the local admin menu arrays in `DictionaryController`, `SetupController`, and the new controller to include `Ustawienia formularza` => `FormSettings`/`Index`.
|
||||
- Keep existing Dictionary and Setup behavior unchanged.
|
||||
</action>
|
||||
<verify>Run `php -l _rejestracja/Admin/controller/FormSettingsController.php` and inspect the generated route URL from the same `Router::GenerateUrl('dictpig', ...)` pattern used by Dictionary/Setup.</verify>
|
||||
<done>AC-1, AC-2, and AC-3 are satisfied from the administrator side.</done>
|
||||
</task>
|
||||
|
||||
<task type="auto">
|
||||
<name>Task 3: Use Settings in Public Form and Submit Pricing</name>
|
||||
<files>_rejestracja/controller/IndexController.php, _rejestracja/template/partial/Index/Index.tpl</files>
|
||||
<action>
|
||||
Replace hardcoded form settings with data from `RegistrationFormSettings`.
|
||||
- In `IndexController::IndexAction`, load settings once and assign JSON-safe arrays for `days_lodging`, `days_no_lodging`, `prices`, and `vat_multiplier`.
|
||||
- Replace hardcoded day radio labels in `Index.tpl` with Smarty loops over configured day arrays, keeping `name="participation_days"` and existing option visibility behavior.
|
||||
- Replace hardcoded JS one-day prices `1300/1600` and gross values `1599/1968` with the configured net prices and VAT multiplier; gross should be computed from net * VAT multiplier.
|
||||
- Update server-side `$resultPrice` calculation so conference fee `5` uses configured one-day promotional/normal price instead of relying on `mf_parameters` ID 5 when the selected `participation_option` is `one_day_lodging` or `one_day_no_lodging`.
|
||||
- Keep existing `mf_parameters` behavior for full conference and surcharges so saved registrations/admin summaries continue to resolve existing parameter rows.
|
||||
- Preserve legacy fallback for missing POST values and for old session/display data.
|
||||
</action>
|
||||
<verify>Run `php -l _rejestracja/controller/IndexController.php`, then manually inspect the rendered Smarty syntax for valid `{foreach}` blocks and JavaScript object output.</verify>
|
||||
<done>AC-2 and AC-3 are satisfied from the public form through persisted participant price.</done>
|
||||
</task>
|
||||
|
||||
</tasks>
|
||||
|
||||
<boundaries>
|
||||
|
||||
## DO NOT CHANGE
|
||||
- Existing `mf_participant` schema and participant status/payment semantics.
|
||||
- Existing dictionary phrase keys created in Phase 2.
|
||||
- Existing public form field names: `participation_days`, `participation_option`, `one_day_lodging`, `conference_fee`, and surcharge checkbox names.
|
||||
- Existing Dictionary and Setup edit flows beyond adding the new menu link.
|
||||
|
||||
## SCOPE LIMITS
|
||||
- Do not redesign the admin UI; follow the current table/dropdown container style.
|
||||
- Do not replace the legacy `mf_parameters` calculator module; expose the relevant rows in the new settings page and keep compatibility.
|
||||
- Do not add new third-party dependencies.
|
||||
- Do not alter compiled Smarty cache files under `temp/compile`.
|
||||
|
||||
</boundaries>
|
||||
|
||||
<verification>
|
||||
Before declaring plan complete:
|
||||
- [ ] `php -l _rejestracja/core/class/RegistrationFormSettings.class.php`
|
||||
- [ ] `php -l _rejestracja/Admin/controller/FormSettingsController.php`
|
||||
- [ ] `php -l _rejestracja/controller/IndexController.php`
|
||||
- [ ] `php -l _rejestracja/sql/apply-2026-04-24-registration-form-settings.php`
|
||||
- [ ] Confirm no hardcoded `3 listopada`, `4 listopada`, `5 listopada`, `3/4 listopada`, `4/5 listopada`, `1300`, `1600`, `1599`, or `1968` remain in active registration form pricing code except as migration/default seed values.
|
||||
- [ ] Confirm the admin menu in Dictionary, Setup, and FormSettings includes the new "Ustawienia formularza" entry.
|
||||
</verification>
|
||||
|
||||
<success_criteria>
|
||||
- Administrators can open `/_rejestracja/Admin/FormSettings/Index`.
|
||||
- The new page edits configured day options and all prices used by the current public registration calculation.
|
||||
- Public JS price preview and server-side saved price use the same configured values.
|
||||
- Deployment seed is idempotent and does not overwrite production edits.
|
||||
- All verification checks pass.
|
||||
</success_criteria>
|
||||
|
||||
<output>
|
||||
After completion, create `.paul/phases/03-registration-form-settings/03-01-SUMMARY.md`
|
||||
</output>
|
||||
454
.vscode/ftp-kr.sync.cache.json
vendored
Normal file
454
.vscode/ftp-kr.sync.cache.json
vendored
Normal file
@@ -0,0 +1,454 @@
|
||||
{
|
||||
"ftp://aktualia.com.pl:21@aktualia": {
|
||||
"www": {
|
||||
".htaccess": {
|
||||
"type": "-",
|
||||
"size": 726,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"NAWA": {},
|
||||
"_rejestracja": {
|
||||
".htaccess": {
|
||||
"type": "-",
|
||||
"size": 571,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
".htpasswd": {
|
||||
"type": "-",
|
||||
"size": 37,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"Admin": {
|
||||
"controller": {
|
||||
"CalcController.php": {
|
||||
"type": "-",
|
||||
"size": 9144,
|
||||
"lmtime": 1777037268858,
|
||||
"modified": false
|
||||
}
|
||||
},
|
||||
"template": {
|
||||
"partial": {
|
||||
"Calc": {
|
||||
"Add.tpl": {
|
||||
"type": "-",
|
||||
"size": 4064,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"Edit.tpl": {
|
||||
"type": "-",
|
||||
"size": 4135,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"Index.tpl": {
|
||||
"type": "-",
|
||||
"size": 2513,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"Reg.tpl": {
|
||||
"type": "-",
|
||||
"size": 7316,
|
||||
"lmtime": 1777058742417,
|
||||
"modified": false
|
||||
},
|
||||
"Reg.tpl.bak": {
|
||||
"type": "-",
|
||||
"size": 5077,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"RegEdit.tpl": {
|
||||
"type": "-",
|
||||
"size": 7786,
|
||||
"lmtime": 1777058742418,
|
||||
"modified": false
|
||||
},
|
||||
"RegPAN.tpl": {
|
||||
"type": "-",
|
||||
"size": 3909,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Server": {},
|
||||
"Static": {},
|
||||
"_Admin": {},
|
||||
"captcha.png": {
|
||||
"type": "-",
|
||||
"size": 159,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"controller": {
|
||||
"FileController.php": {
|
||||
"type": "-",
|
||||
"size": 1815,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"IndexController.php": {
|
||||
"type": "-",
|
||||
"size": 24230,
|
||||
"lmtime": 1777037695974,
|
||||
"modified": false
|
||||
},
|
||||
"ProductController.php": {
|
||||
"type": "-",
|
||||
"size": 4439,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"SearchController.php": {
|
||||
"type": "-",
|
||||
"size": 2280,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"SharedController.php": {
|
||||
"type": "-",
|
||||
"size": 37493,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"SimpleArticle": {},
|
||||
"TranslateController.php": {
|
||||
"type": "-",
|
||||
"size": 961,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
}
|
||||
},
|
||||
"core": {
|
||||
"model": {
|
||||
"MfParticipant.class.php": {
|
||||
"type": "-",
|
||||
"size": 10686,
|
||||
"lmtime": 1777036966082,
|
||||
"modified": false
|
||||
}
|
||||
},
|
||||
"_model": {
|
||||
"MfParticipant.class.php": {
|
||||
"type": "-",
|
||||
"size": 10492,
|
||||
"lmtime": 1777036966083,
|
||||
"modified": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"error.html": {
|
||||
"type": "-",
|
||||
"size": 55,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"index.php": {
|
||||
"type": "-",
|
||||
"size": 1574,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"info.php": {
|
||||
"type": "-",
|
||||
"size": 20,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"logs": {},
|
||||
"makl.php": {
|
||||
"type": "-",
|
||||
"size": 350,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"module": {},
|
||||
"readme.txt": {
|
||||
"type": "-",
|
||||
"size": 30,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"routes.php": {
|
||||
"type": "-",
|
||||
"size": 1470,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"tar.php": {
|
||||
"type": "-",
|
||||
"size": 359,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"temp": {},
|
||||
"template": {
|
||||
"partial": {
|
||||
"Index": {
|
||||
"AjaxForm.tpl": {
|
||||
"type": "-",
|
||||
"size": 3940,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"Captcha.tpl": {
|
||||
"type": "-",
|
||||
"size": 0,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"Index.tpl": {
|
||||
"type": "-",
|
||||
"size": 28715,
|
||||
"lmtime": 1777058498780,
|
||||
"modified": false
|
||||
},
|
||||
"Index.tpl.bak": {
|
||||
"type": "-",
|
||||
"size": 20523,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"IndexSent.tpl": {
|
||||
"type": "-",
|
||||
"size": 8558,
|
||||
"lmtime": 1777058549495,
|
||||
"modified": false
|
||||
},
|
||||
"IndexSent_.tpl_": {
|
||||
"type": "-",
|
||||
"size": 6281,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"IndexSent_good.tpl": {
|
||||
"type": "-",
|
||||
"size": 5874,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"Index_1data.tpl_": {
|
||||
"type": "-",
|
||||
"size": 19972,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"Index__.tp": {
|
||||
"type": "-",
|
||||
"size": 20332,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"Index_good.tpl": {
|
||||
"type": "-",
|
||||
"size": 20143,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"Index_pokonf.tp_": {
|
||||
"type": "-",
|
||||
"size": 20303,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"MailTxt.tpl": {
|
||||
"type": "-",
|
||||
"size": 286,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"Maps.tpl": {
|
||||
"type": "-",
|
||||
"size": 1737,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"_": {}
|
||||
}
|
||||
}
|
||||
},
|
||||
"zip.php": {
|
||||
"type": "-",
|
||||
"size": 856,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"sql": {
|
||||
"2026-04-24-registration-dictionary-phrases.sql": {
|
||||
"type": "-",
|
||||
"size": 13272,
|
||||
"lmtime": 1777058742415,
|
||||
"modified": false
|
||||
},
|
||||
"2026-04-24-registration-form-update.sql": {
|
||||
"type": "-",
|
||||
"size": 624,
|
||||
"lmtime": 1777037007411,
|
||||
"modified": false
|
||||
},
|
||||
"apply-2026-04-24-registration-dictionary-phrases.php": {
|
||||
"type": "-",
|
||||
"size": 7335,
|
||||
"lmtime": 1777058742416,
|
||||
"modified": false
|
||||
},
|
||||
"apply-2026-04-24-registration-form-update.php": {
|
||||
"type": "-",
|
||||
"size": 3804,
|
||||
"lmtime": 1777038005276,
|
||||
"modified": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"ankieta.html": {
|
||||
"type": "-",
|
||||
"size": 5679,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"bw": {},
|
||||
"css": {},
|
||||
"deklaracja_dostepnosci.html": {
|
||||
"type": "-",
|
||||
"size": 14085,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"flexslider.css": {
|
||||
"type": "-",
|
||||
"size": 7141,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"foto_2018": {},
|
||||
"foto_2019": {},
|
||||
"foto_2021": {},
|
||||
"foto_2022": {},
|
||||
"foto_2023": {},
|
||||
"foto_2025": {},
|
||||
"galeria.html": {
|
||||
"type": "-",
|
||||
"size": 5875,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"galeria_2018.html": {
|
||||
"type": "-",
|
||||
"size": 15666,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"galeria_2019.html": {
|
||||
"type": "-",
|
||||
"size": 10275,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"galeria_2021.html": {
|
||||
"type": "-",
|
||||
"size": 12994,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"galeria_2022.html": {
|
||||
"type": "-",
|
||||
"size": 11299,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"galeria_2023.html": {
|
||||
"type": "-",
|
||||
"size": 13716,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"galeria_2025.html": {
|
||||
"type": "-",
|
||||
"size": 15910,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"images": {},
|
||||
"img": {},
|
||||
"index.html": {
|
||||
"type": "-",
|
||||
"size": 9600,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"informacje.html": {
|
||||
"type": "-",
|
||||
"size": 9379,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"jquery.flexslider.js": {
|
||||
"type": "-",
|
||||
"size": 54943,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"js": {},
|
||||
"komitet_n.php": {
|
||||
"type": "-",
|
||||
"size": 3645,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"kontakt.html": {
|
||||
"type": "-",
|
||||
"size": 6326,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"materialy.html": {
|
||||
"type": "-",
|
||||
"size": 7896,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"nowe": {},
|
||||
"okonferencji.html": {
|
||||
"type": "-",
|
||||
"size": 11546,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"pliki": {},
|
||||
"program.html": {
|
||||
"type": "-",
|
||||
"size": 6058,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"program_wstep.html": {
|
||||
"type": "-",
|
||||
"size": 12024,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"rejestracja.html": {
|
||||
"type": "-",
|
||||
"size": 6354,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
},
|
||||
"sponsorzy": {},
|
||||
"style.css": {
|
||||
"type": "-",
|
||||
"size": 21547,
|
||||
"lmtime": 0,
|
||||
"modified": false
|
||||
}
|
||||
}
|
||||
},
|
||||
"$version": 1
|
||||
}
|
||||
@@ -108,6 +108,7 @@ class DictionaryController extends MainController implements ControllerInterface
|
||||
//'User' => array('User' => 'Index'),
|
||||
'Słowniki' => array('Dictionary' => 'Index'),
|
||||
'Zmienne serwisu' => array('Setup' => 'Index'),
|
||||
'Ustawienia formularza' => array('FormSettings' => 'Index'),
|
||||
// 'Kategorie produktów' => array('ProductCategory' => 'Index'),
|
||||
// 'Serie produktów' => array('ProductSeries' => 'Index'),
|
||||
// 'Materiał produktów' => array('ProductSpec' => 'Index', 'type' => 2),
|
||||
@@ -150,4 +151,4 @@ class DictionaryController extends MainController implements ControllerInterface
|
||||
|
||||
|
||||
|
||||
?>
|
||||
?>
|
||||
|
||||
61
_rejestracja/Admin/controller/FormSettingsController.php
Normal file
61
_rejestracja/Admin/controller/FormSettingsController.php
Normal file
@@ -0,0 +1,61 @@
|
||||
<?php
|
||||
|
||||
class FormSettingsController extends MainController implements ControllerInterface {
|
||||
|
||||
public function IndexAction($param) {
|
||||
$errors = array();
|
||||
|
||||
if (Request::GetPost('doFormSettingsEdit')) {
|
||||
$post = Request::GetAllPost();
|
||||
$errors = RegistrationFormSettings::Validate($post);
|
||||
|
||||
if (empty($errors)) {
|
||||
RegistrationFormSettings::SaveSettings($post);
|
||||
$this->smarty->assign('info', 'Zapisano ustawienia formularza.');
|
||||
$this->smarty->assign('type', 'ok');
|
||||
} else {
|
||||
$this->smarty->assign('info', 'Popraw pola formularza.');
|
||||
$this->smarty->assign('type', 'error');
|
||||
}
|
||||
}
|
||||
|
||||
$settings = RegistrationFormSettings::GetSettings();
|
||||
$this->smarty->assign('settings', $settings);
|
||||
$this->smarty->assign('errors', $errors);
|
||||
}
|
||||
|
||||
public function preDispatch($param) {
|
||||
$this->RunShared('Auth', $param);
|
||||
$this->Run($param);
|
||||
$admin = AuthDAL::GetAdmin();
|
||||
$this->user = $admin;
|
||||
|
||||
$this->smarty->assign('titleAdmin', 'Administracja');
|
||||
$struct = array(
|
||||
'Słowniki' => array('Dictionary' => 'Index'),
|
||||
'Zmienne serwisu' => array('Setup' => 'Index'),
|
||||
'Ustawienia formularza' => array('FormSettings' => 'Index'),
|
||||
);
|
||||
|
||||
$this->smarty->assign('structure', $this->renderStruct($struct));
|
||||
}
|
||||
|
||||
private function renderStruct($struct) {
|
||||
$return = '';
|
||||
|
||||
foreach ($struct as $k => $row) {
|
||||
$return .= '<li><a href="' . Router::GenerateUrl('dictpig', $row) . '">' . $k . '</a></li>';
|
||||
}
|
||||
|
||||
$html = '<ul>';
|
||||
$html .= $return;
|
||||
$html .= '</ul>';
|
||||
|
||||
return $html;
|
||||
}
|
||||
|
||||
public function postDispatch($param) {
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -144,6 +144,7 @@ class SetupController extends MainController implements ControllerInterface {
|
||||
//'User' => array('User' => 'Index'),
|
||||
'Słowniki' => array('Dictionary' => 'Index'),
|
||||
'Zmienne serwisu' => array('Setup' => 'Index'),
|
||||
'Ustawienia formularza' => array('FormSettings' => 'Index'),
|
||||
// 'Kategorie produktów' => array('ProductCategory' => 'Index'),
|
||||
// 'Serie produktów' => array('ProductSeries' => 'Index'),
|
||||
// 'Materiał produktów' => array('ProductSpec' => 'Index', 'type' => 2),
|
||||
@@ -179,4 +180,4 @@ class SetupController extends MainController implements ControllerInterface {
|
||||
|
||||
}
|
||||
}
|
||||
?>
|
||||
?>
|
||||
|
||||
72
_rejestracja/Admin/template/partial/FormSettings/Index.tpl
Normal file
72
_rejestracja/Admin/template/partial/FormSettings/Index.tpl
Normal file
@@ -0,0 +1,72 @@
|
||||
<div class="panelRightTop"></div>
|
||||
<div class="panelRightBody">
|
||||
<div class="paddedContent">
|
||||
{dropDownContainer title="Ustawienia formularza"}
|
||||
{if isset($info)}
|
||||
<div class="{if $type == 'error'}error{else}info{/if}">{$info}</div>
|
||||
{/if}
|
||||
<form method="post" action="">
|
||||
<table align="center" class="adminTable" cellpadding="2" cellspacing="2" style="width: 760px;">
|
||||
<tr>
|
||||
<th colspan="3">Dni udzialu</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="width: 240px;">Jeden dzien z noclegiem</td>
|
||||
<td><textarea name="registration_form_days_lodging" class="input" style="width: 420px; height: 70px;">{$settings.days_lodging_text}</textarea></td>
|
||||
<td>{if isset($errors.registration_form_days_lodging)}<span class="validate">{$errors.registration_form_days_lodging}</span>{/if}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Jeden dzien bez noclegu</td>
|
||||
<td><textarea name="registration_form_days_no_lodging" class="input" style="width: 420px; height: 90px;">{$settings.days_no_lodging_text}</textarea></td>
|
||||
<td>{if isset($errors.registration_form_days_no_lodging)}<span class="validate">{$errors.registration_form_days_no_lodging}</span>{/if}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="3">Ceny z parametrow formularza</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Nazwa</td>
|
||||
<td>Cena normalna netto</td>
|
||||
<td>Cena obnizona netto</td>
|
||||
</tr>
|
||||
{foreach from=$settings.prices key=priceKey item=price}
|
||||
{if $priceKey != 'one_day'}
|
||||
<tr>
|
||||
<td>{$price.name} (ID {$price.id})</td>
|
||||
<td><input type="text" name="price[{$price.id}]" value="{$price.price}" class="input" /></td>
|
||||
<td><input type="text" name="price_prom[{$price.id}]" value="{$price.price_prom}" class="input" /></td>
|
||||
</tr>
|
||||
{/if}
|
||||
{/foreach}
|
||||
<tr>
|
||||
<th colspan="3">Ceny jednego dnia</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Jeden dzien - cena obnizona netto</td>
|
||||
<td><input type="text" name="registration_form_one_day_price_prom" value="{$settings.one_day_price_prom}" class="input" /></td>
|
||||
<td>{if isset($errors.registration_form_one_day_price_prom)}<span class="validate">{$errors.registration_form_one_day_price_prom}</span>{/if}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Jeden dzien - cena normalna netto</td>
|
||||
<td><input type="text" name="registration_form_one_day_price_normal" value="{$settings.one_day_price_normal}" class="input" /></td>
|
||||
<td>{if isset($errors.registration_form_one_day_price_normal)}<span class="validate">{$errors.registration_form_one_day_price_normal}</span>{/if}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th colspan="3">VAT</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>Mnoznik VAT</td>
|
||||
<td><input type="text" name="registration_form_vat_multiplier" value="{$settings.vat_multiplier}" class="input" /></td>
|
||||
<td>{if isset($errors.registration_form_vat_multiplier)}<span class="validate">{$errors.registration_form_vat_multiplier}</span>{/if}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td></td>
|
||||
<td colspan="2">
|
||||
<input type="submit" value="Zapisz" name="doFormSettingsEdit" class="button buttonZapisz" />
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
</form>
|
||||
{/dropDownContainer}
|
||||
</div>
|
||||
</div>
|
||||
<div class="panelRightBottom"></div>
|
||||
Binary file not shown.
@@ -16,14 +16,19 @@ class IndexController extends MainController implements ControllerInterface {
|
||||
//Utils::ArrayDisplay($_POST);
|
||||
//SessionProxy::SetValue("infoSent",'true');
|
||||
|
||||
$registrationSettings = RegistrationFormSettings::GetSettings();
|
||||
$vatMultiplier = $registrationSettings['vat_multiplier'];
|
||||
$arrayPriceVat = array();
|
||||
$arrayPricePromVat = array();
|
||||
|
||||
$arrayPrice = Utils::GetArrayList('mf_parameters', 'id_mf_parameters', 'price');
|
||||
$arrayPriceProm = Utils::GetArrayList('mf_parameters', 'id_mf_parameters', 'price_prom');
|
||||
foreach ($arrayPrice as $key => $price) {
|
||||
$priceVat = $price*1.23;
|
||||
$priceVat = $price*$vatMultiplier;
|
||||
$arrayPriceVat[$key] = $priceVat;
|
||||
}
|
||||
foreach ($arrayPriceProm as $key => $price) {
|
||||
$priceVat = $price*1.23;
|
||||
$priceVat = $price*$vatMultiplier;
|
||||
$arrayPricePromVat[$key] = $priceVat;
|
||||
}
|
||||
|
||||
@@ -32,6 +37,9 @@ class IndexController extends MainController implements ControllerInterface {
|
||||
$this->smarty->assign('arrayPriceVatJson', str_replace('"', '', json_encode($arrayPriceVat)));
|
||||
$this->smarty->assign('arrayPricePromJson', str_replace('"', '', json_encode($arrayPriceProm)));
|
||||
$this->smarty->assign('arrayPricePromVatJson', json_encode($arrayPricePromVat));
|
||||
$this->smarty->assign('registrationSettings', $registrationSettings);
|
||||
$this->smarty->assign('registrationPricesJson', json_encode($registrationSettings['prices']));
|
||||
$this->smarty->assign('registrationVatMultiplier', $vatMultiplier);
|
||||
|
||||
|
||||
$type = 1;
|
||||
@@ -213,11 +221,20 @@ class IndexController extends MainController implements ControllerInterface {
|
||||
$arrayPrice2Value = array();
|
||||
|
||||
$objParticipant->setFeeFull(serialize($arrayFee));
|
||||
if (isset($arrayFee['disc'])) {
|
||||
unset($arrayFee['disc']);
|
||||
$arrayFeeForCalculation = $arrayFee;
|
||||
if (isset($arrayFeeForCalculation['disc'])) {
|
||||
unset($arrayFeeForCalculation['disc']);
|
||||
}
|
||||
if (Request::GetPost('conference_fee') == 5) {
|
||||
$resultPrice = RegistrationFormSettings::GetOneDayPrice(Request::GetPost('conference_fee_disc'));
|
||||
foreach ($arrayFeeForCalculation as $feeKey => $feeValue) {
|
||||
if ($feeValue == 5) {
|
||||
unset($arrayFeeForCalculation[$feeKey]);
|
||||
}
|
||||
}
|
||||
}
|
||||
foreach ($arrayObjParameters as $objParam) {
|
||||
if (in_array($objParam->GetId(), $arrayFee) != '') {
|
||||
if (in_array($objParam->GetId(), $arrayFeeForCalculation) != '') {
|
||||
if (Request::GetPost('conference_fee_disc') == 2) {
|
||||
if($objParam->GetId() != 2 || $_POST['fee_room1'] != null){
|
||||
$resultPrice = $resultPrice + $objParam->getPrice();
|
||||
|
||||
211
_rejestracja/core/class/RegistrationFormSettings.class.php
Normal file
211
_rejestracja/core/class/RegistrationFormSettings.class.php
Normal file
@@ -0,0 +1,211 @@
|
||||
<?php
|
||||
|
||||
class RegistrationFormSettings {
|
||||
|
||||
const DAYS_LODGING = 'registration_form_days_lodging';
|
||||
const DAYS_NO_LODGING = 'registration_form_days_no_lodging';
|
||||
const VAT_MULTIPLIER = 'registration_form_vat_multiplier';
|
||||
const ONE_DAY_PRICE_PROM = 'registration_form_one_day_price_prom';
|
||||
const ONE_DAY_PRICE_NORMAL = 'registration_form_one_day_price_normal';
|
||||
|
||||
private static $defaults = array(
|
||||
'registration_form_days_lodging' => "3/4 listopada\n4/5 listopada",
|
||||
'registration_form_days_no_lodging' => "3 listopada\n4 listopada\n5 listopada",
|
||||
'registration_form_vat_multiplier' => '1.23',
|
||||
'registration_form_one_day_price_prom' => '1300',
|
||||
'registration_form_one_day_price_normal' => '1600',
|
||||
);
|
||||
|
||||
private static $priceParameterIds = array(
|
||||
'full_conference' => 1,
|
||||
'single_room' => 2,
|
||||
'accompanying_person' => 3,
|
||||
'english_conference' => 4,
|
||||
'legacy_one_day' => 5,
|
||||
);
|
||||
|
||||
public static function GetSettings() {
|
||||
$variables = self::GetVariables();
|
||||
$vatMultiplier = self::NormalizeNumber(self::GetVariableValue($variables, self::VAT_MULTIPLIER));
|
||||
|
||||
if (!$vatMultiplier) {
|
||||
$vatMultiplier = self::$defaults[self::VAT_MULTIPLIER];
|
||||
}
|
||||
|
||||
return array(
|
||||
'days_lodging_text' => self::GetVariableValue($variables, self::DAYS_LODGING),
|
||||
'days_no_lodging_text' => self::GetVariableValue($variables, self::DAYS_NO_LODGING),
|
||||
'days_lodging' => self::ParseList(self::GetVariableValue($variables, self::DAYS_LODGING)),
|
||||
'days_no_lodging' => self::ParseList(self::GetVariableValue($variables, self::DAYS_NO_LODGING)),
|
||||
'vat_multiplier' => (float)$vatMultiplier,
|
||||
'one_day_price_prom' => (float)self::NormalizeNumber(self::GetVariableValue($variables, self::ONE_DAY_PRICE_PROM)),
|
||||
'one_day_price_normal' => (float)self::NormalizeNumber(self::GetVariableValue($variables, self::ONE_DAY_PRICE_NORMAL)),
|
||||
'prices' => self::GetPriceSettings((float)$vatMultiplier),
|
||||
);
|
||||
}
|
||||
|
||||
public static function SaveSettings($post) {
|
||||
self::SaveVariable(self::DAYS_LODGING, self::NormalizeListText($post[self::DAYS_LODGING]), 'Dni udzialu - jeden dzien z noclegiem');
|
||||
self::SaveVariable(self::DAYS_NO_LODGING, self::NormalizeListText($post[self::DAYS_NO_LODGING]), 'Dni udzialu - jeden dzien bez noclegu');
|
||||
self::SaveVariable(self::VAT_MULTIPLIER, self::NormalizeNumber($post[self::VAT_MULTIPLIER]), 'Mnoznik VAT dla cen formularza rejestracji');
|
||||
self::SaveVariable(self::ONE_DAY_PRICE_PROM, self::NormalizeNumber($post[self::ONE_DAY_PRICE_PROM]), 'Cena netto promocyjna - jeden dzien');
|
||||
self::SaveVariable(self::ONE_DAY_PRICE_NORMAL, self::NormalizeNumber($post[self::ONE_DAY_PRICE_NORMAL]), 'Cena netto normalna - jeden dzien');
|
||||
|
||||
foreach (self::$priceParameterIds as $key => $id) {
|
||||
if (!isset($post['price'][$id])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$objParam = MfParametersDAL::GetById($id);
|
||||
if (!$objParam || $objParam->GetId() == '-1') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$price = isset($post['price'][$id]) ? self::NormalizeNumber($post['price'][$id]) : '';
|
||||
$priceProm = isset($post['price_prom'][$id]) ? self::NormalizeNumber($post['price_prom'][$id]) : '';
|
||||
$objParam->setPrice($price);
|
||||
$objParam->setPriceProm($priceProm);
|
||||
MfParametersDAL::Save($objParam);
|
||||
}
|
||||
}
|
||||
|
||||
public static function Validate($post) {
|
||||
$errors = array();
|
||||
$required = array(
|
||||
self::DAYS_LODGING => 'Podaj dni dla opcji z noclegiem.',
|
||||
self::DAYS_NO_LODGING => 'Podaj dni dla opcji bez noclegu.',
|
||||
self::VAT_MULTIPLIER => 'Podaj mnoznik VAT.',
|
||||
self::ONE_DAY_PRICE_PROM => 'Podaj cene promocyjna za jeden dzien.',
|
||||
self::ONE_DAY_PRICE_NORMAL => 'Podaj cene normalna za jeden dzien.',
|
||||
);
|
||||
|
||||
foreach ($required as $field => $message) {
|
||||
if (!isset($post[$field]) || trim($post[$field]) === '') {
|
||||
$errors[$field] = $message;
|
||||
}
|
||||
}
|
||||
|
||||
foreach (array(self::VAT_MULTIPLIER, self::ONE_DAY_PRICE_PROM, self::ONE_DAY_PRICE_NORMAL) as $field) {
|
||||
if (isset($post[$field]) && trim($post[$field]) !== '' && !self::IsNumber($post[$field])) {
|
||||
$errors[$field] = 'Pole musi byc liczba.';
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($post['price']) && is_array($post['price'])) {
|
||||
foreach ($post['price'] as $id => $value) {
|
||||
if (trim($value) !== '' && !self::IsNumber($value)) {
|
||||
$errors['price_' . $id] = 'Cena musi byc liczba.';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($post['price_prom']) && is_array($post['price_prom'])) {
|
||||
foreach ($post['price_prom'] as $id => $value) {
|
||||
if (trim($value) !== '' && !self::IsNumber($value)) {
|
||||
$errors['price_prom_' . $id] = 'Cena promocyjna musi byc liczba.';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $errors;
|
||||
}
|
||||
|
||||
public static function GetOneDayPrice($discountType) {
|
||||
$settings = self::GetSettings();
|
||||
return $discountType == 2 ? $settings['one_day_price_normal'] : $settings['one_day_price_prom'];
|
||||
}
|
||||
|
||||
public static function GetVatMultiplier() {
|
||||
$settings = self::GetSettings();
|
||||
return $settings['vat_multiplier'];
|
||||
}
|
||||
|
||||
private static function GetPriceSettings($vatMultiplier) {
|
||||
$prices = array();
|
||||
|
||||
foreach (self::$priceParameterIds as $key => $id) {
|
||||
$objParam = MfParametersDAL::GetById($id);
|
||||
$net = $objParam && $objParam->GetId() != '-1' ? (float)$objParam->GetPrice() : 0;
|
||||
$prom = $objParam && $objParam->GetId() != '-1' ? (float)$objParam->GetPriceProm() : 0;
|
||||
|
||||
$prices[$key] = array(
|
||||
'id' => $id,
|
||||
'name' => $objParam && $objParam->GetId() != '-1' ? $objParam->GetName() : '',
|
||||
'price' => $net,
|
||||
'price_prom' => $prom,
|
||||
'price_vat' => $net * $vatMultiplier,
|
||||
'price_prom_vat' => $prom * $vatMultiplier,
|
||||
);
|
||||
}
|
||||
|
||||
$prices['one_day'] = array(
|
||||
'price_prom' => (float)self::GetVariableRaw(self::ONE_DAY_PRICE_PROM),
|
||||
'price_normal' => (float)self::GetVariableRaw(self::ONE_DAY_PRICE_NORMAL),
|
||||
);
|
||||
|
||||
return $prices;
|
||||
}
|
||||
|
||||
private static function GetVariables() {
|
||||
$variables = array();
|
||||
$db = Registry::Get('db');
|
||||
$stmt = $db->execute("select variable,value,description from wp_setup order by variable,value");
|
||||
$array = $stmt->FetchAllAssoc();
|
||||
|
||||
foreach ($array as $variable) {
|
||||
$variables[$variable['variable']] = array(
|
||||
'variable' => $variable['variable'],
|
||||
'value' => $variable['value'],
|
||||
'description' => $variable['description'],
|
||||
);
|
||||
}
|
||||
|
||||
return $variables;
|
||||
}
|
||||
|
||||
private static function GetVariableValue($variables, $name) {
|
||||
if (isset($variables[$name])) {
|
||||
return $variables[$name]['value'];
|
||||
}
|
||||
|
||||
return self::$defaults[$name];
|
||||
}
|
||||
|
||||
private static function GetVariableRaw($name) {
|
||||
$variables = self::GetVariables();
|
||||
return self::NormalizeNumber(self::GetVariableValue($variables, $name));
|
||||
}
|
||||
|
||||
private static function SaveVariable($name, $value, $description) {
|
||||
SetupDAL::SaveVariable($name, $value, $description);
|
||||
}
|
||||
|
||||
private static function ParseList($text) {
|
||||
$text = str_replace(array("\r\n", "\r"), "\n", $text);
|
||||
$items = explode("\n", $text);
|
||||
$return = array();
|
||||
|
||||
foreach ($items as $item) {
|
||||
$item = trim($item);
|
||||
if ($item !== '') {
|
||||
$return[] = $item;
|
||||
}
|
||||
}
|
||||
|
||||
return $return;
|
||||
}
|
||||
|
||||
private static function NormalizeListText($text) {
|
||||
return implode("\n", self::ParseList($text));
|
||||
}
|
||||
|
||||
private static function NormalizeNumber($value) {
|
||||
return str_replace(',', '.', trim($value));
|
||||
}
|
||||
|
||||
private static function IsNumber($value) {
|
||||
return is_numeric(self::NormalizeNumber($value));
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
22
_rejestracja/sql/2026-04-24-registration-form-settings.sql
Normal file
22
_rejestracja/sql/2026-04-24-registration-form-settings.sql
Normal file
@@ -0,0 +1,22 @@
|
||||
INSERT INTO wp_setup (`variable`, `value`, `description`)
|
||||
SELECT 'registration_form_days_lodging', '3/4 listopada
|
||||
4/5 listopada', 'Dni udzialu - jeden dzien z noclegiem'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM wp_setup WHERE `variable` = 'registration_form_days_lodging');
|
||||
|
||||
INSERT INTO wp_setup (`variable`, `value`, `description`)
|
||||
SELECT 'registration_form_days_no_lodging', '3 listopada
|
||||
4 listopada
|
||||
5 listopada', 'Dni udzialu - jeden dzien bez noclegu'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM wp_setup WHERE `variable` = 'registration_form_days_no_lodging');
|
||||
|
||||
INSERT INTO wp_setup (`variable`, `value`, `description`)
|
||||
SELECT 'registration_form_vat_multiplier', '1.23', 'Mnoznik VAT dla cen formularza rejestracji'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM wp_setup WHERE `variable` = 'registration_form_vat_multiplier');
|
||||
|
||||
INSERT INTO wp_setup (`variable`, `value`, `description`)
|
||||
SELECT 'registration_form_one_day_price_prom', '1300', 'Cena netto promocyjna - jeden dzien'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM wp_setup WHERE `variable` = 'registration_form_one_day_price_prom');
|
||||
|
||||
INSERT INTO wp_setup (`variable`, `value`, `description`)
|
||||
SELECT 'registration_form_one_day_price_normal', '1600', 'Cena netto normalna - jeden dzien'
|
||||
WHERE NOT EXISTS (SELECT 1 FROM wp_setup WHERE `variable` = 'registration_form_one_day_price_normal');
|
||||
145
_rejestracja/sql/apply-2026-04-24-registration-form-settings.php
Normal file
145
_rejestracja/sql/apply-2026-04-24-registration-form-settings.php
Normal file
@@ -0,0 +1,145 @@
|
||||
<?php
|
||||
/**
|
||||
* One-off form settings seed for XXXV Konferencja registration.
|
||||
*
|
||||
* Usage:
|
||||
* - Browser: /_rejestracja/sql/apply-2026-04-24-registration-form-settings.php?run=20260424
|
||||
* - CLI: php apply-2026-04-24-registration-form-settings.php --run
|
||||
*
|
||||
* Remove this file from the server after a successful production run.
|
||||
*/
|
||||
|
||||
ini_set('display_errors', 1);
|
||||
error_reporting(E_ALL);
|
||||
|
||||
$settings = array(
|
||||
'registration_form_days_lodging' => array(
|
||||
'value' => "3/4 listopada\n4/5 listopada",
|
||||
'description' => 'Dni udzialu - jeden dzien z noclegiem',
|
||||
),
|
||||
'registration_form_days_no_lodging' => array(
|
||||
'value' => "3 listopada\n4 listopada\n5 listopada",
|
||||
'description' => 'Dni udzialu - jeden dzien bez noclegu',
|
||||
),
|
||||
'registration_form_vat_multiplier' => array(
|
||||
'value' => '1.23',
|
||||
'description' => 'Mnoznik VAT dla cen formularza rejestracji',
|
||||
),
|
||||
'registration_form_one_day_price_prom' => array(
|
||||
'value' => '1300',
|
||||
'description' => 'Cena netto promocyjna - jeden dzien',
|
||||
),
|
||||
'registration_form_one_day_price_normal' => array(
|
||||
'value' => '1600',
|
||||
'description' => 'Cena netto normalna - jeden dzien',
|
||||
),
|
||||
);
|
||||
|
||||
$isCli = PHP_SAPI === 'cli';
|
||||
$approved = $isCli
|
||||
? in_array('--run', $argv, true)
|
||||
: (isset($_GET['run']) && $_GET['run'] === '20260424');
|
||||
|
||||
header_safe('Content-Type: text/plain; charset=utf-8');
|
||||
|
||||
if (!$approved) {
|
||||
echo "DRY RUN ONLY\n";
|
||||
echo "To apply form settings seed, run with ?run=20260424 in browser or --run in CLI.\n";
|
||||
echo "No database changes were made.\n";
|
||||
exit;
|
||||
}
|
||||
|
||||
$configPath = __DIR__ . '/../core/config/Strona/db.config.ini';
|
||||
if (!is_file($configPath)) {
|
||||
fail("Config file not found: " . $configPath);
|
||||
}
|
||||
|
||||
$config = parse_ini_file($configPath, true);
|
||||
if (!isset($config['db'])) {
|
||||
fail("Missing [db] section in config.");
|
||||
}
|
||||
|
||||
$dbConfig = $config['db'];
|
||||
foreach (array('prodHost', 'prodUser', 'prodPass', 'prodDb') as $key) {
|
||||
if (!array_key_exists($key, $dbConfig)) {
|
||||
fail("Missing db config key: " . $key);
|
||||
}
|
||||
}
|
||||
|
||||
$mysqli = new mysqli(
|
||||
$dbConfig['prodHost'],
|
||||
$dbConfig['prodUser'],
|
||||
$dbConfig['prodPass'],
|
||||
$dbConfig['prodDb']
|
||||
);
|
||||
|
||||
if ($mysqli->connect_errno) {
|
||||
fail("MySQL connection failed: " . $mysqli->connect_error);
|
||||
}
|
||||
|
||||
$mysqli->set_charset('utf8');
|
||||
|
||||
echo "Applying registration form settings seed...\n";
|
||||
|
||||
$inserted = 0;
|
||||
$skipped = 0;
|
||||
|
||||
foreach ($settings as $variable => $row) {
|
||||
if (setup_variable_exists($mysqli, $variable)) {
|
||||
$skipped++;
|
||||
continue;
|
||||
}
|
||||
|
||||
insert_setup_variable($mysqli, $variable, $row['value'], $row['description']);
|
||||
$inserted++;
|
||||
}
|
||||
|
||||
echo "Form settings seed complete.\n";
|
||||
echo "Inserted: " . $inserted . "\n";
|
||||
echo "Skipped: " . $skipped . "\n";
|
||||
$mysqli->close();
|
||||
|
||||
function setup_variable_exists(mysqli $mysqli, $variable) {
|
||||
$stmt = $mysqli->prepare("SELECT COUNT(*) AS cnt FROM wp_setup WHERE variable = ?");
|
||||
if (!$stmt) {
|
||||
fail("Prepare failed: " . $mysqli->error);
|
||||
}
|
||||
|
||||
$stmt->bind_param('s', $variable);
|
||||
if (!$stmt->execute()) {
|
||||
fail("Setup check failed: " . $stmt->error);
|
||||
}
|
||||
|
||||
$result = $stmt->get_result();
|
||||
$row = $result->fetch_assoc();
|
||||
$stmt->close();
|
||||
|
||||
return isset($row['cnt']) && (int)$row['cnt'] > 0;
|
||||
}
|
||||
|
||||
function insert_setup_variable(mysqli $mysqli, $variable, $value, $description) {
|
||||
$stmt = $mysqli->prepare("INSERT INTO wp_setup (variable, value, description) VALUES (?, ?, ?)");
|
||||
if (!$stmt) {
|
||||
fail("Prepare failed: " . $mysqli->error);
|
||||
}
|
||||
|
||||
$stmt->bind_param('sss', $variable, $value, $description);
|
||||
if (!$stmt->execute()) {
|
||||
fail("Insert failed for " . $variable . ": " . $stmt->error);
|
||||
}
|
||||
|
||||
$stmt->close();
|
||||
}
|
||||
|
||||
function fail($message) {
|
||||
echo "ERROR: " . $message . "\n";
|
||||
exit(1);
|
||||
}
|
||||
|
||||
function header_safe($header) {
|
||||
if (!headers_sent() && PHP_SAPI !== 'cli') {
|
||||
header($header);
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
@@ -72,7 +72,10 @@
|
||||
</div>
|
||||
<div class="entry">
|
||||
<div class="label">{translate word='NIP Instytucji'}:</div>
|
||||
<div class="value">{formField name="nip" type="text" errorClass="warning"}</div>
|
||||
<div class="value">
|
||||
{formField name="nip" type="text" errorClass="warning"}
|
||||
<div style="font-size: 11px; line-height: 1.3; margin-top: 4px;">{translate word='Do wypełnienia w przypadku posiadania identyfikatora wewnętrznego w KSEF i prośba o podanie KSeF ID wew.'}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="cb"></div>
|
||||
<div class="entry">
|
||||
@@ -178,32 +181,27 @@
|
||||
</div>
|
||||
<div class="show--day-select" id="one-day-lodging-days" style="display:none; width:100%; margin-bottom:30px; flex-direction:column; gap:10px;">
|
||||
<span>{translate word='registration_select_day'}:</span>
|
||||
<label class="control control--radio">3/4 listopada
|
||||
<input type="radio" name="participation_days" value="3/4 listopada" />
|
||||
<div class="control__indicator"></div>
|
||||
</label>
|
||||
<label class="control control--radio">4/5 listopada
|
||||
<input type="radio" name="participation_days" value="4/5 listopada" />
|
||||
{foreach from=$registrationSettings.days_lodging item=day}
|
||||
<label class="control control--radio">{$day}
|
||||
<input type="radio" name="participation_days" value="{$day}" />
|
||||
<div class="control__indicator"></div>
|
||||
</label>
|
||||
{/foreach}
|
||||
</div>
|
||||
<div class="show--day-select" id="one-day-no-lodging-days" style="display:none; width:100%; margin-bottom:30px; flex-direction:column; gap:10px;">
|
||||
<span>{translate word='registration_select_day'}:</span>
|
||||
<label class="control control--radio">3 listopada
|
||||
<input type="radio" name="participation_days" value="3 listopada" />
|
||||
<div class="control__indicator"></div>
|
||||
</label>
|
||||
<label class="control control--radio">4 listopada
|
||||
<input type="radio" name="participation_days" value="4 listopada" />
|
||||
<div class="control__indicator"></div>
|
||||
</label>
|
||||
<label class="control control--radio">5 listopada
|
||||
<input type="radio" name="participation_days" value="5 listopada" />
|
||||
{foreach from=$registrationSettings.days_no_lodging item=day}
|
||||
<label class="control control--radio">{$day}
|
||||
<input type="radio" name="participation_days" value="{$day}" />
|
||||
<div class="control__indicator"></div>
|
||||
</label>
|
||||
{/foreach}
|
||||
</div>
|
||||
<script>
|
||||
{literal}
|
||||
var registrationPrices = {/literal}{$registrationPricesJson}{literal};
|
||||
var registrationVatMultiplier = parseFloat('{/literal}{$registrationVatMultiplier}{literal}');
|
||||
|
||||
$(function () {
|
||||
$('#conference_1').show();
|
||||
calculatePrice();
|
||||
@@ -254,13 +252,13 @@
|
||||
}
|
||||
|
||||
if ($('#conference_fee_1').is(':checked')) {
|
||||
sumPrice = !promo ? 1300 : 1600;
|
||||
sumPriceVat = !promo ? 1599 : 1968;
|
||||
sumPrice = !promo ? parseFloat(registrationPrices.one_day.price_prom) : parseFloat(registrationPrices.one_day.price_normal);
|
||||
sumPriceVat = sumPrice * registrationVatMultiplier;
|
||||
price_info += '1-dniowa';
|
||||
}
|
||||
if ($('#conference_fee_1_lodging').is(':checked')) {
|
||||
sumPrice = !promo ? 1300 : 1600;
|
||||
sumPriceVat = !promo ? 1599 : 1968;
|
||||
sumPrice = !promo ? parseFloat(registrationPrices.one_day.price_prom) : parseFloat(registrationPrices.one_day.price_normal);
|
||||
sumPriceVat = sumPrice * registrationVatMultiplier;
|
||||
price_info += '1-dniowa z noclegiem';
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user