## 1. Présentation du Projet

| Élément | Détail |
|---|---|
| **Nom du projet** | *ArtisanLink* (nom provisoire) |
| **Type** | Plateforme web & mobile de mise en relation |
| **Objectif principal** | Connecter les **particuliers** (clients) avec des **artisans locaux** (tailleur, peintre, plombier, électricien, etc.) |
| **Modèle** | Le particulier publie une annonce → les artisans qualifiés de la zone la reçoivent → mise en relation par proximité géographique |

---

## 2. Contexte & Problématique

Aujourd'hui, lorsqu'un particulier a besoin d'un artisan — qu'il s'agisse d'un tailleur pour une retouche, d'un peintre pour rafraîchir un appartement, ou encore d'un plombier pour une fuite urgente — la recherche repose essentiellement sur le bouche-à-oreille, les groupes informels sur les réseaux sociaux ou la chance. Ce fonctionnement présente plusieurs limites majeures : il est difficile de comparer les compétences, les tarifs et la disponibilité de plusieurs professionnels en un temps raisonnable, et le particulier se retrouve souvent à contacter des artisans éloignés de son domicile, ce qui augmente les délais et les coûts de déplacement.

Du côté des artisans, le constat est tout aussi problématique. Beaucoup disposent d'un réel savoir-faire mais n'ont aucune visibilité en ligne. Ils dépendent d'une clientèle de quartier et peinent à élargir leur carnet de commandes. Les plateformes généralistes existantes ne sont pas adaptées à la réalité des petits métiers artisanaux : elles sont souvent trop complexes, trop coûteuses, ou simplement inadaptées au contexte local.

Il n'existe donc pas, à ce jour, de solution simple, gratuite à l'inscription et centrée sur les métiers artisanaux de proximité, qui permette au particulier de publier un besoin précis et à l'artisan situé à quelques kilomètres de le recevoir instantanément. C'est cette lacune que le projet **ArtisanLink** ambitionne de combler en proposant une plateforme intuitive, géolocalisée, qui met directement en relation l'offre et la demande à l'échelle du quartier ou de la ville.

---
## 3. Objectifs du Projet

Le projet **ArtisanLink** poursuit cinq objectifs fondamentaux, conçus pour répondre aux besoins concrets des particuliers comme des artisans :

### 3.1 Publication simplifiée des demandes
Permettre à tout particulier de publier, en moins de deux minutes, une annonce claire et structurée décrivant son besoin : nature de la prestation attendue, description détaillée, photos à l'appui, budget estimatif et localisation précise. L'objectif est de rendre la démarche accessible même aux utilisateurs les moins familiarisés avec le numérique.

### 3.2 Diffusion ciblée et réception en temps réel
Garantir que chaque annonce publiée soit automatiquement transmise aux artisans dont le métier correspond à la demande et qui se trouvent dans la zone géographique définie. L'artisan reçoit ainsi une notification immédiate (push, email ou SMS) l'informant qu'une nouvelle opportunité est disponible à proximité, sans avoir à effectuer de recherche active.

### 3.3 Visibilité et profil professionnel pour les artisans
Offrir à chaque artisan la possibilité de créer un profil vitrine complet et attractif, présentant ses compétences, ses réalisations passées, sa zone d'intervention, ses tarifs indicatifs et ses disponibilités. Ce profil constitue une véritable carte de visite numérique, consultable par tous les particuliers de la plateforme, et renforcée par un système d'avis et de notation vérifiés.

### 3.4 Mise en relation directe par messagerie intégrée
Intégrer un système de chat direct et sécurisé entre le particulier et l'artisan, permettant aux deux parties d'échanger instantanément sans quitter la plateforme. Cet espace de discussion permet de préciser les détails de la demande, de négocier les conditions, de partager des photos supplémentaires, d'envoyer un devis simplifié et de convenir d'un rendez-vous, le tout en conservant une traçabilité des échanges en cas de litige.

### 3.5 Géolocalisation et proximité géographique
Exploiter la géolocalisation pour afficher au particulier les artisans disponibles les plus proches de son domicile ou du lieu d'intervention, triés par distance. L'objectif est de réduire les délais d'intervention, de limiter les frais de déplacement et de favoriser l'économie locale en privilégiant les professionnels du quartier ou de la ville.

### 3.6 Expérience utilisateur optimale
Garantir une expérience fluide, rapide et intuitive, pensée en priorité pour un usage mobile (mobile-first). L'interface doit être épurée, accessible en français et en arabe, et permettre à chaque utilisateur d'accomplir ses actions principales (publier, consulter, contacter, répondre) en un minimum d'étapes, sur tout type d'appareil (smartphone, tablette, ordinateur).

---
## 4. Types d'Utilisateurs et Cas d'Utilisation

La plateforme distingue trois profils d'utilisateurs, chacun disposant de droits et de fonctionnalités spécifiques.

---

### 4.1 👤 Le Particulier (Client)

**Définition :** Toute personne physique recherchant un artisan pour réaliser une prestation (travaux, réparation, confection, entretien, etc.).

**Cas d'utilisation :**

| N° | Action | Description |
|---|---|---|
| C-01 | Créer un compte | Le particulier s'inscrit via email, numéro de téléphone ou compte Google. Il renseigne sa localisation pour bénéficier des artisans proches. |
| C-02 | Publier une annonce | Il remplit un formulaire simple : titre, description du besoin, catégorie de métier (tailleur, peintre, plombier, électricien…), photos, budget estimatif et adresse d'intervention. |
| C-03 | Consulter les profils | Il parcourt la liste des artisans disponibles à proximité, filtrés par métier, distance, note moyenne et tarif. |
| C-04 | Contacter un artisan | Il ouvre une conversation directe via la messagerie intégrée pour poser ses questions, préciser sa demande ou demander un devis. |
| C-05 | Suivre sa demande | Il peut modifier, mettre en pause ou supprimer son annonce à tout moment. Il reçoit une notification dès qu'un artisan répond. |
| C-06 | Noter la prestation | Une fois le travail terminé, il attribue une note sur 5 et rédige un commentaire qui sera visible sur le profil de l'artisan. |

---

### 4.2 🔧 L'Artisan

**Définition :** Tout professionnel ou travailleur indépendant proposant ses services dans un domaine artisanal (tailleur, peintre, plombier, électricien, menuisier, etc.).

**Deux modes d'accès :**

#### Mode Consultation (sans compte)
L'artisan peut naviguer sur la plateforme, parcourir les annonces publiées par les particuliers et vérifier si la plateforme correspond à ses besoins, sans obligation d'inscription.

#### Mode Inscrit (avec compte)

| N° | Action | Description |
|---|---|---|
| A-01 | Créer un profil professionnel | L'artisan renseigne son identité, sa photo, son métier principal, une description de ses compétences et ses années d'expérience. |
| A-02 | Définir sa zone d'intervention | Il indique obligatoirement sa localisation (adresse ou position GPS) et le rayon maximal dans lequel il accepte de se déplacer. |
| A-03 | Présenter ses réalisations | Il ajoute un portfolio de photos de travaux déjà réalisés, ses tarifs indicatifs et ses disponibilités (jours et horaires). |
| A-04 | Recevoir des annonces ciblées | Il reçoit automatiquement une notification dès qu'une annonce correspondant à son métier et à sa zone géographique est publiée. |
| A-05 | Répondre à une annonce | Il peut envoyer un message au particulier, proposer un devis estimatif, suggérer un rendez-vous ou poser des questions complémentaires. |
| A-06 | Gérer sa réputation | Il consulte les avis laissés par les clients, répond aux commentaires et suit sa note moyenne sur son tableau de bord. |

---

### 4.3 🛡️ L'Administrateur

**Définition :** L'équipe ou la personne responsable de la gestion, de la modération et du bon fonctionnement de la plateforme.

**Cas d'utilisation :**

| N° | Action | Description |
|---|---|---|
| AD-01 | Valider les comptes artisans | Vérifie l'identité et les informations fournies par chaque artisan avant activation du profil, afin de garantir la fiabilité de la plateforme. |
| AD-02 | Modérer les contenus | Contrôle les annonces, les messages signalés et les avis publiés. Supprime tout contenu inapproprié, frauduleux ou non conforme. |
| AD-03 | Gérer les catégories de métiers | Ajoute, modifie ou supprime les catégories de métiers disponibles (tailleur, peintre, plombier, etc.) en fonction des besoins du marché. |
| AD-04 | Suivre les statistiques | Accède à un tableau de bord avec les indicateurs clés : nombre d'annonces publiées, artisans actifs, taux de mise en relation, zones les plus actives. |
| AD-05 | Gérer les litiges | Intervient en cas de conflit entre un particulier et un artisan, consulte l'historique des échanges et prend les mesures nécessaires (avertissement, suspension). |

---
## Architecture Cloud Low-Cost pour ArtisanLink

Voici trois approches architecturales classées du **moins cher au plus cher**, optimisées pour un projet en phase de lancement (MVP).

---

## Option 1 : Architecture Hybride (Recommandée – Quasi Gratuite)

**Coût mensuel estimé : 0€ – 20€ / mois**

Cette architecture combine les **free tiers** les plus généreux de plusieurs services spécialisés.

### Stack Technique

|Composant|Service|Coût|Avantages|
|---|---|---|---|
|**Frontend Web**|Vercel ou Netlify|Gratuit|Déploiement auto, CDN global, SSL|
|**Backend API**|Railway ou Render|Gratuit (free tier)|Support Node.js/Django, base de données incluse|
|**Base de données**|Supabase|Gratuit|PostgreSQL + PostGIS inclus, Auth prête à l'emploi|
|**Stockage images**|Supabase Storage ou Cloudinary|Gratuit (jusqu'à 1GB / 25GB)|Upload direct depuis mobile|
|**Notifications Push**|Firebase Cloud Messaging|Gratuit|Illimité, fiable|
|**Géolocalisation / Maps**|Mapbox|Gratuit (50k loads/mois)|Moins cher que Google Maps|
|**Emails transactionnels**|Resend ou SendGrid|Gratuit (100-3000/mois)|Pour notifications et confirmations|

### Schéma d'Architecture

## Architecture Technique

### 1️⃣ Couche Utilisateurs & Frontend

```mermaid
flowchart LR
    WEB["🌐 Web<br/>Navigateur"] --> REACT["⚛️ React.js / Next.js<br/>Vercel / Netlify"]
    MOB["📱 Mobile<br/>iOS / Android"] --> REACT
    
    style WEB fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
    style MOB fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
    style REACT fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
```

### 2️⃣ Couche Backend API

```mermaid
flowchart LR
    REACT["⚛️ Frontend"] --> AUTH["🔐 Auth API"]
    REACT --> ANNONCE["📢 Annonces API"]
    REACT --> CHAT["💬 Chat API"]
    REACT --> GEO["📍 Geo API"]
    
    subgraph RAILWAY["⚙️ Railway / Render"]
        AUTH
        ANNONCE
        CHAT
        GEO
    end
    
    style RAILWAY fill:#fff3e0,stroke:#f57c00,stroke-width:2px
```

### 3️⃣ Couche Données

```mermaid
flowchart LR
    BACKEND["⚙️ Backend API"] --> PG["🐘 PostgreSQL"]
    BACKEND --> POSTGIS["🌍 PostGIS<br/>Geo"]
    BACKEND --> STORAGE["📦 Storage<br/>Images"]
    
    subgraph SUPABASE["🗄️ Supabase"]
        PG
        POSTGIS
        STORAGE
    end
    
    style SUPABASE fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
```

### 4️⃣ Services Externes

```mermaid
flowchart LR
    BACKEND["⚙️ Backend"] -.-> FCM["🔔 Firebase FCM"]
    BACKEND -.-> EMAIL["📧 Resend"]
    BACKEND --> MAPBOX["🗺️ Mapbox"]
    
    style FCM fill:#fce4ec,stroke:#c2185b,stroke-width:2px
    style EMAIL fill:#fce4ec,stroke:#c2185b,stroke-width:2px
    style MAPBOX fill:#fce4ec,stroke:#c2185b,stroke-width:2px
```
## Option 2 : Architecture 100% GCP (Google Cloud Platform)

**Coût mensuel estimé : 25€ – 60€ / mois**

GCP offre les **free tiers les plus généreux** parmi les trois grands cloud providers, particulièrement pour les petites applications.

### Stack GCP Optimisé

|Composant|Service GCP|Coût mensuel|Free Tier|
|---|---|---|---|
|**Frontend**|Firebase Hosting|Gratuit|Illimité|
|**Backend**|Cloud Run (containers)|~10€|2M requêtes/mois gratuits|
|**Base de données**|Cloud SQL PostgreSQL|~25€|Non inclus, mais micro-instance possible|
|**Stockage**|Cloud Storage|~2€|5GB gratuits|
|**Auth**|Firebase Authentication|Gratuit|Illimité|
|**Notifications**|Firebase Cloud Messaging|Gratuit|Illimité|
|**Maps**|Google Maps Platform|~15€|200€ de crédits mensuels gratuits|

### Schéma d'Architecture GCP
### 1️⃣ Couche Utilisateurs & Frontend
```mermaid
flowchart LR
    WEB["🌐 Web<br/>Navigateur"] --> HOSTING["🏠 Firebase Hosting<br/>React / Next.js"]
    MOB["📱 Mobile<br/>iOS / Android"] --> HOSTING

    style WEB fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
    style MOB fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
    style HOSTING fill:#fff8e1,stroke:#ff8f00,stroke-width:2px
```
### 2️⃣ Couche Backend API
```mermaid
flowchart LR
    HOSTING["🏠 Firebase Hosting"] --> RUN["🐳 Cloud Run<br/>Backend API"]
    RUN --> AUTH_API["🔐 Auth API"]
    RUN --> ANNONCE_API["📢 Annonces API"]
    RUN --> CHAT_API["💬 Chat API"]
    RUN --> GEO_API["📍 Geo API"]

    style RUN fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
    style AUTH_API fill:#e8f5e9,stroke:#388e3c,stroke-width:1px
    style ANNONCE_API fill:#e8f5e9,stroke:#388e3c,stroke-width:1px
    style CHAT_API fill:#e8f5e9,stroke:#388e3c,stroke-width:1px
    style GEO_API fill:#e8f5e9,stroke:#388e3c,stroke-width:1px
```
### 3️⃣ Couche Données
```mermaid
flowchart LR
    RUN["🐳 Cloud Run"] --> SQL["🗄️ Cloud SQL<br/>PostgreSQL"]
    RUN --> STORE["📦 Cloud Storage<br/>Images"]
    RUN --> CACHE["⚡ Memorystore<br/>Redis (optionnel)"]

    style SQL fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
    style STORE fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
    style CACHE fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
```
### 4️⃣ Services Firebase
```mermaid
flowchart LR
    MOB["📱 Mobile"] --> FAUTH["🔑 Firebase Auth"]
    WEB["🌐 Web"] --> FAUTH
    RUN["🐳 Cloud Run"] -.-> FCM["🔔 Cloud Messaging<br/>Notifications Push"]
    FAUTH -.-> RUN

    style FAUTH fill:#fff8e1,stroke:#ff8f00,stroke-width:2px
    style FCM fill:#fff8e1,stroke:#ff8f00,stroke-width:2px
```
### 5️⃣ Services Google Maps
```mermaid
flowchart LR
    RUN["🐳 Cloud Run"] --> MAPS["🗺️ Google Maps Platform"]
    MAPS --> GEOCODE["📍 Geocoding API"]
    MAPS --> DIST["📏 Distance Matrix API"]
    MAPS --> PLACE["🏪 Places API"]

    style MAPS fill:#fce4ec,stroke:#c2185b,stroke-width:2px
    style GEOCODE fill:#fce4ec,stroke:#c2185b,stroke-width:1px
    style DIST fill:#fce4ec,stroke:#c2185b,stroke-width:1px
    style PLACE fill:#fce4ec,stroke:#c2185b,stroke-width:1px
```
### Vue d'Ensemble Globale (Compacte)
```mermaid
flowchart LR
    U["👥 Users"] --> FH["🏠 Firebase Hosting"]
    FH --> CR["🐳 Cloud Run"]
    CR --> CS["🗄️ Cloud SQL"]
    CR --> ST["📦 Storage"]
    CR -.-> FCM["🔔 FCM"]
    CR --> GM["🗺️ Maps"]
    U -.-> FA["🔑 Firebase Auth"]

    style U fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
    style FH fill:#fff8e1,stroke:#ff8f00,stroke-width:2px
    style CR fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
    style CS fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
    style ST fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
    style FCM fill:#fff8e1,stroke:#ff8f00,stroke-width:2px
    style GM fill:#fce4ec,stroke:#c2185b,stroke-width:2px
    style FA fill:#fff8e1,stroke:#ff8f00,stroke-width:2px
```
