From 4ca7f035c0c440e848f4df6e08153c3587cc5596 Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Sun, 15 Mar 2026 01:07:21 +0100 Subject: [PATCH] update --- .gitignore | 1 + .paul/STATE.md | 18 +- .paul/config.md | 33 +++ .../phases/02-critical-bugs-fix/02-01-PLAN.md | 245 ++++++++++++++++++ .vscode/ftp-kr.json | 1 + .vscode/ftp-kr.sync.cache.json | 24 +- autoload/controls/class.Tasks.php | 20 ++ templates/tasks/main_view.php | 31 +++ templates/tasks/task_popup.php | 23 +- 9 files changed, 374 insertions(+), 22 deletions(-) create mode 100644 .gitignore create mode 100644 .paul/config.md create mode 100644 .paul/phases/02-critical-bugs-fix/02-01-PLAN.md diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8b6721e --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.scannerwork/ diff --git a/.paul/STATE.md b/.paul/STATE.md index 0f14d9d..d65a20f 100644 --- a/.paul/STATE.md +++ b/.paul/STATE.md @@ -10,10 +10,10 @@ See: .paul/PROJECT.md (updated 2026-03-15) ## Current Position Milestone: v0.1 Stabilizacja i jakość kodu -Phase: 2 of 4 (Naprawa błędów krytycznych) — Not started -Plan: Not started -Status: Ready to plan -Last activity: 2026-03-15 — Phase 1 complete, transitioned to Phase 2 +Phase: 2 of 4 (Naprawa błędów krytycznych) — Planning +Plan: 02-01 created, awaiting approval +Status: PLAN created, ready for APPLY +Last activity: 2026-03-15 — Created .paul/phases/02-critical-bugs-fix/02-01-PLAN.md Progress: - Milestone: [██░░░░░░░░] 25% @@ -24,7 +24,7 @@ Progress: Current loop state: ``` PLAN ──▶ APPLY ──▶ UNIFY - ○ ○ ○ [Ready to plan Phase 2] + ✓ ○ ○ [Plan created, awaiting approval] ``` ## Accumulated Context @@ -40,16 +40,16 @@ None yet. None. ### Git State -Last commit: (pending phase commit) +Last commit: e92c9fe Branch: main Feature branches merged: none ## Session Continuity Last session: 2026-03-15 -Stopped at: Phase 1 complete, ready to plan Phase 2 -Next action: /paul:plan for Phase 2 -Resume file: .paul/ROADMAP.md +Stopped at: Plan 02-01 created +Next action: Review and approve plan, then run /paul:apply +Resume file: .paul/phases/02-critical-bugs-fix/02-01-PLAN.md --- *STATE.md — Updated after every significant action* diff --git a/.paul/config.md b/.paul/config.md new file mode 100644 index 0000000..6f92b63 --- /dev/null +++ b/.paul/config.md @@ -0,0 +1,33 @@ +# Project Config + +**Project:** crmPRO +**Created:** 2026-03-15 + +## Project Settings + +```yaml +project: + name: crmPRO + version: 0.0.0 +``` + +## Integrations + +### SonarQube + +```yaml +sonarqube: + enabled: true + project_key: crmPRO +``` + +## Preferences + +```yaml +preferences: + auto_commit: false + verbose_output: false +``` + +--- +*Config created: 2026-03-15* diff --git a/.paul/phases/02-critical-bugs-fix/02-01-PLAN.md b/.paul/phases/02-critical-bugs-fix/02-01-PLAN.md new file mode 100644 index 0000000..b363803 --- /dev/null +++ b/.paul/phases/02-critical-bugs-fix/02-01-PLAN.md @@ -0,0 +1,245 @@ +--- +phase: 02-critical-bugs-fix +plan: 01 +type: execute +wave: 1 +depends_on: ["01-01"] +files_modified: + - autoload/controls/class.Tasks.php + - autoload/controls/class.Users.php + - autoload/class.S.php + - autoload/class.Excel.php + - autoload/class.Tpl.php + - autoload/factory/class.Projects.php + - autoload/factory/class.Tasks.php + - templates/finances/main-view.php + - templates/finances/operations-list.php + - templates/tasks/work-time.php + - templates/projects/tasks.php + - templates/site/layout-cron.php + - templates/tasks/task_single.php +autonomous: false +--- + + +## Goal +Naprawić wszystkie 58 bugów zidentyfikowanych w SonarQube baseline — 3 CRITICAL, 35 MAJOR, 20 MINOR. + +## Purpose +Poprawa Reliability Rating z D do B lub lepszej. Eliminacja bugów logicznych (return z void, unreachable code, self-assignment) i problemów HTML (duplikaty ID, brak scope w th). + +## Output +- Naprawione pliki PHP i szablony HTML +- Reskan SonarQube potwierdzający redukcję bugów +- `.paul/phases/02-critical-bugs-fix/02-01-SUMMARY.md` + + + +## Project Context +@.paul/PROJECT.md +@.paul/ROADMAP.md +@.paul/STATE.md + +## Prior Work +@.paul/phases/01-sonarqube-baseline/01-01-SUMMARY.md (baseline metrics — bugs breakdown) + +## Source Files +@autoload/controls/class.Tasks.php +@autoload/controls/class.Users.php +@autoload/class.S.php +@autoload/class.Excel.php +@autoload/class.Tpl.php +@autoload/factory/class.Projects.php +@autoload/factory/class.Tasks.php +@templates/finances/main-view.php +@templates/finances/operations-list.php +@templates/tasks/work-time.php +@templates/projects/tasks.php +@templates/site/layout-cron.php + + + + +## AC-1: PHP logic bugs naprawione +```gherkin +Given 8 bugów logicznych w plikach PHP (S3699, S1656, S3923, S5850, S1763) +When wszystkie zostaną naprawione +Then SonarQube nie zgłasza żadnych BUG issues typu S3699, S1656, S3923, S5850, S1763 +``` + +## AC-2: HTML template bugs naprawione +```gherkin +Given 30 bugów w szablonach HTML (S7930 duplicate IDs, TableHeaderHasIdOrScope, MouseEvent) +When wszystkie zostaną naprawione +Then SonarQube nie zgłasza żadnych BUG issues w plikach templates/ +``` + +## AC-3: PHP convention bugs naprawione +```gherkin +Given 20 bugów konwencji PHP (S1784 brak visibility, S2003) +When wszystkie zostaną naprawione +Then SonarQube nie zgłasza żadnych BUG issues typu S1784 i S2003 +``` + +## AC-4: Reskan potwierdza redukcję +```gherkin +Given naprawione bugi w kodzie +When uruchomiony zostanie sonar-scanner +Then liczba bugów = 0 (lub znacząco zredukowana) +``` + + + + + + + Task 1: Naprawa PHP logic i convention bugs (28 bugów) + + autoload/controls/class.Tasks.php, + autoload/controls/class.Users.php, + autoload/class.S.php, + autoload/class.Excel.php, + autoload/class.Tpl.php, + autoload/factory/class.Projects.php, + autoload/factory/class.Tasks.php + + + Naprawić następujące bugi PHP: + + **S3699 — Return from void (2 bugs):** + - controls/class.Tasks.php:432 — `return TasksController::taskChangeStatus()` → wywołaj bez return (metoda void) + - controls/class.Users.php:242 — `return UsersController::switchBackToAdmin()` → wywołaj bez return (metoda void) + + **S1656 — Self-assignment (1 bug):** + - controls/class.Tasks.php:537 — Usunąć lub poprawić bezużyteczne self-assignment + + **S3923 — Identical conditional branches (2 bugs):** + - class.S.php:167 — Usunąć zduplikowane bloki warunkowe lub zróżnicować logikę + - class.S.php:176 — Usunąć zduplikowane bloki warunkowe lub zróżnicować logikę + + **S5850 — Ambiguous regex (1 bug):** + - class.Excel.php:26 — Dodać jawne grupowanie w regex aby operator precedence był jednoznaczny + + **S1763 — Unreachable code (2 bugs):** + - factory/class.Projects.php:326 — Usunąć nieosiągalny kod po return/break + - factory/class.Tasks.php:851 — Usunąć nieosiągalny kod po return/break + + **S1784 — Missing method visibility (15 bugs):** + - controls/class.Tasks.php i inne — dodać explicit `public`, `protected` lub `private` do metod bez visibility + + **S2003 — Short open tags (3 bugs):** + - Zamienić ` + + Odczytać naprawione pliki i sprawdzić, że: + - Brak return z metod void + - Brak self-assignment + - Brak identycznych gałęzi warunkowych + - Regex ma jawne grupowanie + - Brak nieosiągalnego kodu + - Wszystkie metody mają explicit visibility + - Brak short open tags + + AC-1 i AC-3 satisfied: Wszystkie PHP bugs naprawione + + + + Task 2: Naprawa HTML template bugs (30 bugów) + + templates/finances/main-view.php, + templates/finances/operations-list.php, + templates/tasks/work-time.php, + templates/projects/tasks.php, + templates/site/layout-cron.php, + templates/tasks/task_single.php + + + Naprawić następujące bugi HTML: + + **S7930 — Duplicate HTML IDs (3 CRITICAL bugs):** + - templates/tasks/work-time.php:179 — zduplikowany id="billing-empty-state" (pierwszy na linii 176). Zmienić drugi na unikalny np. "billing-empty-state-2" lub usunąć jeśli zbędny + - templates/projects/tasks.php:116 — zduplikowany id="inprogress-tasks-container" (pierwszy na 97). Zmienić na unikalny + - templates/site/layout-cron.php:52 — zduplikowany id="divider" (pierwszy na 47). Zmienić na unikalny np. "divider-2" lub użyć klasy CSS + + **TableHeaderHasIdOrScopeCheck — Brak scope w th (22 MAJOR bugs):** + - templates/finances/main-view.php — dodać scope="col" do wszystkich tagów bez scope/id (linie: 94-99, 107, 185-210, 222-225, 252-255) + - templates/finances/operations-list.php — dodać scope="col" do (linie: 28-31, 65, 68) + + **MouseEventWithoutKeyboardEquivalentCheck (1 bug):** + - templates/finances/main-view.php:64 — do z onclick dodać onkeydown/onkeypress equivalent + + **ItemTagNotWithinContainerTagCheck (1 bug):** + - templates/tasks/task_single.php — sprawdzić i naprawić wg SonarQube message + + **Inne MINOR HTML bugs (3):** + - Sprawdzić wg SonarQube messages i naprawić + + WAŻNE: Dodawać scope="col" masowo do jest bezpieczne — nie zmienia renderowania. + Przy duplikatach ID sprawdzić czy JavaScript nie referuje stare ID. + + + Odczytać naprawione szablony i sprawdzić, że: + - Brak zduplikowanych ID w HTML + - Wszystkie mają scope="col" lub id + - Elementy onclick mają keyboard equivalent + + AC-2 satisfied: Wszystkie HTML template bugs naprawione + + + + + Reskan SonarQube: + 1. Uruchomię sonar-scanner automatycznie + 2. Poczekam na wyniki + 3. Sprawdzę metryki przez MCP + + Reskan zostanie wykonany automatycznie. Wyniki w SUMMARY.md. + + + + + + +## DO NOT CHANGE +- config.php (konfiguracja) +- index.php (punkt wejścia) +- autoload/Controllers/** (nowe controllery — nie modyfikować) +- autoload/Domain/** (nowy kod Domain — nie modyfikować w tym planie) + +## SCOPE LIMITS +- Naprawiamy TYLKO issues typu BUG z SonarQube +- NIE naprawiamy Code Smells (osobna faza) +- NIE zmieniamy logiki biznesowej +- NIE refaktoryzujemy kodu poza minimum wymagane do naprawy buga +- NIE dodajemy nowych zależności + + + + +Before declaring plan complete: +- [ ] Wszystkie 8 PHP logic bugs naprawione +- [ ] Wszystkie 20 PHP convention bugs naprawione +- [ ] Wszystkie 3 CRITICAL HTML duplicate ID bugs naprawione +- [ ] Wszystkie 22 MAJOR HTML th scope bugs naprawione +- [ ] Wszystkie 5 MINOR HTML/accessibility bugs naprawione +- [ ] Reskan SonarQube potwierdza redukcję bugów +- [ ] Żadna logika biznesowa nie została zmieniona +- [ ] All acceptance criteria met + + + +- Bugs w SonarQube: 0 (cel) lub < 5 (akceptowalne) +- Reliability Rating: B lub lepsza (poprawa z D) +- Żadne nowe bugi nie zostały wprowadzone +- Aplikacja działa bez regresji + + + +After completion, create `.paul/phases/02-critical-bugs-fix/02-01-SUMMARY.md` + diff --git a/.vscode/ftp-kr.json b/.vscode/ftp-kr.json index 5de7c10..8be197d 100644 --- a/.vscode/ftp-kr.json +++ b/.vscode/ftp-kr.json @@ -15,6 +15,7 @@ "/.vscode", "/.serena", "/.claude", + "/.paul", "CLAUDE.md" ] } \ No newline at end of file diff --git a/.vscode/ftp-kr.sync.cache.json b/.vscode/ftp-kr.sync.cache.json index 57bff4a..f4ea1d0 100644 --- a/.vscode/ftp-kr.sync.cache.json +++ b/.vscode/ftp-kr.sync.cache.json @@ -1,6 +1,12 @@ { "ftp://host700513.hostido.net.pl@www@crmpro.projectpro.pl": { "public_html": { + "AGENTS.md": { + "type": "-", + "size": 1074, + "lmtime": 1772750359672, + "modified": false + }, "ajax.php": { "type": "-", "size": 1340, @@ -121,8 +127,8 @@ }, "class.Tasks.php": { "type": "-", - "size": 27574, - "lmtime": 1772534579077, + "size": 28140, + "lmtime": 1772751184044, "modified": false }, "class.Users.php": { @@ -644,14 +650,14 @@ }, "task_edit.php": { "type": "-", - "size": 35593, - "lmtime": 1772534468454, + "size": 35730, + "lmtime": 1772751310836, "modified": false }, "task_popup.php": { "type": "-", - "size": 39914, - "lmtime": 1772534728286, + "size": 41065, + "lmtime": 1772751327122, "modified": false }, "task_single.php": { @@ -802,12 +808,6 @@ "size": 230708, "lmtime": 1771920013460, "modified": false - }, - "AGENTS.md": { - "type": "-", - "size": 250, - "lmtime": 1772530976286, - "modified": false } } }, diff --git a/autoload/controls/class.Tasks.php b/autoload/controls/class.Tasks.php index 3f44ac4..417fa8f 100644 --- a/autoload/controls/class.Tasks.php +++ b/autoload/controls/class.Tasks.php @@ -331,6 +331,25 @@ class Tasks exit; } + static public function task_change_parent() { + global $mdb; + + $task_id = (int)\S::get( 'task_id' ); + $parent_id = (int)\S::get( 'parent_id' ); + + if ( $task_id and $task_id === $parent_id ) + $parent_id = 0; + + $parent_value = $parent_id > 0 ? $parent_id : null; + + if ( $mdb -> update( 'tasks', [ 'parent_id' => $parent_value ], [ 'id' => $task_id ] ) ) { + echo json_encode( [ 'status' => 'success' ] ); + } else { + echo json_encode( [ 'status' => 'error' ] ); + } + exit; + } + static public function task_change_priority() { global $mdb; @@ -568,6 +587,7 @@ class Tasks 'user' => $user, 'statuses' => \factory\Tasks::get_statuses(), 'projects' => \factory\Projects::user_projects( $user['id'] ), + 'parent_tasks' => \factory\Tasks::parent_tasks( $user['id'] ), 'all_users' => \factory\Users::users_list() ] ); exit; diff --git a/templates/tasks/main_view.php b/templates/tasks/main_view.php index 0fb0405..5013334 100644 --- a/templates/tasks/main_view.php +++ b/templates/tasks/main_view.php @@ -706,6 +706,37 @@ }); }); + // change task parent + $( 'body' ).on( 'change', 'select[name="task_parent"]', function() { + var task_id = $( this ).attr( 'task_id' ); + var parent_id = $( this ).val(); + + $.ajax({ + url: '/tasks/task_change_parent/', + type: 'POST', + data: { + task_id: task_id, + parent_id: parent_id + }, + success: function( response ) + { + var data = jQuery.parseJSON( response ); + if ( data.status == 'success' ) + { + var projects = jQuery( 'input[name="projects"]:checked' ).map(function() { + return this.value; + }).get(); + projects.join( "," ); + var users = jQuery( 'input[name="users"]:checked' ).map(function() { + return this.value; + }).get(); + close_task_popup(); + reload_tasks( projects, users ); + } + } + }); + }); + $( 'body' ).on( 'change', 'select[name="task_status"]', function() { var task_id = $( this ).attr( 'task_id' ); var status = $( this ).val(); diff --git a/templates/tasks/task_popup.php b/templates/tasks/task_popup.php index edcc0db..5fef117 100644 --- a/templates/tasks/task_popup.php +++ b/templates/tasks/task_popup.php @@ -265,6 +265,18 @@ +
+ +
Dodaj podzadanie
@@ -327,7 +339,8 @@