@communecter/cocolight-api-client 1.0.194 → 1.0.195

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.194",
3
+ "version": "1.0.195",
4
4
  "description": "Client Axios simplifié pour l'API cocolight",
5
5
  "repository": {
6
6
  "type": "git",
@@ -12,6 +12,14 @@ import type { ActionItemNormalized } from "./serverDataType/Action.js";
12
12
  * - `_add()` : COSTUM_PROJECT_ACTION_REQUEST_NEW (parentId/parentType injectés depuis le parent)
13
13
  * - `_update()` : UPDATE_PATH_VALUE field par field via CUSTOM_FIELD_HANDLERS
14
14
  * (pas d'endpoint dédié par bloc côté backend — on dispatche chaque champ modifié)
15
+ *
16
+ * Droits (gardes client) :
17
+ * - `_update()` : **auteur** (`serverData.creator`), **admin du projet parent** (via
18
+ * hiérarchie), ou **contributeur assigné** (`links.contributors[userId]`) ;
19
+ * - `delete()` : auteur ou admin seulement — supprimer est plus fort que corriger.
20
+ *
21
+ * Ces gardes restent indicatifs : l'autorité est le backend, qui pour l'édition accepte
22
+ * tout membre du projet parent (`Authorisation::canEditItem` → `canParticipate`).
15
23
  */
16
24
  export declare class Action extends BaseEntity<ActionItemNormalized> {
17
25
  static entityType: string;
@@ -263,8 +271,9 @@ export declare class Action extends BaseEntity<ActionItemNormalized> {
263
271
  * - Project : regarde `user.serverData.links.projects[projectId]` (sens user→project)
264
272
  * - Action : regarde `action.serverData.links.contributors[userId]` (sens inverse)
265
273
  *
266
- * Pour modifier des données de l'action, c'est `parent.isAdmin()` qui compte
267
- * (admin du projet parent) — pas cette méthode.
274
+ * Être contributeur assigné suffit à MODIFIER l'action (`_update` accepte auteur,
275
+ * admin du projet parent, ou contributeur), mais **pas à la supprimer** : `delete()`
276
+ * exige auteur ou admin.
268
277
  *
269
278
  * @param options.silent si `false`, throw en cas de précondition manquante. Par défaut `true`.
270
279
  */
@@ -43,6 +43,70 @@ export interface GenerateProjectResult {
43
43
  export interface GenerateMilestoneFromDepenseResult {
44
44
  milestoneId: string;
45
45
  }
46
+ /**
47
+ * Statut de paiement d'une ligne de financement, dans le vocabulaire du serveur.
48
+ *
49
+ * ⚠️ `payed` (sic) est la valeur réellement écrite par `Aap::recomputeFinancerPayment`
50
+ * (Aap.php:7179) — ce n'est pas `paid`. Traduire à l'affichage si besoin, mais ne
51
+ * jamais « corriger » la valeur stockée.
52
+ */
53
+ export type FinancerPaymentStatus = "unpaid" | "partial" | "payed";
54
+ /** Un versement journalisé dans `financer[i].payment.logs[]`. */
55
+ export interface FinancerPaymentLog {
56
+ invoiceId?: string;
57
+ financerId?: string;
58
+ financerName?: string;
59
+ finkey?: string;
60
+ amount?: number;
61
+ /** `"manual"` | `"stripe"` | `"helloasso"`. */
62
+ type?: string;
63
+ date?: unknown;
64
+ /** `"pending"` tant que le porteur n'a pas confirmé la réception des fonds. */
65
+ confirmation?: "pending" | "validated";
66
+ paidBy?: string;
67
+ validatedAt?: unknown;
68
+ validatedBy?: string;
69
+ /** Référence du prestataire de paiement, pour un encaissement en ligne. */
70
+ transactionId?: string;
71
+ }
72
+ /**
73
+ * Bloc `payment` d'une ligne de financement, recalculé par le serveur à chaque
74
+ * versement et à chaque validation.
75
+ *
76
+ * ⚠️ Seuls les logs `validated` alimentent `paidAmount` : un versement encaissé
77
+ * mais non confirmé figure en `pendingAmount`, et `status` reste `"unpaid"`.
78
+ */
79
+ export interface FinancerPaymentBlock {
80
+ logs?: FinancerPaymentLog[];
81
+ paidAmount?: number;
82
+ pendingAmount?: number;
83
+ status?: FinancerPaymentStatus;
84
+ }
85
+ /** Résultat de `Answer.addFinancer()`. `finkey` est la clé stable de la ligne créée. */
86
+ export interface AddFinancerResult {
87
+ depenseKey: string;
88
+ finkey: string;
89
+ finIndex?: number;
90
+ }
91
+ /** Résultat de `Answer.payFinancer()`. */
92
+ export interface PayFinancerResult {
93
+ /** Identifiant du versement — à conserver pour le valider ensuite. */
94
+ invoiceId: string;
95
+ /** `"validated"` seulement si celui qui enregistre administre le projet receveur. */
96
+ confirmation: "pending" | "validated";
97
+ /** Bloc `payment` tel que le serveur l'a recalculé après le versement. */
98
+ payment?: FinancerPaymentBlock;
99
+ }
100
+ /** Résultat de `Answer.validateFinancerPayment()`. */
101
+ export interface ValidateFinancerPaymentResult {
102
+ invoiceId: string;
103
+ confirmation: "validated";
104
+ }
105
+ /** Résultat de `Answer.deleteFinancer()`. `remaining` = financeurs restants sur la dépense. */
106
+ export interface DeleteFinancerResult {
107
+ depenseKey: string;
108
+ remaining: number;
109
+ }
46
110
  /** Un axe du radar multi-eval (= un input radioNew d'une step donnée). */
47
111
  export interface MultiEvalAxis {
48
112
  key: string;
@@ -272,27 +336,42 @@ export declare class Answer extends BaseEntity<AnswerItemNormalized> {
272
336
  * - `serverData` et `draftData` sont vidés (sans casser la réactivité)
273
337
  * - `_isDeleted = true` → toute mutation ultérieure (`save`, `get`, etc.) throw
274
338
  *
275
- * **Guard** : autorisation côté client si l'utilisateur courant est :
339
+ * **Guard** (déléguée à `_deleteViaElement`) : autorisation côté client si
340
+ * l'utilisateur courant est :
341
+ * - **super-admin**, ou **admin de costum** dont le droit a été pré-résolu par
342
+ * l'appelant via `setCostumAdminAuthorized()` — parité du backend
343
+ * `canDeleteElement` (`isUserSuperAdmin` puis `isCostumAdmin`) ; OU
276
344
  * - l'**auteur** de l'Answer (`serverData.user === userId`), OU
277
345
  * - **admin** d'un parent du Form (org/project) via la hiérarchie
278
- * (`form.serverData.parent[orgId]` × `userContext.links.memberOf[orgId].isAdmin`).
346
+ * (`form.serverData.parent[orgId]` × `userContext.links.memberOf[orgId].isAdmin`),
347
+ * résolue par l'override `Answer._isAdminViaHierarchy`.
279
348
  *
280
- * Le check utilise `isAuthorOrAdmin({checkHierarchy: true})` qui s'appuie sur
281
- * l'override `Answer._isAdminViaHierarchy` (remonte via parent instance Form).
282
- *
283
- * **Pré-requis** :
349
+ * **Pré-requis** pour la branche hiérarchie :
284
350
  * - `this.parent` doit être un Form (cas `form.answer({id})`)
285
351
  * - `userContext` (User connecté) doit avoir `serverData.links` chargés (cas `api.me()`)
286
- * Sans ces pré-requis, seul `isAuthor` peut autoriser.
352
+ * Sans ces pré-requis, seuls `isAuthor` et le droit élevé peuvent autoriser.
353
+ *
354
+ * ⚠️ `isAuthor()` lit `serverData.user`, que `findanswered` REMPLACE par
355
+ * l'entité d'affichage (l'organisation, sur une réponse portée par une orga) ;
356
+ * le déposant reste dans `serverData.userId`. Sur ces réponses-là, la branche
357
+ * auteur ne reconnaît donc pas le véritable auteur.
358
+ *
359
+ * Le serveur reste la source de vérité dans tous les cas.
287
360
  *
288
361
  * @param reason - Raison libre transmise au backend (audit). Défaut : `"delete coform answer"`.
289
362
  * @throws {ApiError} 400 si l'Answer n'a pas d'id (jamais sauvegardée).
290
- * @throws {ApiError} 403 si ni auteur ni admin du parent.
363
+ * @throws {ApiError} 403 si ni droit élevé, ni auteur, ni admin du parent.
291
364
  *
292
365
  * @example
293
366
  * const answer = await form.answer({ id: "..." });
294
367
  * await answer.delete(); // OK si auteur OU admin org/project parent du Form
295
368
  * answer._isDeleted; // true
369
+ *
370
+ * @example
371
+ * // Admin de costum : poser le droit AVANT l'appel, sinon la garde client refuse.
372
+ * const answer = await form.answer({ id: "..." });
373
+ * answer.setCostumAdminAuthorized();
374
+ * await answer.delete();
296
375
  */
297
376
  delete(reason?: string): Promise<void>;
298
377
  /**
@@ -440,6 +519,145 @@ export declare class Answer extends BaseEntity<AnswerItemNormalized> {
440
519
  * const { milestoneId } = await answer.generateMilestoneFromDepense("0");
441
520
  */
442
521
  generateMilestoneFromDepense(depenseKey: string): Promise<GenerateMilestoneFromDepenseResult>;
522
+ /**
523
+ * Traduit une réponse d'échec du dispatcher `coremuoperation` en `ApiError`.
524
+ *
525
+ * Le backend répond toujours HTTP 200 avec `{success: 0, msg}` (ou
526
+ * `{success: 0, content}` pour la validation du dispatcher) : sans cette
527
+ * traduction, un refus de droits passerait pour un succès. Le code HTTP est
528
+ * déduit du message, seule information que le serveur donne sur la nature du
529
+ * refus (`Aap.php:7285-7618`).
530
+ */
531
+ private static financerOperationError;
532
+ /**
533
+ * Ajoute une promesse de financement sur une dépense de cette Answer.
534
+ *
535
+ * L'entrée écrite dans `answers.aapStep1.depense.<depenseKey>.financer[]` est
536
+ * construite **par le serveur**, au format canonique : `finkey` (clé stable de
537
+ * la ligne), `line`, `status: "pending"` et `payment: {logs: []}`. Ne jamais
538
+ * fabriquer cette entrée côté client — `finkey` vient de `random_bytes` serveur,
539
+ * et les agrégats de `payment` sont recalculés à chaque versement.
540
+ *
541
+ * Préférer `milestoneId` à `depenseKey` : le serveur résout alors la clé
542
+ * lui-même, ce qui évite de confondre la **clé** du sous-document dépense
543
+ * (ex. `"3"`) avec sa **position** dans la liste densifiée — `depense` arrive
544
+ * parfois en objet à clés creuses.
545
+ *
546
+ * Constant : `COREMU_ADD_FINANCER` (POST `/co2/aap/coremuoperation/`, auth bearer —
547
+ * le backend lit `Yii::app()->session['userId']`, alimentée par le JWT).
548
+ *
549
+ * @param opts.financerId - Qui s'engage : soi-même, une organisation qu'on
550
+ * administre, ou un tiers si l'on est porteur du projet.
551
+ * @param opts.amount - Montant engagé, strictement positif.
552
+ * @param opts.milestoneId - Jalon visé (recommandé).
553
+ * @param opts.depenseKey - Clé de la dépense — requise seulement sans `milestoneId`.
554
+ * @returns `{ depenseKey, finkey, finIndex }` — conserver `finkey` : c'est par
555
+ * elle que se cible le versement.
556
+ * @throws {ApiError} 400 si Answer sans id, si ni `milestoneId` ni `depenseKey`
557
+ * n'est fourni, ou si la dépense est introuvable.
558
+ * @throws {ApiError} 403 si l'on ne peut pas s'engager pour ce financeur.
559
+ * @throws {ApiAuthenticationError} si non connecté.
560
+ *
561
+ * @example
562
+ * const { finkey, depenseKey } = await answer.addFinancer({
563
+ * milestoneId, financerId: me.id, amount: 1000,
564
+ * });
565
+ */
566
+ addFinancer(opts: {
567
+ financerId: string;
568
+ amount: number;
569
+ milestoneId?: string;
570
+ depenseKey?: string;
571
+ }): Promise<AddFinancerResult>;
572
+ /**
573
+ * Enregistre un versement sur une promesse de financement de cette Answer.
574
+ *
575
+ * ⚠️ Le montant n'est **comptabilisé** (`payment.paidAmount`) qu'une fois le
576
+ * versement validé par le porteur. Le log naît `confirmation: "validated"`
577
+ * seulement si celui qui enregistre administre le projet receveur ; sinon il
578
+ * naît `"pending"`. Un encaissement Stripe/HelloAsso par un tiers est donc
579
+ * réellement encaissé mais compté en `pendingAmount` jusqu'à confirmation —
580
+ * l'UI ne doit pas annoncer « non payé » à qui vient de régler par carte.
581
+ *
582
+ * Toujours passer `finkey` : le ciblage par position casse dès qu'une
583
+ * insertion concurrente décale `financer[]`.
584
+ *
585
+ * Constant : `COREMU_PAY_FINANCER` (POST `/co2/aap/coremuoperation/`, auth bearer).
586
+ *
587
+ * @param opts.amount - Montant versé. Un versement partiel est légitime.
588
+ * @param opts.paymentType - `"manual"` (défaut), `"stripe"` ou `"helloasso"`.
589
+ * @param opts.transactionId - Référence du prestataire de paiement, journalisée
590
+ * avec le versement.
591
+ * @returns `{ invoiceId, confirmation, payment }` — `invoiceId` sert à valider
592
+ * le versement ensuite.
593
+ * @throws {ApiError} 400 si Answer sans id ou arguments invalides ; 403 si l'on
594
+ * ne peut pas verser pour ce financeur ; 404 si la ligne est introuvable.
595
+ * @throws {ApiAuthenticationError} si non connecté.
596
+ *
597
+ * @example
598
+ * const { invoiceId, payment } = await answer.payFinancer({
599
+ * depenseKey, financerId, finkey, amount: 500, paymentType: "stripe",
600
+ * });
601
+ * payment.status; // "unpaid" tant que le porteur n'a pas validé
602
+ */
603
+ payFinancer(opts: {
604
+ depenseKey: string;
605
+ financerId: string;
606
+ amount: number;
607
+ finkey?: string;
608
+ finIndex?: number;
609
+ paymentType?: string;
610
+ transactionId?: string;
611
+ }): Promise<PayFinancerResult>;
612
+ /**
613
+ * Valide un versement reçu : le porteur confirme avoir touché les fonds.
614
+ *
615
+ * C'est ce passage à `validated` qui fait entrer le montant dans
616
+ * `payment.paidAmount` — avant lui, l'argent figure en `pendingAmount`.
617
+ * Réservé à l'admin du projet, à l'admin de l'organisation parente ou à un
618
+ * super-admin : le financeur ne valide pas son propre versement.
619
+ *
620
+ * Constant : `COREMU_VALIDATE_FINANCER_PAYMENT` (POST `/co2/aap/coremuoperation/`, auth bearer).
621
+ *
622
+ * @param opts.invoiceId - Identifiant du versement, rendu par `payFinancer`.
623
+ * @throws {ApiError} 400 si Answer sans id ou arguments manquants ; 403 si l'on
624
+ * n'administre pas le projet ; 404 si aucun log ne porte cet `invoiceId`.
625
+ * @throws {ApiAuthenticationError} si non connecté.
626
+ *
627
+ * @example
628
+ * await answer.validateFinancerPayment({ depenseKey, invoiceId });
629
+ */
630
+ validateFinancerPayment(opts: {
631
+ depenseKey: string;
632
+ invoiceId: string;
633
+ }): Promise<ValidateFinancerPaymentResult>;
634
+ /**
635
+ * Retire une promesse de financement de cette Answer.
636
+ *
637
+ * **Refusé (409) dès que la ligne porte un versement**, même non validé :
638
+ * supprimer la promesse effacerait la trace de l'argent.
639
+ *
640
+ * Droits plus étroits que pour l'ajout : seul le financeur, ou l'admin de
641
+ * l'organisation financeuse, peut retirer un engagement — administrer le projet
642
+ * receveur ne suffit pas.
643
+ *
644
+ * Constant : `COREMU_DELETE_FINANCER` (POST `/co2/aap/coremuoperation/`, auth bearer).
645
+ *
646
+ * @returns `{ depenseKey, remaining }` — `remaining` = financeurs restants sur la dépense.
647
+ * @throws {ApiError} 400 si Answer sans id ou arguments manquants ; 403 si l'on
648
+ * ne peut pas agir pour ce financeur ; 404 si la ligne est introuvable ;
649
+ * 409 si un versement y est déjà rattaché.
650
+ * @throws {ApiAuthenticationError} si non connecté.
651
+ *
652
+ * @example
653
+ * const { remaining } = await answer.deleteFinancer({ depenseKey, financerId, finkey });
654
+ */
655
+ deleteFinancer(opts: {
656
+ depenseKey: string;
657
+ financerId: string;
658
+ finkey?: string;
659
+ finIndex?: number;
660
+ }): Promise<DeleteFinancerResult>;
443
661
  /**
444
662
  * Récupère les datasets agrégés des évaluations multiples (radar) de cette
445
663
  * 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, 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, NavigatorGetRessourceTlData, 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";
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, NavigatorGetRessourceTlData, 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, CoremuAddFinancerData, CoremuPayFinancerData, CoremuValidateFinancerPaymentData, CoremuDeleteFinancerData, 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
  */
@@ -1380,6 +1380,46 @@ export declare class EndpointApi {
1380
1380
  * @throws {Error} - En cas d'erreur inattendue.
1381
1381
  */
1382
1382
  coremuOperation(data: CoremuOperationData): Promise<any>;
1383
+ /**
1384
+ * Ajouter une promesse de financement sur une dépense : Crée un engagement de financement dans answers.aapStep1.depense.<depenseKey>.financer[] au format canonique : {line:'', amount, user, date, name, id, type, status:'pending', finkey, payment:{logs:[]}}. La `finkey` (clé stable de la ligne) et le nom/type du financeur sont résolus SERVEUR — ne jamais les envoyer. Aap::addFinancerEngagement (Aap.php:7285-7362). Droits : financeur lui-même, admin de l'organisation financeuse, ou porteur du projet (Aap.php:7313). Dispatch : CoremuOperationAction.php:175-186 (switch sur $_POST['action']), route déclarée dans modules/co2/controllers/AapController.php:74. auth bearer : le backend lit Yii::app()->session['userId'], alimentée par le JWT via CommunecterController::beforeAction → Authorisation::isJwtconnected → Person::saveUserSessionData.
1385
+ * Constant : COREMU_ADD_FINANCER
1386
+ * @param data - Données envoyées à l'API
1387
+ * @returns Les données de réponse.
1388
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1389
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1390
+ * @throws {Error} - En cas d'erreur inattendue.
1391
+ */
1392
+ coremuAddFinancer(data: CoremuAddFinancerData): Promise<any>;
1393
+ /**
1394
+ * Enregistrer un versement sur une promesse de financement : Pousse un log dans financer[i].payment.logs[] et recalcule paidAmount/pendingAmount/status. `invoiceId` est généré serveur ('FIN-'+YmdHis+'-'+5 premiers car. du financerId). Le log naît confirmation:'validated' si le payeur administre le projet receveur, sinon 'pending' — un encaissement Stripe/HelloAsso par un tiers reste donc en attente de confirmation du porteur, et n'entre PAS dans paidAmount tant qu'il n'est pas validé. Aap::payFinancerEngagement (Aap.php:7468-7562). Dispatch : CoremuOperationAction.php:175-186 (switch sur $_POST['action']), route déclarée dans modules/co2/controllers/AapController.php:74. auth bearer : le backend lit Yii::app()->session['userId'], alimentée par le JWT via CommunecterController::beforeAction → Authorisation::isJwtconnected → Person::saveUserSessionData.
1395
+ * Constant : COREMU_PAY_FINANCER
1396
+ * @param data - Données envoyées à l'API
1397
+ * @returns Les données de réponse.
1398
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1399
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1400
+ * @throws {Error} - En cas d'erreur inattendue.
1401
+ */
1402
+ coremuPayFinancer(data: CoremuPayFinancerData): Promise<any>;
1403
+ /**
1404
+ * Valider un versement reçu sur une promesse de financement : Le porteur confirme avoir reçu les fonds : passe le log d'`invoiceId` à confirmation:'validated', pose validatedAt/validatedBy, puis recalcule le bloc payment — c'est ce passage qui fait entrer le montant dans paidAmount. Réservé à l'admin du projet, l'admin de l'organisation parente ou un super-admin (Aap.php:7577). Aap::validateFinancerPayment (Aap.php:7559-7618). Dispatch : CoremuOperationAction.php:175-186 (switch sur $_POST['action']), route déclarée dans modules/co2/controllers/AapController.php:74. auth bearer : le backend lit Yii::app()->session['userId'], alimentée par le JWT via CommunecterController::beforeAction → Authorisation::isJwtconnected → Person::saveUserSessionData.
1405
+ * Constant : COREMU_VALIDATE_FINANCER_PAYMENT
1406
+ * @param data - Données envoyées à l'API
1407
+ * @returns Les données de réponse.
1408
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1409
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1410
+ * @throws {Error} - En cas d'erreur inattendue.
1411
+ */
1412
+ coremuValidateFinancerPayment(data: CoremuValidateFinancerPaymentData): Promise<any>;
1413
+ /**
1414
+ * Retirer une promesse de financement : Retire un engagement de financer[]. REFUSÉ si la ligne porte le moindre versement, même non validé : effacer la promesse effacerait la trace de l'argent (Aap.php:7408-7414). Droits plus étroits que pour l'ajout — seul le financeur ou l'admin de l'organisation financeuse peut retirer ; administrer le projet receveur ne suffit PAS (Aap.php:7404). Aap::deleteFinancerEngagement (Aap.php:7377-7430). Dispatch : CoremuOperationAction.php:175-186 (switch sur $_POST['action']), route déclarée dans modules/co2/controllers/AapController.php:74. auth bearer : le backend lit Yii::app()->session['userId'], alimentée par le JWT via CommunecterController::beforeAction → Authorisation::isJwtconnected → Person::saveUserSessionData.
1415
+ * Constant : COREMU_DELETE_FINANCER
1416
+ * @param data - Données envoyées à l'API
1417
+ * @returns Les données de réponse.
1418
+ * @throws {ApiResponseError} - En cas d'erreur détectée dans la réponse.
1419
+ * @throws {ApiAuthenticationError} - En cas d'erreur d'authentification.
1420
+ * @throws {Error} - En cas d'erreur inattendue.
1421
+ */
1422
+ coremuDeleteFinancer(data: CoremuDeleteFinancerData): Promise<any>;
1383
1423
  /**
1384
1424
  * Ajouter nouvel action : Crée une nouvelle action rattachée à un projet.
1385
1425
  * Constant : COSTUM_PROJECT_ACTION_REQUEST_NEW
@@ -6765,6 +6765,109 @@ export interface CoremuOperationData {
6765
6765
  project: string;
6766
6766
  [k: string]: unknown;
6767
6767
  }
6768
+ export interface CoremuAddFinancerData {
6769
+ /**
6770
+ * Action du dispatcher.
6771
+ */
6772
+ action: "addFinancer";
6773
+ /**
6774
+ * ID de la réponse (collection answers) portant la dépense.
6775
+ */
6776
+ answer: string;
6777
+ /**
6778
+ * Jalon visé. PRÉFÉRER ce champ à `depenseKey` : le serveur résout la clé lui-même (findDepenseKeyForMilestone, Aap.php:7436-7456), ce qui évite le piège position/clé du tableau `depense`.
6779
+ */
6780
+ milestoneId?: string;
6781
+ /**
6782
+ * Clé du sous-document dépense — la CLÉ Mongo (ex. "3"), PAS la position dans la liste densifiée. Requis seulement si `milestoneId` est absent (dépense orpheline).
6783
+ */
6784
+ depenseKey?: string;
6785
+ /**
6786
+ * ID du financeur (citoyen, organisation ou projet).
6787
+ */
6788
+ financerId: string;
6789
+ /**
6790
+ * Montant engagé, strictement positif.
6791
+ */
6792
+ amount: number;
6793
+ [k: string]: unknown;
6794
+ }
6795
+ export interface CoremuPayFinancerData {
6796
+ action: "payFinancer";
6797
+ /**
6798
+ * ID de la réponse portant la dépense.
6799
+ */
6800
+ answer: string;
6801
+ /**
6802
+ * Clé du sous-document dépense (CLÉ Mongo, pas la position).
6803
+ */
6804
+ depenseKey: string;
6805
+ /**
6806
+ * ID du financeur dont on règle l'engagement.
6807
+ */
6808
+ financerId: string;
6809
+ /**
6810
+ * Clé stable de la ligne visée — TOUJOURS l'envoyer. Le ciblage par position (`finIndex`) casse dès qu'une insertion concurrente décale le tableau. Résolution : finIndex → finkey → premier id (Aap.php:7131-7152).
6811
+ */
6812
+ finkey?: string;
6813
+ /**
6814
+ * Position dans financer[] — repli pour les lignes antérieures à `finkey`.
6815
+ */
6816
+ finIndex?: number;
6817
+ /**
6818
+ * Montant versé, strictement positif.
6819
+ */
6820
+ amount: number;
6821
+ /**
6822
+ * Moyen du versement : 'manual' (défaut), 'stripe', 'helloasso'.
6823
+ */
6824
+ payment_type?: string;
6825
+ /**
6826
+ * Référence du prestataire de paiement, journalisée avec le versement. Optionnelle — sans objet pour un versement manuel.
6827
+ */
6828
+ transactionId?: string;
6829
+ [k: string]: unknown;
6830
+ }
6831
+ export interface CoremuValidateFinancerPaymentData {
6832
+ action: "validateFinancerPayment";
6833
+ /**
6834
+ * ID de la réponse portant la dépense.
6835
+ */
6836
+ answer: string;
6837
+ /**
6838
+ * Clé du sous-document dépense (CLÉ Mongo, pas la position).
6839
+ */
6840
+ depenseKey: string;
6841
+ /**
6842
+ * Identifiant du versement à valider, rendu par payFinancer.
6843
+ */
6844
+ invoiceId: string;
6845
+ [k: string]: unknown;
6846
+ }
6847
+ export interface CoremuDeleteFinancerData {
6848
+ action: "deleteFinancer";
6849
+ /**
6850
+ * ID de la réponse portant la dépense.
6851
+ */
6852
+ answer: string;
6853
+ /**
6854
+ * Clé du sous-document dépense (CLÉ Mongo, pas la position).
6855
+ */
6856
+ depenseKey: string;
6857
+ /**
6858
+ * ID du financeur dont on retire l'engagement.
6859
+ */
6860
+ financerId: string;
6861
+ /**
6862
+ * Clé stable de la ligne visée — à envoyer dès qu'elle existe.
6863
+ */
6864
+ finkey?: string;
6865
+ /**
6866
+ * Position — repli pour les lignes sans `finkey`.
6867
+ */
6868
+ finIndex?: number;
6869
+ [k: string]: unknown;
6870
+ }
6768
6871
  export interface CostumProjectActionRequestNewData {
6769
6872
  /**
6770
6873
  * Nom de l'action