From 1497549d6415efb3242c2e320a2f0dda1ae91db9 Mon Sep 17 00:00:00 2001 From: Bryce Covert Date: Mon, 20 Mar 2023 15:59:57 -0700 Subject: [PATCH] All tests pass again. --- resources/schema.edn | 2043 +++++++++++++++++ src/clj/auto_ap/graphql/accounts.clj | 27 +- src/clj/auto_ap/search.clj | 12 +- .../auto_ap/integration/graphql/accounts.clj | 26 +- test/clj/auto_ap/integration/util.clj | 21 +- test/clj/auto_ap/routes/invoice_test.clj | 10 +- 6 files changed, 2092 insertions(+), 47 deletions(-) create mode 100644 resources/schema.edn diff --git a/resources/schema.edn b/resources/schema.edn new file mode 100644 index 00000000..56dc11f6 --- /dev/null +++ b/resources/schema.edn @@ -0,0 +1,2043 @@ +[{:db/doc + "Data function that increments value of attribute a by amount.", + :db/ident :pay, + } + {:db/doc + "Data function that increments value of attribute a by amount.", + :db/ident :inc, + } + {:db/doc "Deletes the general ledger entries for an entity", + :db/ident :replace-general-ledger, + } + {:db/doc "Adds an invoice if it's not found", + :db/ident :propose-invoice, + } + {:db/doc "Resets a relationship to the values specified ", + :db/ident :reset, + } + + + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The code for the expense account (e.g., A1123)", + :db/ident :account/code, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The numeric-only for the expense account (e.g., 5150)", + :db/ident :account/numeric-code, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The name of the code (e.g., \"Telephone - HQ\")", + :db/ident :account/name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A forced location for this code, e.g., HQ.", + :db/ident :account/location, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc + "The set of accounts this entry belongs to. Allows customization.", + :db/ident :account/account-set, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc + "The type of account, (e.g., :account-type/expense :account-type/liability)", + :db/ident :account/type, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc ":global, :optional :customized", + :db/ident :account/applicability, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Customizations per customer", + :db/ident :account/client-overrides, + } + {:db/ident :account/accounts-payable, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "a name search for accounts", + :db/ident :account/search-terms, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Whether this account can be used for invoices", + :db/ident :account/invoice-allowance, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Whether this account can be used for vendors", + :db/ident :account/vendor-allowance, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Whether this account can be used generally", + :db/ident :account/default-allowance, + } + {:db/ident :account/ccp, } + {:db/ident :account/receipts-split, + } + + {:db/doc "This account is optional", + :db/ident :account-applicability/optional, + } + {:db/doc "The account applies to all cutsomers", + :db/ident :account-applicability/global, + } + {:db/doc "This account is customized per-customer", + :db/ident :account-applicability/customized, + } + + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The client for the override", + :db/ident :account-client-override/client, + } + {:db/valueType #:db{:ident :db.type/boolean}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Does this apply?", + :db/ident :account-client-override/enabled, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "client override", + :db/ident :account-client-override/name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "a name search for accounts", + :db/ident :account-client-override/search-terms, + } + + {:db/ident :account-type/dividend, + } + {:db/ident :account-type/asset, } + {:db/ident :account-type/equity, } + {:db/ident :account-type/expense, + } + {:db/ident :account-type/liability, + } + {:db/ident :account-type/revenue, + } + + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "123 main st", + :db/ident :address/street1, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Apt A", + :db/ident :address/street2, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Campbell", + :db/ident :address/city, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "CA", + :db/ident :address/state, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "95014", + :db/ident :address/zip, + } + + {:db/doc "Only admins can use it", + :db/ident :allowance/admin-only, + } + {:db/doc "Allowed to be used", + :db/ident :allowance/allowed, + } + {:db/doc "Warn on usage", + :db/ident :allowance/warn, + } + {:db/doc "Denied usage", + :db/ident :allowance/denied, + } + + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which user commited this transaction", + :db/ident :audit/user, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which batch was this part of", + :db/ident :audit/batch, + } + + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Identifier for bank account", + :db/ident :bank-account/external-id, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "matching the orignal tuple of [company,bank]", + :db/ident :bank-account/original-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A1127 Chase Card", + :db/ident :bank-account/name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "e.g. Bank of America", + :db/ident :bank-account/bank-name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The code to list under the bank's name", + :db/ident :bank-account/bank-code, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The bank's routing number", + :db/ident :bank-account/routing, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The account number", + :db/ident :bank-account/number, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent false, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc + "The type of account number, either :bank-account-type/check or :bank-account-type/cash", + :db/ident :bank-account/type, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "yodlee's account identifier", + :db/ident :bank-account/yodlee-account-id, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Current check number", + :db/ident :bank-account/check-number, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A bank account's computer-friendly name", + :db/ident :bank-account/code, + } + {:db/valueType #:db{:ident :db.type/boolean}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Whether this bank account is visible", + :db/ident :bank-account/visible, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The sort order of the bank account", + :db/ident :bank-account/sort-order, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Which bank accounts this bank account is valid for", + :db/ident :bank-account/locations, + } + {:db/valueType #:db{:ident :db.type/boolean}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc + "Whether to include this bank account in balance sheet, etc.", + :db/ident :bank-account/include-in-reports, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc + "Setting this date prevents older transactions from being imported", + :db/ident :bank-account/start-date, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Yodlee account for the bank account", + :db/ident :bank-account/yodlee-account, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/noHistory true, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A precomputed balance for the account", + :db/ident :bank-account/current-balance, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The numeric code for the balance sheet", + :db/ident :bank-account/numeric-code, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "intuit external bank account", + :db/ident :bank-account/intuit-bank-account, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Yodlee account for the bank account", + :db/ident :bank-account/plaid-account, + } + {:db/valueType #:db{:ident :db.type/boolean}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Yodlee amex works weird", + :db/ident :bank-account/use-date-instead-of-post-date?, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A status for integration for the bank account", + :db/ident :bank-account/integration-status, + } + + {:db/ident :bank-account-type/check, + } + {:db/ident :bank-account-type/cash, + } + {:db/ident :bank-account-type/credit, + } + + {:db/doc "square processor", + :db/ident :ccp-processor/square, + } + {:db/doc "ezcater processor", + :db/ident :ccp-processor/ezcater, + } + {:db/doc "koala processor", + :db/ident :ccp-processor/koala, + } + {:db/doc "Doordash identifier", + :db/ident :ccp-processor/doordash, + } + {:db/doc "Grubhub identifier", + :db/ident :ccp-processor/grubhub, + } + {:db/doc "Uber eats processor", + :db/ident :ccp-processor/uber-eats, + } + {:db/doc "No specific ccp processor", + :db/ident :ccp-processor/na, + } + + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The type of the charge", + :db/ident :charge/type-name, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The total amount on the charge", + :db/ident :charge/total, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The tax on the charge", + :db/ident :charge/tax, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The tip on the charge", + :db/ident :charge/tip, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which food app processed this order", + :db/ident :charge/processor, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The client for the sale", + :db/ident :charge/external-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A custom note", + :db/ident :charge/note, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The date for the payment", + :db/ident :charge/date, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The client for the sale", + :db/ident :charge/client, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The location of the sale", + :db/ident :charge/location, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A link someone can go to to look at the charge", + :db/ident :charge/reference-link, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Original id from the old system", + :db/ident :client/original-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A client's human-friendly name", + :db/ident :client/name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "hello@example.com", + :db/ident :client/email, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A client's computer-friendly name", + :db/ident :client/code, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A check signature image", + :db/ident :client/signature-file, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "A client's locations", + :db/ident :client/locations, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Address of the client", + :db/ident :client/address, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Bank accounts for the client", + :db/ident :client/bank-accounts, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "The strings that match the client", + :db/ident :client/matches, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "The mapping from string to location", + :db/ident :client/location-matches, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The default location if one can't be found", + :db/ident :client/default-location, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How much money gets debited each week", + :db/ident :client/weekly-debits, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How much money gets credited each week", + :db/ident :client/weekly-credits, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Regular, planned transactions", + :db/ident :client/forecasted-transactions, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How much money gets debited each week", + :db/ident :client/week-a-debits, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How much money gets credited each week", + :db/ident :client/week-a-credits, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How much money gets debited each week", + :db/ident :client/week-b-debits, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How much money gets credited each week", + :db/ident :client/week-b-credits, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "No new data before this date can be added/changed", + :db/ident :client/locked-until, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "collection of email contacts", + :db/ident :client/emails, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A token that can be used to authenticate with square", + :db/ident :client/square-auth-token, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Locations in square", + :db/ident :client/square-locations, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Square's integration status", + :db/ident :client/square-integration-status, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/ident :client/ezcater-locations, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/ident :client/feature-flags, + } + + {:db/doc "Ensures each norm tx is executed exactly once", + :db/ident :conformity/ensure-norm-tx, + } + {:db/valueType #:db{:ident :db.type/keyword}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Name of this transaction's norm", + :db/ident :conformity/conformed-norms, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Index of this transaction within its norm", + :db/ident :conformity/conformed-norms-index, + } + + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "John Smith", + :db/ident :contact/name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "4255773578", + :db/ident :contact/phone, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "hello@example.com", + :db/ident :contact/email, + } + + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Email contact's email", + :db/ident :email-contact/email, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Manager, Owner, etc", + :db/ident :email-contact/description, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The external id for the deposit", + :db/ident :expected-deposit/external-id, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The client for the deposit", + :db/ident :expected-deposit/client, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The location of the sale", + :db/ident :expected-deposit/location, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The date the deposit was initiated", + :db/ident :expected-deposit/date, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The total amount on the deposit", + :db/ident :expected-deposit/total, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The total fee on the deposit", + :db/ident :expected-deposit/fee, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The date of sales the deposit was for", + :db/ident :expected-deposit/sales-date, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Whether the deposit has been cleared", + :db/ident :expected-deposit/status, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which vendor is this deposit for? CCP Square?", + :db/ident :expected-deposit/vendor, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "charges for the deposit", + :db/ident :expected-deposit/charges, + } + + {:db/ident :expected-deposit-status/pending, + } + {:db/ident :expected-deposit-status/cleared, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Id of the caterer", + :db/ident :ezcater-caterer/uuid, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Name of the caterer", + :db/ident :ezcater-caterer/name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "a name search for caterer", + :db/ident :ezcater-caterer/search-terms, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The subscriber uuid", + :db/ident :ezcater-integration/subscriber-uuid, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The API key that can be used for requests", + :db/ident :ezcater-integration/api-key, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Used to validate events", + :db/ident :ezcater-integration/subscriber-secret, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The status for this integration", + :db/ident :ezcater-integration/integration-status, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "All caterers for this integration", + :db/ident :ezcater-integration/caterers, + } + + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/ident :ezcater-location/location, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/ident :ezcater-location/caterer, + } + + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Amount of a forcested transaction", + :db/ident :forecasted-transaction/amount, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which day the transaction occurs", + :db/ident :forecasted-transaction/day-of-month, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "An identifier for this forcasted transaction, e.g., 'RENT'", + :db/ident :forecasted-transaction/identifier, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "An identifier for the import batch", + :db/ident :import-batch/external-id, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Links to everything that was imported", + :db/ident :import-batch/entry, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How many entries were imported", + :db/ident :import-batch/imported, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How many entries were already present", + :db/ident :import-batch/extant, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How many entries were explicitly ignored", + :db/ident :import-batch/suppressed, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The date the import occurred", + :db/ident :import-batch/date, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "What system triggered the import", + :db/ident :import-batch/source, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "What system triggered the import", + :db/ident :import-batch/status, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Who triggred this import", + :db/ident :import-batch/user-name, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How many entries were an error ", + :db/ident :import-batch/error, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How many entries were before a start date ", + :db/ident :import-batch/not-ready, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "error message for a failed job", + :db/ident :import-batch/error-message, + } + + {:db/ident :import-source/plaid, } + {:db/ident :import-source/yodlee2, + } + {:db/ident :import-source/yodlee, + } + {:db/ident :import-source/manual, + } + {:db/ident :import-source/intuit, + } + + {:db/ident :import-status/pending, + } + {:db/ident :import-status/imported, + } + {:db/ident :import-status/completed, + } + {:db/ident :import-status/started, + } + + {:db/ident :integration-state/failed, + } + {:db/ident :integration-state/success, + } + {:db/ident :integration-state/unauthorized, + } + + {:db/valueType #:db{:ident :db.type/instant}, + :db/noHistory true, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "When was this integration updated", + :db/ident :integration-status/last-updated, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/noHistory true, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "When was this integration attempted.", + :db/ident :integration-status/last-attempt, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A status for the integration", + :db/ident :integration-status/state, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A message from the last attempt", + :db/ident :integration-status/message, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Id of the intui bank", + :db/ident :intuit-bank-account/external-id, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Name of intuit bank", + :db/ident :intuit-bank-account/name, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Original id in old system", + :db/ident :invoice/original-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A vendor-specified number for the invoice", + :db/ident :invoice/invoice-number, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "An identifier found to suggest the customer", + :db/ident :invoice/customer-identifier, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Status of payment/import of the invoice [:paid, :unpaid]", + :db/ident :invoice/status, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which client this invoice is for", + :db/ident :invoice/client, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which vendor this invoice is for", + :db/ident :invoice/vendor, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Date for this invoice", + :db/ident :invoice/date, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Total $ for this invoice", + :db/ident :invoice/total, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The unpaid balance of this invoice", + :db/ident :invoice/outstanding-balance, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc + "The default location that expense-accounts will be created with for this invoice", + :db/ident :invoice/default-location, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The default expense account for this invoice", + :db/ident :invoice/default-expense-account, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "The expense account categories for this invoice", + :db/ident :invoice/expense-accounts, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The status of importing the transaction", + :db/ident :invoice/import-status, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "An identifier found in an uploaded invoice", + :db/ident :invoice/client-identifier, + } + {:db/valueType #:db{:ident :db.type/boolean}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Whether to exclude from the ledger", + :db/ident :invoice/exclude-from-ledger, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "When you gotta pay", + :db/ident :invoice/due, + } + {:db/valueType #:db{:ident :db.type/boolean}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc + "Whether this invoice should be marked as paid when it's due", + :db/ident :invoice/automatically-paid-when-due, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "When an invoice gets marked as paid", + :db/ident :invoice/scheduled-payment, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "An s3 location for the invoice", + :db/ident :invoice/source-url, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The location to code the invoice as", + :db/ident :invoice/location, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How close an invoice matches its import", + :db/ident :invoice/similarity, + } + {:db/valueType #:db{:ident :db.type/boolean}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Can only admins see this invoice?", + :db/ident :invoice/source-url-admin-only, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Original id in old system", + :db/ident :invoice-expense-account/original-id, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The code for the expense account", + :db/ident :invoice-expense-account/expense-account-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Location for this expense account", + :db/ident :invoice-expense-account/location, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The amount that this contributes to", + :db/ident :invoice-expense-account/amount, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The account entity that this expense is for", + :db/ident :invoice-expense-account/account, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The id in the old system", + :db/ident :invoice-payment/original-id, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The amount that was paid to this invoice", + :db/ident :invoice-payment/amount, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The invoice for this payment", + :db/ident :invoice-payment/invoice, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The total payment for this payment", + :db/ident :invoice-payment/payment, + } + + {:db/ident :invoice-status/paid, } + {:db/ident :invoice-status/unpaid, + } + {:db/ident :invoice-status/voided, + } + + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The type of entity that created this entry", + :db/ident :journal-entry/source, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The client for the ledger", + :db/ident :journal-entry/client, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The time for this entry", + :db/ident :journal-entry/date, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The thing that created this entry", + :db/ident :journal-entry/original-entity, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The vendor for the ledger entry", + :db/ident :journal-entry/vendor, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The amount for the entry", + :db/ident :journal-entry/amount, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Each of the line items in the general ledger", + :db/ident :journal-entry/line-items, + } + {:db/valueType #:db{:ident :db.type/boolean}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Has this cleared?", + :db/ident :journal-entry/cleared, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Cleared against", + :db/ident :journal-entry/cleared-against, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "notes about this journal-entry", + :db/ident :journal-entry/note, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "For externally imported id", + :db/ident :journal-entry/external-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The description if there is no vendor", + :db/ident :journal-entry/alternate-description, + } + + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The expense account being changed", + :db/ident :journal-entry-line/expense-account, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The other type of account being changed", + :db/ident :journal-entry-line/account, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The amount to debit", + :db/ident :journal-entry-line/debit, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The amount to credit", + :db/ident :journal-entry-line/credit, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Location of the entry", + :db/ident :journal-entry-line/location, + } + + {:db/ident :legal-entity-1099-type/none, + } + {:db/ident :legal-entity-1099-type/landlord, + } + {:db/ident :legal-entity-1099-type/misc, + } + + {:db/ident :legal-entity-tin-type/ssn, + } + {:db/ident :legal-entity-tin-type/ein, + } + + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "The strings that match the location", + :db/ident :location-match/matches, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The location of the location match", + :db/ident :location-match/location, + } + + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The type of the item", + :db/ident :order-line-item/item-name, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The total cost on the item", + :db/ident :order-line-item/total, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The tax on the item", + :db/ident :order-line-item/tax, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The tip on the item", + :db/ident :order-line-item/tip, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The item category", + :db/ident :order-line-item/category, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The total cost on the item", + :db/ident :order-line-item/discount, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "An Id that links to square etc", + :db/ident :order-line-item/external-id, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The id in the old system", + :db/ident :payment/original-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The uuid that matches the key for this check", + :db/ident :payment/s3-uuid, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The s3 key with pdf of this check", + :db/ident :payment/s3-key, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The s3 url with pdf of this check", + :db/ident :payment/s3-url, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The check number", + :db/ident :payment/check-number, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The check's memo line", + :db/ident :payment/memo, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The date the payment was made", + :db/ident :payment/date, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The amount that was paid to the vendor", + :db/ident :payment/amount, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Who the paid was made out to", + :db/ident :payment/paid-to, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The status of the payment [:pending :cleared :voided]", + :db/ident :payment/status, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The type of the payment [:cash :check :debit]", + :db/ident :payment/type, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "raw data used to generate check pdf", + :db/ident :payment/pdf-data, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The vendor for which this payment was for", + :db/ident :payment/vendor, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The client for which this payment", + :db/ident :payment/client, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The bank account that was used to pay", + :db/ident :payment/bank-account, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Any invoices this payment is related to", + :db/ident :payment/invoices, + } + + {:db/ident :payment-status/pending, + } + {:db/ident :payment-status/voided, + } + {:db/ident :payment-status/cleared, + } + + {:db/ident :payment-type/cash, } + {:db/ident :payment-type/check, } + {:db/ident :payment-type/debit, } + {:db/doc "Used for paying invoices from statement credits.", + :db/ident :payment-type/balance-credit, + } + {:db/doc "Credit for negative invoices", + :db/ident :payment-type/credit, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "plaid account id", + :db/ident :plaid-account/external-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "account name", + :db/ident :plaid-account/name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "account number", + :db/ident :plaid-account/number, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Available Balance", + :db/ident :plaid-account/balance, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Plaid Item ID", + :db/ident :plaid-item/external-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Used to authenticate to plaid", + :db/ident :plaid-item/access-token, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which client the plaid item is for", + :db/ident :plaid-item/client, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Individual bank accounts", + :db/ident :plaid-item/accounts, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Current status", + :db/ident :plaid-item/status, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/noHistory true, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Last updated date", + :db/ident :plaid-item/last-updated, + } + + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Which client(s) this is for", + :db/ident :report/client, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A description for the report", + :db/ident :report/name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The s3 key for the report", + :db/ident :report/key, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "When this report was created", + :db/ident :report/created, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Where to download the report", + :db/ident :report/url, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Creator of the report's name", + :db/ident :report/creator, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The client for the sale", + :db/ident :sales-order/external-id, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The client for the sale", + :db/ident :sales-order/client, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The location of the sale", + :db/ident :sales-order/location, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The date the order was placed", + :db/ident :sales-order/date, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The total amount on the sale", + :db/ident :sales-order/total, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The tax on the sale", + :db/ident :sales-order/tax, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The tip on the sale", + :db/ident :sales-order/tip, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "How the sale was paid", + :db/ident :sales-order/charges, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "What the person ordered", + :db/ident :sales-order/line-items, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The total amount on the sale", + :db/ident :sales-order/discount, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The returned amount on the sale", + :db/ident :sales-order/returns, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The total cost on the item", + :db/ident :sales-order/service-charge, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which vendor is this sales-order for? CCP Square?", + :db/ident :sales-order/vendor, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Where the POS says the order is from", + :db/ident :sales-order/source, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A link someone can go to to look at the order", + :db/ident :sales-order/reference-link, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The external id for the refund", + :db/ident :sales-refund/external-id, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The client for the refund", + :db/ident :sales-refund/client, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The location of the refund", + :db/ident :sales-refund/location, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The date the refund was initiated", + :db/ident :sales-refund/date, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The total amount on the deposit", + :db/ident :sales-refund/total, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The total fee on the refund", + :db/ident :sales-refund/fee, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The type of refund (CASH CARD etc)", + :db/ident :sales-refund/type, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which vendor is this refund for? CCP Square?", + :db/ident :sales-refund/vendor, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The ID that is used for fetching data", + :db/ident :saved-query/guid, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The client for the saved query", + :db/ident :saved-query/client, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The key for the query text in s3", + :db/ident :saved-query/key, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A descriptor for the query for the user interface", + :db/ident :saved-query/description, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A unique key for looking up queries", + :db/ident :saved-query/lookup-key, + } + + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "An id for a location in square", + :db/ident :square-location/square-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Name of the location in square e.g. Woodland Hills", + :db/ident :square-location/name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc + "The client location that this location should match to. e.g. WH", + :db/ident :square-location/client-location, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The id in the old system", + :db/ident :transaction/original-id, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The amount of the transaction", + :db/ident :transaction/amount, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "full description of the transaction", + :db/ident :transaction/description-original, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "short description of the transaction", + :db/ident :transaction/description-simple, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "a yodlee id for the merchant", + :db/ident :transaction/merchant-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "a name for the merchant", + :db/ident :transaction/merchant-name, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A key to match against", + :db/ident :transaction/id, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Date that the transaction showed up", + :db/ident :transaction/date, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Date that the transaction posted", + :db/ident :transaction/post-date, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Yodlee description of the transaction", + :db/ident :transaction/type, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Yodlee status of the transaction", + :db/ident :transaction/status, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Yodlee account id", + :db/ident :transaction/account-id, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The check number that was parsed from the description", + :db/ident :transaction/check-number, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Vendor for who we think this transaction is from", + :db/ident :transaction/vendor, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Client for who we think this transaction is for", + :db/ident :transaction/client, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The bank accout used for this transaction", + :db/ident :transaction/bank-account, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The payment that this transaction matched to", + :db/ident :transaction/payment, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "The debit(s)/credit(s) for this transaction", + :db/ident :transaction/accounts, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Location of the transaction's target", + :db/ident :transaction/location, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The yodlee merchant", + :db/ident :transaction/yodlee-merchant, + } + {:db/valueType #:db{:ident :db.type/boolean}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Whether to exclude from the ledger", + :db/ident :transaction/exclude-from-ledger, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Status of a transaction", + :db/ident :transaction/approval-status, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The rule that this transaction matched", + :db/ident :transaction/matched-rule, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "which entitiy it was cleared against", + :db/ident :transaction/cleared-against, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which forecast this transaction matches, for cashflow", + :db/ident :transaction/forecast-match, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc + "If this transaction is a deposit, the deposit that we anticipated", + :db/ident :transaction/expected-deposit, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "An unhashed version of the id", + :db/ident :transaction/raw-id, + } + + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which account to debit/credit for this transaction", + :db/ident :transaction-account/account, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Location for this expense account", + :db/ident :transaction-account/location, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How much to debit/credit - must be positive", + :db/ident :transaction-account/amount, + } + + {:db/ident :transaction-approval-status/approved, + } + {:db/ident :transaction-approval-status/unapproved, + } + {:db/ident :transaction-approval-status/requires-feedback, + } + {:db/ident :transaction-approval-status/excluded, + } + {:db/ident :transaction-approval-status/suppressed, + } + + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The specific client this rule is for", + :db/ident :transaction-rule/client, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The specific bank account this rule is for", + :db/ident :transaction-rule/bank-account, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Apply this rule if the yodlee merchant matches", + :db/ident :transaction-rule/yodlee-merchant, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A description to match this rule against", + :db/ident :transaction-rule/description, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A friendly description for this rule (internal)", + :db/ident :transaction-rule/note, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Amount has to be less than or equal to this", + :db/ident :transaction-rule/amount-lte, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Amount has to be greater than or equal to this", + :db/ident :transaction-rule/amount-gte, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Day of month has to be less than or equal to this", + :db/ident :transaction-rule/dom-lte, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Day of month has to be greater than or equal to this", + :db/ident :transaction-rule/dom-gte, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The vendor to assign", + :db/ident :transaction-rule/vendor, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "The outcome split", + :db/ident :transaction-rule/accounts, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Status of a transaction", + :db/ident :transaction-rule/transaction-approval-status, + } + + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How much should go to this account", + :db/ident :transaction-rule-account/percentage, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The location this split is for", + :db/ident :transaction-rule-account/location, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The account of this split", + :db/ident :transaction-rule-account/account, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The id in the old system", + :db/ident :user/original-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Provider for oauth for the user", + :db/ident :user/provider, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "the id from the provider", + :db/ident :user/provider-id, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The role [:user :admin :none]", + :db/ident :user/role, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "name of the user", + :db/ident :user/name, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "The clients this user can view", + :db/ident :user/clients, + } + + {:db/ident :user-role/manager, } + {:db/ident :user-role/admin, } + {:db/ident :user-role/user, } + {:db/ident :user-role/none, } + {:db/ident :user-role/power-user, + } + + {:db/ident :vendor/ccp-square, } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Original id from the old system", + :db/ident :vendor/original-id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A vendor's human-friendly name", + :db/ident :vendor/name, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A vendor's computer-friendly name", + :db/ident :vendor/code, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc + "Set if you want to override how this vendor's name is printed on checks", + :db/ident :vendor/print-as, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A vendor's email address", + :db/ident :vendor/email, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "A vendor's phone number", + :db/ident :vendor/phone, + } + {:db/valueType #:db{:ident :db.type/keyword}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How often to email this vendor about invoices", + :db/ident :vendor/invoice-reminder-schedule, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The vendor's default expense account", + :db/ident :vendor/default-expense-account, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The vendor's primary contact", + :db/ident :vendor/primary-contact, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The vendor's secondary contact", + :db/ident :vendor/secondary-contact, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The vendor's address", + :db/ident :vendor/address, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The account will be used when a bill is created.", + :db/ident :vendor/default-account, + } + {:db/valueType #:db{:ident :db.type/boolean}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Whether or not to exclude the vendor", + :db/ident :vendor/hidden, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Overrides per-client", + :db/ident :vendor/terms-overrides, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Overrides per-client", + :db/ident :vendor/account-overrides, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How many days till you pay", + :db/ident :vendor/terms, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "The clients for which invoices will automatically be paid.", + :db/ident :vendor/automatically-paid-when-due, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "When an invoice gets marked as paid", + :db/ident :vendor/schedule-payment-dom, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The first name for the legal entity", + :db/ident :vendor/legal-entity-first-name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The first name for the legal entity", + :db/ident :vendor/legal-entity-middle-name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The first name for the legal entity", + :db/ident :vendor/legal-entity-last-name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The ssn or ein for the legal entity", + :db/ident :vendor/legal-entity-tin, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The ssn or ein for the legal entity", + :db/ident :vendor/legal-entity-tin-type, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The ssn or ein for the legal entity", + :db/ident :vendor/legal-entity-1099-type, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "a name search for vendors", + :db/ident :vendor/search-terms, + } + {:db/ident :vendor/ccp-ezcater, } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "If not a person, the legal entity naame", + :db/ident :vendor/legal-entity-name, + } + + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "the account for invoices", + :db/ident :vendor-account-override/account, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How many days till you pay", + :db/ident :vendor-account-override/client, + } + + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which client the override is for", + :db/ident :vendor-schedule-payment-dom/client, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "What day of the month", + :db/ident :vendor-schedule-payment-dom/dom, + } + + {:db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How many days till you pay", + :db/ident :vendor-terms-override/terms, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How many days till you pay", + :db/ident :vendor-terms-override/client, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc + "A key to find this by, normally vendor (db:/id)-client(:db/id)", + :db/ident :vendor-usage/key, + } + + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which vendor this usage is for", + :db/ident :vendor-usage/vendor, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which client this usage is for", + :db/ident :vendor-usage/client, + } + {:db/valueType #:db{:ident :db.type/long}, + :db/noHistory true, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "How many times does this client use this vendor", + :db/ident :vendor-usage/count, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Yodlee account id", + :db/ident :yodlee-account/id, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "account name", + :db/ident :yodlee-account/name, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "account number", + :db/ident :yodlee-account/number, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Current status", + :db/ident :yodlee-account/status, + } + {:db/valueType #:db{:ident :db.type/double}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Available Balance", + :db/ident :yodlee-account/available-balance, + } + + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The yodlee merchant name", + :db/ident :yodlee-merchant/name, + } + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "The yodlee merchant id", + :db/ident :yodlee-merchant/yodlee-id, + } + + {:db/unique #:db{:ident :db.unique/identity}, + :db/valueType #:db{:ident :db.type/long}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Yodlee Provider ACcount Id", + :db/ident :yodlee-provider-account/id, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Which client the provider account is for", + :db/ident :yodlee-provider-account/client, + } + {:db/valueType #:db{:ident :db.type/ref}, + :db/isComponent true, + :db/cardinality #:db{:ident :db.cardinality/many}, + :db/doc "Individual bank accounts", + :db/ident :yodlee-provider-account/accounts, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Current status", + :db/ident :yodlee-provider-account/status, + } + {:db/valueType #:db{:ident :db.type/string}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Current status (detail)", + :db/ident :yodlee-provider-account/detailed-status, + } + {:db/valueType #:db{:ident :db.type/instant}, + :db/cardinality #:db{:ident :db.cardinality/one}, + :db/doc "Last updated date", + :db/ident :yodlee-provider-account/last-updated, + }] diff --git a/src/clj/auto_ap/graphql/accounts.clj b/src/clj/auto_ap/graphql/accounts.clj index 93dec0ce..71178aa4 100644 --- a/src/clj/auto_ap/graphql/accounts.clj +++ b/src/clj/auto_ap/graphql/accounts.clj @@ -129,28 +129,18 @@ allowance search-pattern) (sequence xform)) - (->> (dc/q '[:find ?n (pull ?i pattern) ?s - :in $ ?q ?allowance pattern - :where [(fulltext $ :account/search-terms ?q) [[?i ?n _ ?s]]] - [?i :account/numeric-code ?numeric-code] - (or [?i :account/applicability :account-applicability/global] - [?i :account/applicability :account-applicability/optional])] + (->> (dc/q '[:find ?n (pull ?i pattern) ?s + :in $ [[?i ?n ?s]] pattern + :where (or [?i :account/applicability :account-applicability/global] + [?i :account/applicability :account-applicability/optional])] (dc/db conn) - query - allowance + (search/search {:q query} "account") search-pattern) (concat (when client - (dc/q '[:find ?n (pull ?a pattern) ?s - :in $ ?c ?q ?allowance pattern - :where - [?i :account-client-override/client ?c] - [(fulltext $ :account-client-override/search-terms ?q) [[?i ?n _ ?s]]] - [?a :account/client-overrides ?i] - [?a :account/numeric-code ?numeric-code]] + (dc/q '[:find ?n (pull ?i pattern) ?s + :in $ [[?i ?n ?s]] pattern] (dc/db conn) - client - query - allowance + (search/search {:q query :client (str client)} "account-client-override") search-pattern))) (sort-by (comp - last)) (sequence xform))) @@ -166,6 +156,7 @@ (dc/db conn))) :when (:account/numeric-code (:account/_client-overrides result))] {:id (:db/id (:account/_client-overrides result)) + :account-client-override-id (:db/id result) :text (:account-client-override/search-terms result) :client (str (:db/id (:account-client-override/client result))) :numeric-code (:account/numeric-code (:account/_client-overrides result)) diff --git a/src/clj/auto_ap/search.clj b/src/clj/auto_ap/search.clj index 417e6147..50f69a70 100644 --- a/src/clj/auto_ap/search.clj +++ b/src/clj/auto_ap/search.clj @@ -1,4 +1,5 @@ (ns auto-ap.search + (:require [config.core :refer [env]]) (:import (java.nio.file Paths) (org.apache.lucene.analysis.standard StandardAnalyzer) @@ -9,7 +10,7 @@ (org.apache.lucene.store FSDirectory))) (defn full-index-query [results index-name] - (let [directory (FSDirectory/open (Paths/get (java.net.URI. (str "file:///tmp/" index-name)))) + (let [directory (FSDirectory/open (Paths/get (java.net.URI. (str "file:///tmp/search" (:dd-env env) "/" index-name)))) analyzer (StandardAnalyzer.) index-writer-config (IndexWriterConfig. analyzer) index-writer (IndexWriter. directory index-writer-config)] @@ -52,20 +53,21 @@ ([n index-name] (search n index-name [])) ([n index-name other-keys] - (let [directory (FSDirectory/open (Paths/get (java.net.URI. (str "file:///tmp/" index-name)))) + (let [directory (FSDirectory/open (Paths/get (java.net.URI. (str "file:///tmp/search" (:dd-env env) "/" index-name)))) index-reader (DirectoryReader/open directory) index-searcher (IndexSearcher. index-reader)] (for [x (seq (.scoreDocs (.search index-searcher (make-query n) 10)))] (into - [(.get (.doc index-searcher (.-doc x)) "id") - (.get (.doc index-searcher (.-doc x)) "name")] + [(Long/parseLong (.get (.doc index-searcher (.-doc x)) "id")) + (.get (.doc index-searcher (.-doc x)) "name") + (.-score x)] (map (fn [o] (.get (.doc index-searcher (.-doc x)) o)) other-keys))))) ) (defn search-ids [n index-name] - (let [directory (FSDirectory/open (Paths/get (java.net.URI. (str "file:///tmp/" index-name)))) + (let [directory (FSDirectory/open (Paths/get (java.net.URI. (str "file:///tmp/search" (:dd-env env) "/" index-name)))) index-reader (DirectoryReader/open directory) index-searcher (IndexSearcher. index-reader)] (for [x (seq (.scoreDocs (.search index-searcher (make-query n) 100)))] diff --git a/test/clj/auto_ap/integration/graphql/accounts.clj b/test/clj/auto_ap/integration/graphql/accounts.clj index 8b18d368..45a7443e 100644 --- a/test/clj/auto_ap/integration/graphql/accounts.clj +++ b/test/clj/auto_ap/integration/graphql/accounts.clj @@ -9,6 +9,13 @@ (deftest test-account-search (testing "It should find matching account names" + (dc/transact conn {:tx-data [{:account/name "Food Research" + :db/ident :client-specific-account + :account/numeric-code 51100 + :account/search-terms "Food Research" + :account/applicability :account-applicability/global + :account/default-allowance :allowance/allowed}]}) + (sut/rebuild-search-index) (is (> (count (sut/search {:id (admin-token)} {:query "Food Research"} nil @@ -16,7 +23,7 @@ 0))) (testing "It should find exact matches by numbers" (is (= (count (sut/search {:id (admin-token)} - {:query "5110"} + {:query "51100"} nil )) 1))) @@ -27,10 +34,11 @@ :account/search-terms "CLIENTSPECIFIC" :account/applicability :account-applicability/customized :account/default-allowance :allowance/allowed}]}) - (is (= 0 (count (sut/search {:id (admin-token)} - {:query "CLIENTSPECIFIC"} - nil - )))) + (sut/rebuild-search-index) + (is (= [] (sut/search {:id (admin-token)} + {:query "CLIENTSPECIFIC"} + nil + ))) (testing "It should show up for the client specific version" (let [client-id (-> (dc/transact conn {:tx-data [{:client/name "CLIENT" @@ -41,6 +49,7 @@ :account-client-override/search-terms "HELLOWORLD"}]}]}) :tempids (get "client"))] + (sut/rebuild-search-index) (is (= 1 (count (sut/search {:id (admin-token)} {:query "HELLOWORLD" :client_id client-id} @@ -76,6 +85,7 @@ :account/default-allowance :allowance/warn :account/vendor-allowance :allowance/warn :account/invoice-allowance :allowance/warn}]}) + (sut/rebuild-search-index) (is (some? (:warning (first (sut/search {:id (admin-token)} {:query "WARNING" :allowance :global} @@ -97,10 +107,11 @@ :account/default-allowance :allowance/admin-only :account/vendor-allowance :allowance/admin-only :account/invoice-allowance :allowance/admin-only}]}) + (sut/rebuild-search-index) (is (= 1 (count (sut/search {:id (admin-token)} {:query "ADMINONLY"} nil)))) - (is (= 0 (count (sut/search {:id (user-token 1)} + (is (= 0 (count (sut/search {:id (user-token)} {:query "ADMINONLY"} nil))))) @@ -120,6 +131,7 @@ :db/id "vendor"}]}) :tempids (get "vendor"))] + (sut/rebuild-search-index) (is (= 0 (count (sut/search {:id (admin-token)} {:query "VENDORONLY" :allowance :invoice} @@ -130,5 +142,3 @@ :allowance :invoice :vendor_id vendor-id} nil)))))))) - - diff --git a/test/clj/auto_ap/integration/util.clj b/test/clj/auto_ap/integration/util.clj index 8fa0c091..dca88736 100644 --- a/test/clj/auto_ap/integration/util.clj +++ b/test/clj/auto_ap/integration/util.clj @@ -1,20 +1,17 @@ (ns auto-ap.integration.util - (:require - [auto-ap.datomic :refer [conn uri]] - [clj-time.core :as time] - [datomic.api :as dc] - [auto-ap.datomic.migrate :as migrate]) - ) + (:require [datomic.client.api :as dc] + [auto-ap.datomic :refer [client conn transact-schema]] + [clj-time.core :as time])) (defn wrap-setup [f] - (with-redefs [auto-ap.datomic/uri "datomic:mem://datomic-transactor:4334/invoice"] - (dc/create-database uri) - (with-redefs [auto-ap.datomic/conn (dc/connect uri)] - (migrate/migrate conn) + (with-redefs [auto-ap.datomic/client (dc/client {:server-type :dev-local + :system "dev"})] + (dc/create-database client {:db-name "test"}) + (with-redefs [auto-ap.datomic/conn (dc/connect client {:db-name "test"})] + (transact-schema conn) (f) - (dc/delete-database uri)))) - + (dc/delete-database client {:db-name "test"})))) (defn admin-token [] {:user "TEST ADMIN" diff --git a/test/clj/auto_ap/routes/invoice_test.clj b/test/clj/auto_ap/routes/invoice_test.clj index b91a7608..3eb91ee3 100644 --- a/test/clj/auto_ap/routes/invoice_test.clj +++ b/test/clj/auto_ap/routes/invoice_test.clj @@ -1,15 +1,16 @@ (ns auto-ap.routes.invoice-test (:require [auto-ap.datomic :refer [conn]] - [auto-ap.integration.util :refer [user-token wrap-setup]] + [auto-ap.datomic.clients :refer [rebuild-search-index]] + [auto-ap.integration.util :refer [admin-token wrap-setup]] [auto-ap.routes.invoices :as sut] - [datomic.client.api :as dc] [clj-time.coerce :as coerce] - [clojure.test :as t])) + [clojure.test :as t] + [datomic.client.api :as dc])) (t/use-fixtures :each wrap-setup) -(def user (user-token)) +(def user (admin-token)) (def client {:client/code "ABC" :client/name "ABC" @@ -39,6 +40,7 @@ (t/deftest import-uploaded-invoices (t/testing "It should import one" (dc/transact conn {:tx-data [client expense-account vendor]}) + (rebuild-search-index) (t/is (= 0 (invoice-count-for-client [:client/code "ABC"]))) (sut/import-uploaded-invoice user [(assoc invoice :customer-identifier "ABC")])