T

Skill 详情

Tyche Lite — Quick Invoice Preview

Tyche Lite —发票追踪器(免费)。可从 CSV 处理最多 5 张发票,查看付款状态,并获取友好提醒模板。作为 Ty... 的免费预览。

来源平台:SkillHub
来源标识:SkillHub/tyche-lite
源文件:原始说明
前端设计 高关注 SkillHub 中 风险 下载 330 SkillHub
来源平台SkillHub
文档版本1.0.4
热度高关注
排名信号下载 330
概述 安装 文档 下载

快速判断

Tyche Lite —发票追踪器(免费)。可从 CSV 处理最多 5 张发票,查看付款状态,并获取友好提醒模板。作为 Ty... 的免费预览。

最后校验2026-05-27
来源平台SkillHub
安全提示
下载副本ZIP 可用

适合任务

  • 按 SkillHub 收录说明复用成熟任务流程。
  • 通过下载包离线阅读完整 Skill 内容。
  • 结合热度指标优先评估常用 Skill。

输入与输出

输入:任务目标、上下文材料、文件路径、约束条件或需要处理的内容。

输出:按 Skill 说明生成的文档、代码、检查结果、计划、建议或操作步骤。

示例任务

  • 使用 Tyche Lite — Quick Invoice Preview 帮我处理当前任务,并说明需要准备哪些输入。
  • 根据 Tyche Lite — Quick Invoice Preview 的说明,先列出使用前的安全检查项。

安装方式

  1. 下载本站提供的 Skill ZIP 并解压。
  2. 把解压后的 Skill 目录放入当前 AI 工具支持的 skills 目录。
  3. 如需在线查看原始内容,可打开 GitHub 的 SKILL.md

在线原始地址:skillhub-tyche-lite/SKILL.md

风险边界

SkillHub 提供了源站安全报告入口,但本站不替代人工审查。使用前仍需检查权限、外部依赖和敏感数据边界。

SKILL.md 文档介绍

Tyche Lite — Free Invoice Preview

Track up to 5 invoices and get a friendly reminder template.

Free vs Pro

| Feature | Tyche Lite (Free) | Tyche Pro |

|---------|------------------|-----------|

| Invoices | 5 max | Unlimited |

| Tax calculation | ❌ | ✅ |

| Late fee calculation | ❌ | ✅ |

| Reminder tiers | 1 (friendly only) | 3 tiers |

| Multi-currency | ❌ | ✅ |

| Project grouping | ❌ | ✅ |

| Aged receivables | ❌ | ✅ 30/60/90d |

| Analytics export | ❌ | ✅ |

👉 Upgrade: openclaw skills install tyche-pro — key at ko-fi.com/s/4e0d922f4c

💰 Bundle deal: all 5 Pro skills for $29ko-fi.com/s/7625accf3f (save $16)

---

Step 1 — Install

pip3 install rich --break-system-packages --quiet

---

Step 2 — Invoice overview (Lite)

import os, csv, re
from datetime import datetime, timedelta
from rich.console import Console
from rich.table import Table
from rich.panel import Panel
from rich import box

console = Console()

INVOICES_FILE = os.environ.get("INVOICES_FILE","").strip()
YOUR_NAME     = os.environ.get("YOUR_NAME","Your Name")
CURRENCY      = os.environ.get("CURRENCY","USD").upper()
SYM           = {"USD":"$","EUR":"€","GBP":"£"}.get(CURRENCY,"$")
INVOICE_LIMIT = 5  # Lite cap
now           = datetime.now()

def fmt(a): return f"{SYM}{a:,.2f}"
def parse_amount(r):
    c = re.sub(r"[^0-9.]","",str(r)) or "0"
    try: return float(c) if c.count(".")<=1 else 0.0
    except: return 0.0
def parse_date(raw):
    for f in ("%Y-%m-%d","%m/%d/%Y","%d/%m/%Y"):
        try: return datetime.strptime(raw.strip(),f)
        except: pass
    return None

invoices = []
if INVOICES_FILE and os.path.exists(INVOICES_FILE):
    with open(INVOICES_FILE,encoding="utf-8",errors="replace") as f:
        reader = csv.DictReader(f)
        for i,row in enumerate(reader,1):
            if i > INVOICE_LIMIT:
                console.print(f"[yellow]⚠️  Lite limit: showing first {INVOICE_LIMIT} invoices only. Upgrade to Pro for unlimited.[/yellow]")
                break
            rk = {k.lower().strip():v.strip() for k,v in row.items()}
            invoices.append({
                "inv_number":   rk.get("inv_number",f"INV-{i:04d}"),
                "client_name":  rk.get("client_name","Client"),
                "client_email": rk.get("client_email",""),
                "description":  rk.get("description","Services"),
                "amount":       parse_amount(rk.get("amount","0")),
                "due_date":     rk.get("due_date",""),
                "status":       rk.get("status","unpaid").lower(),
            })
else:
    console.print("[yellow]ℹ️  No INVOICES_FILE — using demo data.[/yellow]\n")
    invoices = [
        {"inv_number":"INV-0001","client_name":"Acme Corp","client_email":"billing@acme.com","description":"Website redesign","amount":2500,"due_date":(now-timedelta(days=15)).strftime("%Y-%m-%d"),"status":"overdue"},
        {"inv_number":"INV-0002","client_name":"Globex Inc","client_email":"ap@globex.com","description":"Consulting","amount":1800,"due_date":(now+timedelta(days=10)).strftime("%Y-%m-%d"),"status":"unpaid"},
        {"inv_number":"INV-0003","client_name":"Initech Ltd","client_email":"pay@initech.com","description":"Logo design","amount":750,"due_date":(now-timedelta(days=5)).strftime("%Y-%m-%d"),"status":"paid"},
    ]

for inv in invoices:
    due = parse_date(inv["due_date"])
    inv["due_dt"]    = due
    inv["days_late"] = max(0,(now-due).days) if due and inv["status"] in ("overdue","unpaid") else 0

total_invoiced    = sum(i["amount"] for i in invoices)
total_paid        = sum(i["amount"] for i in invoices if i["status"]=="paid")
total_outstanding = total_invoiced - total_paid

console.print()
console.print(Panel.fit(
    f"[bold yellow]⚖️  Tyche Lite — Invoice Overview[/bold yellow]\n"
    f"Invoiced: [white]{fmt(total_invoiced)}[/white]  Paid: [green]{fmt(total_paid)}[/green]  Outstanding: [red]{fmt(total_outstanding)}[/red]\n"
    f"[dim]Lite: showing {len(invoices)}/{INVOICE_LIMIT} invoices max[/dim]",
    border_style="yellow"
))

SC = {"paid":"green","unpaid":"yellow","overdue":"red","partial":"cyan"}
console.print()
tbl = Table(title="Invoice Status", box=box.ROUNDED, border_style="yellow")
tbl.add_column("Inv #",   width=10, style="dim")
tbl.add_column("Client",  width=18, style="cyan")
tbl.add_column("Amount",  width=12, justify="right")
tbl.add_column("Due",     width=12, style="dim")
tbl.add_column("Late",    width=8,  style="red", justify="right")
tbl.add_column("Status",  width=10)
for inv in sorted(invoices, key=lambda x: -(x["days_late"] or 0)):
    sc   = SC.get(inv["status"],"white")
    late = f"{inv['days_late']}d" if inv["days_late"] else "—"
    tbl.add_row(inv["inv_number"],inv["client_name"][:16],fmt(inv["amount"]),inv["due_date"],late,f"[{sc}]{inv['status'].title()}[/{sc}]")
console.print(tbl)

# 1 reminder (Lite: friendly only)
overdue = [i for i in invoices if i["days_late"] > 0]
if overdue:
    inv = overdue[0]
    console.print()
    console.print(Panel(
        f"To: {inv['client_email']}\nSubject: Friendly Reminder — Invoice {inv['inv_number']}\n\n"
        f"Dear {inv['client_name']},\n\n"
        f"I hope you're well. Invoice {inv['inv_number']} for {fmt(inv['amount'])} was due {inv['due_date']}. "
        f"Could you confirm when payment will be processed?\n\n"
        f"Kind regards,\n{YOUR_NAME}",
        title=f"[yellow]Friendly Reminder — {inv['client_name']} ({inv['days_late']}d overdue)[/yellow]",
        border_style="yellow"
    ))
    if len(overdue) > 1:
        console.print(f"[dim]+ {len(overdue)-1} more overdue invoice(s) — upgrade to Pro for all reminder tiers.[/dim]")

console.print()
console.print(Panel(
    f"[bold yellow]🔓 Want more?[/bold yellow]\n\n"
    f"Tyche Pro handles [bold]unlimited invoices[/bold], calculates [bold]late fees & tax[/bold], "
    f"sends [bold]3-tier reminders[/bold], groups by project, and gives you an aged receivables dashboard.\n\n"
    f"[bold cyan]openclaw skills install tyche-pro[/bold cyan]\n"
    f"Get your key → [bold]ko-fi.com/s/4e0d922f4c[/bold]",
    title="Upgrade to Tyche Pro",
    border_style="cyan"
))
建议反馈