跳到主要内容

付款、发票和交易

客户交易

系统中任何需要花费金钱的内容都被记录为客户的交易。

每笔交易都有批发成本和零售成本的货币金额,以及交易的描述。

交易可以由系统自动生成,例如,当服务被提供时,会为设置费用创建一笔交易,当服务被计费时,会为零售成本创建一笔交易。

交易也可以手动创建,例如,如果客户获得了信用额度,则会为信用额度创建一笔交易,或者收取安装费用时,会为安装费用创建一笔交易。

交易被组合在一起形成 发票 <payments_invoices>,并发送给客户进行付款。

交易管理

访问交易

交易可以在系统级别或按客户查看:

按客户查看:

  1. 导航到 客户 → [选择客户]
  2. 点击 计费 标签
  3. 在第一个卡片中查看交易列表

系统范围查看:

  1. 导航到 计费 → 交易(从主菜单)
  2. 查看所有客户的所有交易

交易统计小部件

在交易页面顶部,四个统计���片显示财务摘要:

交易统计和列表

小部件描述:

  • 总交易数 - 所有交易的零售成本总和(所有时间)
  • 总未开票交易 - 尚未包含在发票中的交易总和
  • 本月总交易数 - 本日历月创建的交易总和
  • 上月总交易数 - 上日历月创建的交易总和

值格式化:

  • 超过1,000的值:显示为“k”后缀(例如,$1.5k)
  • 超过1,000,000的值:显示为“M”后缀(例如,$2.3M)
  • 超过1,000,000,000的值:显示为“B”后缀(例如,$1.1B)

交易列表

交易表显示所有交易,包含以下列:

列描述:

  • ID - 唯一交易ID
  • 日期 - 交易创建日期
  • 标题 - 简短交易名称
  • 描述 - 交易的详细描述
  • 金额 - 零售成本(收费为正,信用为负)
  • 发票 - 如果交易已开票,则为发票ID(可点击链接)
  • 状态 - 如果已开票则为勾选标记,未开票则为破折号

每行操作:

每行都有一个操作菜单(⋮),选项包括:

  • 查看详情 - 打开交易详情模态框
  • 下载发票PDF - 下载PDF(仅在已开票时)
  • 作废交易 - 将交易标记为作废(仅在未开票时)

交易类型

交易分为两大类:

借记交易(收费)

正金额,增加客户应付余额:

  • 服务设置费用 - 提供服务时的一次性收费
  • 月度服务费用 - 服务的定期收费
  • 安装费用 - 现场技术人员访问的收费
  • 设备费用 - 调制解调器、路由器、SIM卡的收费
  • 逾期付款费用 - 逾期发票的罚款
  • 手动收费 - 员工添加的自定义收费

信用交易(付款/退款)

负金额,减少客户应付余额:

  • 现金付款 - 客户以现金支付
  • 卡付款 - 客户以信用卡/借记卡支付
  • 银行转账付款 - 客户通过银行转账支付
  • 账户信用 - 善意信用,补偿
  • 退款 - 退还给客户的钱
  • 折扣 - 促销或忠诚度折扣

手动添加交易

点击 "+ 添加交易" 打开添加交易模态框。

借记交易(收费):

添加借记交易模态框

信用交易(付款/退款):

添加信用交易模态框

字段描述:

  • 交易类型 - 选择借记(收费)或信用(付款/退款)
  • 信用类型 - 如果选择信用,选择付款方式(现金、卡、银行转账)
  • 标题 - 交易的简短名称(必填)
  • 描述 - 详细说明(可选)
  • 零售成本 - 客户支付的金额(必填,正数)
  • 批发成本 - 您的成本(可选,用于利润跟踪)
  • 税率 - 应用于此交易的税率(可选,默认为产品税或0%)
  • 服务 - 将交易链接到特定服务(可选)
  • 站点 - 将交易链接到特定站点(可选)
  • 交易日期 - 交易日期(默认为今天)

验证:

  • 标题和零售成本是必填项
  • 零售成本必须是正数
  • 如果选择了信用类型,必须选择一种信用类型

发生的事情:

  1. 交易在数据库中创建
  2. 出现在客户的交易列表中
  3. 包含在“未开票交易”计数中
  4. 可用于下次发票生成
  5. 创建活动日志条目

搜索和过滤交易

搜索

使用搜索栏查找交易。搜索范围包括:

  • 交易ID
  • 标题
  • 描述
  • 发票ID

过滤器

应用过滤器以缩小交易列表:

可用过滤器:

  • 作废状态 - 所有、作废、未作废
  • 发票状态 - 所有、已开票、未开票

过滤操作:

  • 应用过滤器 - 将所选过滤器应用于列表
  • 重置过滤器 - 清除所有过滤器并显示所有交易

排序

单击任何列标题进行排序:

  • ID - 按交易ID排序(最新/最旧)
  • 日期 - 按交易日期排序
  • 标题 - 按字母顺序排序
  • 金额 - 按零售成本排序(最高/最低)
  • 发票 - 按发票ID排序

再次单击以反转排序方向(升序 ↔ 降序)。

作废交易

错误添加的交易可以被 作废(标记为已删除)。

要求:

  • 交易必须未开票
  • 一旦开票,交易不能被作废(必须退款)

如何作废:

  1. 在列表中找到交易
  2. 点击操作菜单(⋮)
  3. 选择 "作废交易"
  4. 在模态框中确认

作废交易确认模态框

发生的事情:

  • 交易标记为 void = true
  • 不再出现在默认交易列表中
  • 从发票生成中排除
  • 可以通过过滤“作废”交易查看
  • 从“未开票交易”总数中扣除

注意: 作废与退款不同。作废意味着“这笔交易本不该存在。”退款意味着“撤销一笔有效交易。”

交易的税

交易可以包括税,税是根据产品的税配置自动计算的,或者每笔交易手动指定。

交易税显示

税行为:

  • 借记交易(收费) - 税适用于收费,基于:
    • 产品税率 - 如果交易链接到产品,则自动应用产品的税率
    • ��动覆盖 - 员工在创建交易时可以覆盖税率
    • 税额 - 计算为: retail_cost × (tax_percentage / 100)
    • 显示格式 - 在交易列表中显示为:$10.00 (10%)
  • 信用交易(付款/退款) - 信用不适用税
    • 信用交易的税率字段隐藏
    • 所有付款和退款的税自动设置为0%
    • 信用在没有税务影响的情况下减少客户的未偿余额

税计算示例:

  • 产品:移动计划,税率10%,$50.00零售成本
  • 自动税计算:$50.00 × 0.10 = $5.00
  • 显示:$5.00 (10%)

零税(NIL/免税):

  • 通过将税率设置为0,可以使产品免税
  • 如果未指定,税默认为0%
  • 免税交易在税列中显示“-”

零税交易

交易详情视图

单击交易以查看完整详情:

已开票与未开票交易

未开票交易:

  • 尚未包含在任何发票中
  • 可用于下次发票生成
  • 可以作废
  • 计入“未开票交易”总数
  • 状态显示破折号(-)

