---
title: "Guide de préparation du fichier Excel pour l'import"
module: demo
type: functional
status: active
updated: 2026-07-06
---

# Guide de préparation du fichier Excel pour l'import

Ce guide explique comment préparer un fichier XLSX pour créer un compte client de démonstration via la commande `demo:import`.

---

## Structure générale du fichier

Le fichier Excel doit contenir :
1. Un onglet `_config` (obligatoire, en premier)
2. Un ou plusieurs onglets de tables (un onglet = une table de données)

### Format des onglets de données

Chaque onglet de table suit cette structure :
- **Ligne 1** : Noms des colonnes (doivent correspondre aux colonnes de la base de données)
- **Ligne 2** : Métadonnées (optionnel, pour documentation)
- **Ligne 3+** : Données

---

## Onglet `_config`

Cet onglet contient les paramètres généraux du fichier.

| Colonne A (clé) | Colonne B (valeur) | Description |
|-----------------|-------------------|-------------|
| `version` | `1.0` | Version du format (laisser 1.0) |
| `source_idc` | `999` ou `GENERATED` | ID source si exporté, ou GENERATED si créé manuellement |
| `export_date` | `2026-01-13 10:00:00` | Date de création du fichier |
| `target_idc` | _(vide)_ | Ne pas remplir, sera défini à l'import |
| `target_name` | _(vide)_ | Ne pas remplir, sera défini à l'import |

---

## Ce qui est automatique vs ce que vous devez définir

### Ce qui est généré AUTOMATIQUEMENT à l'import

| Élément | Description |
|---------|-------------|
| **IDs réels** | Tous les IDs temporaires (`TEMP_XXX`) sont remplacés par de vrais IDs auto-générés |
| **`_id` (customer parent)** | Automatiquement mis à jour vers le `target_idc` fourni à l'import |
| **SIRET** | Un nouveau SIRET unique est généré pour chaque customer |
| **Emails utilisateurs** | Rendus uniques en ajoutant `+demoXXX` avant le `@` |
| **Mot de passe** | Hashé automatiquement (valeur par défaut : `password123`) |
| **Décalage des dates** | Toutes les dates sont décalées pour être relatives à aujourd'hui |

### Ce que VOUS devez définir

| Élément | Description |
|---------|-------------|
| **Noms et libellés** | `lbname`, `lbproject`, `lbask`, etc. |
| **Descriptions** | `txdesc`, `lbdesc`, etc. |
| **Types et statuts** | `tpstate`, `tpurgency`, `tphard`, etc. |
| **Relations via TEMP_IDs** | Les liens entre enregistrements |
| **Données métier** | Tout ce qui est spécifique à votre scénario de démo |

---

## Système des IDs temporaires

### Principe

Les IDs temporaires permettent de créer des relations entre les enregistrements **avant** que les vrais IDs n'existent.

### Format

```
TEMP_{TABLE}_{NUMERO}
```

Exemples :
- `TEMP_CUSTOMER_0001` - Premier customer
- `TEMP_USERS_0042` - 42ème utilisateur
- `TEMP_PROJECT_0003` - 3ème projet

### Comment les utiliser

1. **Dans la colonne clé primaire** : Attribuez un TEMP_ID unique à chaque enregistrement
2. **Dans les colonnes de référence (FK)** : Utilisez le TEMP_ID de l'enregistrement cible

**Exemple :**

Onglet `customer` :
| idc | lbname | _id |
|-----|--------|-----|
| TEMP_CUSTOMER_0001 | Mon Entreprise | TEMP_CUSTOMER_0001 |
| TEMP_CUSTOMER_0002 | Filiale A | TEMP_CUSTOMER_0001 |

Onglet `users` :
| id | name | idc | _id |
|----|------|-----|-----|
| TEMP_USERS_0001 | Dupont | TEMP_CUSTOMER_0001 | TEMP_CUSTOMER_0001 |
| TEMP_USERS_0002 | Martin | TEMP_CUSTOMER_0002 | TEMP_CUSTOMER_0001 |

L'utilisateur Martin appartient à la Filiale A (`idc`), mais son `_id` pointe vers le customer principal.

---

## Tables principales et leurs colonnes clés

### `customer` - Clients/Entités

| Colonne | Type | Obligatoire | Description |
|---------|------|-------------|-------------|
| `idc` | TEMP_ID | Oui | Clé primaire (TEMP_CUSTOMER_XXXX) |
| `lbname` | Texte | Oui | Nom de l'entité |
| `_id` | TEMP_ID | Oui | Référence au customer parent (= idc pour le principal) |
| `idref` | Texte | Non | Code court (ex: SIEGE, AGENCE1) |
| `tpsector` | Texte | Non | Secteur d'activité |
| `lbmail` | Email | Non | Email de contact |
| `lbtel` | Texte | Non | Téléphone |

**Note :** Le premier customer de la liste devient le customer principal et reçoit le `target_idc` et `target_name` fournis à l'import.

---

### `customer_addr` - Adresses

| Colonne | Type | Obligatoire | Description |
|---------|------|-------------|-------------|
| `idaddr` | TEMP_ID | Oui | Clé primaire |
| `lbaddr` | Texte | Oui | Format: `customer_addr.lbaddr.{TEMP_ID}` |
| `lbline1` | Texte | Non | Adresse ligne 1 |
| `idc` | TEMP_ID | Oui | Référence au customer |
| `blmaster` | 0/1 | Non | 1 = adresse principale |
| `_hide_cdpostal` | Texte | Non | Code postal |
| `_hide_lbtown` | Texte | Non | Ville |

---

### `users` - Utilisateurs

| Colonne | Type | Obligatoire | Description |
|---------|------|-------------|-------------|
| `id` | TEMP_ID | Oui | Clé primaire |
| `name` | Texte | Oui | Nom de famille |
| `forname` | Texte | Non | Prénom |
| `email` | Email | Oui | Email (sera rendu unique automatiquement) |
| `idc` | TEMP_ID | Oui | Customer d'appartenance |
| `_id` | TEMP_ID | Oui | Customer principal |
| `tpuser` | Texte | Non | Type (S=Staff, A=Admin, M=Manager, T=Tech) |

**Note :** Le mot de passe est automatiquement défini à `password123` (hashé).

---

### `tickets` - Tickets support

| Colonne | Type | Obligatoire | Description |
|---------|------|-------------|-------------|
| `idask` | TEMP_ID | Oui | Clé primaire |
| `lbask` | Texte | Oui | Sujet du ticket |
| `idc` | TEMP_ID | Oui | Customer concerné |
| `idaddr` | TEMP_ID | Non | Adresse liée |
| `iduser_asker` | TEMP_ID | Non | Utilisateur demandeur |
| `tpstate` | Texte | Non | État (NEW, OPEN, PEND, CLOSE) |
| `tpurgency` | Texte | Non | Urgence (1=faible à 4=urgent) |
| `created_at` | Date | Non | Date de création |

---

### `project` - Projets

| Colonne | Type | Obligatoire | Description |
|---------|------|-------------|-------------|
| `idproject` | TEMP_ID | Oui | Clé primaire |
| `lbproject` | Texte | Oui | Nom du projet |
| `_id` | TEMP_ID | Oui | Customer principal |
| `lbdesc` | Texte | Non | Description |
| `tpstade` | Texte | Non | Stade (P=Planifié, E=En cours, F=Fini) |
| `tpgo` | Texte | Non | Go/NoGo (O=Oui, N=Non) |
| `dtbegin` | Date | Non | Date de début |
| `dtend` | Date | Non | Date de fin |
| `csadvance` | Nombre | Non | % d'avancement (0-100) |

---

## Données par défaut

Si un onglet est **absent** ou **vide**, des données par défaut peuvent être insérées automatiquement pour certaines tables :

| Table | Données par défaut |
|-------|-------------------|
| `dsi_hwvm` | 10 serveurs virtuels types |
| `dsi_lic` | 8 licences logicielles courantes |
| `dsi_tel` | 1 installation téléphonie IP |
| `dsi_planip` | 12 VLANs réseau standards |
| `supplier` | 10 fournisseurs IT courants |
| `customer_act_san` | 5 activités sanitaires |
| `customer_act_ms` | 3 activités médico-sociales |
| `_com_wiki` | 8 articles de documentation |
| `_com_know` | 5 fiches de résolution |

Pour éviter les données par défaut, créez un onglet avec au moins une ligne de données.

---

## Gestion des dates

### Format attendu

```
YYYY-MM-DD
```
ou
```
YYYY-MM-DD HH:MM:SS
```

Exemples : `2026-01-15` ou `2026-01-15 14:30:00`

### Décalage automatique

À l'import, toutes les dates sont **décalées** pour être relatives à la date actuelle.

**Exemple :**
- Export fait le 01/01/2025 avec un ticket créé le 15/12/2024
- Import fait le 15/03/2025
- Le ticket aura une date de création au 27/02/2025 (même écart relatif)

Pour désactiver le décalage : `--date-offset=0`

---

## Colonnes ignorées automatiquement

Ces colonnes sont automatiquement gérées et n'ont pas besoin d'être remplies :

| Colonne | Raison |
|---------|--------|
| `password` | Hashé automatiquement |
| `remember_token` | Session, non pertinent |
| `_id` | Remplacé par target_idc |
| `idsiret` | Régénéré pour unicité |

---

## Ordre des onglets

L'ordre des onglets n'est **pas important**. Le système importe automatiquement dans le bon ordre de dépendance :

1. `customer` (niveau 0)
2. `customer_addr`, `users`, `supplier`... (niveau 1)
3. `customer_addr_bat`, `tickets`, `project`... (niveau 2)
4. Et ainsi de suite...

---

## Conseils pratiques

### Commencer simple

1. Créez d'abord les customers et users
2. Ajoutez progressivement les autres tables
3. Testez avec `--dry-run` après chaque ajout

### Tester avant d'importer

```bash
# Toujours valider en dry-run d'abord
php artisan demo:import mon_fichier.xlsx --dry-run
```

### Utiliser un template existant

```bash
# Générer un template hospital complet
php artisan demo:generate-hospital

# Ou exporter un client existant comme base
php artisan demo:export 999 --output=exports/template.xlsx
```

### Nommage des TEMP_IDs

Utilisez des noms cohérents et séquentiels :
- `TEMP_CUSTOMER_0001`, `TEMP_CUSTOMER_0002`...
- `TEMP_USERS_0001`, `TEMP_USERS_0002`...

---

## Erreurs courantes

### "Column not found"

La colonne spécifiée n'existe pas dans la table. Vérifiez le nom exact de la colonne.

### "Duplicate entry for key 'PRIMARY'"

Le `target_idc` existe déjà en base. Choisissez un autre ID.

### "Cannot be null"

Une colonne obligatoire est vide. Remplissez-la ou supprimez la ligne.

### "Reference not found"

Un TEMP_ID référencé n'existe pas. Vérifiez que l'onglet source contient bien cet ID.

---

## Exemple minimal

Un fichier Excel minimal valide :

**Onglet `_config` :**
| key | value |
|-----|-------|
| version | 1.0 |
| source_idc | GENERATED |
| export_date | 2026-01-13 |

**Onglet `customer` :**
| idc | lbname | _id | tpsector |
|-----|--------|-----|----------|
| TEMP_CUSTOMER_0001 | Ma Société | TEMP_CUSTOMER_0001 | IT |

**Onglet `users` :**
| id | name | forname | email | idc | _id |
|----|------|---------|-------|-----|-----|
| TEMP_USERS_0001 | Admin | Jean | admin@masociete.fr | TEMP_CUSTOMER_0001 | TEMP_CUSTOMER_0001 |

**Import :**
```bash
php artisan demo:import mon_fichier.xlsx --target-idc=500 --target-name="Ma Société Demo"
```
