add bin/arcodange CLI and dolibarr-tva-summary skill
Two changes that go together: now operators can run every read-only
workflow without going through Claude. The skills (SKILL.md files)
remain the source of behaviour documentation and Claude triggers;
bin/arcodange is the human-facing entry point.
bin/arcodange:
- Bash dispatcher at the project root. Subcommands per domain:
tva {collect, collect-detail, deductible, deductible-detail, summary},
invoice {list, audit}, thirdparty {audit, audit-all},
payments {state, timeline, by-month},
templates {list, inspect},
snapshot, whoami, ping, curl, help.
- Locates the project root via `git rev-parse` so it works from any
CWD (including from a worktree).
- Per-subcommand `help` text. Unknown commands exit 2 with a hint.
- Reuses the existing per-skill scripts under .claude/skills/<name>/
scripts/ via `exec` (zero behaviour drift, full credit to the
existing tested code).
dolibarr-tva-summary:
- Composes dolibarr-tva-reconciliation (TVA collectée customer-side)
and dolibarr-tva-deductible (TVA déductible supplier-side) into a
single CA3-ready monthly summary with per-month net verdict
(TVA à reverser / crédit de TVA / équilibre) and a cumulative line.
- Live baseline: Arcodange en crédit de TVA de 223.22 € cumulé
(0 € collectée 259-1° CGI vs 223.22 € déductible).
- Exposed as `arcodange tva summary [--year|--since|--until]`.
Each existing skill's SKILL.md gets a one-line "CLI shortcut" near
the top so the human path is discoverable from any skill page.
The project root README.md gets a CLI section as the primary
operator entry point.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
226
bin/arcodange
Executable file
226
bin/arcodange
Executable file
@@ -0,0 +1,226 @@
|
||||
#!/usr/bin/env bash
|
||||
# arcodange — read-only operational CLI for the Arcodange Dolibarr ERP.
|
||||
#
|
||||
# Usage: arcodange <command> [subcommand] [args]
|
||||
#
|
||||
# Run `arcodange help` for the full command list.
|
||||
#
|
||||
# This is a thin dispatcher: every subcommand delegates to a script under
|
||||
# .claude/skills/<skill>/scripts/. The skills (markdown SKILL.md files)
|
||||
# remain the source of behaviour documentation; this CLI is the human-
|
||||
# friendly entry point so you don't have to spell out 5-component paths.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# --- Locate the project root ----------------------------------------------
|
||||
# Strategy:
|
||||
# 1. git rev-parse --show-toplevel (works when CWD is inside the repo).
|
||||
# 2. Walk up from this script's directory to find a sibling .claude/skills.
|
||||
# Either approach handles being run from a worktree without surprises.
|
||||
|
||||
if SROOT=$(git rev-parse --show-toplevel 2>/dev/null) && [[ -d "${SROOT}/.claude/skills" ]]; then
|
||||
:
|
||||
else
|
||||
SROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
|
||||
if [[ ! -d "${SROOT}/.claude/skills" ]]; then
|
||||
echo "arcodange: cannot find project root (no .claude/skills/ found)" >&2
|
||||
exit 2
|
||||
fi
|
||||
fi
|
||||
|
||||
SKILLS="${SROOT}/.claude/skills"
|
||||
DOLC="${SKILLS}/dolibarr/scripts/dol-curl.sh"
|
||||
|
||||
# --- Help text -----------------------------------------------------------
|
||||
|
||||
usage() {
|
||||
cat <<'EOF'
|
||||
arcodange — read-only Arcodange Dolibarr CLI.
|
||||
|
||||
USAGE
|
||||
arcodange <command> [subcommand] [args...]
|
||||
|
||||
COMMANDS
|
||||
|
||||
tva French TVA monthly preparation
|
||||
collect [--year|--since|--until] TVA collectée by month × rate (CA3 A1/A4/E2)
|
||||
collect-detail [--year|--since|--until] Per-line audit, customer side
|
||||
deductible [--year|--since|--until] TVA déductible by month × rate (CA3 19/20/17+24)
|
||||
deductible-detail [--year|--since|--until] Per-line audit, supplier side
|
||||
summary [--year|--since|--until] Composite CA3-ready monthly summary
|
||||
|
||||
invoice Customer invoices (KissMetrics)
|
||||
list [--since YYYY-MM-DD] Table of KM invoices with payment state
|
||||
audit <invoice-id> JSON facts + PDF mandatory-mention audit
|
||||
|
||||
thirdparty Clients + suppliers completeness
|
||||
audit <socid> Country-aware audit for one thirdparty
|
||||
audit-all [--clients-only|--suppliers-only] Audit every visible thirdparty
|
||||
|
||||
payments Cash receipts (KissMetrics-side)
|
||||
state [--since YYYY-MM-DD] Per-invoice TTC vs payments reconciliation
|
||||
timeline [--year|--since|--until] Payment timeline with cumulative balance
|
||||
by-month [--year|--all-clients] Monthly aggregation
|
||||
|
||||
templates Recurring invoice templates
|
||||
list [--max-id N] Enumerate templates (probes ids)
|
||||
inspect <template-id> Full template audit with health checks
|
||||
|
||||
snapshot [--out FILE|--print-only] Bundle full read-only state into one JSON
|
||||
|
||||
whoami GET /users/info — confirm auth
|
||||
ping GET /status — liveness + Dolibarr version
|
||||
curl <path> Raw read-only curl through dol-curl.sh
|
||||
|
||||
help [command] Show this help (or subcommand help)
|
||||
|
||||
CREDENTIALS
|
||||
Reads .claude/skills/dolibarr/.env (mode 600, gitignored). See
|
||||
.claude/skills/dolibarr/README.md for one-time setup.
|
||||
|
||||
EXAMPLES
|
||||
arcodange ping
|
||||
arcodange whoami
|
||||
arcodange invoice list
|
||||
arcodange invoice audit 12
|
||||
arcodange tva summary --year 2026
|
||||
arcodange thirdparty audit-all
|
||||
arcodange snapshot --out /tmp/erp.json
|
||||
EOF
|
||||
}
|
||||
|
||||
# --- Dispatch ------------------------------------------------------------
|
||||
|
||||
cmd="${1:-help}"
|
||||
shift || true
|
||||
|
||||
case "${cmd}" in
|
||||
|
||||
tva)
|
||||
sub="${1:-help}"; shift || true
|
||||
case "${sub}" in
|
||||
collect) exec "${SKILLS}/dolibarr-tva-reconciliation/scripts/tva-by-month.sh" "$@" ;;
|
||||
collect-detail) exec "${SKILLS}/dolibarr-tva-reconciliation/scripts/tva-line-detail.sh" "$@" ;;
|
||||
deductible) exec "${SKILLS}/dolibarr-tva-deductible/scripts/deductible-by-month.sh" "$@" ;;
|
||||
deductible-detail) exec "${SKILLS}/dolibarr-tva-deductible/scripts/deductible-line-detail.sh" "$@" ;;
|
||||
summary) exec "${SKILLS}/dolibarr-tva-summary/scripts/tva-summary.sh" "$@" ;;
|
||||
help|-h|--help)
|
||||
cat <<'EOF'
|
||||
arcodange tva — French TVA monthly preparation.
|
||||
|
||||
collect TVA collectée by month × rate (CA3 A1/A4/E2)
|
||||
collect-detail Per-line audit, customer side
|
||||
deductible TVA déductible by month × rate (CA3 19/20/17+24)
|
||||
deductible-detail Per-line audit, supplier side
|
||||
summary CA3-ready monthly net summary (collectée − déductible)
|
||||
|
||||
All accept --year YYYY, --since YYYY-MM-DD, --until YYYY-MM-DD.
|
||||
EOF
|
||||
;;
|
||||
*) echo "arcodange tva: unknown subcommand '${sub}' (try 'arcodange tva help')" >&2; exit 2 ;;
|
||||
esac
|
||||
;;
|
||||
|
||||
invoice)
|
||||
sub="${1:-help}"; shift || true
|
||||
case "${sub}" in
|
||||
list) exec "${SKILLS}/dolibarr-invoice-audit/scripts/list-km-invoices.sh" "$@" ;;
|
||||
audit) exec "${SKILLS}/dolibarr-invoice-audit/scripts/audit-invoice.sh" "$@" ;;
|
||||
help|-h|--help)
|
||||
cat <<'EOF'
|
||||
arcodange invoice — customer (KissMetrics) invoice operations.
|
||||
|
||||
list [--since YYYY-MM-DD] Table of KM invoices with payment state
|
||||
audit <invoice-id> JSON facts + PDF mandatory-mention audit
|
||||
EOF
|
||||
;;
|
||||
*) echo "arcodange invoice: unknown subcommand '${sub}' (try 'arcodange invoice help')" >&2; exit 2 ;;
|
||||
esac
|
||||
;;
|
||||
|
||||
thirdparty)
|
||||
sub="${1:-help}"; shift || true
|
||||
case "${sub}" in
|
||||
audit) exec "${SKILLS}/dolibarr-thirdparty-completeness/scripts/audit-thirdparty.sh" "$@" ;;
|
||||
audit-all) exec "${SKILLS}/dolibarr-thirdparty-completeness/scripts/audit-all-thirdparties.sh" "$@" ;;
|
||||
help|-h|--help)
|
||||
cat <<'EOF'
|
||||
arcodange thirdparty — clients + suppliers completeness.
|
||||
|
||||
audit <socid> Country-aware audit for one thirdparty
|
||||
audit-all [--clients-only|--suppliers-only] Audit every visible thirdparty
|
||||
EOF
|
||||
;;
|
||||
*) echo "arcodange thirdparty: unknown subcommand '${sub}'" >&2; exit 2 ;;
|
||||
esac
|
||||
;;
|
||||
|
||||
payments)
|
||||
sub="${1:-help}"; shift || true
|
||||
case "${sub}" in
|
||||
state) exec "${SKILLS}/dolibarr-payments-state/scripts/km-payment-state.sh" "$@" ;;
|
||||
timeline) exec "${SKILLS}/dolibarr-payments-state/scripts/km-payment-timeline.sh" "$@" ;;
|
||||
by-month) exec "${SKILLS}/dolibarr-payments-state/scripts/payments-by-month.sh" "$@" ;;
|
||||
help|-h|--help)
|
||||
cat <<'EOF'
|
||||
arcodange payments — KissMetrics cash-receipt tracking.
|
||||
|
||||
state [--since YYYY-MM-DD] Per-invoice TTC vs payments reconciliation
|
||||
timeline [--year|--since|--until] Payment timeline with cumulative balance
|
||||
by-month [--year|--all-clients] Monthly aggregation
|
||||
EOF
|
||||
;;
|
||||
*) echo "arcodange payments: unknown subcommand '${sub}'" >&2; exit 2 ;;
|
||||
esac
|
||||
;;
|
||||
|
||||
templates)
|
||||
sub="${1:-help}"; shift || true
|
||||
case "${sub}" in
|
||||
list) exec "${SKILLS}/dolibarr-recurring-templates/scripts/list-templates.sh" "$@" ;;
|
||||
inspect) exec "${SKILLS}/dolibarr-recurring-templates/scripts/inspect-template.sh" "$@" ;;
|
||||
help|-h|--help)
|
||||
cat <<'EOF'
|
||||
arcodange templates — recurring invoice templates.
|
||||
|
||||
list [--max-id N] Enumerate templates (probes ids)
|
||||
inspect <template-id> Full audit with health checks
|
||||
EOF
|
||||
;;
|
||||
*) echo "arcodange templates: unknown subcommand '${sub}'" >&2; exit 2 ;;
|
||||
esac
|
||||
;;
|
||||
|
||||
snapshot)
|
||||
exec "${SKILLS}/dolibarr-data-snapshot/scripts/snapshot.sh" "$@"
|
||||
;;
|
||||
|
||||
whoami)
|
||||
exec "${DOLC}" /users/info
|
||||
;;
|
||||
|
||||
ping)
|
||||
exec "${DOLC}" /status
|
||||
;;
|
||||
|
||||
curl)
|
||||
if [[ $# -lt 1 ]]; then
|
||||
echo "arcodange curl: missing path. Example: arcodange curl /invoices/12" >&2
|
||||
exit 2
|
||||
fi
|
||||
exec "${DOLC}" "$@"
|
||||
;;
|
||||
|
||||
help|-h|--help|"")
|
||||
if [[ $# -gt 0 ]]; then
|
||||
exec "$0" "$1" help
|
||||
fi
|
||||
usage
|
||||
;;
|
||||
|
||||
*)
|
||||
echo "arcodange: unknown command '${cmd}'" >&2
|
||||
echo " Try 'arcodange help' for the list." >&2
|
||||
exit 2
|
||||
;;
|
||||
esac
|
||||
Reference in New Issue
Block a user