## Summary Completes the automatic sales summary pipeline end-to-end: the `sales-summaries-v2` job now calculates aggregate totals, preserves manual adjustments, and automatically posts balanced journal entries to the ledger. ## What Changed **New Datomic transaction function** (`upsert-sales-summary-ledger`) - Transforms detailed `sales-summary-item`s into aggregated `journal-entry` lines grouped by account and ledger side - Handles the full upsert: posts a new journal entry for summaries with mapped accounts, or retracts the orphaned entry if items no longer qualify **Enhanced `sales-summaries-v2` job** - Calculates and stores 13 aggregate total attributes (card/cash/food-app/gift-card payments, refunds, fees, discounts, tax, tip, returns, unknown, net) - Preserves manual items (`manual? true`) during recalculation — only auto-calculated items are replaced **Ledger reconciliation** - `reconcile-ledger` now queries for sales summaries missing journal entries and repairs them via `:upsert-sales-summary-ledger`, alongside existing invoice and transaction repairs **Schema** - Added 13 `total-*` attributes on `sales-summary` (all `db.type/double`, no history) - Registered the new transaction function in `tx.clj` and `datomic.clj` **Admin UI cleanup** - Resolved "clientize" and HTMX `client-id` TODOs in the sales summaries admin page - `new-summary-item` now correctly passes `client-id` via `hx-vals` - Removed stale TODO comments and placeholder code ## Files Changed (8) | File | Purpose | |------|---------| | `iol_ion/.../upsert_sales_summary_ledger.clj` | New Datomic tx function | | `iol_ion/.../tx.clj` | Register new tx function | | `resources/schema.edn` | 13 new `total-*` attributes | | `src/.../datomic.clj` | Load new tx namespace | | `src/.../jobs/sales_summaries.clj` | Aggregate totals + manual item preservation | | `src/.../ledger.clj` | Sales summary repair in `reconcile-ledger` | | `src/.../ssr/admin/sales_summaries.clj` | UI TODO cleanup | | `docs/plans/...plan.md` | Implementation plan document | Co-authored-by: Bryce <bryce@integreatconsult.com> Reviewed-on: #5 Co-authored-by: Bryce <bryce@brycecovertoperations.com> Co-committed-by: Bryce <bryce@brycecovertoperations.com>
109 lines
7.3 KiB
Clojure
109 lines
7.3 KiB
Clojure
(ns auto-ap.ssr.core
|
|
(:require [auto-ap.permissions :refer [wrap-must]]
|
|
[auto-ap.routes.ezcater-xls :as ezcater-xls]
|
|
[auto-ap.routes.utils
|
|
:refer [wrap-admin wrap-client-redirect-unauthenticated wrap-secure]]
|
|
[auto-ap.ssr.account :as account]
|
|
[auto-ap.ssr.admin :as admin]
|
|
[auto-ap.ssr.not-found :as not-found]
|
|
[auto-ap.ssr.admin.accounts :as admin-accounts]
|
|
[auto-ap.ssr.admin.background-jobs :as admin-jobs]
|
|
[auto-ap.ssr.admin.clients :as admin-clients]
|
|
[auto-ap.ssr.admin.excel-invoice :as admin-excel-invoices]
|
|
[auto-ap.ssr.admin.history :as history]
|
|
[auto-ap.ssr.admin.import-batch :as import-batch]
|
|
[auto-ap.ssr.pos.sales-summaries :as pos-sales-summaries]
|
|
[auto-ap.ssr.admin.transaction-rules :as admin-rules]
|
|
[auto-ap.ssr.admin.vendors :as admin-vendors]
|
|
[auto-ap.ssr.auth :as auth]
|
|
[auto-ap.ssr.dashboard :as dashboard]
|
|
[auto-ap.ssr.company :as company]
|
|
[auto-ap.ssr.company-dropdown :as company-dropdown]
|
|
[auto-ap.ssr.company.company-1099 :as company-1099]
|
|
[auto-ap.ssr.company.plaid :as company-plaid]
|
|
[auto-ap.ssr.company.reports :as company-reports]
|
|
[auto-ap.ssr.company.yodlee :as company-yodlee]
|
|
[auto-ap.ssr.indicators :as indicators]
|
|
[auto-ap.ssr.invoice.glimpse :as invoice-glimpse]
|
|
[auto-ap.ssr.invoices :as invoice]
|
|
[auto-ap.ssr.ledger :as l]
|
|
[auto-ap.ssr.outgoing-invoice.new :as oin]
|
|
[auto-ap.ssr.payments :as payments]
|
|
[auto-ap.ssr.pos.cash-drawer-shifts :as pos-cash-drawer-shifts]
|
|
[auto-ap.ssr.pos.expected-deposits :as pos-expected-deposits]
|
|
[auto-ap.ssr.pos.refunds :as pos-refunds]
|
|
[auto-ap.ssr.pos.sales-orders :as pos-sales]
|
|
[auto-ap.ssr.pos.tenders :as pos-tenders]
|
|
[auto-ap.ssr.search :as search]
|
|
[auto-ap.ssr.transaction.insights :as insights]
|
|
[auto-ap.ssr.users :as users]
|
|
[auto-ap.ssr.transaction :as transaction]
|
|
[auto-ap.ssr.vendor :as vendors]
|
|
[ring.middleware.json :refer [wrap-json-response]]))
|
|
|
|
;; from auto-ap.ssr-routes, because they're shared
|
|
|
|
|
|
(def key->handler
|
|
(-> {:logout auth/logout
|
|
:impersonate (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin auth/impersonate)))
|
|
:admin-history (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin history/page)))
|
|
:admin-history-search (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin history/page)))
|
|
:admin-history-inspect (wrap-client-redirect-unauthenticated (wrap-secure (wrap-admin history/inspect)))
|
|
:active-client (wrap-client-redirect-unauthenticated (wrap-secure (wrap-secure company-dropdown/active-client)))
|
|
:company-dropdown-search-results
|
|
(wrap-client-redirect-unauthenticated (wrap-secure (wrap-json-response company-dropdown/dropdown-search-results {})))
|
|
:company-search
|
|
(wrap-client-redirect-unauthenticated (wrap-secure company/search))
|
|
:bank-account-search (wrap-client-redirect-unauthenticated (wrap-secure company/bank-account-search))
|
|
:account-search (wrap-client-redirect-unauthenticated (wrap-secure account/account-search))
|
|
:bank-account-typeahead (wrap-client-redirect-unauthenticated (wrap-secure company/bank-account-typeahead))
|
|
:not-found not-found/page
|
|
|
|
:company (wrap-client-redirect-unauthenticated (wrap-secure company/page))
|
|
:company-update-signature (wrap-client-redirect-unauthenticated (wrap-secure company/upload-signature-data))
|
|
:company-upload-signature (wrap-client-redirect-unauthenticated (wrap-secure company/upload-signature-file))
|
|
:company-yodlee-provider-account-refresh (wrap-client-redirect-unauthenticated (wrap-admin company-yodlee/refresh-provider-account))
|
|
:company-yodlee-provider-account-reauthenticate (wrap-client-redirect-unauthenticated (wrap-secure company-yodlee/reauthenticate))
|
|
:invoice-glimpse (wrap-client-redirect-unauthenticated (wrap-must (wrap-secure invoice-glimpse/page) {:activity :import :subject :invoice}))
|
|
:invoice-glimpse-upload (wrap-client-redirect-unauthenticated (wrap-must (wrap-secure invoice-glimpse/upload) {:activity :import :subject :invoice}))
|
|
:invoice-glimpse-textract-invoice (wrap-client-redirect-unauthenticated (wrap-must (wrap-secure invoice-glimpse/textract-invoice) {:activity :import :subject :invoice}))
|
|
:invoice-glimpse-create-invoice (wrap-client-redirect-unauthenticated (wrap-must (wrap-secure invoice-glimpse/create-invoice) {:activity :import :subject :invoice}))
|
|
:invoice-glimpse-update-textract-invoice (wrap-client-redirect-unauthenticated (wrap-must (wrap-secure invoice-glimpse/update-textract-invoice) {:activity :import :subject :invoice}))
|
|
:vendor-search (wrap-client-redirect-unauthenticated (wrap-secure vendors/search))
|
|
:transaction-insights (wrap-client-redirect-unauthenticated (wrap-admin insights/page))
|
|
:transaction-insight-table (wrap-client-redirect-unauthenticated (wrap-admin insights/insight-table))
|
|
:transaction-insight-rows (wrap-client-redirect-unauthenticated (wrap-admin insights/transaction-rows))
|
|
:transaction-insight-code (wrap-client-redirect-unauthenticated (wrap-admin insights/code))
|
|
:transaction-insight-disapprove (wrap-client-redirect-unauthenticated (wrap-admin insights/disapprove))
|
|
:transaction-insight-explain (wrap-client-redirect-unauthenticated (wrap-admin insights/explain))
|
|
:admin-ezcater-xls (wrap-client-redirect-unauthenticated (wrap-admin ezcater-xls/page))
|
|
:search (wrap-client-redirect-unauthenticated (wrap-secure search/dialog-contents))}
|
|
(into company-plaid/key->handler)
|
|
(into company-reports/key->handler)
|
|
(into company-yodlee/key->handler)
|
|
(into company-1099/key->handler)
|
|
(into invoice/key->handler)
|
|
(into import-batch/key->handler)
|
|
(into pos-sales/key->handler)
|
|
(into pos-expected-deposits/key->handler)
|
|
(into pos-tenders/key->handler)
|
|
(into pos-cash-drawer-shifts/key->handler)
|
|
(into pos-refunds/key->handler)
|
|
(into pos-sales-summaries/key->handler)
|
|
(into users/key->handler)
|
|
(into admin-accounts/key->handler)
|
|
(into admin-excel-invoices/key->handler)
|
|
(into admin/key->handler)
|
|
(into admin-jobs/key->handler)
|
|
(into admin-vendors/key->handler)
|
|
(into admin-clients/key->handler)
|
|
(into admin-rules/key->handler)
|
|
(into transaction/key->handler)
|
|
(into dashboard/key->handler)
|
|
(into indicators/key->handler)
|
|
(into payments/key->handler)
|
|
(into oin/route->handler)
|
|
(into l/key->handler)))
|
|
|