1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
|
+
+
+
+
-
+
+
+
-
+
+
-
+
+
+
-
+
+
+
+
+
+
+
+
-
+
+
+
+
-
+
-
+
-
+
+
+
+
-
+
+
+
+
+
+
+
+
-
+
-
-
+
-
-
+
-
-
-
-
+
+
-
+
+
+
-
+
+
+
+
+
+
+
+
+
-
+
+
+
-
-
+
+
+
+
-
-
+
+
+
-
-
+
+
+
-
-
-
-
-
+
-
-
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
+
+
-
+
-
+
-
-
+
+
-
+
+
+
+
-
+
+
+
+
+
+
+
+
+
-
+
-
-
+
+
+
-
+
+
-
+
+
-
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
-
+
+
+
+
+
-
+
+
+
+
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
-
+
-
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
-
+
-
+
+
+
+
-
+
+
+
-
+
+
+
+
+
+
+
+
+
-
+
-
-
-
-
+
+
-
+
-
+
+
+
+
+
+
+
-
+
-
+
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
-
+
-
+
-
+
+
+
+
-
+
+
-
+
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
-
+
-
-
-
-
-
+
-
-
-
+
-
-
+
+
+
-
+
-
-
+
-
-
-
-
-
-
-
-
-
+
-
+
-
+
+
+
+
+
+
+
|
# Introduction
### Débuter
Une API de type REST est disponible dans Paheko.
Pour accéder à l'API il faut un identifiant et un mot de passe, à créer dans le menu ==Configuration==, onglet ==Fonctions avancées==, puis ==API==.
L'API peut ensuite recevoir des requêtes REST sur l'URL `https://adresse_association/api/{chemin}/`.
L'API peut ensuite recevoir des requêtes REST sur l'URL `https://adresse_association/api{route}`.
Remplacer =={route}== par une des routes de l'API (voir ci-dessous).
Remplacer =={chemin}== par un des chemins de l'API (voir ci-dessous). La méthode HTTP à utiliser est spécifiée pour chaque chemin.
La méthode HTTP (`GET`, `POST`, etc.) à utiliser est spécifiée pour chaque route.
Des exemples sont donnés pour l'utilisation de l'outil `curl` en ligne de commande, si vous souhaitez utiliser un autre langage de programmation il faudra adapter votre code.
Pour les requêtes de type `POST`, les paramètres peuvent être envoyés par le client sous forme de formulaire HTTP classique (`application/x-www-form-urlencoded`) ou sous forme d'objet JSON. Dans ce cas le `Content-Type` doit être positionné sur `application/json`.
### Formats des requêtes et réponses
Les paramètres peuvent être fournis sous les formes suivantes :
Les réponses sont faites en JSON par défaut.
* dans les paramètres de l'URL (query string) : pour toutes les méthodes
* formulaire HTTP classique pour les requêtes `POST` :
* `Content-Type: application/x-www-form-urlencoded`
* ou `Content-Type: multipart/form-data`
* objet JSON pour les requêtes POST :
* `Content-Type: application/json`
Les réponses sont renvoyées en JSON par défaut, sauf quand la route permet de choisir un autre format.
<<toc level=3>>
Les formats ODS et XLSX ne sont disponibles à l'import que si le serveur est configuré pour convertir ces formats.
De la même manière, le format XLSX n'est disponible que si le serveur est configuré pour générer ce format.
# Utiliser l'API
### Utiliser l'API
N'importe quel client HTTP capable de gérer TLS (HTTPS) et l'authentification basique fonctionnera.
En ligne de commande il est possible d'utiliser `curl`. Exemple pour télécharger la base de données :
```
curl https://test:coucou@[identifiant_association].paheko.cloud/api/download -o association.sqlite
curl -u test:secret https://[identifiant_association].paheko.cloud/api/download -o association.sqlite
```
On peut aussi utiliser `wget` en n'oubliant pas l'option `--auth-no-challenge` sinon l'authentification ne fonctionnera pas :
```
wget https://test:coucou@[identifiant_association].paheko.cloud/api/download --auth-no-challenge -O association.sqlite
wget https://test:secret@[identifiant_association].paheko.cloud/api/download \
--auth-no-challenge \
-O association.sqlite
```
Exemple pour créer une écriture sous forme de formulaire :
```
curl -v -u test:secret \
curl -v "http://test:test@[identifiant_association].paheko.cloud/api/accounting/transaction" -F id_year=1 -F label=Test -F "date=01/02/2023" …
https://[identifiant_association].paheko.cloud/api/accounting/transaction \
-F id_year=1 \
-F label=Test \
-F "date=01/02/2023"
…
```
Ou sous forme d'objet JSON :
```
curl -v -u test:secret \
https://[identifiant_association].paheko.cloud/api/accounting/transaction \
-H 'Content-Type: application/json' \
curl -v "http://test:test@[identifiant_association].paheko.cloud/api/accounting/transaction" -H 'Content-Type: application/json' -d '{"id_year":1, "label": "Test écriture", "date": "01/02/2023"}'
-d '{"id_year":1, "label": "Test écriture", "date": "01/02/2023", …}'
```
# Authentification
### Authentification
Il ne faut pas oublier de fournir le nom d'utilisateur et mot de passe en HTTP :
L'API utilise l'authentification [`Basic` de HTTP](https://fr.wikipedia.org/wiki/Authentification_HTTP#M%C3%A9thode_%C2%AB_Basic_%C2%BB).
```
curl http://test:abcd@paheko.monasso.tld/api/download/
```
# Erreurs
### Erreurs
En cas d'erreur un code HTTP 4XX sera fourni, et le contenu sera un objet JSON avec une clé `error` contenant le message d'erreur.
# Routes
# Chemins
## Requêtes SQL
### POST sql.{FORMAT}
## sql (POST)
Exécute une requête SQL en lecture
| Paramètre | Type | Description |
| :- | :- | :- |
| `FORMAT` | `string` | Format de retour : `json`, `csv`, `ods` ou `xlsx` |
| `sql` | `string` | Requête SQL à exécuter. |
Si aucun format n'est passé (exemple : `…/api/sql`, sans point ni extension), `json` sera utilisé.
Permet d'exécuter une requête SQL `SELECT` (uniquement, pas de requête UPDATE, DELETE, INSERT, etc.) sur la base de données. La requête SQL doit être passée dans le corps de la requête HTTP, ou dans le paramètre `sql`. Le résultat est retourné dans la clé `results` de l'objet JSON.
Permet d'exécuter une requête SQL `SELECT` (uniquement, pas de requête `UPDATE`, `DELETE`, `INSERT`, etc.) sur la base de données. La requête SQL doit être passée dans le corps de la requête HTTP, ou dans le paramètre `sql`.
S'il n'y a pas de limite à la requête, une limite à 1000 résultats sera ajoutée obligatoirement.
Exemple de requête :
```
curl https://test:abcd@paheko.monasso.tld/api/sql/ -d 'SELECT * FROM membres LIMIT 5;'
```request
curl -u test:abcd https://paheko.monasso.tld/api/sql \
-d 'SELECT nom, code_postal FROM users LIMIT 2;'
```
Exemple de réponse :
**ATTENTION :** Les requêtes en écriture (`INSERT, DELETE, UPDATE, CREATE TABLE`, etc.) ne sont pas acceptées, il n'est pas possible de modifier la base de données directement via Paheko, afin d'éviter les soucis de données corrompues.
```response
{
Depuis la version 1.2.8, il est possible d'utiliser le paramètre `format` pour choisir le format renvoyé :
"count": 65,
"results":
[
* `json` (défaut) : renvoie un objet JSON, dont la clé est `"results"` et contient un tableau de la liste des membres trouvés
* `csv` : renvoie un fichier CSV
* `ods` : renvoie un tableau LibreOffice Calc (ODS)
* `xlsx` : renvoie un tableau Excel (XLSX)
{
Exemple :
"nom": "Ada Lovelace",
"code_postal": null
},
{
"nom": "James Coincoin",
"code_postal": "78990"
}
]
}
```
curl https://test:abcd@paheko.monasso.tld/api/sql/ -F sql='SELECT * FROM membres LIMIT 5;' -F format=csv
```
**Attention :** Les requêtes en écriture (`INSERT, DELETE, UPDATE, CREATE TABLE`, etc.) ne sont pas acceptées, il n'est pas possible de modifier la base de données directement via Paheko, afin d'éviter les soucis de données corrompues.
## Téléchargements
### download (GET)
### GET download
Télécharger la base de données
Télécharger la base de données complète. Renvoie directement le fichier SQLite de la base de données.
Renvoie directement le fichier SQLite de la base de données.
Exemple :
Exemple de requête :
```
curl https://test:abcd@paheko.monasso.tld/api/download -o db.sqlite
```request
curl -u test:abcd https://paheko.monasso.tld/api/download -o db.sqlite
```
### download/files (GET)
### GET download/files
Télécharger un fichier ZIP contenant tous les fichiers
_(Depuis la version 1.3.4)_
Les fichiers inclus sont :
Télécharger un fichier ZIP contenant tous les fichiers (documents, fichiers des écritures, des membres, modules modifiés, etc.).
* documents
* fichiers liés aux écritures,
* fichiers liés des membres,
* fichiers joints aux pages du site web
* code des modules modifiés
* corbeille
* configuration : logo, icônes, etc.
* anciennes versions des fichiers
Exemple :
Exemple de requête :
```
curl https://test:abcd@paheko.monasso.tld/api/download/files -o backup_files.zip
```request
curl -u test:abcd https://paheko.monasso.tld/api/download/files -o backup_files.zip
```
## Site web
_(Depuis la version 1.4.0)_
### web/list (GET)
### GET web
Renvoie la liste des pages du site web.
Liste de toutes les pages du site web
### GET web/{PAGE_URI}
### web/attachment/{PAGE_URI}/{FILENAME} (GET)
Métadonnées de la page du site web
| Paramètre | Type | Description |
| :- | :- | :- |
| `PAGE_URI` | `string` | Adresse unique de la page. |
| `html` | `bool` | Si `true` ou `1`, une clé `html` sera ajoutée à la réponse avec le contenu de la page au format HTML. |
Renvoie le fichier joint correspondant à la page et nom de fichier indiqués.
Exemple de réponse :
```response
[
{
"id": 13,
"uri": "actualite",
"title": "Actualit\u00e9",
"path": null,
"draft": 0,
"published": "2019-04-22 18:00:00",
"modified": "2023-09-12 15:44:55"
},
{
"id": 66,
"uri": "Affiches-des-bourses-aux-velos",
"title": "Affiches des bourses aux v\u00e9los",
"path": "Nos activit\u00e9s",
"draft": 0,
"published": "2019-07-18 19:05:00",
"modified": "2023-04-04 14:44:04"
},
…
]
```
### PUT web/{PAGE_URI}
Modifie le contenu de la page
| Paramètre | Type | Description |
| :- | :- | :- |
| `PAGE_URI` | `string` | Adresse unique de la page. |
Exemple de requête :
```request
curl -u test:abcd https://paheko.monasso.tld/api/web/bourse-28-septembre -X PUT -d 'La bourse aura lieu le 28 septembre'
```
### POST web/{PAGE_URI}
Modifie les métadonnées de la page
| Paramètre | Type | Description |
| :- | :- | :- |
| `PAGE_URI` | `string` | Adresse unique de la page. |
| `id_parent` | `int|null` | Numéro de la catégorie parente de cette page. |
| `uri` | `string` | Nouvelle adresse unique de la page. |
| `title` | `string` | Titre de la page. |
| `type` | `int` | Type de page. `1` pour les catégories, `2` pour les pages simples. |
| `status` | `string` | Statut de la page. `online` si la page est en ligne, `draft` si la page est en brouillon. |
| `format` | `string` | Format de la page : `markdown`, `encrypted` ou `skriv` |
| `published` | `string` | Date et heure de publication au format `YYYY-MM-DD HH:mm:ss`. |
| `modified` | `string` | Date et heure de modification au format `YYYY-MM-DD HH:mm:ss`. |
| `content` | `string` | Contenu. |
Exemple de requête :
```request
curl -u test:abcd https://paheko.monasso.tld/api/web/bourse-28-septembre -F title="Bourse aux vélos du 28 septembre"
```
### DELETE web/{PAGE_URI}
Supprime la page et ses fichiers joints
| Paramètre | Type | Description |
| :- | :- | :- |
| `PAGE_URI` | `string` | Adresse unique de la page. |
Exemple de requête :
```request
curl -u test:abcd https://paheko.monasso.tld/api/web/bourse-28-septembre -X DELETE
```
### web/page/{PAGE_URI} (GET)
### GET web/{PAGE_URI}.html
Contenu de la page web au format HTML
Renvoie un objet JSON avec toutes les infos de la page donnée.
| Paramètre | Type | Description |
| :- | :- | :- |
| `PAGE_URI` | `string` | Adresse unique de la page. |
Exemple de requête :
Rajouter le paramètre `?html` à l'URL pour obtenir en plus une clé `html` dans l'objet JSON qui contiendra la page au format HTML.
```request
curl -u test:abcd https://paheko.monasso.tld/api/web/bourse-28-septembre.html
```
### web/html/{PAGE_URI} (GET)
### GET web/{PAGE_URI}/children
Liste des pages et sous-catégories dans cette catégorie
Renvoie uniquement le contenu de la page au format HTML.
| Paramètre | Type | Description |
| :- | :- | :- |
| `PAGE_URI` | `string` | Adresse unique de la page. |
Exemple de requête :
```request
curl -u test:abcd https://paheko.monasso.tld/api/web/actualite/children
```
Exemple de réponse :
```response
{
"categories": [],
"pages": [
{
"id": 86,
"id_parent": 13,
"uri": "bourse-aux-velos-le-30-septembre-et-1er-octobre",
"title": "Bourse aux v\u00e9los 30 septembre et 1er octobre",
"type": 2,
"status": "online",
"format": "skriv",
"published": "2023-10-01 18:00:00",
"modified": "2023-09-11 23:41:41",
"content": "…"
},
…
]
}
```
### GET web/{PAGE_URI}/attachments
Liste des fichiers joints à la page
| Paramètre | Type | Description |
| :- | :- | :- |
| `PAGE_URI` | `string` | Adresse unique de la page. |
### GET web/{PAGE_URI}/{FILE_NAME}
Récupérer le fichier joint à la page
| Paramètre | Type | Description |
| :- | :- | :- |
| `PAGE_URI` | `string` | Adresse unique de la page. |
| `FILENAME` | `string` | Nom du fichier. |
### DELETE web/{PAGE_URI}/{FILE_NAME}
Supprime le fichier joint à la page
| Paramètre | Type | Description |
| :- | :- | :- |
| `PAGE_URI` | `string` | Adresse unique de la page. |
| `FILENAME` | `string` | Nom du fichier. |
## Membres
### user/categories (GET)
### GET user/categories
Liste des catégories de membres
_(Depuis la version 1.3.6)_
_(Depuis la version 1.4.0)_
Renvoie la liste des catégories de membres, triée par nom, et incluant le nombre de membres de la catégorie (dans la clé `count`).
La liste est triée par nom, et inclue le nombre de membres de la catégorie dans la clé `count`.
Exemple de réponse :
### user/category/{ID}.{FORMAT} (GET)
_(Depuis la version 1.3.6)_
```response
{
"12": {
"id": 12,
"name": "Administration technique",
"perm_web": 9,
"perm_documents": 9,
"perm_users": 9,
"perm_accounting": 9,
"perm_subscribe": 0,
"perm_connect": 1,
"perm_config": 9,
"hidden": 0,
"count": 1
}
Exporte la liste des membres d'une catégorie correspondant à l'ID demandé, au format indiqué :
* `json`
* `csv`
* `ods`
}
```
### GET user/category/{ID}.{FORMAT}
* `xlsx`
Exporte la liste des membres d'une catégorie
### user/new (POST)
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID` | `int` | Identifiant unique de la catégorie. |
| `FORMAT` | `string` | Format de sortie : `json`, `csv`, `ods` ou `xlsx` |
_(Depuis la version 1.3.6)_
_(Depuis la version 1.4.0)_
### POST user/new
Permet de créer un nouveau membre.
Créer un nouveau membre
| Paramètre | Type | Description |
| :- | :- | :- |
| `id_category` | `int` | Identifiant de la catégorie. Si absent, la catégorie par défaut sera utilisée. |
| `password` | `string` | Mot de passe du membre. |
| `force_duplicate` | `bool` | Si `true` ou `1`, alors aucune erreur ne sera renvoyée si le nom du membre correspond à un membre déjà existant. |
_(Depuis la version 1.4.0)_
Attention, cette méthode comporte des restrictions :
* il n'est pas possible de créer un membre dans une catégorie ayant accès à la configuration
* il n'est pas possible de définir l'OTP ou la clé PGP du membre créé
* seul un identifiant API ayant le droit "Administration" pourra créer des membres administrateurs
Il est possible d'utiliser tous les champs de la fiche membre en utilisant leur clé unique, ainsi que les clés suivantes :
Il est possible d'utiliser tous les champs de la fiche membre en utilisant la clé unique du champ.
* `id_category` : indique l'ID d'une catégorie, si absent la catégorie par défaut sera utilisée
* `password` : mot de passe du membre
* `force_duplicate=1` : ne pas renvoyer une erreur si le nom du membre à ajouter est identique au nom d'un membre existant.
Sera renvoyée la liste des infos de la fiche membre.
Si un membre avec le même nom existe déjà (et que `force_duplicate` n'est pas utilisé), une erreur `409` sera renvoyée.
Exemple de requête :
```
```request
curl -F nom="Bla bla" -F id_category=3 -F password=abcdef123456 https://test:abcd@monpaheko.tld/api/user/new
```
### user/{ID} (GET)
### GET user/{ID}
Informations de la fiche d'un membre
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID` | `int` | Identifiant unique du membre (différent du numéro). |
_(Depuis la version 1.3.6)_
_(Depuis la version 1.4.0)_
Renvoie les infos de la fiche d'un membre à partir de son ID, ainsi que 3 autres clés :
Plusieurs clés supplémentaires sont retournées, en plus des champs de la fiche membre :
* `has_password`
* `has_pgp_key`
* `has_otp`
Exemple de réponse :
### user/{ID} (DELETE)
_(Depuis la version 1.3.6)_
```response
{
"has_password": true,
"has_otp": false,
"has_pgp_key": false,
"id": 1,
"id_category": 8,
"date_login": "2021-06-06 09:17:39",
"date_updated": null,
"id_parent": null,
"is_parent": false,
"preferences": null,
"numero": 1,
"nom": "Ada Lovelace",
"notes": null,
"groupe_information": true,
"groupe_benevoles": false,
"email": "ada@lovelace.org",
"telephone": "010101010101",
"adresse": null,
"code_postal": "21000",
"ville": "DIJON",
"pays": "FR",
"date_inscription": "2012-02-25"
}
```
### DELETE user/{ID}
Supprime un membre à partir de son ID.
Supprime un membre
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID` | `int` | Identifiant unique du membre (différent du numéro). |
_(Depuis la version 1.4.0)_
Seuls les identifiants d'API ayant le droit "Administration" pourront supprimer des membres.
Note : il n'est pas possible de supprimer un membre appartenant à une catégorie ayant accès à la configuration.
Note : il n'est pas possible de supprimer via l'API un membre appartenant à une catégorie ayant accès à la configuration.
### user/{ID} (POST)
### POST user/{ID}
_(Depuis la version 1.3.6)_
Modifie les infos de la fiche d'un membre
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID` | `int` | Identifiant unique du membre (différent du numéro). |
Modifie les infos de la fiche d'un membre à partir de son ID.
_(Depuis la version 1.4.0)_
Notes :
* il n'est pas possible de modifier la catégorie d'un membre
* il n'est pas possible de modifier un membre appartenant à une catégorie ayant accès à la configuration.
* il n'est pas possible de modifier le mot de passe, l'OTP ou la clé PGP du membre créé
* il n'est pas possible de modifier des membres ayant accès à la configuration
* seul un identifiant d'API ayant l'accès en "Administartion" pourra modifier un membre administrateur
* seul un identifiant d'API ayant l'accès en "Administration" pourra modifier un membre administrateur
### user/import (PUT)
### POST user/import
Importer un fichier de tableur de la liste des membres
Permet d'importer un fichier de tableur (CSV/XLSX/ODS) de la liste des membres, comme si c'était fait depuis l'interface de Paheko.
Formats de fichiers acceptés : CSV, ODS, XLSX.
| Paramètre | Type | Description |
| :- | :- | :- |
| `mode` | `string` | Mode d'import du fichier. Voir ci-dessous pour les détails. _(Depuis la version 1.2.8)_ |
| `skip_lines` | `int` | Nombre de lignes à ignorer. Défaut : `1`. |
| `column` | `array` | Correspondance entre la colonne (clé, commence à zéro) et le champ de la fiche membre (valeur). |
Cette route nécessite une clé d'API ayant les droits d'administration, car importer un fichier peut permettre de modifier l'identifiant de connexion d'un administrateur et donc potentiellement d'obtenir l'accès à l'interface d'administration.
Le paramètre `mode` permet d'utiliser une de ces options pour spécifier le mode d'import :
* `auto` (défaut si le mode n'est pas spécifié) : met à jour la fiche d'un membre si son numéro existe, sinon crée un membre si le numéro de membre indiqué n'existe pas ou n'est pas renseigné
* `create` : ne fait que créer de nouvelles fiches de membre, si le numéro de membre existe déjà une erreur sera produite
* `update` : ne fait que mettre à jour les fiches de membre en utilisant le numéro de membre comme référence, si le numéro de membre n'existe pas une erreur sera produite
Exemple de requête :
```request
curl -u test:abcd https://monpaheko.tld/api/user/import \
-F mode=create \
-F 'column[0]=nom_prenom' \
-F 'column[1]=code_postal' \
-F skip_lines=0 \
-F file=@membres.csv
```
Paheko s'attend à ce que la première est ligne du tableau contienne le nom des colonnes, et que le nom des colonnes correspond au nom des champs de la fiche membre (ou à leur nom unique). Par exemple si votre fiche membre contient les champs *Nom et prénom* et *Adresse postale*, alors le fichier fourni devra ressembler à ceci :
Si aucun paramètre `column` n'est fourni, Paheko s'attend alors à ce que la première est ligne du tableau contienne le nom des colonnes, et que le nom des colonnes correspond au nom des champs de la fiche membre (ou à leur nom unique). Par exemple si votre fiche membre contient les champs *Nom et prénom* et *Adresse postale*, alors le fichier fourni devra ressembler à ceci :
| Nom et prénom | Adresse postale |
| :- | :- |
| Ada Lovelace | 42 rue du binaire, 21000 DIJON |
Ou à ceci :
| nom_prenom | adresse_postale |
| :- | :- |
| Ada Lovelace | 42 rue du binaire, 21000 DIJON |
La méthode renvoie un code HTTP `200 OK` si l'import s'est bien passé, sinon un code 400 et un message d'erreur JSON dans le corps de la réponse.
Utilisez la route `user/import/preview` avant pour vérifier que l'import correspond à ce que vous attendez.
Exemple pour modifier le nom du membre n°42 :
```
echo 'numero,nom' > membres.csv
echo '42,"Nouveau nom"' >> membres.csv
curl https://test:abcd@monpaheko.tld/api/user/import -T membres.csv
curl -u test:abcd https://monpaheko.tld/api/user/import -F file=@membres.csv
```
#### Paramètres
### PUT user/import
Les paramètres sont à spécifier dans l'URL, dans la query string.
Importer un fichier de tableur de la liste des membres
Depuis la version 1.2.8 il est possible d'utiliser un paramètre supplémentaire `mode` contenant une de ces options pour spécifier le mode d'import :
Formats de fichiers acceptés : CSV, ODS, XLSX.
* `auto` (défaut si le mode n'est pas spécifié) : met à jour la fiche d'un membre si son numéro existe, sinon crée un membre si le numéro de membre indiqué n'existe pas ou n'est pas renseigné
* `create` : ne fait que créer de nouvelles fiches de membre, si le numéro de membre existe déjà une erreur sera produite
* `update` : ne fait que mettre à jour les fiches de membre en utilisant le numéro de membre comme référence, si le numéro de membre n'existe pas une erreur sera produite
_Depuis la version 1.3.0 il est possible de spécifier :_
Identique à la même méthode en `POST`, mais les paramètres sont passés dans l'URL, et le fichier en contenu de la requête.
* le nombre de lignes à ignorer avec le paramètre `skip_lines=X` : elles ne seront pas importées. Par défaut la première ligne est ignorée.
* la correspondance des colonnes avec des paramètres `column[x]` ou `x` est le numéro de la colonne (la numérotation commence à zéro), et la valeur contient le nom unique du champ de la fiche membre.
Exemple :
Exemple de requête :
```
curl https://test:abcd@monpaheko.tld/api/user/import?mode=create&column[0]=nom_prenom&column[1]=code_postal&skip_lines=0 -T membres.csv
```request
curl -u test:abcd https://monpaheko.tld/api/user/import?mode=create&column[0]=nom_prenom&skip_lines=0 \
-T membres.csv
```
### user/import (POST)
### POST user/import/preview
Identique à la même méthode en `PUT`, mais les paramètres sont passés dans le corps de la requête, avec le fichier, dont le nom sera alors `file`.
Prévisualise un import de membres, sans modifier les membres
```
curl https://test:abcd@monpaheko.tld/api/user/import \
-F mode=create \
-F 'column[0]=nom_prenom' \
-F 'column[1]=code_postal' \
-F skip_lines=0 \
-F file=@membres.csv
```
### user/import/preview (PUT)
Identique à `user/import`, mais l'import n'est pas enregistré. À la place l'API indique les modifications qui seraient apportées.
Identique à `user/import`, mais l'import n'est pas enregistré, et la route renvoie les modifications qui seraient effectuées en important le fichier :
Renvoie un objet JSON comme ceci :
* `errors` : liste des erreurs d'import
* `created` : liste des membres ajoutés, chaque objet contenant tous les champs de la fiche membre qui serait créée
* `modified` : liste des membres modifiés, chaque membre aura une clé `id` et une clé `name`, ainsi qu'un objet `changed` contenant la liste des champs modifiés. Chaque champ modifié aura 2 propriétés `old` et `new`, contenant respectivement l'ancienne valeur du champ et la nouvelle.
* `unchanged` : liste des membres mentionnés dans l'import, mais qui ne seront pas affectés. Pour chaque membre une clé `name` et une clé `id` indiquant le nom et l'identifiant unique numérique du membre
Note : si `errors` n'est pas vide, alors il sera impossible d'importer le fichier avec `user/import`.
Exemple de retour :
Exemple de requête :
```request
curl -u test:abcd https://monpaheko.tld/api/user/import/preview -F mode=update -F file=@/tmp/membres.csv
```
Exemple de réponse :
```response
{
"created": [
{
"numero": 3434351,
"nom": "Bla Bli Blu"
}
],
|
︙ | | |
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
|
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
|
+
-
+
-
+
-
+
+
+
+
+
-
+
-
+
-
+
+
-
+
+
+
+
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
-
+
+
-
-
+
+
-
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
+
+
-
-
+
+
+
-
-
+
+
+
+
+
-
-
+
+
+
-
-
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
-
+
+
+
-
+
+
+
+
+
-
+
+
+
+
-
+
-
-
+
-
+
-
+
+
+
+
+
+
-
+
-
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
-
-
+
+
+
-
-
-
+
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
-
-
-
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
|
"id": 2,
"name": "Paul Muad'Dib"
}
]
}
```
### PUT user/import/preview
### user/import/preview (POST)
Prévisualise un import de membres, sans modifier les membres
Idem quel la méthode en `PUT` mais accepte les paramètres dans le corps de la requête (voir ci-dessus).
Idem quel la méthode en `POST` mais les paramètres doivent être passés dans l'URL, et le fichier dans le corps de la requête.
## Activités
### services/subscriptions/import (PUT)
### PUT services/subscriptions/import
Importer les inscriptions des membres aux activités
Fichiers acceptés : CSV, XLSX, ODS.
_(Depuis Paheko 1.3.2)_
Permet d'importer les inscriptions des membres aux activités à partir d'un fichier CSV. Les activités et tarifs doivent déjà exister avant l'import.
Les activités et tarifs doivent déjà exister avant l'import.
Les colonnes suivantes peuvent être utilisées :
* Numéro de membre`**`
* Activité`**`
* Tarif
* Date d'inscription`**`
* Date d'expiration
* Montant à régler
* Payé ?
Les colonnes suivies de deux astérisques (`**`) sont obligatoires.
Exemple :
```
echo '"Numéro de membre","Activité","Tarif","Date d'inscription","Date d'expiration","Montant à régler","Payé ?"' > /tmp/inscriptions.csv
echo '42,"Cours de théâtre","Tarif adulte","01/09/2023","01/07/2023","123,50","Non"' >> /tmp/inscriptions.csv
curl https://test:abcd@monpaheko.tld/api/services/subscriptions/import -T /tmp/inscriptions.csv
curl -u test:abcd https://monpaheko.tld/api/services/subscriptions/import -T /tmp/inscriptions.csv
```
## Erreurs
Paheko dispose d'un système dédié à la gestion des erreurs internes, compatible avec les formats des logiciels AirBrake et errbit.
### errors/report (POST)
### POST errors/report
Ajouter un rapport d'erreur au log
Permet d'envoyer un rapport d'erreur (au format airbrake/errbit/Paheko), comme si c'était une erreur locale.
Cette route permet d'ajouter une erreur au log de l'instance. Utile pour centraliser les erreurs de plusieurs instances.
Paheko utilise le format d'erreurs de [AirBrake](https://docs.airbrake.io/docs/devops-tools/api/#post-data-schema-v3) et errbit.
### errors/log (GET)
### GET errors/log
Renvoie le log d'erreurs système, au format airbrake/errbit ([voir la doc AirBrake pour un exemple du format](https://airbrake.io/docs/api/#create-notice-v3))
Log d'erreurs de l'instance
## Comptabilité
### accounting/years (GET)
### GET accounting/years
Renvoie la liste des exercices.
Liste des exercices
Exemple de réponse :
```response
[
{
"id": 1,
"label": "Premier exercice",
"start_date": "2011-11-01",
"end_date": "2013-01-31",
"closed": 1,
"id_chart": 1,
"nb_transactions": 1194,
"chart_name": "Plan comptable associatif 1999"
},
…
]
```
### accounting/charts (GET)
Renvoie la liste des plans comptables.
### accounting/charts/{ID_CHART}/accounts (GET)
### GET accounting/charts
Liste des plans comptables
Exemple de réponse :
```response
[
{
"id": 2,
"label": "Plan comptable associatif 2018",
"country": "FR",
"code": "PCA_2018",
"archived": false
}
]
```
### GET accounting/charts/{ID_CHART}/accounts
Renvoie la liste des comptes pour le plan comptable indiqué (voir `id_chart` dans la liste des exercices).
Liste des comptes pour le plan comptable indiqué
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_CHART` | `int` | ID du plan comptable. |
### accounting/years/{ID_YEAR}/journal (GET)
Exemple de réponse :
Renvoie le journal général des écritures de l'exercice indiqué.
```response
[
Note : il est possible d'utiliser `current` comme paramètre pour `{ID_YEAR}` pour désigner l'exercice ouvert en cours. S'il y a plusieurs exercices ouverts, alors celui qui est le plus proche de la date actuelle sera utilisé.
{
### accounting/years/{ID_YEAR}/export/{FORMAT}.{EXTENSION} (GET)
_(Depuis la version 1.3.6)_
"id": 312,
"id_chart": 2,
"code": "1",
"label": "Classe 1 \u2014 Comptes de capitaux (Fonds propres, emprunts et dettes assimil\u00e9s)",
"description": null,
"position": 2,
"type": 0,
"user": false,
"bookmark": false
},
…
]
```
### GET accounting/years/{ID_YEAR}/journal
Journal général des écritures de l'exercice indiqué
Exporte l'exercice indiqué au format indiqué. Les formats suivants sont disponibles :
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_YEAR` | `int|string` | ID de l'exercice, ou `current`. |
Note : il est possible d'utiliser `current` comme paramètre pour `{ID_YEAR}` pour désigner l'exercice ouvert en cours. S'il y a plusieurs exercices ouverts, alors celui qui est le plus proche de la date actuelle sera utilisé.
* `full` : complet
* `grouped` : complet groupé
* `simple` : simple (ne comporte pas les saisies avancées)
* `fec` : format FEC (Fichier des Écritures Comptables)
### GET accounting/years/{ID_YEAR}/export/{TYPE}.{FORMAT}
Export d'un exercice
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_YEAR` | `int|string` | ID de l'exercice, ou `current`. |
| `TYPE` | `string` | Type d'export : `full`, `grouped`, `simple` ou `fec`. `simple` ne contient pas les écritures avancées. |
| `FORMAT` | `string` | Format d'export : `json`, `csv`, `ods` ou `xlsx` |
L'extension indique le type de fichier :
_(Depuis la version 1.4.0)_
### GET accounting/years/{ID_YEAR}/journal/{CODE}
* `csv` : Tableur CSV
* `ods` : LibreOffice Calc
Journal des écritures d'un compte
* `xlsx` : Microsoft OOXML (Excel) - seulement disponible si l'instance le permet
* `json` : Texte JSON
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_YEAR` | `int|string` | ID de l'exercice, ou `current`. |
| `CODE` | `int|string` | Code du compte. |
Exemple de réponse :
Note : il est possible d'utiliser `current` comme paramètre pour `{ID_YEAR}` pour désigner l'exercice ouvert en cours. S'il y a plusieurs exercices ouverts, alors celui qui est le plus proche de la date actuelle sera utilisé.
```response
[
### accounting/years/{ID_YEAR}/account/journal (GET)
{
Renvoie le journal des écritures d'un compte pour l'exercice indiqué.
"id": 9297,
"id_line": 22401,
"date": "2022-02-08",
"debit": 0,
"credit": 850,
"change": 850,
"sum": 850,
"reference": "POS-SESSION-434",
"type": 0,
"label": "Session de caisse n\u00b0434",
"line_label": null,
"line_reference": null,
"id_project": null,
"project_code": null,
"files": 1,
"status": 0
},
…
]
Le compte est spécifié soit via le paramètre `code`, soit via le paramètre `id`. Exemple : `/accounting/years/4/account/journal?code=512A`
```
Note : il est possible d'utiliser `current` comme paramètre pour `{ID_YEAR}` pour désigner l'exercice ouvert en cours. S'il y a plusieurs exercices ouverts, alors celui qui est le plus proche de la date actuelle sera utilisé.
### GET accounting/years/{ID_YEAR}/journal/={ID}
### accounting/transaction/{ID_TRANSACTION} (GET)
Journal des écritures d'un compte
Renvoie les détails de l'écriture indiquée.
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_YEAR` | `int|string` | ID de l'exercice, ou `current`. |
| `ID` | `int` | ID du compte. |
### accounting/transaction/{ID_TRANSACTION} (POST)
### POST accounting/transaction
Modifie l'écriture indiquée. Voir plus bas le format attendu.
Créer une nouvelle écriture
| Paramètre | Type | Description |
| :- | :- | :- |
| `id_year` | `int` | Identifiant de l'exercice. |
| `date` | `string` | Date au format `YYYY-MM-DD` ou `DD/MM/YYYY` |
| `type` | `string` | Type d'écriture. |
| `reference` | `string|null` | Numéro de pièce comptable |
| `notes` | `string|null` | Remarques (texte multi ligne) |
### accounting/transaction/{ID_TRANSACTION}/users (GET)
| `linked_transactions` | `array(int, …)|null` | Tableau des IDs des écritures à lier à l'écriture *(depuis 1.3.5)*
| `linked_users` | `array(int, …)|null` | Tableau des IDs des membres à lier à l'écriture *(depuis 1.3.3)* |
| `linked_subscriptions` | `array(int, …)|null` | Tableau des IDs des inscriptions à lier à l'écriture *(depuis 1.4.0)* |
Renvoie la liste des membres liés à une écriture.
#### Types d'écriture
| Type | Description |
| :- | :- |
| `expense` | Dépense |
| `revenue` | Recette |
### accounting/transaction/{ID_TRANSACTION}/users (POST)
| `transfer` | Virement |
| `debt` | Dette |
| `credit` | Créance |
| `advanced` | Saisie avancée |
Met à jour la liste des membres liés à une écriture, en utilisant les ID de membres passés dans un tableau nommé `users`.
Les écritures avancées (multi-lignes) ont obligatoirement le type `advanced`. Les autres écritures sont appelées *"écritures simplifiées"* et ne peuvent comporter que deux lignes.
```
curl -v "http://…/api/accounting/transaction/9337/users" -F 'users[]=2'
#### Paramètres des écritures simplifiées
```
| Paramètre | Type | Description |
### accounting/transaction/{ID_TRANSACTION}/users (DELETE)
| :- | :- | :- |
| `amount` | `string` | Montant de l'écriture, au format flottant (`53,34`) |
| `credit` | `string` | Code du compte porté au crédit |
| `debit` | `string` | Code du compte porté au débit |
| `id_project` | `int|null` | ID du projet à affecter |
| `payment_reference` | `int|null` | référence de paiement |
Efface la liste des membres liés à une écriture.
#### Paramètres des écritures avancées
### accounting/transaction/{ID_TRANSACTION}/subscriptions (GET)
| Paramètre | Type | Description |
| :- | :- | :- |
| `lines` | `array(object, …)` | un tableau dont chaque élément est un objet correspondant à une ligne de l'écriture. |
Structure de l'objet représentant une ligne de l'écriture :
_(Depuis la version 1.3.6)_
| Paramètre | Type | Description |
| :- | :- | :- |
| `account` | `string` | Code du compte |
| `id_account` | `int` | Identifiant du compte (ID). Peut être utilisé en alternative au code du compte. |
| `credit` | `string` | Montant à inscrire au crédit (doit être zéro ou non renseigné si `debit` est renseigné, et vice-versa) |
| `debit` | `string` | montant à inscrire au débit |
| `label` | `string|null` | libellé de la ligne |
| `reference` | `string|null` | référence de la ligne (aussi appelé référence du paiement pour les écritures simplifiées) |
| `id_project` | `int|null` | ID du projet à affecter à cette ligne |
Exemple de requête :
Renvoie la liste des inscriptions (aux activités) liées à une écriture.
```request
curl -F 'id_year=12' \
-F 'label=Test' \
-F 'date=01/02/2022' \
-F 'type=expense' \
-F 'amount=42,45' \
-F 'debit=512A' \
-F 'credit=601'
```
### accounting/transaction/{ID_TRANSACTION}/subscriptions (POST)
### GET accounting/transaction/{ID_TRANSACTION}
_(Depuis la version 1.3.6)_
Détails de l'écriture
Met à jour la liste des inscriptions liées à une écriture, en utilisant les ID d'inscriptions passés dans un tableau nommé `subscriptions`.
```
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_TRANSACTION` | `int` | ID de l'écriture. |
curl -v "http://…/api/accounting/transaction/9337/subscriptions" -F 'subscriptions[]=2'
```
### accounting/transaction/{ID_TRANSACTION}/subscriptions (DELETE)
Exemple de réponse :
_(Depuis la version 1.3.6)_
Efface la liste des inscriptions liées à une écriture.
### accounting/transaction (POST)
```response
{
"id": 9302,
"type": 0,
"status": 0,
"label": "Session de caisse n\u00b0439",
"notes": null,
"reference": "POS-SESSION-439",
"date": "2022-02-12",
"hash": null,
"prev_id": null,
"prev_hash": null,
"id_year": 12,
"id_creator": 5883,
"url": "http:\/\/dev.paheko.localhost\/admin\/acc\/transactions\/details.php?id=9302",
"lines": [
{
"id": 22421,
"id_transaction": 9302,
"id_account": 542,
"credit": 0,
"debit": 3000,
"reference": "CE342",
"label": null,
"reconciled": false,
"id_project": null,
"account_code": "5112",
"account_label": "Ch\u00e8ques \u00e0 encaisser",
"account_position": 3,
"project_name": null,
"account_selector": {
"542": "5112 \u2014 Ch\u00e8ques \u00e0 encaisser"
}
Crée une nouvelle écriture, renvoie les détails si l'écriture a été créée. Voir plus bas le format attendu.
},
…
]
#### Structure pour créer / modifier une écriture
Les champs à spécifier pour créer ou modifier une écriture sont les suivants :
}
```
### POST accounting/transaction/{ID_TRANSACTION}
Modifier l'écriture
* `id_year`
* `date` (format YYYY-MM-DD)
* `type` peut être un type d'écriture simplifié (2 lignes) : `EXPENSE` (dépense), `REVENUE` (recette), `TRANSFER` (virement), `DEBT` (dette), `CREDIT` (créance), ou `ADVANCED` pour une écriture multi-ligne
* `amount` (uniquement pour les écritures simplifiées) : contient le montant de l'écriture
* `credit` (uniquement pour les écritures simplifiées) : contient le numéro du compte porté au crédit
* `debit` (uniquement pour les écritures simplifiées) : contient le numéro du compte porté au débit
* `lines` (pour les écritures multi-lignes) : un tableau dont chaque ligne doit contenir :
* `account` (numéro du compte) ou `id_account` (ID unique du compte)
* `credit` : montant à inscrire au crédit (doit être zéro ou non renseigné si `debit` est renseigné, et vice-versa)
* `debit` : montant à inscrire au débit
* `label` (facultatif) : libellé de la ligne
* `reference` (facultatif) : référence de la ligne (aussi appelé référence du paiement pour les écritures simplifiées)
* `id_project` : ID unique du projet à affecter
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_TRANSACTION` | `int` | ID de l'écriture. |
Si l'écriture est verrouillée, ou dans un exercice clôturé, la modification sera impossible.
Voir la route `POST accounting/transaction` (création d'une écriture) pour la liste des paramètres.
### GET accounting/transaction/{ID_TRANSACTION}/users
Liste des membres liés à une écriture
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_TRANSACTION` | `int` | ID de l'écriture. |
### POST accounting/transaction/{ID_TRANSACTION}/users
Met à jour la liste des membres liés à une écriture
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_TRANSACTION` | `int` | ID de l'écriture. |
| `users` | `array(int, …)` | ID des membres. |
Exemple de requête :
```
curl -v "https://…/api/accounting/transaction/9337/users" -F 'users[]=2'
```
### DELETE accounting/transaction/{ID_TRANSACTION}/users
Efface la liste des membres liés à une écriture
Champs optionnels :
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_TRANSACTION` | `int` | ID de l'écriture. |
### GET accounting/transaction/{ID_TRANSACTION}/subscriptions
* `reference` : numéro de pièce comptable
* `notes` : remarques (texte multi ligne)
* `id_project` : ID unique du projet à affecter (pour les écritures simplifiées uniquement)
* `payment_reference` (uniquement pour les écritures simplifiées) : référence de paiement
* `linked_users` : Tableau des IDs des membres à lier à l'écriture *(depuis 1.3.3)*
* `linked_transactions` : Tableau des IDs des écritures à lier à l'écriture *(depuis 1.3.5)*
* `linked_subscriptions` : Tableau des IDs des inscriptions à lier à l'écriture *(depuis 1.3.6)*
Liste des inscriptions (aux activités) liées à une écriture
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_TRANSACTION` | `int` | ID de l'écriture. |
_(Depuis la version 1.4.0)_
### POST accounting/transaction/{ID_TRANSACTION}/subscriptions
Met à jour la liste des inscriptions liées à une écriture
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_TRANSACTION` | `int` | ID de l'écriture. |
| `subscriptions` | `array(int, …)` | ID des inscriptions. |
_(Depuis la version 1.4.0)_
Exemple :
Exemple de requête :
```
curl -F 'id_year=12' -F 'label=Test' -F 'date=01/02/2022' -F 'type=EXPENSE' -F 'amount=42' -F 'debit=512A' -F 'credit=601' …
curl -v "https://…/api/accounting/transaction/9337/subscriptions" -F 'subscriptions[]=2'
```
### DELETE accounting/transaction/{ID_TRANSACTION}/subscriptions
Efface la liste des inscriptions liées à une écriture
| Paramètre | Type | Description |
| :- | :- | :- |
| `ID_TRANSACTION` | `int` | ID de l'écriture. |
_(Depuis la version 1.4.0)_
|
| | | |