Skip to content

About

Frappe app for tracking renewals, expiry status, reminders, and audit history.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

RenewVault

Never miss a renewal again. RenewVault tracks every contract, licence, subscription, certificate and insurance policy your business depends on — computes its status from the expiry date, emails the right person before it lapses, escalates when it does, and keeps an immutable record of every renewal.

Built on Frappe Framework v16 with a Frappe UI (Vue 3) single-page front end.


What it does

Track anything with an expiry Contracts, licences, AMCs, insurance, domains, certifications — modelled as Tracked Items with type, vendor, owner, assignee, issue/expiry dates and notes.
Status computes itself Every item is Active → Expiring Soon → Expired (or Cancelled), derived from the expiry date on every save and re-derived nightly, so a list is never stale. The "expiring soon" window is configurable.
Reminders that actually fire Per-item reminder rules ("30 days before", "7 days before") send email + in-app notification to the assignee, falling back to the owner. Every send is logged, and the log is checked first — so a reminder is never sent twice.
Escalation after expiry Once an item lapses, RenewVault keeps nagging on a configurable interval until someone acts.
Renew in one click, with history Renewing writes a Renewal History record — old expiry, new expiry, who did it, when, plus the renewal document as an attachment — then rolls the item forward. The history is append-only.
Manager dashboard Counts by status and a "needs attention" queue sorted by urgency.
Real access control RenewVault User sees only the items they own or are assigned; RenewVault Manager sees everything. Enforced server-side by permission-query + has_permission hooks — not just hidden buttons in the UI.
Full audit trail Reminder Log and Renewal History give you a defensible answer to "were we warned?"

Screens

A Frappe UI SPA at /renew_vault:

  • Tracked Items — searchable, filterable list (title/vendor search; type, vendor, status, owner, assignee filters), sorted by expiry ascending.
  • Item detail — fields, reminder rules, attachments, renewal history and reminder audit; Renew / Cancel / Edit actions.
  • New / Edit forms — including an inline reminder-rule editor.
  • Dashboard — status counts + needs-attention queue (managers only).
  • Settings — expiring-soon window and escalation interval (managers only).

The Frappe desk UI works too — every DocType is a first-class desk form.

Data model

Tracked Item ──< Reminder Rule       (child: days_before, label)
     │
     ├──< Renewal History            (old_expiry, new_expiry, renewed_by, renewed_on, attachment)
     └──< Reminder Log               (rule_days_before, sent_on, recipient, channel, status, error)

Document Type        (master)
Vendor               (master: title, contact_email)
RenewVault Settings  (single: expiring_soon_days, escalation_interval)

Installation

cd $PATH_TO_YOUR_BENCH
bench get-app https://github.com/jkonoor/Renew_Vault.git --branch version-16
bench --site your.site install-app renew_vault

The nightly job is registered via scheduler_events; make sure the bench scheduler is enabled (bench --site your.site enable-scheduler).

Front end

cd apps/renew_vault/frontend
yarn install
yarn build          # or: yarn dev  for HMR against the site

Testing

Backend (Frappe/unittest) and end-to-end (Playwright, driving the real SPA):

bench --site your.site run-tests --app renew_vault    # backend suite
npx playwright test                                   # e2e suite

E2E specs live in e2e/tests/ with shared auth/seeding helpers in e2e/helpers/; auth + CSRF are handled once by auth.setup.ts. CI runs both on every push (.github/workflows/).

How it was built

RenewVault was built with the tracer-bullet method from The Pragmatic Programmer — five phases, each a thin vertical slice through DocType → controller → API → SPA, tested and browser-verified before the next one started. The specs are checked in:

Phase Spec
1 — Tracer bullet: Tracked Item, computed status, SPA list specs/01_tracer_bullet_tracked_item.md
2 — Full item + masters + CRUD UI specs/02_full_item_masters_crud.md
3 — Reminders + escalation (daily job) specs/03_reminders_escalation.md
4 — Renewals + actions + dashboard specs/04_renewals_actions_dashboard.md
5 — RBAC + polish + tests specs/05_rbac_polish_tests.md

PROGRESS.md is the build log: every slice records what changed, what was tested, and what was verified in a real browser. Bug fixes ship with a regression test that was confirmed to fail before the fix.

Contributing

cd apps/renew_vault
pre-commit install

Pre-commit runs ruff, eslint, prettier and pyupgrade. Commits follow Conventional Commits.

Author

Joshy Sunny — jkonoor.official@gmail.com Available for Frappe / ERPNext consulting and full-stack development.

License

AGPL-3.0

About

Frappe app for tracking renewals, expiry status, reminders, and audit history.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages