> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fluz.app/llms.txt
> Use this file to discover all available pages before exploring further.

# 提交 RFI

> 使用 submitRfi 提交客户对信息请求的答复,可一次性提交或分批提交,并处理针对各个问题的验证错误。

## 概述

**submitRfi** mutation 用于保存客户对未完成 RFI 的答复。

* 当 `finalize: true`(默认值)时,RFI 会被提交审核并进入 `IN_REVIEW` 状态。所有必答问题都必须已回答,可以在本次调用中回答,也可以是之前已保存的答复。
* 当 `finalize: false` 时,仅保存您发送的答复,RFI 保持 `PENDING_DOCUMENTS` 状态,其余答复可在之后的调用中继续提交。

无论哪种方式,都会根据 RFI 的问题对答复进行验证。

## 所需权限范围

| 属性 | 值 |
| - | - |
| 端点 | GraphQL API |
| 身份验证 | OAuth Bearer 令牌。不接受基本身份验证 |
| 所需权限范围 | `MANAGE_RFI` |

请使用与读取该 RFI 时相同的客户令牌。请参阅[谁可以回答 RFI](https://docs.fluz.app/rfi-overview#who-can-answer-an-rfi)。

## 基本 mutation 结构

```graphql theme={null}
mutation SubmitRfi($input: SubmitRfiInput!) {
  submitRfi(input: $input) {
    success
    rfiId
    status
    error {
      code
      message
      validationErrors {
        questionId
        code
        message
      }
    }
  }
}
```

## 参数

### SubmitRfiInput

| 字段 | 类型 | 必填 | 描述 |
| - | - | - | - |
| `rfiId` | `UUID!` | 是 | 要回答的 RFI |
| `answers` | `[RfiAnswerInput!]!` | 是 | 尚无已保存答复的问题的答复 |
| `finalize` | `Boolean` | 否 | `true`(默认):将 RFI 提交审核。`false`:保存这些答复并保持 RFI 处于开放状态 |

### RfiAnswerInput

| 字段 | 类型 | 必填 | 描述 |
| - | - | - | - |
| `questionId` | `String!` | 是 | 来自 `RfiQuestion.questionId` |
| `value` | `JSON` | — | 答复内容。其结构取决于问题类型,请参阅[问题类型](https://docs.fluz.app/rfi-overview#question-types) |

每个问题只发送一个答复。请不要包含:

* `isSubmitted: true` 的问题(已保存),
* `SECTION_BREAK` 问题,
* 已通过 [completeRfiPlaidLink](https://docs.fluz.app/complete-rfi-plaid-link) 回答的银行链接和地址问题,除非您改为为它们上传文档。

## 示例变量

```json theme={null}
{
  "input": {
    "rfiId": "7c1e2a90-4b3d-4f6e-9a18-3d5b2c7e8f01",
    "finalize": true,
    "answers": [
      {
        "questionId": "q_formation",
        "value": [
          { "fileId": "b52f0e4a-1c7d-4a9b-8e36-0f2d9c4a7b15" }
        ]
      },
      {
        "questionId": "q_address",
        "value": [
          { "fileId": "e1d94c3b-6a2f-4c8e-b07d-5a9f1e3c2d48" }
        ]
      },
      {
        "questionId": "q_source_of_funds",
        "value": "Other"
      },
      {
        "questionId": "q_source_of_funds_other",
        "value": "Proceeds from the sale of a previous business"
      }
    ]
  }
}
```

## cURL 示例

```bash theme={null}
curl -X POST https://transactional-graph.staging.fluzapp.com/api/v1/graphql \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer <ACCESS_TOKEN>" \
  -d '{
    "query": "mutation SubmitRfi($input: SubmitRfiInput!) { submitRfi(input: $input) { success rfiId status error { code message validationErrors { questionId code message } } } }",
    "variables": {
      "input": {
        "rfiId": "7c1e2a90-4b3d-4f6e-9a18-3d5b2c7e8f01",
        "answers": [
          { "questionId": "q_source_of_funds", "value": "Business revenue" }
        ]
      }
    }
  }'
```

## 响应详情

### SubmitRfiResponse

| 字段 | 类型 | 描述 |
| - | - | - |
| `success` | `Boolean!` | 答复已保存时为 `true` |
| `rfiId` | `UUID!` | 输入中的 RFI |
| `status` | `RfiStatus` | 最终提交时为 `IN_REVIEW`。当 `finalize` 为 `false` 时为 `PENDING_DOCUMENTS`。失败时为 `null` |
| `error` | `SubmitRfiError` | 当 `success` 为 `false` 时设置 |

### 成功

```json theme={null}
{
  "data": {
    "submitRfi": {
      "success": true,
      "rfiId": "7c1e2a90-4b3d-4f6e-9a18-3d5b2c7e8f01",
      "status": "IN_REVIEW",
      "error": null
    }
  }
}
```

### 验证失败

```json theme={null}
{
  "data": {
    "submitRfi": {
      "success": false,
      "rfiId": "7c1e2a90-4b3d-4f6e-9a18-3d5b2c7e8f01",
      "status": null,
      "error": {
        "code": "RFI_VALIDATION_FAILED",
        "message": "Some answers are invalid.",
        "validationErrors": [
          {
            "questionId": "q_address",
            "code": "REQUIRED",
            "message": "This question is required. Upload a document or link a bank account with completeRfiPlaidLink."
          },
          {
            "questionId": "q_source_of_funds",
            "code": "DUPLICATE_ANSWER",
            "message": "Only one answer per question is allowed."
          }
        ]
      }
    }
  }
}
```

验证失败时,本次调用中的任何内容都不会被保存。请修正所列出的答复,然后重新发送调用。

## 分批保存

使用 `finalize: false` 可让客户中途离开后再回来,或者在客户填写长表单时逐页保存。

> [!WARNING]
>
> **已保存的答复不可更改。** 一旦某个问题有了已保存的答复,它就会被标记为 `isSubmitted: true` 且无法更改,再次发送会返回 `ALREADY_SUBMITTED`。请仅在客户确认答复后再保存。唯一的例外是 Plaid 银行链接,[completeRfiPlaidLink](https://docs.fluz.app/complete-rfi-plaid-link) 可以替换它。

* 部分保存不会更改 RFI 的状态,也不会将其提交审核。
* 必答问题仅在最终提交时检查。如果所有必答问题都已保存,最终提交的调用可以仅为 `{ "rfiId": "...", "answers": [] }`。
* 最终提交后,RFI 处于 `IN_REVIEW` 状态,后续调用将返回 `RFI_NOT_OPEN`。如果 Fluz 需要更多信息,RFI 会带着新问题回到 `PENDING_DOCUMENTS` 状态。

## 条件问题

`visibilityCondition` 不成立的问题会被跳过:

* 它们不是必答的,并且
* 您为它们发送的任何答复都会被忽略,不会报错,也不会保存。

可见性根据按 `ordinal` 顺序排列的前面答复来判断,使用已保存的答复以及同一次调用中的答复。请参阅[条件问题](https://docs.fluz.app/rfi-overview#conditional-questions)。

## 错误代码

### 负载错误

`submitRfi` 在负载中返回 RFI 错误并带有 `success: false`,而不是在顶层 `errors` 数组中。

| `error.code` | 描述 | 解决方法 |
| - | - | - |
| `ACCESS_DENIED` | RFI 不存在,或其收件对象不是该令牌对应的用户和账户 | 使用您读取该 RFI 时所用的令牌 |
| `RFI_NOT_OPEN` | RFI 不处于 `PENDING_DOCUMENTS` 状态,即已在审核中或已完成 | 读取该 RFI 以查看其状态 |
| `RFI_EXPIRED` | RFI 已过期 | 引导客户联系支持团队 |
| `RFI_VALIDATION_FAILED` | 一个或多个答复未通过验证。请参阅 `validationErrors` | 修正每个列出的答复并重新发送 |
| `RFI_SUBMIT_FAILED` | 意外错误 | 重试一次。如果问题仍然存在,请联系支持团队并提供 `rfiId` |

### validationErrors 代码

| `code` | 描述 |
| - | - |
| `UNKNOWN_QUESTION` | 没有具有此 `questionId` 的可回答问题,或者它是 `SECTION_BREAK` |
| `ALREADY_SUBMITTED` | 该问题已有已保存的答复 |
| `DUPLICATE_ANSWER` | 同一个 `questionId` 在 `answers` 中出现多次 |
| `REQUIRED` | 适用的必答问题没有答复。仅在最终提交时出现 |
| `INVALID_VALUE` | 值与问题类型不匹配,例如格式错误、不属于 `options` 之一、文件过多、`fileId` 是为其他问题上传的或被重复使用,或该问题不接受该文件类型 |

### 顶层错误

这些错误在 mutation 运行之前就会在 `errors` 数组中返回。

| 代码 | 名称 | 描述 | 解决方法 |
| - | - | - | - |
| `AUTH-0002` | InvalidCredentials | 使用了基本身份验证 | 使用 Bearer 用户令牌调用 |
| `AUTH-0031` | InvalidScope | 令牌缺少 `MANAGE_RFI` | 添加该权限范围并重新生成令牌 |

## 最佳实践

* **先在您的 UI 中验证。** 调用前检查格式、选项和必填字段,以便尽量减少验证失败。
* **只最终提交一次。** 如有需要,可使用 `finalize: false` 逐页保存,并在客户点击提交时再最终提交。
* **展示结果。** 进入 `IN_REVIEW` 后,显示“审核中”状态,并停止针对此 RFI 向客户发出提示。

## 相关页面

> [card] [读取 RFI](https://docs.fluz.app/get-rfis)
>
> 问题、已保存的答复和状态。

> [card] [上传 RFI 文档](https://docs.fluz.app/upload-rfi-document)
>
> 获取文件类问题所需的 `fileId` 值。

> [card] [通过银行链接回答](https://docs.fluz.app/complete-rfi-plaid-link)
>
> 使用 Plaid 回答银行对账单和地址证明类问题。

> [card] [RFI 概述](https://docs.fluz.app/rfi-overview)
>
> 状态、问题类型和完整流程。


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.