列出费用类别并创建一项费用
学习费用类别以及如何使用 FreshBooks API 创建费用。
在本课程中,我们将列出 FreshBooks 提供的默认费用类别,然后创建我们的费用。FreshBooks 提供了记录企业支出的功能。
本课程讨论了以下两个端点:
- 列出费用类别:
/accounting/account/{ACCOUNT_ID}/expenses/categories - 创建费用:
/accounting/account/{ACCOUNT_ID}/expenses/expenses
费用相关端点需要 user:expenses:read 和 user:expenses:write 范围权限才能执行操作。
列出费用类别
FreshBooks 提供了一些默认的类别和子类别,用于对费用进行分组,使追踪更加方便。
本节将介绍如何获取所有可用的默认费用类别的列表。我们使用 /accounting/account/{ACCOUNT_ID}/expenses/categories 端点来获取费用类别列表。
请求参数
此端点不接受任何请求参数。但我们可以使用 include[] 添加查询参数。使用 include 的语法如下:
1/expenses/categories?include[]=<VALUE>
可以作为 include 查询参数传递的值有两个:
expense_usage_all_time:该参数添加该类别在所有时间段内的费用使用情况。expense_usage_this_year:该参数包含该类别在当前年度的费用使用情况。
注意:请参考附录中的“重新生成访问令牌”一课,重新生成访问令牌。
1// 导入库 2const fetch = require('node-fetch'); 3 4// 定义端点 URL 5const endpointUrl = 'https://api.freshbooks.com/accounting/account/{{ACCOUNT_ID}}/expenses/categories'; 6 7const headerParameters = { 8 'Authorization': 'Bearer {{ACCESS_TOKEN}}', 9 'Content-Type': 'application/json', 10}; 11 12// 设置 API 调用选项 13const options = { 14 method: 'GET', 15 headers: headerParameters, 16}; 17 18// 执行 API 调用的函数 19async function listExpenseCategories() { 20 try { 21 const response = await fetch(`${endpointUrl}`, options); 22 printResponse(response); 23 } catch (error) { 24 // 打印错误信息 25 printError(error); 26 } 27} 28 29// 调用函数执行 API 调用 30listExpenseCategories();
让我们看一下上述代码中的高亮行:
- 第 5 行:我们定义了
endpointUrl,用于获取费用类别的列表。 - 第 21 行:我们使用
fetch函数发起一个 GET 请求。 - 第 30 行:我们调用了
listExpenseCategories函数。
响应字段
上述代码成功执行后,返回 categories 数组,其中包含每个类别的详细信息。以下是部分响应字段说明:
| 响应字段 | 描述 |
|---|---|
| category | 类别名称 |
| categoryid | 该类别的唯一 ID |
| is_editable | 表示该类别是否可编辑,值为 true 或 false |
| vis_state | 类别的状态,0 表示激活,1 表示已删除 |
创建费用
本节我们将为特定类别创建一笔费用。我们使用 /accounting/account/{ACCOUNT_ID}/expenses/expenses 端点。
请求参数
POST 请求的 bodyParameters 对象包含一个 expense 对象。以下是重要字段的说明:
| 参数名称 | 类型 | 必填 | 描述 |
|---|---|---|---|
| has_receipt | 布尔值 | 可选 | 表示是否附加了收据,值为 true 或 false |
| amount | 对象 | 必填 | 费用金额对象,包含 amount(金额,字符串)和 code(货币代码) |
| notes | 字符串 | 可选 | 添加关于该费用的备注 |
| vendor | 字符串 | 可选 | 定义供应商名称 |
| date | 字符串(格式:YYYY-MM-DD) | 必填 | 费用发生日期 |
| staffid | 整数 | 必填 | 相关员工的 ID(如适用) |
| categoryid / category_name | 字符串 | 必填 | 定义相关费用类别的 ID 或名称 |
我们将使用上表中的参数创建一笔费用。执行以下代码后,系统会自动从响应中提取费用 ID。> 注意:请参考附录中的“重新生成访问令牌”一课,重新生成访问令牌。
1// 导入库 2const fetch = require('node-fetch'); 3const date = new Date(); 4 5let day = date.getDate(); 6let month = date.getMonth() + 1; 7let year = date.getFullYear(); 8let currentDate = `${year}-${month}-${day}`; 9 10// 定义端点 URL 11const endpointUrl = 'https://api.freshbooks.com/accounting/account/{{ACCOUNT_ID}}/expenses/expenses'; 12 13const headerParameters = { 14 'Authorization': 'Bearer {{ACCESS_TOKEN}}', 15 'Content-Type': 'application/json', 16}; 17 18// 定义请求体参数 19const bodyParameters = JSON.stringify({ 20 "expense": { 21 "has_receipt": false, 22 "amount": { 23 "amount": "40.00", 24 "code": "USD" 25 }, 26 "notes": "购买了3个样品", 27 "vendor": "John Doe", 28 "date": currentDate, 29 "staffid": 1, 30 "category_name": "广告" 31 } 32}); 33 34// 设置 API 调用选项 35const options = { 36 method: 'POST', 37 headers: headerParameters, 38 body: bodyParameters, 39}; 40 41// 执行 API 调用的函数 42async function createExpense() { 43 try { 44 const response = await fetch(`${endpointUrl}`, options); 45 printResponse(response); 46 } catch (error) { 47 // 打印错误信息 48 printError(error); 49 } 50} 51 52// 调用函数执行 API 调用 53createExpense();
让我们看一下上述代码中的高亮行:
- 第 11 行:我们定义了用于创建费用的
endpointUrl。 - 第 19 至 32 行:我们定义了包含
expense对象的bodyParameters。 - 第 44 行:我们使用
fetch函数发起一个 POST 请求。 - 第 53 行:我们调用了
createExpense函数。
响应字段
上述代码返回一个 expense 对象,其中包含与该费用相关的所有详细信息。以下是部分字段说明:
| 响应字段 | 描述 |
|---|---|
| accounting_systemid | 系统的唯一 ID |
| amount | 显示请求中费用金额的对象 |
| categoryid | 请求中定义的类别的 ID |
| id | 与该费用关联的唯一标识符 |
| vis_state | 显示费用是否处于激活状态或已被删除 |