Commit Graph

50 Commits

Author SHA1 Message Date
87f07ba14a docs(05-01): complete archive access control plan
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 20:30:57 +09:00
318e00e2f9 feat(05-02): add application notification to providers
Add send_provider_application_notification() method:
- Hooks to frm_after_create_entry for job application form submissions
- Extracts applicant details (name, email, message) and job_id
- Fetches job details (title, location, type) from post and ACF fields
- Sends email to provider contact email (job_contact_email ACF field)
- Email includes full applicant info and job context
- Provider can reply directly to applicant email
- Error logging for missing contact email or wp_mail failures

Hook registered in setup_hooks() method

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 20:30:14 +09:00
75c2969c88 feat(05-01): create archive query helper for Elementor integration
Add DDHH_JM_Archive class to modify job archive queries. Ensures
Elementor Loop Grid displays only published jobs sorted by date
(newest first) with no pagination limit.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 20:30:00 +09:00
061a41033d feat(05-02): create job application form in Formidable class
Add create_job_application_form() method with 4 fields:
- applicant_name (text, required)
- applicant_email (email, required, pre-filled for logged-in users)
- applicant_message (textarea, required)
- job_id (hidden)

Form title: "Jetzt bewerben"
Submit button: "Bewerbung absenden"
Success message: "Ihre Bewerbung wurde versendet. Der Anbieter wird sich bei Ihnen melden."

Added get_job_application_form_id() helper method
Registered form creation in setup_registration_hooks()

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 20:29:39 +09:00
c8b911bd6b feat(05-03): register 200x200px cropped image size for job logos
Add register_image_sizes() method to DDHH_JM_Post_Types class that
registers 'job-logo' image size (200x200px with hard crop). Hook
method to after_setup_theme action for proper WordPress timing.

This enables Elementor templates to request consistent logo sizing
via wp_get_attachment_image() using size 'job-logo'. Auto-generates
cropped version when logos uploaded via ACF field.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 20:29:27 +09:00
e21de5a9e9 feat(05-01): add job archive access control
Protect job archive from public access by redirecting non-logged-in users
to /anbieter-login/. Only authenticated users (mentors/subscribers) can
browse the /jobangebote/ archive.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 20:29:18 +09:00
ac60de5d99 docs(05): create phase plan
Phase 05: Mentor Job Board
- 3 plans created (parallel-ready)
- 5 total tasks defined
- Ready for execution

Plans:
- 05-01: Archive access control and query setup
- 05-02: Job application form with provider notification
- 05-03: Logo auto-crop to 200x200px

All plans independent (depends_on: []), can execute in parallel.
2026-01-14 20:22:35 +09:00
4e407b3fe0 docs(04-02): complete deactivation notifications plan
Tasks completed: 1/1
- Add deactivation notification method to notifications class

Phase 4 complete - job deactivation system fully functional.

SUMMARY: .planning/phases/04-job-deactivation-system/04-02-SUMMARY.md
2026-01-14 20:08:59 +09:00
4a1c05c421 feat(04-02): add deactivation notification method to notifications class
- Added send_admin_job_deactivation_notification() method
- Hooks transition_post_status with guards: draft status AND old publish
- Extracts deactivation reason from ACF field job_deactivation_reason
- Email subject: "Stellenangebot deaktiviert: {job_title}"
- Email includes job details, provider info, and deactivation reason
- Sends to admin_email with edit link for review
- Error logging for missing admin_email or wp_mail failure

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 20:07:08 +09:00
639050279c docs(04-01): complete job deactivation form plan
Create SUMMARY.md documenting completed plan 04-01: job deactivation form with required reason field, ownership validation, and dashboard integration. Update STATE.md to reflect Phase 4 Plan 1 completion (12 plans total, 48% progress). Update ROADMAP.md to mark 04-01 as complete.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 20:04:52 +09:00
fbbd44a07b feat(04-01): add deactivate action to provider dashboard
Add deactivate mode detection alongside existing edit mode checking for action=deactivate_job and job_id parameter. When in deactivate mode, render deactivation form section similar to edit section structure with heading "Stellenangebot deaktivieren", back link to dashboard, and form shortcode with id_param={job_id}. In job listings table, add "Deaktivieren" button in Actions column only for published jobs (status === 'publish'). Deactivate button uses warning/destructive color (red background) to differentiate from edit/view buttons. Follow same conditional rendering pattern as edit mode showing deactivation form OR listings, not both.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 20:03:09 +09:00
e29a3e507f feat(04-01): create job deactivation form with reason field
Add create_job_deactivation_form() method following established pattern from create_job_edit_form(). Form includes deactivation_reason textarea (required, German label) and hidden job_id field. Configure Update Post action to set post_status='draft' removing job from public view. Map deactivation_reason to ACF meta field 'job_deactivation_reason'. Add ownership validation hook validate_job_deactivation_ownership() following same pattern as validate_job_ownership() to prevent URL tampering. Submit button: "Stellenangebot deaktivieren". Success message: "Ihr Stellenangebot wurde deaktiviert." Redirect to /anbieter-dashboard/. Add get_job_deactivation_form_id() helper following established pattern.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 20:02:23 +09:00
764cfe86f4 docs(04): create phase plan
Phase 04: Job Deactivation System
- 2 plans created
- 3 total tasks defined
- Ready for execution