已开票交易:

  • 包含在发票中
  • 不能作废(如有需要,必须退款)
  • 发票ID可点击(链接到发票详情)
  • 状态显示勾选标记(✓)
  • 不能修改

发票生成:

当您为客户生成发票时:

  1. 系统查找该客��的所有未开票交易
  2. 可选择按日期范围过滤
  3. 交易包含在新发票中
  4. 交易 invoice_id 字段填充
  5. 交易现在标记为“已开票”

请参见 payments_invoices 以获取发票生成的详细信息。

常见工作流程

工作流程1:因服务中断手动信用

  1. 客户来电:“服务中断了2天”
  2. 员工决定给予£10的信用
  3. 导航到客户 计费 标签
  4. 点击 "+ 添加交易"
  5. 选择 信用 交易类型
  6. 选择 现金付款 信用类型
  7. 输入标题:“服务中断信用”
  8. 输入描述:“因1月8-9日的中断补偿”
  9. 输入零售成本:10.00
  10. 从下拉菜单中选择受影响的服务
  11. 点击 "添加交易"
  12. 交易以-£10.00的金额出现
  13. 将在下次发票中作为信用包含

工作流程2:手动安装费用

  1. 现场技术人员安装服务
  2. 员工需要收取£75的安装费用
  3. 导航到客户 计费 标签
  4. 点击 "+ 添加交易"
  5. 选择 借记 交易类型
  6. 输入标题:“安装费用”
  7. 输入描述:“现场技术人员进行光纤安装”
  8. 输入零售成本:75.00
  9. 输入批发成本:45.00(可选,用于利润跟踪)
  10. 选择已安装的服务
  11. 选择安装地点
  12. 点击 "添加交���"
  13. 交易出现在未开票列表中
  14. 将在下次发票中包含

工作流程3:作废重复交易

  1. 员工注意到重复交易
  2. 验证交易尚未开票
  3. 点击重复交易的操作菜单(⋮)
  4. 选择 "作废交易"
  5. 在模态框中确认
  6. 交易从列表中移除
  7. 未开票总数相应减少

工作流程4:查找发票的交易

  1. 需要生成月度发票
  2. 点击 发票过滤器:“未开票”
  3. 点击 应用过滤器
  4. 查看所有未开票交易
  5. 从小部件中注意总金额
  6. 导航到生成发票
  7. 选择日期范围(例如,1月1日至31日)
  8. 范围内的交易包含在发票中

故障排除

无法作废交易

  • 原因: 交易已开票
  • 解决方案: 交易是发票历史的一部分。如果需要退款,请改为创建信用交易。

重复交易出现

  • 原因: 服务多次收费或提供错误
  • 解决方案: 如果未开票,请作废重复交易。如果已开票,请发放信用。

交易未出现在列表中

  • 原因: 应用过滤器或交易已作废
  • 解决方案: 点击“重置过滤器”以显示所有交易。要查看作废交易,请按“作废:作废”过滤。

未开票总数与预期不符

  • 原因: 一些��易已开票,或作废交易被排除
  • 解决方案: 应用过滤器“发票:未开票”以仅查看未开票。单独检查作废交易。

无法添加交易(客户字段禁用)

  • 原因: 查看客户特定的交易页面
  • 解决方案: 客户已预先选择。如果需要为不同客户添加交易,请转到系统范围的交易页面。

相关文档

  • payments_invoices - 发票生成和管理
  • payments_process - 处理发票的付款
  • basics_payment - 付款方式概述
  • csa_activity_log - 在活动日志中查看交易历史

客户发票

交易 </payments_transaction> 被组合在一起形成发票,并发送给客户进行付款。

发票有开始和结束日期,表示发票覆盖的期间,以及到期日,表示发票到期付款的日期。

生成形式发票

发票可以由系统自动生成,例如,当服务被计费时,会为零售成本创建发票,或者可以手动创建,例如,如果客户请求发票副本,或者如果客户因一次性收费而被计费。

客户发票完全使用 Mailjet <integrations_mailjet> 模板,可以自定义以包含公司徽标、地址和付款详情,并可以通过电子邮件发送给客户,或下载为PDF。

活动日志

自定义发票模板

OmniCRM使用HTML模板和Jinja2模板生成发票。 您可以完全自定义发票设计、品牌、颜色和布局。

发票模板位置

发票模板存储在 OmniCRM-API/invoice_templates/

默认模板:

  • norfone_invoice_template.html - 示例发票模板
  • cifi_invoice_template.html - 替代模板示例

配置:

活动发票模板在 OmniCRM-API/crm_config.yaml 中指定:

invoice:
template_filename: 'norfone_invoice_template.html'

可用模板变量

发票模板可以访问以下Jinja2变量:

发票信息:

  • {{ invoice_number }} - 唯一发票ID(例如,INV-2025-001234
  • {{ date }} - 发票发布日期(ISO格式:2025-01-10T12:00:00
  • {{ due_date }} - 付款到期日(例如,2025-02-10
  • {{ start_date }} - 计费周期开始日��
  • {{ end_date }} - 计费周期结束日期
  • {{ total_amount }} - 税前发票总金额(数字)
  • {{ total_tax }} - 从所有交易计算的总税额(数字)

客户信息:

  • {{ client.name }} - 客户的全名或公司名称
  • {{ client.address.address_line_1 }} - 地址行1
  • {{ client.address.address_line_2 }} - 地址行2
  • {{ client.address.city }} - 城市
  • {{ client.address.state }} - 州/省
  • {{ client.address.zip_code }} - 邮政编码
  • {{ client.address.country }} - 国家

交易行项目:

使用以下方式循环遍历交易:

{% for sub_transaction in transactions %}
<tr>
<td>{{ sub_transaction.transaction_id }}</td>
<td>{{ sub_transaction.created.split("T")[0] }}</td>
<td>{{ sub_transaction.title }}</td>
<td>{{ sub_transaction.description }}</td>
<td>${{ "%.2f"|format(sub_transaction.retail_cost) }}</td>
</tr>
{% endfor %}

交易字段:

  • sub_transaction.transaction_id - 交易ID
  • sub_transaction.created - 交易日期/时间
  • sub_transaction.title - 交易标题
  • sub_transaction.description - 详细描述
  • sub_transaction.retail_cost - 行项目金额
  • sub_transaction.tax_percentage - 应用的税率(例如,10表示10%)
  • sub_transaction.tax_amount - 以美元计算的税额

在模板中显示税:

<td>
{% if sub_transaction.tax_amount and sub_transaction.tax_amount > 0 %}
${{ "%.2f"|format(sub_transaction.tax_amount) }} ({{ sub_transaction.tax_percentage }}%)
{% else %}
-
{% endif %}
</td>

创建自定义发票模板

步骤1:复制现有模板

cd OmniCRM-API/invoice_templates/
cp norfone_invoice_template.html your_company_invoice_template.html

步骤2:自定义HTML/CSS

编辑 your_company_invoice_template.html 以匹配您的品牌:

关键自定义区域:

  1. 公司徽标和品牌

    <!-- 用您的徽标URL替换 -->
    ![您的公司](https://yourcompany.com/logo.png)

    <!-- 更新公司名称 -->
    <h1>您的公司名称</h1>
  2. 配色方案

    <style>
    /* 主要品牌颜色 */
    .navbar {
    background: linear-gradient(to bottom right, #your-color-1, #your-color-2);
    }

    /* 表头 */
    .table thead th {
    background-color: #your-brand-color !important;
    color: white !important;
    }

    /* 按钮和链接 */
    .btn-primary {
    background-color: #your-brand-color;
    }
    </style>
  3. 公司信息页脚

    <footer>
    <p>您的公司名称</p>
    <p>123商业街,城市,国家</p>
    <p>电话:+1-555-123-4567 | 电子邮件:billing@yourcompany.com</p>
    <p>ABN/税号:12345678900</p>
    </footer>
  4. 付款说明

    <div class="payment-info">
    <h3>付款方式</h3>
    <p><strong>在线:</strong> 在 https://yourcompany.com/pay 付款</p>
    <p><strong>银行转账:</strong></p>
    <ul>
    <li>账户名称:您的公司有限公司</li>
    <li>BSB:123-456</li>
    <li>账户号码:987654321</li>
    <li>参考:{{ invoice_number }}</li>
    </ul>
    </div>
  5. 条款和条件

    <div class="terms">
    <h4>付款条款</h4>
    <p>发票日期后30天内到期付款。</p>
    <p>逾期付款费用:逾期余额每月2%。</p>
    <p>有关账单查询:billing@yourcompany.com</p>
    </div>

步骤3:更新配置

编辑 OmniCRM-API/crm_config.yaml

invoice:
template_filename: 'your_company_invoice_template.html'

步骤4:重启API

cd OmniCRM-API
sudo systemctl restart omnicrm-api

步骤5:测试发票生成

  1. 导航到有交易的客户
  2. 生成测试发票
  3. 下载PDF以验证格式
  4. 将发票通过电子邮件发送给自己以测试电子邮件发送

高级自定义

条件内容:

使用Jinja2条件语句显示/隐藏内容:

{% if total_amount > 1000 %}
<div class="high-value-notice">
<p><strong>注意:</strong> 大额余额 - 可根据请求提供付款计划。</p>
</div>
{% endif %}

{% if client.address.country == "Australia" %}
<p>包含GST:${{ "%.2f"|format(total_amount * 0.10) }}</p>
{% endif %}

多语言支持:

创建特定语言的模板:

invoice_template_en.html
invoice_template_es.html
invoice_template_fr.html

根据客户的语言偏好进行配置。

自定义计算:

<!-- 显示小计和税务明细 -->
<tr>
<td colspan="4" class="text-right"><strong>小计:</strong></td>
<td>${{ "%.2f"|format(total_amount) }}</td>
</tr>
<tr>
<td colspan="4" class="text-right"><strong>税:</strong></td>
<td>${{ "%.2f"|format(total_tax) }}</td>
</tr>
<tr>
<td colspan="4" class="text-right"><strong>总计:</strong></td>
<td>${{ "%.2f"|format(total_amount + total_tax) }}</td>
</tr>

注意: total_tax 变量是通过将发票中所有交易的 tax_amount 相加自动计算的。每笔交易的税是根据其 tax_percentage 字段计算的,默认为产品的 tax_percentage 或0%(如果未指定)。

付款的二维码:

生成用于移动支付的二维码:

<div class="qr-payment">
![扫描付款](https://api.qrserver.com/v1/create-qr-code/?size=150x150&data={{ payment_url }})
<p>用您的手机扫描以立即付款</p>
</div>

PDF样式最佳实践

OmniCRM使用 WeasyPrint 将HTML转换为PDF。遵循以下指南:

支持的CSS:

  • 大多数CSS 2.1属性
  • 有限的CSS3(flexbox,一些变换)
  • 通过 @font-face 使用网络字体

不支持:

  • JavaScript
  • CSS Grid(使用表格代替)
  • 复杂动画
  • 一些现代CSS属性

页面大小和边距:

@page {
size: A4;
margin: 1cm;
}

body {
font-family: Arial, sans-serif;
font-size: 10pt;
}

打印特定样式:

@media print {
.no-print {
display: none;
}

.page-break {
page-break-after: always;
}
}

表格布局:

.table {
table-layout: fixed;
width: 100%;
}

.table th, .table td {
word-wrap: break-word;
padding: 4px;
}

字体嵌入:

对于自定义字体��使用网络安全字体或嵌入:

@font-face {
font-family: 'YourFont';
src: url('https://yourcompany.com/fonts/yourfont.woff2') format('woff2');
}

body {
font-family: 'YourFont', Arial, sans-serif;
}

测试发票模板

测试清单:

  1. 视觉检查:
    • 徽标正确显示
    • 颜色符合品牌指南
    • 文本可读(不太小)
    • 表格对齐正确
    • 所有部分存在
  2. 数据准确性:
    • 客户详细信息正确
    • 交易金额正确相加
    • 日期格式正确
    • 所有变量正确替换
  3. PDF质量:
    • 文件大小合理(<5MB)
    • 图像清晰
    • 无文本截断或溢出
    • 页面在适当位置换行
  4. 多页发票:
    • 每页重复页眉
    • 显示页码
    • 长交易列表正确分页
  5. 电子邮件发送:
    • PDF附加到电子邮件
    • 文件大小低于Mailjet限制(15MB)
    • 在Gmail、Outlook、Apple Mail中呈现

测试命令(手动生成):

您可以通过API测试发票生成:

curl -X GET "http://localhost:5000/crm/invoice/{invoice_id}/pdf" \
-H "Authorization: Bearer YOUR_TOKEN" \
--output test_invoice.pdf

常见模板问题

变量未替换:

  • 原因: 变量名称拼写错误或缺少数据
  • 解决方案: 检查拼写是否完全正确(区分大小写),验证数据库中是否存在数据

PDF样式破损:

  • 原因: 不支持的CSS属性
  • 解决方案: 使用CSS 2.1属性,测试与WeasyPrint兼容的CSS

图像未显示:

  • 原因: 相对URL或阻止外部资源
  • 解决方案: 使用绝对HTTPS URL,确保图像可以公开访问

表格溢出页面:

  • 原因: 固定列宽过宽
  • 解决方案: 使用百分比宽度,table-layout: fixed

字体未呈现:

  • 原因: 字体未嵌入或不可用
  • 解决方案: 使用网络安全字体(Arial、Times New Roman等)或正确嵌入自定义字体

PDF生成失败:

  • 原因: HTML语法错误或WeasyPrint崩溃
  • 解决方案: 验证HTML,检查WeasyPrint日志,简化复杂布局

发票PDF缓存

为了提高性能并减少冗余的PDF生成,OmniCRM包含发票PDF缓存系统。当首次生成发票PDF时,它会在数据库中缓存以供后续请求使用。

PDF缓存工作原理:

  1. 首次请求 - 当请求发票PDF(下载或电子邮件)时,系统:
    • 从发票模板生成PDF
    • 将PDF编码为Base64
    • 计算PDF内容的SHA256哈希
    • Invoice_PDF_Cache 表中存储��
      • 发票ID引用
      • PDF数据(Base64编码)
      • 文件名
      • 内容哈希(用于完整性验证)
      • 创建时间戳
  2. 后续请求 - 当再次请求相同发票时:
    • 系统根据invoice_id检查缓存PDF
    • 如果缓存存在且有效,则立即返回缓存PDF
    • 更新 last_accessed 时间戳以跟踪缓存使用情况
  3. 缓存失效 - 当以下情况发生时,缓存的PDF将失效:
    • 发票被修改(添加/删除交易,详情更改)
    • 发票模板被更新
    • 手动触发缓存清除

好处:

  • 性能 - 对于重复请求,立即提供PDF(无再生成延迟)
  • 一致性 - 所有发票的下载均为相同PDF(除非发票被修改)
  • 服务器负载 - 减少PDF生成的CPU使用
  • 用户体验 - 初次生成时显示加载指示器,后续请求立即完成

缓存管理:

发票PDF缓存由系统自动管理。可以根据以下情况定期清除旧的或未使用的缓存条目:

  • 年龄(例如,删除超过90天的缓存条目)
  • 访问模式(删除30天未访问的条目)
  • 存储限制(如有需要,实施缓存大小限制)

API行为:

通过API或UI下载发票时:

  • 首次请求:在PDF生成时显示加载指示器,然后缓存
  • 后续请求:立即��缓存下载
  • 缓存命中/未命中对用户是透明的

重要: 当您更新发票模板时,请清除缓存以确保新发票使用更新的设计:

-- 清除所有缓存的发票PDF(在MySQL中运行)
DELETE FROM Invoice_PDF_Cache;

或更新 crm_config.yaml 以在模板更改时自动使缓存失效。

访问发票

发票可以在系统级别或按客户查看:

按客户查看:

  1. 导航到 客户 → [选择客户]
  2. 点击 计费 标签
  3. 在第三个卡片中查看发票列表

系统范围查看:

  1. 导航到 计费 → 发票(从主菜单)
  2. 查看所有客户的所有发票

发票统计小部件

在发票页面顶部,四个统计卡片显示财务摘要。

发票统计和列表

小部件描述:

  • 总发票数 - 所有发票的零售成本总和(所有时间)和已发送发票的计数
  • 未付款发票 - 尚未付款的发票总和和未付款发票的计数
  • 本月发票 - 本日历月创建的发票总和及计数
  • 上月发票 - 上日历月创建的发票总和及计数

值格式化:

  • 超过1,000的值:显示为“k”后缀(例如,$1.5k)
  • 超过1,000,000的值:显示为“M”后缀(例如,$2.3M)
  • 超过1,000,000,000的值:显示为“B”后缀(例如,$1.1B)

趋势指示器:

  • “本月”和“上月”的小部件显示百分比变化
  • 绿色箭头向上:与前一时期相比增加
  • 红色箭头向下:与前一时期相比减少
  • 灰色箭头向右:没有变化

发票列表

发票表显示所有发票,包含以下列:

全球发票列表

列描述:

  • ID - 唯一发票ID
  • 标题 - 发票标题/描述
  • 期间 - 计费期间(开始日期 - 结束日期)或“一次性”发票的“N/A”
  • 到期日 - 付款到期日
  • 创建 - 发票创建日期
  • 金额 - 发票总金额(零售成本)
  • 状态 - 已付款、未付款或已退款
  • 操作 - 可用操作(根据状态而异)

操作图标:

  • ⬇ (下载) - 下载发票PDF
  • 🗑️ (删除) - 作废发票(仅在未付款时)
  • 💰 (付款) - 在线支付发票(仅在未付款时)
  • ✉️ (电子邮件) - 将发票电子邮件发送给客户
  • 💸 (退款) - 退款Stripe付款(仅适用于已付款的Stripe发票)

生成发票

点击 "+ 生成形式发票" 创建新发票。

生成发票模态框与交易预览

字段描述:

  • 搜索客�� - 选择客户(仅在系统范围查看中显示,在客户视图中预填)
  • 标题 - 发票标题/名称(可选,默认为“发票 [期间]”)
  • 开始日期 - 计费期间开始(默认为14天前)
  • 结束日期 - 计费期间结束(默认为今天)
  • 到期日 - 付款截止日期(默认为今天)
  • 交易预览 - 显示日期范围内的所有未开票交易,并能够包含/排除特定交易

交易选择:

  • ✓ (绿色加号) - 点击以排除发票中的交易
  • × (红色X) - 点击以包含先前排除的交易
  • 全选 - 包含所有显示的交易
  • 清除所有 - 排除所有交易
  • 被排除的交易以灰色显示并带有删除线文本
  • 实时总计在选择/取消选择交易时更新

发生的事情:

  1. 系统查找客户在日期范围内的所有未开票交易
  2. 显示交易预览,能够包含/排除单个交易
  3. 显示基于所选交易的实时小计、税和总计计算
  4. 仅将选定(包含的)交易添加到发票中
  5. 生成发票PDF并缓存
  6. 将选定交易标记为已开票(invoice_id 字段填充)
  7. 被排除的交易仍然保持未开票状态,并可用于未来的发票
  8. 发票在列表中显示“未付款”状态

示例用例:

月度计费: 将开始��期设置为月初,结束日期设置为月末,预览显示该期间的所有未开票交易。选择所有或手动排除特定交易。

特定服务发票: 使用相同的日期范围,然后手动排除不需要的交易(例如,排除非移动交易以创建仅移动的发票)。

一次性发票: 将开始和结束日期设置为同一天,预览仅显示该日期的交易。排除与此特定发票无关的任何费用。

查看发票详情

单击表中任何发票行以查看完整发票详情,包括所有交易、总计和可用操作。

发票详情视图

发票详情模态框:

  • 发票信息 - 显示发票ID、标题、日期、付款状态和作废状态
  • 交易列表 - 显示发票中包含的所有交易,包含:
    • 交易日期
    • 标题和描述
    • 零售成本
    • 税额和百分比(格式为$10.00 (10%)
    • 免税交易在税列中显示“-”
  • 总计摘要 - 实时计算显示:
    • 交易计数
    • 小计(所有零售成本之和)
    • 税(所有税额之和)
    • 发票总计(小计 + 税)
  • 操作按钮 - 与表中相同的可用操作:
    • 下载PDF - 下载发票PDF(始终可用)
    • 发送电子邮件 - 将发票电子邮件发送给客户(未作废的发票)
    • 支付发票 - 处理付款(未付款、未作废的发票)
    • 退款 - 退款Stripe付款(仅适用于已付款的Stripe发票)
    • 删除 - 作废发票(未付款、未作废的发票)

下载发票PDF

单击表中的 下载图标(⬇) 或在发票详情模态框中单击 "下载PDF" 按钮以下载发票为PDF。

下载过程:

  1. 单击发票旁的下载图标
  2. 生成期间显示加载旋转图标(仅首次)
  3. 浏览器提示保存文件:Invoice_01234.pdf
  4. PDF打开或保存到下载文件夹

PDF缓存行为:

  • 首次下载 - 从模板生成PDF,缓存到数据库(可能需要2-3秒)
  • 后续下载 - 从缓存立即下载
  • 缓存失效 - 如果发票被修改或模板更新,则清除缓存

故障排除下载问题:

  • 旋转图标永远不停止 - 检查浏览器控制台,API可能已关闭
  • PDF为空或损坏 - 检查发票模板是否存在语法错误
  • 下载失败 - 检查弹出窗口阻止程序设置,尝试不同的浏览器

支付发票

单击 付款图标(💰) 在线支付发票。

支付发票模态框

支付过程:

  1. 单击未付款发票上的付款图标
  2. 支付模��框打开,显示发票详情
  3. 选择付款方式:
    • Stripe交易 - 收取保存的信用卡(对所有用户可用)
    • 现金 - 手动现金付款(仅限员工)
    • 退款 - 将退款作为付款(仅限员工)
    • POS交易 - 销售终端(仅限员工)
    • 银行转账 - 手动银行转账(仅限员工)
  4. 如果选择Stripe:
    • 从保存的付款方式中选择卡
    • 默认卡预选
    • 单击选择不同的卡
  5. 如果选择其他方式:
    • 输入参考号码(可选)
  6. 单击 "支付发票" 进行处理
  7. 系统处理付款:
    • Stripe - 通过Stripe API收取卡费
    • 其他方式 - 为付款金额创建负交易
  8. 发票状态更改为“已付款”
  9. 显示成功通知

自助服务与员工付款:

:doc:`自助服务门户 <self_care_portal>`(客户):

  • 仅提供Stripe付款
  • 必须有保存的付款方式
  • 如果没有付款方式,则显示警告
  • 提供添加付款方式的链接

员工门户(管理员):

  • 所有付款方式可用
  • 可以手动标记发票为已付款(现金、POS、银行转账)
  • 可以输入参考号码以便跟踪

付款方式警告:

如果客户没有保存的付款方式,则会显示警告,提示他们在支付��票之前添加付款方式。

缺少付款方式警告

电子邮件发票

单击 电子邮件图标(✉️) 将发票发送给客户。

发生的事情:

  1. 单击发票旁的电子邮件图标
  2. 系统从缓存中检索发票PDF(如果未缓存则生成)
  3. 通过 Mailjet <integrations_mailjet> 发送电子邮件,使用 api_crmCommunicationCustomerInvoice 模板
  4. 电子邮件包括:
    • 发票PDF作为附件
    • 客户姓名
    • 发票号码和到期日
    • 应付总额
    • 在线支付发票的链接
    • 查看/下载发票的链接
  5. 成功通知:“发票电子邮件成功发送”

电子邮件收件人:

电子邮件发送给所有类型为“计费”的客户联系人,或者如果没有计费联系人,则发送给主要联系人。

电子邮件模板变量:

  • {{ var:customer_name }} - 客户的全名
  • {{ var:invoice_number }} - 发票ID
  • {{ var:invoice_date }} - 发票发布日期
  • {{ var:due_date }} - 付款到期日
  • {{ var:total_amount }} - 应付总额
  • {{ var:invoice_url }} - 查看/下载PDF的链接
  • {{ var:pay_url }} - 在线支付发票的链接

故障排除电子邮件问题:

  • 电子邮件未发送 - 检查 crm_config.yaml 中的Mailjet API凭据
  • 客户未收到 - 验证客户联系电子邮件地址
  • PDF未附加 - 检查PDF生成是否成功(先尝试下载)

作废发票

单击 删除图标(🗑️) 作废发票。

要求:

  • 发票必须是 未付款
  • 已付款的发票不能作废(必须退款)

如何作废:

  1. 在列表中找到未付款的发票
  2. 单击删除图标(🗑️)
  3. 在模态框中确认:

作废发票确认模态框

发生的事情:

  • 发票标记为 void = true
  • 所有交易与发票解除链接(invoice_id 设置为null)
  • 交易再次变为“未开票”
  • 交易可以包含在新发票中
  • 发票在列表中显示“作废:”前缀
  • 发票操作被禁用(无法下载、支付或发送电子邮件)
  • 可以通过过滤“作废”发票查看

重要说明:

  • 作废与退款不同
  • 作废 = “这张发票本不该存在”(计费错误,重复)
  • 退款 = “撤销一张有效的已付款发票”(将钱退还给客户)

退款发票

单击 退款图标(💸) 退款已付款的发票。

要求:

  • 发票必须是 已付款
  • 发票必须通过 Stripe 付款
  • 发票必须有有效的 payment_reference(Stripe付款意图ID)
  • 仅限员工用户可用(不适用于自助服务)

如何退款:

  1. 找到已付款的Stripe发票
  2. 单击退款图标(💸)
  3. 退款确认模态框打开:

退款发票确认模态框

  1. 单击 "确认退款"
  2. 系统处理Stripe退款:
    • 调用Stripe API退款付款
    • 在Stripe中创建退款交易
    • 更新发票以包含 refund_reference
  3. 发票状态更改为“已退款”
  4. 显示成功通知

退款后的发生情况:

  • 发票仍保留在系统中(未作废)
  • 状态显示“已退款”
  • 交易仍与发票关联
  • 客户收到退款至原付款方式(3-7个工作日)
  • Stripe仪表板显示退款交易

退款限制:

  • 不能退款通过现金、POS或银行转账支付的发票(需要手动撤销)
  • 不能部分退款(仅限全额发票金额)
  • 不能退款两次

搜索和过滤发票

搜索

使用搜索栏查找发票。搜索范围包括:

  • 发票ID
  • 发票标题
  • 客户姓名(仅在系统范围查看中)

过滤器

应用过滤器以缩小发票列表:

可用过滤器:

  • 作废状态 - 所有、作废、未作废
  • 付款状态 - 所有、已付款、尚未付款

过滤操作:

  • 应用过滤器 - 将所选过滤��应用于列表
  • 重置过滤器 - 清除所有过滤器并显示所有发票

排序

单击任何列标题进行排序:

  • ID - 按发票ID排序(最新/最旧)
  • 标题 - 按字母顺序排序
  • 到期日 - 按到期日排序
  • 创建 - 按创建日期排序
  • 金额 - 按零售成本排序(最高/最低)
  • 状态 - 按付款状态排序(已付款优先或未付款优先)

再次单击以反转排序方向(升序 ↔ 降序)。

分页

通过页面控件在大型发票列表中导航,显示当前页、总页数和每页项目选择器(10、25、50或100个项目)。

常见发票工作流程

工作流程1:带交易预览的月度计费

  1. 月末到来(例如,1月31日)
  2. 导航到 计费 → 发票
  3. 点击 "+ 生成形式发票"
  4. 选择客户(或如果计费多个客户则按客户操作)
  5. 设置日期:
    • 开始日期:2025-01-01
    • 结束日期:2025-01-31
    • 到期日期:2025-02-15(从现在起15天)
    • 标题:“2025年1月服务”(可选)
  6. 交易预览 部分显示1月的所有未开票交易
  7. 审查预览:
    • 默认包含所有交易
    • 检查总计:小计、税和发票总计
    • 验证所有费用是否正确
  8. 点击 "生成发票"(��钮显示交易计数,例如,“生成发票(15)”)
  9. 发票创建,包含所有选定交易
  10. 点击发票行以查看详情并验证
  11. 点击详情模态框中的 "发送电子邮件" 按钮或表中的电子邮件图标
  12. 客户收到带PDF和付款链接的发票电子邮件

工作流程2:选择性交易开票

  1. 客户有多个服务(移动+互联网)和杂项费用
  2. 希望为每项服务开具单独的发票
  3. 生成第一张发票(移动服务):
    • 点击 "+ 生成形式发票"
    • 标题:“移动服务 - 2025年1月”
    • 开始/结束:1月1日至31日
    • 到期日期:2月15日
    • 在交易预览中,排除所有非移动交易:
      • 点击互联网交易旁的 X 按钮
      • 点击杂项费用旁的 X 按钮
      • 仅剩下移动服务交易
    • 验证总计仅反映移动服务
    • 点击 "生成发票"(显示移动交易的计数)
  4. 生成第二张发票(互联网服务):
    • 再次点击 "+ 生成形式发票"
    • 标题:“互联网服务 - 2025年1月”
    • 开始/结束:1月1日至31日(相同期间)
    • 在交易预览中:
      • 移动交易已开票(不再出现)
      • 使用 X 按钮排除杂项费用
      • 仅剩下互联网服务交��
    • 点击 "生成发票"
  5. 生成第三张发票(额外费用):
    • 再次点击 "+ 生成形式发票"
    • 标题:“额外费用 - 2025年1月”
    • 仅未开票的杂项费用出现在预览中
    • 点击 "全选" 以包含所有
    • 点击 "生成发票"
  6. 将所有三张发票通过电子邮件发送给客户

工作流程3:排除争议或待处理交易

  1. 计费周期结束
  2. 导航到客户 计费 标签
  3. 点击 "+ 生成形式发票"
  4. 设置计费期间日期
  5. 交易预览显示20笔交易
  6. 客户对一项收费提出争议,另一项正在调查中
  7. 在交易预览中:
    • 找到争议交易(例如,“数据超限收费”)
    • 点击 X 按钮将其排除
    • 找到待处理交易(例如,“安装费用”)
    • 点击 X 按钮将其排除
    • 交易计数更新:“选择了18笔交易”
    • 总计自动重新计算
  8. 审查更新后的总计(排除争议金额)
  9. 点击 "生成发票(18)"
  10. 仅生成包含已批准交易的发票
  11. 争议/待处理交易保持未开票状态,待下一个计费周期处理

工作流程4:快速发票审查和调整

  1. 员工生成月度发票
  2. 交易预览显示意外的高总额
  3. 审查预览中的每笔交易:
    • 注意到同一服务的重复收费
    • 点击 X 排除重复项
    • 注意到不应计费的测试交易
    • 点击 X 排除测试交易
  4. 总计实时更新
  5. 验证新总额与预期金额相符
  6. 点击 "生成发票",包含更正后的交易
  7. 如果需要,返回并作废/删除排除的交易
  8. 自信地将发票通过电子邮件发送给客户

工作流程5:一次性安装发票

  1. 现场技术人员完成安装
  2. 员工手动添加安装交易
  3. 导航到客户 计费 标签
  4. 点击 "+ 生成形式发票"
  5. 设置���期:
    • 开始日期:今天
    • 结束日期:今天
    • 到期日期:今天 + 7天
    • 标题:“安装服务”
  6. 交易预览仅显示今天的交易
  7. 验证安装费用出现
  8. 使用 X 按钮排除任何定期费用(如果存在)
  9. 点击 "生成发票"
  10. 立即发送电子邮件给客户
  11. 客户通过Stripe在线付款

工作流程6:在客户联系之前查看发票

  1. 客户来电询问账单问题
  2. 员工导航到客户的发票列表
  3. 单击发票行 打开发票详情模态框
  4. 审查发票信息:
    • 发票ID、日期、状态
    • 包含的所有交易及描述
    • 每笔交易的税务明细
    • 小计、税和总金额
  5. 用确切的细节回答客户的问题
  6. 如果客户请求PDF,单击模态框中的 "下载PDF" 按钮
  7. 如果客户请求重新发送电子邮件,单击 "发送电子邮件" 按钮
  8. 完成后关闭模态框

工作流程7:更正计费错误

  1. 客户报告错误收费
  2. 员工单击发票行查看详情
  3. 在发票详情模态框中审查交易列表
  4. 确定错误交易
  5. 发票未付款,因此可以作废
  6. 单击模态框底部的 "删除" 按钮
  7. 确认作废
  8. 交易再次变为未开票
  9. 员工修改或从交易列表中删除错误交易
  10. 生成包含更正交易的新发票:
    • 如果需要,使用交易预览排除更正的交易
    • 仅包含有效费用
  11. 将更正后的发票通过电子邮件发送给客户

工作流程8:处理多笔付款

  1. 客户带现金支付多张发票
  2. 导航到客户 计费 标签
  3. 查看未付款发票
  4. 单击第一张发票行查看详情
  5. 验证金额和交易
  6. 单击模态框底部的 "支付发票" 按钮
  7. 选择 "现金" 付款方式
  8. 输入参考:“现金支付2025-01-15”
  9. 单击 "支付发票"
  10. 模态框关闭,发票标记为“已付款”
  11. 对剩余发票重复此操作
  12. 所有发票现在标记为“已付款”

工作流程9:处理退款请求

  1. 客户请求退款以补偿多付
  2. 员工验证发票是通过Stripe支付的
  3. 导航到发票列表
  4. 单击发票行查看详情
  5. 验证付款信息和金额
  6. 单击模态框底部的 "退款" 按钮(仅对Stripe发票可见)
  7. 确认退款
  8. 系统处理Stripe退款
  9. 发票状态更改为“已退款”
  10. 客户在3-7个工作日内收到退款
  11. 员工跟进客户以确认收到

故障排除

无法生成发票 - 找不到交易

  • 原因: 指定日期范围内没有未开票交易
  • 解决方案: 检查交易列表,验证交易存在且未开票。调整日期范围或移除过滤器。

发票PDF生成失败

  • 原因: 模板语法错误、WeasyPrint崩溃或缺少客户数据
  • 解决方案: 检查发票模板HTML是否存在错误,验证客户地址字段是否已填充,查看API日志。

Stripe错误导致付款失败

  • 原因: 卡被拒绝、资金不足、卡过期或Stripe API问题
  • 解决方案: 尝试不同的付款方式,验证卡是否有效,检查Stripe仪表板以获取拒绝原因。

无法作废发票

  • 原因: 发票已付款
  • 解决方案: 已付款的发票不能作废。如果需要退款,请对Stripe发票使用退款功能或手动创建信用交易。

发票电子邮件未发送

  • 原因: Mailjet API凭据无效、客户没有计费联系人或电子邮件模板缺失
  • 解决方案: 验证 crm_config.yaml 中的Mailjet配置,检查客户联系人,验证发票电子邮件模板是否存在。

退款按钮未出现

  • 原因: 发票通过现金/POS/银行转账支付(不是Stripe),或发票未付款
  • 解决方案: 退款按钮仅在Stripe付款时出现。对于其他付款方式,请创建手动信用交易。

下载PDF显示旧模板设计

  • 原因: PDF在模板更新之前缓存
  • 解决方案: 清除发票PDF缓存: DELETE FROM Invoice_PDF_Cache WHERE invoice_id = X;

客户无法支付发票(没有付款方式)

  • 原因: 自助服务门户中没有保存的付款方式
  • 解决方案: 客户必须在 付款方式 页面添加信用卡,然后才能支付发票。

同一期间生成多张发票

  • 原因: 员工生成发票两次,或日期范围重叠
  • 解决方案: 作废重复发票。调整日期范围以防止重叠。使用交易预览确保唯一的交易集。

交易预览未显示任何交易

  • 原因: 日期范围内的所有交易已开票或不存在交易
  • 解决方案: 验证日期范围是否正确。检查交易列表以确认交易存在。过滤发票以查看哪些发票包含交易。

无法排除交易生成发票

  • 原因: 交易已开票或浏览器问题
  • 解决方案: 验证交易在预览中显示并带有勾选标记。刷新页面并重试。如果问题仍然存在,请清除浏览器缓存。

发票总额与预期金额不符

  • 原因: 包含意外交易、未计算税或排除的交易仍被计算
  • 解决方案: 仔细审查交易预览。检查每笔交易的零售成本和税。验证排除的交易是否显示为灰色。检查��成发票按钮上的交易计数徽章。

生成发票按钮被禁用

  • 原因: 没有选择任何交易或无效的日期范围
  • 解决方案: 确保至少包含一笔交易(未排除)。验证开始日期在结束日期之前。检查到期日期是否已设置。

发票详情模态框未打开

  • 原因: JavaScript错误或页面未完全加载
  • 解决方案: 刷新页面。检查浏览器控制台是否有错误。尝试不同的浏览器。验证互联网连接。

交易税未在发票详情中显示

  • 原因: 交易税率为0%或税额为null
  • 解决方案: 验证交易是否设置了税率。检查交易创建时是否计算了税额。如有需要,更新交易。

发票详情模态框中缺少操作按钮

  • 原因: 发票已作废或用户权限不足
  • 解决方案: 作废的发票仅显示下载PDF按钮。验证发票状态。检查用户角色和权限。

相关文档

  • integrations_mailjet - 发票电子邮件发送和模板
  • administration_configuration - 发票模板配置
  • payments_transaction - 创建出现在发票上的交易
  • payments_process - 处理发票付款
  • payment_system_guide - 付款API参考和供应商配置

付款方式管理

OmniCRM的付款方式系统允许客户和员工安全地管理付款卡,使用 多供应商支付处理(Stripe、PayPal等)。付款方式使服务的自动计费、一次性付款和定期收费成为可能,而无需在OmniCRM中存储敏感的卡数据。

另请参见:付款系统指南 <payment_system_guide>计费概述 <billing_overview>付款处理 <payments_process>发票 <payments_invoices>

概述

付款方式系统提供:

  • 安全的卡存储 - 由支付供应商(Stripe、PayPal)进行令牌化,永远不会存储在OmniCRM中
  • 多供应商支持 - 支持Stripe和PayPal付款方式
  • 多张卡 - 客户可以存储多种付款方式
  • 默认选择 - 指定首选付款方式以进行自动收费
  • 到期跟踪 - 监控和更新即将到期的卡
  • 自助服务 - 客户可以通过 自助服务门户 <self_care_portal> 管理自己的卡
  • 员工管理 - 支持员工可以代表客户添加/删除卡

支持的付款方式:

  • 信用卡(Visa、Mastercard、American Express、Discover)
  • 借记卡
  • 预付卡(如果卡网络支持)

不在OmniCRM中存储:

卡详细信息由支付供应商令牌化并安全存储。OmniCRM仅存储:

  • 支付供应商(stripe、paypal)
  • 卡品牌(Visa、Mastercard等)
  • 后4位数字
  • 到期月/年
  • 持卡人姓名/昵称
  • 供应商特定的付款方式令牌

访问付款方式

从客户页面:

  1. 导航到 客户 → [选择客户]
  2. 点击 计费 标签
  3. 滚动到 付款方式 部分

或直接:

从即将到期的卡仪表板:

查看所有即将到期的卡客户:

这显示了系统范围内在接下来的60天内到期的卡的列表。

付款方式列表

付款方式表显示客户的所有存储卡:

付款方式列表

列描述:

  • 昵称 - 卡的友好名称(例如,“个人卡”,“工作Visa”)
  • 发行者 - 卡品牌和后4位数字
  • 到期 - 到期月/年(MM/YYYY格式)
  • 添加 - 卡添加到帐户的日期
  • 默认 - 勾选标记表示自动收费的默认付款方式

每张卡的操作:

每行都有一个操作菜单(⋮),选项包括:

  • 设为默认 - 将其设为默认付款方式
  • 删除 - 从帐户中删除卡

添加付款方式

单击 "添加付款方式" 打开安全付款模态框。

步骤1:输入卡详细信息

安全付款表单出现(由Stripe Elements或PayPal SDK提供支持):

添加付款方式模态框

必填字段:

  • 卡信息 - 卡号、��期、CVC(由Stripe验证)
  • 持卡人姓名 - 卡上的姓名
  • 国家/地区 - 账单国家

可选字段:

  • 卡昵称 - 友好的标签以区分卡片

安全性:

  • 卡详细信息直接输入到供应商托管的安全iframe中(Stripe Elements / PayPal SDK)
  • OmniCRM从未看到或存储完整的卡号
  • PCI DSS合规性由支付供应商处理
  • 实时验证防止无效卡号

步骤2:提交并令牌化

当您单击 "添加付款方式" 时:

  1. 客户端验证:
    • 支付供应商验证卡号格式
    • 检查到期日期是否在未来
    • 验证CVC格式
  2. 令牌化:
    • 卡详细信息直接发送到支付供应商(而不是OmniCRM)
    • 供应商创建一个安全令牌(例如,pm_1A2B3C4D用于Stripe)
    • 令牌返回给OmniCRM
  3. 服务器处理:
    • OmniCRM将令牌保存到客户记录中,并附上供应商标识符
    • 存储后4位数字、品牌、到期和供应商名称以供显示
    • 从未有完整的卡号接触OmniCRM服务器

步骤3:确认

成功消息出现:

您的Visa卡(后四位为1234)已添加到您的帐户。

新卡出现在付款方式表中。

自动默认选择:

  • 如果这是客户的第一张卡,则自动设为默认
  • 如果客户已经有卡,则新卡作为非默认添加
  • 客户可以在添加后更改默认设置

设置默认付款方式

默认付款方式用于:

  • 自动定期服务收费
  • 发票付款
  • 充值和补充
  • 一次性交易(除非另有说明)

更改默认设置:

  1. 在付款方式表中找到要设为默认的卡

  2. 单击卡旁的 操作菜单(⋮)

  3. 选择 "设为默认"

  4. 确认消息出现

    Visa卡(后四位为5678)现在是您的默认付款方式。

勾选标记移动到新选择的卡上。

视觉指示:

默认卡在默认列中显示,通常带有绿色勾选标记徽章。

删除付款方式

删除过期、丢失或不再需要的卡。

步骤1:启动删除

  1. 在付款方式表中找到要删除的卡
  2. 单击 操作菜单(⋮)
  3. 选择 "删除"

步骤2:确认删除

确认模态框出现:

您确定要删除此付款方式吗?

卡:Visa(后四位为1234)到期:12/2026

⚠️ 警告:如果这是您唯一的付款方式,您将需要添加新的付款方式以继续使用需要自动计费的服务。

[取消] [删除付款方式]

单击 "删除付款方式" 以确认。

步骤3:删除完成

成功消息:

卡从表中移除并从Stripe中删���。

重要限制:

  • 如果存在其他卡,则无法删除默认卡 - 首先将其他卡设为默认
  • 如果删除最后一张卡,则会发出警告 - 需要付款的服务可能会暂停
  • 无撤销 - 删除是永久的;客户必须重新添加卡(如有需要)

管理即将到期的卡

OmniCRM跟踪卡到期日期,并提供工具主动更新即将到期的卡。

即将到期的卡仪表板

导航到 计费 → 即将到期的卡 查看系统范围的列表:

客户 卡到期 距离采取行动的天数 John Smith Visa **1234 02/2025 12天 更新 Acme Corp MC5678 03/2025 45天 更新 Jane Doe Amex**9012 01/2025 已过期 更新

即将到期的卡仪表板

过滤器:

  • 到期范围 - 接下来的30/60/90天或已过期
  • 客户类型 - 个人与企业
  • 服务类型 - 按需要付款方式的服务过滤

操作:

  • 更新 - 打开客户的付款方式页面以添加新卡
  • 通知 - 向客户发送电子邮件提醒(如果已配置Mailjet)

到期通知

如果已配置Mailjet,将自动发送电子邮件:

  • 到期前60天 - 第一次提醒
  • 到期前30天 - 第二次提醒
  • 到期前7天 - 最后警告
  • 到期时 - 卡已过期通知

客户可以单击电子邮件中的链接,通过自助服务门户更新其付款方式。

电子邮件模板变量:

Mailjet模板接收:

  • 客户姓名
  • 卡品牌和后4位数字
  • 到期日期
  • 自助服务付款方式页面的链接

请参见 integrations_mailjet 以获取电子邮件模板配置。

更新即将到期的卡

推荐工作流程:

  1. 客户收到到期通知电子邮件
  2. 客户登录自助服务门户
  3. 导航到 计费 → 付款方式
  4. 点击 "添加付款方式"
  5. 输入新卡详细信息(相同卡的更新到期,或替换卡)
  6. 将新卡设为默认
  7. 删除旧/过期卡

员工工作流程:

如果客户拨打支持电话:

  1. 员工打开客户帐户
  2. 导航到 计费 → 付款方式
  3. 代表客户添加新卡(客户通过电话提供详细信息)
  4. 将新卡设为默认
  5. 删除过期卡
  6. 与客户确认

警告

绝不要要求客户通过电子邮件或短信发送卡详细信息。始终使用:

  • 安全的自助服务门户进行自助服务
  • 电话与员工直接输入系统
  • 在零售地点亲自进行

当卡过期时发生的事情

当付款卡达到到期日期且未更新时:

立即影响:

  1. 自动付款失败
    • 支付供应商拒绝使用过期卡的交易
    • 月度服务续订未能处理
    • 自动充值失败
    • 发票自动付款失败
  2. 客户通知
    • 系统尝试收费
    • 发送付款失败通知
    • 发送“更新付款方式”电子邮件,附带自助服务门户链接
  3. 服务状态更改
    • 后付费服务 - 可能会暂时继续,余额未结清
    • 预付费服务 - 当余额耗尽时暂停服务
    • 自动续订服务 - 续订失败,服务可能过期

后续行动:

第1-3天(宽限期):

  • 服务正常继续
  • 客户收到第一次付款失败通知
  • 系统尝试重试(根据配置)

第4-7天:

  • 第二次付款尝试(如果配置)
  • 发送警告电子邮件
  • 客户服务可能联系客户

第8-14天:

  • 由于未付款,服务可能会暂停
  • 暂停状态阻止使用,但保留帐户
  • 客户可以通过更新付款方式和支付未结余额恢复服务

第15天及以后:

  • 由于未付款,服务可能会终止
  • 库存(SIM卡、设备)标记为退回
  • 发送最终通知
  • 帐户转交给催收(如适用)

防止服务中断:

为避免服务中断:

  • 在到期前30天更新卡
  • 添加多种付款方式以备份
  • 启用付款失败警报
  • 每周监控即将到期的卡仪表板

到期后恢复服务:

如果由于卡过期而暂停服务:

  1. 添加新的有效付款方式
  2. 将其设为默认
  3. 支付未结余额(如有)
  4. 联系支持以重新激活服务
  5. 服务在几分钟到几小时内恢复

付款方式安全

令牌化

OmniCRM使用供应商令牌化以确保安全:

  1. 客户输入卡 → 直接发送到支付供应商服务器
  2. 供应商验证并令牌化 → 创建唯一令牌
  3. 令牌存储在OmniCRM中 → 从未存储完整的卡号
  4. 付款处理 → 令牌发送给供应商,供应商收费

OmniCRM存储的内容:

{
"vendor": "stripe",
"vendor_payment_method_id": "pm_1A2B3C4D5E6F",
"payment_type": "card",
"brand": "visa",
"last4": "1234",
"exp_month": 12,
"exp_year": 2026,
"name": "John Smith",
"nickname": "个人卡",
"is_default": true
}

OmniCRM不存储的内容:

  • 完整的卡号
  • CVV/CVC代码
  • 磁条数据
  • PIN号码

PCI合规性

通过使用供应商托管的付款表单:

  • 减少PCI范围 - 卡数据从未接触OmniCRM服务器
  • 供应商托管字段 - 卡输入发生在供应商的安全iframe中
  • 不存储卡 - 使用令牌代替原始卡数据
  • 安全传输 - 所有通信通过HTTPS/TLS进行

请参见 付款系统指南 <payment_system_guide> 以获取支付供应商安全详细信息。

常见工作流程

工作流程1:客户添加第一张付款方式

场景: 新客户注册服务

  1. 客户创建帐户
  2. 选择服务计划
  3. 在结账时提示添加付款方式
  4. 在Stripe模态框中输入卡详细信息
  5. 卡令牌化并保存
  6. 自动设为默认
  7. 服务提供
  8. 处理第一次收费

工作流程2: