================================================================================== Issue #52: feat: Contractor backoffice (Work reports, photos, payment validation) ================================================================================== :State: **OPEN** :Milestone: Jalon 3: Features Différenciantes 🎯 :Labels: phase:k3s,track:software priority:medium :Assignees: Unassigned :Created: 2025-10-27 :Updated: 2025-11-13 :URL: `View on GitHub `_ Description =========== .. raw:: html
:: ## Context **Prestataires/Entrepreneurs** effectuent travaux dans l'immeuble : - Plombier - Électricien - Peintre - Société de nettoyage - Jardinier - Ascensoriste - Entrepreneur général **Problème actuel :** - Pas de traçabilité des interventions - Pas de preuve photographique des travaux - Communication email/téléphone fragmentée - Validation paiement manuelle et lente **Besoin :** Espace dédié pour que les prestataires documentent leurs interventions et déclenchent la validation de paiement. ## Objective **Backoffice léger pour prestataires** permettant : 1. Poster compte-rendu d'intervention 2. Uploader photos (avant/après, pièces changées, résultat fini) 3. Déclarer intervention terminée 4. Déclencher validation paiement par Syndic 5. Suivre statut facture (en attente, approuvée, payée) ## User Flow ``` Entrepreneur termine travaux ↓ Se connecte au portail KoproGo (login simplifié) ↓ Crée compte-rendu intervention - Sélectionne chantier/tâche assignée - Description travaux effectués - Upload photos (avant/après, pièces changées) - Temps passé (heures) - Matériaux utilisés ↓ Marque intervention comme "Terminée" ↓ Système notifie Syndic ↓ Syndic voit compte-rendu + photos ↓ Syndic valide ou demande corrections ↓ Si validé → Déclenche paiement ↓ Entrepreneur voit statut "Approuvé - Paiement en cours" ``` ## Domain Model ### 1. Contractor (Prestataire) ```rust pub struct Contractor { pub id: Uuid, pub company_name: String, pub contact_person: String, pub email: String, pub phone: String, pub vat_number: String, // TVA pub iban: Option, pub contractor_type: ContractorType, pub is_active: bool, pub created_at: DateTime, } pub enum ContractorType { Plumber, // Plombier Electrician, // Électricien Painter, // Peintre Cleaner, // Nettoyage Gardener, // Jardinier Elevator, // Ascensoriste GeneralWork, // Travaux généraux Other, } ``` ### 2. Work Order (Ordre de Travail) ```rust pub struct WorkOrder { pub id: Uuid, pub building_id: Uuid, pub contractor_id: Uuid, pub title: String, pub description: String, pub location: String, // "Hall d'entrée", "Appartement 3B" pub quote_amount: Option, // Montant devis pub status: WorkOrderStatus, pub assigned_at: DateTime, pub due_date: Option>, pub related_issue_id: Option, // Lien avec signalement pub related_expense_id: Option, } pub enum WorkOrderStatus { Assigned, // Assigné à entrepreneur InProgress, // En cours Completed, // Terminé par entrepreneur Validated, // Validé par Syndic PaymentPending, // Paiement en attente Paid, // Payé Rejected, // Refusé par Syndic } ``` ### 3. Work Report (Compte-Rendu) ```rust pub struct WorkReport { pub id: Uuid, pub work_order_id: Uuid, pub contractor_id: Uuid, pub summary: String, pub detailed_description: String, pub work_date: DateTime, pub hours_spent: f32, pub materials_used: Vec, pub before_photos: Vec, // Photos avant travaux pub after_photos: Vec, // Photos après travaux pub parts_photos: Vec, // Photos pièces changées pub submitted_at: DateTime, pub validated_by: Option, // Syndic pub validated_at: Option>, pub validation_notes: Option, } pub struct MaterialUsed { pub name: String, pub quantity: i32, pub unit: String, // "pièce", "mètre", "litre" pub cost: Option, } ``` ### 4. Contractor Invoice (Facture) ```rust pub struct ContractorInvoice { pub id: Uuid, pub work_order_id: Uuid, pub contractor_id: Uuid, pub invoice_number: String, pub invoice_date: DateTime, pub amount_excl_vat: Decimal, pub vat_rate: f32, pub amount_incl_vat: Decimal, pub invoice_file_url: Option, // PDF facture pub status: InvoiceStatus, pub payment_deadline: DateTime, pub paid_at: Option>, } pub enum InvoiceStatus { Draft, // Brouillon Submitted, // Soumise Approved, // Approuvée par Syndic Rejected, // Refusée PaymentScheduled, // Paiement planifié Paid, // Payée } ``` ## API Endpoints ### Contractor Authentication **Login simplifié (pas de compte utilisateur complet) :** - Email + code PIN (envoyé par Syndic) - ou Email + lien magique (passwordless) ``` POST /api/v1/contractors/auth/login POST /api/v1/contractors/auth/verify-code ``` ### Work Orders (Read-only pour contractor) ``` GET /api/v1/contractors/:id/work-orders GET /api/v1/work-orders/:id ``` ### Work Reports ``` POST /api/v1/work-orders/:id/reports PUT /api/v1/work-reports/:id POST /api/v1/work-reports/:id/photos PUT /api/v1/work-reports/:id/submit ``` ### Invoices ``` POST /api/v1/work-orders/:id/invoice GET /api/v1/contractors/:id/invoices ``` ### Syndic validation ``` PUT /api/v1/work-reports/:id/validate PUT /api/v1/work-reports/:id/reject PUT /api/v1/invoices/:id/approve PUT /api/v1/invoices/:id/mark-paid ``` ## Frontend - Contractor Portal ### 1. Login Page ```svelte ``` **Formulaire :** - Email - Code PIN (4-6 chiffres) - Bouton "Renvoyer code" ### 2. Dashboard Contractor ```svelte ``` **Sections :** - Chantiers en cours (3) - Chantiers terminés en attente validation (2) - Factures en attente paiement (€2,450) - Derniers paiements reçus ### 3. Work Order Detail + Report Form ```svelte ``` **Formulaire compte-rendu :** ```svelte

Compte-rendu d'intervention