@communecter/cocolight-api-client 1.0.188 → 1.0.190

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@communecter/cocolight-api-client",
3
- "version": "1.0.188",
3
+ "version": "1.0.190",
4
4
  "description": "Client Axios simplifié pour l'API cocolight",
5
5
  "repository": {
6
6
  "type": "git",
@@ -22,6 +22,27 @@ export interface AnswerChange {
22
22
  mutationType: "create" | "update" | "";
23
23
  changedFields: string[];
24
24
  }
25
+ /** Options de `Answer.generateProject()` — équivalent `costum.contextId`/`costum.contextType` legacy. */
26
+ export interface GenerateProjectOptions {
27
+ /** ID de l'entité parente (org/site porteur de l'appel). */
28
+ parentId: string;
29
+ /** Type de l'entité parente (ex: `"organizations"`). */
30
+ parentType: string;
31
+ }
32
+ /** Résultat de `Answer.generateProject()` — le backend renvoie la clé française `projet`. */
33
+ export interface GenerateProjectResult {
34
+ projectId: string;
35
+ roomId: string;
36
+ }
37
+ /**
38
+ * Résultat de `Answer.generateMilestoneFromDepense()`. `milestoneId` peut être
39
+ * une chaîne VIDE si la clé de dépense passée ne correspond à aucune entrée du
40
+ * tableau `depense[]` — le backend renvoie quand même `{success:1}` dans ce cas
41
+ * (cf. DepenseMilestoneOperationAction.php:39-43).
42
+ */
43
+ export interface GenerateMilestoneFromDepenseResult {
44
+ milestoneId: string;
45
+ }
25
46
  /** Un axe du radar multi-eval (= un input radioNew d'une step donnée). */
26
47
  export interface MultiEvalAxis {
27
48
  key: string;
@@ -365,6 +386,60 @@ export declare class Answer extends BaseEntity<AnswerItemNormalized> {
365
386
  * new Date(history[0].at * 1000); // date de la dernière modif (at en SECONDES)
366
387
  */
367
388
  getHistory(): Promise<AnswerChange[]>;
389
+ /**
390
+ * Promeut cette Answer en Project + Room (génération **irréversible** — une
391
+ * fois `project.id` posé, un second appel échoue avec "Already have a
392
+ * project"). Construit le projet à partir du mapping `proposition`/
393
+ * `description`/`depense` du form de config AAP.
394
+ *
395
+ * Constant : `GENERATE_PROJECT_FROM_ANSWER` (POST
396
+ * `/survey/form/generateproject/answerId/{answerId}/parentId/{parentId}/parentType/{parentType}`,
397
+ * auth bearer — le backend pose `Yii::app()->session['userId']` comme
398
+ * créateur et pour la notification `PROPOSAL_TO_PROJECT`).
399
+ *
400
+ * @param opts.parentId - ID de l'entité parente (org/site porteur de l'appel).
401
+ * @param opts.parentType - Type de l'entité parente (ex: `"organizations"`).
402
+ * @returns `{ projectId, roomId }` — le backend renvoie la clé française `projet`.
403
+ * @throws {ApiError} 400 si Answer sans id, ou `parentId`/`parentType` manquants.
404
+ * @throws {ApiAuthenticationError} si non connecté.
405
+ * @throws {ApiError} 409 si un projet est déjà associé à cette réponse.
406
+ * @throws {ApiError} 422 si le mapping du form ne fournit pas de nom de projet exploitable.
407
+ *
408
+ * @example
409
+ * const result = await answer.generateProject({ parentId: costum.contextId, parentType: costum.contextType });
410
+ */
411
+ generateProject(opts: GenerateProjectOptions): Promise<GenerateProjectResult>;
412
+ /**
413
+ * Sync answer→project pour UNE dépense de cette réponse (endpoint
414
+ * `GENERATE_MILESTONE_FROM_DEPENSE`,
415
+ * `POST /survey/form/depensemilestoneoperation`, auth bearer) : si la
416
+ * dépense `depenseKey` n'a pas encore de `milestone`, en crée un sur
417
+ * `project.oceco.milestones` ET pose `depense[depenseKey].milestone`,
418
+ * atomiquement côté serveur.
419
+ *
420
+ * L'endpoint serveur est idempotent (no-op si `!empty($dep["milestone"])`,
421
+ * `Answer::generateMilestonneFromDepense`), mais **cette méthode ne l'est
422
+ * pas** : un second appel sur la même dépense renvoie `{success:1,
423
+ * milestoneId:""}` côté serveur, que ce wrapper traite comme une erreur 502.
424
+ * L'appelant doit donc filtrer `if (depense.milestone) continue;` avant
425
+ * d'appeler (cf. `site-json` `associateExistingProject.ts`).
426
+ *
427
+ * Contrairement à `generateProject()`, exige que cette réponse ait DÉJÀ un
428
+ * projet associé (`answer.project.id` posé) — sinon `ApiError 400`
429
+ * (`"Don't have a project"`).
430
+ *
431
+ * @param depenseKey - Clé (index) de la dépense dans `answers.<step>.depense[]` —
432
+ * PAS un id Mongo. Une clé sans correspondance ne lève pas d'erreur côté
433
+ * serveur (`{success:1, milestoneId:""}`) — cette méthode le traite comme
434
+ * une erreur (502) plutôt que de renvoyer un id vide silencieusement.
435
+ * @throws {ApiError} 400 si Answer sans id, ou si aucun projet n'est associé.
436
+ * @throws {ApiAuthenticationError} si non connecté.
437
+ * @throws {ApiError} 502 si le serveur ne renvoie pas de `milestoneId` exploitable.
438
+ *
439
+ * @example
440
+ * const { milestoneId } = await answer.generateMilestoneFromDepense("0");
441
+ */
442
+ generateMilestoneFromDepense(depenseKey: string): Promise<GenerateMilestoneFromDepenseResult>;
368
443
  /**
369
444
  * Récupère les datasets agrégés des évaluations multiples (radar) de cette
370
445
  * Answer. Pour une réponse partagée contenant des inputs `radioNew` avec
@@ -1,5 +1,5 @@
1
1
  import type ApiClient from "../ApiClient.js";
2
- import type { DocumentListData, PersonRegisterData, AuthenticateUrlData, RefreshTokenUrlData, PasswordRecoveryData, PasswordResetData, ServerExchangeTokenData, ChangePasswordData, DeleteAccountData, UpdateSettingsData, UpdateBlockDescriptionData, UpdateBlockInfoData, UpdateBlockSocialData, UpdateBlockLocalityData, UpdateBlockSlugData, CheckData, ProfilImageData, ProfilBannerData, GetElementsAboutData, MulticonnectData, RelaunchInvitationData, GetNewsData, GetNewsByIdData, AddNewsData, AddImageNewsData, AddFileNewsData, DeleteNewsData, UpdateNewsData, ShareNewsData, GetCommentsData, AddCommentsData, DeleteCommentsData, UpdateCommentsData, SearchTagsData, ShowVoteData, GlobalAutocompleteData, CityAutocompleteData, CityAutocompleteByCountryData, SuggestionInputData, GetProjectsNoAdminData, GetProjectsAdminData, GetPoisNoAdminData, GetPoisAdminData, GlobalAutocompleteAdminCostumData, GetOrganizationsNoAdminData, GetOrganizationsAdminData, GetUserEligiblePlacesData, GetMembersNoAdminData, GetMembersAdminData, GetFriendsAdminData, GetSubscriptionsData, GetSubscriptionsAdminData, GetSubscribersData, GetSubscribersAdminData, GetContributorsNoAdminData, GetContributorsAdminData, GetBadgesData, GetBadgesFiltersData, ConnectData, CreateInvitationLinkData, ConnectByRefData, DisconnectData, GetElementsKeyData, GetFavorisData, DeleteFavorisData, AddFavorisData, AddOrganizationData, AddProjectData, AddPoiData, AddEventData, DeleteElementData, AddImageElementData, LinkValidateData, SearchMemberAutocompleteData, GetNotificationsData, GetNotificationsCountData, NotificationUpdateData, MarkNotificationAsReadData, ActivitypubSearchData, ActivitypubLinkData, ActivitypubGetCommunityData, GetBadgeData, AddBadgesData, AssignBadgesData, GetEventsData, SearchEventsCostumData, ShareEventsData, InviteMembersData, FollowData, GetCostumJsonData, GlobalAutocompleteCostumData, NavigatorGettlData, CostumEventRequestActorsData, CostumEventRequestSubeventsData, CostumEventRequestElementEventData, CostumEventRequestCategoriesData, CostumEventRequestDatesData, CostumEventRequestEventData, CostumEventRequestLinkTlToEventData, CostumEventRequestLoadContextTagData, GetGalleryData, GetAttendeesNoAdminData, GetAttendeesAdminData, CoformAnswersSearchData, CoformAnswersByIdData, GetCoformByIdData, CoformUploadAnswerFileData, DeleteCoformAnswerFileData, CoformGetAnswerFilesData, GetCoformCatalogsData, SaveCoformAnswerData, GetCoformAnswerHistoryData, GetCoformMultievalDataData, GetCoformCommontableContributorsData, AddVoteData, AddReportAbuseData, UpdatePathValueData, DeleteDocumentByContextData, DeleteDocumentByIdData, DemoteAdminData, CostumFilterCoformData, CostumFilterCoformByPathData, GetCountriesData, SearchZonesData, CoformAnswersByFormsData, CostumToolsCatalogData, CostumToolUsersData, CostumCommunInfoData, CostumSaveToolEnrichmentData, CostumCommunListData, GenerateAnswerFromFormData, FundingEnvelopeData, CoremuOperationData, CostumProjectActionRequestNewData, CostumProjectActionRequestSetStatusData, CostumProjectActionRequestSetDateData, CostumProjectActionRequestSetContributorsData, CostumProjectActionRequestCancelData, CostumProjectActionRequestArchiveData, LinkDiscourseAccountData, UnlinkDiscourseAccountData, DiscourseProfileData, DiscourseCheckEmailData, DiscourseDismissLinkData, LinkMediawikiAccountData, UnlinkMediawikiAccountData, GetMediawikiContributionsData, AddClassifiedData, PersonActivateData, PersonValidateInvitationData, ValidateInvitationByMailData, ImportPreviewData, ExportElementsData, ImportElementsData, GeocodageData, ValidateGroupData, SetSourceData, TransferSourceCheckData, TransferSourceApplyData, TransferSourceRollbackData, TransferSourceHistoryData, ModerateData, NewsModerateData, CommentModerateData, UploadDocumentData, ZoneGetShapeData, ZoneGetZonirisData, CostumListValuesData, CostumResolvedData, DirectoryProposalData, DirectoryProposalCountData, DirectoryProposalNewCounterData } from "./EndpointApi.types.js";
2
+ import type { DocumentListData, PersonRegisterData, AuthenticateUrlData, RefreshTokenUrlData, PasswordRecoveryData, PasswordResetData, ServerExchangeTokenData, ChangePasswordData, DeleteAccountData, UpdateSettingsData, UpdateBlockDescriptionData, UpdateBlockInfoData, UpdateBlockSocialData, UpdateBlockLocalityData, UpdateBlockSlugData, CheckData, ProfilImageData, ProfilBannerData, GetElementsAboutData, MulticonnectData, RelaunchInvitationData, ContactSendData, GetNewsData, GetNewsByIdData, AddNewsData, AddImageNewsData, AddFileNewsData, DeleteNewsData, UpdateNewsData, ShareNewsData, GetCommentsData, AddCommentsData, DeleteCommentsData, UpdateCommentsData, SearchTagsData, ShowVoteData, GlobalAutocompleteData, CityAutocompleteData, CityAutocompleteByCountryData, SuggestionInputData, GetProjectsNoAdminData, GetProjectsAdminData, GetPoisNoAdminData, GetPoisAdminData, GlobalAutocompleteAdminCostumData, GetOrganizationsNoAdminData, GetOrganizationsAdminData, GetUserEligiblePlacesData, GetMembersNoAdminData, GetMembersAdminData, GetFriendsAdminData, GetSubscriptionsData, GetSubscriptionsAdminData, GetSubscribersData, GetSubscribersAdminData, GetContributorsNoAdminData, GetContributorsAdminData, GetBadgesData, GetBadgesFiltersData, ConnectData, CreateInvitationLinkData, ConnectByRefData, DisconnectData, GetElementsKeyData, GetFavorisData, DeleteFavorisData, AddFavorisData, AddOrganizationData, AddProjectData, AddPoiData, AddEventData, DeleteElementData, AddImageElementData, LinkValidateData, SearchMemberAutocompleteData, GetNotificationsData, GetNotificationsCountData, NotificationUpdateData, MarkNotificationAsReadData, ActivitypubSearchData, ActivitypubLinkData, ActivitypubGetCommunityData, GetBadgeData, AddBadgesData, AssignBadgesData, GetEventsData, SearchEventsCostumData, ShareEventsData, InviteMembersData, FollowData, GetCostumJsonData, GlobalAutocompleteCostumData, NavigatorGettlData, CostumEventRequestActorsData, CostumEventRequestSubeventsData, CostumEventRequestElementEventData, CostumEventRequestCategoriesData, CostumEventRequestDatesData, CostumEventRequestEventData, CostumEventRequestLinkTlToEventData, CostumEventRequestLoadContextTagData, GetGalleryData, GetAttendeesNoAdminData, GetAttendeesAdminData, CoformAnswersSearchData, CoformAnswersByIdData, GetCoformByIdData, CoformUploadAnswerFileData, DeleteCoformAnswerFileData, CoformGetAnswerFilesData, GetCoformCatalogsData, SaveCoformAnswerData, GetCoformAnswerHistoryData, GetCoformMultievalDataData, GetCoformCommontableContributorsData, AddVoteData, AddReportAbuseData, UpdatePathValueData, DeleteDocumentByContextData, DeleteDocumentByIdData, DemoteAdminData, CostumFilterCoformData, CostumFilterCoformByPathData, GetCountriesData, SearchZonesData, CoformAnswersByFormsData, CostumToolsCatalogData, CostumToolUsersData, CostumCommunInfoData, CostumSaveToolEnrichmentData, CostumCommunListData, GenerateAnswerFromFormData, GenerateProjectFromAnswerData, GenerateMilestoneFromDepenseData, FundingEnvelopeData, CoremuOperationData, CostumProjectActionRequestNewData, CostumProjectActionRequestSetStatusData, CostumProjectActionRequestSetDateData, CostumProjectActionRequestSetContributorsData, CostumProjectActionRequestCancelData, CostumProjectActionRequestArchiveData, LinkDiscourseAccountData, UnlinkDiscourseAccountData, DiscourseProfileData, DiscourseCheckEmailData, DiscourseDismissLinkData, LinkMediawikiAccountData, UnlinkMediawikiAccountData, GetMediawikiContributionsData, AddClassifiedData, PersonActivateData, PersonValidateInvitationData, ValidateInvitationByMailData, ImportPreviewData, ExportElementsData, ImportElementsData, GeocodageData, ValidateGroupData, SetSourceData, TransferSourceCheckData, TransferSourceApplyData, TransferSourceRollbackData, TransferSourceHistoryData, ModerateData, NewsModerateData, CommentModerateData, UploadDocumentData, ZoneGetShapeData, ZoneGetZonirisData, CostumListValuesData, CostumResolvedData, DirectoryProposalData, DirectoryProposalCountData, DirectoryProposalNewCounterData } from "./EndpointApi.types.js";
3
3
  /**
4
4
  * Classe EndpointApi générée automatiquement depuis endpoints-copie.json
5
5
  */
@@ -259,6 +259,15 @@ export declare class EndpointApi {
259
259
  * @throws {Error} - En cas d'erreur inattendue.
260
260
  */
261
261
  relaunchInvitation(data: RelaunchInvitationData): Promise<any>;
262
+ /**
263
+ * Envoyer un message depuis un formulaire de contact public : Programme un mail 'contactForm' vers l'adresse d'administration du costum, depuis un formulaire de contact public — pendant du bloc CMS legacy 'contact' (modules/costum/views/tpls/blockCms/contact/*.php, qui postent tous sur cette route). Envoi ASYNCHRONE : le message est mis dans la file cron (Mail::schedule), pas expédié dans la requête. ⚠ Le ou les DESTINATAIRES ne sont PAS des paramètres : ils sont résolus SERVEUR, dans l'ordre de priorité du legacy — `costum.contactMail` d'abord, `costum.admin.email` seulement en repli (contactForm.php:606 ; costum résolu par costumSlug — CacheHelper.php:73-76). `contactMail` peut porter PLUSIEURS adresses, et chacune reçoit alors son propre mail, comme Mail::createAndSend qui éclate un tableau ou une chaîne à virgules (Mail.php:1901-1916) — cas réel : sportSanteBienetre en déclare deux quand son admin.email n'en porte qu'une. Le contrat interdit donc tplMail/to/fromMail (additionalProperties:false) : la route legacy sous-jacente accepte un destinataire arbitraire sans aucune authentification (webhook Mailgun jamais implémenté, MailmanagementController.php:18-26) — ce contrat n'en expose QUE l'usage 'formulaire de contact'. ⚠ Si ni contactMail ni admin.email ne sont configurés, le legacy retombe en cascade sur to puis replyTo, c'est-à-dire qu'il renvoie le message à SON PROPRE EXPÉDITEUR : vérifier que le costum porte bien une adresse avant de brancher un formulaire. Le port Node, lui, REFUSE dans ce cas (et durcit : tpl en liste blanche, destinataire serveur, anti-abus par IP et par costum, longueurs bornées) — même esprit que RELAUNCH_INVITATION.
264
+ * Constant : CONTACT_SEND
265
+ * @param data - Données envoyées à l'API
266
+ * @returns Les données de réponse.
267
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
268
+ * @throws {Error} - En cas d'erreur inattendue.
269
+ */
270
+ contactSend(data: ContactSendData): Promise<any>;
262
271
  /**
263
272
  * Récupérer les actualités : Récupère la liste d’actualités selon plusieurs critères.
264
273
  * Constant : GET_NEWS
@@ -1324,6 +1333,26 @@ export declare class EndpointApi {
1324
1333
  * @throws {Error} - En cas d'erreur inattendue.
1325
1334
  */
1326
1335
  generateAnswerFromForm(data: GenerateAnswerFromFormData): Promise<any>;
1336
+ /**
1337
+ * Générer un projet à partir d'une réponse AAP : Promeut une réponse (Answer) AAP en Project + Room à partir du mapping du form de config (proposition/description/dépenses). Contrôleur : modules/survey/controllers/ocecoform/GenerateprojectAction.php:16-113 (mappé par FormController.php action 'generateproject'). Auth bearer obligatoire : Answer::GenerateProjectFromAnswer (Answer.php:625-767) pose Yii::app()->session['userId'] comme creator/idUserAuthor, et notifySwitchToProject (GenerateprojectAction.php:115-148) lit Yii::app()->session['userId'/'user'] pour la notification PROPOSAL_TO_PROJECT — ne fonctionne pas en session anonyme.
1338
+ * Constant : GENERATE_PROJECT_FROM_ANSWER
1339
+ * @param data - Données envoyées à l'API
1340
+ * @returns Les données de réponse.
1341
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1342
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1343
+ * @throws {Error} - En cas d'erreur inattendue.
1344
+ */
1345
+ generateProjectFromAnswer(data: GenerateProjectFromAnswerData): Promise<any>;
1346
+ /**
1347
+ * Générer un milestone projet à partir d'une dépense de réponse : Sync answer→project pour UNE dépense : si answers.aapStep1.depense[depid] n'a pas encore de milestone, en crée un sur project.oceco.milestones ET pose depense[depid].milestone, atomiquement côté serveur (idempotent — no-op si déjà lié). Contrôleur : modules/survey/controllers/ocecoform/DepenseMilestoneOperationAction.php:12-68 (mappé par FormController.php, action 'depensemilestoneoperation'), délègue à Answer::generateMilestonneFromDepense (Answer.php, cf. GenerateprojectAction qui l'appelle aussi en boucle après une génération de projet). Seule l'action 'generateMilestone' est modélisée ici — l'endpoint PHP supporte aussi 'closeMilestone' (réponse de forme différente, hors scope). auth bearer par prudence (mutation projet/financement) bien que ni l'action ni generateMilestonneFromDepense ne lisent Yii::app()->session (contrairement à GenerateprojectAction).
1348
+ * Constant : GENERATE_MILESTONE_FROM_DEPENSE
1349
+ * @param data - Données envoyées à l'API
1350
+ * @returns Les données de réponse.
1351
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1352
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1353
+ * @throws {Error} - En cas d'erreur inattendue.
1354
+ */
1355
+ generateMilestoneFromDepense(data: GenerateMilestoneFromDepenseData): Promise<any>;
1327
1356
  /**
1328
1357
  * Trouver les informations sur les enveloppes d’un formulaire : Trouver les informations sur les enveloppes d’un formulaire
1329
1358
  * Constant : FUNDING_ENVELOPE
@@ -344,6 +344,14 @@ export interface UpdateBlockLocalityData {
344
344
  * Nom de l'EPCI. Peut être vide.
345
345
  */
346
346
  level5Name?: string;
347
+ /**
348
+ * NOM du decoupage infra-communal qui CONTIENT le point : bassin de vie, grand quartier, IRIS — tel que stocke dans `zoniris.name` (collection lue par `/co2/zone/getzoniris`). Ne se saisit pas : il est pose par calcul geometrique ($geoWithin du `geoPosition` dans le `geoShape` du contour, cf. `/co2/zone/associatezoniris`). C'est la valeur que filtrent les sites — `filters: {"address.zoniris": "Guillaume"}`, ou `$in` pour plusieurs bassins — et celle qu'emet une carte de contours cliquables. AUCUN rapport avec la chaine `levelN`, qui s'arrete a l'EPCI (level5) : `zoniris` descend SOUS la commune. Peut etre vide.
349
+ */
350
+ zoniris?: string;
351
+ /**
352
+ * `_id` (24 hex, en STRING) du document `zoniris` designe par `zoniris`. Meme role que `localityId` face a `addressLocality` : il survit au renommage d'un contour et permet a l'association de reconnaitre ses propres ecritures lors d'un rejeu. Peut etre vide.
353
+ */
354
+ zonirisId?: string;
347
355
  postalCode?: string;
348
356
  streetAddress?: string;
349
357
  };
@@ -516,6 +524,45 @@ export interface RelaunchInvitationData {
516
524
  id: string;
517
525
  [k: string]: unknown;
518
526
  }
527
+ export interface ContactSendData {
528
+ /**
529
+ * Slug du costum porteur — SEUL déterminant des destinataires (costum.contactMail, à défaut costum.admin.email).
530
+ */
531
+ costumSlug: string;
532
+ /**
533
+ * Template de mail. Verrouillé : cette route ne sert que le formulaire de contact.
534
+ */
535
+ tpl: "contactForm";
536
+ /**
537
+ * Objet du mail (Cron.subject).
538
+ */
539
+ tplObject: string;
540
+ /**
541
+ * Objet affiché DANS le corps du mail (« Objet : … » du template contactForm.php). Le legacy envoie la même valeur que tplObject.
542
+ */
543
+ subject: string;
544
+ /**
545
+ * Nom de l'expéditeur, tel que saisi.
546
+ */
547
+ names: string;
548
+ /**
549
+ * Adresse de l'expéditeur — affichée en mailto: dans le mail reçu.
550
+ */
551
+ emailSender: string;
552
+ /**
553
+ * Corps du message. Le legacy y replie le téléphone quand il est saisi (contactForm.php:953-955) ; il n'y a pas de champ téléphone dédié.
554
+ */
555
+ message: string;
556
+ /**
557
+ * Adresse de réponse (l'expéditeur). Sert aussi de dernier repli au destinataire côté legacy — d'où la garde ci-dessus.
558
+ */
559
+ replyTo?: string;
560
+ /**
561
+ * Signature en pied de mail (le legacy y met « Prénom Nom » + le téléphone en lien tel:).
562
+ */
563
+ sign?: string;
564
+ [k: string]: unknown;
565
+ }
519
566
  export interface GetNewsData {
520
567
  /**
521
568
  * Limite de date timestamp ou 0
@@ -2995,6 +3042,14 @@ export interface AddOrganizationData {
2995
3042
  * Nom de l'EPCI. Peut être vide.
2996
3043
  */
2997
3044
  level5Name?: string;
3045
+ /**
3046
+ * NOM du decoupage infra-communal qui CONTIENT le point : bassin de vie, grand quartier, IRIS — tel que stocke dans `zoniris.name` (collection lue par `/co2/zone/getzoniris`). Ne se saisit pas : il est pose par calcul geometrique ($geoWithin du `geoPosition` dans le `geoShape` du contour, cf. `/co2/zone/associatezoniris`). C'est la valeur que filtrent les sites — `filters: {"address.zoniris": "Guillaume"}`, ou `$in` pour plusieurs bassins — et celle qu'emet une carte de contours cliquables. AUCUN rapport avec la chaine `levelN`, qui s'arrete a l'EPCI (level5) : `zoniris` descend SOUS la commune. Peut etre vide.
3047
+ */
3048
+ zoniris?: string;
3049
+ /**
3050
+ * `_id` (24 hex, en STRING) du document `zoniris` designe par `zoniris`. Meme role que `localityId` face a `addressLocality` : il survit au renommage d'un contour et permet a l'association de reconnaitre ses propres ecritures lors d'un rejeu. Peut etre vide.
3051
+ */
3052
+ zonirisId?: string;
2998
3053
  postalCode?: string;
2999
3054
  streetAddress?: string;
3000
3055
  };
@@ -3296,6 +3351,14 @@ export interface AddProjectData {
3296
3351
  * Nom de l'EPCI. Peut être vide.
3297
3352
  */
3298
3353
  level5Name?: string;
3354
+ /**
3355
+ * NOM du decoupage infra-communal qui CONTIENT le point : bassin de vie, grand quartier, IRIS — tel que stocke dans `zoniris.name` (collection lue par `/co2/zone/getzoniris`). Ne se saisit pas : il est pose par calcul geometrique ($geoWithin du `geoPosition` dans le `geoShape` du contour, cf. `/co2/zone/associatezoniris`). C'est la valeur que filtrent les sites — `filters: {"address.zoniris": "Guillaume"}`, ou `$in` pour plusieurs bassins — et celle qu'emet une carte de contours cliquables. AUCUN rapport avec la chaine `levelN`, qui s'arrete a l'EPCI (level5) : `zoniris` descend SOUS la commune. Peut etre vide.
3356
+ */
3357
+ zoniris?: string;
3358
+ /**
3359
+ * `_id` (24 hex, en STRING) du document `zoniris` designe par `zoniris`. Meme role que `localityId` face a `addressLocality` : il survit au renommage d'un contour et permet a l'association de reconnaitre ses propres ecritures lors d'un rejeu. Peut etre vide.
3360
+ */
3361
+ zonirisId?: string;
3299
3362
  postalCode?: string;
3300
3363
  streetAddress?: string;
3301
3364
  };
@@ -3436,6 +3499,14 @@ export interface AddPoiData {
3436
3499
  * Nom de l'EPCI. Peut être vide.
3437
3500
  */
3438
3501
  level5Name?: string;
3502
+ /**
3503
+ * NOM du decoupage infra-communal qui CONTIENT le point : bassin de vie, grand quartier, IRIS — tel que stocke dans `zoniris.name` (collection lue par `/co2/zone/getzoniris`). Ne se saisit pas : il est pose par calcul geometrique ($geoWithin du `geoPosition` dans le `geoShape` du contour, cf. `/co2/zone/associatezoniris`). C'est la valeur que filtrent les sites — `filters: {"address.zoniris": "Guillaume"}`, ou `$in` pour plusieurs bassins — et celle qu'emet une carte de contours cliquables. AUCUN rapport avec la chaine `levelN`, qui s'arrete a l'EPCI (level5) : `zoniris` descend SOUS la commune. Peut etre vide.
3504
+ */
3505
+ zoniris?: string;
3506
+ /**
3507
+ * `_id` (24 hex, en STRING) du document `zoniris` designe par `zoniris`. Meme role que `localityId` face a `addressLocality` : il survit au renommage d'un contour et permet a l'association de reconnaitre ses propres ecritures lors d'un rejeu. Peut etre vide.
3508
+ */
3509
+ zonirisId?: string;
3439
3510
  postalCode?: string;
3440
3511
  streetAddress?: string;
3441
3512
  };
@@ -3746,6 +3817,14 @@ export interface AddEventData {
3746
3817
  * Nom de l'EPCI. Peut être vide.
3747
3818
  */
3748
3819
  level5Name?: string;
3820
+ /**
3821
+ * NOM du decoupage infra-communal qui CONTIENT le point : bassin de vie, grand quartier, IRIS — tel que stocke dans `zoniris.name` (collection lue par `/co2/zone/getzoniris`). Ne se saisit pas : il est pose par calcul geometrique ($geoWithin du `geoPosition` dans le `geoShape` du contour, cf. `/co2/zone/associatezoniris`). C'est la valeur que filtrent les sites — `filters: {"address.zoniris": "Guillaume"}`, ou `$in` pour plusieurs bassins — et celle qu'emet une carte de contours cliquables. AUCUN rapport avec la chaine `levelN`, qui s'arrete a l'EPCI (level5) : `zoniris` descend SOUS la commune. Peut etre vide.
3822
+ */
3823
+ zoniris?: string;
3824
+ /**
3825
+ * `_id` (24 hex, en STRING) du document `zoniris` designe par `zoniris`. Meme role que `localityId` face a `addressLocality` : il survit au renommage d'un contour et permet a l'association de reconnaitre ses propres ecritures lors d'un rejeu. Peut etre vide.
3826
+ */
3827
+ zonirisId?: string;
3749
3828
  postalCode?: string;
3750
3829
  streetAddress?: string;
3751
3830
  };
@@ -6125,6 +6204,39 @@ export interface GenerateAnswerFromFormData {
6125
6204
  };
6126
6205
  [k: string]: unknown;
6127
6206
  }
6207
+ export interface GenerateProjectFromAnswerData {
6208
+ pathParams?: {
6209
+ /**
6210
+ * ID de la réponse (collection answers) à promouvoir en projet. Vide → {success:0, content:'Empty answer id'} (GenerateprojectAction.php:17-21).
6211
+ */
6212
+ answerId: string;
6213
+ /**
6214
+ * ID de l'entité parente (costum.contextId legacy) sous laquelle le projet est rattaché (GenerateprojectAction.php:40-46).
6215
+ */
6216
+ parentId: string;
6217
+ /**
6218
+ * Type de l'entité parente (costum.contextType legacy, ex: 'organizations') (GenerateprojectAction.php:40-46).
6219
+ */
6220
+ parentType: string;
6221
+ [k: string]: unknown;
6222
+ };
6223
+ [k: string]: unknown;
6224
+ }
6225
+ export interface GenerateMilestoneFromDepenseData {
6226
+ /**
6227
+ * ID de la réponse (collection answers) portant la dépense. Vide → {success:0, content:'Empty answer id'} (DepenseMilestoneOperationAction.php:23-27). Sans project.id déjà posé sur l'answer → {success:0, content:"Don't have a project"} (:29-33) — cet endpoint est conçu pour être appelé APRÈS association/génération d'un projet, jamais avant.
6228
+ */
6229
+ answerId: string;
6230
+ /**
6231
+ * Clé (index) de la dépense dans answers.aapStep1.depense[] — PAS un id Mongo. Une clé qui ne matche aucune entrée du tableau ne déclenche pas d'erreur : la réponse reste {success:1} avec milestoneId vide (DepenseMilestoneOperationAction.php:39-43, $milestoneId non réaffecté dans ce cas).
6232
+ */
6233
+ depid: string;
6234
+ /**
6235
+ * Seule valeur modélisée par ce contrat (DepenseMilestoneOperationAction.php:36-50). Une valeur non reconnue, ou un answer sans aucune dépense, retombe sur le fallback {error:0} (:66, $args initial jamais modifié).
6236
+ */
6237
+ action: "generateMilestone";
6238
+ [k: string]: unknown;
6239
+ }
6128
6240
  export interface FundingEnvelopeData {
6129
6241
  /**
6130
6242
  * ID du contexte de l’entité
@@ -6205,7 +6317,7 @@ export interface CostumProjectActionRequestNewData {
6205
6317
  */
6206
6318
  milestone?: {
6207
6319
  /**
6208
- * ID du jalon associé
6320
+ * ID du jalon (project.oceco.milestones[].milestoneId) — chaîne LIBRE, aucun format garanti : ObjectId 24 hex (créé côté client via generateMilestoneId), uniqid() PHP 13 hex (Answer::generateMilestonneFromDepense, boucle de GenerateprojectAction sur les dépenses d'une réponse AAC promue en projet), ou identifiants legacy non-hex. Le backend ActionAction::run() case 'new' ne valide pas le format ; la seule vérif d'existence est Project.hasMilestone (appartenance à oceco.milestones[]).
6209
6321
  */
6210
6322
  milestoneId: string;
6211
6323
  /**
@@ -6529,6 +6641,14 @@ export interface AddClassifiedData {
6529
6641
  level4Name?: string;
6530
6642
  level5?: string;
6531
6643
  level5Name?: string;
6644
+ /**
6645
+ * NOM du decoupage infra-communal qui CONTIENT le point : bassin de vie, grand quartier, IRIS — tel que stocke dans `zoniris.name` (collection lue par `/co2/zone/getzoniris`). Ne se saisit pas : il est pose par calcul geometrique ($geoWithin du `geoPosition` dans le `geoShape` du contour, cf. `/co2/zone/associatezoniris`). C'est la valeur que filtrent les sites — `filters: {"address.zoniris": "Guillaume"}`, ou `$in` pour plusieurs bassins — et celle qu'emet une carte de contours cliquables. AUCUN rapport avec la chaine `levelN`, qui s'arrete a l'EPCI (level5) : `zoniris` descend SOUS la commune. Peut etre vide.
6646
+ */
6647
+ zoniris?: string;
6648
+ /**
6649
+ * `_id` (24 hex, en STRING) du document `zoniris` designe par `zoniris`. Meme role que `localityId` face a `addressLocality` : il survit au renommage d'un contour et permet a l'association de reconnaitre ses propres ecritures lors d'un rejeu. Peut etre vide.
6650
+ */
6651
+ zonirisId?: string;
6532
6652
  postalCode?: string;
6533
6653
  streetAddress?: string;
6534
6654
  };