Matthieu
de98924fd3
feat(absences) : fondation backend du module de gestion des absences
...
Module type Payfit (étapes 1+2 de la spec V1) : demande d'absence, validation
admin, soldes à jour.
- Enums : AbsenceType, AbsenceStatus, HalfDay, ContractType, FamilySituation
- Entités : AbsencePolicy, AbsenceBalance, AbsenceRequest + champs RH sur User
- Services : PublicHolidayProvider (fériés FR métropole en PHP pur, Computus),
AbsenceDayCalculator (décompte jours ouvrés/ouvrables + demi-journées, TDD),
AbsenceBalanceService (périodes + pending/taken/recrédit)
- API Platform : providers/processors (création, approve/reject/cancel) + RBAC
me/admin, contrôleurs preview (dry-run), upload/download justificatif, calendrier
- Migrations : une par table + colonnes RH user (DEFAULT puis DROP DEFAULT)
- Fixtures : 5 policies par défaut, salariés démo, soldes et demandes
- Tests unitaires : PublicHolidayProvider, AbsenceDayCalculator (12 tests)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-21 14:45:14 +02:00
matthieu
e5c5371c74
Merge branch 'develop' into feat/mail-integration
2026-05-20 07:45:09 +00:00
matthieu
7fb525595e
feat(mail) : MailMessagesListController - GET /api/mail/folders/{path}/messages (pagination cursor)
...
- MailMessageRepository::findByFolderCursor : pagination cursor sentAt DESC, id DESC
- cursor base64url(sentAt_iso:id), limit max 100
- folderPath URL-encode (requirements: .+ pour supporter les slashes nested)
- securite via MailAccessChecker
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com >
2026-05-20 00:08:18 +02:00
matthieu
f245863b78
feat(mail) : MailMessageRepository — findMaxUidInFolder, findLastNByFolder, findAllUidsByFolder
2026-05-19 23:35:30 +02:00
matthieu
cd9c16a990
feat(mail) : TaskMailLink entity + repository
2026-05-19 23:17:16 +02:00
matthieu
0c597bc653
feat(mail) : MailMessage entity + repository
2026-05-19 23:16:52 +02:00
matthieu
0c80159d7e
feat(mail) : MailFolder entity + repository
2026-05-19 23:16:17 +02:00
matthieu
3cac87aa24
feat(mail) : MailConfiguration entity + repository + singleton test
2026-05-19 23:15:47 +02:00
matthieu
a3e3fd6da6
feat(workflow) : ajoute l'entité Workflow et son repository
2026-05-19 20:59:12 +02:00
matthieu
755c39a0f6
feat : extend export endpoint for multi-user, multi-project, client filters
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-25 18:41:05 +01:00
Matthieu
8208df1ade
feat : add findForExport repository method for time entries
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-24 16:00:22 +01:00
Matthieu
b3d317284e
feat : add RecurrenceHandler for auto-creating next recurring task
...
When a task transitions to a final status, archives the current task and creates
a new occurrence with recalculated dates. Adds TaskStatusRepository::findFirstNonFinal()
to assign the initial status to the new task.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-19 18:10:35 +01:00
Matthieu
e640e715bb
feat : add ZimbraConfiguration entity for CalDAV settings
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-19 18:10:34 +01:00
Matthieu
6784ee9ead
feat : add TaskRecurrence entity with RecurrenceType enum
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-19 18:10:34 +01:00
Matthieu
96cbb45e61
fix(api) : fix mark-all-read using undefined executeStatement on DQL query
...
Auto Tag Develop / tag (push) Successful in 5s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-18 17:47:31 +01:00
Matthieu
ff7cff1d39
fix(backend) : add validation constraints and fix concurrent numbering
...
- Add Assert\Choice on ClientTicket type and status with typed constants
- Add Assert\Url on GiteaConfiguration, BookStackConfiguration, TaskBookStackLink, ClientTicket
- Fix concurrent task/ticket numbering: use pg_advisory_xact_lock instead of FOR UPDATE with MAX()
- Wrap CreateTaskTool numbering in transaction
- Harmonize repository contracts: both return max number, caller adds +1
Tickets: T-004, T-008, T-011, T-012
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-17 15:27:16 +01:00
Matthieu
d6399c20e1
fix : fix MCP create-task tool crashing on task creation
...
CreateTaskTool called nonexistent findMaxNumberByProject instead of
findMaxNumberByProjectForUpdate. Also removed FOR UPDATE clause from the
query as PostgreSQL does not support it with aggregate functions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-16 09:26:36 +01:00
matthieu
e4fc34b90f
refactor : simplify codebase and fix critical issues
...
Backend:
- Add MCP Serializer to centralize entity-to-array conversion (~300 lines deduped)
- Fix race condition in task/ticket number generation (SELECT FOR UPDATE + transaction)
- Add unique constraint on task (project_id, number) with migration
- Fix MIME type validation: use server-detected finfo instead of client-supplied type
- Add allowlist of permitted MIME types for uploads
- Fix TaskDocumentDownloadController: allow ROLE_CLIENT access, add priority:1
- Fix notification sent even when ticket status unchanged
- Remove redundant exception constructors
- Simplify services (BookStackApi double fetch, TokenEncryptor, GiteaApi)
- Consolidate duplicate checks in processors
Frontend:
- Fix useApi isHandlingUnauthorized scope (module-level to prevent double 401 redirect)
- Fix client-tickets toast key copy-paste bug
- Merge duplicated tasks service methods (getByProject + getByProjectArchived)
- Extract shared uploadWithRelation helper in task-documents service
- Extract formatFileSize utility from duplicated component code
- Extract status transition logic into useClientTicketHelpers composable
- Remove dead code (unused router, handleLogout, empty script blocks)
- Merge duplicate watchers and onMounted calls
- Normalize arrow functions to function declarations per convention
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-15 22:09:16 +01:00
matthieu
6c910e7fcc
fix : use native SQL for JSON roles query in PostgreSQL
...
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com >
2026-03-15 20:11:54 +01:00
matthieu
4094048aba
feat(notification) : add NotificationService and UserRepository::findByRole
2026-03-15 19:46:37 +01:00
matthieu
669c36cea1
feat(notification) : add Notification entity, repository, and migration
2026-03-15 19:45:47 +01:00
matthieu
d2e27a04ce
feat : add ClientTicketRepository
...
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-03-15 19:25:45 +01:00
matthieu
585cc3368f
feat(bookstack) : add TaskBookStackLink entity and repository
2026-03-15 18:05:09 +01:00
matthieu
043826075d
feat(bookstack) : add BookStackConfiguration entity and repository
2026-03-15 18:05:07 +01:00
Matthieu
6ae014fe8a
feat : add GiteaConfiguration entity with repository
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-13 13:55:00 +01:00
Matthieu
9a9e5093f5
feat : add archive/unarchive to TaskGroupDrawer and fix isFinal serialization
...
Fix TaskStatus getter naming (isFinal -> getIsFinal) so Symfony serializer
properly exposes the isFinal field. Add archive/unarchive buttons and
non-final tasks info message to TaskGroupDrawer. Remove obsolete TaskType
entity and repository.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-13 10:50:41 +01:00
Matthieu
517511177c
feat : add project code and task auto-numbering
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-13 08:20:31 +01:00
Matthieu
56275a9ebe
refactor : rename TaskType to TaskTag across the stack
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-13 08:20:21 +01:00
matthieu
e9ca888971
feat(time-tracking) : add TimeEntry entity and migration
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-10 22:10:27 +01:00
matthieu
1d50e5dcb3
feat : add Task entities, repositories and migration
...
Add Task, TaskStatus, TaskEffort, TaskPriority, TaskType, TaskGroup
entities with Doctrine mappings and API Platform CRUD operations.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-09 23:40:48 +01:00
matthieu
b56d2f6526
feat : add Project entity with CRUD API and Client relation
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-09 23:40:48 +01:00
matthieu
0621388ee6
feat : add Client entity with CRUD API
...
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com >
2026-03-09 23:40:48 +01:00
tristan
47562fbdec
feat : config + login
2026-03-08 19:47:19 +01:00