Logo
Section 1 / 2

列出费用类别并创建一项费用

学习费用类别以及如何使用 FreshBooks API 创建费用。

导入

列出费用类别并创建一项费用

学习费用类别以及如何使用 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显示费用是否处于激活状态或已被删除

发票

列出、更新和删除费用