Plan 04-01: Deactivation form with reason capture (2 tasks)
Plan 04-02: Admin notification on deactivation (1 task)
2026-01-14 19:58:51 +09:00
91e35c6ba2 docs(03): complete Phase 3 via parallel execution
Phase 3 (Job Management Core) executed with 4 parallel agents:
- 03-01: Job submission form (15 min)
- 03-02: Job edit form (12 min)
- 03-03: Admin notification (8 min)
- 03-04: Admin UI enhancements (15 min)

Execution waves:
- Wave 1: 03-01 (independent)
- Wave 2: 03-02, 03-03 (both depend on 03-01, no file conflicts)
- Wave 3: 03-04 (depends on 03-03 via shared files)

All 4 plans completed successfully with 0 failures.
Wall clock time: ~50 min (parallelized from ~60 min sequential estimate)

Updated:
- ROADMAP.md: Phase 3 marked complete
- STATE.md: Progress 44%, velocity metrics updated, decisions recorded

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:51:30 +09:00
4c9d9b4b24 docs(03-04): complete admin UI enhancements plan
Summary of Phase 3 Plan 4 execution:
- Custom admin columns for job moderation (provider, location, type, submission date)
- Status filter views with pending count badge
- Sortable columns for efficient workflow
- Admin-only hook loading for performance

All tasks completed successfully. Phase 3 complete.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:49:51 +09:00
797c8c7135 feat(03-04): integrate admin UI enhancements into plugin
Add admin UI class to main plugin bootstrap and initialize hooks in admin context only:
- Require class-admin-ui.php in main plugin file
- Initialize Admin_UI::setup_hooks() only when is_admin() is true
- Performance optimization: admin hooks don't load on frontend

Admin moderation interface now provides efficient job listing with custom columns and status filters.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:48:55 +09:00
a9cb056e7e feat(03-04): add custom admin columns for job moderation
Create DDHH_JM_Admin_UI class with custom columns for job_offer admin listing:
- Anbieter (provider org name + contact person from user meta)
- Standort (location from ACF field)
- Art (job type from ACF field)
- Eingereicht am (submission date)

Removed default author/date columns to reduce clutter. Made columns sortable for efficient moderation workflow.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:48:13 +09:00
9df86a3847 docs(03-02): complete job edit form plan
- Document job edit form implementation with ownership validation
- Track security implementation preventing URL tampering
- Record conditional template rendering pattern
- List modified files and technical decisions
- Mark plan complete, ready for 03-03 or 03-04

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:46:07 +09:00
71d65eee63 docs(03-03): complete admin notification plan
- Summary documents email notification system implementation
- Admin receives German email on new job submission
- Email includes job details and direct edit link
- Smart triggering prevents spam on updates
- All tasks completed, no deviations

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:45:34 +09:00
491c4fb535 feat(03-02): integrate edit form into provider dashboard
- Add edit mode detection via URL parameters (action=edit_job&job_id=X)
- Display edit form when in edit mode, hide listings table
- Update edit links in table to point to dashboard edit form
- Add back navigation link to return to dashboard overview
- Style edit section with card layout and back link
- Form pre-populates with existing job data via id_param
- Dashboard shows either edit form OR listings, not both

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:45:09 +09:00
943544e72b feat(03-03): integrate notifications into plugin initialization
- Added require statement for class-notifications.php in main plugin file
- Initialized notification hooks via init action in main class
- Pattern consistent with existing class initializations (Access_Control, Dashboard, etc.)
- Notifications will trigger on transition_post_status after WordPress fully loads

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:44:34 +09:00
a4e2fbfe17 feat(03-02): create job edit form with ownership validation
- Add create_job_edit_form() method to programmatically create edit form
- Form uses 'job_edit' key and matches submission form fields exactly
- Configure Update Post action to update existing job_offer posts
- Add validate_job_ownership() method with frm_validate_entry hook
- Security: Validates job_id parameter, post_type, and post_author match
- Prevents URL parameter tampering by malicious providers
- Add get_job_edit_form_id() helper method
- Form pre-populates from post ID via URL parameter

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:44:29 +09:00
7aeecae506 feat(03-03): create notification class with admin alert on job submission
- Created DDHH_JM_Notifications class with email notification system
- Hook into transition_post_status to detect new pending job submissions
- Send German email to admin with job details and edit link
- Email includes: title, author, org, location, type, date, edit link
- Only trigger on new → pending transition to avoid spam on updates
- Log errors if wp_mail() fails (common in Local WP)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:44:07 +09:00
9d0305c429 docs(03-01): complete job submission form plan
Summary of Phase 3 Plan 1 implementation:
- Created Formidable job submission form with 7 fields
- Configured Create Post action with pending status
- Mapped form fields to ACF fields
- Integrated form into provider dashboard
- 2 tasks completed, 2 files modified, 0 issues

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:42:14 +09:00
600e355c8d feat(03-01): add job submission form to provider dashboard
- Add job submission form section above job listings table
- Display form using Formidable shortcode with graceful fallback
- Add visual separation styling for form section (gray background, padding, border-radius)
- Wrap job listings in separate section for better organization

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:41:28 +09:00
650c7b05cd feat(03-01): add job submission form creation
- Add create_job_submission_form() method to DDHH_JM_Formidable class
- Create Formidable form with key 'job_submission'
- Add 7 fields with German labels: title, description, location, type, deadline, email, logo
- Configure Create Post action: post_type='job_offer', status='pending'
- Map form fields to ACF fields: job_location, job_type, job_deadline, job_contact_email, job_logo
- Add get_job_submission_form_id() helper method
- Hook form creation into init action

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:40:56 +09:00
9c0657039a docs(03): create phase 3 plans
Phase 3: Job Management Core
- 4 plans created
- 8 total tasks defined
- Ready for execution

Plans:
- 03-01: Job submission form (Formidable + ACF)
- 03-02: Job edit form with ownership validation
- 03-03: Admin email notification on submission
- 03-04: Admin moderation UI enhancements

Parallelization:
- Wave 1: 03-01, 03-02, 03-04 (independent)
- Wave 2: 03-03 (depends on 03-01)
2026-01-14 19:35:57 +09:00
193bef2953 docs: complete Phase 2 - Provider Registration & Auth
Phase 2 complete with all 4 plans executed in parallel:
- 02-01: Formidable registration form with auto-login
- 02-02: Combined login/registration page
- 02-03: Provider dashboard template
- 02-04: Access control and redirects

Total commits: 8 (5 feat + 3 docs)
Progress: 29% (2/7 phases complete)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:29:55 +09:00
ecb5c7ca45 docs(02-04): complete access control and redirects plan
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:27:51 +09:00
f5538ef5d8 docs(02-02): complete login/registration page plan
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:26:46 +09:00
4706f72ba4 feat(02-04): implement WP-Admin redirect for providers
- Create DDHH_JM_Access_Control class with redirect logic
- Redirect providers from WP-Admin to dashboard page
- Preserve access to profile.php for password/email changes
- Preserve access to admin-ajax.php for AJAX requests
- Integrate access control hooks in main plugin class

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:26:28 +09:00
dcfe79a727 feat(02-02): create login/registration page with responsive layout
- Add create_login_page() method to DDHH_JM_Pages class
- Combined view with registration form (Formidable shortcode) and login form (wp_login_form)
- German headings: "Neu registrieren" and "Bereits registriert?"
- Responsive two-column layout (desktop) with flexbox
- Stacked layout on mobile (< 768px)
- Inline CSS styling for visual separation and consistency
- Background colors and borders for section distinction
- Page accessible at /anbieter-login/
- Duplicate prevention: checks for existing page by slug

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:25:51 +09:00
5a4b877bc9 docs(02-03): complete provider dashboard plan
Phase 2 Plan 3 execution summary:
- Created dashboard template with job listing table
- Implemented WP_Query scoped to current user's jobs
- Added German UI with status badges and action links
- Registered [ddhh_provider_dashboard] shortcode
- Created /anbieter-dashboard/ page with shortcode
- All verification criteria met
- Ready for 02-04 (access control and redirects)

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:23:14 +09:00
1c6598d8c2 docs(02-01): complete provider registration form plan
Phase 2 Plan 1 execution summary:
- Created Formidable registration form with 5 German-labeled fields
- Implemented auto-login and ddhh_provider role assignment
- Email uniqueness and password validation enforced
- Organization name stored as user meta
- All tasks completed successfully with 2 commits

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:20:59 +09:00
da8c6b0542 feat(02-03): create dashboard template with job listing table
- Created templates/provider-dashboard.php with:
  - User role check (ddhh_provider)
  - WP_Query for current user's job_offer posts
  - Table display with German column headings
  - Status badges (Veröffentlicht/Ausstehend/Entwurf)
  - Edit and View action links
  - Empty state message
  - Responsive CSS styling

- Created includes/class-dashboard.php with:
  - Template loader method
  - Shortcode registration [ddhh_provider_dashboard]
  - Output buffering for shortcode content

Dashboard queries only current user's posts with proper capability checking.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:20:42 +09:00
6e281b2e5a feat(02-01): integrate Formidable class with plugin
- Added class-formidable.php to autoload in main plugin file
- Hooked setup_registration_hooks() to init action
- Added missing class-roles.php and class-acf-fields.php to autoload
- Ensures Formidable integration runs after Formidable Forms loads

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:19:13 +09:00
39afa95114 feat(02-01): create Formidable registration form with auto-login
- Created DDHH_JM_Formidable class with registration form setup
- Programmatic form creation with 5 German-labeled fields
- Email uniqueness validation enforced
- Auto-login after successful registration
- ddhh_provider role assignment on user creation
- Organization name stored as user meta (ddhh_org_name)
- Duplicate submission prevention via email_exists() check
- Password validation (min 8 chars, confirmation match)
- Username generation from email prefix with uniqueness check

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 19:19:02 +09:00
054adb721a docs(02): create phase 2 plans
Phase 02: Provider Registration & Auth
- 4 plans created
- 8 total tasks defined
- Ready for execution

Plans:
- 02-01: Formidable registration form with auto-login
- 02-02: Combined login/registration page
- 02-03: Provider dashboard template
- 02-04: Access control and redirects
2026-01-14 19:12:07 +09:00
fecb654b82 docs(01-01): complete plugin structure plan
Tasks completed: 2/2
- Create main plugin file with header
- Create main plugin class with activation/deactivation

SUMMARY: .planning/phases/01-foundation-setup/01-01-SUMMARY.md
2026-01-14 19:07:48 +09:00
d41fd500d5 docs(01-03): complete roles and fields plan
Tasks completed: 2/2
- Register ddhh_provider role with restricted capabilities
- Register ACF field group for job_offer metadata

SUMMARY: .planning/phases/01-foundation-setup/01-03-SUMMARY.md
2026-01-14 19:02:58 +09:00
c8fdf39f37 feat(01-03): register ACF field group for job_offer metadata
- Add DDHH_JM_ACF_Fields class with register_fields() method
- Field group 'Job Details' for post_type job_offer
- 6 fields: job_location (text, required), job_type (select, required),
  job_deadline (date_picker), job_contact_email (email, required),
  job_logo (image), job_deactivation_reason (textarea, conditional)
- German labels: Standort, Art, Bewerbungsfrist, Kontakt-E-Mail, Logo
- Logo returns ID for media library integration
- Deactivation reason field shows only when status != publish
- Hooked to 'acf/init' action
2026-01-14 19:01:25 +09:00
79b13895fc feat(01-03): register ddhh_provider role with restricted capabilities
- Add DDHH_JM_Roles class with add_roles() and remove_roles() methods
- Role 'ddhh_provider' (Anbieter) can edit/delete own job_offers only
- Jobs go to pending status (publish_job_offers: false)
- No access to regular posts/pages (edit_posts/edit_pages: false)
- Can upload files for logos
- Integrated with Activator and Deactivator hooks
2026-01-14 19:00:50 +09:00
8df0569159 docs(01-02): complete custom post type plan
Tasks completed: 2/2
- Register job_offer custom post type
- Add capability mapping filter for ownership enforcement

SUMMARY: .planning/phases/01-foundation-setup/01-02-SUMMARY.md
2026-01-14 18:58:45 +09:00
693974b561 feat(01-02): register job_offer CPT with ownership-enforced capabilities
- Register job_offer custom post type with German labels
- Custom capability_type 'job_offer' prevents access to regular posts
- map_meta_cap filter enforces per-post ownership
- Elementor support via show_in_rest
- Menu icon: dashicons-businessperson at position 5
- Supports: title, editor, author, thumbnail
- Archive slug: jobangebote
- Custom capabilities prevent providers from editing others' posts

Tasks completed:
- Task 1: Register job_offer custom post type
- Task 2: Add capability mapping filter for ownership enforcement

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 18:57:29 +09:00
7722848ef9 chore(01-02): add prerequisite plugin structure
- Create main singleton class
- Create activator with version checks
- Create deactivator with rewrite flush
- Update main file to include core classes

This is a blocking fix (Rule 3) - Plan 01-01 was not completed but
these files are required for Plan 01-02 to execute.
2026-01-14 18:56:38 +09:00
2471c7f7e8 feat(01-01): create main plugin class with activation/deactivation
- Add main singleton class DDHH_JM_Job_Manager
- Implement activation handler with WP/PHP version checks
- Implement deactivation handler with rewrite flush
- Use transient-based rewrite flush to avoid multiple flushes
- Add comprehensive security checks and documentation

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 18:56:02 +09:00
5b74a4f2b9 feat(01-01): create main plugin file with header
- Add WordPress plugin header with metadata
- Define plugin constants (VERSION, PLUGIN_DIR, PLUGIN_URL, PLUGIN_FILE)
- Add security check for direct access
- Include main class file
- Initialize plugin on plugins_loaded hook

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 18:55:23 +09:00
8b296cefbe docs(01): create phase 1 plans
Phase 01: Foundation & Setup
- 3 plans created (all independent, can run parallel)
- 7 total tasks defined
- Ready for execution

Plans:
- 01-01: Plugin structure and activation hooks
- 01-02: Register job_offer CPT with capabilities
- 01-03: Register ddhh_provider role and ACF fields

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 18:47:23 +09:00
806c329345 docs: initialize ddhh-job-manager (7 phases)
Closed job board for digital dabei Hamburg with provider self-registration, admin moderation, and mentor access.

Phases:
1. Foundation & Setup: Plugin structure, CPT registration, custom role
2. Provider Registration & Auth: Registration form, login system, dashboard foundation
3. Job Management Core: Job submission, editing, moderation workflow
4. Job Deactivation System: Deactivation workflow with reason capture
5. Mentor Job Board: Protected archive, detail pages, apply system
6. Email Notifications: Admin alerts and mentor opt-in notifications
7. Testing & Polish: End-to-end testing, UI refinement, deployment prep

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 18:44:16 +09:00
4d462c60b1 docs: initialize ddhh-job-manager
Closed job board for digital dabei Hamburg with provider self-registration, admin moderation, and mentor access.

Creates PROJECT.md with requirements and constraints.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-14 18:39:06 +09:00