关于 sorted
sorted 是面向自由职业者的浏览器自动化技能,可通过 getSorted.de 管理发票、费用和德国税务报告。它使用真实的 Chrome Beta 会话,支持创建发票、下载 PDF 及预览或提交税务报告;部分操作受套餐限制。
主要功能
- 01创建、列出和下载发票
- 02在套餐支持时通过邮件发送发票
- 03添加并跟踪费用
- 04查看税务义务和截止日期
- 05预览或提交税务报告
适用场景
- 01为客户创建发票
- 02将发票下载为 PDF
- 03在 Sorted 记录费用
- 04查看或提交德国税务报告
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ glebis/ claude-skills --skill sorted安装后在 Claude Code 中输入/sorted确认已加载。
详细介绍
Sorted — 自由职业者税务与发票自动化
通过真实的 Chrome Beta 浏览器自动操作 getSorted.de,用于开具发票、跟踪支出以及提交德国税务申报。
前提条件
- Chrome Beta,并使用
--remote-debugging-port=9222(使用/real-browser启动流程) - Google 账号会话已保存在
~/.chrome-beta-profile - 已安装
agent-browserCLI
命令
invoice create
在 Sorted 上创建新发票。
必需参数: 客户名称、金额
可选参数: 小时数、费率、描述、到期日、服务日期、客户类型(企业/个人)
invoice download <invoice-number>
从 Sorted 下载格式规范的 PDF(而非浏览器打印版)。
invoice send <invoice-number> --email <email>
直接通过 Sorted 发送发票邮件(仅限付费套餐)。免费套餐会下载 PDF,并通过 Telegram 发送。
invoice list
列出所有发票及其状态(已付款/未付款)。
expense add
添加一笔支出。
tax status
显示当前税务义务、截止日期和逾期申报。
tax preview <report-type> <period>
在提交前预览税务申报。
tax submit <report-type> <period>
通过 ELSTER 向 Finanzamt 提交税务申报(需要付费套餐)。
Sorted 导航
应用网址:https://app.getsorted.de/
| 区域 | 侧边栏链接 | 用途 |
|---|---|---|
| 控制面板 | Sorted(徽标) | 概览:应缴税款、收入、支出 |
| 税务 | Taxes | 税务申报、截止日期、提交记录 |
| 收入 | Income | 发票列表、创建/编辑发票 |
| 支出 | Expenses | 支出跟踪、收据 |
| 税务顾问 | Tax consultant | 顾问对接 |
| 个人详情 | Profile → Personal details | 自由职业者信息、Steuernummer |
| 银行账户 | Profile → Bank accounts (Beta) | 已关联的银行 |
| 订阅 | Profile → Subscription | 套餐管理 |
| 导入 | Profile → Import your data | 批量导入数据 |
| 设置 | Profile → Settings | 应用偏好设置 |
税务申报类型
| 申报 | 德语名称 | 频率 | 说明 |
|---|---|---|---|
| 增值税预申报 | Umsatzsteuer-Voranmeldung (UStVA) | 每季度 | 发票中收取的增值税 |
| 欧盟汇总申报 | Zusammenfassende Meldung (ZM) | 每季度 | 来自欧盟客户的收入 |
| 年度申报 | EÜR + Einkommensteuererklärung | 每年 | 盈亏 + 所得税 |
创建发票流程
浏览器自动化步骤:
- 导航:
Income→ 点击Add→Create invoice - 设置客户: 点击发票预览中的
Client details区域- 搜索现有客户,或点击
Add new client - 选择
Business或Private person - 填写:姓名、VAT/TIN、街道、城市、邮编、国家(自动补全下拉菜单——输入后点击匹配项)、电子邮件(可选)
- 在对话框中点击
Save
- 搜索现有客户,或点击
- 设置发票日期: 点击“Invoice date”旁的日期(默认为今天)
- 设置服务日期(必填): 点击发票日期右侧标为“Service date”的空白区域
- 这是一个日期范围选择器——先选择开始日期,再选择结束日期
- 如果服务在同一天完成,请对同一日期点击两次
- 未设置服务日期时,Save 会静默失败——该字段会以红色显示“Required”
- 可点击元素的 class 为
clickable,位于发票预览中的约 x:734 y:413 处 - 如果快照中未显示该元素,请使用 JS:查找文本为“Service dateRequired”的 div 并点击
- 设置到期日: 点击“Due date”下方的“Select date”→ 在日历中选择日期
- 添加项目: 点击
Add a line- 字段:描述(文本)、数量(数字)、单位下拉菜单(h/pcs 等)、费率(数字)
- 点击已折叠的值即可重新编辑
- 增值税: Kleinunternehmer 账户会自动设为 0%。备注中会显示“Service not taxable in Germany”
- 保存: 点击
Save按钮。成功后,标题会从“Add invoice”变为“Edit invoice”
注意事项
- 服务日期为必填项,但很容易忽略——只有在尝试保存时才会提示
- **德式数字格式:**句点是千位分隔符(1.000 = 一千),逗号表示小数
- **已折叠的字段:**保存后,明细项字段会折叠为仅显示内容。点击显示的值即可重新打开可编辑字段
- **发票编号:**按顺序自动生成(例如,2025-03-21)。点击即可编辑
发票 PDF 下载流程
重要:请勿使用 Chrome CDP Page.printToPDF——它会截取整个页面,包括侧边栏和设置面板。请始终使用 Sorted 的原生 PDF。
步骤:
- 打开发票(从 Income 列表中点击,或创建后导航至该发票)
- 点击
Save and send按钮(右上角的青绿色按钮) - 此时会出现 “Email invoice” 对话框,其中包含:
- To 字段(电子邮件)
- Subject 字段(自动填充)
- Message 文本框
- 底部的 Attachments 区域,显示 PDF 文件名
- 点击 PDF 链接(例如,
ALL3 DOO BELGRADE-2025-03-21-20260506.pdf)- 这是一个带有
cursor:pointer和onclick的generic元素 - 文本符合以下模式:
{CLIENT_NAME}-{INVOICE_NUMBER}-{DATE}.pdf
- 这是一个带有
- PDF 会下载到
~/Downloads/ - 关闭对话框(点击
Close或×)
发送电子邮件(付费计划)
在付费计划中,“Email invoice” 对话框功能完整:
- 在
To字段中填写客户电子邮件(@e49) - 如有需要,编辑
Subject(默认填充为 “Gleb Kalinin sent you an invoice (#INVOICE-NUMBER)”) - 在文本框中填写
Message - 切换 “Send a copy to my email” 复选框(默认已勾选)
- 点击
Email invoice按钮(@e15)发送
在免费计划中,对话框会显示 “Sending invoices by email is not available in your plan” 和一个 “Change my plan” 链接。无论如何,PDF 仍可下载。
备用方式:通过 Telegram 发送(免费计划)
如果无法发送电子邮件,请下载 PDF 并通过 Telethon 发送(见下方的“下载后发送发票”一节)。
PDF 文件名模式
{CLIENT_NAME}-{INVOICE_NUMBER}-{YYYYMMDD}.pdf
示例:ALL3 DOO BELGRADE-2025-03-21-20260506.pdf
客户管理
现有客户会保存下来,供重复使用。创建发票时:
- 客户选择器会显示所有已保存的客户
- 在搜索框中按名称搜索
- 点击各名称旁边的小按钮,即可编辑或删除客户
客户字段(企业)
- 企业名称(必填)
- VAT number / TIN(可选)
- 街道和门牌号
- 城市
- 邮政编码
- 国家(自动补全——输入后点击匹配项)
- 电子邮件
客户字段(个人)
- 名字、姓氏
- 地址字段与企业相同
下载后发送发票
下载 PDF 后,通过 Telethon 使用 Telegram 发送:
from telethon.sync import TelegramClient
import json
from pathlib import Path
config = json.loads((Path.home() / '.telegram_dl' / 'config.json').read_text())
session = str(Path.home() / '.telegram_dl' / 'user')
with TelegramClient(session, config['api_id'], config['api_hash']) as client:
client.send_file("username", "/path/to/invoice.pdf", caption="message")
Gleb 的 Sorted 账户详情
- **状态:**Kleinunternehmer(不收取增值税)
- **Finanzamt:**Berlin - Wedding
- **VAT-ID:**DE369692682
- **税号:**2337201265
- **银行:**Revolut Bank UAB, Zweigniederlassung
- **IBAN:**DE38 1001 0178 8157 1777 30
- **BIC/SWIFT:**REVODEB2
- **计划:**免费(可开具发票;提交税务申报需升级)
浏览器会话设置
始终使用 /real-browser 技能的启动流程。每次运行都应使用唯一的会话名称:
SESSION=$(LC_ALL=C tr -dc 'a-z0-9' < /dev/urandom | head -c 6)
agent-browser --cdp 9222 --session "$SESSION" open "https://app.getsorted.de/"
Google 登录状态会持久保存——无需每次重新验证。