You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于MERN栈+Xero-node SDK按跟踪类别过滤Xero发票的问题

按Xero跟踪类别过滤发票的解决方案

核心问题分析

你遇到的lineItems为空的问题,是因为Xero API默认不会返回发票的行项目详细数据,必须显式指定参数才能获取包含跟踪类别的行项目。另外你之前用contact.name过滤是完全错误的,跟踪类别和客户名称是两个独立的字段。

步骤1:修正API调用,获取包含跟踪类别的数据

调用getInvoices时必须添加includeLineItems: true参数,否则返回的lineItems会是空数组:

let allInvoices = await xero.accountingApi.getInvoices(tenantID, {
  includeLineItems: true
});
allInvoices = allInvoices.body.invoices;

步骤2:正确按项目跟踪类别过滤发票

Xero的跟踪类别可能存在两个位置:发票全局的tracking字段(针对整单的跟踪类别),或者行项目lineItems里的trackingCategories字段(针对单个行项目的跟踪类别)。你需要同时检查这两个位置,确保不会遗漏:

const targetProjectCategory = "你的项目类别名称"; // 替换为实际项目类别名称
const startDate = new Date("2021-01-01"); // 替换为你的起始日期
const endDate = new Date("2021-12-31"); // 替换为你的结束日期

// 过滤包含指定项目跟踪类别的发票
const invoicesWithTargetCategory = allInvoices.filter(invoice => {
  // 检查发票级别的全局跟踪类别
  if (invoice.tracking?.length) {
    const hasMatch = invoice.tracking.some(track => track.name === targetProjectCategory);
    if (hasMatch) return true;
  }
  // 检查每个行项目的跟踪类别
  if (invoice.lineItems?.length) {
    return invoice.lineItems.some(lineItem => 
      lineItem.trackingCategories?.some(track => track.name === targetProjectCategory)
    );
  }
  return false;
});

// 按到期日期过滤
const filteredInvoices = invoicesWithTargetCategory.filter(invoice => {
  const dueDate = new Date(invoice.dueDate);
  return dueDate >= startDate && dueDate <= endDate;
});

关键说明

  • includeLineItems是必填参数,没有它Xero只会返回发票的基础信息,不会包含行项目和跟踪类别数据。
  • 用可选链操作符?.避免空值报错,比如当发票没有跟踪类别或行项目时不会抛出错误。
  • 日期比较必须转为Date对象,直接用字符串比较可能会出现逻辑错误。

内容的提问来源于stack exchange,提问作者Ethan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 16:52:49