Version 5 template additions
authorAdam Bowling <abowling@emeralddata.net>
Wed, 26 Aug 2020 19:58:14 +0000 (15:58 -0400)
committerChris Sharp <csharp@georgialibraries.org>
Mon, 22 Mar 2021 14:17:48 +0000 (10:17 -0400)
25 files changed:
config/IDL.json [new file with mode: 0644]
controllers/template.controller.php
images/PINESLogo.gif [new file with mode: 0644]
images/pinetree-banner.png [new file with mode: 0644]
install-ubuntu.sh [changed mode: 0755->0644]
models/report.class.php
models/temp.json [new file with mode: 0644]
models/temp2.json [new file with mode: 0644]
models/temp3.json [new file with mode: 0644]
models/templateDecoder.class.php
models/templateDecoder.class.php.20201216 [new file with mode: 0644]
models/templateDecoder.class.php.202012162234.php [new file with mode: 0644]
models/ver5_formatted.json [new file with mode: 0644]
perl/execreports/erconfig.pl [changed mode: 0755->0644]
perl/execreports/erprocess.pl [changed mode: 0755->0644]
perl/execreports/erqueries.pl [changed mode: 0755->0644]
tester.20201216.php.bak [new file with mode: 0644]
tester.php [new file with mode: 0644]
update-installed.sh [new file with mode: 0755]
ver5.json [new file with mode: 0644]
views/baseReport.view.php
views/report.view.php
views/template.view.php
views/terran_equal_in_list.json [new file with mode: 0644]
views/terran_saved_list.json [new file with mode: 0644]

diff --git a/config/IDL.json b/config/IDL.json
new file mode 100644 (file)
index 0000000..e047cb5
--- /dev/null
@@ -0,0 +1,25757 @@
+{
+  "aaactsc": {
+    "name": "aaactsc",
+    "label": "Circ-Archived Patron Statistical Category Entries",
+    "table": "action.archive_actor_stat_cat",
+    "pkey": "id",
+    "pkey_sequence": "action.archive_actor_stat_cat_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "xact",
+        "label": "Circ",
+        "type": "link",
+        "key": "id",
+        "class": "combcirc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat",
+        "label": "Statistical Category",
+        "type": "link",
+        "key": "id",
+        "class": "actsc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "label": "Entry Value", "datatype": "text" }
+    ]
+  },
+  "aaasc": {
+    "name": "aaasc",
+    "label": "Circ-Archived Copy Statistical Category Entries",
+    "table": "action.archive_asset_stat_cat",
+    "pkey": "id",
+    "pkey_sequence": "action.archive_actor_stat_cat_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "xact",
+        "label": "Circ",
+        "type": "link",
+        "key": "id",
+        "class": "combcirc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat",
+        "label": "Statistical Category",
+        "type": "link",
+        "key": "id",
+        "class": "asc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "label": "Entry Value", "datatype": "text" }
+    ]
+  },
+  "aaca": {
+    "name": "aaca",
+    "label": "Active Copy Alert",
+    "table": "asset.active_copy_alert",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "label": "Id", "datatype": "id" },
+      {
+        "name": "alert_type",
+        "label": "Alert Type",
+        "type": "link",
+        "key": "id",
+        "class": "ccat",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy",
+        "label": "Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "temp", "label": "Temporary", "datatype": "bool" },
+      {
+        "name": "create_time",
+        "label": "Create Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "create_staff",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "ack_time",
+        "label": "Acknowledge Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "ack_staff",
+        "label": "Acknowledger",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_COPY_ALERT", "CREATE_COPY_ALERT"] },
+      "retrieve": { "perms": ["ADMIN_COPY_ALERT", "VIEW_COPY_ALERT"] },
+      "update": { "perms": ["ADMIN_COPY_ALERT", "UPDATE_COPY_ALERT"] },
+      "delete": { "perms": ["ADMIN_COPY_ALERT", "DELETE_COPY_ALERT"] }
+    }
+  },
+  "aacct": {
+    "name": "aacct",
+    "label": "All Circulation Combined Types",
+    "table": "action.all_circulation_combined_types",
+    "core": true,
+    "fields": [
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "circ_staff",
+        "label": "Circulating Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "Circ ID", "datatype": "int" },
+      {
+        "name": "xact_start",
+        "label": "Checkout Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "create_time",
+        "label": "Create Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "circ_type", "label": "Circulation Type", "datatype": "text" },
+      { "name": "item_type", "label": "Item Type", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_CIRCULATIONS"] } }
+  },
+  "aacs": {
+    "name": "aacs",
+    "label": "Combined Aged and Active circulations",
+    "table": "action.all_circulation_slim",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "money.billable_xact_id_seq",
+    "fields": [
+      {
+        "name": "checkin_lib",
+        "label": "Check In Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "checkin_staff",
+        "label": "Check In Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "checkin_time",
+        "label": "Check In Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "circ_staff",
+        "label": "Circulating Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "desk_renewal", "label": "Desk Renewal", "datatype": "bool" },
+      { "name": "due_date", "label": "Due Date/Time", "datatype": "timestamp" },
+      {
+        "name": "duration",
+        "label": "Circulation Duration",
+        "datatype": "interval"
+      },
+      {
+        "name": "duration_rule",
+        "label": "Circ Duration Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crcd",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "fine_interval",
+        "label": "Fine Interval",
+        "datatype": "interval"
+      },
+      { "name": "id", "label": "Circ ID", "datatype": "id" },
+      { "name": "max_fine", "label": "Max Fine Amount", "datatype": "money" },
+      {
+        "name": "max_fine_rule",
+        "label": "Max Fine Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "opac_renewal", "label": "OPAC Renewal", "datatype": "bool" },
+      { "name": "phone_renewal", "label": "Phone Renewal", "datatype": "bool" },
+      {
+        "name": "recurring_fine",
+        "label": "Recurring Fine Amount",
+        "datatype": "money"
+      },
+      {
+        "name": "recurring_fine_rule",
+        "label": "Recurring Fine Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crrf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "renewal_remaining",
+        "label": "Remaining Renewals",
+        "datatype": "int"
+      },
+      {
+        "name": "grace_period",
+        "label": "Grace Period",
+        "datatype": "interval"
+      },
+      { "name": "stop_fines", "label": "Fine Stop Reason", "datatype": "text" },
+      {
+        "name": "stop_fines_time",
+        "label": "Fine Stop Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "target_copy",
+        "label": "Circulating Item",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "xact_finish",
+        "label": "Transaction Finish Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact_start",
+        "label": "Checkout Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "create_time",
+        "label": "Record Creation Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "parent_circ",
+        "label": "Parent Circulation",
+        "type": "link",
+        "key": "id",
+        "class": "acirc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "checkin_scan_time",
+        "label": "Checkin Scan Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "checkin_workstation",
+        "label": "Checkin Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr",
+        "label": "Patron",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "billings",
+        "label": "Transaction Billings",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mb",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "payments",
+        "label": "Transaction Payments",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mp",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "billable_transaction",
+        "label": "Base Transaction",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "workstation",
+        "label": "Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_type",
+        "label": "Circulation Type",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rcirct",
+        "reltype": "might_have",
+        "datatype": "text"
+      },
+      {
+        "name": "billing_total",
+        "label": "Billing Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxbt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "payment_total",
+        "label": "Payment Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxpt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "aaactsc_entries",
+        "label": "Archived Patron Stat-Cat Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "aaactsc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "aaasc_entries",
+        "label": "Archived Copy Stat-Cat Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "aaasc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "active_circ",
+        "label": "Linked Active Circulation",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "aged_circ",
+        "label": "Linked Aged Circulation",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "acirc",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_CIRCULATIONS"] } }
+  },
+  "aahr": {
+    "name": "aahr",
+    "label": "Aged Hold Request",
+    "table": "action.aged_hold_request",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "action.hold_request_id_seq",
+    "fields": [
+      {
+        "name": "status",
+        "label": "Status",
+        "virtual": true,
+        "datatype": "text"
+      },
+      {
+        "name": "capture_time",
+        "label": "Capture Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "current_copy",
+        "label": "Currently Targeted Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "email_notify",
+        "label": "Notify by Email?",
+        "datatype": "bool"
+      },
+      {
+        "name": "expire_time",
+        "label": "Hold Expire Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "fulfillment_lib",
+        "label": "Fulfilling Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "fulfillment_staff",
+        "label": "Fulfilling Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "fulfillment_time",
+        "label": "Fulfillment Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "hold_type", "label": "Hold Type", "datatype": "text" },
+      {
+        "name": "holdable_formats",
+        "label": "Holdable Formats (for M-type hold)",
+        "datatype": "text"
+      },
+      { "name": "id", "label": "Hold ID", "datatype": "id" },
+      {
+        "name": "phone_notify",
+        "label": "Notify by Phone?",
+        "datatype": "bool"
+      },
+      { "name": "sms_notify", "label": "Notify by SMS?", "datatype": "bool" },
+      {
+        "name": "pickup_lib",
+        "label": "Pickup Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "prev_check_time",
+        "label": "Last Targeting Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "request_lib",
+        "label": "Requesting Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "request_time",
+        "label": "Request Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "usr_post_code", "label": "Patron ZIP", "datatype": "text" },
+      {
+        "name": "usr_home_ou",
+        "label": "Patron Home Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr_profile",
+        "label": "Patron Profile Group",
+        "type": "link",
+        "key": "id",
+        "class": "pgt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr_birth_year",
+        "label": "Patron Birth Year",
+        "datatype": "int"
+      },
+      { "name": "staff_placed", "label": "Staff Placed?", "datatype": "bool" },
+      {
+        "name": "selection_depth",
+        "label": "Item Selection Depth",
+        "datatype": "text"
+      },
+      {
+        "name": "selection_ou",
+        "label": "Selection Locus",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "target", "label": "Target Object ID", "datatype": "link" },
+      {
+        "name": "cancel_time",
+        "label": "Hold Cancel Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "bib_rec",
+        "label": "Bib Record link",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rhrr",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      { "name": "frozen", "label": "Currently Frozen", "datatype": "bool" },
+      {
+        "name": "thaw_date",
+        "label": "Activation Date",
+        "datatype": "timestamp"
+      },
+      { "name": "shelf_time", "label": "Shelf Time", "datatype": "timestamp" },
+      {
+        "name": "cancel_cause",
+        "label": "Cancelation cause",
+        "type": "link",
+        "key": "id",
+        "class": "ahrcc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_note",
+        "label": "Cancelation note",
+        "datatype": "text"
+      },
+      { "name": "cut_in_line", "label": "Top of Queue", "datatype": "bool" },
+      {
+        "name": "mint_condition",
+        "label": "Is Mint Condition",
+        "datatype": "bool"
+      },
+      {
+        "name": "shelf_expire_time",
+        "label": "Shelf Expire Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "current_shelf_lib",
+        "label": "Current Shelf Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_HOLD"] } }
+  },
+  "aal": {
+    "name": "aal",
+    "label": "Address Alert",
+    "table": "actor.address_alert",
+    "pkey": "id",
+    "pkey_sequence": "actor.address_alert_id_seq",
+    "fields": [
+      { "name": "id", "label": "Address Alert ID", "datatype": "id" },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "active", "label": "Active", "datatype": "bool" },
+      { "name": "match_all", "label": "Match All Fields", "datatype": "bool" },
+      {
+        "name": "alert_message",
+        "label": "Alert Message",
+        "required": true,
+        "datatype": "text"
+      },
+      { "name": "street1", "label": "Street (1)", "datatype": "text" },
+      { "name": "street2", "label": "Street (2)", "datatype": "text" },
+      { "name": "city", "label": "City", "datatype": "text" },
+      { "name": "county", "label": "County", "datatype": "text" },
+      { "name": "state", "label": "State", "datatype": "text" },
+      { "name": "country", "label": "Country", "datatype": "text" },
+      { "name": "post_code", "label": "Postal Code", "datatype": "text" },
+      {
+        "name": "mailing_address",
+        "label": "Mailing Address",
+        "datatype": "bool"
+      },
+      {
+        "name": "billing_address",
+        "label": "Billing Address",
+        "datatype": "bool"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ADDRESS_ALERT"] },
+      "retrieve": {
+        "perms": ["ADMIN_ADDRESS_ALERT", "VIEW_ADDRESS_ALERT", "CREATE_USER"]
+      },
+      "update": { "perms": ["ADMIN_ADDRESS_ALERT"] },
+      "delete": { "perms": ["ADMIN_ADDRESS_ALERT"] }
+    }
+  },
+  "aalink": {
+    "name": "aalink",
+    "label": "Authority to Authority Linking",
+    "table": "authority.authority_linking",
+    "pkey": "id",
+    "pkey_sequence": "authority.authority_linking_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "source",
+        "label": "Source Record",
+        "type": "link",
+        "key": "id",
+        "class": "are",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "target",
+        "label": "Target Record",
+        "type": "link",
+        "key": "id",
+        "class": "are",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "field",
+        "label": "Authority Field",
+        "type": "link",
+        "key": "id",
+        "class": "acsaf",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "aba": {
+    "name": "aba",
+    "label": "Authority Browse Axis",
+    "table": "authority.browse_axis",
+    "pkey": "code",
+    "fields": [
+      { "name": "code", "label": "Code", "selector": "name", "datatype": "id" },
+      {
+        "name": "name",
+        "label": "Name",
+        "required": true,
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "sorter",
+        "label": "Sorter Attribute",
+        "type": "link",
+        "key": "name",
+        "class": "crad",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "description", "label": "Description", "datatype": "text" },
+      {
+        "name": "fields",
+        "label": "Authority Fields",
+        "virtual": true,
+        "type": "link",
+        "key": "axis",
+        "class": "abaafm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "maps",
+        "label": "Authority Field Maps",
+        "virtual": true,
+        "type": "link",
+        "key": "axis",
+        "class": "abaafm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_CONTROL_SET"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] },
+      "delete": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] }
+    }
+  },
+  "abaafm": {
+    "name": "abaafm",
+    "label": "Authority Browse Axis Field Map",
+    "table": "authority.browse_axis_authority_field_map",
+    "pkey": "id",
+    "pkey_sequence": "authority.browse_axis_authority_field_map_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Axis Authority Field Map ID",
+        "datatype": "id"
+      },
+      {
+        "name": "field",
+        "label": "Authority Field",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "acsaf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "axis",
+        "label": "Axis",
+        "required": true,
+        "type": "link",
+        "key": "code",
+        "class": "aba",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_CONTROL_SET"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] },
+      "delete": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] }
+    }
+  },
+  "abl": {
+    "name": "abl",
+    "label": "Authority-Bibliographic Record Link",
+    "table": "authority.bib_linking",
+    "pkey": "id",
+    "pkey_sequence": "authority.bib_linking_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "bib",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "authority",
+        "type": "link",
+        "key": "id",
+        "class": "are",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "ac": {
+    "name": "ac",
+    "label": "Library Card",
+    "table": "actor.card",
+    "pkey": "id",
+    "pkey_sequence": "actor.card_id_seq",
+    "fields": [
+      { "name": "active", "label": "IsActive?", "datatype": "bool" },
+      { "name": "barcode", "label": "Barcode", "datatype": "text" },
+      { "name": "id", "label": "Card ID", "datatype": "id" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER", "user_request.view"] } }
+  },
+  "aca": {
+    "name": "aca",
+    "label": "Copy Alert",
+    "table": "asset.copy_alert",
+    "pkey": "id",
+    "pkey_sequence": "asset.copy_alert_id_seq",
+    "fields": [
+      { "name": "id", "label": "Id", "datatype": "id" },
+      {
+        "name": "alert_type",
+        "label": "Alert Type",
+        "type": "link",
+        "key": "id",
+        "class": "ccat",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy",
+        "label": "Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "temp", "label": "Temporary", "datatype": "bool" },
+      {
+        "name": "create_time",
+        "label": "Create Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "create_staff",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "ack_time",
+        "label": "Acknowledge Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "ack_staff",
+        "label": "Acknowledger",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_COPY_ALERT", "CREATE_COPY_ALERT"] },
+      "retrieve": { "perms": ["ADMIN_COPY_ALERT", "VIEW_COPY_ALERT"] },
+      "update": { "perms": ["ADMIN_COPY_ALERT", "UPDATE_COPY_ALERT"] },
+      "delete": { "perms": ["ADMIN_COPY_ALERT", "DELETE_COPY_ALERT"] }
+    }
+  },
+  "acas": {
+    "name": "acas",
+    "label": "Copy Alert Suppression",
+    "table": "actor.copy_alert_suppress",
+    "pkey": "id",
+    "pkey_sequence": "actor.copy_alert_suppress_id_seq",
+    "fields": [
+      { "name": "id", "label": "Id", "datatype": "id" },
+      {
+        "name": "org",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "alert_type",
+        "label": "Alert Type",
+        "type": "link",
+        "key": "id",
+        "class": "ccat",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": {
+        "perms": ["ADMIN_COPY_ALERT_SUPPRESS", "CREATE_COPY_ALERT_SUPPRESS"]
+      },
+      "retrieve": {},
+      "update": {
+        "perms": ["ADMIN_COPY_ALERT_SUPPRESS", "UPDATE_COPY_ALERT_SUPPRESS"]
+      },
+      "delete": {
+        "perms": ["ADMIN_COPY_ALERT_SUPPRESS", "DELETE_COPY_ALERT_SUPPRESS"]
+      }
+    }
+  },
+  "accs": {
+    "name": "accs",
+    "label": "Circulation Chain Summary",
+    "virtual": true,
+    "fields": [
+      { "name": "num_circs", "label": "Total Circs", "datatype": "int" },
+      { "name": "start_time", "label": "Start Time", "datatype": "timestamp" },
+      {
+        "name": "checkout_workstation",
+        "label": "Checkout Workstation",
+        "datatype": "text"
+      },
+      {
+        "name": "last_renewal_time",
+        "label": "Last Renewal Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "last_stop_fines",
+        "label": "Last Stop Fines",
+        "datatype": "text"
+      },
+      {
+        "name": "last_stop_fines_time",
+        "label": "Last Stop Fines Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "last_renewal_workstation",
+        "label": "Last Renewal Workstation",
+        "datatype": "text"
+      },
+      {
+        "name": "last_checkin_workstation",
+        "label": "Last Checkin Workstation",
+        "datatype": "text"
+      },
+      {
+        "name": "last_checkin_time",
+        "label": "Last Checkin Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "last_checkin_scan_time",
+        "label": "Last Checkin Scan Time",
+        "datatype": "timestamp"
+      }
+    ]
+  },
+  "acirc": {
+    "name": "acirc",
+    "label": "Aged (patronless) Circulation",
+    "table": "action.aged_circulation",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "money.billable_xact_id_seq",
+    "fields": [
+      {
+        "name": "checkin_lib",
+        "label": "Check In Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "checkin_staff",
+        "label": "Check In Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "checkin_time",
+        "label": "Check In Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "circ_staff",
+        "label": "Circulating Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "desk_renewal", "label": "Desk Renewal", "datatype": "bool" },
+      { "name": "due_date", "label": "Due Date/Time", "datatype": "timestamp" },
+      {
+        "name": "duration",
+        "label": "Circulation Duration",
+        "datatype": "interval"
+      },
+      {
+        "name": "duration_rule",
+        "label": "Circ Duration Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crcd",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "fine_interval",
+        "label": "Fine Interval",
+        "datatype": "interval"
+      },
+      { "name": "id", "label": "Circ ID", "datatype": "id" },
+      { "name": "max_fine", "label": "Max Fine Amount", "datatype": "money" },
+      {
+        "name": "max_fine_rule",
+        "label": "Max Fine Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "opac_renewal", "label": "OPAC Renewal", "datatype": "bool" },
+      { "name": "phone_renewal", "label": "Phone Renewal", "datatype": "bool" },
+      {
+        "name": "recurring_fine",
+        "label": "Recurring Fine Amount",
+        "datatype": "money"
+      },
+      {
+        "name": "recurring_fine_rule",
+        "label": "Recurring Fine Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crrf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "renewal_remaining",
+        "label": "Remaining Renewals",
+        "datatype": "int"
+      },
+      {
+        "name": "grace_period",
+        "label": "Grace Period",
+        "datatype": "interval"
+      },
+      { "name": "stop_fines", "label": "Fine Stop Reason", "datatype": "text" },
+      {
+        "name": "stop_fines_time",
+        "label": "Fine Stop Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "target_copy",
+        "label": "Circulating Item",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "usr_post_code", "label": "Patron ZIP", "datatype": "text" },
+      {
+        "name": "xact_finish",
+        "label": "Transaction Finish Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact_start",
+        "label": "Checkout Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "create_time",
+        "label": "Record Creation Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "workstation",
+        "label": "Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "checkin_workstation",
+        "label": "Checkin Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "checkin_scan_time",
+        "label": "Checkin Scan Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "parent_circ",
+        "label": "Parent Circulation",
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "billings",
+        "label": "Transaction Billings",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mb",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "payments",
+        "label": "Transaction Payments",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mp",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "billable_transaction",
+        "label": "Base Transaction",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_type",
+        "label": "Circulation Type",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rcirct",
+        "reltype": "might_have",
+        "datatype": "text"
+      },
+      {
+        "name": "billing_total",
+        "label": "Billing Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxbt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "payment_total",
+        "label": "Payment Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxpt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "usr_home_ou",
+        "label": "Patron Home Library",
+        "datatype": "link"
+      },
+      {
+        "name": "usr_profile",
+        "label": "Patron Profile Group",
+        "datatype": "link"
+      },
+      {
+        "name": "usr_birth_year",
+        "label": "Patron Birth Year",
+        "datatype": "int"
+      },
+      {
+        "name": "copy_call_number",
+        "label": "Call Number",
+        "type": "link",
+        "key": "id",
+        "class": "acn",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_location",
+        "label": "Shelving Location",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_owning_lib",
+        "label": "Copy Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_circ_lib",
+        "label": "Copy Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_bib_record",
+        "label": "Bib Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "aaactsc_entries",
+        "label": "Archived Patron Stat-Cat Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "aaactsc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "aaasc_entries",
+        "label": "Archived Copy Stat-Cat Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "aaasc",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ]
+  },
+  "acn": {
+    "name": "acn",
+    "label": "Call Number/Volume",
+    "table": "asset.call_number",
+    "pkey": "id",
+    "pkey_sequence": "asset.call_number_id_seq",
+    "fields": [
+      {
+        "name": "copies",
+        "label": "Copies",
+        "virtual": true,
+        "type": "link",
+        "key": "call_number",
+        "class": "acp",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "create_date",
+        "label": "Create Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "creator",
+        "label": "Creating User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "deleted", "label": "Is Deleted", "datatype": "bool" },
+      {
+        "name": "edit_date",
+        "label": "Last Edit Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "editor",
+        "label": "Last Editing User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "Call Number/Volume ID", "datatype": "id" },
+      { "name": "label", "label": "Call Number Label", "datatype": "text" },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "record",
+        "label": "Bib Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "notes",
+        "label": "Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "call_number",
+        "class": "acnn",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "uri_maps",
+        "label": "URI Maps",
+        "virtual": true,
+        "type": "link",
+        "key": "call_number",
+        "class": "auricnm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "uris",
+        "label": "URIs",
+        "virtual": true,
+        "type": "link",
+        "key": "call_number",
+        "class": "auricnm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "label_sortkey",
+        "label": "Call Number Sort Key",
+        "datatype": "text"
+      },
+      {
+        "name": "label_class",
+        "label": "Classification Scheme",
+        "type": "link",
+        "key": "id",
+        "class": "acnc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "prefix",
+        "label": "Prefix",
+        "type": "link",
+        "key": "id",
+        "class": "acnp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "suffix",
+        "label": "Suffix",
+        "type": "link",
+        "key": "id",
+        "class": "acns",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_VOLUME"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_VOLUME"] },
+      "delete": { "perms": ["DELETE_VOLUME"] }
+    }
+  },
+  "acnc": {
+    "name": "acnc",
+    "label": "Call number classification scheme",
+    "table": "asset.call_number_class",
+    "pkey": "id",
+    "pkey_sequence": "asset.call_number_class_id_seq",
+    "fields": [
+      { "name": "id", "label": "Call number class ID", "datatype": "id" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      {
+        "name": "normalizer",
+        "label": "Normalizer function",
+        "datatype": "text"
+      },
+      { "name": "field", "label": "Call number fields", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "acnn": {
+    "name": "acnn",
+    "label": "Call Number Note",
+    "table": "asset.call_number_note",
+    "pkey": "id",
+    "pkey_sequence": "asset.call_number_note_id_seq",
+    "fields": [
+      {
+        "name": "call_number",
+        "type": "link",
+        "key": "id",
+        "class": "acn",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "create_date", "datatype": "timestamp" },
+      { "name": "creator", "datatype": "link" },
+      { "name": "id", "datatype": "id" },
+      { "name": "pub", "datatype": "bool" },
+      { "name": "title", "datatype": "text" },
+      { "name": "value", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_VOLUME_NOTE"] },
+      "retrieve": { "perms": ["VIEW_VOLUME_NOTES"] },
+      "update": { "perms": ["UPDATE_VOLUME_NOTE"] },
+      "delete": { "perms": ["DELETE_VOLUME_NOTE"] }
+    }
+  },
+  "acnp": {
+    "name": "acnp",
+    "label": "Call Number/Volume Prefix",
+    "table": "asset.call_number_prefix",
+    "pkey": "id",
+    "pkey_sequence": "asset.call_number_prefix_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "label", "label": "Label", "datatype": "text" },
+      {
+        "name": "label_sortkey",
+        "label": "Label Sort Key",
+        "datatype": "text"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_VOLUME_PREFIX"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_VOLUME_PREFIX"] },
+      "delete": { "perms": ["DELETE_VOLUME_PREFIX"] }
+    }
+  },
+  "acns": {
+    "name": "acns",
+    "label": "Call Number/Volume Suffix",
+    "table": "asset.call_number_suffix",
+    "pkey": "id",
+    "pkey_sequence": "asset.call_number_suffix_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "label", "label": "Label", "datatype": "text" },
+      {
+        "name": "label_sortkey",
+        "label": "Label Sort Key",
+        "datatype": "text"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_VOLUME_SUFFIX"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_VOLUME_SUFFIX"] },
+      "delete": { "perms": ["DELETE_VOLUME_SUFFIX"] }
+    }
+  },
+  "acp": {
+    "name": "acp",
+    "label": "Item",
+    "table": "asset.copy",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "asset.copy_id_seq",
+    "fields": [
+      {
+        "name": "age_protect",
+        "label": "Age Hold Protection",
+        "type": "link",
+        "key": "id",
+        "class": "crahp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "alert_message", "label": "Alert Message", "datatype": "text" },
+      { "name": "barcode", "label": "Barcode", "datatype": "text" },
+      {
+        "name": "call_number",
+        "label": "Call Number/Volume",
+        "type": "link",
+        "key": "id",
+        "class": "acn",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_as_type",
+        "label": "Circulation Type (MARC)",
+        "type": "link",
+        "key": "code",
+        "class": "citm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "circ_modifier",
+        "label": "Circulation Modifier",
+        "type": "link",
+        "key": "code",
+        "class": "ccm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "circulate", "label": "Can Circulate", "datatype": "bool" },
+      {
+        "name": "copy_number",
+        "label": "Copy Number on Volume",
+        "datatype": "text"
+      },
+      {
+        "name": "create_date",
+        "label": "Creation Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "active_date",
+        "label": "Active Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "creator",
+        "label": "Creating User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "deleted", "label": "Is Deleted", "datatype": "bool" },
+      { "name": "dummy_isbn", "label": "Dummy ISBN", "datatype": "text" },
+      { "name": "deposit", "label": "Is Deposit Required", "datatype": "bool" },
+      {
+        "name": "deposit_amount",
+        "label": "Deposit Amount",
+        "datatype": "money"
+      },
+      {
+        "name": "dummy_author",
+        "label": "Precat Dummy Author",
+        "datatype": "text"
+      },
+      {
+        "name": "dummy_title",
+        "label": "Precat Dummy Title",
+        "datatype": "text"
+      },
+      {
+        "name": "edit_date",
+        "label": "Last Edit Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "editor",
+        "label": "Last Editing User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "fine_level", "label": "Fine Level", "datatype": "int" },
+      { "name": "holdable", "label": "Is Holdable", "datatype": "bool" },
+      { "name": "id", "label": "Copy ID", "datatype": "id" },
+      { "name": "loan_duration", "label": "Loan Duration", "datatype": "int" },
+      {
+        "name": "location",
+        "label": "Shelving Location",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "opac_visible", "label": "OPAC Visible", "datatype": "bool" },
+      { "name": "price", "label": "Price", "datatype": "money" },
+      { "name": "ref", "label": "Is Reference", "datatype": "bool" },
+      {
+        "name": "status",
+        "label": "Copy Status",
+        "type": "link",
+        "key": "id",
+        "class": "ccs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "status_changed_time",
+        "label": "Copy Status Changed Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "mint_condition",
+        "label": "Is Mint Condition",
+        "datatype": "bool"
+      },
+      {
+        "name": "floating",
+        "label": "Floating Group",
+        "type": "link",
+        "key": "id",
+        "class": "cfg",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "cost", "label": "Cost", "datatype": "money" },
+      {
+        "name": "notes",
+        "label": "Copy Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "owning_copy",
+        "class": "acpn",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat_entry_copy_maps",
+        "label": "Stat-Cat entry maps",
+        "virtual": true,
+        "type": "link",
+        "key": "owning_copy",
+        "class": "ascecm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "circulations",
+        "label": "Circulations",
+        "virtual": true,
+        "type": "link",
+        "key": "target_copy",
+        "class": "circ",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "aged_circulations",
+        "label": "Aged (patronless) Circulations",
+        "virtual": true,
+        "type": "link",
+        "key": "target_copy",
+        "class": "acirc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "all_circulations",
+        "label": "Combined Aged and Active Circulations",
+        "virtual": true,
+        "type": "link",
+        "key": "target_copy",
+        "class": "combcirc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "total_circ_count",
+        "label": "Total Circulations",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "erfcc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "last_circ",
+        "label": "Last Circulation Date",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rlc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "holds",
+        "label": "Holds",
+        "virtual": true,
+        "type": "link",
+        "key": "target_copy",
+        "class": "ahcm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat_entries",
+        "label": "Statistical Category Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "owning_copy",
+        "class": "ascecm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "parts",
+        "label": "Monograph Parts",
+        "virtual": true,
+        "type": "link",
+        "key": "target_copy",
+        "class": "acpm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "peer_record_maps",
+        "label": "Peer Record Maps",
+        "virtual": true,
+        "type": "link",
+        "key": "target_copy",
+        "class": "bpbcm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "peer_records",
+        "label": "Peer Records",
+        "virtual": true,
+        "type": "link",
+        "key": "target_copy",
+        "class": "bpbcm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "last_captured_hold",
+        "label": "Last Captured Hold",
+        "virtual": true,
+        "type": "link",
+        "key": "current_copy",
+        "class": "alhr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "latest_inventory",
+        "label": "Latest Inventory",
+        "virtual": true,
+        "type": "link",
+        "key": "copy",
+        "class": "alci",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "holds_count",
+        "label": "Has Holds",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "hasholdscount",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "tags",
+        "label": "Copy Tags",
+        "virtual": true,
+        "type": "link",
+        "key": "copy",
+        "class": "acptcm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_alerts",
+        "label": "Copy Alerts",
+        "virtual": true,
+        "type": "link",
+        "key": "copy",
+        "class": "aca",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_COPY"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_COPY"] },
+      "delete": { "perms": ["DELETE_COPY"] }
+    }
+  },
+  "acpl": {
+    "name": "acpl",
+    "label": "Copy/Shelving Location",
+    "table": "asset.copy_location",
+    "pkey": "id",
+    "pkey_sequence": "asset.copy_location_id_seq",
+    "fields": [
+      { "name": "circulate", "label": "Can Circulate?", "datatype": "bool" },
+      { "name": "holdable", "label": "Is Holdable?", "datatype": "bool" },
+      {
+        "name": "hold_verify",
+        "label": "Hold Capture Requires Verification",
+        "datatype": "bool"
+      },
+      {
+        "name": "id",
+        "label": "Location ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      {
+        "name": "opac_visible",
+        "label": "Is OPAC Visible?",
+        "datatype": "bool"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "orders",
+        "label": "Copy Location Orders",
+        "virtual": true,
+        "type": "link",
+        "key": "location",
+        "class": "acplo",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "copies",
+        "label": "Copies",
+        "virtual": true,
+        "type": "link",
+        "key": "location",
+        "class": "acp",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "label_prefix",
+        "label": "Label Prefix",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "label_suffix",
+        "label": "Label Suffix",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "checkin_alert", "label": "Checkin Alert", "datatype": "bool" },
+      { "name": "deleted", "label": "Is Deleted?", "datatype": "bool" },
+      { "name": "url", "label": "URL", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_COPY_LOCATION"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_COPY_LOCATION"] },
+      "delete": { "perms": ["DELETE_COPY_LOCATION"] }
+    }
+  },
+  "acplg": {
+    "name": "acplg",
+    "label": "Copy/Shelving Location Group",
+    "table": "asset.copy_location_group",
+    "pkey": "id",
+    "pkey_sequence": "asset.copy_location_group_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      {
+        "name": "opac_visible",
+        "label": "Is OPAC Visible?",
+        "datatype": "bool"
+      },
+      {
+        "name": "owner",
+        "label": "Owning Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "pos", "label": "Position", "datatype": "int" },
+      { "name": "top", "label": "Display Above Orgs", "datatype": "bool" },
+      {
+        "name": "location_maps",
+        "label": "Copy Location Mappings",
+        "virtual": true,
+        "type": "link",
+        "key": "lgroup",
+        "class": "acplgm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_COPY_LOCATION_GROUP"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_COPY_LOCATION_GROUP"] },
+      "delete": { "perms": ["ADMIN_COPY_LOCATION_GROUP"] }
+    }
+  },
+  "acplgm": {
+    "name": "acplgm",
+    "label": "Copy/Shelving Location Group Map",
+    "table": "asset.copy_location_group_map",
+    "pkey": "id",
+    "pkey_sequence": "asset.copy_location_group_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      {
+        "name": "lgroup",
+        "label": "Group",
+        "type": "link",
+        "key": "id",
+        "class": "acplg",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "location",
+        "label": "Copy Location",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_COPY_LOCATION_GROUP"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_COPY_LOCATION_GROUP"] },
+      "delete": { "perms": ["ADMIN_COPY_LOCATION_GROUP"] }
+    }
+  },
+  "acplo": {
+    "name": "acplo",
+    "label": "Copy/Shelving Location Order",
+    "table": "asset.copy_location_order",
+    "pkey": "id",
+    "pkey_sequence": "asset.copy_location_order_id_seq",
+    "fields": [
+      { "name": "id", "label": "Location Order ID", "datatype": "id" },
+      {
+        "name": "location",
+        "label": "Location ID",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "org",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "position", "label": "Position", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_COPY_LOCATION_ORDER"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_COPY_LOCATION_ORDER"] },
+      "delete": { "perms": ["ADMIN_COPY_LOCATION_ORDER"] }
+    }
+  },
+  "acpm": {
+    "name": "acpm",
+    "label": "Copy Monograph Part Map",
+    "table": "asset.copy_part_map",
+    "pkey": "id",
+    "pkey_sequence": "asset.copy_part_map_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "target_copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "part",
+        "type": "link",
+        "key": "id",
+        "class": "bmp",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["MAP_MONOGRAPH_PART"] },
+      "retrieve": {},
+      "update": { "perms": ["MAP_MONOGRAPH_PART"] },
+      "delete": { "perms": ["MAP_MONOGRAPH_PART"] }
+    }
+  },
+  "acpn": {
+    "name": "acpn",
+    "label": "Copy Note",
+    "table": "asset.copy_note",
+    "pkey": "id",
+    "pkey_sequence": "asset.copy_note_id_seq",
+    "fields": [
+      {
+        "name": "create_date",
+        "label": "Note Creation Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "creator",
+        "label": "Note Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "Note ID", "datatype": "id" },
+      {
+        "name": "owning_copy",
+        "label": "Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "pub", "label": "Is OPAC Visible?", "datatype": "bool" },
+      { "name": "title", "label": "Note Title", "datatype": "text" },
+      { "name": "value", "label": "Note Content", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_COPY_NOTE"] },
+      "retrieve": { "perms": ["VIEW_COPY_NOTES"] },
+      "update": { "perms": ["UPDATE_COPY_NOTE"] },
+      "delete": { "perms": ["DELETE_COPY_NOTE"] }
+    }
+  },
+  "acpt": {
+    "name": "acpt",
+    "label": "Copy Tags",
+    "table": "asset.copy_tag",
+    "pkey": "id",
+    "pkey_sequence": "asset.copy_tag_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "tag_type",
+        "label": "Copy Tag Type",
+        "type": "link",
+        "key": "code",
+        "class": "cctt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "label", "label": "Label", "datatype": "text" },
+      { "name": "value", "label": "Value", "datatype": "text" },
+      { "name": "staff_note", "label": "Staff Note", "datatype": "text" },
+      { "name": "pub", "label": "Is OPAC Visible?", "datatype": "bool" },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_COPY_TAG"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_COPY_TAG"] },
+      "delete": { "perms": ["ADMIN_COPY_TAG"] }
+    }
+  },
+  "acptcm": {
+    "name": "acptcm",
+    "label": "Copy Tag Copy Map",
+    "table": "asset.copy_tag_copy_map",
+    "pkey": "id",
+    "pkey_sequence": "asset.copy_tag_copy_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "copy",
+        "label": "Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "tag",
+        "label": "Tag",
+        "type": "link",
+        "key": "id",
+        "class": "acpt",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["UPDATE_COPY"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_COPY"] },
+      "delete": { "perms": ["UPDATE_COPY"] }
+    }
+  },
+  "acqafat": {
+    "name": "acqafat",
+    "label": "All Fund Allocation Total",
+    "table": "acq.all_fund_allocation_total",
+    "pkey": "fund",
+    "fields": [
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "amount",
+        "label": "Total Allocation Amount",
+        "datatype": "money"
+      }
+    ]
+  },
+  "acqafcb": {
+    "name": "acqafcb",
+    "label": "All Fund Combined Total",
+    "table": "acq.all_fund_combined_balance",
+    "pkey": "fund",
+    "fields": [
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "amount",
+        "label": "Total Combined Balance",
+        "datatype": "money"
+      }
+    ]
+  },
+  "acqafet": {
+    "name": "acqafet",
+    "label": "All Fund Encumbrance Total",
+    "table": "acq.all_fund_encumbrance_total",
+    "pkey": "fund",
+    "fields": [
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "amount",
+        "label": "Total Encumbered Amount",
+        "datatype": "money"
+      }
+    ]
+  },
+  "acqafsb": {
+    "name": "acqafsb",
+    "label": "All Fund Spent Balance",
+    "table": "acq.all_fund_spent_balance",
+    "pkey": "fund",
+    "fields": [
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Total Spent Balance", "datatype": "money" }
+    ]
+  },
+  "acqafst": {
+    "name": "acqafst",
+    "label": "All Fund Spent Total",
+    "table": "acq.all_fund_spent_total",
+    "pkey": "fund",
+    "fields": [
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Total Spent Amount", "datatype": "money" }
+    ]
+  },
+  "acqcl": {
+    "name": "acqcl",
+    "label": "Claim",
+    "table": "acq.claim",
+    "pkey": "id",
+    "pkey_sequence": "acq.claim_id_seq",
+    "fields": [
+      { "name": "id", "label": "Claim ID", "datatype": "id" },
+      {
+        "name": "type",
+        "label": "Claim Type",
+        "type": "link",
+        "key": "id",
+        "class": "acqclt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "lineitem_detail",
+        "label": "Lineitem Detail",
+        "type": "link",
+        "key": "id",
+        "class": "acqlid",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "acqcle": {
+    "name": "acqcle",
+    "label": "Claim Event",
+    "table": "acq.claim_event",
+    "pkey": "id",
+    "pkey_sequence": "acq.claim_event_id_seq",
+    "fields": [
+      { "name": "id", "label": "Claim Event ID", "datatype": "id" },
+      {
+        "name": "type",
+        "label": "Claim Event Type",
+        "type": "link",
+        "key": "id",
+        "class": "acqclet",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "claim",
+        "label": "Claim ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqcl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "event_date", "label": "Event Date", "datatype": "timestamp" },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "label": "Note", "datatype": "text" }
+    ]
+  },
+  "acqclet": {
+    "name": "acqclet",
+    "label": "Claim Event Type",
+    "table": "acq.claim_event_type",
+    "pkey": "id",
+    "pkey_sequence": "acq.claim_event_type_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Claim Event Type ID",
+        "selector": "code",
+        "datatype": "id"
+      },
+      {
+        "name": "org_unit",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      { "name": "description", "label": "Description", "datatype": "text" },
+      {
+        "name": "library_initiated",
+        "label": "Library Initiated",
+        "datatype": "bool"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_CLAIM_EVENT_TYPE"] },
+      "retrieve": {
+        "perms": [
+          "ADMIN_ACQ_CLAIM_EVENT_TYPE",
+          "ADMIN_ACQ_CLAIM",
+          "VIEW_CLAIM",
+          "MANAGE_CLAIM"
+        ]
+      },
+      "update": { "perms": ["ADMIN_ACQ_CLAIM_EVENT_TYPE"] },
+      "delete": { "perms": ["ADMIN_ACQ_CLAIM_EVENT_TYPE"] }
+    }
+  },
+  "acqclp": {
+    "name": "acqclp",
+    "label": "Claim Policy",
+    "table": "acq.claim_policy",
+    "pkey": "id",
+    "pkey_sequence": "acq.claim_policy_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      {
+        "name": "org_unit",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "name", "label": "Claim Policy Name", "datatype": "text" },
+      { "name": "description", "label": "Description", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CLAIM_POLICY"] },
+      "retrieve": { "perms": ["ADMIN_CLAIM_POLICY", "VIEW_PROVIDER"] },
+      "update": { "perms": ["ADMIN_CLAIM_POLICY"] },
+      "delete": { "perms": ["ADMIN_CLAIM_POLICY"] }
+    }
+  },
+  "acqclpa": {
+    "name": "acqclpa",
+    "label": "Claim Policy Action",
+    "table": "acq.claim_policy_action",
+    "pkey": "id",
+    "pkey_sequence": "acq.claim_policy_action_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "action", "datatype": "id" },
+      {
+        "name": "claim_policy",
+        "label": "Claim Policy ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqclp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "action_interval",
+        "label": "Action Interval",
+        "datatype": "interval"
+      },
+      {
+        "name": "action",
+        "label": "Action (Event Type)",
+        "type": "link",
+        "key": "id",
+        "class": "acqclet",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CLAIM_POLICY"] },
+      "retrieve": { "perms": ["ADMIN_CLAIM_POLICY", "VIEW_PROVIDER"] },
+      "update": { "perms": ["ADMIN_CLAIM_POLICY"] },
+      "delete": { "perms": ["ADMIN_CLAIM_POLICY"] }
+    }
+  },
+  "acqclt": {
+    "name": "acqclt",
+    "label": "Claim Type",
+    "table": "acq.claim_type",
+    "pkey": "id",
+    "pkey_sequence": "acq.claim_type_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Claim Type ID",
+        "selector": "code",
+        "datatype": "id"
+      },
+      {
+        "name": "org_unit",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      { "name": "description", "label": "Description", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_CLAIM_TYPE"] },
+      "retrieve": {
+        "perms": [
+          "ADMIN_ACQ_CLAIM_TYPE",
+          "ADMIN_ACQ_CLAIM",
+          "VIEW_CLAIM",
+          "MANAGE_CLAIM"
+        ]
+      },
+      "update": { "perms": ["ADMIN_ACQ_CLAIM_TYPE"] },
+      "delete": { "perms": ["ADMIN_ACQ_CLAIM_TYPE"] }
+    }
+  },
+  "acqcr": {
+    "name": "acqcr",
+    "label": "Cancel Reason",
+    "table": "acq.cancel_reason",
+    "pkey": "id",
+    "pkey_sequence": "acq.cancel_reason_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "label", "datatype": "id" },
+      {
+        "name": "org_unit",
+        "label": "Using Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "keep_debits", "label": "Keep Debits?", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_CANCEL_CAUSE"] },
+      "retrieve": { "perms": ["STAFF_LOGIN"] },
+      "update": { "perms": ["ADMIN_ACQ_CANCEL_CAUSE"] },
+      "delete": { "perms": ["ADMIN_ACQ_CANCEL_CAUSE"] }
+    }
+  },
+  "acqct": {
+    "name": "acqct",
+    "label": "Currency Type",
+    "table": "acq.currency_type",
+    "pkey": "code",
+    "fields": [
+      {
+        "name": "code",
+        "label": "Currency Code",
+        "selector": "label",
+        "datatype": "text"
+      },
+      {
+        "name": "label",
+        "label": "Currency Label",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CURRENCY_TYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_CURRENCY_TYPE"] },
+      "delete": { "perms": ["ADMIN_CURRENCY_TYPE"] }
+    }
+  },
+  "acqda": {
+    "name": "acqda",
+    "label": "Debit Attribution",
+    "table": "acq.debit_attribution",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "label": "Debit Attribution ID", "datatype": "id" },
+      {
+        "name": "fund_debit",
+        "label": "Fund Debit",
+        "type": "link",
+        "key": "id",
+        "class": "acqfdeb",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "debit_amount", "label": "Debit Amount", "datatype": "money" },
+      {
+        "name": "funding_source_credit",
+        "label": "Funding Source Credit",
+        "type": "link",
+        "key": "id",
+        "class": "acqfscred",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "credit_amount", "label": "Credit Amount", "datatype": "money" }
+    ]
+  },
+  "acqdf": {
+    "name": "acqdf",
+    "label": "Distribution Formula",
+    "table": "acq.distribution_formula",
+    "pkey": "id",
+    "pkey_sequence": "acq.distribution_formula_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Formula ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "owner",
+        "label": "Formula Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "name", "label": "Formula Name", "datatype": "text" },
+      { "name": "skip_count", "label": "Skip Count", "datatype": "int" },
+      {
+        "name": "entries",
+        "label": "Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "formula",
+        "class": "acqdfe",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "use_count",
+        "label": "Use Count",
+        "virtual": true,
+        "datatype": "int"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_DISTRIB_FORMULA"] },
+      "retrieve": {
+        "perms": ["CREATE_PURCHASE_ORDER", "ADMIN_ACQ_DISTRIB_FORMULA"]
+      },
+      "update": { "perms": ["ADMIN_ACQ_DISTRIB_FORMULA"] },
+      "delete": { "perms": ["ADMIN_ACQ_DISTRIB_FORMULA"] }
+    }
+  },
+  "acqdfa": {
+    "name": "acqdfa",
+    "label": "Distribution Formula Application",
+    "table": "acq.distribution_formula_application",
+    "pkey": "id",
+    "pkey_sequence": "acq.distribution_formula_application_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_time",
+        "label": "Create Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "formula",
+        "label": "Distribution Formula",
+        "type": "link",
+        "key": "id",
+        "class": "acqdf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "lineitem",
+        "label": "Lineitem",
+        "type": "link",
+        "key": "id",
+        "class": "jub",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_PURCHASE_ORDER"] },
+      "retrieve": { "perms": ["CREATE_PURCHASE_ORDER"] },
+      "update": { "perms": ["CREATE_PURCHASE_ORDER"] },
+      "delete": { "perms": ["CREATE_PURCHASE_ORDER"] }
+    }
+  },
+  "acqdfe": {
+    "name": "acqdfe",
+    "label": "Distribution Formula Entry",
+    "table": "acq.distribution_formula_entry",
+    "pkey": "id",
+    "pkey_sequence": "acq.distribution_formula_entry_id_seq",
+    "fields": [
+      { "name": "id", "label": "Entry ID", "datatype": "id" },
+      {
+        "name": "formula",
+        "label": "Formula ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqdf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "position", "label": "Position", "datatype": "int" },
+      { "name": "item_count", "label": "Item Count", "datatype": "int" },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "location",
+        "label": "Location",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "fund",
+        "label": "Fund",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_modifier",
+        "label": "Circulation Modifier",
+        "type": "link",
+        "key": "code",
+        "class": "ccm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "collection_code",
+        "label": "Collection Code",
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_DISTRIB_FORMULA"] },
+      "retrieve": { "perms": ["ADMIN_ACQ_DISTRIB_FORMULA"] },
+      "update": { "perms": ["ADMIN_ACQ_DISTRIB_FORMULA"] },
+      "delete": { "perms": ["ADMIN_ACQ_DISTRIB_FORMULA"] }
+    }
+  },
+  "acqedi": {
+    "name": "acqedi",
+    "label": "EDI Account",
+    "table": "acq.edi_account",
+    "pkey": "id",
+    "pkey_sequence": "config.remote_account_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "EDI Account ID",
+        "selector": "label",
+        "datatype": "id"
+      },
+      { "name": "label", "label": "Label", "datatype": "text" },
+      { "name": "host", "label": "Host", "datatype": "text" },
+      { "name": "username", "label": "Username", "datatype": "text" },
+      { "name": "password", "label": "Password", "datatype": "text" },
+      { "name": "account", "label": "Account", "datatype": "text" },
+      { "name": "path", "label": "Path", "datatype": "text" },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "last_activity",
+        "label": "Last Activity",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "provider",
+        "label": "Provider",
+        "type": "link",
+        "key": "id",
+        "class": "acqpro",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "in_dir", "label": "Incoming Directory", "datatype": "text" },
+      {
+        "name": "vendacct",
+        "label": "Vendor Account Number",
+        "datatype": "text"
+      },
+      {
+        "name": "vendcode",
+        "label": "Vendor Assigned Code",
+        "datatype": "text"
+      },
+      {
+        "name": "attr_set",
+        "label": "EDI Attribute Set",
+        "type": "link",
+        "key": "id",
+        "class": "aeas",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "use_attrs", "label": "Use EDI Attributes", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_PROVIDER"] },
+      "retrieve": { "perms": ["ADMIN_PROVIDER"] },
+      "update": { "perms": ["ADMIN_PROVIDER"] },
+      "delete": { "perms": ["ADMIN_PROVIDER"] }
+    }
+  },
+  "acqedim": {
+    "name": "acqedim",
+    "label": "EDI Message",
+    "table": "acq.edi_message",
+    "pkey": "id",
+    "pkey_sequence": "acq.edi_message_id_seq",
+    "fields": [
+      { "name": "id", "label": "EDI Message ID", "datatype": "id" },
+      {
+        "name": "account",
+        "label": "EDI Account",
+        "type": "link",
+        "key": "id",
+        "class": "acqedi",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "remote_file", "label": "Filename", "datatype": "text" },
+      {
+        "name": "create_time",
+        "label": "Time Created",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "translate_time",
+        "label": "Time Translated",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "process_time",
+        "label": "Time Processed",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "error_time",
+        "label": "Time of Error",
+        "datatype": "timestamp"
+      },
+      { "name": "status", "label": "Status", "datatype": "text" },
+      { "name": "edi", "label": "EDI Message Body", "datatype": "text" },
+      { "name": "jedi", "label": "JEDI Message Body", "datatype": "text" },
+      { "name": "error", "label": "Error", "datatype": "text" },
+      {
+        "name": "purchase_order",
+        "label": "Purchase Order",
+        "type": "link",
+        "key": "id",
+        "class": "acqpo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "message_type", "label": "Message Type", "datatype": "text" }
+    ],
+    "permacrud": {
+      "retrieve": {
+        "perms": ["ADMIN_PROVIDER", "MANAGE_PROVIDER", "VIEW_PROVIDER"]
+      },
+      "update": {
+        "perms": ["ADMIN_PROVIDER", "MANAGE_PROVIDER", "VIEW_PROVIDER"]
+      },
+      "delete": {
+        "perms": ["ADMIN_PROVIDER", "MANAGE_PROVIDER", "VIEW_PROVIDER"]
+      }
+    }
+  },
+  "acqexr": {
+    "name": "acqexr",
+    "label": "Exchange Rate",
+    "table": "acq.exchange_rate",
+    "pkey": "id",
+    "pkey_sequence": "acq.exchange_rate_id_seq",
+    "fields": [
+      { "name": "id", "label": "Exchange Rate ID", "datatype": "id" },
+      {
+        "name": "from_currency",
+        "label": "From Currency",
+        "type": "link",
+        "key": "code",
+        "class": "acqct",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "to_currency",
+        "label": "To Currency",
+        "type": "link",
+        "key": "code",
+        "class": "acqct",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "ratio", "label": "Ratio", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CURRENCY_TYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_CURRENCY_TYPE"] },
+      "delete": { "perms": ["ADMIN_CURRENCY_TYPE"] }
+    }
+  },
+  "acqf": {
+    "name": "acqf",
+    "label": "Fund",
+    "table": "acq.fund",
+    "pkey": "id",
+    "pkey_sequence": "acq.fund_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Fund ID",
+        "selector": "code",
+        "datatype": "id"
+      },
+      {
+        "name": "org",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "year", "label": "Year", "datatype": "int" },
+      {
+        "name": "currency_type",
+        "label": "Currency Type",
+        "type": "link",
+        "key": "code",
+        "class": "acqct",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      { "name": "rollover", "label": "Rollover", "datatype": "bool" },
+      { "name": "propagate", "label": "Propagate", "datatype": "bool" },
+      { "name": "active", "label": "Active", "datatype": "bool" },
+      {
+        "name": "balance_warning_percent",
+        "label": "Balance Warning Percent",
+        "datatype": "int"
+      },
+      {
+        "name": "balance_stop_percent",
+        "label": "Balance Stop Percent",
+        "datatype": "int"
+      },
+      {
+        "name": "summary",
+        "label": "Summary",
+        "virtual": true,
+        "datatype": "text"
+      },
+      {
+        "name": "allocations",
+        "label": "Allocations",
+        "virtual": true,
+        "type": "link",
+        "key": "fund",
+        "class": "acqfa",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "debits",
+        "label": "Debits",
+        "virtual": true,
+        "type": "link",
+        "key": "fund",
+        "class": "acqfdeb",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "tags",
+        "label": "Tags",
+        "virtual": true,
+        "type": "link",
+        "key": "fund",
+        "class": "acqftm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "allocation_total",
+        "label": "Allocation Total",
+        "virtual": true,
+        "type": "link",
+        "key": "fund",
+        "class": "acqfat",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "debit_total",
+        "label": "Debit Total",
+        "virtual": true,
+        "type": "link",
+        "key": "fund",
+        "class": "acqfdt",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "encumbrance_total",
+        "label": "Encumbrance Total",
+        "virtual": true,
+        "type": "link",
+        "key": "fund",
+        "class": "acqfet",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "spent_total",
+        "label": "Spent Total",
+        "virtual": true,
+        "type": "link",
+        "key": "fund",
+        "class": "acqfst",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "combined_balance",
+        "label": "Combined Balance",
+        "virtual": true,
+        "type": "link",
+        "key": "fund",
+        "class": "acqfcb",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "spent_balance",
+        "label": "Spent Balance",
+        "virtual": true,
+        "type": "link",
+        "key": "fund",
+        "class": "acqfsb",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_FUND"] },
+      "retrieve": { "perms": ["ADMIN_ACQ_FUND", "VIEW_FUND", "MANAGE_FUND"] },
+      "update": { "perms": ["ADMIN_ACQ_FUND"] },
+      "delete": { "perms": ["ADMIN_ACQ_FUND"] }
+    }
+  },
+  "acqfa": {
+    "name": "acqfa",
+    "label": "Fund Allocation",
+    "table": "acq.fund_allocation",
+    "pkey": "id",
+    "pkey_sequence": "acq.fund_allocation_id_seq",
+    "fields": [
+      { "name": "id", "label": "Allocation ID", "datatype": "id" },
+      {
+        "name": "fund",
+        "label": "Fund",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "funding_source",
+        "label": "Funding Source",
+        "type": "link",
+        "key": "id",
+        "class": "acqfs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      {
+        "name": "allocator",
+        "label": "Allocating User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      { "name": "create_time", "label": "Create Time", "datatype": "timestamp" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_FUND"] },
+      "retrieve": { "perms": ["ADMIN_ACQ_FUND"] },
+      "update": { "perms": ["ADMIN_ACQ_FUND"] },
+      "delete": { "perms": ["ADMIN_ACQ_FUND"] }
+    }
+  },
+  "acqfap": {
+    "name": "acqfap",
+    "label": "Fund Allocation Percent",
+    "table": "acq.fund_allocation_percent",
+    "pkey": "id",
+    "pkey_sequence": "acq.fund_allocation_percent_id_seq",
+    "fields": [
+      { "name": "id", "label": "Allocation ID", "datatype": "id" },
+      {
+        "name": "funding_source",
+        "label": "Funding Source",
+        "type": "link",
+        "key": "id",
+        "class": "acqfs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "org",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "fund_code", "label": "Fund Code", "datatype": "text" },
+      { "name": "percent", "label": "Percent", "datatype": "float" },
+      {
+        "name": "allocator",
+        "label": "Allocating User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      { "name": "create_time", "label": "Create Time", "datatype": "timestamp" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_FUND_ALLOCATION_PERCENT"] },
+      "retrieve": { "perms": ["VIEW_ACQ_FUND_ALLOCATION_PERCENT"] },
+      "update": { "perms": ["ADMIN_ACQ_FUND_ALLOCATION_PERCENT"] },
+      "delete": { "perms": ["ADMIN_ACQ_FUND_ALLOCATION_PERCENT"] }
+    }
+  },
+  "acqfat": {
+    "name": "acqfat",
+    "label": "Fund Allocation Total",
+    "table": "acq.fund_allocation_total",
+    "pkey": "fund",
+    "fields": [
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "amount",
+        "label": "Total Allocation Amount",
+        "datatype": "money"
+      }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["ADMIN_ACQ_FUND", "VIEW_FUND", "MANAGE_FUND"] }
+    }
+  },
+  "acqfc": {
+    "name": "acqfc",
+    "label": "Fiscal Calendar",
+    "table": "acq.fiscal_calendar",
+    "pkey": "id",
+    "pkey_sequence": "acq.fiscal_calendar_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Fiscal Calendar ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      { "name": "name", "label": "Fiscal Calendar Name", "datatype": "text" },
+      {
+        "name": "years",
+        "label": "Years",
+        "virtual": true,
+        "type": "link",
+        "key": "calendar",
+        "class": "acqfy",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_FISCAL_YEAR"] },
+      "retrieve": { "perms": ["STAFF_LOGIN"] },
+      "update": { "perms": ["ADMIN_ACQ_FISCAL_YEAR"] },
+      "delete": { "perms": ["ADMIN_ACQ_FISCAL_YEAR"] }
+    }
+  },
+  "acqfcb": {
+    "name": "acqfcb",
+    "label": "Fund Combined Balance",
+    "table": "acq.fund_combined_balance",
+    "pkey": "fund",
+    "fields": [
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "amount",
+        "label": "Balance after Spent and Encumbered",
+        "datatype": "money"
+      }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["ADMIN_ACQ_FUND", "VIEW_FUND", "MANAGE_FUND"] }
+    }
+  },
+  "acqfdeb": {
+    "name": "acqfdeb",
+    "label": "Debit From Fund",
+    "table": "acq.fund_debit",
+    "pkey": "id",
+    "pkey_sequence": "acq.fund_debit_id_seq",
+    "fields": [
+      { "name": "id", "label": "Debit ID", "datatype": "id" },
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "origin_amount",
+        "label": "Origin Amount",
+        "datatype": "money"
+      },
+      {
+        "name": "origin_currency_type",
+        "label": "Origin Currency",
+        "type": "link",
+        "key": "code",
+        "class": "acqct",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      { "name": "encumbrance", "label": "Encumbrance", "datatype": "bool" },
+      { "name": "debit_type", "label": "Debit Type", "datatype": "text" },
+      {
+        "name": "create_time",
+        "label": "Create Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "invoice_entry",
+        "label": "Invoice Entry",
+        "type": "link",
+        "key": "id",
+        "class": "acqie",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_FUND"] },
+      "retrieve": { "perms": ["ADMIN_ACQ_FUND"] },
+      "update": { "perms": ["ADMIN_ACQ_FUND"] },
+      "delete": { "perms": ["ADMIN_ACQ_FUND"] }
+    }
+  },
+  "acqfdt": {
+    "name": "acqfdt",
+    "label": "Total Debit from Fund",
+    "table": "acq.fund_debit_total",
+    "pkey": "fund",
+    "fields": [
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Total Debit Amount", "datatype": "money" }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["ADMIN_ACQ_FUND", "VIEW_FUND", "MANAGE_FUND"] }
+    }
+  },
+  "acqfet": {
+    "name": "acqfet",
+    "label": "Total Fund Encumbrance",
+    "table": "acq.fund_encumbrance_total",
+    "pkey": "fund",
+    "fields": [
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "amount",
+        "label": "Total Encumbrance Amount",
+        "datatype": "money"
+      }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["ADMIN_ACQ_FUND", "VIEW_FUND", "MANAGE_FUND"] }
+    }
+  },
+  "acqfs": {
+    "name": "acqfs",
+    "label": "Funding Source",
+    "table": "acq.funding_source",
+    "pkey": "id",
+    "pkey_sequence": "acq.funding_source_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Funding Source ID",
+        "selector": "code",
+        "datatype": "id"
+      },
+      {
+        "name": "name",
+        "label": "Funding Source Name",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "currency_type",
+        "label": "Currency",
+        "type": "link",
+        "key": "code",
+        "class": "acqct",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      {
+        "name": "summary",
+        "label": "Summary",
+        "virtual": true,
+        "datatype": "text"
+      },
+      {
+        "name": "allocations",
+        "label": "Allocations",
+        "virtual": true,
+        "type": "link",
+        "key": "funding_source",
+        "class": "acqfa",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "credits",
+        "label": "Credits",
+        "virtual": true,
+        "type": "link",
+        "key": "funding_source",
+        "class": "acqfscred",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "fund_alloc_pcts",
+        "label": "Fund Allocation Percentages",
+        "virtual": true,
+        "type": "link",
+        "key": "funding_source",
+        "class": "acqfap",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_FUNDING_SOURCE"] },
+      "retrieve": {
+        "perms": [
+          "ADMIN_FUNDING_SOURCE",
+          "MANAGE_FUNDING_SOURCE",
+          "VIEW_FUNDING_SOURCE"
+        ]
+      },
+      "update": { "perms": ["ADMIN_FUNDING_SOURCE"] },
+      "delete": { "perms": ["ADMIN_FUNDING_SOURCE"] }
+    }
+  },
+  "acqfsb": {
+    "name": "acqfsb",
+    "label": "Fund Spent Balance",
+    "table": "acq.fund_spent_balance",
+    "pkey": "fund",
+    "fields": [
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Balance after Spent", "datatype": "money" }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["ADMIN_ACQ_FUND", "VIEW_FUND", "MANAGE_FUND"] }
+    }
+  },
+  "acqfscred": {
+    "name": "acqfscred",
+    "label": "Credit to Funding Source",
+    "table": "acq.funding_source_credit",
+    "pkey": "id",
+    "pkey_sequence": "acq.funding_source_credit_id_seq",
+    "fields": [
+      { "name": "id", "label": "Credit ID", "datatype": "id" },
+      {
+        "name": "funding_source",
+        "label": "Funding Source ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqfs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "deadline_date",
+        "label": "Deadline Date",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "effective_date",
+        "label": "Effective Date",
+        "datatype": "timestamp"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_FUNDING_SOURCE"] },
+      "retrieve": { "perms": ["ADMIN_FUNDING_SOURCE"] },
+      "update": { "perms": ["ADMIN_FUNDING_SOURCE"] },
+      "delete": { "perms": ["ADMIN_FUNDING_SOURCE"] }
+    }
+  },
+  "acqfsrcat": {
+    "name": "acqfsrcat",
+    "label": "Total Allocation to Funding Source",
+    "table": "acq.funding_source_allocation_total",
+    "pkey": "funding_source",
+    "fields": [
+      {
+        "name": "funding_source",
+        "label": "Funding Source",
+        "type": "link",
+        "key": "id",
+        "class": "acqfs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "amount",
+        "label": "Total Allocated from Funding Source",
+        "datatype": "money"
+      }
+    ]
+  },
+  "acqfsrcb": {
+    "name": "acqfsrcb",
+    "label": "Funding Source Balance",
+    "table": "acq.funding_source_balance",
+    "pkey": "funding_source",
+    "fields": [
+      {
+        "name": "funding_source",
+        "label": "Funding Source",
+        "type": "link",
+        "key": "id",
+        "class": "acqfs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Balance Remaining", "datatype": "money" }
+    ]
+  },
+  "acqfsrcct": {
+    "name": "acqfsrcct",
+    "label": "Total Credit to Funding Source",
+    "table": "acq.funding_source_credit_total",
+    "pkey": "funding_source",
+    "fields": [
+      {
+        "name": "funding_source",
+        "label": "Funding Source",
+        "type": "link",
+        "key": "id",
+        "class": "acqfs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "amount",
+        "label": "Total Credits to Funding Source",
+        "datatype": "money"
+      }
+    ]
+  },
+  "acqfst": {
+    "name": "acqfst",
+    "label": "Total Spent from Fund",
+    "table": "acq.fund_spent_total",
+    "pkey": "fund",
+    "fields": [
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Total Spent Amount", "datatype": "money" }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["ADMIN_ACQ_FUND", "VIEW_FUND", "MANAGE_FUND"] }
+    }
+  },
+  "acqfsum": {
+    "name": "acqfsum",
+    "label": "Fund Summary",
+    "core": true,
+    "source": "( SELECT acqf.*, COALESCE(acqfat.amount, 0.00) AS allocated_total, COALESCE(acqfst.amount, 0.00) AS spent_total, COALESCE(acqfet.amount, 0.00) AS encumbrance_total, COALESCE(acqfcb.amount, 0.00) AS combined_balance FROM acq.fund acqf LEFT JOIN acq.fund_allocation_total acqfat ON (acqfat.fund = acqf.id) LEFT JOIN acq.fund_spent_total acqfst ON (acqfst.fund = acqf.id) LEFT JOIN acq.fund_encumbrance_total acqfet ON (acqfet.fund = acqf.id) LEFT JOIN acq.fund_combined_balance acqfcb ON (acqfcb.fund = acqf.id) )",
+    "pkey": "id",
+    "pkey_sequence": "acq.fund_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Fund ID",
+        "selector": "code",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "org",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "year", "label": "Year", "datatype": "int" },
+      {
+        "name": "currency_type",
+        "label": "Currency Type",
+        "type": "link",
+        "key": "code",
+        "class": "acqct",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      { "name": "rollover", "label": "Rollover", "datatype": "bool" },
+      { "name": "propagate", "label": "Propagate", "datatype": "bool" },
+      { "name": "active", "label": "Active", "datatype": "bool" },
+      {
+        "name": "balance_warning_percent",
+        "label": "Balance Warning Percent",
+        "datatype": "int"
+      },
+      {
+        "name": "balance_stop_percent",
+        "label": "Balance Stop Percent",
+        "datatype": "int"
+      },
+      {
+        "name": "allocated_total",
+        "label": "Total Allocated",
+        "datatype": "money"
+      },
+      { "name": "spent_total", "label": "Total Spent", "datatype": "money" },
+      {
+        "name": "encumbrance_total",
+        "label": "Total Encumbered",
+        "datatype": "money"
+      },
+      {
+        "name": "combined_balance",
+        "label": "Remaining Balance",
+        "datatype": "money"
+      }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["ADMIN_ACQ_FUND", "VIEW_FUND", "MANAGE_FUND"] }
+    }
+  },
+  "acqft": {
+    "name": "acqft",
+    "label": "Fund Tag",
+    "table": "acq.fund_tag",
+    "pkey": "id",
+    "pkey_sequence": "acq.fund_tag_id_seq",
+    "fields": [
+      { "name": "id", "label": "Fund Tag ID", "datatype": "id" },
+      {
+        "name": "owner",
+        "label": "Fund Tag Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "name", "label": "Fund Tag Name", "datatype": "text" },
+      {
+        "name": "map_entries",
+        "label": "Map Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "fund",
+        "class": "acqftm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_FUND_TAG"] },
+      "retrieve": {
+        "perms": [
+          "ADMIN_ACQ_FUND_TAG",
+          "ADMIN_ACQ_FUND",
+          "VIEW_FUND",
+          "MANAGE_FUND"
+        ]
+      },
+      "update": { "perms": ["ADMIN_ACQ_FUND_TAG"] },
+      "delete": { "perms": ["ADMIN_ACQ_FUND_TAG"] }
+    }
+  },
+  "acqftm": {
+    "name": "acqftm",
+    "label": "Fund Tag Map",
+    "table": "acq.fund_tag_map",
+    "pkey": "id",
+    "pkey_sequence": "acq.fund_tag_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "Map Entry ID", "datatype": "id" },
+      {
+        "name": "fund",
+        "label": "Fund ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "tag",
+        "label": "Tag ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqft",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_FUND_TAG"] },
+      "retrieve": {
+        "perms": [
+          "ADMIN_ACQ_FUND_TAG",
+          "ADMIN_ACQ_FUND",
+          "VIEW_FUND",
+          "MANAGE_FUND"
+        ]
+      },
+      "update": { "perms": ["ADMIN_ACQ_FUND_TAG"] },
+      "delete": { "perms": ["ADMIN_ACQ_FUND_TAG"] }
+    }
+  },
+  "acqftr": {
+    "name": "acqftr",
+    "label": "Fund Transfer",
+    "table": "acq.fund_transfer",
+    "pkey": "id",
+    "pkey_sequence": "acq.fund_transfer_id_seq",
+    "fields": [
+      { "name": "id", "label": "Fund Transfer ID", "datatype": "id" },
+      {
+        "name": "src_fund",
+        "label": "Source Fund",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "src_amount", "label": "Source Amount", "datatype": "money" },
+      {
+        "name": "dest_fund",
+        "label": "Destination Fund",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "dest_amount",
+        "label": "Destination Amount",
+        "datatype": "money"
+      },
+      {
+        "name": "transfer_time",
+        "label": "Transfer Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "transfer_user",
+        "label": "Transfer User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "funding_source_credit",
+        "label": "Funding Source Credit ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqfscred",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "acqfy": {
+    "name": "acqfy",
+    "label": "Fiscal Year",
+    "table": "acq.fiscal_year",
+    "pkey": "id",
+    "pkey_sequence": "acq.fiscal_year_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Fiscal Year ID",
+        "selector": "year",
+        "datatype": "id"
+      },
+      {
+        "name": "calendar",
+        "label": "Calendar",
+        "type": "link",
+        "key": "id",
+        "class": "acqfc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "year", "label": "Fiscal Year", "datatype": "int" },
+      { "name": "year_begin", "label": "Year Begin", "datatype": "timestamp" },
+      { "name": "year_end", "label": "Year End", "datatype": "timestamp" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_FISCAL_YEAR"] },
+      "retrieve": { "perms": ["STAFF_LOGIN"] },
+      "update": { "perms": ["ADMIN_ACQ_FISCAL_YEAR"] },
+      "delete": { "perms": ["ADMIN_ACQ_FISCAL_YEAR"] }
+    }
+  },
+  "acqie": {
+    "name": "acqie",
+    "label": "Invoice Entry",
+    "table": "acq.invoice_entry",
+    "pkey": "id",
+    "pkey_sequence": "acq.invoice_entry_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "invoice",
+        "label": "Invoice",
+        "type": "link",
+        "key": "id",
+        "class": "acqinv",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "purchase_order",
+        "label": "Purchase Order",
+        "type": "link",
+        "key": "id",
+        "class": "acqpo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "lineitem",
+        "label": "PO Line Item",
+        "type": "link",
+        "key": "id",
+        "class": "jub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "inv_item_count",
+        "label": "Invoice Item Count",
+        "datatype": "int"
+      },
+      {
+        "name": "phys_item_count",
+        "label": "Physical Item Count",
+        "datatype": "int"
+      },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "billed_per_item",
+        "label": "Billed Cost per Item",
+        "datatype": "bool"
+      },
+      { "name": "cost_billed", "label": "Cost Billed", "datatype": "money" },
+      { "name": "actual_cost", "label": "Actual Cost", "datatype": "money" },
+      { "name": "amount_paid", "label": "Amount Paid", "datatype": "money" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_INVOICE"] },
+      "retrieve": { "perms": ["ADMIN_INVOICE"] },
+      "update": { "perms": ["ADMIN_INVOICE"] },
+      "delete": { "perms": ["ADMIN_INVOICE"] }
+    }
+  },
+  "acqii": {
+    "name": "acqii",
+    "label": "Non-bibliographic Invoice Item",
+    "table": "acq.invoice_item",
+    "pkey": "id",
+    "pkey_sequence": "acq.invoice_item_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "invoice",
+        "label": "Invoice",
+        "type": "link",
+        "key": "id",
+        "class": "acqinv",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "purchase_order",
+        "label": "Purchase Order",
+        "type": "link",
+        "key": "id",
+        "class": "acqpo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "fund_debit",
+        "label": "Fund Debit",
+        "type": "link",
+        "key": "id",
+        "class": "acqfdeb",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "inv_item_type",
+        "label": "Invoice Item Type",
+        "type": "link",
+        "key": "code",
+        "class": "aiit",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "title", "label": "Title or Item Name", "datatype": "text" },
+      { "name": "author", "label": "Author", "datatype": "text" },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      { "name": "cost_billed", "label": "Cost Billed", "datatype": "money" },
+      { "name": "actual_cost", "label": "Actual Cost", "datatype": "money" },
+      {
+        "name": "fund",
+        "label": "Fund",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount_paid", "label": "Amount Paid", "datatype": "money" },
+      {
+        "name": "po_item",
+        "label": "Purchase Order Item",
+        "type": "link",
+        "key": "id",
+        "class": "acqpoi",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "target", "label": "Target", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_INVOICE"] },
+      "retrieve": { "perms": ["ADMIN_INVOICE"] },
+      "update": { "perms": ["ADMIN_INVOICE"] },
+      "delete": { "perms": ["ADMIN_INVOICE"] }
+    }
+  },
+  "acqim": {
+    "name": "acqim",
+    "label": "Invoice Method used by Vendor",
+    "table": "acq.invoice_method",
+    "pkey": "code",
+    "fields": [
+      { "name": "code", "label": "Code", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Label", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_INVOICE_METHOD", "CREATE_INVOICE_METHOD"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_INVOICE_METHOD", "UPDATE_INVOICE_METHOD"] },
+      "delete": { "perms": ["ADMIN_INVOICE_METHOD", "DELETE_INVOICE_METHOD"] }
+    }
+  },
+  "acqinv": {
+    "name": "acqinv",
+    "label": "Invoice",
+    "table": "acq.invoice",
+    "pkey": "id",
+    "pkey_sequence": "acq.invoice_id_seq",
+    "fields": [
+      { "name": "id", "label": "Internal Invoice ID", "datatype": "id" },
+      {
+        "name": "receiver",
+        "label": "Receiver",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "provider",
+        "label": "Provider",
+        "type": "link",
+        "key": "id",
+        "class": "acqpro",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "shipper",
+        "label": "Shipper",
+        "type": "link",
+        "key": "id",
+        "class": "acqpro",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "recv_date", "label": "Invoice Date", "datatype": "timestamp" },
+      {
+        "name": "recv_method",
+        "label": "Receive Method",
+        "type": "link",
+        "key": "code",
+        "class": "acqim",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "inv_type", "label": "Invoice Type", "datatype": "text" },
+      { "name": "inv_ident", "label": "Vendor Invoice ID", "datatype": "text" },
+      { "name": "payment_auth", "label": "Payment Auth", "datatype": "text" },
+      {
+        "name": "payment_method",
+        "label": "Payment Method",
+        "type": "link",
+        "key": "code",
+        "class": "acqipm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      { "name": "close_date", "label": "Close Date", "datatype": "timestamp" },
+      {
+        "name": "closed_by",
+        "label": "Closed By",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "entries",
+        "label": "Invoice Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "invoice",
+        "class": "acqie",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "items",
+        "label": "Invoice Items",
+        "virtual": true,
+        "type": "link",
+        "key": "invoice",
+        "class": "acqii",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_INVOICE"] },
+      "retrieve": { "perms": ["CREATE_INVOICE", "VIEW_INVOICE"] },
+      "update": { "perms": ["CREATE_INVOICE"] },
+      "delete": { "perms": ["CREATE_INVOICE"] }
+    }
+  },
+  "acqipm": {
+    "name": "acqipm",
+    "label": "Invoice Payment Method",
+    "table": "acq.invoice_payment_method",
+    "pkey": "code",
+    "fields": [
+      { "name": "code", "label": "Code", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Name", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_INVOICE_PAYMENT_METHOD"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_INVOICE_PAYMENT_METHOD"] },
+      "delete": { "perms": ["ADMIN_INVOICE_PAYMENT_METHOD"] }
+    }
+  },
+  "acqlia": {
+    "name": "acqlia",
+    "label": "Line Item Attribute",
+    "table": "acq.lineitem_attr",
+    "pkey": "id",
+    "pkey_sequence": "acq.lineitem_attr_id_seq",
+    "fields": [
+      { "name": "id", "label": "Attribute Value ID", "datatype": "id" },
+      {
+        "name": "lineitem",
+        "label": "Lineitem",
+        "type": "link",
+        "key": "id",
+        "class": "jub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "attr_type", "label": "Type", "datatype": "text" },
+      { "name": "attr_name", "label": "Name", "datatype": "text" },
+      { "name": "attr_value", "label": "Value", "datatype": "text" },
+      {
+        "name": "definition",
+        "label": "Definition",
+        "type": "link",
+        "key": "id",
+        "class": "acqliad",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "order_ident", "label": "Order Identifier", "datatype": "bool" }
+    ]
+  },
+  "acqliad": {
+    "name": "acqliad",
+    "label": "Line Item Attribute Definition",
+    "table": "acq.lineitem_attr_definition",
+    "pkey": "id",
+    "pkey_sequence": "acq.lineitem_attr_definition_id_seq",
+    "fields": [
+      { "name": "id", "label": "Definition ID", "datatype": "id" },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "ident", "label": "Is Identifier?", "datatype": "bool" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "acqliat": {
+    "name": "acqliat",
+    "label": "Line Item Alert Text",
+    "table": "acq.lineitem_alert_text",
+    "pkey": "id",
+    "pkey_sequence": "acq.lineitem_alert_text_id_seq",
+    "fields": [
+      { "name": "id", "label": "Alert Text ID", "datatype": "id" },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      { "name": "description", "label": "Description", "datatype": "text" },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ACQ_LINEITEM_ALERT_TEXT"] },
+      "retrieve": { "perms": ["STAFF_LOGIN"] },
+      "update": { "perms": ["ADMIN_ACQ_LINEITEM_ALERT_TEXT"] },
+      "delete": { "perms": ["ADMIN_ACQ_LINEITEM_ALERT_TEXT"] }
+    }
+  },
+  "acqlid": {
+    "name": "acqlid",
+    "label": "Line Item Detail",
+    "table": "acq.lineitem_detail",
+    "pkey": "id",
+    "pkey_sequence": "acq.lineitem_detail_id_seq",
+    "fields": [
+      { "name": "id", "label": "Item Detail ID", "datatype": "id" },
+      {
+        "name": "lineitem",
+        "label": "PO Line Item",
+        "type": "link",
+        "key": "id",
+        "class": "jub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "eg_copy_id",
+        "label": "Evergreen Copy ID",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "barcode", "label": "Barcode", "datatype": "text" },
+      { "name": "cn_label", "label": "Call Number Label", "datatype": "text" },
+      {
+        "name": "recv_time",
+        "label": "Actual Receive Date",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "receiver",
+        "label": "Receiving User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "fund",
+        "label": "Fund",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "fund_debit",
+        "label": "Fund Debit",
+        "type": "link",
+        "key": "id",
+        "class": "acqfdeb",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "location",
+        "label": "Copy Location",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_modifier",
+        "label": "Circ Modifier",
+        "type": "link",
+        "key": "code",
+        "class": "ccm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "collection_code",
+        "label": "Collection Code",
+        "datatype": "text"
+      },
+      {
+        "name": "cancel_reason",
+        "label": "Cancel Reason",
+        "type": "link",
+        "key": "id",
+        "class": "acqcr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "claims",
+        "label": "Claims",
+        "virtual": true,
+        "type": "link",
+        "key": "lineitem_detail",
+        "class": "acqcl",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ]
+  },
+  "acqligad": {
+    "name": "acqligad",
+    "label": "Line Item Generated Attribute Definition",
+    "table": "acq.lineitem_generated_attr_definition",
+    "pkey": "id",
+    "pkey_sequence": "acq.lineitem_attr_definition_id_seq",
+    "fields": [
+      { "name": "id", "label": "Definition ID", "datatype": "id" },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "xpath", "label": "XPath", "datatype": "text" },
+      { "name": "ident", "label": "Is Identifier?", "datatype": "bool" }
+    ]
+  },
+  "acqlih": {
+    "name": "acqlih",
+    "label": "Line Item History",
+    "table": "acq.acq_lineitem_history",
+    "pkey": "audit_id",
+    "pkey_sequence": "acq.acq_lineitem_pkey_seq",
+    "fields": [
+      { "name": "audit_id", "label": "Audit ID", "datatype": "id" },
+      { "name": "audit_time", "label": "Audit Time", "datatype": "timestamp" },
+      { "name": "audit_action", "label": "Audit Action", "datatype": "text" },
+      {
+        "name": "id",
+        "label": "Lineitem ID",
+        "type": "link",
+        "key": "id",
+        "class": "jub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "editor",
+        "label": "Editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "selector",
+        "label": "Selector",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "provider",
+        "label": "Provider",
+        "type": "link",
+        "key": "id",
+        "class": "acqpro",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "purchase_order",
+        "label": "Purchase Order",
+        "type": "link",
+        "key": "id",
+        "class": "acqpo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "picklist",
+        "label": "Selection List",
+        "type": "link",
+        "key": "id",
+        "class": "acqpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "expected_recv_time",
+        "label": "Expected Receive Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "create_time",
+        "label": "Create Time",
+        "datatype": "timestamp"
+      },
+      { "name": "edit_time", "label": "Edit Time", "datatype": "timestamp" },
+      { "name": "marc", "label": "MARC", "datatype": "text" },
+      {
+        "name": "eg_bib_id",
+        "label": "Evergreen Bib ID",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "source_label", "label": "Source Label", "datatype": "text" },
+      { "name": "state", "label": "State", "datatype": "text" },
+      {
+        "name": "claim_policy",
+        "label": "Claim Policy",
+        "type": "link",
+        "key": "id",
+        "class": "acqclp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_reason",
+        "label": "Cancel Reason",
+        "type": "link",
+        "key": "id",
+        "class": "acqcr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "estimated_unit_price",
+        "label": "Estimated Unit Price",
+        "datatype": "money"
+      },
+      {
+        "name": "queued_record",
+        "label": "Queued Vandelay Record",
+        "type": "link",
+        "key": "id",
+        "class": "vqbr",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["CREATE_PURCHASE_ORDER", "VIEW_PURCHASE_ORDER"] }
+    }
+  },
+  "acqlilad": {
+    "name": "acqlilad",
+    "label": "Line Item Local Attribute Definition",
+    "table": "acq.lineitem_local_attr_definition",
+    "pkey": "id",
+    "pkey_sequence": "acq.lineitem_attr_definition_id_seq",
+    "fields": [
+      { "name": "id", "label": "Definition ID", "datatype": "id" },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "ident", "label": "Is Identifier?", "datatype": "bool" }
+    ]
+  },
+  "acqlimad": {
+    "name": "acqlimad",
+    "label": "Line Item MARC Attribute Definition",
+    "table": "acq.lineitem_marc_attr_definition",
+    "pkey": "id",
+    "pkey_sequence": "acq.lineitem_attr_definition_id_seq",
+    "fields": [
+      { "name": "id", "label": "Definition ID", "datatype": "id" },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "xpath", "label": "XPath", "datatype": "text" },
+      { "name": "ident", "label": "Is Identifier?", "datatype": "bool" },
+      { "name": "remove", "label": "Remove", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_LINEITEM_MARC_ATTR_DEF"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_LINEITEM_MARC_ATTR_DEF"] },
+      "delete": { "perms": ["ADMIN_LINEITEM_MARC_ATTR_DEF"] }
+    }
+  },
+  "acqlin": {
+    "name": "acqlin",
+    "label": "Line Item Note",
+    "table": "acq.lineitem_note",
+    "pkey": "id",
+    "pkey_sequence": "acq.lineitem_note_id_seq",
+    "fields": [
+      { "name": "id", "label": "PO Line Item Note ID", "datatype": "id" },
+      {
+        "name": "lineitem",
+        "label": "Line Item",
+        "type": "link",
+        "key": "id",
+        "class": "jub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_time",
+        "label": "Creation Time",
+        "datatype": "timestamp"
+      },
+      { "name": "edit_time", "label": "Edit Time", "datatype": "timestamp" },
+      {
+        "name": "editor",
+        "label": "Editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "label": "Note Value", "datatype": "text" },
+      {
+        "name": "alert_text",
+        "label": "Alert Text",
+        "type": "link",
+        "key": "id",
+        "class": "acqliat",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "vendor_public", "label": "Vendor Public", "datatype": "bool" }
+    ]
+  },
+  "acqlipad": {
+    "name": "acqlipad",
+    "label": "Line Item Provider Attribute Definition",
+    "table": "acq.lineitem_provider_attr_definition",
+    "pkey": "id",
+    "pkey_sequence": "acq.lineitem_attr_definition_id_seq",
+    "fields": [
+      { "name": "id", "label": "Definition ID", "datatype": "id" },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "xpath", "label": "XPath", "datatype": "text" },
+      {
+        "name": "provider",
+        "label": "Provider",
+        "type": "link",
+        "key": "id",
+        "class": "acqpro",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "ident", "label": "Is Identifier?", "datatype": "bool" },
+      { "name": "remove", "label": "Remove", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_PROVIDER"] },
+      "retrieve": { "perms": ["ADMIN_PROVIDER"] },
+      "update": { "perms": ["ADMIN_PROVIDER"] },
+      "delete": { "perms": ["ADMIN_PROVIDER"] }
+    }
+  },
+  "acqlisum": {
+    "name": "acqlisum",
+    "label": "Lineitem Summary",
+    "table": "acq.lineitem_summary",
+    "pkey": "lineitem",
+    "pkey_sequence": "acq.lineitem_id_seq",
+    "fields": [
+      {
+        "name": "lineitem",
+        "label": "Lineitem",
+        "type": "link",
+        "key": "id",
+        "class": "jub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "item_count", "label": "Item Count", "datatype": "int" },
+      { "name": "recv_count", "label": "Receive Count", "datatype": "int" },
+      { "name": "cancel_count", "label": "Cancel Count", "datatype": "int" },
+      { "name": "delay_count", "label": "Delay Count", "datatype": "int" },
+      { "name": "invoice_count", "label": "Invoice Count", "datatype": "int" },
+      { "name": "claim_count", "label": "Claim Count", "datatype": "int" },
+      {
+        "name": "estimated_amount",
+        "label": "Estimated Amount",
+        "datatype": "money"
+      },
+      {
+        "name": "encumbrance_amount",
+        "label": "Encumbrance Amount",
+        "datatype": "money"
+      },
+      { "name": "paid_amount", "label": "Paid Amount", "datatype": "money" }
+    ]
+  },
+  "acqlisumi": {
+    "name": "acqlisumi",
+    "label": "Invoiceable Lineitem Summary",
+    "source": "( SELECT * FROM acq.lineitem_summary  WHERE item_count > (invoice_count + cancel_count) )",
+    "pkey": "lineitem",
+    "pkey_sequence": "acq.lineitem_id_seq",
+    "fields": [
+      {
+        "name": "lineitem",
+        "label": "Lineitem",
+        "type": "link",
+        "key": "id",
+        "class": "jub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "item_count", "label": "Item Count", "datatype": "int" },
+      { "name": "recv_count", "label": "Receive Count", "datatype": "int" },
+      { "name": "cancel_count", "label": "Cancel Count", "datatype": "int" },
+      { "name": "delay_count", "label": "Delay Count", "datatype": "int" },
+      { "name": "invoice_count", "label": "Invoice Count", "datatype": "int" },
+      { "name": "claim_count", "label": "Claim Count", "datatype": "int" },
+      {
+        "name": "estimated_amount",
+        "label": "Estimated Amount",
+        "datatype": "money"
+      },
+      {
+        "name": "encumbrance_amount",
+        "label": "Encumbrance Amount",
+        "datatype": "money"
+      },
+      { "name": "paid_amount", "label": "Paid Amount", "datatype": "money" }
+    ]
+  },
+  "acqliuad": {
+    "name": "acqliuad",
+    "label": "Line Item User Attribute Definition",
+    "table": "acq.lineitem_usr_attr_definition",
+    "pkey": "id",
+    "pkey_sequence": "acq.lineitem_attr_definition_id_seq",
+    "fields": [
+      { "name": "id", "label": "Definition ID", "datatype": "id" },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "ident", "label": "Is Identifier?", "datatype": "bool" }
+    ]
+  },
+  "acqmapinv": {
+    "name": "acqmapinv",
+    "label": "Acq Map to Invoice View",
+    "source": "( SELECT poi.purchase_order AS purchase_order, ii.invoice AS invoice, NULL AS lineitem, poi.id AS po_item, NULL AS picklist FROM acq.po_item poi JOIN acq.invoice_item ii ON (ii.po_item = poi.id) UNION SELECT jub.purchase_order AS purchase_order, ie.invoice AS invoice, jub.id AS lineitem, NULL AS po_item, jub.picklist AS picklist FROM acq.lineitem jub JOIN acq.invoice_entry ie ON (ie.lineitem = jub.id) UNION SELECT ii.purchase_order AS purchase_order, ii.invoice AS invoice, NULL AS lineitem, NULL AS po_item, NULL AS picklist FROM acq.invoice_item ii WHERE ii.po_item IS NULL UNION SELECT ie.purchase_order AS purchase_order, ie.invoice AS invoice, NULL AS lineitem, NULL AS po_item, NULL AS picklist FROM acq.invoice_entry ie WHERE ie.lineitem IS NULL UNION SELECT NULL AS purchase_order, NULL AS invoice, jub.id AS lineitem, NULL AS po_item, jub.picklist AS picklist FROM acq.lineitem jub WHERE jub.purchase_order IS NULL )",
+    "fields": [
+      {
+        "name": "purchase_order",
+        "label": "Purchase Order ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqpo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "lineitem",
+        "label": "Lineitem ID",
+        "type": "link",
+        "key": "id",
+        "class": "jub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "invoice",
+        "label": "Invoice ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqinv",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "po_item",
+        "label": "Purchase Order Item ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqpoi",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "picklist",
+        "label": "Picklist ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "acqofscred": {
+    "name": "acqofscred",
+    "label": "Ordered Funding Source Credit",
+    "table": "acq.ordered_funding_source_credit",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "label": "Ordered Fund Src ID", "datatype": "id" },
+      { "name": "sort_priority", "label": "Sort Priority", "datatype": "int" },
+      { "name": "sort_date", "label": "Sort Date", "datatype": "timestamp" },
+      {
+        "name": "funding_source",
+        "label": "Funding Source ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqfs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      { "name": "note", "label": "Note", "datatype": "text" }
+    ]
+  },
+  "acqpa": {
+    "name": "acqpa",
+    "label": "Provider Address",
+    "table": "acq.provider_address",
+    "pkey": "id",
+    "pkey_sequence": "acq.provider_address_id_seq",
+    "fields": [
+      { "name": "address_type", "label": "Address Type", "datatype": "text" },
+      { "name": "city", "label": "City", "datatype": "text" },
+      { "name": "country", "label": "Country", "datatype": "text" },
+      { "name": "county", "label": "County", "datatype": "text" },
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "provider",
+        "label": "Provider",
+        "type": "link",
+        "key": "id",
+        "class": "acqpro",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "post_code", "label": "Post Code", "datatype": "text" },
+      { "name": "state", "label": "State", "datatype": "text" },
+      { "name": "street1", "label": "Street 1", "datatype": "text" },
+      { "name": "street2", "label": "Street 2", "datatype": "text" },
+      { "name": "valid", "label": "Is Valid?", "datatype": "bool" },
+      { "name": "fax_phone", "label": "Fax Phone", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_PROVIDER"] },
+      "retrieve": { "perms": ["ADMIN_PROVIDER"] },
+      "update": { "perms": ["ADMIN_PROVIDER"] },
+      "delete": { "perms": ["ADMIN_PROVIDER"] }
+    }
+  },
+  "acqpc": {
+    "name": "acqpc",
+    "label": "Provider Contact",
+    "table": "acq.provider_contact",
+    "pkey": "id",
+    "pkey_sequence": "acq.provider_contact_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "provider",
+        "label": "Provider",
+        "type": "link",
+        "key": "id",
+        "class": "acqpro",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "role", "label": "Role", "datatype": "text" },
+      { "name": "email", "label": "Email", "datatype": "text" },
+      { "name": "phone", "label": "Phone", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_PROVIDER"] },
+      "retrieve": { "perms": ["ADMIN_PROVIDER"] },
+      "update": { "perms": ["ADMIN_PROVIDER"] },
+      "delete": { "perms": ["ADMIN_PROVIDER"] }
+    }
+  },
+  "acqpca": {
+    "name": "acqpca",
+    "label": "Provider Contact Address",
+    "table": "acq.provider_contact_address",
+    "pkey": "id",
+    "pkey_sequence": "acq.provider_contact_address_id_seq",
+    "fields": [
+      { "name": "address_type", "label": "Type", "datatype": "text" },
+      { "name": "city", "label": "City", "datatype": "text" },
+      { "name": "country", "label": "Country", "datatype": "text" },
+      { "name": "county", "label": "County", "datatype": "text" },
+      { "name": "id", "label": "Address ID", "datatype": "id" },
+      { "name": "post_code", "label": "Postal Code", "datatype": "text" },
+      { "name": "state", "label": "State", "datatype": "text" },
+      { "name": "street1", "label": "Street (1)", "datatype": "text" },
+      { "name": "street2", "label": "Street (2)", "datatype": "text" },
+      {
+        "name": "contact",
+        "label": "Contact",
+        "type": "link",
+        "key": "id",
+        "class": "acqpc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "valid", "label": "Valid Address?", "datatype": "bool" },
+      { "name": "fax_phone", "label": "Fax Phone", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_PROVIDER"] },
+      "retrieve": { "perms": ["ADMIN_PROVIDER"] },
+      "update": { "perms": ["ADMIN_PROVIDER"] },
+      "delete": { "perms": ["ADMIN_PROVIDER"] }
+    }
+  },
+  "acqphsm": {
+    "name": "acqphsm",
+    "label": "Provider Holding Subfield Map",
+    "table": "acq.provider_holding_subfield_map",
+    "pkey": "id",
+    "pkey_sequence": "acq.provider_holding_subfield_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "provider",
+        "label": "Provider",
+        "type": "link",
+        "key": "id",
+        "class": "acqpro",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "subfield", "label": "Subfield", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_PROVIDER"] },
+      "retrieve": { "perms": ["ADMIN_PROVIDER"] },
+      "update": { "perms": ["ADMIN_PROVIDER"] },
+      "delete": { "perms": ["ADMIN_PROVIDER"] }
+    }
+  },
+  "acqpl": {
+    "name": "acqpl",
+    "label": "Selection List",
+    "table": "acq.picklist",
+    "pkey": "id",
+    "pkey_sequence": "acq.picklist_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Selection List ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "org_unit",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      {
+        "name": "create_time",
+        "label": "Creation Time",
+        "datatype": "timestamp"
+      },
+      { "name": "edit_time", "label": "Edit Time", "datatype": "timestamp" },
+      {
+        "name": "entries",
+        "label": "Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "picklist",
+        "class": "jub",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "entry_count",
+        "label": "Entry Count",
+        "virtual": true,
+        "datatype": "text"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "editor",
+        "label": "Editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["CREATE_PICKLIST", "VIEW_PICKLIST"] }
+    }
+  },
+  "acqpo": {
+    "name": "acqpo",
+    "label": "Purchase Order",
+    "table": "acq.purchase_order",
+    "pkey": "id",
+    "pkey_sequence": "acq.purchase_order_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Purchase Order ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_time",
+        "label": "Creation Time",
+        "datatype": "timestamp"
+      },
+      { "name": "edit_time", "label": "Edit Time", "datatype": "timestamp" },
+      {
+        "name": "provider",
+        "label": "Provider",
+        "type": "link",
+        "key": "id",
+        "class": "acqpro",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "state", "label": "State", "datatype": "text" },
+      {
+        "name": "ordering_agency",
+        "label": "Ordering Agency",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "editor",
+        "label": "Editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "order_date", "label": "Order Date", "datatype": "timestamp" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      {
+        "name": "cancel_reason",
+        "label": "Cancel Reason",
+        "type": "link",
+        "key": "id",
+        "class": "acqcr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "prepayment_required",
+        "label": "Prepayment Required",
+        "datatype": "bool"
+      },
+      {
+        "name": "lineitems",
+        "label": "Line Items",
+        "virtual": true,
+        "type": "link",
+        "key": "purchase_order",
+        "class": "jub",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "notes",
+        "label": "Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "purchase_order",
+        "class": "acqpon",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "lineitem_count",
+        "label": "Line Item Count",
+        "virtual": true,
+        "datatype": "int"
+      },
+      {
+        "name": "amount_encumbered",
+        "label": "Amount Encumbered",
+        "virtual": true,
+        "datatype": "float"
+      },
+      {
+        "name": "amount_spent",
+        "label": "Amount Spent",
+        "virtual": true,
+        "datatype": "float"
+      },
+      {
+        "name": "amount_estimated",
+        "label": "Amount Estimated",
+        "virtual": true,
+        "datatype": "float"
+      },
+      {
+        "name": "po_items",
+        "label": "PO Items",
+        "virtual": true,
+        "type": "link",
+        "key": "purchase_order",
+        "class": "acqpoi",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_PURCHASE_ORDER"] },
+      "retrieve": { "perms": ["CREATE_PURCHASE_ORDER", "VIEW_PURCHASE_ORDER"] },
+      "update": { "perms": ["CREATE_PURCHASE_ORDER"] },
+      "delete": { "perms": ["CREATE_PURCHASE_ORDER"] }
+    }
+  },
+  "acqpoh": {
+    "name": "acqpoh",
+    "label": "Purchase Order History",
+    "table": "acq.acq_purchase_order_history",
+    "pkey": "audit_id",
+    "pkey_sequence": "acq.acq_purchase_order_pkey_seq",
+    "fields": [
+      { "name": "audit_id", "label": "Audit ID", "datatype": "id" },
+      { "name": "audit_time", "label": "Audit Time", "datatype": "timestamp" },
+      { "name": "audit_action", "label": "Audit Action", "datatype": "text" },
+      {
+        "name": "id",
+        "label": "Purchase Order ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqpo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "editor",
+        "label": "Editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "ordering_agency",
+        "label": "Ordering Agency",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_time",
+        "label": "Create Time",
+        "datatype": "timestamp"
+      },
+      { "name": "edit_time", "label": "Edit Time", "datatype": "timestamp" },
+      {
+        "name": "provider",
+        "label": "Provider",
+        "type": "link",
+        "key": "id",
+        "class": "acqpro",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "state", "label": "State", "datatype": "text" },
+      { "name": "order_date", "label": "Order Date", "datatype": "timestamp" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      {
+        "name": "cancel_reason",
+        "label": "Cancel Reason",
+        "type": "link",
+        "key": "id",
+        "class": "acqcr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "prepayment_required",
+        "label": "Prepayment Required",
+        "datatype": "bool"
+      }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["CREATE_PURCHASE_ORDER", "VIEW_PURCHASE_ORDER"] }
+    }
+  },
+  "acqpoi": {
+    "name": "acqpoi",
+    "label": "Purchase Order Item",
+    "table": "acq.po_item",
+    "pkey": "id",
+    "pkey_sequence": "acq.po_item_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "purchase_order",
+        "label": "Purchase Order",
+        "type": "link",
+        "key": "id",
+        "class": "acqpo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "fund_debit",
+        "label": "Fund Debit",
+        "type": "link",
+        "key": "id",
+        "class": "acqfdeb",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "inv_item_type",
+        "label": "Invoice Item Type",
+        "type": "link",
+        "key": "code",
+        "class": "aiit",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "title", "label": "Title", "datatype": "text" },
+      { "name": "author", "label": "Author", "datatype": "text" },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "estimated_cost",
+        "label": "Estimated Cost",
+        "datatype": "money"
+      },
+      {
+        "name": "fund",
+        "label": "Fund",
+        "type": "link",
+        "key": "id",
+        "class": "acqf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "target", "label": "Target", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_PURCHASE_ORDER"] },
+      "retrieve": { "perms": ["CREATE_PURCHASE_ORDER", "VIEW_PURCHASE_ORDER"] },
+      "update": { "perms": ["CREATE_PURCHASE_ORDER"] },
+      "delete": { "perms": ["CREATE_PURCHASE_ORDER"] }
+    }
+  },
+  "acqpon": {
+    "name": "acqpon",
+    "label": "PO Note",
+    "table": "acq.po_note",
+    "pkey": "id",
+    "pkey_sequence": "acq.po_note_id_seq",
+    "fields": [
+      { "name": "id", "label": "PO Note ID", "datatype": "id" },
+      {
+        "name": "purchase_order",
+        "label": "Purchase Order",
+        "type": "link",
+        "key": "id",
+        "class": "acqpo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_time",
+        "label": "Creation Time",
+        "datatype": "timestamp"
+      },
+      { "name": "edit_time", "label": "Edit Time", "datatype": "timestamp" },
+      {
+        "name": "editor",
+        "label": "Editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "label": "Vote Value", "datatype": "text" },
+      { "name": "vendor_public", "label": "Vendor Public", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_PURCHASE_ORDER"] },
+      "retrieve": { "perms": ["CREATE_PURCHASE_ORDER", "VIEW_PURCHASE_ORDER"] },
+      "update": { "perms": ["CREATE_PURCHASE_ORDER"] },
+      "delete": { "perms": ["CREATE_PURCHASE_ORDER"] }
+    }
+  },
+  "acqpro": {
+    "name": "acqpro",
+    "label": "Provider",
+    "table": "acq.provider",
+    "pkey": "id",
+    "pkey_sequence": "acq.provider_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Provider ID",
+        "selector": "code",
+        "datatype": "id"
+      },
+      {
+        "name": "name",
+        "label": "Provider Name",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "currency_type",
+        "label": "Currency",
+        "type": "link",
+        "key": "code",
+        "class": "acqct",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      { "name": "holding_tag", "label": "Holdings Tag", "datatype": "text" },
+      {
+        "name": "addresses",
+        "label": "Addresses",
+        "virtual": true,
+        "type": "link",
+        "key": "provider",
+        "class": "acqpa",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "san", "label": "SAN", "datatype": "text" },
+      {
+        "name": "edi_default",
+        "label": "EDI Default",
+        "type": "link",
+        "key": "id",
+        "class": "acqedi",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "active", "label": "Active", "datatype": "bool" },
+      {
+        "name": "prepayment_required",
+        "label": "Prepayment Required",
+        "datatype": "bool"
+      },
+      { "name": "url", "label": "URL", "datatype": "text" },
+      { "name": "email", "label": "Email", "datatype": "text" },
+      { "name": "phone", "label": "Phone", "datatype": "text" },
+      { "name": "fax_phone", "label": "Fax Phone", "datatype": "text" },
+      {
+        "name": "default_claim_policy",
+        "label": "Default Claim Policy",
+        "type": "link",
+        "key": "id",
+        "class": "acqclp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "default_copy_count",
+        "label": "Default # Copies",
+        "datatype": "int"
+      },
+      {
+        "name": "provider_notes",
+        "label": "Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "provider",
+        "class": "acqpron",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_PROVIDER"] },
+      "retrieve": {
+        "perms": ["ADMIN_PROVIDER", "MANAGE_PROVIDER", "VIEW_PROVIDER"]
+      },
+      "update": { "perms": ["ADMIN_PROVIDER"] },
+      "delete": { "perms": ["ADMIN_PROVIDER"] }
+    }
+  },
+  "acqpron": {
+    "name": "acqpron",
+    "label": "Provider Note",
+    "table": "acq.provider_note",
+    "pkey": "id",
+    "pkey_sequence": "acq.provider_note_id_seq",
+    "fields": [
+      { "name": "id", "label": "PO Note ID", "datatype": "id" },
+      {
+        "name": "provider",
+        "label": "Provider",
+        "type": "link",
+        "key": "id",
+        "class": "acqpro",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_time",
+        "label": "Creation Time",
+        "datatype": "timestamp"
+      },
+      { "name": "edit_time", "label": "Edit Time", "datatype": "timestamp" },
+      {
+        "name": "editor",
+        "label": "Editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "label": "Note Value", "datatype": "text" }
+    ]
+  },
+  "acqscl": {
+    "name": "acqscl",
+    "label": "Serial Claim",
+    "table": "acq.serial_claim",
+    "pkey": "id",
+    "pkey_sequence": "acq.serial_claim_id_seq",
+    "fields": [
+      { "name": "id", "label": "Claim ID", "datatype": "id" },
+      {
+        "name": "type",
+        "label": "Claim Type",
+        "type": "link",
+        "key": "id",
+        "class": "acqclt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "item",
+        "label": "Serial Item",
+        "type": "link",
+        "key": "id",
+        "class": "sitem",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "acqscle": {
+    "name": "acqscle",
+    "label": "Serial Claim Event",
+    "table": "acq.serial_claim_event",
+    "pkey": "id",
+    "pkey_sequence": "acq.serial_claim_event_id_seq",
+    "fields": [
+      { "name": "id", "label": "Claim Event ID", "datatype": "id" },
+      {
+        "name": "type",
+        "label": "Claim Event Type",
+        "type": "link",
+        "key": "id",
+        "class": "acqclet",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "claim",
+        "label": "Claim ID",
+        "type": "link",
+        "key": "id",
+        "class": "acqscl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "event_date", "label": "Event Date", "datatype": "timestamp" },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "label": "Note", "datatype": "text" }
+    ]
+  },
+  "acrlid": {
+    "name": "acrlid",
+    "label": "Claim Ready Lineitem Details",
+    "source": "( SELECT po.ordering_agency AS ordering_agency, po.id AS purchase_order, li.id AS lineitem, lid.id AS lineitem_detail, cpa.id AS claim_policy_action FROM acq.lineitem_detail lid JOIN acq.lineitem li ON (li.id = lid.lineitem) JOIN acq.purchase_order po ON (po.id = li.purchase_order) JOIN acq.claim_policy cp ON (li.claim_policy = cp.id) JOIN acq.claim_policy_action cpa ON ( cpa.claim_policy = cp.id AND (NOW() - cpa.action_interval) > po.order_date AND NOT EXISTS ( SELECT 1 FROM acq.claim_event evt JOIN acq.claim claim ON ( claim.id = evt.claim AND claim.lineitem_detail = lid.id ) WHERE evt.event_date >= (po.order_date + cpa.action_interval) ) ) WHERE lid.cancel_reason IS NULL AND li.cancel_reason IS NULL AND po.cancel_reason IS NULL AND lid.recv_time IS NULL AND po.state = 'on-order' ORDER BY 1, 2, 3, 4, 5 )",
+    "fields": [
+      {
+        "name": "ordering_agency",
+        "label": "Ordering Agency",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "purchase_order",
+        "label": "Purchase Order",
+        "type": "link",
+        "key": "id",
+        "class": "acqpo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "lineitem",
+        "label": "Lineitem",
+        "type": "link",
+        "key": "id",
+        "class": "jub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "lineitem_detail",
+        "label": "Lineitem Detail",
+        "type": "link",
+        "key": "id",
+        "class": "acqlid",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "claim_policy_action",
+        "label": "Claim Policy Action",
+        "type": "link",
+        "key": "id",
+        "class": "acqclpa",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "acs": {
+    "name": "acs",
+    "label": "Authority Control Set",
+    "table": "authority.control_set",
+    "pkey": "id",
+    "pkey_sequence": "authority.control_set_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Control Set ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "name",
+        "label": "Name",
+        "required": true,
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "authority_fields",
+        "label": "Controlling Authority Fields",
+        "virtual": true,
+        "type": "link",
+        "key": "control_set",
+        "class": "acsaf",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "thesauri",
+        "label": "Thesauri",
+        "virtual": true,
+        "type": "link",
+        "key": "control_set",
+        "class": "at",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_CONTROL_SET"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] },
+      "delete": { "perms": ["DELETE_AUTHORITY_CONTROL_SET"] }
+    }
+  },
+  "acsaf": {
+    "name": "acsaf",
+    "label": "Authority Control Set Authority Field",
+    "table": "authority.control_set_authority_field",
+    "pkey": "id",
+    "pkey_sequence": "authority.control_set_authority_field_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Control Set Authority Field ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "main_entry",
+        "label": "Main Entry",
+        "type": "link",
+        "key": "id",
+        "class": "acsaf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "control_set",
+        "label": "Control Set",
+        "type": "link",
+        "key": "id",
+        "class": "acs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "tag", "label": "Tag", "required": true, "datatype": "text" },
+      { "name": "sf_list", "label": "Subfield List", "datatype": "text" },
+      {
+        "name": "display_sf_list",
+        "label": "Subfield List for Display",
+        "datatype": "text"
+      },
+      { "name": "nfi", "label": "Non-filing Indicator", "datatype": "text" },
+      {
+        "name": "name",
+        "label": "Name",
+        "required": true,
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "linking_subfield",
+        "label": "Linking Subfield",
+        "datatype": "text"
+      },
+      {
+        "name": "sub_entries",
+        "label": "Subordinate Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "main_entry",
+        "class": "acsaf",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "bib_fields",
+        "label": "Controlled Bib Fields",
+        "virtual": true,
+        "type": "link",
+        "key": "authority_field",
+        "class": "acsbf",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "thesauri",
+        "label": "Thesauri",
+        "virtual": true,
+        "type": "link",
+        "key": "control_set",
+        "class": "at",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "axis_maps",
+        "label": "Browse Axis Maps",
+        "virtual": true,
+        "type": "link",
+        "key": "field",
+        "class": "abaafm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "joiner", "label": "Joiner", "datatype": "text" },
+      { "name": "heading_field", "label": "Heading Field", "datatype": "link" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_CONTROL_SET"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] },
+      "delete": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] }
+    }
+  },
+  "acsbf": {
+    "name": "acsbf",
+    "label": "Authority Control Set Bib Field",
+    "table": "authority.control_set_bib_field",
+    "pkey": "id",
+    "pkey_sequence": "authority.control_set_bib_field_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Controlled Bib Field ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "authority_field",
+        "label": "Controlling Authority Field",
+        "type": "link",
+        "key": "id",
+        "class": "acsaf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "tag", "label": "Tag", "required": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_CONTROL_SET"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] },
+      "delete": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] }
+    }
+  },
+  "acsbfmfm": {
+    "name": "acsbfmfm",
+    "label": "Authority Control Set Bib Field to Metabib Field Map",
+    "table": "authority.control_set_bib_field_metabib_field_map",
+    "pkey": "id",
+    "pkey_sequence": "authority.control_set_bib_field_metabib_field_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      {
+        "name": "bib_field",
+        "label": "Bib Field",
+        "type": "link",
+        "key": "id",
+        "class": "acsbf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "metabib_field",
+        "label": "Metabib Field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_CONTROL_SET"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] },
+      "delete": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] }
+    }
+  },
+  "act": {
+    "name": "act",
+    "label": "Asset Copy Template",
+    "table": "asset.copy_template",
+    "pkey": "id",
+    "pkey_sequence": "asset.copy_template_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      {
+        "name": "owning_lib",
+        "label": "Owning Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "editor",
+        "label": "Editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_date",
+        "label": "Create Date",
+        "datatype": "timestamp"
+      },
+      { "name": "edit_date", "label": "Edit Date", "datatype": "timestamp" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      {
+        "name": "circ_lib",
+        "label": "Circ Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "status",
+        "label": "Status",
+        "type": "link",
+        "key": "id",
+        "class": "ccs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "location",
+        "label": "Location",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "loan_duration", "label": "Loan Duration", "datatype": "int" },
+      { "name": "fine_level", "label": "Fine Level", "datatype": "int" },
+      {
+        "name": "age_protect",
+        "label": "Age Protect",
+        "type": "link",
+        "key": "id",
+        "class": "crahp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "circulate", "label": "Circulate?", "datatype": "bool" },
+      { "name": "deposit", "label": "Deposit?", "datatype": "bool" },
+      { "name": "ref", "label": "Reference?", "datatype": "bool" },
+      { "name": "holdable", "label": "Holdable?", "datatype": "bool" },
+      {
+        "name": "deposit_amount",
+        "label": "Deposit Amount",
+        "datatype": "money"
+      },
+      { "name": "price", "label": "Price", "datatype": "money" },
+      {
+        "name": "circ_modifier",
+        "label": "Circ Modifier",
+        "type": "link",
+        "key": "code",
+        "class": "ccm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_as_type",
+        "label": "Circ As Type",
+        "type": "link",
+        "key": "code",
+        "class": "citm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "alert_message", "label": "Alert Message", "datatype": "text" },
+      { "name": "opac_visible", "label": "OPAC Visible?", "datatype": "bool" },
+      {
+        "name": "floating",
+        "label": "Floating Group",
+        "type": "link",
+        "key": "id",
+        "class": "cfg",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "mint_condition",
+        "label": "Mint Condition?",
+        "datatype": "bool"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ASSET_COPY_TEMPLATE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_ASSET_COPY_TEMPLATE"] },
+      "delete": { "perms": ["ADMIN_ASSET_COPY_TEMPLATE"] }
+    }
+  },
+  "actsc": {
+    "name": "actsc",
+    "label": "User Statistical Category",
+    "table": "actor.stat_cat",
+    "pkey": "id",
+    "pkey_sequence": "actor.stat_cat_id_seq",
+    "fields": [
+      {
+        "name": "entries",
+        "label": "Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "stat_cat",
+        "class": "actsce",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "default_entries",
+        "label": "Default Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "stat_cat",
+        "class": "actsced",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "id",
+        "label": "Stat Cat ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      { "name": "opac_visible", "label": "OPAC Visible", "datatype": "bool" },
+      {
+        "name": "owner",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "usr_summary", "label": "User Summary", "datatype": "bool" },
+      {
+        "name": "sip_field",
+        "label": "SIP Field",
+        "type": "link",
+        "key": "field",
+        "class": "actscsf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "sip_format", "label": "SIP Format", "datatype": "text" },
+      {
+        "name": "checkout_archive",
+        "label": "Checkout Archive",
+        "datatype": "bool"
+      },
+      { "name": "required", "label": "Required", "datatype": "bool" },
+      { "name": "allow_freetext", "label": "Free Text", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_PATRON_STAT_CAT"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_PATRON_STAT_CAT"] },
+      "delete": { "perms": ["DELETE_PATRON_STAT_CAT"] }
+    }
+  },
+  "actsce": {
+    "name": "actsce",
+    "label": "User Stat Cat Entry",
+    "table": "actor.stat_cat_entry",
+    "pkey": "id",
+    "pkey_sequence": "actor.stat_cat_entry_id_seq",
+    "fields": [
+      { "name": "id", "label": "Entry ID", "datatype": "id" },
+      {
+        "name": "owner",
+        "label": "Entry Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat",
+        "label": "Stat Cat",
+        "type": "link",
+        "key": "id",
+        "class": "actsc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "label": "Entry Value", "datatype": "text" },
+      {
+        "name": "default_entries",
+        "label": "Default Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "stat_cat_entry",
+        "class": "actsced",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ]
+  },
+  "actscecm": {
+    "name": "actscecm",
+    "label": "User Statistical Category Entry",
+    "table": "actor.stat_cat_entry_usr_map",
+    "pkey": "id",
+    "pkey_sequence": "actor.stat_cat_entry_usr_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "Entry ID", "datatype": "id" },
+      {
+        "name": "stat_cat",
+        "label": "Statistical Category",
+        "type": "link",
+        "key": "id",
+        "class": "actsc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "stat_cat_entry", "label": "Entry Text", "datatype": "text" },
+      {
+        "name": "target_usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "actsced": {
+    "name": "actsced",
+    "label": "User Stat Cat Default Entry",
+    "table": "actor.stat_cat_entry_default",
+    "pkey": "id",
+    "pkey_sequence": "actor.stat_cat_entry_default_id_seq",
+    "fields": [
+      { "name": "id", "label": "Default Entry ID", "datatype": "id" },
+      {
+        "name": "stat_cat_entry",
+        "label": "Default Entry Value",
+        "type": "link",
+        "key": "id",
+        "class": "actsce",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat",
+        "label": "Stat Cat",
+        "type": "link",
+        "key": "id",
+        "class": "actsc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "owner",
+        "label": "Default for Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "actscsf": {
+    "name": "actscsf",
+    "label": "SIP Statistical Category Field Identifier",
+    "table": "actor.stat_cat_sip_fields",
+    "pkey": "field",
+    "fields": [
+      {
+        "name": "field",
+        "label": "Field Identifier",
+        "selector": "name",
+        "datatype": "text"
+      },
+      { "name": "name", "label": "Field Name", "datatype": "text" },
+      { "name": "one_only", "label": "Exclusive?", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_PATRON_STAT_CAT"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_PATRON_STAT_CAT"] },
+      "delete": { "perms": ["DELETE_PATRON_STAT_CAT"] }
+    }
+  },
+  "aea": {
+    "name": "aea",
+    "label": "EDI Attribute",
+    "table": "acq.edi_attr",
+    "pkey": "key",
+    "fields": [
+      {
+        "name": "key",
+        "label": "Key",
+        "selector": "label",
+        "datatype": "text"
+      },
+      { "name": "label", "label": "Label", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_PROVIDER"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_PROVIDER"] },
+      "delete": { "perms": ["ADMIN_PROVIDER"] }
+    }
+  },
+  "aeas": {
+    "name": "aeas",
+    "label": "EDI Attribute Set",
+    "table": "acq.edi_attr_set",
+    "pkey": "id",
+    "pkey_sequence": "acq.edi_attr_set_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "label", "datatype": "id" },
+      { "name": "label", "label": "Label", "datatype": "text" },
+      {
+        "name": "attr_maps",
+        "label": "Mapped EDI Attributes",
+        "virtual": true,
+        "type": "link",
+        "key": "attr_set",
+        "class": "aeasm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_PROVIDER"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_PROVIDER"] },
+      "delete": { "perms": ["ADMIN_PROVIDER"] }
+    }
+  },
+  "aeasm": {
+    "name": "aeasm",
+    "label": "EDI Attribute Set Map",
+    "table": "acq.edi_attr_set_map",
+    "pkey": "id",
+    "pkey_sequence": "acq.edi_attr_set_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "label", "datatype": "id" },
+      {
+        "name": "attr_set",
+        "label": "Attribute Set",
+        "type": "link",
+        "key": "id",
+        "class": "aeas",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "attr",
+        "label": "Attribute",
+        "type": "link",
+        "key": "id",
+        "class": "aea",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_PROVIDER"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_PROVIDER"] },
+      "delete": { "perms": ["ADMIN_PROVIDER"] }
+    }
+  },
+  "aec": {
+    "name": "aec",
+    "label": "Emergency Closing",
+    "table": "action.emergency_closing",
+    "pkey": "id",
+    "pkey_sequence": "action.emergency_closing_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "create_time", "datatype": "timestamp" },
+      { "name": "process_start_time", "datatype": "timestamp" },
+      { "name": "process_end_time", "datatype": "timestamp" },
+      { "name": "last_update_time", "datatype": "timestamp" },
+      {
+        "name": "closing",
+        "virtual": true,
+        "type": "link",
+        "key": "emergency_closing",
+        "class": "aoucd",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "status",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "aecs",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "circulations",
+        "virtual": true,
+        "type": "link",
+        "key": "emergency_closing",
+        "class": "aecc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "reservations",
+        "virtual": true,
+        "type": "link",
+        "key": "emergency_closing",
+        "class": "aecr",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "holds",
+        "virtual": true,
+        "type": "link",
+        "key": "emergency_closing",
+        "class": "aech",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["EMERGENCY_CLOSING"] },
+      "retrieve": {},
+      "update": { "perms": ["EMERGENCY_CLOSING"] },
+      "delete": { "perms": ["EMERGENCY_CLOSING"] }
+    }
+  },
+  "aecc": {
+    "name": "aecc",
+    "label": "Emergency Closing Circulation Entry",
+    "table": "action.emergency_closing_circulation",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "circulation",
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "emergency_closing",
+        "type": "link",
+        "key": "id",
+        "class": "aec",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "original_due_date", "datatype": "timestamp" },
+      { "name": "process_time", "datatype": "timestamp" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "aech": {
+    "name": "aech",
+    "label": "Emergency Closing Hold Entry",
+    "table": "action.emergency_closing_hold",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "hold",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "emergency_closing",
+        "type": "link",
+        "key": "id",
+        "class": "aec",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "original_shelf_expire_time", "datatype": "timestamp" },
+      { "name": "process_time", "datatype": "timestamp" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "aecr": {
+    "name": "aecr",
+    "label": "Emergency Closing Reservation Entry",
+    "table": "action.emergency_closing_reservation",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "reservation",
+        "type": "link",
+        "key": "id",
+        "class": "bresv",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "emergency_closing",
+        "type": "link",
+        "key": "id",
+        "class": "aec",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "original_end_time", "datatype": "timestamp" },
+      { "name": "process_time", "datatype": "timestamp" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "aecs": {
+    "name": "aecs",
+    "label": "Emergency Closing Status",
+    "table": "action.emergency_closing_status",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "type": "link",
+        "key": "id",
+        "class": "aec",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      { "name": "creator", "datatype": "link" },
+      { "name": "create_time", "datatype": "timestamp" },
+      { "name": "process_start_time", "datatype": "timestamp" },
+      { "name": "process_end_time", "datatype": "timestamp" },
+      { "name": "last_update_time", "datatype": "timestamp" },
+      { "name": "circulations", "datatype": "int" },
+      { "name": "circulations_complete", "datatype": "int" },
+      { "name": "reservations", "datatype": "int" },
+      { "name": "reservations_complete", "datatype": "int" },
+      { "name": "holds", "datatype": "int" },
+      { "name": "holds_complete", "datatype": "int" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "afr": {
+    "name": "afr",
+    "label": "Full Authority Record",
+    "table": "authority.full_rec",
+    "pkey": "id",
+    "pkey_sequence": "authority.full_rec_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      { "name": "ind1", "datatype": "text" },
+      { "name": "ind2", "datatype": "text" },
+      {
+        "name": "record",
+        "type": "link",
+        "key": "id",
+        "class": "are",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "subfield", "datatype": "text" },
+      { "name": "tag", "datatype": "text" },
+      { "name": "value", "datatype": "text" }
+    ]
+  },
+  "afs": {
+    "name": "afs",
+    "label": "Fieldset",
+    "table": "action.fieldset",
+    "pkey": "id",
+    "pkey_sequence": "action.fieldset_id_seq",
+    "fields": [
+      { "name": "id", "label": "Fieldset ID", "datatype": "id" },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "status", "label": "Status", "datatype": "text" },
+      {
+        "name": "creation_time",
+        "label": "Creation Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "scheduled_time",
+        "label": "Scheduled Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "applied_time",
+        "label": "Applied Time",
+        "datatype": "timestamp"
+      },
+      { "name": "classname", "label": "Class Name", "datatype": "text" },
+      { "name": "name", "label": "Fieldset Name", "datatype": "text" },
+      {
+        "name": "stored_query",
+        "label": "Stored Query",
+        "type": "link",
+        "key": "id",
+        "class": "qsq",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "pkey_value",
+        "label": "Primary Key Value",
+        "datatype": "text"
+      },
+      {
+        "name": "fieldset_group",
+        "label": "Fieldset Group",
+        "type": "link",
+        "key": "id",
+        "class": "afsg",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "error_msg", "label": "Error Message", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_FIELDSET", "ADMIN_FIELDSET"] },
+      "retrieve": { "perms": ["RETRIEVE_FIELDSET", "ADMIN_FIELDSET"] },
+      "update": { "perms": ["UPDATE_FIELDSET", "ADMIN_FIELDSET"] },
+      "delete": { "perms": ["DELETE_FIELDSET", "ADMIN_FIELDSET"] }
+    }
+  },
+  "afscv": {
+    "name": "afscv",
+    "label": "Fieldset Column Value",
+    "table": "action.fieldset_col_val",
+    "pkey": "id",
+    "pkey_sequence": "action.fieldset_col_val_id_seq",
+    "fields": [
+      { "name": "id", "label": "Column Value ID", "datatype": "id" },
+      {
+        "name": "fieldset",
+        "label": "Fieldset ID",
+        "type": "link",
+        "key": "id",
+        "class": "afs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "col", "label": "Column Name", "datatype": "text" },
+      { "name": "val", "label": "Column Value", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_FIELDSET_ENTRY", "ADMIN_FIELDSET_ENTRY"] },
+      "retrieve": {
+        "perms": ["RETRIEVE_FIELDSET_ENTRY", "ADMIN_FIELDSET_ENTRY"]
+      },
+      "update": { "perms": ["UPDATE_FIELDSET_ENTRY", "ADMIN_FIELDSET_ENTRY"] },
+      "delete": { "perms": ["DELETE_FIELDSET_ENTRY", "ADMIN_FIELDSET_ENTRY"] }
+    }
+  },
+  "afsg": {
+    "name": "afsg",
+    "label": "Fieldset Group",
+    "table": "action.fieldset_group",
+    "pkey": "id",
+    "pkey_sequence": "action.fieldset_group_id_seq",
+    "fields": [
+      { "name": "id", "label": "Fieldset Group ID", "datatype": "id" },
+      {
+        "name": "name",
+        "label": "Fieldset Group Name",
+        "required": true,
+        "datatype": "text"
+      },
+      {
+        "name": "create_time",
+        "label": "Creation Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "complete_time",
+        "label": "Complete Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "container",
+        "label": "Container ID",
+        "required": true,
+        "datatype": "int"
+      },
+      {
+        "name": "container_type",
+        "label": "Container Type",
+        "required": true,
+        "datatype": "text"
+      },
+      {
+        "name": "rollback_group",
+        "label": "Rollback Group",
+        "type": "link",
+        "key": "id",
+        "class": "afsg",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "rollback_time",
+        "label": "Rollback Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_FIELDSET_GROUP", "ADMIN_FIELDSET_GROUP"] },
+      "retrieve": {
+        "perms": ["RETRIEVE_FIELDSET_GROUP", "ADMIN_FIELDSET_GROUP"]
+      },
+      "update": { "perms": ["UPDATE_FIELDSET_GROUP", "ADMIN_FIELDSET_GROUP"] },
+      "delete": { "perms": ["DELETE_FIELDSET_GROUP", "ADMIN_FIELDSET_GROUP"] }
+    }
+  },
+  "ahcm": {
+    "name": "ahcm",
+    "label": "Hold Copy Map",
+    "table": "action.hold_copy_map",
+    "pkey": "id",
+    "pkey_sequence": "action.hold_copy_map_id_seq",
+    "fields": [
+      {
+        "name": "hold",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "target_copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "proximity", "datatype": "number" }
+    ]
+  },
+  "ahf": {
+    "name": "ahf",
+    "label": "Authority Heading Fields",
+    "table": "authority.heading_field",
+    "pkey": "id",
+    "pkey_sequence": "authority.heading_fields_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      { "name": "heading_type", "label": "Heading Type", "datatype": "text" },
+      {
+        "name": "heading_purpose",
+        "label": "Heading Purpose",
+        "datatype": "text"
+      },
+      { "name": "label", "label": "Heading Field Label", "datatype": "text" },
+      { "name": "format", "label": "Heading XSLT Format", "datatype": "text" },
+      { "name": "heading_xpath", "label": "Heading XPath", "datatype": "text" },
+      {
+        "name": "component_xpath",
+        "label": "Heading Component XPath",
+        "datatype": "text"
+      },
+      {
+        "name": "type_xpath",
+        "label": "Related/Variant Type XPath",
+        "datatype": "text"
+      },
+      {
+        "name": "thesaurus_xpath",
+        "label": "Thesaurus XPath",
+        "datatype": "text"
+      },
+      {
+        "name": "thesaurus_override_xpath",
+        "label": "Thesaurus Override XPath",
+        "datatype": "text"
+      },
+      { "name": "joiner", "label": "Joiner string", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_CONTROL_SET"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] },
+      "delete": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] }
+    }
+  },
+  "ahn": {
+    "name": "ahn",
+    "label": "Hold Notification",
+    "table": "action.hold_notification",
+    "pkey": "id",
+    "pkey_sequence": "action.hold_notification_id_seq",
+    "fields": [
+      {
+        "name": "hold",
+        "label": "Hold",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "Notification ID", "datatype": "id" },
+      { "name": "method", "label": "Notification Method", "datatype": "text" },
+      { "name": "note", "label": "Notification Note", "datatype": "text" },
+      {
+        "name": "notify_staff",
+        "label": "Notifying Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "notify_time",
+        "label": "Notification Date/Time",
+        "datatype": "timestamp"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_HOLD_NOTIFICATION"] },
+      "retrieve": { "perms": ["VIEW_HOLD_NOTIFICATION"] },
+      "update": { "perms": ["CREATE_HOLD_NOTIFICATION"] },
+      "delete": { "perms": ["CREATE_HOLD_NOTIFICATION"] }
+    }
+  },
+  "ahopl": {
+    "name": "ahopl",
+    "label": "Hold On Pull List",
+    "source": "( SELECT ahr.*, COALESCE(acplo.position, acpl_ordered.fallback_position) AS copy_location_order_position, CASE WHEN au.alias IS NOT NULL THEN au.alias ELSE au.first_given_name END AS usr_alias_or_first_given_name, au.first_given_name AS usr_first_given_name, au.second_given_name AS usr_second_given_name, au.family_name AS usr_family_name, au.prefix AS usr_prefix, au.suffix AS usr_suffix, au.alias AS usr_alias, CASE WHEN au.alias IS NOT NULL THEN au.alias ELSE REGEXP_REPLACE(ARRAY_TO_STRING(ARRAY[ COALESCE(au.family_name, ''), COALESCE(au.suffix, ''), ', ', COALESCE(au.prefix, ''), COALESCE(au.first_given_name, ''), COALESCE(au.second_given_name, '') ], ' '), E'\\s+,', ',') END AS usr_alias_or_display_name, REGEXP_REPLACE(ARRAY_TO_STRING(ARRAY[ COALESCE(au.family_name, ''), COALESCE(au.suffix, ''), ', ', COALESCE(au.prefix, ''), COALESCE(au.first_given_name, ''), COALESCE(au.second_given_name, '') ], ' '), E'\\s+,', ',') AS usr_display_name, TRIM(acnp.label || ' ' || acn.label || ' ' || acns.label) AS call_number_label, siss.label AS issuance_label, (ahr.usr <> ahr.requestor) AS is_staff_hold, ahcm_1.copy_count AS potential_copies FROM action.hold_request ahr JOIN asset.copy acp ON (acp.id = ahr.current_copy) JOIN asset.call_number acn ON (acp.call_number = acn.id) JOIN asset.call_number_prefix acnp ON (acn.prefix = acnp.id) JOIN asset.call_number_suffix acns ON (acn.suffix = acns.id) JOIN actor.usr au ON (au.id = ahr.usr) JOIN ( SELECT *, (ROW_NUMBER() OVER (ORDER BY name) + 1000000) AS fallback_position FROM asset.copy_location ) acpl_ordered ON (acpl_ordered.id = acp.location) LEFT JOIN actor.usr_standing_penalty ausp  ON (ahr.usr = ausp.usr AND (ausp.stop_date IS NULL OR ausp.stop_date > NOW())) LEFT JOIN config.standing_penalty csp ON ( csp.id = ausp.standing_penalty AND  csp.block_list LIKE '%CAPTURE%' AND ( (csp.org_depth IS NULL AND ahr.pickup_lib = ausp.org_unit) OR (csp.org_depth IS NOT NULL AND ahr.pickup_lib IN ( SELECT id FROM actor.org_unit_descendants(ausp.org_unit, csp.org_depth)) ) ) ) JOIN ( SELECT COUNT(target_copy) AS copy_count, hold FROM action.hold_copy_map GROUP BY 2 ) ahcm_1 ON (ahcm_1.hold = ahr.id) LEFT JOIN serial.issuance siss ON (ahr.hold_type = 'I' AND siss.id = ahr.target) LEFT JOIN asset.copy_location_order acplo ON (acp.location = acplo.location AND acp.circ_lib = acplo.org) WHERE ahr.capture_time IS NULL AND ahr.cancel_time IS NULL AND csp.id IS NULL AND (ahr.expire_time is NULL OR ahr.expire_time > NOW()) AND acp.status IN (0,7) )",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "status",
+        "label": "Status",
+        "virtual": true,
+        "datatype": "text"
+      },
+      {
+        "name": "transit",
+        "label": "Transit",
+        "virtual": true,
+        "type": "link",
+        "key": "hold",
+        "class": "ahtc",
+        "reltype": "might_have",
+        "datatype": "text"
+      },
+      {
+        "name": "capture_time",
+        "label": "Capture Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "current_copy",
+        "label": "Currently Targeted Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "email_notify",
+        "label": "Notify by Email?",
+        "datatype": "bool"
+      },
+      {
+        "name": "expire_time",
+        "label": "Hold Expire Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "fulfillment_lib",
+        "label": "Fulfilling Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "fulfillment_staff",
+        "label": "Fulfilling Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "fulfillment_time",
+        "label": "Fulfillment Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "hold_type", "label": "Hold Type", "datatype": "text" },
+      {
+        "name": "holdable_formats",
+        "label": "Holdable Formats (for M-type hold)",
+        "datatype": "text"
+      },
+      { "name": "id", "label": "Hold ID", "datatype": "id" },
+      {
+        "name": "phone_notify",
+        "label": "Notifications Phone Number",
+        "datatype": "text"
+      },
+      {
+        "name": "sms_notify",
+        "label": "Notifications SMS Number",
+        "datatype": "text"
+      },
+      {
+        "name": "sms_carrier",
+        "label": "Notifications SMS Carrier",
+        "type": "link",
+        "key": "id",
+        "class": "csc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "pickup_lib",
+        "label": "Pickup Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "prev_check_time",
+        "label": "Last Targeting Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "request_lib",
+        "label": "Requesting Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "request_time",
+        "label": "Request Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "requestor",
+        "label": "Requesting User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "selection_depth",
+        "label": "Item Selection Depth",
+        "datatype": "text"
+      },
+      {
+        "name": "selection_ou",
+        "label": "Selection Locus",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "target", "label": "Target Object ID", "datatype": "link" },
+      {
+        "name": "usr",
+        "label": "Hold User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_time",
+        "label": "Hold Cancel Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "notify_time",
+        "label": "Notify Time",
+        "virtual": true,
+        "datatype": "timestamp"
+      },
+      {
+        "name": "notify_count",
+        "label": "Notify Count",
+        "virtual": true,
+        "datatype": "int"
+      },
+      {
+        "name": "notifications",
+        "label": "Notifications",
+        "virtual": true,
+        "type": "link",
+        "key": "hold",
+        "class": "ahn",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "bib_rec",
+        "label": "Bib Record link",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rhrr",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "eligible_copies",
+        "label": "Eligible Copies",
+        "virtual": true,
+        "type": "link",
+        "key": "hold",
+        "class": "ahcm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "frozen", "label": "Currently Frozen", "datatype": "bool" },
+      {
+        "name": "thaw_date",
+        "label": "Activation Date",
+        "datatype": "timestamp"
+      },
+      { "name": "shelf_time", "label": "Shelf Time", "datatype": "timestamp" },
+      {
+        "name": "cancel_cause",
+        "label": "Cancelation cause",
+        "type": "link",
+        "key": "id",
+        "class": "ahrcc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_note",
+        "label": "Cancelation note",
+        "datatype": "text"
+      },
+      { "name": "cut_in_line", "label": "Top of Queue", "datatype": "bool" },
+      {
+        "name": "mint_condition",
+        "label": "Is Mint Condition",
+        "datatype": "bool"
+      },
+      {
+        "name": "shelf_expire_time",
+        "label": "Shelf Expire Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "notes",
+        "label": "Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "hold",
+        "class": "ahrn",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "current_shelf_lib",
+        "label": "Current Shelf Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "acq_request",
+        "label": "Acquisition Request",
+        "type": "link",
+        "key": "id",
+        "class": "aur",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_location_order_position",
+        "label": "Copy Location Sort Order",
+        "datatype": "int"
+      },
+      {
+        "name": "usr_first_given_name",
+        "label": "User First Given Name",
+        "datatype": "text"
+      },
+      {
+        "name": "usr_second_given_name",
+        "label": "User Second Given Name",
+        "datatype": "text"
+      },
+      {
+        "name": "usr_family_name",
+        "label": "User Family Name",
+        "datatype": "text"
+      },
+      { "name": "usr_prefix", "label": "User Prefix", "datatype": "text" },
+      { "name": "usr_suffix", "label": "User Suffix", "datatype": "text" },
+      {
+        "name": "usr_alias_or_first_given_name",
+        "label": "User Alias or First Given Name",
+        "datatype": "text"
+      },
+      {
+        "name": "usr_display_name",
+        "label": "User Display Name",
+        "datatype": "text"
+      },
+      {
+        "name": "usr_alias_or_display_name",
+        "label": "User Alias or Display Name",
+        "datatype": "text"
+      },
+      { "name": "usr_alias", "label": "User Alias", "datatype": "text" },
+      {
+        "name": "call_number_label",
+        "label": "Call Number Label",
+        "datatype": "text"
+      },
+      {
+        "name": "issuance_label",
+        "label": "Issuance Label",
+        "datatype": "text"
+      },
+      {
+        "name": "is_staff_hold",
+        "label": "Is Staff Hold?",
+        "datatype": "bool"
+      },
+      {
+        "name": "potential_copies",
+        "label": "Potential Copies",
+        "datatype": "int"
+      },
+      { "name": "behind_desk", "label": "Behind Desk", "datatype": "bool" }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_HOLD"] } }
+  },
+  "ahr": {
+    "name": "ahr",
+    "label": "Hold Request",
+    "table": "action.hold_request",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "action.hold_request_id_seq",
+    "fields": [
+      {
+        "name": "status",
+        "label": "Status",
+        "virtual": true,
+        "datatype": "text"
+      },
+      {
+        "name": "transit",
+        "label": "Transit",
+        "virtual": true,
+        "type": "link",
+        "key": "hold",
+        "class": "ahtc",
+        "reltype": "might_have",
+        "datatype": "text"
+      },
+      {
+        "name": "capture_time",
+        "label": "Capture Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "current_copy",
+        "label": "Currently Targeted Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "email_notify",
+        "label": "Notify by Email?",
+        "datatype": "bool"
+      },
+      {
+        "name": "expire_time",
+        "label": "Hold Expire Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "fulfillment_lib",
+        "label": "Fulfilling Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "fulfillment_staff",
+        "label": "Fulfilling Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "fulfillment_time",
+        "label": "Fulfillment Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "hold_type", "label": "Hold Type", "datatype": "text" },
+      {
+        "name": "holdable_formats",
+        "label": "Holdable Formats (for M-type hold)",
+        "datatype": "text"
+      },
+      { "name": "id", "label": "Hold ID", "datatype": "id" },
+      {
+        "name": "phone_notify",
+        "label": "Notifications Phone Number",
+        "datatype": "text"
+      },
+      {
+        "name": "sms_notify",
+        "label": "Notifications SMS Number",
+        "datatype": "text"
+      },
+      {
+        "name": "sms_carrier",
+        "label": "Notifications SMS Carrier",
+        "type": "link",
+        "key": "id",
+        "class": "csc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "pickup_lib",
+        "label": "Pickup Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "prev_check_time",
+        "label": "Last Targeting Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "request_lib",
+        "label": "Requesting Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "request_time",
+        "label": "Request Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "requestor",
+        "label": "Requesting User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "selection_depth",
+        "label": "Item Selection Depth",
+        "datatype": "text"
+      },
+      {
+        "name": "selection_ou",
+        "label": "Selection Locus",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "target", "label": "Target Object ID", "datatype": "link" },
+      {
+        "name": "usr",
+        "label": "Hold User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_time",
+        "label": "Hold Cancel Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "notify_time",
+        "label": "Notify Time",
+        "virtual": true,
+        "datatype": "timestamp"
+      },
+      {
+        "name": "notify_count",
+        "label": "Notify Count",
+        "virtual": true,
+        "datatype": "int"
+      },
+      {
+        "name": "notifications",
+        "label": "Notifications",
+        "virtual": true,
+        "type": "link",
+        "key": "hold",
+        "class": "ahn",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "bib_rec",
+        "label": "Bib Record link",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rhrr",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "eligible_copies",
+        "label": "Eligible Copies",
+        "virtual": true,
+        "type": "link",
+        "key": "hold",
+        "class": "ahcm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "frozen", "label": "Currently Frozen", "datatype": "bool" },
+      {
+        "name": "thaw_date",
+        "label": "Activation Date",
+        "datatype": "timestamp"
+      },
+      { "name": "shelf_time", "label": "Shelf Time", "datatype": "timestamp" },
+      {
+        "name": "cancel_cause",
+        "label": "Cancelation cause",
+        "type": "link",
+        "key": "id",
+        "class": "ahrcc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_note",
+        "label": "Cancelation note",
+        "datatype": "text"
+      },
+      { "name": "cut_in_line", "label": "Top of Queue", "datatype": "bool" },
+      {
+        "name": "mint_condition",
+        "label": "Is Mint Condition",
+        "datatype": "bool"
+      },
+      {
+        "name": "shelf_expire_time",
+        "label": "Shelf Expire Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "notes",
+        "label": "Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "hold",
+        "class": "ahrn",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "current_shelf_lib",
+        "label": "Current Shelf Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "behind_desk", "label": "Behind Desk", "datatype": "bool" },
+      {
+        "name": "acq_request",
+        "label": "Acquisition Request",
+        "type": "link",
+        "key": "id",
+        "class": "aur",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_HOLD"] } }
+  },
+  "ahrcc": {
+    "name": "ahrcc",
+    "label": "Hold Request Cancel Cause",
+    "restrict_primary": "100",
+    "table": "action.hold_request_cancel_cause",
+    "pkey": "id",
+    "pkey_sequence": "action.hold_request_cancel_cause_id_seq",
+    "fields": [
+      { "name": "id", "label": "Cause ID", "datatype": "id" },
+      {
+        "name": "label",
+        "label": "Cause Label",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_HOLD_CANCEL_CAUSE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_HOLD_CANCEL_CAUSE"] },
+      "delete": { "perms": ["ADMIN_HOLD_CANCEL_CAUSE"] }
+    }
+  },
+  "ahrn": {
+    "name": "ahrn",
+    "label": "Hold Request Note",
+    "table": "action.hold_request_note",
+    "pkey": "id",
+    "pkey_sequence": "action.hold_request_note_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "hold",
+        "label": "Hold ID",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "title", "label": "Title", "datatype": "text" },
+      { "name": "body", "label": "Body", "datatype": "text" },
+      { "name": "slip", "label": "Slip?", "datatype": "bool" },
+      { "name": "pub", "label": "Pub?", "datatype": "bool" },
+      { "name": "staff", "label": "Staff?", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["UPDATE_HOLD"] },
+      "retrieve": { "perms": ["VIEW_USER"] },
+      "update": { "perms": ["UPDATE_HOLD"] },
+      "delete": { "perms": ["UPDATE_HOLD"] }
+    }
+  },
+  "ahtc": {
+    "name": "ahtc",
+    "label": "Hold Transit",
+    "table": "action.hold_transit_copy",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "action.transit_copy_id_seq",
+    "fields": [
+      {
+        "name": "copy_status",
+        "label": "Copy Status at Transit",
+        "type": "link",
+        "key": "id",
+        "class": "ccs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "dest",
+        "label": "Destination Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "dest_recv_time",
+        "label": "Receive Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "hold",
+        "label": "Hold requiring Transit",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "Transit ID", "datatype": "id" },
+      {
+        "name": "persistant_transfer",
+        "label": "Is Persistent?",
+        "datatype": "bool"
+      },
+      { "name": "prev_hop", "label": "Previous Stop", "datatype": "link" },
+      {
+        "name": "source",
+        "label": "Sending Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "source_send_time",
+        "label": "Send Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "target_copy",
+        "label": "Transited Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "transit_copy",
+        "label": "Base Transit",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "atc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "prev_dest",
+        "label": "Prev Destination Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "cancel_time",
+        "label": "Cancel Date/Time",
+        "datatype": "timestamp"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["TRANSIT_COPY"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_TRANSIT"] },
+      "delete": { "perms": ["DELETE_TRANSIT"] }
+    }
+  },
+  "aihu": {
+    "name": "aihu",
+    "label": "In House Use",
+    "table": "action.in_house_use",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "action.in_house_use_id_seq",
+    "fields": [
+      { "name": "id", "label": "Use ID", "datatype": "id" },
+      {
+        "name": "item",
+        "label": "Item",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "int"
+      },
+      {
+        "name": "org_unit",
+        "label": "Using Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "staff",
+        "label": "Recording Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "use_time", "label": "Use Date/Time", "datatype": "timestamp" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "aiit": {
+    "name": "aiit",
+    "label": "Non-bibliographic Invoice Item Type",
+    "table": "acq.invoice_item_type",
+    "pkey": "code",
+    "fields": [
+      { "name": "code", "label": "Code", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Label", "i18n": true, "datatype": "text" },
+      { "name": "prorate", "label": "Prorate?", "datatype": "bool" },
+      { "name": "blanket", "label": "Blanket?", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_INVOICE_ITEM_TYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_INVOICE_ITEM_TYPE"] },
+      "delete": { "perms": ["DELETE_INVOICE_ITEM_TYPE"] }
+    }
+  },
+  "alci": {
+    "name": "alci",
+    "label": "Latest Inventory",
+    "table": "asset.latest_inventory",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "asset.latest_inventory_id_seq",
+    "fields": [
+      { "name": "id", "label": "Latest Inventory ID", "datatype": "id" },
+      {
+        "name": "inventory_date",
+        "label": "Latest Inventory Date",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "inventory_workstation",
+        "label": "Latest Inventory Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy",
+        "label": "Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "create": {}, "retrieve": {}, "update": {}, "delete": {} }
+  },
+  "alhr": {
+    "name": "alhr",
+    "label": "Last Captured Hold Request",
+    "source": "( SELECT ahr.* FROM action.hold_request ahr JOIN (SELECT current_copy, MAX(capture_time) AS capture_time FROM action.hold_request WHERE capture_time IS NOT NULL AND current_copy IS NOT NULL AND fulfillment_time IS NULL GROUP BY current_copy)x USING (current_copy, capture_time) )",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "status",
+        "label": "Status",
+        "virtual": true,
+        "datatype": "text"
+      },
+      {
+        "name": "transit",
+        "label": "Transit",
+        "virtual": true,
+        "type": "link",
+        "key": "hold",
+        "class": "ahtc",
+        "reltype": "might_have",
+        "datatype": "text"
+      },
+      {
+        "name": "capture_time",
+        "label": "Capture Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "current_copy",
+        "label": "Currently Targeted Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "email_notify",
+        "label": "Notify by Email?",
+        "datatype": "bool"
+      },
+      {
+        "name": "expire_time",
+        "label": "Hold Expire Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "fulfillment_lib",
+        "label": "Fulfilling Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "fulfillment_staff",
+        "label": "Fulfilling Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "fulfillment_time",
+        "label": "Fulfillment Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "hold_type", "label": "Hold Type", "datatype": "text" },
+      {
+        "name": "holdable_formats",
+        "label": "Holdable Formats (for M-type hold)",
+        "datatype": "text"
+      },
+      { "name": "id", "label": "Hold ID", "datatype": "id" },
+      {
+        "name": "phone_notify",
+        "label": "Notifications Phone Number",
+        "datatype": "text"
+      },
+      {
+        "name": "pickup_lib",
+        "label": "Pickup Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "prev_check_time",
+        "label": "Last Targeting Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "request_lib",
+        "label": "Requesting Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "request_time",
+        "label": "Request Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "requestor",
+        "label": "Requesting User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "selection_depth",
+        "label": "Item Selection Depth",
+        "datatype": "text"
+      },
+      {
+        "name": "selection_ou",
+        "label": "Selection Locus",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "target", "label": "Target Object ID", "datatype": "link" },
+      {
+        "name": "usr",
+        "label": "Hold User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_time",
+        "label": "Hold Cancel Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "notify_time",
+        "label": "Notify Time",
+        "virtual": true,
+        "datatype": "timestamp"
+      },
+      {
+        "name": "notify_count",
+        "label": "Notify Count",
+        "virtual": true,
+        "datatype": "int"
+      },
+      {
+        "name": "notifications",
+        "label": "Notifications",
+        "virtual": true,
+        "type": "link",
+        "key": "hold",
+        "class": "ahn",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "bib_rec",
+        "label": "Bib Record link",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rhrr",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "eligible_copies",
+        "label": "Eligible Copies",
+        "virtual": true,
+        "type": "link",
+        "key": "hold",
+        "class": "ahcm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "frozen", "label": "Currently Frozen", "datatype": "bool" },
+      {
+        "name": "thaw_date",
+        "label": "Activation Date",
+        "datatype": "timestamp"
+      },
+      { "name": "shelf_time", "label": "Shelf Time", "datatype": "timestamp" },
+      {
+        "name": "cancel_cause",
+        "label": "Cancelation cause",
+        "type": "link",
+        "key": "id",
+        "class": "ahrcc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_note",
+        "label": "Cancelation note",
+        "datatype": "text"
+      },
+      { "name": "cut_in_line", "label": "Top of Queue", "datatype": "bool" },
+      {
+        "name": "mint_condition",
+        "label": "Is Mint Condition",
+        "datatype": "bool"
+      },
+      {
+        "name": "shelf_expire_time",
+        "label": "Shelf Expire Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "notes",
+        "label": "Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "hold",
+        "class": "ahrn",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "current_shelf_lib",
+        "label": "Current Shelf Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "behind_desk", "label": "Behind Desk", "datatype": "bool" },
+      {
+        "name": "acq_request",
+        "label": "Acquisition Request",
+        "type": "link",
+        "key": "id",
+        "class": "aur",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "amtr": {
+    "name": "amtr",
+    "label": "Matrix Test Result",
+    "virtual": true,
+    "pkey": "matchpoint",
+    "fields": [
+      {
+        "name": "matchpoint",
+        "label": "Matchpoint ID",
+        "type": "link",
+        "key": "id",
+        "class": "ccmm",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      { "name": "success", "label": "Success", "datatype": "bool" },
+      { "name": "fail_part", "label": "Failure Part", "datatype": "text" }
+    ]
+  },
+  "ancc": {
+    "name": "ancc",
+    "label": "Non-cataloged Circulation",
+    "table": "action.non_cataloged_circulation",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "action.non_cataloged_circulation_id_seq",
+    "fields": [
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "circ_time",
+        "label": "Circulation Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "id", "label": "Non-cat Circulation ID", "datatype": "id" },
+      {
+        "name": "item_type",
+        "label": "Non-cat Item Type",
+        "type": "link",
+        "key": "id",
+        "class": "cnct",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "patron",
+        "label": "Patron",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "staff",
+        "label": "Circulating Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "duedate",
+        "label": "Virtual Due Date/Time",
+        "virtual": true,
+        "datatype": "timestamp"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_CIRCULATIONS"] } }
+  },
+  "ancihu": {
+    "name": "ancihu",
+    "label": "Non-cataloged In House Use",
+    "table": "action.non_cat_in_house_use",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "action.non_cat_in_house_use_id_seq",
+    "fields": [
+      { "name": "id", "label": "Use ID", "datatype": "id" },
+      {
+        "name": "item_type",
+        "label": "Item Type",
+        "type": "link",
+        "key": "id",
+        "class": "cnct",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "org_unit",
+        "label": "Using Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "staff",
+        "label": "Recording Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "use_time", "label": "Use Date/Time", "datatype": "timestamp" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "aoa": {
+    "name": "aoa",
+    "label": "Org Address",
+    "table": "actor.org_address",
+    "pkey": "id",
+    "pkey_sequence": "actor.org_address_id_seq",
+    "fields": [
+      { "name": "address_type", "datatype": "text" },
+      { "name": "city", "datatype": "text" },
+      { "name": "country", "datatype": "text" },
+      { "name": "county", "datatype": "text" },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "org_unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "post_code", "datatype": "text" },
+      { "name": "state", "datatype": "text" },
+      { "name": "street1", "datatype": "text" },
+      { "name": "street2", "datatype": "text" },
+      { "name": "valid", "datatype": "bool" },
+      { "name": "san", "label": "SAN", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_ORG_ADDRESS"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_ORG_ADDRESS"] },
+      "delete": { "perms": ["DELETE_ORG_ADDRESS"] }
+    }
+  },
+  "aoc": {
+    "name": "aoc",
+    "label": "Open Circulation",
+    "table": "action.open_circulation",
+    "pkey": "id",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "checkin_lib", "datatype": "link" },
+      { "name": "checkin_staff", "datatype": "link" },
+      { "name": "checkin_time", "datatype": "timestamp" },
+      { "name": "circ_lib", "datatype": "org_unit" },
+      { "name": "circ_staff", "datatype": "link" },
+      { "name": "desk_renewal", "datatype": "bool" },
+      { "name": "due_date", "datatype": "timestamp" },
+      { "name": "duration", "datatype": "interval" },
+      {
+        "name": "duration_rule",
+        "type": "link",
+        "key": "name",
+        "class": "crcd",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "fine_interval", "datatype": "interval" },
+      { "name": "id", "datatype": "id" },
+      { "name": "max_fine", "datatype": "money" },
+      {
+        "name": "max_fine_rule",
+        "type": "link",
+        "key": "name",
+        "class": "crmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "opac_renewal", "datatype": "bool" },
+      { "name": "phone_renewal", "datatype": "bool" },
+      { "name": "recurring_fine", "datatype": "money" },
+      {
+        "name": "recurring_fine_rule",
+        "type": "link",
+        "key": "name",
+        "class": "crrf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "renewal_remaining", "datatype": "int" },
+      { "name": "grace_period", "datatype": "interval" },
+      { "name": "stop_fines", "datatype": "text" },
+      { "name": "stop_fines_time", "datatype": "timestamp" },
+      { "name": "target_copy", "datatype": "link" },
+      { "name": "usr", "datatype": "link" },
+      { "name": "xact_finish", "datatype": "timestamp" },
+      { "name": "xact_start", "datatype": "timestamp" },
+      {
+        "name": "circulation",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ]
+  },
+  "aou": {
+    "name": "aou",
+    "label": "Organizational Unit",
+    "table": "actor.org_unit",
+    "pkey": "id",
+    "pkey_sequence": "actor.org_unit_id_seq",
+    "fields": [
+      {
+        "name": "children",
+        "label": "Subordinate Organizational Units",
+        "virtual": true,
+        "type": "link",
+        "key": "parent_ou",
+        "class": "aou",
+        "reltype": "has_many",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "billing_address",
+        "label": "Billing Address",
+        "type": "link",
+        "key": "id",
+        "class": "aoa",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "holds_address",
+        "label": "Holds Receiving Address",
+        "type": "link",
+        "key": "id",
+        "class": "aoa",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "id",
+        "label": "Organizational Unit ID",
+        "selector": "shortname",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "ill_address",
+        "label": "ILL Receiving Address",
+        "type": "link",
+        "key": "id",
+        "class": "aoa",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "mailing_address",
+        "label": "Mailing Address",
+        "type": "link",
+        "key": "id",
+        "class": "aoa",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      {
+        "name": "ou_type",
+        "label": "Organizational Unit Type",
+        "type": "link",
+        "key": "id",
+        "class": "aout",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "parent_ou",
+        "label": "Parent Organizational Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "shortname",
+        "label": "Short (Policy) Name",
+        "required": true,
+        "datatype": "text"
+      },
+      { "name": "email", "label": "Email Address", "datatype": "text" },
+      { "name": "phone", "label": "Phone Number", "datatype": "text" },
+      { "name": "opac_visible", "label": "OPAC Visible", "datatype": "bool" },
+      {
+        "name": "fiscal_calendar",
+        "label": "Fiscal Calendar",
+        "type": "link",
+        "key": "id",
+        "class": "acqfc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "users",
+        "label": "Users",
+        "virtual": true,
+        "type": "link",
+        "key": "home_ou",
+        "class": "au",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "closed_dates",
+        "label": "Closed Dates",
+        "virtual": true,
+        "type": "link",
+        "key": "org_unit",
+        "class": "aoucd",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "circulations",
+        "label": "Circulations",
+        "virtual": true,
+        "type": "link",
+        "key": "circ_lib",
+        "class": "circ",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "settings",
+        "label": "Settings",
+        "virtual": true,
+        "type": "link",
+        "key": "org_unit",
+        "class": "aous",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "addresses",
+        "label": "Addresses",
+        "virtual": true,
+        "type": "link",
+        "key": "org_unit",
+        "class": "aoa",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "checkins",
+        "label": "Checkins",
+        "virtual": true,
+        "type": "link",
+        "key": "checkin_lib",
+        "class": "circ",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "workstations",
+        "label": "Workstations",
+        "virtual": true,
+        "type": "link",
+        "key": "owning_lib",
+        "class": "aws",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "fund_alloc_pcts",
+        "label": "Fund Allocation Percentages",
+        "virtual": true,
+        "type": "link",
+        "key": "org",
+        "class": "acqfap",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_location_orders",
+        "label": "Copy Location Orders",
+        "virtual": true,
+        "type": "link",
+        "key": "org",
+        "class": "acplo",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "atc_prev_dests",
+        "label": "Transit Copy Prev Destinations",
+        "virtual": true,
+        "type": "link",
+        "key": "prev_dest",
+        "class": "atc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "resv_requests",
+        "label": "Reservation Requests",
+        "virtual": true,
+        "type": "link",
+        "key": "request_lib",
+        "class": "bresv",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "resv_pickups",
+        "label": "Reservation Pickups",
+        "virtual": true,
+        "type": "link",
+        "key": "pickup_lib",
+        "class": "bresv",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "rsrc_types",
+        "label": "Resource Types",
+        "virtual": true,
+        "type": "link",
+        "key": "owner",
+        "class": "brt",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "resources",
+        "label": "Resources",
+        "virtual": true,
+        "type": "link",
+        "key": "owner",
+        "class": "brsrc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "rsrc_attrs",
+        "label": "Resource Attributes",
+        "virtual": true,
+        "type": "link",
+        "key": "owner",
+        "class": "bra",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "attr_vals",
+        "label": "Attribute Values",
+        "virtual": true,
+        "type": "link",
+        "key": "owner",
+        "class": "brav",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "hours_of_operation",
+        "label": "Hours of Operation",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "aouhoo",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_ORG_UNIT"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_ORG_UNIT"] },
+      "delete": { "perms": ["DELETE_ORG_UNIT"] }
+    }
+  },
+  "aoucd": {
+    "name": "aoucd",
+    "label": "Closed Dates",
+    "table": "actor.org_unit_closed",
+    "pkey": "id",
+    "pkey_sequence": "actor.org_unit_closed_id_seq",
+    "fields": [
+      { "name": "close_end", "datatype": "timestamp" },
+      { "name": "close_start", "datatype": "timestamp" },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "org_unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "reason", "datatype": "text" },
+      { "name": "full_day", "datatype": "bool" },
+      { "name": "multi_day", "datatype": "bool" },
+      {
+        "name": "emergency_closing",
+        "type": "link",
+        "key": "id",
+        "class": "aec",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_ORG_UNIT_CLOSING"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_ORG_UNIT_CLOSING"] },
+      "delete": { "perms": ["DELETE_ORG_UNIT_CLOSING"] }
+    }
+  },
+  "aouct": {
+    "name": "aouct",
+    "label": "Org Unit Custom Tree",
+    "table": "actor.org_unit_custom_tree",
+    "pkey": "id",
+    "pkey_sequence": "actor.org_unit_custom_tree_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "active", "label": "Active", "datatype": "bool" },
+      { "name": "purpose", "label": "Purpose", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ORG_UNIT_CUSTOM_TREE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_ORG_UNIT_CUSTOM_TREE"] },
+      "delete": { "perms": ["ADMIN_ORG_UNIT_CUSTOM_TREE"] }
+    }
+  },
+  "aouctn": {
+    "name": "aouctn",
+    "label": "Org Unit Custom Tree Node",
+    "table": "actor.org_unit_custom_tree_node",
+    "pkey": "id",
+    "pkey_sequence": "actor.org_unit_custom_tree_node_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "tree",
+        "label": "Tree",
+        "type": "link",
+        "key": "id",
+        "class": "aouct",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "org_unit",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "parent_node",
+        "label": "Parent",
+        "type": "link",
+        "key": "id",
+        "class": "aouctn",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "sibling_order",
+        "label": "Sibling Sort Order",
+        "datatype": "int"
+      },
+      {
+        "name": "children",
+        "label": "Children",
+        "virtual": true,
+        "type": "link",
+        "key": "parent_node",
+        "class": "aouctn",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ORG_UNIT_CUSTOM_TREE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_ORG_UNIT_CUSTOM_TREE"] },
+      "delete": { "perms": ["ADMIN_ORG_UNIT_CUSTOM_TREE"] }
+    }
+  },
+  "aouhoo": {
+    "name": "aouhoo",
+    "label": "Hours of Operation",
+    "table": "actor.hours_of_operation",
+    "pkey": "id",
+    "fields": [
+      { "name": "dow_0_close", "datatype": "text" },
+      { "name": "dow_0_open", "datatype": "text" },
+      { "name": "dow_1_close", "datatype": "text" },
+      { "name": "dow_1_open", "datatype": "text" },
+      { "name": "dow_2_close", "datatype": "text" },
+      { "name": "dow_2_open", "datatype": "text" },
+      { "name": "dow_3_close", "datatype": "text" },
+      { "name": "dow_3_open", "datatype": "text" },
+      { "name": "dow_4_close", "datatype": "text" },
+      { "name": "dow_4_open", "datatype": "text" },
+      { "name": "dow_5_close", "datatype": "text" },
+      { "name": "dow_5_open", "datatype": "text" },
+      { "name": "dow_6_close", "datatype": "text" },
+      { "name": "dow_6_open", "datatype": "text" },
+      {
+        "name": "id",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "might_have",
+        "datatype": "id"
+      },
+      { "name": "org_unit", "virtual": true, "datatype": "org_unit" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_HOURS_OF_OPERATION"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_HOURS_OF_OPERATION"] },
+      "delete": { "perms": ["DELETE_HOURS_OF_OPERATION"] }
+    }
+  },
+  "aoup": {
+    "name": "aoup",
+    "label": "Org Unit Proximity",
+    "table": "actor.org_unit_proximity",
+    "pkey": "id",
+    "pkey_sequence": "actor.org_unit_proximity_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "from_org",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "to_org",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "prox", "datatype": "int" }
+    ]
+  },
+  "aoupa": {
+    "name": "aoupa",
+    "label": "Org Unit Proximity Adjustment",
+    "table": "actor.org_unit_proximity_adjustment",
+    "pkey": "id",
+    "pkey_sequence": "actor.org_unit_proximity_adjustment_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "item_circ_lib",
+        "label": "Item Circ Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "item_owning_lib",
+        "label": "Item Owning Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "hold_pickup_lib",
+        "label": "Hold Pickup Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "hold_request_lib",
+        "label": "Hold Request Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "copy_location",
+        "label": "Copy Location",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_mod",
+        "label": "Circ Modifier",
+        "type": "link",
+        "key": "code",
+        "class": "ccm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "pos", "label": "Position", "datatype": "int" },
+      {
+        "name": "absolute_adjustment",
+        "label": "Absolute adjustment?",
+        "datatype": "bool"
+      },
+      {
+        "name": "prox_adjustment",
+        "label": "Proximity Adjustment",
+        "datatype": "number"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_PROXIMITY_ADJUSTMENT"] },
+      "retrieve": { "perms": ["ADMIN_PROXIMITY_ADJUSTMENT"] },
+      "update": { "perms": ["ADMIN_PROXIMITY_ADJUSTMENT"] },
+      "delete": { "perms": ["ADMIN_PROXIMITY_ADJUSTMENT"] }
+    }
+  },
+  "aous": {
+    "name": "aous",
+    "label": "Organizational Unit Setting",
+    "table": "actor.org_unit_setting",
+    "pkey": "id",
+    "pkey_sequence": "actor.org_unit_setting_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "text" },
+      {
+        "name": "name",
+        "type": "link",
+        "key": "name",
+        "class": "coust",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "org_unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "value", "datatype": "text" }
+    ]
+  },
+  "aout": {
+    "name": "aout",
+    "label": "Organizational Unit Type",
+    "table": "actor.org_unit_type",
+    "pkey": "id",
+    "pkey_sequence": "actor.org_unit_type_id_seq",
+    "fields": [
+      {
+        "name": "children",
+        "label": "Subordinate Types",
+        "virtual": true,
+        "type": "link",
+        "key": "parent",
+        "class": "aout",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "can_have_users",
+        "label": "Can Have Users?",
+        "datatype": "bool"
+      },
+      {
+        "name": "can_have_vols",
+        "label": "Can Have Volumes?",
+        "datatype": "bool"
+      },
+      { "name": "depth", "label": "Type Depth", "datatype": "int" },
+      {
+        "name": "id",
+        "label": "Type ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "name",
+        "label": "Type Name",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "opac_label",
+        "label": "OPAC Label",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "parent",
+        "label": "Parent Type",
+        "type": "link",
+        "key": "id",
+        "class": "aout",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "org_units",
+        "label": "Org Units",
+        "virtual": true,
+        "type": "link",
+        "key": "ou_type",
+        "class": "aou",
+        "reltype": "has_many",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_ORG_TYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_ORG_TYPE"] },
+      "delete": { "perms": ["DELETE_ORG_TYPE"] }
+    }
+  },
+  "ard": {
+    "name": "ard",
+    "label": "Authority Record Descriptor",
+    "table": "authority.rec_descriptor",
+    "pkey": "id",
+    "pkey_sequence": "authority.rec_descriptor_id_seq",
+    "fields": [
+      { "name": "char_encoding", "datatype": "text" },
+      { "name": "id", "datatype": "text" },
+      {
+        "name": "record",
+        "type": "link",
+        "key": "id",
+        "class": "are",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "record_status", "datatype": "text" },
+      {
+        "name": "thesaurus",
+        "type": "link",
+        "key": "code",
+        "class": "at",
+        "reltype": "might_have",
+        "datatype": "text"
+      }
+    ]
+  },
+  "are": {
+    "name": "are",
+    "label": "Authority Record Entry",
+    "table": "authority.record_entry",
+    "pkey": "id",
+    "pkey_sequence": "authority.record_entry_id_seq",
+    "fields": [
+      { "name": "active", "datatype": "bool" },
+      { "name": "create_date", "datatype": "timestamp" },
+      {
+        "name": "creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "deleted", "datatype": "bool" },
+      { "name": "edit_date", "datatype": "timestamp" },
+      {
+        "name": "editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "id", "datatype": "id" },
+      { "name": "last_xact_id", "datatype": "text" },
+      { "name": "marc", "datatype": "text" },
+      { "name": "source", "datatype": "text" },
+      {
+        "name": "control_set",
+        "label": "Control Set",
+        "type": "link",
+        "key": "id",
+        "class": "acs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "heading", "datatype": "text" },
+      { "name": "simple_heading", "datatype": "text" },
+      {
+        "name": "fixed_fields",
+        "virtual": true,
+        "type": "link",
+        "key": "record",
+        "class": "ard",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "notes",
+        "virtual": true,
+        "type": "link",
+        "key": "record",
+        "class": "arn",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "bib_links",
+        "virtual": true,
+        "type": "link",
+        "key": "authority",
+        "class": "abl",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_RECORD", "IMPORT_MARC"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_AUTHORITY_RECORD"] },
+      "delete": { "perms": ["DELETE_AUTHORITY_RECORD"] }
+    }
+  },
+  "arn": {
+    "name": "arn",
+    "label": "Authority Record Note",
+    "table": "authority.record_note",
+    "pkey": "id",
+    "pkey_sequence": "authority.record_note_id_seq",
+    "fields": [
+      { "name": "create_date", "datatype": "timestamp" },
+      { "name": "creator", "datatype": "link" },
+      { "name": "edit_date", "datatype": "timestamp" },
+      { "name": "editor", "datatype": "link" },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "record",
+        "type": "link",
+        "key": "id",
+        "class": "are",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_RECORD_NOTE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_AUTHORITY_RECORD_NOTE"] },
+      "delete": { "perms": ["DELETE_AUTHORITY_RECORD_NOTE"] }
+    }
+  },
+  "artc": {
+    "name": "artc",
+    "label": "Reservation Transit",
+    "table": "action.reservation_transit_copy",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "action.transit_copy_id_seq",
+    "fields": [
+      {
+        "name": "copy_status",
+        "label": "Copy Status at Transit",
+        "type": "link",
+        "key": "id",
+        "class": "ccs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "dest",
+        "label": "Destination Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "dest_recv_time",
+        "label": "Receive Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "reservation",
+        "label": "Reservation requiring Transit",
+        "type": "link",
+        "key": "id",
+        "class": "bresv",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "Transit ID", "datatype": "id" },
+      {
+        "name": "persistant_transfer",
+        "label": "Is Persistent?",
+        "datatype": "bool"
+      },
+      { "name": "prev_hop", "label": "Previous Stop", "datatype": "link" },
+      {
+        "name": "source",
+        "label": "Sending Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "source_send_time",
+        "label": "Send Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "target_copy",
+        "label": "Transited Copy",
+        "type": "link",
+        "key": "id",
+        "class": "brsrc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "transit_copy",
+        "label": "Base Transit",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "atc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "prev_dest",
+        "label": "Prev Destination Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "cancel_time",
+        "label": "Cancel Date/Time",
+        "datatype": "timestamp"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["TRANSIT_COPY"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_TRANSIT"] },
+      "delete": { "perms": ["DELETE_TRANSIT"] }
+    }
+  },
+  "asc": {
+    "name": "asc",
+    "label": "Asset Statistical Category",
+    "table": "asset.stat_cat",
+    "pkey": "id",
+    "pkey_sequence": "asset.stat_cat_id_seq",
+    "fields": [
+      {
+        "name": "entries",
+        "label": "Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "stat_cat",
+        "class": "asce",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "id",
+        "label": "Stat Cat ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      { "name": "opac_visible", "label": "OPAC Visible", "datatype": "bool" },
+      {
+        "name": "owner",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "sip_field",
+        "label": "SIP Field",
+        "type": "link",
+        "key": "field",
+        "class": "ascsf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "sip_format", "label": "SIP Format", "datatype": "text" },
+      { "name": "required", "label": "Required", "datatype": "bool" },
+      {
+        "name": "checkout_archive",
+        "label": "Checkout Archive",
+        "datatype": "bool"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["STAFF_LOGIN"] } }
+  },
+  "asce": {
+    "name": "asce",
+    "label": "Item Stat Cat Entry",
+    "table": "asset.stat_cat_entry",
+    "pkey": "id",
+    "pkey_sequence": "asset.stat_cat_entry_id_seq",
+    "fields": [
+      { "name": "id", "label": "Entry ID", "datatype": "int" },
+      {
+        "name": "owner",
+        "label": "Entry Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat",
+        "label": "Stat Cat",
+        "type": "link",
+        "key": "id",
+        "class": "asc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "label": "Value", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": { "perms": ["STAFF_LOGIN"] } }
+  },
+  "ascecm": {
+    "name": "ascecm",
+    "label": "Statistical Category Entry Copy Map",
+    "table": "asset.stat_cat_entry_copy_map",
+    "pkey": "id",
+    "pkey_sequence": "asset.stat_cat_entry_copy_map_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "owning_copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat",
+        "type": "link",
+        "key": "id",
+        "class": "asc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat_entry",
+        "type": "link",
+        "key": "id",
+        "class": "asce",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "ascsf": {
+    "name": "ascsf",
+    "label": "SIP Statistical Category Field Identifier",
+    "table": "asset.stat_cat_sip_fields",
+    "pkey": "field",
+    "fields": [
+      {
+        "name": "field",
+        "label": "Field Identifier",
+        "selector": "name",
+        "datatype": "text"
+      },
+      { "name": "name", "label": "Field Name", "datatype": "text" },
+      { "name": "one_only", "label": "Exclusive?", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_COPY_STAT_CAT"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_COPY_STAT_CAT"] },
+      "delete": { "perms": ["DELETE_COPY_STAT_CAT"] }
+    }
+  },
+  "asfg": {
+    "name": "asfg",
+    "label": "Search Filter Group",
+    "table": "actor.search_filter_group",
+    "pkey": "id",
+    "pkey_sequence": "actor.search_filter_group_id_seq",
+    "fields": [
+      { "name": "id", "selector": "label", "datatype": "id" },
+      {
+        "name": "owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "code", "datatype": "text" },
+      { "name": "label", "i18n": true, "datatype": "text" },
+      { "name": "create_date", "datatype": "timestamp" },
+      {
+        "name": "entries",
+        "virtual": true,
+        "type": "link",
+        "key": "grp",
+        "class": "asfge",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SEARCH_FILTER_GROUP"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SEARCH_FILTER_GROUP"] },
+      "delete": { "perms": ["ADMIN_SEARCH_FILTER_GROUP"] }
+    }
+  },
+  "asfge": {
+    "name": "asfge",
+    "label": "Search Filter Group Entry",
+    "table": "actor.search_filter_group_entry",
+    "pkey": "id",
+    "pkey_sequence": "actor.search_filter_group_entry_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "grp",
+        "type": "link",
+        "key": "id",
+        "class": "asfg",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "pos", "datatype": "int" },
+      {
+        "name": "query",
+        "type": "link",
+        "key": "id",
+        "class": "asq",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SEARCH_FILTER_GROUP"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SEARCH_FILTER_GROUP"] },
+      "delete": { "perms": ["ADMIN_SEARCH_FILTER_GROUP"] }
+    }
+  },
+  "ash": {
+    "name": "ash",
+    "label": "Authority Simple Heading",
+    "table": "authority.simple_heading",
+    "pkey": "id",
+    "pkey_sequence": "authority.simple_heading_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "record",
+        "type": "link",
+        "key": "id",
+        "class": "are",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "atag",
+        "type": "link",
+        "key": "id",
+        "class": "acsaf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ]
+  },
+  "asq": {
+    "name": "asq",
+    "label": "Search Query",
+    "table": "actor.search_query",
+    "pkey": "id",
+    "pkey_sequence": "actor.search_query_id_seq",
+    "fields": [
+      { "name": "id", "selector": "label", "datatype": "id" },
+      { "name": "label", "i18n": true, "datatype": "text" },
+      { "name": "query_text", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "asv": {
+    "name": "asv",
+    "label": "Survey",
+    "table": "action.survey",
+    "pkey": "id",
+    "pkey_sequence": "action.survey_id_seq",
+    "fields": [
+      {
+        "name": "questions",
+        "label": "Questions",
+        "virtual": true,
+        "type": "link",
+        "key": "survey",
+        "class": "asvq",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "responses",
+        "label": "Responses",
+        "virtual": true,
+        "type": "link",
+        "key": "survey",
+        "class": "asvr",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "description", "label": "Description", "datatype": "text" },
+      {
+        "name": "end_date",
+        "label": "Survey End Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "id", "label": "Survey ID", "datatype": "id" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "opac", "label": "OPAC Survey?", "datatype": "bool" },
+      {
+        "name": "owner",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "poll", "label": "Poll Style?", "datatype": "bool" },
+      { "name": "required", "label": "Is Required?", "datatype": "bool" },
+      {
+        "name": "start_date",
+        "label": "Survey Start Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "usr_summary",
+        "label": "Display in User Summary",
+        "datatype": "bool"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SURVEY"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SURVEY"] },
+      "delete": { "perms": ["ADMIN_SURVEY"] }
+    }
+  },
+  "asva": {
+    "name": "asva",
+    "label": "Survey Answer",
+    "table": "action.survey_answer",
+    "pkey": "id",
+    "pkey_sequence": "action.survey_answer_id_seq",
+    "fields": [
+      {
+        "name": "responses",
+        "label": "Responses using this Answer",
+        "virtual": true,
+        "type": "link",
+        "key": "answer",
+        "class": "asvr",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "answer", "label": "Answer Text", "datatype": "text" },
+      { "name": "id", "label": "Answer ID", "datatype": "id" },
+      {
+        "name": "question",
+        "label": "Question",
+        "type": "link",
+        "key": "id",
+        "class": "asvq",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SURVEY"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SURVEY"] },
+      "delete": { "perms": ["ADMIN_SURVEY"] }
+    }
+  },
+  "asvq": {
+    "name": "asvq",
+    "label": "User Survey Question",
+    "table": "action.survey_question",
+    "pkey": "id",
+    "pkey_sequence": "action.survey_question_id_seq",
+    "fields": [
+      {
+        "name": "answers",
+        "label": "Answers",
+        "virtual": true,
+        "type": "link",
+        "key": "question",
+        "class": "asva",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "responses",
+        "label": "Responses",
+        "virtual": true,
+        "type": "link",
+        "key": "question",
+        "class": "asvr",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "Question ID", "datatype": "id" },
+      { "name": "question", "label": "Question", "datatype": "text" },
+      {
+        "name": "survey",
+        "label": "Survey",
+        "type": "link",
+        "key": "id",
+        "class": "asv",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SURVEY"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SURVEY"] },
+      "delete": { "perms": ["ADMIN_SURVEY"] }
+    }
+  },
+  "asvr": {
+    "name": "asvr",
+    "label": "Survey Response",
+    "table": "action.survey_response",
+    "pkey": "id",
+    "pkey_sequence": "action.survey_response_id_seq",
+    "fields": [
+      {
+        "name": "answer",
+        "label": "Answer",
+        "type": "link",
+        "key": "id",
+        "class": "asva",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "answer_date",
+        "label": "Answer Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "effective_date",
+        "label": "Effective Answer Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "id", "label": "Answer ID", "datatype": "id" },
+      {
+        "name": "question",
+        "label": "Question",
+        "type": "link",
+        "key": "id",
+        "class": "asvq",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "response_group_id",
+        "label": "Response Group ID",
+        "datatype": "int"
+      },
+      {
+        "name": "survey",
+        "label": "Survey",
+        "type": "link",
+        "key": "id",
+        "class": "asv",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr",
+        "label": "Responding User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SURVEY"] },
+      "retrieve": { "perms": ["VIEW_USER"] },
+      "update": { "perms": ["ADMIN_SURVEY"] },
+      "delete": { "perms": ["ADMIN_SURVEY"] }
+    }
+  },
+  "at": {
+    "name": "at",
+    "label": "Authority Thesaurus",
+    "table": "authority.thesaurus",
+    "pkey": "code",
+    "fields": [
+      {
+        "name": "code",
+        "label": "Thesaurus Code",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "control_set",
+        "label": "Control Set",
+        "type": "link",
+        "key": "id",
+        "class": "acs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "name",
+        "label": "Name",
+        "required": true,
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "short_code", "label": "Short Code", "datatype": "text" },
+      { "name": "uri", "label": "URI", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_CONTROL_SET"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] },
+      "delete": { "perms": ["UPDATE_AUTHORITY_CONTROL_SET"] }
+    }
+  },
+  "atb": {
+    "name": "atb",
+    "label": "Custom Toolbar",
+    "table": "actor.toolbar",
+    "pkey": "id",
+    "pkey_sequence": "actor.toolbar_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "usr",
+        "label": "Owning User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "org",
+        "label": "Owning Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "ws",
+        "label": "Owning Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" },
+      { "name": "layout", "label": "Layout", "datatype": "text" }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["ADMIN_TOOLBAR", "STAFF_LOGIN"] },
+      "create": { "perms": ["ADMIN_TOOLBAR"] },
+      "update": { "perms": ["ADMIN_TOOLBAR"] },
+      "delete": { "perms": ["ADMIN_TOOLBAR"] }
+    }
+  },
+  "atc": {
+    "name": "atc",
+    "label": "Copy Transit",
+    "table": "action.transit_copy",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "action.transit_copy_id_seq",
+    "fields": [
+      {
+        "name": "copy_status",
+        "label": "Pretransit Copy Status",
+        "type": "link",
+        "key": "id",
+        "class": "ccs",
+        "reltype": "has_a",
+        "datatype": "bool"
+      },
+      {
+        "name": "dest",
+        "label": "Destination",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "dest_recv_time",
+        "label": "Receive Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "id", "label": "Transit ID", "datatype": "id" },
+      {
+        "name": "persistant_transfer",
+        "label": "Is Persistent? (unused)",
+        "datatype": "bool"
+      },
+      {
+        "name": "prev_hop",
+        "label": "Previous Hop (unused)",
+        "datatype": "link"
+      },
+      {
+        "name": "source",
+        "label": "Source",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "prev_dest",
+        "label": "Prev Destination",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "source_send_time",
+        "label": "Send Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "target_copy",
+        "label": "Transited Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_time",
+        "label": "Cancel Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "hold_transit_copy",
+        "label": "Hold Transit",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "ahtc",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["TRANSIT_COPY"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_TRANSIT"] },
+      "delete": { "perms": ["DELETE_TRANSIT"] }
+    }
+  },
+  "atclean": {
+    "name": "atclean",
+    "label": "Trigger Event Cleanup",
+    "table": "action_trigger.cleanup",
+    "pkey": "module",
+    "fields": [
+      { "name": "module", "label": "Module Name", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": {
+        "perms": ["ADMIN_TRIGGER_CLEANUP", "CREATE_TRIGGER_CLEANUP"]
+      },
+      "retrieve": {},
+      "update": {
+        "perms": ["ADMIN_TRIGGER_CLEANUP", "UPDATE_TRIGGER_CLEANUP"]
+      },
+      "delete": { "perms": ["ADMIN_TRIGGER_CLEANUP", "DELETE_TRIGGER_CLEANUP"] }
+    }
+  },
+  "atcol": {
+    "name": "atcol",
+    "label": "Trigger Environment Collector",
+    "table": "action_trigger.collector",
+    "pkey": "module",
+    "fields": [
+      { "name": "module", "label": "Module Name", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ]
+  },
+  "atenv": {
+    "name": "atenv",
+    "label": "Trigger Event Environment Entry",
+    "table": "action_trigger.environment",
+    "pkey": "id",
+    "pkey_sequence": "action_trigger.environment_id_seq",
+    "fields": [
+      { "name": "id", "label": "Environment ID", "datatype": "id" },
+      {
+        "name": "event_def",
+        "label": "Event Definition",
+        "type": "link",
+        "key": "id",
+        "class": "atevdef",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "path", "label": "Field Path", "datatype": "text" },
+      {
+        "name": "collector",
+        "label": "Collector",
+        "type": "link",
+        "key": "id",
+        "class": "atcol",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "label", "label": "Label", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": {
+        "perms": ["ADMIN_TRIGGER_EVENT_DEF", "CREATE_TRIGGER_EVENT_DEF"]
+      },
+      "retrieve": {
+        "perms": ["ADMIN_TRIGGER_EVENT_DEF", "VIEW_TRIGGER_EVENT_DEF"]
+      },
+      "update": {
+        "perms": ["ADMIN_TRIGGER_EVENT_DEF", "UPDATE_TRIGGER_EVENT_DEF"]
+      },
+      "delete": {
+        "perms": ["ADMIN_TRIGGER_EVENT_DEF", "DELETE_TRIGGER_EVENT_DEF"]
+      }
+    }
+  },
+  "ateo": {
+    "name": "ateo",
+    "label": "Event Output",
+    "table": "action_trigger.event_output",
+    "pkey": "id",
+    "pkey_sequence": "action_trigger.event_output_id_seq",
+    "fields": [
+      { "name": "id", "label": "Output ID", "datatype": "id" },
+      {
+        "name": "create_time",
+        "label": "Create Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "data", "label": "Data", "datatype": "text" },
+      { "name": "is_error", "label": "Is Error", "datatype": "bool" },
+      {
+        "name": "events",
+        "label": "Events",
+        "virtual": true,
+        "type": "link",
+        "key": "template_output",
+        "class": "atev",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "error_events",
+        "label": "Error Events",
+        "virtual": true,
+        "type": "link",
+        "key": "error_output",
+        "class": "atev",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "retrieve": {},
+      "delete": {
+        "perms": [
+          "ADMIN_TRIGGER_TEMPLATE_OUTPUT",
+          "DELETE_TRIGGER_TEMPLATE_OUTPUT"
+        ]
+      }
+    }
+  },
+  "atev": {
+    "name": "atev",
+    "label": "Trigger Event Entry",
+    "table": "action_trigger.event",
+    "pkey": "id",
+    "pkey_sequence": "action_trigger.event_id_seq",
+    "fields": [
+      { "name": "id", "label": "Event ID", "datatype": "id" },
+      { "name": "target", "label": "Target ID", "datatype": "int" },
+      {
+        "name": "event_def",
+        "label": "Event Definition",
+        "type": "link",
+        "key": "id",
+        "class": "atevdef",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "add_time", "label": "Add Time", "datatype": "timestamp" },
+      { "name": "run_time", "label": "Run Time", "datatype": "timestamp" },
+      { "name": "start_time", "label": "Start Time", "datatype": "timestamp" },
+      {
+        "name": "update_time",
+        "label": "Update Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "complete_time",
+        "label": "Complete Time",
+        "datatype": "timestamp"
+      },
+      { "name": "state", "label": "State", "datatype": "text" },
+      { "name": "user_data", "label": "User Data", "datatype": "text" },
+      {
+        "name": "template_output",
+        "label": "Template Output",
+        "type": "link",
+        "key": "id",
+        "class": "ateo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "error_output",
+        "label": "Error Output",
+        "type": "link",
+        "key": "id",
+        "class": "ateo",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "async_output",
+        "label": "Asynchronous Output",
+        "type": "link",
+        "key": "id",
+        "class": "ateo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "update_process", "label": "Update Process", "datatype": "int" }
+    ]
+  },
+  "atevdef": {
+    "name": "atevdef",
+    "label": "Trigger Event Definition",
+    "table": "action_trigger.event_definition",
+    "pkey": "id",
+    "pkey_sequence": "action_trigger.event_definition_id_seq",
+    "fields": [
+      { "name": "id", "label": "Definition ID", "datatype": "id" },
+      { "name": "active", "label": "Enabled", "datatype": "bool" },
+      {
+        "name": "owner",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "hook",
+        "label": "Hook",
+        "type": "link",
+        "key": "key",
+        "class": "ath",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "validator",
+        "label": "Validator",
+        "type": "link",
+        "key": "module",
+        "class": "atval",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "reactor",
+        "label": "Reactor",
+        "type": "link",
+        "key": "module",
+        "class": "atreact",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cleanup_success",
+        "label": "Success Cleanup",
+        "type": "link",
+        "key": "module",
+        "class": "atclean",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cleanup_failure",
+        "label": "Failure Cleanup",
+        "type": "link",
+        "key": "module",
+        "class": "atclean",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "delay", "label": "Processing Delay", "datatype": "interval" },
+      {
+        "name": "max_delay",
+        "label": "Max Event Validity Delay",
+        "datatype": "interval"
+      },
+      {
+        "name": "delay_field",
+        "label": "Processing Delay Context Field",
+        "datatype": "text"
+      },
+      {
+        "name": "group_field",
+        "label": "Processing Group Context Field",
+        "datatype": "text"
+      },
+      { "name": "template", "label": "Template", "datatype": "text" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "granularity", "label": "Granularity", "datatype": "text" },
+      { "name": "usr_field", "label": "Opt-In User Field", "datatype": "text" },
+      {
+        "name": "opt_in_setting",
+        "label": "Opt-In Setting Type",
+        "type": "link",
+        "key": "name",
+        "class": "cust",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "repeat_delay",
+        "label": "Event Repeatability Delay",
+        "datatype": "interval"
+      },
+      {
+        "name": "message_template",
+        "label": "Message Template",
+        "datatype": "text"
+      },
+      { "name": "message_title", "label": "Message Title", "datatype": "text" },
+      {
+        "name": "message_usr_path",
+        "label": "Message User Path",
+        "datatype": "text"
+      },
+      {
+        "name": "message_library_path",
+        "label": "Message Library Path",
+        "datatype": "text"
+      },
+      {
+        "name": "env",
+        "label": "Environment Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "event_def",
+        "class": "atenv",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "params",
+        "label": "Parameters",
+        "virtual": true,
+        "type": "link",
+        "key": "event_def",
+        "class": "atevparam",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "retention_interval",
+        "label": "Retention Interval",
+        "datatype": "interval"
+      }
+    ],
+    "permacrud": {
+      "create": {
+        "perms": ["ADMIN_TRIGGER_EVENT_DEF", "CREATE_TRIGGER_EVENT_DEF"]
+      },
+      "retrieve": {
+        "perms": ["ADMIN_TRIGGER_EVENT_DEF", "VIEW_TRIGGER_EVENT_DEF"]
+      },
+      "update": {
+        "perms": ["ADMIN_TRIGGER_EVENT_DEF", "UPDATE_TRIGGER_EVENT_DEF"]
+      },
+      "delete": {
+        "perms": ["ADMIN_TRIGGER_EVENT_DEF", "DELETE_TRIGGER_EVENT_DEF"]
+      }
+    }
+  },
+  "atevparam": {
+    "name": "atevparam",
+    "label": "Trigger Event Parameter",
+    "table": "action_trigger.event_params",
+    "pkey": "id",
+    "pkey_sequence": "action_trigger.event_params_id_seq",
+    "fields": [
+      { "name": "id", "label": "Parameter ID", "datatype": "id" },
+      {
+        "name": "event_def",
+        "label": "Event Definition",
+        "type": "link",
+        "key": "id",
+        "class": "atevdef",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "param", "label": "Parameter Name", "datatype": "text" },
+      { "name": "value", "label": "Parameter Value", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": {
+        "perms": ["ADMIN_TRIGGER_EVENT_DEF", "CREATE_TRIGGER_EVENT_DEF"]
+      },
+      "retrieve": {
+        "perms": ["ADMIN_TRIGGER_EVENT_DEF", "VIEW_TRIGGER_EVENT_DEF"]
+      },
+      "update": {
+        "perms": ["ADMIN_TRIGGER_EVENT_DEF", "UPDATE_TRIGGER_EVENT_DEF"]
+      },
+      "delete": {
+        "perms": ["ADMIN_TRIGGER_EVENT_DEF", "DELETE_TRIGGER_EVENT_DEF"]
+      }
+    }
+  },
+  "ath": {
+    "name": "ath",
+    "label": "Trigger Hook Point",
+    "table": "action_trigger.hook",
+    "pkey": "key",
+    "fields": [
+      { "name": "key", "label": "Hook Key", "datatype": "text" },
+      { "name": "core_type", "label": "Core Type", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "passive", "label": "Passive", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_TRIGGER_HOOK", "CREATE_TRIGGER_HOOK"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_TRIGGER_HOOK", "UPDATE_TRIGGER_HOOK"] },
+      "delete": { "perms": ["ADMIN_TRIGGER_HOOK", "DELETE_TRIGGER_HOOK"] }
+    }
+  },
+  "atreact": {
+    "name": "atreact",
+    "label": "Trigger Event Reactor",
+    "table": "action_trigger.reactor",
+    "pkey": "module",
+    "fields": [
+      { "name": "module", "label": "Module Name", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": {
+        "perms": ["ADMIN_TRIGGER_REACTOR", "CREATE_TRIGGER_REACTOR"]
+      },
+      "retrieve": {},
+      "update": {
+        "perms": ["ADMIN_TRIGGER_REACTOR", "UPDATE_TRIGGER_REACTOR"]
+      },
+      "delete": { "perms": ["ADMIN_TRIGGER_REACTOR", "DELETE_TRIGGER_REACTOR"] }
+    }
+  },
+  "atul": {
+    "name": "atul",
+    "label": "Action Trigger User Log",
+    "source": "( SELECT atevdef.hook, atevdef.name, atevdef.reactor, atev.id, atev.event_def, atev.add_time, atev.run_time, atev.start_time, atev.update_time, atev.complete_time, atev.update_process, atev.state, atev.user_data, atev.template_output, atev.error_output, atev.async_output, targ_circ.id AS target_circ, targ_ahr.id AS target_hold, COALESCE( targ_circ.circ_lib, targ_ahr.pickup_lib ) AS perm_lib FROM action_trigger.event atev JOIN action_trigger.event_definition atevdef ON (atevdef.id = atev.event_def) JOIN action_trigger.hook ath ON (ath.key = atevdef.hook) LEFT JOIN action.circulation targ_circ ON (ath.core_type = 'circ' AND targ_circ.id = atev.target) LEFT JOIN action.hold_request targ_ahr ON (ath.core_type = 'ahr' AND targ_ahr.id = atev.target) WHERE atev.add_time > NOW() - (SELECT MIN(value) FROM ( SELECT value::INTERVAL FROM actor.org_unit_ancestor_setting( 'circ.staff.max_visible_event_age', COALESCE(targ_circ.circ_lib, targ_ahr.pickup_lib) ) UNION SELECT '1000 YEARS'::INTERVAL AS value ) ous) )",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "hook",
+        "label": "Hook",
+        "type": "link",
+        "key": "key",
+        "class": "ath",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "reactor", "label": "Reactor", "datatype": "text" },
+      { "name": "id", "label": "Event ID", "datatype": "id" },
+      {
+        "name": "event_def",
+        "label": "Event Definition ID",
+        "datatype": "int"
+      },
+      {
+        "name": "add_time",
+        "label": "Event Add Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "run_time",
+        "label": "Event Run Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "start_time",
+        "label": "Event Start Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "update_time",
+        "label": "Event Update Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "complete_time",
+        "label": "Event Complete Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "update_process",
+        "label": "Event Update PID",
+        "datatype": "int"
+      },
+      { "name": "state", "label": "Event State", "datatype": "text" },
+      { "name": "user_data", "label": "Event User Data", "datatype": "text" },
+      {
+        "name": "template_output",
+        "label": "Event Template Output",
+        "type": "link",
+        "key": "id",
+        "class": "ateo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "error_output",
+        "label": "Event Error Output",
+        "type": "link",
+        "key": "id",
+        "class": "ateo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "async_output",
+        "label": "Event Async Output",
+        "type": "link",
+        "key": "id",
+        "class": "ateo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "target_circ",
+        "label": "Target Circulation",
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "target_hold",
+        "label": "Target Hold",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "perm_lib",
+        "label": "Permission Context",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_TRIGGER_EVENT"] } }
+  },
+  "atval": {
+    "name": "atval",
+    "label": "Trigger Condition Validator",
+    "table": "action_trigger.validator",
+    "pkey": "module",
+    "fields": [
+      { "name": "module", "label": "Module Name", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": {
+        "perms": ["ADMIN_TRIGGER_VALIDATOR", "CREATE_TRIGGER_VALIDATOR"]
+      },
+      "retrieve": {},
+      "update": {
+        "perms": ["ADMIN_TRIGGER_VALIDATOR", "UPDATE_TRIGGER_VALIDATOR"]
+      },
+      "delete": {
+        "perms": ["ADMIN_TRIGGER_VALIDATOR", "DELETE_TRIGGER_VALIDATOR"]
+      }
+    }
+  },
+  "au": {
+    "name": "au",
+    "label": "ILS User",
+    "table": "actor.usr",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "actor.usr_id_seq",
+    "fields": [
+      {
+        "name": "addresses",
+        "label": "All Addresses",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "aua",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "cards",
+        "label": "All Library Cards",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "ac",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "checkouts",
+        "label": "All Circulations",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "circ",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "hold_requests",
+        "label": "All Hold Requests",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "ahr",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "permissions",
+        "label": "All Permissions",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "pupm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "settings",
+        "label": "All User Settings",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "aus",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "standing_penalties",
+        "label": "Standing Penalties",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "ausp",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat_entries",
+        "label": "Statistical Category Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "target_usr",
+        "class": "actscecm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "survey_responses",
+        "label": "Survey Responses",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "asvr",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "ws_ou",
+        "label": "Workstation Org Unit",
+        "virtual": true,
+        "datatype": "link"
+      },
+      {
+        "name": "wsid",
+        "label": "Workstation ID",
+        "virtual": true,
+        "datatype": "link"
+      },
+      { "name": "active", "label": "Active", "datatype": "bool" },
+      { "name": "alert_message", "label": "Alert Message", "datatype": "text" },
+      { "name": "barred", "label": "Barred", "datatype": "bool" },
+      {
+        "name": "billing_address",
+        "label": "Physical Address",
+        "type": "link",
+        "key": "id",
+        "class": "aua",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "card",
+        "label": "Current Library Card",
+        "type": "link",
+        "key": "id",
+        "class": "ac",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "claims_returned_count",
+        "label": "Claims-returned Count",
+        "datatype": "int"
+      },
+      {
+        "name": "claims_never_checked_out_count",
+        "label": "Claims Never Checked Out Count",
+        "datatype": "int"
+      },
+      {
+        "name": "create_date",
+        "label": "Record Creation Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "credit_forward_balance",
+        "label": "User Credit Balance",
+        "datatype": "money"
+      },
+      { "name": "day_phone", "label": "Daytime Phone", "datatype": "text" },
+      { "name": "dob", "label": "Date of Birth", "datatype": "timestamp" },
+      { "name": "email", "label": "Email Address", "datatype": "text" },
+      { "name": "evening_phone", "label": "Evening Phone", "datatype": "text" },
+      {
+        "name": "expire_date",
+        "label": "Privilege Expiration Date",
+        "datatype": "timestamp"
+      },
+      { "name": "family_name", "label": "Last Name", "datatype": "text" },
+      { "name": "first_given_name", "label": "First Name", "datatype": "text" },
+      {
+        "name": "home_ou",
+        "label": "Home Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "id", "label": "User ID", "datatype": "id" },
+      {
+        "name": "ident_type",
+        "label": "Primary Identification Type",
+        "type": "link",
+        "key": "id",
+        "class": "cit",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "ident_type2",
+        "label": "Secondary Identification Type",
+        "type": "link",
+        "key": "id",
+        "class": "cit",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "ident_value",
+        "label": "Primary Identification",
+        "datatype": "text"
+      },
+      {
+        "name": "ident_value2",
+        "label": "Secondary Identification",
+        "datatype": "text"
+      },
+      {
+        "name": "last_xact_id",
+        "label": "Last Transaction ID",
+        "datatype": "text"
+      },
+      {
+        "name": "mailing_address",
+        "label": "Mailing Address",
+        "type": "link",
+        "key": "id",
+        "class": "aua",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "master_account",
+        "label": "Is Group Lead Account",
+        "datatype": "bool"
+      },
+      {
+        "name": "net_access_level",
+        "label": "Internet Access Level",
+        "type": "link",
+        "key": "id",
+        "class": "cnal",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "other_phone", "label": "Other Phone", "datatype": "text" },
+      { "name": "passwd", "label": "Password", "datatype": "text" },
+      { "name": "photo_url", "label": "Photo URL", "datatype": "text" },
+      { "name": "prefix", "label": "Prefix/Title", "datatype": "text" },
+      {
+        "name": "profile",
+        "label": "Main (Profile) Permission Group",
+        "type": "link",
+        "key": "id",
+        "class": "pgt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "second_given_name",
+        "label": "Middle Name",
+        "datatype": "text"
+      },
+      {
+        "name": "standing",
+        "label": "Standing (unused)",
+        "type": "link",
+        "key": "id",
+        "class": "cst",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "suffix", "label": "Suffix", "datatype": "text" },
+      { "name": "super_user", "label": "Is Super User", "datatype": "bool" },
+      {
+        "name": "usrgroup",
+        "label": "Family Linkage or other Group",
+        "type": "link",
+        "key": "usrgroup",
+        "class": "au",
+        "reltype": "has_many",
+        "datatype": "int"
+      },
+      {
+        "name": "usrname",
+        "label": "OPAC/Staff Client User Name",
+        "datatype": "text"
+      },
+      {
+        "name": "alias",
+        "label": "OPAC/Staff Client Holds Alias",
+        "datatype": "text"
+      },
+      { "name": "juvenile", "label": "Juvenile", "datatype": "bool" },
+      {
+        "name": "last_update_time",
+        "label": "Record Last Update Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "pref_prefix",
+        "label": "Preferred Prefix",
+        "datatype": "text"
+      },
+      {
+        "name": "pref_first_given_name",
+        "label": "Preferred First Name",
+        "datatype": "text"
+      },
+      {
+        "name": "pref_second_given_name",
+        "label": "Preferred Middle Name",
+        "datatype": "text"
+      },
+      {
+        "name": "pref_family_name",
+        "label": "Preferred Last Name",
+        "datatype": "text"
+      },
+      {
+        "name": "pref_suffix",
+        "label": "Preferred Suffix",
+        "datatype": "text"
+      },
+      { "name": "name_keywords", "label": "Name Keywords", "datatype": "text" },
+      {
+        "name": "groups",
+        "label": "Additional Permission Groups",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "pugm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "deleted", "label": "Is Deleted", "datatype": "bool" },
+      {
+        "name": "notes",
+        "label": "User Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "aun",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "demographic",
+        "label": "Demographic Info",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rud",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "billable_transactions",
+        "label": "Billable Transactions",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "mbt",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "money_summary",
+        "label": "Money Summary",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "mus",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "open_billable_transactions_summary",
+        "label": "Open Billable Transactions",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "mobts",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "checkins",
+        "label": "Checkins",
+        "virtual": true,
+        "type": "link",
+        "key": "checkin_staff",
+        "class": "circ",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "performed_circulations",
+        "label": "Circulations Performed as Staff",
+        "virtual": true,
+        "type": "link",
+        "key": "circ_staff",
+        "class": "circ",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "fund_alloc_pcts",
+        "label": "Fund Allocation Percentages",
+        "virtual": true,
+        "type": "link",
+        "key": "allocator",
+        "class": "acqfap",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "reservations",
+        "label": "Reservations",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "bresv",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "usr_activity",
+        "label": "User Activity Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "auact",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "usr_work_ou_map",
+        "label": "User/Working Location Map",
+        "virtual": true,
+        "type": "link",
+        "key": "usr",
+        "class": "puwoum",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER", "user_request.view"] } }
+  },
+  "aua": {
+    "name": "aua",
+    "label": "User Address",
+    "table": "actor.usr_address",
+    "pkey": "id",
+    "pkey_sequence": "actor.usr_address_id_seq",
+    "fields": [
+      { "name": "address_type", "label": "Type", "datatype": "text" },
+      { "name": "city", "label": "City", "datatype": "text" },
+      { "name": "country", "label": "Country", "datatype": "text" },
+      { "name": "county", "label": "County", "datatype": "text" },
+      { "name": "id", "label": "Address ID", "datatype": "id" },
+      { "name": "post_code", "label": "Postal Code", "datatype": "text" },
+      { "name": "state", "label": "State", "datatype": "text" },
+      { "name": "street1", "label": "Street (1)", "datatype": "text" },
+      { "name": "street2", "label": "Street (2)", "datatype": "text" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "valid", "label": "Valid Address?", "datatype": "bool" },
+      {
+        "name": "within_city_limits",
+        "label": "Within City Limits?",
+        "datatype": "bool"
+      },
+      {
+        "name": "replaces",
+        "label": "Replaces",
+        "type": "link",
+        "key": "id",
+        "class": "aua",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "pending", "label": "Pending", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["UPDATE_USER"] },
+      "retrieve": { "perms": ["VIEW_USER"] },
+      "update": { "perms": ["UPDATE_USER"] },
+      "delete": { "perms": ["UPDATE_USER"] }
+    }
+  },
+  "auact": {
+    "name": "auact",
+    "label": "User Activity",
+    "table": "actor.usr_activity",
+    "pkey": "id",
+    "pkey_sequence": "actor.usr_activity_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "etype",
+        "label": "Activity Type",
+        "type": "link",
+        "key": "id",
+        "class": "cuat",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "event_time", "label": "Event Time", "datatype": "timestamp" }
+    ],
+    "permacrud": { "retrieve": { "perms": ["RUN_REPORTS"] } }
+  },
+  "auch": {
+    "name": "auch",
+    "label": "User Checkout History",
+    "table": "action.usr_circ_history",
+    "pkey": "id",
+    "pkey_sequence": "action.usr_circ_history_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "target_copy",
+        "label": "Circulating Item",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "checkin_time",
+        "label": "Checkin Time",
+        "datatype": "timestamp"
+      },
+      { "name": "due_date", "label": "Due Date", "datatype": "timestamp" },
+      {
+        "name": "xact_start",
+        "label": "Checkout Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "source_circ",
+        "label": "Source Circulation",
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "aufh": {
+    "name": "aufh",
+    "label": "Unfulfilled Hold Targets",
+    "table": "action.unfulfilled_hold_list",
+    "pkey": "id",
+    "pkey_sequence": "action.unfulfilled_hold_list_id_seq",
+    "fields": [
+      {
+        "name": "circ_lib",
+        "label": "Non-fulfilling Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "current_copy",
+        "label": "Non-fulfilling Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "fail_time",
+        "label": "Retargeting Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "hold",
+        "label": "Hold",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "Record ID", "datatype": "id" }
+    ]
+  },
+  "aufhil": {
+    "name": "aufhil",
+    "table": "action.unfulfilled_hold_innermost_loop",
+    "fields": [
+      {
+        "name": "hold",
+        "label": "Hold ID",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "count", "label": "Loop Count", "datatype": "int" }
+    ]
+  },
+  "aufhl": {
+    "name": "aufhl",
+    "table": "action.unfulfilled_hold_loops",
+    "fields": [
+      {
+        "name": "hold",
+        "label": "Hold ID",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "count", "label": "Loop Count", "datatype": "int" }
+    ]
+  },
+  "aufhml": {
+    "name": "aufhml",
+    "table": "action.unfulfilled_hold_min_loop",
+    "fields": [
+      {
+        "name": "hold",
+        "label": "Hold ID",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "min", "label": "Min Loop", "datatype": "int" }
+    ]
+  },
+  "aufhmxl": {
+    "name": "aufhmxl",
+    "table": "action.unfulfilled_hold_max_loop",
+    "fields": [
+      {
+        "name": "hold",
+        "label": "Hold ID",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "max", "label": "Max Loop", "datatype": "int" }
+    ]
+  },
+  "aufhol": {
+    "name": "aufhol",
+    "source": "( SELECT  DISTINCT l.* FROM  action.unfulfilled_hold_loops l JOIN action.unfulfilled_hold_max_loop m USING (hold) WHERE l.count = m.max )",
+    "fields": [
+      {
+        "name": "hold",
+        "label": "Hold ID",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "count", "label": "Loop Count", "datatype": "int" }
+    ]
+  },
+  "aum": {
+    "name": "aum",
+    "label": "User Message",
+    "table": "actor.usr_message",
+    "pkey": "id",
+    "pkey_sequence": "actor.usr_message_id_seq",
+    "fields": [
+      {
+        "name": "create_date",
+        "label": "Creation Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "read_date",
+        "label": "Read Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "sending_lib",
+        "label": "Creating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "Message ID", "datatype": "id" },
+      { "name": "deleted", "label": "Deleted?", "datatype": "bool" },
+      { "name": "title", "label": "Title", "datatype": "text" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "message", "label": "Message", "datatype": "text" }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["VIEW_USER"] },
+      "update": { "perms": ["UPDATE_USER"] },
+      "delete": { "perms": ["UPDATE_USER"] }
+    }
+  },
+  "auml": {
+    "name": "auml",
+    "label": "User Message (Limited Access)",
+    "table": "actor.usr_message_limited",
+    "pkey": "id",
+    "pkey_sequence": "actor.usr_message_id_seq",
+    "fields": [
+      {
+        "name": "create_date",
+        "label": "Creation Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "read_date",
+        "label": "Read Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "sending_lib",
+        "label": "Creating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "Message ID", "datatype": "id" },
+      { "name": "deleted", "label": "Deleted?", "datatype": "bool" },
+      { "name": "title", "label": "Title", "datatype": "text" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "message", "label": "Message", "datatype": "text" }
+    ],
+    "permacrud": {
+      "retrieve": { "perms": ["UPDATE_USER"] },
+      "update": { "perms": ["UPDATE_USER"] }
+    }
+  },
+  "aun": {
+    "name": "aun",
+    "label": "User Note",
+    "table": "actor.usr_note",
+    "pkey": "id",
+    "pkey_sequence": "actor.usr_note_id_seq",
+    "fields": [
+      {
+        "name": "create_date",
+        "label": "Creation Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "creator",
+        "label": "Creating Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "Note ID", "datatype": "id" },
+      { "name": "pub", "label": "Is OPAC Visible?", "datatype": "bool" },
+      { "name": "title", "label": "Note Title", "datatype": "text" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "label": "Note Content", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["UPDATE_USER"] },
+      "retrieve": { "perms": ["UPDATE_USER"] },
+      "update": { "perms": ["UPDATE_USER"] },
+      "delete": { "perms": ["UPDATE_USER"] }
+    }
+  },
+  "auoi": {
+    "name": "auoi",
+    "label": "User Sharing Opt-in",
+    "table": "actor.usr_org_unit_opt_in",
+    "pkey": "id",
+    "pkey_sequence": "actor.usr_org_unit_opt_in_id_seq",
+    "fields": [
+      { "name": "id", "label": "Opt-in ID", "datatype": "id" },
+      {
+        "name": "opt_in_ws",
+        "label": "Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "staff",
+        "label": "Staff Member",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "org_unit",
+        "label": "Allowed Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "opt_in_ts",
+        "label": "Opt-in Date/Time",
+        "datatype": "timestamp"
+      }
+    ]
+  },
+  "aupr": {
+    "name": "aupr",
+    "label": "User password reset requests",
+    "table": "actor.usr_password_reset",
+    "pkey": "id",
+    "pkey_sequence": "actor.usr_password_reset_id_seq",
+    "fields": [
+      { "name": "id", "label": "Request ID", "datatype": "id" },
+      { "name": "uuid", "label": "UUID", "datatype": "text" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "request_time",
+        "label": "Request Time",
+        "datatype": "timestamp"
+      },
+      { "name": "has_been_reset", "label": "Was Reset?", "datatype": "bool" }
+    ]
+  },
+  "aur": {
+    "name": "aur",
+    "label": "User Purchase Request",
+    "table": "acq.user_request",
+    "pkey": "id",
+    "pkey_sequence": "acq.user_request_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "label", "datatype": "id" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "request_type",
+        "label": "Request Type",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "aurt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "hold", "label": "Place Hold", "datatype": "bool" },
+      {
+        "name": "pickup_lib",
+        "label": "Pickup Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "holdable_formats",
+        "label": "Holdable Formats",
+        "datatype": "text"
+      },
+      { "name": "phone_notify", "label": "Phone Notify", "datatype": "text" },
+      { "name": "email_notify", "label": "Email Notify", "datatype": "bool" },
+      {
+        "name": "lineitem",
+        "label": "PO Line Item",
+        "type": "link",
+        "key": "id",
+        "class": "jub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "eg_bib",
+        "label": "Bib Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "request_date",
+        "label": "Request Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "need_before",
+        "label": "Need Before Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "max_fee", "label": "Max Acceptable Fee", "datatype": "text" },
+      { "name": "isxn", "label": "ISxN", "datatype": "text" },
+      { "name": "upc", "label": "UPC", "datatype": "text" },
+      { "name": "title", "label": "Title", "datatype": "text" },
+      { "name": "volume", "label": "Volume", "datatype": "text" },
+      { "name": "author", "label": "Author", "datatype": "text" },
+      { "name": "article_title", "label": "Article Title", "datatype": "text" },
+      { "name": "article_pages", "label": "Article Pages", "datatype": "text" },
+      { "name": "publisher", "label": "Publisher", "datatype": "text" },
+      {
+        "name": "location",
+        "label": "Publication Location",
+        "datatype": "text"
+      },
+      { "name": "pubdate", "label": "Publication Date", "datatype": "text" },
+      { "name": "mentioned", "label": "Mentioned In", "datatype": "text" },
+      { "name": "other_info", "label": "Other Info", "datatype": "text" },
+      {
+        "name": "cancel_reason",
+        "label": "Cancel Reason",
+        "type": "link",
+        "key": "id",
+        "class": "acqcr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_time",
+        "label": "Cancel Date/Time",
+        "datatype": "timestamp"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["user_request.create"] },
+      "retrieve": { "perms": ["user_request.view"] },
+      "update": { "perms": ["user_request.update"] },
+      "delete": { "perms": ["user_request.delete"] }
+    }
+  },
+  "auri": {
+    "name": "auri",
+    "label": "Electronic Access URI",
+    "table": "asset.uri",
+    "pkey": "id",
+    "pkey_sequence": "asset.uri_id_seq",
+    "fields": [
+      { "name": "id", "label": "URI ID", "datatype": "id" },
+      { "name": "href", "label": "URI", "datatype": "text" },
+      { "name": "label", "label": "Label", "datatype": "text" },
+      {
+        "name": "use_restriction",
+        "label": "Use Information",
+        "datatype": "text"
+      },
+      { "name": "active", "label": "Active", "datatype": "bool" },
+      {
+        "name": "call_number_maps",
+        "label": "Call Number Maps",
+        "virtual": true,
+        "type": "link",
+        "key": "uri",
+        "class": "auricnm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "call_numbers",
+        "label": "Call Numbers",
+        "virtual": true,
+        "type": "link",
+        "key": "uri",
+        "class": "auricnm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ]
+  },
+  "auricnm": {
+    "name": "auricnm",
+    "label": "Electronic Access URI to Call Number Map",
+    "table": "asset.uri_call_number_map",
+    "pkey": "id",
+    "pkey_sequence": "asset.uri_call_number_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "uri",
+        "label": "URI",
+        "type": "link",
+        "key": "id",
+        "class": "auri",
+        "reltype": "has_a",
+        "datatype": "int"
+      },
+      {
+        "name": "call_number",
+        "label": "Call Number",
+        "type": "link",
+        "key": "id",
+        "class": "acn",
+        "reltype": "has_a",
+        "datatype": "text"
+      }
+    ]
+  },
+  "aurs": {
+    "name": "aurs",
+    "label": "User Purchase Request with Status",
+    "source": "( SELECT r.*, CASE WHEN r.cancel_reason IS NOT NULL THEN 7 WHEN h.fulfillment_time IS NOT NULL THEN 6 WHEN l.state = 'received' THEN 5 WHEN p.state = 'on-order' AND h.id IS NOT NULL THEN 4 WHEN p.state = 'on-order' AND h.id IS NULL THEN 3 WHEN l.id IS NOT NULL THEN 2 WHEN l.id IS NULL THEN 1 ELSE 0 END AS request_status ,u.home_ou FROM      acq.user_request r JOIN actor.usr u ON (r.usr = u.id) LEFT JOIN acq.lineitem l ON (r.lineitem = l.id) LEFT JOIN acq.purchase_order p ON (l.purchase_order = p.id) LEFT JOIN action.hold_request h ON (h.acq_request = r.id) )",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "label", "datatype": "id" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "request_type",
+        "label": "Request Type",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "aurt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "hold", "label": "Place Hold", "datatype": "bool" },
+      {
+        "name": "pickup_lib",
+        "label": "Pickup Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "holdable_formats",
+        "label": "Holdable Formats",
+        "datatype": "text"
+      },
+      { "name": "phone_notify", "label": "Phone Notify", "datatype": "text" },
+      { "name": "email_notify", "label": "Email Notify", "datatype": "bool" },
+      {
+        "name": "lineitem",
+        "label": "PO Line Item",
+        "type": "link",
+        "key": "id",
+        "class": "jub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "eg_bib",
+        "label": "Bib Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "request_date",
+        "label": "Request Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "need_before",
+        "label": "Need Before Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "max_fee", "label": "Max Acceptable Fee", "datatype": "text" },
+      { "name": "isxn", "label": "ISxN", "datatype": "text" },
+      { "name": "upc", "label": "UPC", "datatype": "text" },
+      { "name": "title", "label": "Title", "datatype": "text" },
+      { "name": "volume", "label": "Volume", "datatype": "text" },
+      { "name": "author", "label": "Author", "datatype": "text" },
+      { "name": "article_title", "label": "Article Title", "datatype": "text" },
+      { "name": "article_pages", "label": "Article Pages", "datatype": "text" },
+      { "name": "publisher", "label": "Publisher", "datatype": "text" },
+      {
+        "name": "location",
+        "label": "Publication Location",
+        "datatype": "text"
+      },
+      { "name": "pubdate", "label": "Publication Date", "datatype": "text" },
+      { "name": "mentioned", "label": "Mentioned In", "datatype": "text" },
+      { "name": "other_info", "label": "Other Info", "datatype": "text" },
+      {
+        "name": "cancel_reason",
+        "label": "Cancel Reason",
+        "type": "link",
+        "key": "id",
+        "class": "acqcr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_time",
+        "label": "Cancel Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "request_status",
+        "label": "Request Status",
+        "type": "link",
+        "key": "id",
+        "class": "aurst",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "home_ou",
+        "label": "Home Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["user_request.view"] } }
+  },
+  "aurst": {
+    "name": "aurst",
+    "label": "Acquisition Patron Request Status Type",
+    "table": "acq.user_request_status_type",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Status ID",
+        "selector": "label",
+        "datatype": "id"
+      },
+      { "name": "label", "label": "Status", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "aurt": {
+    "name": "aurt",
+    "label": "User Purchase Request Type",
+    "table": "acq.user_request_type",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "label", "datatype": "id" },
+      {
+        "name": "label",
+        "label": "Type Label",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_USER_REQUEST_TYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_USER_REQUEST_TYPE"] },
+      "delete": { "perms": ["ADMIN_USER_REQUEST_TYPE"] }
+    }
+  },
+  "aus": {
+    "name": "aus",
+    "label": "User Setting",
+    "table": "actor.usr_setting",
+    "pkey": "id",
+    "pkey_sequence": "actor.usr_setting_id_seq",
+    "fields": [
+      { "name": "id", "label": "Setting ID", "datatype": "id" },
+      {
+        "name": "name",
+        "label": "Name",
+        "type": "link",
+        "key": "name",
+        "class": "cust",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "label": "Value", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER"] } }
+  },
+  "ausp": {
+    "name": "ausp",
+    "label": "User Standing Penalty",
+    "restrict_primary": "100",
+    "table": "actor.usr_standing_penalty",
+    "pkey": "id",
+    "pkey_sequence": "actor.usr_standing_penalty_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "set_date", "label": "Set Date", "datatype": "timestamp" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "staff",
+        "label": "Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "standing_penalty",
+        "label": "Standing Penalty",
+        "type": "link",
+        "key": "id",
+        "class": "csp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "org_unit",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "stop_date", "label": "Stop Date", "datatype": "timestamp" },
+      { "name": "note", "label": "Note", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["UPDATE_USER"] },
+      "retrieve": { "perms": ["VIEW_USER"] },
+      "update": { "perms": ["UPDATE_USER"] },
+      "delete": { "perms": ["UPDATE_USER"] }
+    }
+  },
+  "auss": {
+    "name": "auss",
+    "label": "User Saved Search",
+    "table": "actor.usr_saved_search",
+    "pkey": "id",
+    "pkey_sequence": "actor.usr_saved_search_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      {
+        "name": "create_date",
+        "label": "Create Date",
+        "datatype": "timestamp"
+      },
+      { "name": "query_text", "label": "Query Text", "datatype": "text" },
+      { "name": "query_type", "label": "Query Type", "datatype": "text" },
+      { "name": "target", "label": "Target", "datatype": "text" }
+    ]
+  },
+  "aws": {
+    "name": "aws",
+    "label": "Workstation",
+    "table": "actor.workstation",
+    "pkey": "id",
+    "pkey_sequence": "actor.workstation_id_seq",
+    "fields": [
+      { "name": "id", "label": "Workstation ID", "datatype": "id" },
+      { "name": "name", "label": "Workstation Name", "datatype": "text" },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "toolbars",
+        "label": "Toolbars",
+        "virtual": true,
+        "type": "link",
+        "key": "ws",
+        "class": "atb",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "circulations",
+        "label": "Circulations",
+        "virtual": true,
+        "type": "link",
+        "key": "workstation",
+        "class": "circ",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["STAFF_LOGIN"] } }
+  },
+  "awss": {
+    "name": "awss",
+    "label": "Workstation Setting",
+    "table": "actor.workstation_setting",
+    "pkey": "id",
+    "pkey_sequence": "actor.workstation_setting_id_seq",
+    "fields": [
+      { "name": "id", "label": "Setting ID", "datatype": "id" },
+      {
+        "name": "name",
+        "label": "Name",
+        "type": "link",
+        "key": "name",
+        "class": "cwst",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "label": "Value", "datatype": "text" },
+      {
+        "name": "workstation",
+        "label": "Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "bmp": {
+    "name": "bmp",
+    "label": "Monograph Parts",
+    "table": "biblio.monograph_part",
+    "pkey": "id",
+    "pkey_sequence": "biblio.monograph_part_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "label", "datatype": "text" },
+      { "name": "label_sortkey", "datatype": "text" },
+      { "name": "deleted", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_MONOGRAPH_PART"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_MONOGRAPH_PART"] },
+      "delete": { "perms": ["DELETE_MONOGRAPH_PART"] }
+    }
+  },
+  "bmpc": {
+    "name": "bmpc",
+    "label": "MARC21 Physical Characteristics",
+    "table": "biblio.marc21_physical_characteristics",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "label": "Temp ID", "datatype": "id" },
+      {
+        "name": "ptype",
+        "label": "Type",
+        "type": "link",
+        "key": "id",
+        "class": "cmpctm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "subfield",
+        "label": "Subfield",
+        "type": "link",
+        "key": "id",
+        "class": "cmpcsm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "value",
+        "label": "Value",
+        "type": "link",
+        "key": "id",
+        "class": "cmpcvm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "record",
+        "label": "Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "bpbcm": {
+    "name": "bpbcm",
+    "label": "Bibliographic Record Peer Copy Map",
+    "table": "biblio.peer_bib_copy_map",
+    "pkey": "id",
+    "pkey_sequence": "biblio.peer_bib_copy_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      {
+        "name": "peer_type",
+        "label": "Peer Type",
+        "type": "link",
+        "key": "id",
+        "class": "bpt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "peer_record",
+        "label": "Peer Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "target_copy",
+        "label": "Target Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["UPDATE_COPY"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_COPY"] },
+      "delete": { "perms": ["UPDATE_COPY"] }
+    }
+  },
+  "bpt": {
+    "name": "bpt",
+    "label": "Bibliographic Record Peer Type",
+    "table": "biblio.peer_type",
+    "pkey": "id",
+    "pkey_sequence": "biblio.peer_type_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_BIB_PTYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_BIB_PTYPE"] },
+      "delete": { "perms": ["DELETE_BIB_PTYPE"] }
+    }
+  },
+  "bra": {
+    "name": "bra",
+    "label": "Resource Attribute",
+    "table": "booking.resource_attr",
+    "pkey": "id",
+    "pkey_sequence": "booking.resource_attr_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Resource Attribute ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "owner",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "name",
+        "label": "Resource Attribute Name",
+        "datatype": "text"
+      },
+      {
+        "name": "resource_type",
+        "label": "Resource Type",
+        "type": "link",
+        "key": "id",
+        "class": "brt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "required", "label": "Is Required", "datatype": "bool" },
+      {
+        "name": "valid_values",
+        "label": "Valid Values",
+        "virtual": true,
+        "type": "link",
+        "key": "attr",
+        "class": "brav",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "attr_maps",
+        "label": "Resource Attribute Maps",
+        "virtual": true,
+        "type": "link",
+        "key": "attr",
+        "class": "bram",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_BOOKING_RESOURCE_ATTR"] },
+      "retrieve": { "perms": ["ADMIN_BOOKING_RESOURCE_ATTR"] },
+      "update": { "perms": ["ADMIN_BOOKING_RESOURCE_ATTR"] },
+      "delete": { "perms": ["ADMIN_BOOKING_RESOURCE_ATTR"] }
+    }
+  },
+  "bram": {
+    "name": "bram",
+    "label": "Resource Attribute Map",
+    "table": "booking.resource_attr_map",
+    "pkey": "id",
+    "pkey_sequence": "booking.resource_attr_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "Resource Attribute Map ID", "datatype": "id" },
+      {
+        "name": "resource",
+        "label": "Resource",
+        "type": "link",
+        "key": "id",
+        "class": "brsrc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "resource_attr",
+        "label": "Resource Attribute",
+        "type": "link",
+        "key": "id",
+        "class": "bra",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "value",
+        "label": "Attribute Value",
+        "type": "link",
+        "key": "id",
+        "class": "brav",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_BOOKING_RESOURCE_ATTR_MAP"] },
+      "retrieve": { "perms": ["ADMIN_BOOKING_RESOURCE_ATTR_MAP"] },
+      "update": { "perms": ["ADMIN_BOOKING_RESOURCE_ATTR_MAP"] },
+      "delete": { "perms": ["ADMIN_BOOKING_RESOURCE_ATTR_MAP"] }
+    }
+  },
+  "brav": {
+    "name": "brav",
+    "label": "Resource Attribute Value",
+    "table": "booking.resource_attr_value",
+    "pkey": "id",
+    "pkey_sequence": "booking.resource_attr_value_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Resource Attribute Value ID",
+        "selector": "valid_value",
+        "datatype": "id"
+      },
+      {
+        "name": "owner",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "attr",
+        "label": "Resource Attribute",
+        "type": "link",
+        "key": "id",
+        "class": "bra",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "valid_value", "label": "Valid Value", "datatype": "text" },
+      {
+        "name": "attr_maps",
+        "label": "Resource Attribute Maps",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "bram",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "attr_val_maps",
+        "label": "Resource Attribute Value Maps",
+        "virtual": true,
+        "type": "link",
+        "key": "attr_value",
+        "class": "bravm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_BOOKING_RESOURCE_ATTR_VALUE"] },
+      "retrieve": { "perms": ["ADMIN_BOOKING_RESOURCE_ATTR_VALUE"] },
+      "update": { "perms": ["ADMIN_BOOKING_RESOURCE_ATTR_VALUE"] },
+      "delete": { "perms": ["ADMIN_BOOKING_RESOURCE_ATTR_VALUE"] }
+    }
+  },
+  "bravm": {
+    "name": "bravm",
+    "label": "Reservation Attribute Value Map",
+    "table": "booking.reservation_attr_value_map",
+    "pkey": "id",
+    "pkey_sequence": "booking.reservation_attr_value_map_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Reservation Attribute Value Map",
+        "datatype": "id"
+      },
+      {
+        "name": "reservation",
+        "label": "Reservation",
+        "type": "link",
+        "key": "id",
+        "class": "bresv",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "attr_value",
+        "label": "Attribute Map",
+        "type": "link",
+        "key": "id",
+        "class": "brav",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_BOOKING_RESERVATION_ATTR_MAP"] },
+      "retrieve": { "perms": ["STAFF_LOGIN"] },
+      "update": { "perms": ["ADMIN_BOOKING_RESERVATION_ATTR_MAP"] },
+      "delete": { "perms": ["ADMIN_BOOKING_RESERVATION_ATTR_MAP"] }
+    }
+  },
+  "bre": {
+    "name": "bre",
+    "label": "Bibliographic Record",
+    "table": "biblio.record_entry",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "biblio.record_entry_id_seq",
+    "fields": [
+      {
+        "name": "call_numbers",
+        "label": "Call Numbers",
+        "virtual": true,
+        "type": "link",
+        "key": "record",
+        "class": "acn",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "fixed_fields",
+        "label": "Fixed Field Entry",
+        "virtual": true,
+        "type": "link",
+        "key": "record",
+        "class": "mrd",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      { "name": "active", "label": "Is Active?", "datatype": "bool" },
+      {
+        "name": "create_date",
+        "label": "Record Creation Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "creator",
+        "label": "Record Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "deleted", "label": "Is Deleted?", "datatype": "bool" },
+      {
+        "name": "edit_date",
+        "label": "Last Edit Data/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "editor",
+        "label": "Last Editing User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "fingerprint", "label": "Fingerprint", "datatype": "text" },
+      { "name": "id", "label": "Record ID", "datatype": "id" },
+      {
+        "name": "last_xact_id",
+        "label": "Last Transaction ID",
+        "datatype": "text"
+      },
+      { "name": "marc", "label": "MARC21Slim", "datatype": "text" },
+      { "name": "quality", "label": "Overall Quality", "datatype": "int" },
+      {
+        "name": "source",
+        "label": "Record Source",
+        "type": "link",
+        "key": "id",
+        "class": "cbs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "tcn_source", "label": "TCN Source", "datatype": "text" },
+      { "name": "tcn_value", "label": "TCN Value", "datatype": "text" },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "share_depth", "label": "Share Depth", "datatype": "int" },
+      {
+        "name": "metarecord",
+        "label": "Metarecord",
+        "virtual": true,
+        "type": "link",
+        "key": "source",
+        "class": "mmrsm",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "language",
+        "label": "Language Code",
+        "virtual": true,
+        "type": "link",
+        "key": "record",
+        "class": "mrd",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "notes",
+        "label": "Non-MARC Record Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "record",
+        "class": "bren",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "keyword_field_entries",
+        "label": "Indexed Keyword Field Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "source",
+        "class": "mkfe",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "subject_field_entries",
+        "label": "Indexed Subject Field Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "source",
+        "class": "msfe",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "title_field_entries",
+        "label": "Indexed Title Field Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "source",
+        "class": "mtfe",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "identifier_field_entries",
+        "label": "Indexed Identifier Field Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "source",
+        "class": "mife",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "author_field_entries",
+        "label": "Indexed Author Field Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "source",
+        "class": "mafe",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "series_field_entries",
+        "label": "Indexed Series Field Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "source",
+        "class": "msefe",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "full_record_entries",
+        "label": "Flattened MARC Fields ",
+        "virtual": true,
+        "type": "link",
+        "key": "record",
+        "class": "mfr",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "simple_record",
+        "label": "Simple Record Extracts ",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rmsr",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "authority_links",
+        "label": "Authority Links",
+        "virtual": true,
+        "type": "link",
+        "key": "bib",
+        "class": "abl",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "subscriptions",
+        "label": "Subscriptions",
+        "virtual": true,
+        "type": "link",
+        "key": "record_entry",
+        "class": "ssub",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "attrs",
+        "label": "SVF Attributes",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mra",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "mattrs",
+        "label": "MVF Attributes",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mraf",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "display_entries",
+        "label": "Display Fields",
+        "virtual": true,
+        "type": "link",
+        "key": "source",
+        "class": "mde",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "flat_display_entries",
+        "label": "Flat Display Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "source",
+        "class": "mfde",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "compressed_display_entries",
+        "label": "Compressed Display Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "source",
+        "class": "mcde",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "wide_display_entry",
+        "label": "Wide Display Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "source",
+        "class": "mwde",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      { "name": "merge_date", "label": "Merge Date", "datatype": "timestamp" },
+      {
+        "name": "merged_to",
+        "label": "Merged To",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_MARC", "IMPORT_MARC"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_MARC"] },
+      "delete": { "perms": ["DELETE_RECORD"] }
+    }
+  },
+  "bren": {
+    "name": "bren",
+    "label": "Bib Record Note",
+    "table": "biblio.record_note",
+    "pkey": "id",
+    "pkey_sequence": "biblio.record_note_id_seq",
+    "fields": [
+      { "name": "create_date", "datatype": "timestamp" },
+      {
+        "name": "creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "edit_date", "datatype": "timestamp" },
+      {
+        "name": "editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      { "name": "pub", "datatype": "bool" },
+      {
+        "name": "record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ]
+  },
+  "bresv": {
+    "name": "bresv",
+    "label": "Reservation",
+    "table": "booking.reservation",
+    "pkey": "id",
+    "pkey_sequence": "money.billable_xact_id_seq",
+    "fields": [
+      { "name": "id", "label": "Transaction ID", "datatype": "id" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "xact_finish",
+        "label": "Transaction Finish Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact_start",
+        "label": "Transaction Start Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "unrecovered",
+        "label": "Unrecovered Debt",
+        "datatype": "bool"
+      },
+      {
+        "name": "billings",
+        "label": "Billing Line Items",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mb",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "payments",
+        "label": "Payment Line Items",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mp",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "billing_total",
+        "label": "Billing Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxbt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "payment_total",
+        "label": "Payment Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxpt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "summary",
+        "label": "Payment Summary",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mbts",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "request_time",
+        "label": "Request Time",
+        "datatype": "timestamp"
+      },
+      { "name": "start_time", "label": "Start Time", "datatype": "timestamp" },
+      { "name": "end_time", "label": "End Time", "datatype": "timestamp" },
+      {
+        "name": "capture_time",
+        "label": "Capture Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "cancel_time",
+        "label": "Cancel Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "pickup_time",
+        "label": "Pickup Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "return_time",
+        "label": "Return Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "booking_interval",
+        "label": "Booking Interval",
+        "datatype": "interval"
+      },
+      {
+        "name": "fine_interval",
+        "label": "Fine Interval",
+        "datatype": "interval"
+      },
+      { "name": "fine_amount", "label": "Fine Amount", "datatype": "money" },
+      { "name": "max_fine", "label": "Max Fine Amount", "datatype": "money" },
+      {
+        "name": "target_resource_type",
+        "label": "Target Resource Type",
+        "type": "link",
+        "key": "id",
+        "class": "brt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "target_resource",
+        "label": "Target Resource",
+        "type": "link",
+        "key": "id",
+        "class": "brsrc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "current_resource",
+        "label": "Current Resource",
+        "type": "link",
+        "key": "id",
+        "class": "brsrc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "request_lib",
+        "label": "Request Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "pickup_lib",
+        "label": "Pickup Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "capture_staff",
+        "label": "Capture Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "email_notify",
+        "label": "Notify by Email?",
+        "datatype": "bool"
+      },
+      {
+        "name": "attr_val_maps",
+        "label": "Attribute Value Maps",
+        "virtual": true,
+        "type": "link",
+        "key": "reservation",
+        "class": "bravm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_BOOKING_RESERVATION"] },
+      "retrieve": { "perms": ["STAFF_LOGIN"] },
+      "update": { "perms": ["ADMIN_BOOKING_RESERVATION"] },
+      "delete": { "perms": ["ADMIN_BOOKING_RESERVATION"] }
+    }
+  },
+  "brn": {
+    "name": "brn",
+    "label": "Record Node",
+    "virtual": true,
+    "fields": [
+      { "name": "id", "virtual": true, "datatype": "text" },
+      { "name": "children", "virtual": true, "datatype": "text" },
+      { "name": "owner_doc", "virtual": true, "datatype": "text" },
+      { "name": "intra_doc_id", "virtual": true, "datatype": "text" },
+      { "name": "parent_node", "virtual": true, "datatype": "text" },
+      { "name": "node_type", "virtual": true, "datatype": "text" },
+      { "name": "namespace_uri", "virtual": true, "datatype": "text" },
+      { "name": "name", "virtual": true, "datatype": "text" },
+      { "name": "value", "virtual": true, "datatype": "text" }
+    ]
+  },
+  "brsrc": {
+    "name": "brsrc",
+    "label": "Resource",
+    "table": "booking.resource",
+    "pkey": "id",
+    "pkey_sequence": "booking.resource_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Resource ID",
+        "selector": "barcode",
+        "datatype": "id"
+      },
+      {
+        "name": "owner",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "type",
+        "label": "Resource Type",
+        "type": "link",
+        "key": "id",
+        "class": "brt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "overbook", "label": "Overbook", "datatype": "bool" },
+      { "name": "barcode", "label": "Barcode", "datatype": "text" },
+      { "name": "deposit", "label": "Is Deposit Required", "datatype": "bool" },
+      {
+        "name": "deposit_amount",
+        "label": "Deposit Amount",
+        "datatype": "money"
+      },
+      { "name": "user_fee", "label": "User Fee", "datatype": "money" },
+      {
+        "name": "attr_maps",
+        "label": "Resource Attribute Maps",
+        "virtual": true,
+        "type": "link",
+        "key": "resource",
+        "class": "bram",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "tgt_rsrcs",
+        "label": "Reservation Target Resources",
+        "virtual": true,
+        "type": "link",
+        "key": "targeted_resource",
+        "class": "bresv",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "curr_rsrcs",
+        "label": "Reservation Current Resources",
+        "virtual": true,
+        "type": "link",
+        "key": "current_resource",
+        "class": "bresv",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "catalog_item",
+        "label": "Catalog Item",
+        "virtual": true,
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_BOOKING_RESOURCE"] },
+      "retrieve": { "perms": ["ADMIN_BOOKING_RESOURCE"] },
+      "update": { "perms": ["ADMIN_BOOKING_RESOURCE"] },
+      "delete": { "perms": ["ADMIN_BOOKING_RESOURCE"] }
+    }
+  },
+  "brt": {
+    "name": "brt",
+    "label": "Resource Type",
+    "table": "booking.resource_type",
+    "pkey": "id",
+    "pkey_sequence": "booking.resource_type_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Resource Type ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      { "name": "name", "label": "Resource Type Name", "datatype": "text" },
+      {
+        "name": "fine_interval",
+        "label": "Fine Interval",
+        "datatype": "interval"
+      },
+      { "name": "fine_amount", "label": "Fine Amount", "datatype": "money" },
+      { "name": "max_fine", "label": "Max Fine Amount", "datatype": "money" },
+      {
+        "name": "owner",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "catalog_item", "label": "Catalog Item", "datatype": "bool" },
+      {
+        "name": "record",
+        "label": "Bibliographic Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "transferable", "label": "Transferable", "datatype": "bool" },
+      {
+        "name": "elbow_room",
+        "label": "Inter-booking and Inter-circulation Interval",
+        "datatype": "interval"
+      },
+      {
+        "name": "resources",
+        "label": "Resources",
+        "virtual": true,
+        "type": "link",
+        "key": "type",
+        "class": "brsrc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "resource_attrs",
+        "label": "Resource Attributes",
+        "virtual": true,
+        "type": "link",
+        "key": "type",
+        "class": "bra",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "tgt_rsrc_types",
+        "label": "Target Resource Types",
+        "virtual": true,
+        "type": "link",
+        "key": "type",
+        "class": "bresv",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_BOOKING_RESOURCE_TYPE"] },
+      "retrieve": { "perms": ["ADMIN_BOOKING_RESOURCE_TYPE"] },
+      "update": { "perms": ["ADMIN_BOOKING_RESOURCE_TYPE"] },
+      "delete": { "perms": ["ADMIN_BOOKING_RESOURCE_TYPE"] }
+    }
+  },
+  "cam": {
+    "name": "cam",
+    "label": "Audience Map",
+    "table": "config.audience_map",
+    "pkey": "code",
+    "pkey_sequence": "",
+    "fields": [
+      {
+        "name": "code",
+        "label": "Audience Code",
+        "selector": "value",
+        "datatype": "text"
+      },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "value", "label": "Audience", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_MARC_CODE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_MARC_CODE"] },
+      "delete": { "perms": ["DELETE_MARC_CODE"] }
+    }
+  },
+  "cbc": {
+    "name": "cbc",
+    "label": "Barcode Completions",
+    "table": "config.barcode_completion",
+    "pkey": "id",
+    "pkey_sequence": "config.barcode_completion_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "active", "label": "Active", "datatype": "bool" },
+      {
+        "name": "org_unit",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "prefix", "label": "Prefix", "datatype": "text" },
+      { "name": "suffix", "label": "Suffix", "datatype": "text" },
+      { "name": "length", "label": "Length", "datatype": "int" },
+      { "name": "padding", "label": "Padding", "datatype": "text" },
+      { "name": "padding_end", "label": "Padding At End", "datatype": "bool" },
+      { "name": "asset", "label": "Applies to Items", "datatype": "bool" },
+      { "name": "actor", "label": "Applies to Users", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["UPDATE_ORG_UNIT_SETTING_ALL"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_ORG_UNIT_SETTING_ALL"] },
+      "delete": { "perms": ["UPDATE_ORG_UNIT_SETTING_ALL"] }
+    }
+  },
+  "cbfp": {
+    "name": "cbfp",
+    "label": "Fingerprint Definition",
+    "table": "config.biblio_fingerprint",
+    "pkey": "id",
+    "pkey_sequence": "config.biblio_fingerprint_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      { "name": "name", "datatype": "text" },
+      { "name": "xpath", "datatype": "text" },
+      { "name": "format", "datatype": "link" },
+      { "name": "first_word", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_BIBLIO_FINGERPRINT"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_BIBLIO_FINGERPRINT"] },
+      "delete": { "perms": ["DELETE_BIBLIO_FINGERPRINT"] }
+    }
+  },
+  "cbho": {
+    "name": "cbho",
+    "label": "Best-Hold Sort Order",
+    "table": "config.best_hold_order",
+    "pkey": "id",
+    "pkey_sequence": "config.best_hold_order_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      {
+        "name": "pprox",
+        "label": "Capture Lib to Pickup Lib Proximity",
+        "datatype": "int"
+      },
+      {
+        "name": "hprox",
+        "label": "Circ Lib to Request Lib Proximity",
+        "datatype": "int"
+      },
+      {
+        "name": "aprox",
+        "label": "Adjusted Circ Lib to Pickup Lib Proximity",
+        "datatype": "int"
+      },
+      {
+        "name": "approx",
+        "label": "Adjusted Capture Location to Pickup Lib Proximity",
+        "datatype": "int"
+      },
+      { "name": "priority", "label": "Hold Priority", "datatype": "int" },
+      { "name": "cut", "label": "Hold Cut-in-line State", "datatype": "int" },
+      { "name": "depth", "label": "Hold Selection Depth", "datatype": "int" },
+      {
+        "name": "htime",
+        "label": "Copy Has Circulated From Home Lately",
+        "datatype": "int"
+      },
+      { "name": "rtime", "label": "Hold Request Time", "datatype": "int" },
+      {
+        "name": "shtime",
+        "label": "Copy Has Been Home At All Lately",
+        "datatype": "int"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_HOLD_CAPTURE_SORT"] },
+      "retrieve": { "perms": ["ADMIN_HOLD_CAPTURE_SORT"] },
+      "update": { "perms": ["ADMIN_HOLD_CAPTURE_SORT"] },
+      "delete": { "perms": ["ADMIN_HOLD_CAPTURE_SORT"] }
+    }
+  },
+  "cblvl": {
+    "name": "cblvl",
+    "label": "Bib Level Map",
+    "table": "config.bib_level_map",
+    "pkey": "code",
+    "fields": [
+      { "name": "code", "label": "Bib Level Code", "datatype": "text" },
+      {
+        "name": "value",
+        "label": "Bib Level",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_MARC_CODE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_MARC_CODE"] },
+      "delete": { "perms": ["DELETE_MARC_CODE"] }
+    }
+  },
+  "cbreb": {
+    "name": "cbreb",
+    "label": "Bibliographic Record Entry Bucket",
+    "table": "container.biblio_record_entry_bucket",
+    "pkey": "id",
+    "pkey_sequence": "container.biblio_record_entry_bucket_id_seq",
+    "fields": [
+      {
+        "name": "items",
+        "virtual": true,
+        "type": "link",
+        "key": "bucket",
+        "class": "cbrebi",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "btype", "datatype": "text" },
+      { "name": "id", "datatype": "id" },
+      { "name": "name", "datatype": "text" },
+      { "name": "description", "datatype": "text" },
+      {
+        "name": "owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "pub", "datatype": "bool" },
+      { "name": "create_time", "datatype": "timestamp" },
+      {
+        "name": "owning_lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_BIB_BUCKET", "ADMIN_BIB_BUCKET"] },
+      "retrieve": { "perms": ["CREATE_BIB_BUCKET", "ADMIN_BIB_BUCKET"] },
+      "update": { "perms": ["CREATE_BIB_BUCKET", "ADMIN_BIB_BUCKET"] },
+      "delete": { "perms": ["CREATE_BIB_BUCKET", "ADMIN_BIB_BUCKET"] }
+    }
+  },
+  "cbrebi": {
+    "name": "cbrebi",
+    "label": "Biblio Record Entry Bucket Item",
+    "table": "container.biblio_record_entry_bucket_item",
+    "pkey": "id",
+    "pkey_sequence": "container.biblio_record_entry_bucket_item_id_seq",
+    "fields": [
+      {
+        "name": "bucket",
+        "type": "link",
+        "key": "id",
+        "class": "cbreb",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "target_biblio_record_entry",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "create_time", "datatype": "timestamp" },
+      { "name": "pos", "datatype": "int" },
+      {
+        "name": "notes",
+        "virtual": true,
+        "type": "link",
+        "key": "item",
+        "class": "cbrebin",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["ADMIN_COPY_BUCKET"] } }
+  },
+  "cbrebin": {
+    "name": "cbrebin",
+    "label": "Biblio Record Entry Bucket Item Note",
+    "table": "container.biblio_record_entry_bucket_item_note",
+    "pkey": "id",
+    "pkey_sequence": "container.biblio_record_entry_bucket_item_note_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "item",
+        "type": "link",
+        "key": "id",
+        "class": "cbrebi",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "datatype": "text" }
+    ]
+  },
+  "cbrebn": {
+    "name": "cbrebn",
+    "label": "Bibliographic Record Entry Bucket Note",
+    "table": "container.biblio_record_entry_bucket_note",
+    "pkey": "id",
+    "pkey_sequence": "container.biblio_record_entry_bucket_note_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "bucket",
+        "type": "link",
+        "key": "id",
+        "class": "cbreb",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "datatype": "text" }
+    ]
+  },
+  "cbrebt": {
+    "name": "cbrebt",
+    "label": "Bibliographic Record Bucket Type",
+    "table": "container.biblio_record_entry_bucket_type",
+    "pkey": "code",
+    "fields": [
+      { "name": "code", "label": "Code", "selector": "name", "datatype": "id" },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_BIB_BTYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_BIB_BTYPE"] },
+      "delete": { "perms": ["DELETE_BIB_BTYPE"] }
+    }
+  },
+  "cbs": {
+    "name": "cbs",
+    "label": "Bib Source",
+    "table": "config.bib_source",
+    "pkey": "id",
+    "pkey_sequence": "config.bib_source_id_seq",
+    "fields": [
+      { "name": "id", "selector": "source", "datatype": "id" },
+      { "name": "quality", "datatype": "int" },
+      { "name": "source", "datatype": "text" },
+      { "name": "transcendant", "datatype": "bool" },
+      { "name": "can_have_copies", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_BIB_SOURCE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_BIB_SOURCE"] },
+      "delete": { "perms": ["DELETE_BIB_SOURCE"] }
+    }
+  },
+  "cbt": {
+    "name": "cbt",
+    "label": "Billing Type",
+    "restrict_primary": "100",
+    "table": "config.billing_type",
+    "pkey": "id",
+    "pkey_sequence": "config.billing_type_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      {
+        "name": "owner",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "default_price", "label": "Default Price", "datatype": "money" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_BILLING_TYPE"] },
+      "retrieve": {
+        "perms": [
+          "VIEW_BILLING_TYPE",
+          "CREATE_BILLING_TYPE",
+          "UPDATE_BILLING_TYPE",
+          "DELETE_BILLING_TYPE"
+        ]
+      },
+      "update": { "perms": ["UPDATE_BILLING_TYPE"] },
+      "delete": { "perms": ["DELETE_BILLING_TYPE"] }
+    }
+  },
+  "ccat": {
+    "name": "ccat",
+    "label": "Copy Alert Type",
+    "restrict_primary": "100",
+    "table": "config.copy_alert_type",
+    "pkey": "id",
+    "pkey_sequence": "config.copy_alert_type_id_seq",
+    "fields": [
+      { "name": "id", "label": "Id", "selector": "name", "datatype": "id" },
+      {
+        "name": "scope_org",
+        "label": "Scope Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "active", "label": "Active", "datatype": "bool" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "state", "label": "State", "datatype": "text" },
+      { "name": "event", "label": "Event", "datatype": "text" },
+      { "name": "in_renew", "label": "During Renewal", "datatype": "bool" },
+      {
+        "name": "at_circ",
+        "label": "Allow At Copy Circ Lib",
+        "datatype": "bool"
+      },
+      {
+        "name": "at_owning",
+        "label": "Allow At Copy Owning Lib",
+        "datatype": "bool"
+      },
+      {
+        "name": "invert_location",
+        "label": "Invert allowed locations",
+        "datatype": "bool"
+      },
+      { "name": "next_status", "label": "Next Statuses", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": {
+        "perms": ["ADMIN_COPY_ALERT_TYPE", "CREATE_COPY_ALERT_TYPE"]
+      },
+      "retrieve": {},
+      "update": {
+        "perms": ["ADMIN_COPY_ALERT_TYPE", "UPDATE_COPY_ALERT_TYPE"]
+      },
+      "delete": { "perms": ["ADMIN_COPY_ALERT_TYPE", "DELETE_COPY_ALERT_TYPE"] }
+    }
+  },
+  "ccb": {
+    "name": "ccb",
+    "label": "Copy Bucket",
+    "table": "container.copy_bucket",
+    "pkey": "id",
+    "pkey_sequence": "container.copy_bucket_id_seq",
+    "fields": [
+      {
+        "name": "items",
+        "virtual": true,
+        "type": "link",
+        "key": "bucket",
+        "class": "ccbi",
+        "reltype": "has_many",
+        "datatype": "text"
+      },
+      { "name": "btype", "datatype": "text" },
+      { "name": "id", "datatype": "id" },
+      { "name": "name", "datatype": "text" },
+      { "name": "description", "datatype": "text" },
+      {
+        "name": "owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "pub", "datatype": "bool" },
+      { "name": "create_time", "datatype": "timestamp" },
+      {
+        "name": "owning_lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_COPY_BUCKET", "ADMIN_COPY_BUCKET"] },
+      "retrieve": { "perms": ["CREATE_COPY_BUCKET", "ADMIN_COPY_BUCKET"] },
+      "update": { "perms": ["CREATE_COPY_BUCKET", "ADMIN_COPY_BUCKET"] },
+      "delete": { "perms": ["CREATE_COPY_BUCKET", "ADMIN_COPY_BUCKET"] }
+    }
+  },
+  "ccbi": {
+    "name": "ccbi",
+    "label": "Copy Bucket Item",
+    "table": "container.copy_bucket_item",
+    "pkey": "id",
+    "pkey_sequence": "container.copy_bucket_item_id_seq",
+    "fields": [
+      {
+        "name": "bucket",
+        "type": "link",
+        "key": "id",
+        "class": "ccb",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "target_copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "create_time", "datatype": "timestamp" },
+      { "name": "pos", "datatype": "int" },
+      {
+        "name": "notes",
+        "virtual": true,
+        "type": "link",
+        "key": "item",
+        "class": "ccbin",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["ADMIN_COPY_BUCKET"] } }
+  },
+  "ccbin": {
+    "name": "ccbin",
+    "label": "Copy Bucket Item Note",
+    "table": "container.copy_bucket_item_note",
+    "pkey": "id",
+    "pkey_sequence": "container.copy_bucket_item_note_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "item",
+        "type": "link",
+        "key": "id",
+        "class": "ccbi",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "datatype": "text" }
+    ]
+  },
+  "ccbn": {
+    "name": "ccbn",
+    "label": "Copy Bucket Note",
+    "table": "container.copy_bucket_note",
+    "pkey": "id",
+    "pkey_sequence": "container.copy_bucket_note_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "bucket",
+        "type": "link",
+        "key": "id",
+        "class": "ccb",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "datatype": "text" }
+    ]
+  },
+  "cclg": {
+    "name": "cclg",
+    "label": "Circulation Limit Group",
+    "table": "config.circ_limit_group",
+    "pkey": "id",
+    "pkey_sequence": "config.circ_limit_group_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "description", "label": "Description", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "delete": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] }
+    }
+  },
+  "ccls": {
+    "name": "ccls",
+    "label": "Circulation Limit Set",
+    "table": "config.circ_limit_set",
+    "pkey": "id",
+    "pkey_sequence": "config.circ_limit_set_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "items_out", "label": "Items Out", "datatype": "int" },
+      { "name": "depth", "label": "Min Depth", "datatype": "int" },
+      { "name": "global", "label": "Global", "datatype": "bool" },
+      { "name": "description", "label": "Description", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "delete": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] }
+    }
+  },
+  "cclsacpl": {
+    "name": "cclsacpl",
+    "label": "Circulation Limit Set Copy Location Map",
+    "table": "config.circ_limit_set_copy_loc_map",
+    "pkey": "id",
+    "pkey_sequence": "config.circ_limit_set_copy_loc_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "limit_set",
+        "label": "Limit Set",
+        "type": "link",
+        "key": "id",
+        "class": "ccls",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_loc",
+        "label": "Copy Location",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "delete": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] }
+    }
+  },
+  "cclscmm": {
+    "name": "cclscmm",
+    "label": "Circulation Limit Set Circ Mod Map",
+    "table": "config.circ_limit_set_circ_mod_map",
+    "pkey": "id",
+    "pkey_sequence": "config.circ_limit_set_circ_mod_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "limit_set",
+        "label": "Limit Set",
+        "type": "link",
+        "key": "id",
+        "class": "ccls",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_mod",
+        "label": "Circulation Modifier",
+        "type": "link",
+        "key": "code",
+        "class": "ccm",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "delete": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] }
+    }
+  },
+  "cclsgm": {
+    "name": "cclsgm",
+    "label": "Circulation Limit Set Group Map",
+    "table": "config.circ_limit_set_group_map",
+    "pkey": "id",
+    "pkey_sequence": "config.circ_limit_set_group_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "limit_set",
+        "label": "Limit Set",
+        "type": "link",
+        "key": "id",
+        "class": "ccls",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "limit_group",
+        "label": "Limit Group",
+        "type": "link",
+        "key": "id",
+        "class": "cclg",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "check_only", "label": "Check Only", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "delete": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] }
+    }
+  },
+  "ccm": {
+    "name": "ccm",
+    "label": "Circulation Modifier",
+    "table": "config.circ_modifier",
+    "pkey": "code",
+    "fields": [
+      { "name": "code", "label": "Code", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "sip2_media_type",
+        "label": "SIP2 Media Type",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "magnetic_media",
+        "label": "Magnetic Media",
+        "datatype": "bool"
+      },
+      {
+        "name": "avg_wait_time",
+        "label": "Average Wait Time",
+        "datatype": "interval"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CIRC_MOD"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_CIRC_MOD"] },
+      "delete": { "perms": ["ADMIN_CIRC_MOD"] }
+    }
+  },
+  "ccmlsm": {
+    "name": "ccmlsm",
+    "label": "Circulation Matrix Limit Set Map",
+    "table": "config.circ_matrix_limit_set_map",
+    "pkey": "id",
+    "pkey_sequence": "config.circ_matrix_limit_set_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "matchpoint",
+        "label": "Matchpoint",
+        "type": "link",
+        "key": "id",
+        "class": "ccmm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "limit_set",
+        "label": "Limit Set",
+        "type": "link",
+        "key": "id",
+        "class": "ccls",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "fallthrough", "label": "Fallthrough", "datatype": "bool" },
+      { "name": "active", "label": "Active", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "delete": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] }
+    }
+  },
+  "ccmm": {
+    "name": "ccmm",
+    "label": "Circulation Matrix Matchpoint",
+    "table": "config.circ_matrix_matchpoint",
+    "pkey": "id",
+    "pkey_sequence": "config.circ_matrix_matchpoint_id_seq",
+    "fields": [
+      { "name": "id", "label": "Matchpoint ID", "datatype": "id" },
+      { "name": "is_renewal", "label": "Renewal?", "datatype": "bool" },
+      { "name": "active", "label": "Active?", "datatype": "bool" },
+      {
+        "name": "org_unit",
+        "label": "Org Unit",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "copy_circ_lib",
+        "label": "Copy Circ Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "copy_owning_lib",
+        "label": "Copy Owning Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "user_home_ou",
+        "label": "User Home Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "grp",
+        "label": "Permission Group",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "pgt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_modifier",
+        "label": "Circulation Modifier",
+        "type": "link",
+        "key": "code",
+        "class": "ccm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_location",
+        "label": "Copy Location",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "marc_type",
+        "label": "MARC Type",
+        "type": "link",
+        "key": "code",
+        "class": "citm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "marc_form",
+        "label": "MARC Form",
+        "type": "link",
+        "key": "code",
+        "class": "cifm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "marc_bib_level",
+        "label": "MARC Bib Level",
+        "type": "link",
+        "key": "code",
+        "class": "cblvl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "marc_vr_format",
+        "label": "Videorecording Format",
+        "type": "link",
+        "key": "code",
+        "class": "cvrfm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "ref_flag", "label": "Reference?", "datatype": "bool" },
+      { "name": "juvenile_flag", "label": "Juvenile?", "datatype": "bool" },
+      {
+        "name": "usr_age_lower_bound",
+        "label": "User Age: Lower Bound",
+        "datatype": "text"
+      },
+      {
+        "name": "usr_age_upper_bound",
+        "label": "User Age: Upper Bound",
+        "datatype": "text"
+      },
+      { "name": "item_age", "label": "Item Age <", "datatype": "text" },
+      { "name": "circulate", "label": "Circulate?", "datatype": "bool" },
+      {
+        "name": "duration_rule",
+        "label": "Duration Rule",
+        "type": "link",
+        "key": "id",
+        "class": "crcd",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "recurring_fine_rule",
+        "label": "Recurring Fine Rule",
+        "type": "link",
+        "key": "id",
+        "class": "crrf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "max_fine_rule",
+        "label": "Max Fine Rule",
+        "type": "link",
+        "key": "id",
+        "class": "crmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "hard_due_date",
+        "label": "Hard Due Date",
+        "type": "link",
+        "key": "id",
+        "class": "chdd",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "renewals", "label": "Renewals Override", "datatype": "int" },
+      {
+        "name": "grace_period",
+        "label": "Grace Period Override",
+        "datatype": "interval"
+      },
+      { "name": "script_test", "label": "Script Test", "datatype": "text" },
+      {
+        "name": "total_copy_hold_ratio",
+        "label": "Minimum Total Copy/Hold Ratio",
+        "datatype": "float"
+      },
+      {
+        "name": "available_copy_hold_ratio",
+        "label": "Minimum Available Copy/Hold Ratio",
+        "datatype": "float"
+      },
+      { "name": "description", "label": "Description", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "retrieve": {
+        "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT", "VIEW_CIRC_MATRIX_MATCHPOINT"]
+      },
+      "update": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "delete": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] }
+    }
+  },
+  "ccmw": {
+    "name": "ccmw",
+    "label": "Circ Matrix Weights",
+    "table": "config.circ_matrix_weights",
+    "pkey": "id",
+    "pkey_sequence": "config.circ_matrix_weights_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Circ Weights ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "is_renewal", "label": "Renewal?", "datatype": "float" },
+      { "name": "org_unit", "label": "Org Unit", "datatype": "float" },
+      {
+        "name": "copy_circ_lib",
+        "label": "Copy Circ Lib",
+        "datatype": "float"
+      },
+      {
+        "name": "copy_owning_lib",
+        "label": "Copy Owning Lib",
+        "datatype": "float"
+      },
+      { "name": "user_home_ou", "label": "User Home Lib", "datatype": "float" },
+      { "name": "grp", "label": "Permission Group", "datatype": "float" },
+      {
+        "name": "circ_modifier",
+        "label": "Circulation Modifier",
+        "datatype": "float"
+      },
+      {
+        "name": "copy_location",
+        "label": "Copy Location",
+        "datatype": "float"
+      },
+      { "name": "marc_type", "label": "MARC Type", "datatype": "float" },
+      { "name": "marc_form", "label": "MARC Form", "datatype": "float" },
+      {
+        "name": "marc_bib_level",
+        "label": "MARC Bib Level",
+        "datatype": "float"
+      },
+      {
+        "name": "marc_vr_format",
+        "label": "Videorecording Format",
+        "datatype": "float"
+      },
+      { "name": "ref_flag", "label": "Reference?", "datatype": "float" },
+      { "name": "juvenile_flag", "label": "Juvenile?", "datatype": "float" },
+      {
+        "name": "usr_age_lower_bound",
+        "label": "User Age: Lower Bound",
+        "datatype": "float"
+      },
+      {
+        "name": "usr_age_upper_bound",
+        "label": "User Age: Upper Bound",
+        "datatype": "float"
+      },
+      { "name": "item_age", "label": "Item Age <", "datatype": "float" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] },
+      "delete": { "perms": ["ADMIN_CIRC_MATRIX_MATCHPOINT"] }
+    }
+  },
+  "ccnb": {
+    "name": "ccnb",
+    "label": "Call Number Bucket",
+    "table": "container.call_number_bucket",
+    "pkey": "id",
+    "pkey_sequence": "container.call_number_bucket_id_seq",
+    "fields": [
+      {
+        "name": "items",
+        "virtual": true,
+        "type": "link",
+        "key": "bucket",
+        "class": "ccnbi",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "btype", "datatype": "text" },
+      { "name": "id", "datatype": "id" },
+      { "name": "name", "datatype": "text" },
+      { "name": "description", "datatype": "text" },
+      {
+        "name": "owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "pub", "datatype": "bool" },
+      { "name": "create_time", "datatype": "timestamp" },
+      {
+        "name": "owning_lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": {
+        "perms": ["CREATE_CALLNUMBER_BUCKET", "ADMIN_CALLNUMBER_BUCKET"]
+      },
+      "retrieve": {
+        "perms": ["CREATE_CALLNUMBER_BUCKET", "ADMIN_CALLNUMBER_BUCKET"]
+      },
+      "update": {
+        "perms": ["CREATE_CALLNUMBER_BUCKET", "ADMIN_CALLNUMBER_BUCKET"]
+      },
+      "delete": {
+        "perms": ["CREATE_CALLNUMBER_BUCKET", "ADMIN_CALLNUMBER_BUCKET"]
+      }
+    }
+  },
+  "ccnbi": {
+    "name": "ccnbi",
+    "label": "Call Number Bucket Item",
+    "table": "container.call_number_bucket_item",
+    "pkey": "id",
+    "pkey_sequence": "container.call_number_bucket_item_id_seq",
+    "fields": [
+      {
+        "name": "bucket",
+        "type": "link",
+        "key": "id",
+        "class": "ccnb",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "target_call_number",
+        "type": "link",
+        "key": "id",
+        "class": "acn",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "create_time", "datatype": "timestamp" },
+      { "name": "pos", "datatype": "int" },
+      {
+        "name": "notes",
+        "virtual": true,
+        "type": "link",
+        "key": "item",
+        "class": "ccnbin",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["ADMIN_CALLNUMBER_BUCKET"] } }
+  },
+  "ccnbin": {
+    "name": "ccnbin",
+    "label": "Call Number Bucket Item Note",
+    "table": "container.call_number_bucket_item_note",
+    "pkey": "id",
+    "pkey_sequence": "container.call_number_bucket_item_note_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "item",
+        "type": "link",
+        "key": "id",
+        "class": "ccnbi",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "datatype": "text" }
+    ]
+  },
+  "ccnbn": {
+    "name": "ccnbn",
+    "label": "Call Number Bucket Note",
+    "table": "container.call_number_bucket_note",
+    "pkey": "id",
+    "pkey_sequence": "container.call_number_bucket_note_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "bucket",
+        "type": "link",
+        "key": "id",
+        "class": "ccnb",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "datatype": "text" }
+    ]
+  },
+  "ccnbt": {
+    "name": "ccnbt",
+    "label": "Call Number Bucket Type",
+    "table": "container.call_number_bucket_type",
+    "pkey": "code",
+    "fields": [
+      { "name": "code", "label": "Code", "selector": "name", "datatype": "id" },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_CN_BTYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_CN_BTYPE"] },
+      "delete": { "perms": ["DELETE_CN_BTYPE"] }
+    }
+  },
+  "ccpbt": {
+    "name": "ccpbt",
+    "label": "Copy Bucket Type",
+    "table": "container.copy_bucket_type",
+    "pkey": "code",
+    "fields": [
+      { "name": "code", "label": "Code", "selector": "name", "datatype": "id" },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_COPY_BTYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_COPY_BTYPE"] },
+      "delete": { "perms": ["DELETE_COPY_BTYPE"] }
+    }
+  },
+  "ccraed": {
+    "name": "ccraed",
+    "label": "Composite Attribute Definitions",
+    "table": "config.composite_attr_entry_definition",
+    "pkey": "coded_value",
+    "fields": [
+      {
+        "name": "coded_value",
+        "label": "Coded Value",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "ccvm",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "definition",
+        "label": "Defintion",
+        "required": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CODED_VALUE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_CODED_VALUE"] },
+      "delete": { "perms": ["ADMIN_CODED_VALUE"] }
+    }
+  },
+  "ccs": {
+    "name": "ccs",
+    "label": "Copy Status",
+    "restrict_primary": "100",
+    "table": "config.copy_status",
+    "pkey": "id",
+    "pkey_sequence": "config.copy_status_id_seq",
+    "fields": [
+      { "name": "holdable", "datatype": "bool" },
+      { "name": "id", "selector": "name", "datatype": "id" },
+      { "name": "name", "i18n": true, "datatype": "text" },
+      { "name": "opac_visible", "datatype": "bool" },
+      { "name": "copy_active", "datatype": "bool" },
+      { "name": "restrict_copy_delete", "datatype": "bool" },
+      { "name": "is_available", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_COPY_STATUS"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_COPY_STATUS"] },
+      "delete": { "perms": ["DELETE_COPY_STATUS"] }
+    }
+  },
+  "cctt": {
+    "name": "cctt",
+    "label": "Copy Tag Types",
+    "table": "config.copy_tag_type",
+    "pkey": "code",
+    "fields": [
+      {
+        "name": "code",
+        "label": "Code",
+        "selector": "label",
+        "required": true,
+        "datatype": "id"
+      },
+      {
+        "name": "label",
+        "label": "Label",
+        "required": true,
+        "datatype": "text"
+      },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_COPY_TAG_TYPES"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_COPY_TAG_TYPES"] },
+      "delete": { "perms": ["ADMIN_COPY_TAG_TYPES"] }
+    }
+  },
+  "ccvm": {
+    "name": "ccvm",
+    "label": "SVF Record Attribute Coded Value Map",
+    "table": "config.coded_value_map",
+    "pkey": "id",
+    "pkey_sequence": "config.coded_value_map_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "ID",
+        "selector": "value",
+        "required": true,
+        "datatype": "id"
+      },
+      {
+        "name": "ctype",
+        "label": "SVF Attribute",
+        "required": true,
+        "type": "link",
+        "key": "name",
+        "class": "crad",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "code", "label": "Code", "required": true, "datatype": "text" },
+      {
+        "name": "value",
+        "label": "Value",
+        "required": true,
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "opac_visible", "label": "OPAC Visible", "datatype": "bool" },
+      {
+        "name": "search_label",
+        "label": "Search Label",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "is_simple",
+        "label": "Is Simple Selector",
+        "datatype": "bool"
+      },
+      { "name": "concept_uri", "label": "Concept URI", "datatype": "text" },
+      {
+        "name": "composite_def",
+        "label": "Composite Definition",
+        "virtual": true,
+        "type": "link",
+        "key": "coded_value",
+        "class": "ccraed",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CODED_VALUE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_CODED_VALUE"] },
+      "delete": { "perms": ["ADMIN_CODED_VALUE"] }
+    }
+  },
+  "cdfm": {
+    "name": "cdfm",
+    "label": "Display Field Map",
+    "table": "config.display_field_map",
+    "pkey": "name",
+    "fields": [
+      { "name": "name", "datatype": "text" },
+      {
+        "name": "field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "multi", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "retrieve": {},
+      "create": { "perms": ["CREATE_METABIB_FIELD"] },
+      "update": { "perms": ["UPDATE_METABIB_FIELD"] },
+      "delete": { "perms": ["DELETE_METABIB_FIELD"] }
+    }
+  },
+  "cfdfs": {
+    "name": "cfdfs",
+    "label": "FilterDialog Filter Set",
+    "table": "config.filter_dialog_filter_set",
+    "pkey": "id",
+    "pkey_sequence": "config.filter_dialog_filter_set_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "interface",
+        "label": "Interface",
+        "type": "link",
+        "key": "key",
+        "class": "cfdi",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_time",
+        "label": "Create Time",
+        "datatype": "timestamp"
+      },
+      { "name": "filters", "label": "Filters", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["SAVED_FILTER_DIALOG_FILTERS"] },
+      "retrieve": { "perms": ["SAVED_FILTER_DIALOG_FILTERS"] },
+      "update": { "perms": ["SAVED_FILTER_DIALOG_FILTERS"] },
+      "delete": { "perms": ["SAVED_FILTER_DIALOG_FILTERS"] }
+    }
+  },
+  "cfdi": {
+    "name": "cfdi",
+    "label": "FilterDialog Interface",
+    "table": "config.filter_dialog_interface",
+    "pkey": "key",
+    "pkey_sequence": "config.filter_dialog_interface_pkey",
+    "fields": [
+      { "name": "key", "label": "Interface Key", "datatype": "text" },
+      { "name": "description", "label": "Description", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "cfg": {
+    "name": "cfg",
+    "label": "Floating Group",
+    "table": "config.floating_group",
+    "pkey": "id",
+    "pkey_sequence": "config.floating_group_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "manual", "label": "Manual", "datatype": "bool" },
+      {
+        "name": "members",
+        "label": "Group Members",
+        "virtual": true,
+        "type": "link",
+        "key": "floating_group",
+        "class": "cfgm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_FLOAT_GROUPS"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_FLOAT_GROUPS"] },
+      "delete": { "perms": ["ADMIN_FLOAT_GROUPS"] }
+    }
+  },
+  "cfgm": {
+    "name": "cfgm",
+    "label": "Floating Group Members",
+    "table": "config.floating_group_member",
+    "pkey": "id",
+    "pkey_sequence": "config.floating_group_member_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "floating_group",
+        "label": "Floating Group",
+        "type": "link",
+        "key": "id",
+        "class": "cfg",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "org_unit",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "stop_depth", "label": "Stop Depth", "datatype": "int" },
+      { "name": "max_depth", "label": "Max Depth", "datatype": "int" },
+      { "name": "exclude", "label": "Exclude", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_FLOAT_GROUPS"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_FLOAT_GROUPS"] },
+      "delete": { "perms": ["ADMIN_FLOAT_GROUPS"] }
+    }
+  },
+  "cgf": {
+    "name": "cgf",
+    "label": "Global Flags and Settings",
+    "table": "config.global_flag",
+    "pkey": "name",
+    "fields": [
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" },
+      { "name": "value", "label": "Value", "datatype": "text" },
+      { "name": "enabled", "label": "Enabled", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_GLOBAL_FLAG"] },
+      "retrieve": { "perms": ["ADMIN_GLOBAL_FLAG"] },
+      "update": { "perms": ["ADMIN_GLOBAL_FLAG"] },
+      "delete": { "perms": ["ADMIN_GLOBAL_FLAG"] }
+    }
+  },
+  "chdd": {
+    "name": "chdd",
+    "label": "Hard Due Date",
+    "table": "config.hard_due_date",
+    "pkey": "id",
+    "pkey_sequence": "config.hard_due_date_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "forceto", "label": "Always Use?", "datatype": "bool" },
+      {
+        "name": "ceiling_date",
+        "label": "Current Ceiling Date",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_CIRC_DURATION"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_CIRC_DURATION"] },
+      "delete": { "perms": ["DELETE_CIRC_DURATION"] }
+    }
+  },
+  "chddv": {
+    "name": "chddv",
+    "label": "Hard Due Date Values",
+    "table": "config.hard_due_date_values",
+    "pkey": "id",
+    "pkey_sequence": "config.hard_due_date_values_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "hard_due_date",
+        "label": "Hard Due Date",
+        "type": "link",
+        "key": "id",
+        "class": "chdd",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "ceiling_date",
+        "label": "Ceiling Date",
+        "datatype": "timestamp"
+      },
+      { "name": "active_date", "label": "Active Date", "datatype": "timestamp" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_CIRC_DURATION"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_CIRC_DURATION"] },
+      "delete": { "perms": ["DELETE_CIRC_DURATION"] }
+    }
+  },
+  "chmm": {
+    "name": "chmm",
+    "label": "Hold Matrix Matchpoint",
+    "table": "config.hold_matrix_matchpoint",
+    "pkey": "id",
+    "pkey_sequence": "config.hold_matrix_matchpoint_id_seq",
+    "fields": [
+      { "name": "id", "label": "Matchpoint ID", "datatype": "id" },
+      { "name": "active", "label": "Active?", "datatype": "bool" },
+      {
+        "name": "strict_ou_match",
+        "label": "Strict OU matches?",
+        "datatype": "bool"
+      },
+      {
+        "name": "user_home_ou",
+        "label": "User Home Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "request_ou",
+        "label": "Request Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "pickup_ou",
+        "label": "Pickup Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "item_owning_ou",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "item_circ_ou",
+        "label": "Item Circ Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "usr_grp",
+        "label": "User Permission Group",
+        "type": "link",
+        "key": "id",
+        "class": "pgt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "requestor_grp",
+        "label": "Requestor Permission Group",
+        "type": "link",
+        "key": "id",
+        "class": "pgt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_modifier",
+        "label": "Circulation Modifier",
+        "type": "link",
+        "key": "code",
+        "class": "ccm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "marc_type",
+        "label": "MARC Type",
+        "type": "link",
+        "key": "code",
+        "class": "citm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "marc_form",
+        "label": "MARC Form",
+        "type": "link",
+        "key": "code",
+        "class": "cifm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "marc_bib_level",
+        "label": "MARC Bib Level",
+        "type": "link",
+        "key": "code",
+        "class": "cblvl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "marc_vr_format",
+        "label": "Videorecording Format",
+        "type": "link",
+        "key": "code",
+        "class": "cvrfm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "ref_flag", "label": "Reference?", "datatype": "bool" },
+      { "name": "item_age", "label": "Item Age <", "datatype": "text" },
+      { "name": "holdable", "label": "Holdable?", "datatype": "bool" },
+      {
+        "name": "distance_is_from_owner",
+        "label": "Range is from Owning Lib?",
+        "datatype": "bool"
+      },
+      {
+        "name": "transit_range",
+        "label": "Transit Range",
+        "type": "link",
+        "key": "id",
+        "class": "aout",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "max_holds", "label": "Max Holds", "datatype": "int" },
+      {
+        "name": "include_frozen_holds",
+        "label": "Max includes Frozen",
+        "datatype": "bool"
+      },
+      {
+        "name": "age_hold_protect_rule",
+        "label": "Copy Age Hold Protection Rule",
+        "type": "link",
+        "key": "id",
+        "class": "crahp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "description", "label": "Description", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_HOLD_MATRIX_MATCHPOINT"] },
+      "retrieve": {
+        "perms": ["ADMIN_HOLD_MATRIX_MATCHPOINT", "VIEW_HOLD_MATRIX_MATCHPOINT"]
+      },
+      "update": { "perms": ["ADMIN_HOLD_MATRIX_MATCHPOINT"] },
+      "delete": { "perms": ["ADMIN_HOLD_MATRIX_MATCHPOINT"] }
+    }
+  },
+  "chmw": {
+    "name": "chmw",
+    "label": "Hold Matrix Weights",
+    "table": "config.hold_matrix_weights",
+    "pkey": "id",
+    "pkey_sequence": "config.hold_matrix_weights_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Hold Weights ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      {
+        "name": "user_home_ou",
+        "label": "User Home Library",
+        "datatype": "float"
+      },
+      { "name": "request_ou", "label": "Request Library", "datatype": "float" },
+      { "name": "pickup_ou", "label": "Pickup Library", "datatype": "float" },
+      {
+        "name": "item_owning_ou",
+        "label": "Owning Library",
+        "datatype": "float"
+      },
+      {
+        "name": "item_circ_ou",
+        "label": "Item Circ Library",
+        "datatype": "float"
+      },
+      {
+        "name": "usr_grp",
+        "label": "User Permission Group",
+        "datatype": "float"
+      },
+      {
+        "name": "requestor_grp",
+        "label": "Requestor Permission Group",
+        "datatype": "float"
+      },
+      {
+        "name": "circ_modifier",
+        "label": "Circulation Modifier",
+        "datatype": "float"
+      },
+      { "name": "marc_type", "label": "MARC Type", "datatype": "float" },
+      { "name": "marc_form", "label": "MARC Form", "datatype": "float" },
+      {
+        "name": "marc_bib_level",
+        "label": "MARC Bib Level",
+        "datatype": "float"
+      },
+      {
+        "name": "marc_vr_format",
+        "label": "Videorecording Format",
+        "datatype": "float"
+      },
+      { "name": "juvenile_flag", "label": "Juvenile?", "datatype": "float" },
+      { "name": "ref_flag", "label": "Reference?", "datatype": "float" },
+      { "name": "item_age", "label": "Item Age <", "datatype": "float" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_HOLD_MATRIX_MATCHPOINT"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_HOLD_MATRIX_MATCHPOINT"] },
+      "delete": { "perms": ["ADMIN_HOLD_MATRIX_MATCHPOINT"] }
+    }
+  },
+  "cifm": {
+    "name": "cifm",
+    "label": "Item Form Map",
+    "table": "config.item_form_map",
+    "pkey": "code",
+    "pkey_sequence": "",
+    "fields": [
+      {
+        "name": "code",
+        "label": "Item Form Code",
+        "selector": "value",
+        "datatype": "text"
+      },
+      {
+        "name": "value",
+        "label": "Item Form",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_MARC_CODE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_MARC_CODE"] },
+      "delete": { "perms": ["ADMIN_MARC_CODE"] }
+    }
+  },
+  "cin": {
+    "name": "cin",
+    "label": "Indexing Normalizer",
+    "table": "config.index_normalizer",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "func", "label": "Function", "datatype": "text" },
+      {
+        "name": "param_count",
+        "label": "Required Parameter Count",
+        "datatype": "int"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_INDEX_NORMALIZER"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_INDEX_NORMALIZER"] },
+      "delete": { "perms": ["ADMIN_INDEX_NORMALIZER"] }
+    }
+  },
+  "circ": {
+    "name": "circ",
+    "label": "Circulation",
+    "table": "action.circulation",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "money.billable_xact_id_seq",
+    "fields": [
+      {
+        "name": "checkin_lib",
+        "label": "Check In Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "checkin_staff",
+        "label": "Check In Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "checkin_time",
+        "label": "Check In Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Checkout / Renewal Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "circ_staff",
+        "label": "Circulating Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "desk_renewal", "label": "Desk Renewal", "datatype": "bool" },
+      { "name": "due_date", "label": "Due Date/Time", "datatype": "timestamp" },
+      {
+        "name": "duration",
+        "label": "Circulation Duration",
+        "datatype": "interval"
+      },
+      {
+        "name": "duration_rule",
+        "label": "Circ Duration Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crcd",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "fine_interval",
+        "label": "Fine Interval",
+        "datatype": "interval"
+      },
+      { "name": "id", "label": "Circ ID", "datatype": "id" },
+      { "name": "max_fine", "label": "Max Fine Amount", "datatype": "money" },
+      {
+        "name": "max_fine_rule",
+        "label": "Max Fine Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "opac_renewal", "label": "OPAC Renewal", "datatype": "bool" },
+      { "name": "phone_renewal", "label": "Phone Renewal", "datatype": "bool" },
+      {
+        "name": "recurring_fine",
+        "label": "Recurring Fine Amount",
+        "datatype": "money"
+      },
+      {
+        "name": "recurring_fine_rule",
+        "label": "Recurring Fine Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crrf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "renewal_remaining",
+        "label": "Remaining Renewals",
+        "datatype": "int"
+      },
+      {
+        "name": "grace_period",
+        "label": "Grace Period",
+        "datatype": "interval"
+      },
+      { "name": "stop_fines", "label": "Fine Stop Reason", "datatype": "text" },
+      {
+        "name": "stop_fines_time",
+        "label": "Fine Stop Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "target_copy",
+        "label": "Circulating Item",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr",
+        "label": "Patron",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "xact_finish",
+        "label": "Transaction Finish Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact_start",
+        "label": "Checkout Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "create_time",
+        "label": "Record Creation Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "workstation",
+        "label": "Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "checkin_workstation",
+        "label": "Checkin Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "checkin_scan_time",
+        "label": "Checkin Scan Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "parent_circ",
+        "label": "Parent Circulation",
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "billings",
+        "label": "Transaction Billings",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mb",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "payments",
+        "label": "Transaction Payments",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mp",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "billable_transaction",
+        "label": "Base Transaction",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_type",
+        "label": "Circulation Type",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rcirct",
+        "reltype": "might_have",
+        "datatype": "text"
+      },
+      {
+        "name": "billing_total",
+        "label": "Billing Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxbt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "payment_total",
+        "label": "Payment Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxpt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "unrecovered",
+        "label": "Unrecovered Debt",
+        "datatype": "bool"
+      },
+      {
+        "name": "copy_location",
+        "label": "Shelving Location",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "aaactsc_entries",
+        "label": "Archived Patron Stat-Cat Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "aaactsc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "aaasc_entries",
+        "label": "Archived Copy Stat-Cat Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "aaasc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "auto_renewal", "label": "Auto Renewal", "datatype": "bool" },
+      {
+        "name": "auto_renewal_remaining",
+        "label": "Remaining Auto Renewals",
+        "datatype": "int"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_CIRCULATIONS"] } }
+  },
+  "circbyyr": {
+    "name": "circbyyr",
+    "source": "( SELECT copy, SUM(count) AS count, year, is_renewal FROM ( SELECT cp.id as copy, COUNT(circ.id), EXTRACT(YEAR FROM circ.xact_start) AS year, (phone_renewal OR desk_renewal OR opac_renewal) as is_renewal FROM asset.copy cp JOIN action.circulation circ ON (cp.id = circ.target_copy) GROUP BY 1, 3, 4 UNION ALL SELECT cp.id as copy, COUNT(circ.id), EXTRACT(YEAR FROM circ.xact_start) AS year, (phone_renewal OR desk_renewal OR opac_renewal) as is_renewal FROM asset.copy cp JOIN action.aged_circulation circ ON (cp.id = circ.target_copy) GROUP BY 1, 3, 4 UNION ALL SELECT id as copy, circ_count, -1 AS year, false as is_renewal FROM extend_reporter.legacy_circ_count )x GROUP BY 1, 3, 4 )",
+    "fields": [
+      {
+        "name": "copy",
+        "label": "Copy ID",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "count", "label": "Count", "datatype": "int" },
+      { "name": "year", "label": "Year", "datatype": "int" },
+      { "name": "is_renewal", "label": "Renewal", "datatype": "bool" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "cit": {
+    "name": "cit",
+    "label": "Identification Type",
+    "table": "config.identification_type",
+    "pkey": "id",
+    "pkey_sequence": "config.identification_type_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Identification ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "name",
+        "label": "Identification Name",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_IDENT_TYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_IDENT_TYPE"] },
+      "delete": { "perms": ["ADMIN_IDENT_TYPE"] }
+    }
+  },
+  "citm": {
+    "name": "citm",
+    "label": "Item Type Map",
+    "table": "config.item_type_map",
+    "pkey": "code",
+    "fields": [
+      {
+        "name": "code",
+        "label": "Item Type Code",
+        "selector": "value",
+        "datatype": "text"
+      },
+      {
+        "name": "value",
+        "label": "Item Type",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_MARC_CODE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_MARC_CODE"] },
+      "delete": { "perms": ["ADMIN_MARC_CODE"] }
+    }
+  },
+  "clfm": {
+    "name": "clfm",
+    "label": "Literary Form",
+    "table": "config.lit_form_map",
+    "pkey": "code",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "code", "label": "LitF Code", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "LitF Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "value",
+        "label": "LitF Name",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_MARC_CODE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_MARC_CODE"] },
+      "delete": { "perms": ["DELETE_MARC_CODE"] }
+    }
+  },
+  "clm": {
+    "name": "clm",
+    "label": "Language Map",
+    "table": "config.language_map",
+    "pkey": "code",
+    "pkey_sequence": "",
+    "fields": [
+      {
+        "name": "code",
+        "label": "Language Code",
+        "selector": "value",
+        "datatype": "text"
+      },
+      { "name": "value", "label": "Language", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_MARC_CODE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_MARC_CODE"] },
+      "delete": { "perms": ["DELETE_MARC_CODE"] }
+    }
+  },
+  "cmc": {
+    "name": "cmc",
+    "label": "Metabib Class",
+    "table": "config.metabib_class",
+    "pkey": "name",
+    "fields": [
+      {
+        "name": "name",
+        "label": "Name",
+        "selector": "label",
+        "datatype": "text"
+      },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" },
+      { "name": "buoyant", "label": "Buoyant?", "datatype": "bool" },
+      { "name": "restrict", "label": "Restrict?", "datatype": "bool" },
+      { "name": "combined", "label": "Combined?", "datatype": "bool" },
+      { "name": "a_weight", "label": "A Weight", "datatype": "float" },
+      { "name": "b_weight", "label": "B Weight", "datatype": "float" },
+      { "name": "c_weight", "label": "C Weight", "datatype": "float" },
+      { "name": "d_weight", "label": "D Weight", "datatype": "float" },
+      {
+        "name": "fields",
+        "label": "Fields",
+        "virtual": true,
+        "type": "link",
+        "key": "name",
+        "class": "cmf",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_METABIB_CLASS"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_METABIB_CLASS"] },
+      "delete": { "perms": ["DELETE_METABIB_CLASS"] }
+    }
+  },
+  "cmcts": {
+    "name": "cmcts",
+    "label": "Metabib Class TS Map",
+    "table": "config.metabib_class_ts_map",
+    "pkey": "id",
+    "pkey_sequence": "config.metabib_class_ts_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "Map ID", "datatype": "id" },
+      {
+        "name": "field_class",
+        "label": "Metabib Class",
+        "type": "link",
+        "key": "name",
+        "class": "cmc",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "ts_config",
+        "label": "Text Search Config",
+        "type": "link",
+        "key": "id",
+        "class": "ctcl",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "active", "label": "Active?", "datatype": "bool" },
+      { "name": "index_weight", "label": "Index Weight", "datatype": "text" },
+      { "name": "index_lang", "label": "Index Language", "datatype": "text" },
+      { "name": "search_lang", "label": "Search Language", "datatype": "text" },
+      { "name": "always", "label": "Always Apply?", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_INDEX_NORMALIZER"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_INDEX_NORMALIZER"] },
+      "delete": { "perms": ["ADMIN_INDEX_NORMALIZER"] }
+    }
+  },
+  "cmf": {
+    "name": "cmf",
+    "label": "Metabib Field",
+    "table": "config.metabib_field",
+    "pkey": "id",
+    "pkey_sequence": "config.metabib_field_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "label", "datatype": "id" },
+      {
+        "name": "field_class",
+        "label": "Class",
+        "type": "link",
+        "key": "name",
+        "class": "cmc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "weight", "label": "Weight", "datatype": "int" },
+      { "name": "xpath", "label": "XPath", "datatype": "text" },
+      { "name": "joiner", "label": "Joiner", "datatype": "text" },
+      {
+        "name": "format",
+        "label": "Format",
+        "type": "link",
+        "key": "name",
+        "class": "cxt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "search_field", "label": "Search Field", "datatype": "bool" },
+      { "name": "facet_field", "label": "Facet Field", "datatype": "bool" },
+      { "name": "facet_xpath", "label": "Facet XPath", "datatype": "text" },
+      {
+        "name": "display_field",
+        "label": "Display Field?",
+        "datatype": "bool"
+      },
+      { "name": "display_xpath", "label": "Display XPath", "datatype": "text" },
+      { "name": "browse_field", "label": "Browse Field", "datatype": "bool" },
+      { "name": "browse_xpath", "label": "Browse XPath", "datatype": "text" },
+      {
+        "name": "browse_sort_xpath",
+        "label": "Browse Sort XPath",
+        "datatype": "text"
+      },
+      {
+        "name": "authority_xpath",
+        "label": "Authority XPath",
+        "datatype": "text"
+      },
+      { "name": "restrict", "label": "Restrict?", "datatype": "bool" },
+      {
+        "name": "display_field_map",
+        "label": "Display Field Map",
+        "virtual": true,
+        "type": "link",
+        "key": "field",
+        "class": "cdfm",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "data_sources",
+        "label": "Virtual Field Data Suppliers",
+        "virtual": true,
+        "type": "link",
+        "key": "virtual",
+        "class": "cmfvm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_METABIB_FIELD"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_METABIB_FIELD"] },
+      "delete": { "perms": ["DELETE_METABIB_FIELD"] }
+    }
+  },
+  "cmfinm": {
+    "name": "cmfinm",
+    "label": "Metabib Field to Indexing Normalizer Map",
+    "table": "config.metabib_field_index_norm_map",
+    "pkey": "id",
+    "pkey_sequence": "config.metabib_field_index_norm_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "field",
+        "label": "Metabib Field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "norm",
+        "label": "Normalizer",
+        "type": "link",
+        "key": "id",
+        "class": "cin",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "params",
+        "label": "Parameters (JSON Array)",
+        "datatype": "text"
+      },
+      { "name": "pos", "label": "Order of Application", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_INDEX_NORMALIZER"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_INDEX_NORMALIZER"] },
+      "delete": { "perms": ["ADMIN_INDEX_NORMALIZER"] }
+    }
+  },
+  "cmfpm": {
+    "name": "cmfpm",
+    "label": "MARC21 Fixed Field Map",
+    "table": "config.marc21_ff_pos_map",
+    "pkey": "id",
+    "pkey_sequence": "config.marc21_ff_pos_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "fixed_field", "label": "Fixed Field", "datatype": "text" },
+      { "name": "tag", "label": "Tag", "datatype": "text" },
+      { "name": "rec_type", "label": "Record Type", "datatype": "text" },
+      { "name": "start_pos", "label": "Start Postion", "datatype": "int" },
+      { "name": "length", "label": "Length", "datatype": "int" },
+      { "name": "default_val", "label": "Default Value", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "cmfts": {
+    "name": "cmfts",
+    "label": "Metabib Field TS Map",
+    "table": "config.metabib_field_ts_map",
+    "pkey": "id",
+    "pkey_sequence": "config.metabib_field_ts_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "Map ID", "datatype": "id" },
+      {
+        "name": "metabib_field",
+        "label": "Metabib Field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "ts_config",
+        "label": "Text Search Config",
+        "type": "link",
+        "key": "id",
+        "class": "ctcl",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "active", "label": "Active?", "datatype": "bool" },
+      { "name": "index_weight", "label": "Index Weight", "datatype": "text" },
+      { "name": "index_lang", "label": "Index Language", "datatype": "text" },
+      { "name": "search_lang", "label": "Search Language", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_INDEX_NORMALIZER"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_INDEX_NORMALIZER"] },
+      "delete": { "perms": ["ADMIN_INDEX_NORMALIZER"] }
+    }
+  },
+  "cmfvm": {
+    "name": "cmfvm",
+    "label": "Metabib Field Virtual Map",
+    "table": "config.metabib_field_virtual_map",
+    "pkey": "id",
+    "pkey_sequence": "config.metabib_field_virtual_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "real",
+        "label": "Real",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "virtual",
+        "label": "Virtual",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "weight", "label": "Weight", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_METABIB_FIELD", "ADMIN_METABIB_FIELD"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_METABIB_FIELD", "ADMIN_METABIB_FIELD"] },
+      "delete": { "perms": ["DELETE_METABIB_FIELD", "ADMIN_METABIB_FIELD"] }
+    }
+  },
+  "cmpcsm": {
+    "name": "cmpcsm",
+    "label": "MARC21 Physical Characteristic Subfield Map",
+    "table": "config.marc21_physical_characteristic_subfield_map",
+    "pkey": "id",
+    "pkey_sequence": "config.marc21_physical_characteristic_subfield_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "ptype_key",
+        "label": "Type Key",
+        "type": "link",
+        "key": "id",
+        "class": "cmpctm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "subfield", "label": "Subfield", "datatype": "text" },
+      { "name": "start_pos", "label": "Start Postion", "datatype": "int" },
+      { "name": "length", "label": "Length", "datatype": "int" },
+      { "name": "label", "label": "Label", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "cmpctm": {
+    "name": "cmpctm",
+    "label": "MARC21 Physical Characteristic Type Map",
+    "table": "config.marc21_physical_characteristic_type_map",
+    "pkey": "ptype_key",
+    "fields": [
+      { "name": "ptype_key", "label": "Type Key", "datatype": "id" },
+      { "name": "label", "label": "Label", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "cmpcvm": {
+    "name": "cmpcvm",
+    "label": "MARC21 Physical Characteristic Value Map",
+    "table": "config.marc21_physical_characteristic_value_map",
+    "pkey": "id",
+    "pkey_sequence": "config.marc21_physical_characteristic_value_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "value", "label": "Value", "datatype": "text" },
+      {
+        "name": "ptype_subfield",
+        "label": "Subfield",
+        "type": "link",
+        "key": "id",
+        "class": "cmpcsm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "label", "label": "Label", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "cmrcfld": {
+    "name": "cmrcfld",
+    "label": "MARC Fields",
+    "table": "config.marc_field",
+    "pkey": "id",
+    "pkey_sequence": "config.marc_field_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "marc_format",
+        "label": "MARC Format",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "cmrcfmt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "marc_record_type",
+        "label": "MARC Record Type",
+        "required": true,
+        "datatype": "text"
+      },
+      {
+        "name": "tag",
+        "label": "MARC Tag",
+        "required": true,
+        "datatype": "text"
+      },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "fixed_field", "label": "Fixed Field?", "datatype": "bool" },
+      { "name": "repeatable", "label": "Repeatable?", "datatype": "bool" },
+      { "name": "mandatory", "label": "Mandatory?", "datatype": "bool" },
+      { "name": "hidden", "label": "Hidden?", "datatype": "bool" },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_TAG_TABLE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_TAG_TABLE"] },
+      "delete": { "perms": ["ADMIN_TAG_TABLE"] }
+    }
+  },
+  "cmrcfmt": {
+    "name": "cmrcfmt",
+    "label": "MARC Formats",
+    "table": "config.marc_format",
+    "pkey": "id",
+    "pkey_sequence": "config.marc_format_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      { "name": "code", "label": "Code", "required": true, "datatype": "text" },
+      {
+        "name": "name",
+        "label": "Name",
+        "required": true,
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_TAG_TABLE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_TAG_TABLE"] },
+      "delete": { "perms": ["ADMIN_TAG_TABLE"] }
+    }
+  },
+  "cmrcsubfld": {
+    "name": "cmrcsubfld",
+    "label": "MARC Subfields",
+    "table": "config.marc_subfield",
+    "pkey": "id",
+    "pkey_sequence": "config.marc_subfield_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "marc_format",
+        "label": "MARC Format",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "cmrcfmt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "marc_record_type",
+        "label": "MARC Record Type",
+        "required": true,
+        "datatype": "text"
+      },
+      {
+        "name": "tag",
+        "label": "MARC Tag",
+        "required": true,
+        "datatype": "text"
+      },
+      {
+        "name": "code",
+        "label": "MARC Subfield",
+        "required": true,
+        "datatype": "text"
+      },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "repeatable", "label": "Repeatable?", "datatype": "bool" },
+      { "name": "mandatory", "label": "Mandatory?", "datatype": "bool" },
+      { "name": "hidden", "label": "Hidden?", "datatype": "bool" },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_TAG_TABLE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_TAG_TABLE"] },
+      "delete": { "perms": ["ADMIN_TAG_TABLE"] }
+    }
+  },
+  "cmrtm": {
+    "name": "cmrtm",
+    "label": "MARC21 Record Type Map",
+    "table": "config.marc21_rec_type_map",
+    "pkey": "code",
+    "fields": [
+      { "name": "code", "label": "Code", "datatype": "id" },
+      { "name": "type_val", "label": "Type Value", "datatype": "text" },
+      { "name": "blvl_val", "label": "BLvl Value", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "cmsa": {
+    "name": "cmsa",
+    "label": "Metabib Search Alias",
+    "table": "config.metabib_search_alias",
+    "pkey": "alias",
+    "fields": [
+      { "name": "alias", "label": "Alias (RegExp)", "datatype": "text" },
+      {
+        "name": "field_class",
+        "label": "Class",
+        "type": "link",
+        "key": "name",
+        "class": "cmc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "field",
+        "label": "Field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_METABIB_SEARCH_ALIAS"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_METABIB_SEARCH_ALIAS"] },
+      "delete": { "perms": ["DELETE_METABIB_SEARCH_ALIAS"] }
+    }
+  },
+  "cnal": {
+    "name": "cnal",
+    "label": "Net Access Level",
+    "table": "config.net_access_level",
+    "pkey": "id",
+    "pkey_sequence": "config.net_access_level_id_seq",
+    "fields": [
+      { "name": "id", "selector": "name", "datatype": "id" },
+      { "name": "name", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_NET_ACCESS_LEVEL"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_NET_ACCESS_LEVEL"] },
+      "delete": { "perms": ["DELETE_NET_ACCESS_LEVEL"] }
+    }
+  },
+  "cnct": {
+    "name": "cnct",
+    "label": "Non-cataloged Type",
+    "table": "config.non_cataloged_type",
+    "pkey": "id",
+    "pkey_sequence": "config.non_cataloged_type_id_seq",
+    "fields": [
+      {
+        "name": "circ_duration",
+        "label": "Circulation Duration",
+        "datatype": "interval"
+      },
+      {
+        "name": "id",
+        "label": "Non-cat Type ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      { "name": "in_house", "label": "In House?", "datatype": "bool" },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_NON_CAT_TYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["CREATE_NON_CAT_TYPE"] },
+      "delete": { "perms": ["CREATE_NON_CAT_TYPE"] }
+    }
+  },
+  "combahr": {
+    "name": "combahr",
+    "label": "Combined (Active & Aged) Hold Request",
+    "table": "action.all_hold_request",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "action.hold_request_id_seq",
+    "fields": [
+      {
+        "name": "status",
+        "label": "Status",
+        "virtual": true,
+        "datatype": "text"
+      },
+      {
+        "name": "capture_time",
+        "label": "Capture Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "current_copy",
+        "label": "Currently Targeted Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "email_notify",
+        "label": "Notify by Email?",
+        "datatype": "bool"
+      },
+      {
+        "name": "expire_time",
+        "label": "Hold Expire Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "fulfillment_lib",
+        "label": "Fulfilling Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "fulfillment_staff",
+        "label": "Fulfilling Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "fulfillment_time",
+        "label": "Fulfillment Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "hold_type", "label": "Hold Type", "datatype": "text" },
+      {
+        "name": "holdable_formats",
+        "label": "Holdable Formats (for M-type hold)",
+        "datatype": "text"
+      },
+      { "name": "id", "label": "Hold ID", "datatype": "id" },
+      {
+        "name": "phone_notify",
+        "label": "Notify by Phone?",
+        "datatype": "bool"
+      },
+      { "name": "sms_notify", "label": "Notify by SMS?", "datatype": "bool" },
+      {
+        "name": "pickup_lib",
+        "label": "Pickup Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "prev_check_time",
+        "label": "Last Targeting Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "request_lib",
+        "label": "Requesting Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "request_time",
+        "label": "Request Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "usr_post_code", "label": "Patron ZIP", "datatype": "text" },
+      {
+        "name": "usr_home_ou",
+        "label": "Patron Home Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr_profile",
+        "label": "Patron Profile Group",
+        "type": "link",
+        "key": "id",
+        "class": "pgt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr_birth_year",
+        "label": "Patron Birth Year",
+        "datatype": "int"
+      },
+      { "name": "staff_placed", "label": "Staff Placed?", "datatype": "bool" },
+      {
+        "name": "selection_depth",
+        "label": "Item Selection Depth",
+        "datatype": "text"
+      },
+      {
+        "name": "selection_ou",
+        "label": "Selection Locus",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "target", "label": "Target Object ID", "datatype": "link" },
+      {
+        "name": "cancel_time",
+        "label": "Hold Cancel Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "bib_rec",
+        "label": "Bib Record link",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rhrr",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      { "name": "frozen", "label": "Currently Frozen", "datatype": "bool" },
+      {
+        "name": "thaw_date",
+        "label": "Activation Date",
+        "datatype": "timestamp"
+      },
+      { "name": "shelf_time", "label": "Shelf Time", "datatype": "timestamp" },
+      {
+        "name": "cancel_cause",
+        "label": "Cancelation cause",
+        "type": "link",
+        "key": "id",
+        "class": "ahrcc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_note",
+        "label": "Cancelation note",
+        "datatype": "text"
+      },
+      { "name": "cut_in_line", "label": "Top of Queue", "datatype": "bool" },
+      {
+        "name": "mint_condition",
+        "label": "Is Mint Condition",
+        "datatype": "bool"
+      },
+      {
+        "name": "shelf_expire_time",
+        "label": "Shelf Expire Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "current_shelf_lib",
+        "label": "Current Shelf Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "behind_desk", "label": "Behind Desk", "datatype": "bool" }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_HOLD"] } }
+  },
+  "combcirc": {
+    "name": "combcirc",
+    "label": "Combined Aged and Active Circulations",
+    "table": "action.all_circulation",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "money.billable_xact_id_seq",
+    "fields": [
+      {
+        "name": "checkin_lib",
+        "label": "Check In Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "checkin_staff",
+        "label": "Check In Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "checkin_time",
+        "label": "Check In Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "circ_staff",
+        "label": "Circulating Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "desk_renewal", "label": "Desk Renewal", "datatype": "bool" },
+      { "name": "due_date", "label": "Due Date/Time", "datatype": "timestamp" },
+      {
+        "name": "duration",
+        "label": "Circulation Duration",
+        "datatype": "interval"
+      },
+      {
+        "name": "duration_rule",
+        "label": "Circ Duration Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crcd",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "fine_interval",
+        "label": "Fine Interval",
+        "datatype": "interval"
+      },
+      { "name": "id", "label": "Circ ID", "datatype": "id" },
+      { "name": "max_fine", "label": "Max Fine Amount", "datatype": "money" },
+      {
+        "name": "max_fine_rule",
+        "label": "Max Fine Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "opac_renewal", "label": "OPAC Renewal", "datatype": "bool" },
+      { "name": "phone_renewal", "label": "Phone Renewal", "datatype": "bool" },
+      {
+        "name": "recurring_fine",
+        "label": "Recurring Fine Amount",
+        "datatype": "money"
+      },
+      {
+        "name": "recurring_fine_rule",
+        "label": "Recurring Fine Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crrf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "renewal_remaining",
+        "label": "Remaining Renewals",
+        "datatype": "int"
+      },
+      {
+        "name": "grace_period",
+        "label": "Grace Period",
+        "datatype": "interval"
+      },
+      { "name": "stop_fines", "label": "Fine Stop Reason", "datatype": "text" },
+      {
+        "name": "stop_fines_time",
+        "label": "Fine Stop Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "target_copy",
+        "label": "Circulating Item",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "usr_post_code", "label": "Patron ZIP", "datatype": "text" },
+      {
+        "name": "xact_finish",
+        "label": "Transaction Finish Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact_start",
+        "label": "Checkout Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "create_time",
+        "label": "Record Creation Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "parent_circ",
+        "label": "Parent Circulation",
+        "type": "link",
+        "key": "id",
+        "class": "acirc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "checkin_scan_time",
+        "label": "Checkin Scan Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "checkin_workstation",
+        "label": "Checkin Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr",
+        "label": "Patron",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "billings",
+        "label": "Transaction Billings",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mb",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "payments",
+        "label": "Transaction Payments",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mp",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "billable_transaction",
+        "label": "Base Transaction",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "workstation",
+        "label": "Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_type",
+        "label": "Circulation Type",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rcirct",
+        "reltype": "might_have",
+        "datatype": "text"
+      },
+      {
+        "name": "billing_total",
+        "label": "Billing Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxbt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "payment_total",
+        "label": "Payment Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxpt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "usr_home_ou",
+        "label": "Patron Home Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr_profile",
+        "label": "Patron Profile Group",
+        "type": "link",
+        "key": "id",
+        "class": "pgt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr_birth_year",
+        "label": "Patron Birth Year",
+        "datatype": "int"
+      },
+      {
+        "name": "copy_call_number",
+        "label": "Call Number",
+        "type": "link",
+        "key": "id",
+        "class": "acn",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_location",
+        "label": "Shelving Location",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_owning_lib",
+        "label": "Copy Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_circ_lib",
+        "label": "Copy Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "copy_bib_record",
+        "label": "Bib Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "aaactsc_entries",
+        "label": "Archived Patron Stat-Cat Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "aaactsc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "aaasc_entries",
+        "label": "Archived Copy Stat-Cat Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "aaasc",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "active_circ",
+        "label": "Linked Active Circulation",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "aged_circ",
+        "label": "Linked Aged Circulation",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "acirc",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_CIRCULATIONS"] } }
+  },
+  "coust": {
+    "name": "coust",
+    "label": "Organizational Unit Setting Type",
+    "table": "config.org_unit_setting_type",
+    "pkey": "name",
+    "fields": [
+      {
+        "name": "name",
+        "type": "link",
+        "key": "name",
+        "class": "aous",
+        "reltype": "has_many",
+        "datatype": "text"
+      },
+      { "name": "label", "i18n": true, "datatype": "text" },
+      { "name": "description", "i18n": true, "datatype": "text" },
+      { "name": "datatype", "datatype": "text" },
+      {
+        "name": "view_perm",
+        "type": "link",
+        "key": "id",
+        "class": "ppl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "update_perm",
+        "type": "link",
+        "key": "id",
+        "class": "ppl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "fm_class", "datatype": "text" },
+      {
+        "name": "grp",
+        "type": "link",
+        "key": "name",
+        "class": "csg",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ORG_UNIT_SETTING_TYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_ORG_UNIT_SETTING_TYPE"] },
+      "delete": { "perms": ["ADMIN_ORG_UNIT_SETTING_TYPE"] }
+    }
+  },
+  "coustl": {
+    "name": "coustl",
+    "label": "Organizational Unit Setting Type Log",
+    "table": "config.org_unit_setting_type_log",
+    "pkey": "id",
+    "pkey_sequence": "config.org_unit_setting_type_log_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "date_applied", "datatype": "timestamp" },
+      {
+        "name": "org",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "original_value", "datatype": "text" },
+      { "name": "new_value", "datatype": "text" },
+      {
+        "name": "field_name",
+        "type": "link",
+        "key": "name",
+        "class": "coust",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_ORG_UNIT_SETTING_TYPE"] },
+      "retrieve": { "perms": ["STAFF_LOGIN"] },
+      "update": { "perms": ["ADMIN_ORG_UNIT_SETTING_TYPE_LOG"] },
+      "delete": { "perms": ["ADMIN_ORG_UNIT_SETTING_TYPE_LOG"] }
+    }
+  },
+  "cracct": {
+    "name": "cracct",
+    "label": "Remote (3rd party) Account",
+    "table": "config.remote_account",
+    "pkey": "id",
+    "pkey_sequence": "config.remote_account_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "label", "label": "Label", "datatype": "text" },
+      { "name": "host", "label": "Host", "datatype": "text" },
+      { "name": "username", "label": "Username", "datatype": "text" },
+      { "name": "password", "label": "Password", "datatype": "text" },
+      { "name": "account", "label": "Account", "datatype": "text" },
+      { "name": "path", "label": "Path", "datatype": "text" },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "last_activity",
+        "label": "Last Activity",
+        "datatype": "timestamp"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_CONFIG_REMOTE_ACCOUNT"] },
+      "retrieve": { "perms": ["ADMIN_CONFIG_REMOTE_ACCOUNT"] },
+      "update": { "perms": ["ADMIN_CONFIG_REMOTE_ACCOUNT"] },
+      "delete": { "perms": ["ADMIN_CONFIG_REMOTE_ACCOUNT"] }
+    }
+  },
+  "crad": {
+    "name": "crad",
+    "label": "SVF Record Attribute Defintion",
+    "table": "config.record_attr_definition",
+    "pkey": "name",
+    "fields": [
+      {
+        "name": "name",
+        "label": "Name",
+        "selector": "label",
+        "required": true,
+        "datatype": "id"
+      },
+      {
+        "name": "label",
+        "label": "Label",
+        "required": true,
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "multi", "label": "Multi-valued?", "datatype": "bool" },
+      { "name": "filter", "label": "Filter?", "datatype": "bool" },
+      { "name": "sorter", "label": "Sorter?", "datatype": "bool" },
+      {
+        "name": "composite",
+        "label": "Composite attribute?",
+        "datatype": "bool"
+      },
+      { "name": "tag", "label": "MARC Tag", "datatype": "text" },
+      { "name": "sf_list", "label": "MARC Subfields", "datatype": "text" },
+      { "name": "joiner", "label": "Joiner", "datatype": "text" },
+      { "name": "xpath", "label": "XPath", "datatype": "text" },
+      {
+        "name": "format",
+        "label": "Format",
+        "type": "link",
+        "key": "name",
+        "class": "cxt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "start_pos", "label": "Starting Position", "datatype": "int" },
+      { "name": "string_len", "label": "String Length", "datatype": "int" },
+      { "name": "fixed_field", "label": "Fixed Field", "datatype": "text" },
+      {
+        "name": "phys_char_sf",
+        "label": "Physical Characteristic",
+        "datatype": "text"
+      },
+      { "name": "vocabulary", "label": "Vocabulary URI", "datatype": "text" },
+      {
+        "name": "normalizers",
+        "label": "Normalizers",
+        "virtual": true,
+        "type": "link",
+        "key": "name",
+        "class": "crainm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SVF"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SVF"] },
+      "delete": { "perms": ["ADMIN_SVF"] }
+    }
+  },
+  "crahp": {
+    "name": "crahp",
+    "label": "Age Hold Protection Rule",
+    "table": "config.rule_age_hold_protect",
+    "pkey": "id",
+    "pkey_sequence": "config.rule_age_hold_protect_id_seq",
+    "fields": [
+      { "name": "age", "label": "Item Age", "datatype": "interval" },
+      {
+        "name": "id",
+        "label": "Rule ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      { "name": "name", "label": "Rule Name", "datatype": "text" },
+      { "name": "prox", "label": "Allowed Proximity", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_AGE_PROTECT_RULE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_AGE_PROTECT_RULE"] },
+      "delete": { "perms": ["ADMIN_AGE_PROTECT_RULE"] }
+    }
+  },
+  "crainm": {
+    "name": "crainm",
+    "label": "SVF Record Attribute to Indexing Normalizer Map",
+    "table": "config.record_attr_index_norm_map",
+    "pkey": "id",
+    "pkey_sequence": "config.record_attr_index_norm_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "attr",
+        "label": "SVF Attribute",
+        "type": "link",
+        "key": "name",
+        "class": "crad",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "norm",
+        "label": "Normalizer",
+        "type": "link",
+        "key": "id",
+        "class": "cin",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "params",
+        "label": "Parameters (JSON Array)",
+        "datatype": "text"
+      },
+      { "name": "pos", "label": "Order of Application", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_INDEX_NORMALIZER"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_INDEX_NORMALIZER"] },
+      "delete": { "perms": ["ADMIN_INDEX_NORMALIZER"] }
+    }
+  },
+  "crcd": {
+    "name": "crcd",
+    "label": "Circulation Duration Rule",
+    "table": "config.rule_circ_duration",
+    "pkey": "id",
+    "pkey_sequence": "config.rule_circ_duration_id_seq",
+    "fields": [
+      { "name": "extended", "datatype": "interval" },
+      { "name": "id", "selector": "name", "datatype": "id" },
+      { "name": "max_renewals", "datatype": "int" },
+      { "name": "name", "datatype": "text" },
+      { "name": "normal", "datatype": "interval" },
+      { "name": "shrt", "datatype": "interval" },
+      { "name": "max_auto_renewals", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_CIRC_DURATION"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_CIRC_DURATION"] },
+      "delete": { "perms": ["DELETE_CIRC_DURATION"] }
+    }
+  },
+  "crmf": {
+    "name": "crmf",
+    "label": "Max Fine Rule",
+    "table": "config.rule_max_fine",
+    "pkey": "id",
+    "pkey_sequence": "config.rule_max_fine_id_seq",
+    "fields": [
+      { "name": "amount", "label": "Max Fine Amount", "datatype": "money" },
+      {
+        "name": "id",
+        "label": "Rule ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      { "name": "name", "label": "Rule Name", "datatype": "text" },
+      { "name": "is_percent", "label": "Is Percent", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_MAX_FINE_RULE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_MAX_FINE_RULE"] },
+      "delete": { "perms": ["ADMIN_MAX_FINE_RULE"] }
+    }
+  },
+  "crrf": {
+    "name": "crrf",
+    "label": "Recurring Fine Rule",
+    "table": "config.rule_recurring_fine",
+    "pkey": "id",
+    "pkey_sequence": "config.rule_recurring_fine_id_seq",
+    "fields": [
+      { "name": "high", "datatype": "money" },
+      { "name": "id", "selector": "name", "datatype": "id" },
+      { "name": "low", "datatype": "money" },
+      { "name": "name", "datatype": "text" },
+      { "name": "normal", "datatype": "money" },
+      { "name": "recurrence_interval", "datatype": "interval" },
+      { "name": "grace_period", "datatype": "interval" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_RECURRING_FINE_RULE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_RECURRING_FINE_RULE"] },
+      "delete": { "perms": ["ADMIN_RECURRING_FINE_RULE"] }
+    }
+  },
+  "csc": {
+    "name": "csc",
+    "label": "SMS Carrier",
+    "table": "config.sms_carrier",
+    "pkey": "id",
+    "pkey_sequence": "config.sms_carrier_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "region", "label": "Region", "i18n": true, "datatype": "text" },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      { "name": "active", "label": "Active", "i18n": true, "datatype": "bool" },
+      {
+        "name": "email_gateway",
+        "label": "Email Gateway",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SMS_CARRIER"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SMS_CARRIER"] },
+      "delete": { "perms": ["ADMIN_SMS_CARRIER"] }
+    }
+  },
+  "csg": {
+    "name": "csg",
+    "label": "Settings Group",
+    "table": "config.settings_group",
+    "pkey": "name",
+    "fields": [
+      { "name": "name", "datatype": "text" },
+      { "name": "label", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_USER_SETTING_GROUP"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_USER_SETTING_GROUP"] },
+      "delete": { "perms": ["ADMIN_USER_SETTING_GROUP"] }
+    }
+  },
+  "csp": {
+    "name": "csp",
+    "label": "Standing Penalty",
+    "table": "config.standing_penalty",
+    "pkey": "id",
+    "pkey_sequence": "config.standing_penalty_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Penalty ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" },
+      { "name": "block_list", "label": "Block List", "datatype": "text" },
+      { "name": "staff_alert", "label": "Staff Alert", "datatype": "bool" },
+      { "name": "org_depth", "label": "Org Depth", "datatype": "int" },
+      {
+        "name": "ignore_proximity",
+        "label": "Ignore Proximity",
+        "datatype": "int"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_STANDING_PENALTY"] },
+      "retrieve": {
+        "perms": ["ADMIN_STANDING_PENALTY", "VIEW_STANDING_PENALTY"]
+      },
+      "update": { "perms": ["ADMIN_STANDING_PENALTY"] },
+      "delete": { "perms": ["ADMIN_STANDING_PENALTY"] }
+    }
+  },
+  "cst": {
+    "name": "cst",
+    "label": "Standing Penalty",
+    "table": "config.standing",
+    "pkey": "id",
+    "pkey_sequence": "config.standing_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      { "name": "value", "i18n": true, "datatype": "text" }
+    ]
+  },
+  "ctcl": {
+    "name": "ctcl",
+    "label": "Text Search Configs",
+    "table": "config.ts_config_list",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Text Search Config",
+        "selector": "name",
+        "datatype": "text"
+      },
+      { "name": "name", "label": "Text Search Config Name", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "cuat": {
+    "name": "cuat",
+    "label": "User Activity Type",
+    "table": "config.usr_activity_type",
+    "pkey": "id",
+    "pkey_sequence": "config.usr_activity_type_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "ewho", "label": "Event Caller", "datatype": "text" },
+      { "name": "ewhat", "label": "Event Type", "datatype": "text" },
+      { "name": "ehow", "label": "Event Mechanism", "datatype": "text" },
+      { "name": "label", "label": "Label", "datatype": "text" },
+      { "name": "egroup", "label": "Activity Group", "datatype": "text" },
+      { "name": "enabled", "label": "Enabled", "datatype": "bool" },
+      { "name": "transient", "label": "Transient", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_USER_ACTIVITY_TYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_USER_ACTIVITY_TYPE"] },
+      "delete": { "perms": ["ADMIN_USER_ACTIVITY_TYPE"] }
+    }
+  },
+  "cub": {
+    "name": "cub",
+    "label": "User Bucket",
+    "table": "container.user_bucket",
+    "pkey": "id",
+    "pkey_sequence": "container.user_bucket_id_seq",
+    "fields": [
+      {
+        "name": "items",
+        "virtual": true,
+        "type": "link",
+        "key": "bucket",
+        "class": "cubi",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "btype", "datatype": "text" },
+      { "name": "id", "datatype": "id" },
+      { "name": "name", "datatype": "text" },
+      { "name": "description", "datatype": "text" },
+      {
+        "name": "owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "pub", "datatype": "bool" },
+      { "name": "create_time", "datatype": "timestamp" },
+      {
+        "name": "owning_lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_USER_BUCKET", "ADMIN_USER_BUCKET"] },
+      "retrieve": { "perms": ["CREATE_USER_BUCKET", "ADMIN_USER_BUCKET"] },
+      "update": { "perms": ["CREATE_USER_BUCKET", "ADMIN_USER_BUCKET"] },
+      "delete": { "perms": ["CREATE_USER_BUCKET", "ADMIN_USER_BUCKET"] }
+    }
+  },
+  "cubi": {
+    "name": "cubi",
+    "label": "User Bucket Item",
+    "table": "container.user_bucket_item",
+    "pkey": "id",
+    "pkey_sequence": "container.user_bucket_item_id_seq",
+    "fields": [
+      {
+        "name": "bucket",
+        "type": "link",
+        "key": "id",
+        "class": "cub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "target_user",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "create_time", "datatype": "timestamp" },
+      { "name": "pos", "datatype": "int" },
+      {
+        "name": "notes",
+        "virtual": true,
+        "type": "link",
+        "key": "item",
+        "class": "cubin",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["ADMIN_USER_BUCKET"] } }
+  },
+  "cubin": {
+    "name": "cubin",
+    "label": "User Bucket Item Note",
+    "table": "container.user_bucket_item_note",
+    "pkey": "id",
+    "pkey_sequence": "container.user_bucket_item_note_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "item",
+        "type": "link",
+        "key": "id",
+        "class": "cubi",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "datatype": "text" }
+    ]
+  },
+  "cubn": {
+    "name": "cubn",
+    "label": "User Bucket Note",
+    "table": "container.user_bucket_note",
+    "pkey": "id",
+    "pkey_sequence": "container.user_bucket_note_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "bucket",
+        "type": "link",
+        "key": "id",
+        "class": "cub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "note", "datatype": "text" }
+    ]
+  },
+  "cubt": {
+    "name": "cubt",
+    "label": "User Bucket Type",
+    "table": "container.user_bucket_type",
+    "pkey": "code",
+    "fields": [
+      { "name": "code", "label": "Code", "selector": "name", "datatype": "id" },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_USER_BTYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_USER_BTYPE"] },
+      "delete": { "perms": ["DELETE_USER_BTYPE"] }
+    }
+  },
+  "cust": {
+    "name": "cust",
+    "label": "User Setting Type",
+    "table": "config.usr_setting_type",
+    "pkey": "name",
+    "fields": [
+      {
+        "name": "name",
+        "label": "Name",
+        "type": "link",
+        "key": "name",
+        "class": "aus",
+        "reltype": "has_many",
+        "datatype": "text"
+      },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "datatype", "label": "Datatype", "datatype": "text" },
+      { "name": "fm_class", "label": "Fieldmapper Class", "datatype": "text" },
+      {
+        "name": "grp",
+        "label": "Settings Group",
+        "type": "link",
+        "key": "name",
+        "class": "csg",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "opac_visible",
+        "label": "OPAC/Patron Visible",
+        "datatype": "bool"
+      },
+      {
+        "name": "reg_default",
+        "label": "Registration Default",
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_USER_SETTING_TYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_USER_SETTING_TYPE"] },
+      "delete": { "perms": ["ADMIN_USER_SETTING_TYPE"] }
+    }
+  },
+  "cvrfm": {
+    "name": "cvrfm",
+    "label": "Videorecording Format",
+    "table": "config.videorecording_format_map",
+    "pkey": "code",
+    "fields": [
+      {
+        "name": "code",
+        "label": "Code",
+        "selector": "value",
+        "datatype": "id"
+      },
+      { "name": "value", "label": "Format", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_MARC_CODE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_MARC_CODE"] },
+      "delete": { "perms": ["ADMIN_MARC_CODE"] }
+    }
+  },
+  "cwa": {
+    "name": "cwa",
+    "label": "Matrix Weight Association",
+    "table": "config.weight_assoc",
+    "pkey": "id",
+    "pkey_sequence": "config.weight_assoc_id_seq",
+    "fields": [
+      { "name": "id", "label": "Assoc ID", "datatype": "id" },
+      { "name": "active", "label": "Active?", "datatype": "bool" },
+      {
+        "name": "org_unit",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "circ_weights",
+        "label": "Circ Weights",
+        "type": "link",
+        "key": "id",
+        "class": "ccmw",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "hold_weights",
+        "label": "Hold Weights",
+        "type": "link",
+        "key": "id",
+        "class": "chmw",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": {
+        "perms": [
+          "ADMIN_CIRC_MATRIX_MATCHPOINT",
+          "ADMIN_HOLD_MATRIX_MATCHPOINT"
+        ]
+      },
+      "retrieve": {
+        "perms": [
+          "ADMIN_CIRC_MATRIX_MATCHPOINT",
+          "ADMIN_HOLD_MATRIX_MATCHPOINT",
+          "VIEW_CIRC_MATRIX_MATCHPOINT",
+          "VIEW_HOLD_MATRIX_MATCHPOINT"
+        ]
+      },
+      "update": {
+        "perms": [
+          "ADMIN_CIRC_MATRIX_MATCHPOINT",
+          "ADMIN_HOLD_MATRIX_MATCHPOINT"
+        ]
+      },
+      "delete": {
+        "perms": [
+          "ADMIN_CIRC_MATRIX_MATCHPOINT",
+          "ADMIN_HOLD_MATRIX_MATCHPOINT"
+        ]
+      }
+    }
+  },
+  "cwst": {
+    "name": "cwst",
+    "label": "Workstation Setting Type",
+    "table": "config.workstation_setting_type",
+    "pkey": "name",
+    "fields": [
+      {
+        "name": "name",
+        "type": "link",
+        "key": "name",
+        "class": "aous",
+        "reltype": "has_many",
+        "datatype": "text"
+      },
+      { "name": "label", "i18n": true, "datatype": "text" },
+      { "name": "description", "i18n": true, "datatype": "text" },
+      { "name": "datatype", "datatype": "text" },
+      { "name": "fm_class", "datatype": "text" },
+      {
+        "name": "grp",
+        "type": "link",
+        "key": "name",
+        "class": "csg",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_WORKSTATION_SETTING_TYPE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_WORKSTATION_SETTING_TYPE"] },
+      "delete": { "perms": ["ADMIN_WORKSTATION_SETTING_TYPE"] }
+    }
+  },
+  "cxt": {
+    "name": "cxt",
+    "label": "XML/XSLT Transform Definition",
+    "table": "config.xml_transform",
+    "pkey": "name",
+    "fields": [
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "namespace_uri", "label": "Namespace URI", "datatype": "text" },
+      { "name": "prefix", "label": "Namespace Prefix", "datatype": "text" },
+      { "name": "xslt", "label": "XSLT", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_XML_TRANSFORM"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_XML_TRANSFORM"] },
+      "delete": { "perms": ["DELETE_XML_TRANSFORM"] }
+    }
+  },
+  "cza": {
+    "name": "cza",
+    "label": "Z39.50 Attribute",
+    "table": "config.z3950_attr",
+    "pkey": "id",
+    "pkey_sequence": "config.z3950_attr_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Z39.50 Attribute ID",
+        "selector": "label",
+        "datatype": "id"
+      },
+      {
+        "name": "source",
+        "label": "Z39.50 Source",
+        "type": "link",
+        "key": "name",
+        "class": "czs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" },
+      { "name": "code", "label": "Code", "datatype": "int" },
+      { "name": "format", "label": "Format", "datatype": "int" },
+      { "name": "truncation", "label": "Truncation", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_Z3950_SOURCE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_Z3950_SOURCE"] },
+      "delete": { "perms": ["ADMIN_Z3950_SOURCE"] }
+    }
+  },
+  "czifm": {
+    "name": "czifm",
+    "label": "Z39.50 Index Field Map",
+    "table": "config.z3950_index_field_map",
+    "pkey": "id",
+    "pkey_sequence": "config.z3950_index_field_map_id_seq",
+    "fields": [
+      { "name": "id", "label": "Map ID", "datatype": "id" },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" },
+      {
+        "name": "metabib_field",
+        "label": "Metabib Field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "record_attr",
+        "label": "Record Attribute",
+        "type": "link",
+        "key": "name",
+        "class": "crad",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "z3950_attr",
+        "label": "Z39.50 Attribute",
+        "type": "link",
+        "key": "id",
+        "class": "cza",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "z3950_attr_type",
+        "label": "Z39.50 Attribute Type",
+        "datatype": "text"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_Z3950_SOURCE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_Z3950_SOURCE"] },
+      "delete": { "perms": ["ADMIN_Z3950_SOURCE"] }
+    }
+  },
+  "czs": {
+    "name": "czs",
+    "label": "Z39.50 Source",
+    "table": "config.z3950_source",
+    "pkey": "name",
+    "fields": [
+      { "name": "name", "label": "Z39.50 Source", "datatype": "id" },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" },
+      { "name": "host", "label": "Host", "datatype": "text" },
+      { "name": "port", "label": "Port", "datatype": "int" },
+      { "name": "db", "label": "DB", "datatype": "text" },
+      { "name": "record_format", "label": "Record Format", "datatype": "text" },
+      {
+        "name": "transmission_format",
+        "label": "Transmission Format",
+        "datatype": "text"
+      },
+      { "name": "auth", "label": "Auth", "datatype": "bool" },
+      {
+        "name": "attrs",
+        "label": "Attrs",
+        "virtual": true,
+        "type": "link",
+        "key": "source",
+        "class": "cza",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "use_perm",
+        "label": "Use Permission",
+        "type": "link",
+        "key": "id",
+        "class": "ppl",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_Z3950_SOURCE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_Z3950_SOURCE"] },
+      "delete": { "perms": ["ADMIN_Z3950_SOURCE"] }
+    }
+  },
+  "erccpo": {
+    "name": "erccpo",
+    "label": "Library Holdings Count with Deleted",
+    "table": "extend_reporter.copy_count_per_org",
+    "pkey": "bibid",
+    "fields": [
+      {
+        "name": "bibid",
+        "label": "Bib Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Circulation Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "last_edit_time",
+        "label": "Last Edit Date",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "has_only_deleted_copies",
+        "label": "Has Only Deleted Copies 0/1",
+        "datatype": "int"
+      },
+      {
+        "name": "deleted_count",
+        "label": "Total deleted copies",
+        "datatype": "int"
+      },
+      {
+        "name": "visible_count",
+        "label": "Total visible copies",
+        "datatype": "int"
+      },
+      {
+        "name": "total_count",
+        "label": "Total copies attached",
+        "datatype": "int"
+      }
+    ]
+  },
+  "erfcc": {
+    "name": "erfcc",
+    "label": "Total Circulation Count, Including Legacy",
+    "table": "extend_reporter.full_circ_count",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Copy ID",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "int"
+      },
+      {
+        "name": "circ_count",
+        "label": "Total Circulation Count",
+        "datatype": "int"
+      }
+    ]
+  },
+  "ergbhu": {
+    "name": "ergbhu",
+    "label": "Bib IDs by Holding Add/Delete Time (OCLC batch update)",
+    "table": "extend_reporter.global_bibs_by_holding_update",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Bib ID",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "holding_update",
+        "label": "Update Time",
+        "datatype": "timestamp"
+      },
+      { "name": "update_type", "label": "Update Type", "datatype": "text" }
+    ]
+  },
+  "ex": {
+    "name": "ex",
+    "virtual": true,
+    "fields": [
+      { "name": "err_msg", "virtual": true, "datatype": "text" },
+      { "name": "type", "virtual": true, "datatype": "text" }
+    ]
+  },
+  "fdoc": {
+    "name": "fdoc",
+    "label": "IDL Field Doc",
+    "table": "config.idl_field_doc",
+    "pkey": "id",
+    "pkey_sequence": "config.idl_field_doc_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      { "name": "fm_class", "datatype": "text" },
+      { "name": "field", "datatype": "text" },
+      {
+        "name": "owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "string", "i18n": true, "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_FIELD_DOC"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_FIELD_DOC"] },
+      "delete": { "perms": ["ADMIN_FIELD_DOC"] }
+    }
+  },
+  "hasholdscount": {
+    "name": "hasholdscount",
+    "label": "Copy Has Holds Count",
+    "source": "( SELECT ahcm.target_copy AS id,count(*) AS count FROM action.hold_request ahr, action.hold_copy_map ahcm WHERE ahr.cancel_time IS NULL AND ahr.fulfillment_time IS NULL AND ahr.capture_time IS NULL AND ahr.id = ahcm.hold GROUP BY ahcm.target_copy )",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "label": "Copy ID", "datatype": "id" },
+      { "name": "count", "label": "Holds Count", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "i18n": {
+    "name": "i18n",
+    "label": "i18n Core",
+    "table": "config.i18n_core",
+    "pkey": "id",
+    "pkey_sequence": "config.i18n_core_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      { "name": "fq_field", "datatype": "text" },
+      { "name": "identity_value", "datatype": "text" },
+      {
+        "name": "translation",
+        "type": "link",
+        "key": "code",
+        "class": "i18n_l",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "string", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_TRANSLATION"] },
+      "retrieve": {
+        "perms": [
+          "CREATE_TRANSLATION",
+          "UPDATE_TRANSLATION",
+          "DELETE_TRANSLATION"
+        ]
+      },
+      "update": { "perms": ["UPDATE_TRANSLATION"] },
+      "delete": { "perms": ["DELETE_TRANSLATION"] }
+    }
+  },
+  "i18n_l": {
+    "name": "i18n_l",
+    "label": "Locale",
+    "table": "config.i18n_locale",
+    "pkey": "code",
+    "fields": [
+      { "name": "code", "datatype": "id" },
+      { "name": "marc_code", "datatype": "text" },
+      { "name": "name", "i18n": true, "datatype": "text" },
+      { "name": "description", "i18n": true, "datatype": "text" },
+      { "name": "rtl", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_LOCALE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_LOCALE"] },
+      "delete": { "perms": ["DELETE_LOCALE"] }
+    }
+  },
+  "iatc": {
+    "name": "iatc",
+    "label": "Inter-system Copy Transit",
+    "core": true,
+    "source": "( SELECT t.* FROM action.transit_copy t JOIN actor.org_unit AS s ON (t.source = s.id) JOIN actor.org_unit AS d ON (t.dest = d.id) WHERE s.parent_ou <> d.parent_ou )",
+    "pkey": "id",
+    "pkey_sequence": "action.transit_copy_id_seq",
+    "fields": [
+      {
+        "name": "copy_status",
+        "label": "Pretransit Copy Status",
+        "type": "link",
+        "key": "id",
+        "class": "ccs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "dest",
+        "label": "Destination",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "dest_recv_time",
+        "label": "Receive Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "id", "label": "Transit ID", "datatype": "id" },
+      {
+        "name": "persistant_transfer",
+        "label": "Is Persistent? (unused)",
+        "datatype": "bool"
+      },
+      {
+        "name": "prev_hop",
+        "label": "Previous Hop (unused)",
+        "type": "link",
+        "key": "id",
+        "class": "atc",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "source",
+        "label": "Source",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "source_send_time",
+        "label": "Send Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "target_copy",
+        "label": "Transited Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "hold_transit_copy",
+        "label": "Hold Transit",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "ahtc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_time",
+        "label": "Cancel Date/Time",
+        "datatype": "timestamp"
+      }
+    ]
+  },
+  "jub": {
+    "name": "jub",
+    "label": "Line Item",
+    "table": "acq.lineitem",
+    "pkey": "id",
+    "pkey_sequence": "acq.lineitem_id_seq",
+    "fields": [
+      { "name": "id", "label": "Lineitem ID", "datatype": "id" },
+      {
+        "name": "selector",
+        "label": "Selecting User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "picklist",
+        "label": "Selection List",
+        "type": "link",
+        "key": "id",
+        "class": "acqpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "purchase_order",
+        "label": "Purchase Order",
+        "type": "link",
+        "key": "id",
+        "class": "acqpo",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "provider",
+        "label": "Provider",
+        "type": "link",
+        "key": "id",
+        "class": "acqpro",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_time",
+        "label": "Creation Time",
+        "datatype": "timestamp"
+      },
+      { "name": "edit_time", "label": "Edit Time", "datatype": "timestamp" },
+      { "name": "marc", "label": "MARC", "datatype": "text" },
+      {
+        "name": "eg_bib_id",
+        "label": "Evergreen Bib ID",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "source_label", "label": "Source Label", "datatype": "text" },
+      {
+        "name": "expected_recv_time",
+        "label": "Expected Receive Date",
+        "datatype": "timestamp"
+      },
+      { "name": "state", "label": "State", "datatype": "text" },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "editor",
+        "label": "Editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "claim_policy",
+        "label": "Claim Policy",
+        "type": "link",
+        "key": "id",
+        "class": "acqclp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cancel_reason",
+        "label": "Cancel Reason",
+        "type": "link",
+        "key": "id",
+        "class": "acqcr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "estimated_unit_price",
+        "label": "Estimated Unit Price",
+        "datatype": "money"
+      },
+      {
+        "name": "queued_record",
+        "label": "Queued Vandelay Record",
+        "type": "link",
+        "key": "id",
+        "class": "vqbr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "item_count",
+        "label": "Item Count",
+        "virtual": true,
+        "datatype": "int"
+      },
+      {
+        "name": "attributes",
+        "label": "Descriptive Attributes",
+        "virtual": true,
+        "type": "link",
+        "key": "lineitem",
+        "class": "acqlia",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "lineitem_details",
+        "label": "Line Item Details",
+        "virtual": true,
+        "type": "link",
+        "key": "lineitem",
+        "class": "acqlid",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "lineitem_notes",
+        "label": "Line Item Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "lineitem",
+        "class": "acqlin",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "distribution_formulas",
+        "label": "Distribution Formulas",
+        "virtual": true,
+        "type": "link",
+        "key": "lineitem",
+        "class": "acqdfa",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "invoice_entries",
+        "label": "Invoice Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "lineitem",
+        "class": "acqie",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "order_summary",
+        "label": "Order Summary",
+        "virtual": true,
+        "type": "link",
+        "key": "lineitem",
+        "class": "acqlisum",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "retrieve": {
+        "perms": [
+          "CREATE_PURCHASE_ORDER",
+          "VIEW_PURCHASE_ORDER",
+          "CREATE_PICKLIST",
+          "VIEW_PICKLIST"
+        ]
+      }
+    }
+  },
+  "lasso": {
+    "name": "lasso",
+    "label": "Org Lasso",
+    "table": "actor.org_lasso",
+    "pkey": "id",
+    "pkey_sequence": "actor.org_lasso_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      { "name": "name", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_LASSO"] },
+      "retrieve": { "perms": ["CREATE_LASSO", "UPDATE_LASSO", "DELETE_LASSO"] },
+      "update": { "perms": ["UPDATE_LASSO"] },
+      "delete": { "perms": ["DELETE_LASSO"] }
+    }
+  },
+  "lmap": {
+    "name": "lmap",
+    "label": "Org Lasso Map",
+    "table": "actor.org_lasso_map",
+    "pkey": "id",
+    "pkey_sequence": "actor.org_lasso_map_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "lasso",
+        "type": "link",
+        "key": "id",
+        "class": "lasso",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "org_unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_LASSO_MAP"] },
+      "retrieve": {
+        "perms": ["CREATE_LASSO_MAP", "UPDATE_LASSO_MAP", "DELETE_LASSO_MAP"]
+      },
+      "update": { "perms": ["UPDATE_LASSO_MAP"] },
+      "delete": { "perms": ["DELETE_LASSO_MAP"] }
+    }
+  },
+  "maa": {
+    "name": "maa",
+    "label": "Account Adjustment",
+    "table": "money.account_adjustment",
+    "pkey": "id",
+    "pkey_sequence": "money.payment_id_seq",
+    "fields": [
+      {
+        "name": "accepting_usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "datatype": "money" },
+      { "name": "amount_collected", "datatype": "money" },
+      { "name": "id", "datatype": "id" },
+      { "name": "note", "datatype": "text" },
+      { "name": "payment_ts", "datatype": "timestamp" },
+      {
+        "name": "xact",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "billing",
+        "type": "link",
+        "key": "id",
+        "class": "mb",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      { "name": "payment_type", "virtual": true, "datatype": "text" },
+      {
+        "name": "payment",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mp",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ]
+  },
+  "mafe": {
+    "name": "mafe",
+    "label": "Author Field Entry",
+    "table": "metabib.author_field_entry",
+    "pkey": "id",
+    "pkey_sequence": "metabib.author_field_entry_id_seq",
+    "fields": [
+      {
+        "name": "field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ]
+  },
+  "mb": {
+    "name": "mb",
+    "label": "Billing Line Item",
+    "table": "money.billing",
+    "pkey": "id",
+    "pkey_sequence": "money.billing_id_seq",
+    "fields": [
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      {
+        "name": "create_date",
+        "label": "Create Date",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "period_start",
+        "label": "Billing Period Start",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "period_end",
+        "label": "Billing Period End",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "billing_ts",
+        "label": "Legacy Billing Timestamp",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "billing_type",
+        "label": "Legacy Billing Type",
+        "datatype": "text"
+      },
+      { "name": "id", "label": "Billing ID", "datatype": "id" },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "void_time",
+        "label": "Void Timestamp",
+        "datatype": "timestamp"
+      },
+      { "name": "voided", "label": "Voided?", "datatype": "bool" },
+      {
+        "name": "voider",
+        "label": "Voiding Staff Member",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "xact",
+        "label": "Transaction",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "btype",
+        "label": "Type",
+        "type": "link",
+        "key": "id",
+        "class": "cbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "adjustments",
+        "label": "Adjustments",
+        "virtual": true,
+        "type": "link",
+        "key": "billing",
+        "class": "maa",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mbe": {
+    "name": "mbe",
+    "label": "Combined Browse Entry",
+    "table": "metabib.browse_entry",
+    "pkey": "id",
+    "pkey_sequence": "metabib.browse_entry_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      { "name": "value", "datatype": "text" },
+      {
+        "name": "def_maps",
+        "virtual": true,
+        "type": "link",
+        "key": "entry",
+        "class": "mbedm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ]
+  },
+  "mbedm": {
+    "name": "mbedm",
+    "label": "Combined Browse Entry Definition Map",
+    "table": "metabib.browse_entry_def_map",
+    "pkey": "id",
+    "pkey_sequence": "metabib.browse_entry_def_map_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "entry",
+        "type": "link",
+        "key": "id",
+        "class": "mbe",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "def",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "mbeshm": {
+    "name": "mbeshm",
+    "label": "Combined Browse Entry Simple Authority Heading Map",
+    "table": "metabib.browse_entry_simple_heading_map",
+    "pkey": "id",
+    "pkey_sequence": "metabib.browse_entry_simple_heading_map_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "entry",
+        "type": "link",
+        "key": "id",
+        "class": "mbe",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "simple_heading",
+        "type": "link",
+        "key": "id",
+        "class": "ash",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "mbp": {
+    "name": "mbp",
+    "label": "Payments: Brick-and-mortar",
+    "table": "money.bnm_payment_view",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      { "name": "id", "label": "Payment ID", "datatype": "id" },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "payment_ts",
+        "label": "Payment Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "payment_type", "label": "Payment Type", "datatype": "text" },
+      {
+        "name": "xact",
+        "label": "Billable Transaction",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "accepting_usr",
+        "label": "Accepting User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "voided", "label": "Voided?", "datatype": "bool" },
+      {
+        "name": "cash_payment",
+        "label": "Cash Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mcp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "credit_card_payment",
+        "label": "Credit Card Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mccp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "credit_payment",
+        "label": "Credit Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mcrp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "check_payment",
+        "label": "Check Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mckp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "work_payment",
+        "label": "Work Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mwp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "forgive_payment",
+        "label": "Forgive Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mfp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "goods_payment",
+        "label": "Goods Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mgp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "account_adjustment",
+        "label": "Account Adjustment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "maa",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mbt": {
+    "name": "mbt",
+    "label": "Billable Transaction",
+    "table": "money.billable_xact",
+    "pkey": "id",
+    "pkey_sequence": "money.billable_xact_id_seq",
+    "fields": [
+      { "name": "id", "label": "Transaction ID", "datatype": "id" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "xact_finish",
+        "label": "Transaction Finish Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact_start",
+        "label": "Transaction Start Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "unrecovered",
+        "label": "Unrecovered Debt",
+        "datatype": "bool"
+      },
+      {
+        "name": "grocery",
+        "label": "Grocery Billing link",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mg",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "circulation",
+        "label": "Circulation Billing link",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "billings",
+        "label": "Billing Line Items",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mb",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "payments",
+        "label": "Payment Line Items",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mp",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "billing_total",
+        "label": "Billing Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxbt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "payment_total",
+        "label": "Payment Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxpt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "summary",
+        "label": "Payment Summary",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mbts",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mbts": {
+    "name": "mbts",
+    "label": "Billable Transaction Summary",
+    "table": "money.materialized_billable_xact_summary",
+    "pkey": "id",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "balance_owed", "label": "Balance Owed", "datatype": "money" },
+      { "name": "id", "label": "Transaction ID", "datatype": "id" },
+      {
+        "name": "last_billing_note",
+        "label": "Last Billing Note",
+        "datatype": "text"
+      },
+      {
+        "name": "last_billing_ts",
+        "label": "Last Billing Timestamp",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "last_billing_type",
+        "label": "Last Billing Type",
+        "datatype": "text"
+      },
+      {
+        "name": "last_payment_note",
+        "label": "Last Payment Note",
+        "datatype": "text"
+      },
+      {
+        "name": "last_payment_ts",
+        "label": "Last Payment Timestamp",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "last_payment_type",
+        "label": "Last Payment Type",
+        "datatype": "text"
+      },
+      { "name": "total_owed", "label": "Total Owed", "datatype": "money" },
+      { "name": "total_paid", "label": "Total Paid", "datatype": "money" },
+      {
+        "name": "usr",
+        "label": "Billed User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "xact_finish",
+        "label": "Transaction Finish Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact_start",
+        "label": "Transaction Start Time",
+        "datatype": "timestamp"
+      },
+      { "name": "xact_type", "label": "Transaction Type", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mbtslv": {
+    "name": "mbtslv",
+    "label": "Billable Transaction Summary with Billing Location",
+    "table": "money.billable_xact_summary_location_view",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "balance_owed", "label": "Balance Owed", "datatype": "money" },
+      { "name": "id", "label": "Transaction ID", "datatype": "id" },
+      {
+        "name": "last_billing_note",
+        "label": "Last Billing Note",
+        "datatype": "text"
+      },
+      {
+        "name": "last_billing_ts",
+        "label": "Last Billing Timestamp",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "last_billing_type",
+        "label": "Last Billing Type",
+        "datatype": "text"
+      },
+      {
+        "name": "last_payment_note",
+        "label": "Last Payment Note",
+        "datatype": "text"
+      },
+      {
+        "name": "last_payment_ts",
+        "label": "Last Payment Timestamp",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "last_payment_type",
+        "label": "Last Payment Type",
+        "datatype": "text"
+      },
+      { "name": "total_owed", "label": "Total Owed", "datatype": "money" },
+      { "name": "total_paid", "label": "Total Paid", "datatype": "money" },
+      {
+        "name": "usr",
+        "label": "Billed User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "xact_finish",
+        "label": "Transaction Finish Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact_start",
+        "label": "Transaction Start Time",
+        "datatype": "timestamp"
+      },
+      { "name": "xact_type", "label": "Transaction Type", "datatype": "text" },
+      {
+        "name": "billing_location",
+        "label": "Billing Location",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "mccp": {
+    "name": "mccp",
+    "label": "Credit Card Payment",
+    "table": "money.credit_card_payment",
+    "pkey": "id",
+    "pkey_sequence": "money.payment_id_seq",
+    "fields": [
+      {
+        "name": "accepting_usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "amount", "datatype": "money" },
+      { "name": "amount_collected", "datatype": "money" },
+      { "name": "approval_code", "datatype": "text" },
+      {
+        "name": "cash_drawer",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "cc_number", "datatype": "text" },
+      { "name": "cc_order_number", "datatype": "text" },
+      { "name": "cc_processor", "datatype": "text" },
+      { "name": "id", "datatype": "id" },
+      { "name": "note", "datatype": "text" },
+      { "name": "payment_ts", "datatype": "timestamp" },
+      {
+        "name": "xact",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "payment_type", "virtual": true, "datatype": "text" },
+      {
+        "name": "payment",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mp",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mcde": {
+    "name": "mcde",
+    "label": "Compressed Display Entry",
+    "table": "metabib.compressed_display_entry",
+    "fields": [
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "name",
+        "type": "link",
+        "key": "name",
+        "class": "cdfm",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "multi", "datatype": "bool" },
+      { "name": "label", "datatype": "text" },
+      {
+        "name": "field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "mckp": {
+    "name": "mckp",
+    "label": "Check Payment",
+    "table": "money.check_payment",
+    "pkey": "id",
+    "pkey_sequence": "money.payment_id_seq",
+    "fields": [
+      {
+        "name": "accepting_usr",
+        "label": "Accepting Staff Member",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      {
+        "name": "amount_collected",
+        "label": "Amount Collected",
+        "datatype": "money"
+      },
+      {
+        "name": "cash_drawer",
+        "label": "Workstation link",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "check_number", "label": "Check Number", "datatype": "int" },
+      { "name": "id", "label": "Payment ID", "datatype": "id" },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "payment_ts",
+        "label": "Payment Timestamp",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact",
+        "label": "Transaction link",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "payment",
+        "label": "Payment link",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "payment_type",
+        "label": "Payment Type",
+        "virtual": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mcp": {
+    "name": "mcp",
+    "label": "Cash Payment",
+    "table": "money.cash_payment",
+    "pkey": "id",
+    "pkey_sequence": "money.payment_id_seq",
+    "fields": [
+      {
+        "name": "accepting_usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "datatype": "money" },
+      { "name": "amount_collected", "datatype": "money" },
+      {
+        "name": "cash_drawer",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      { "name": "note", "datatype": "text" },
+      { "name": "payment_ts", "datatype": "timestamp" },
+      {
+        "name": "xact",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "payment_type", "virtual": true, "datatype": "text" },
+      {
+        "name": "payment",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mp",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mcrp": {
+    "name": "mcrp",
+    "label": "House Credit Payment",
+    "table": "money.credit_payment",
+    "pkey": "id",
+    "pkey_sequence": "money.payment_id_seq",
+    "fields": [
+      {
+        "name": "accepting_usr",
+        "label": "Accepting Staff Member",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      {
+        "name": "amount_collected",
+        "label": "Amount Collected",
+        "datatype": "money"
+      },
+      { "name": "id", "label": "Pyament ID", "datatype": "id" },
+      { "name": "note", "label": "Payment Note", "datatype": "text" },
+      {
+        "name": "payment_ts",
+        "label": "Payment Timestamp",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact",
+        "label": "Transaction",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "payment_type",
+        "label": "Payment Type",
+        "virtual": true,
+        "datatype": "text"
+      },
+      {
+        "name": "payment",
+        "label": "Payment link",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mp",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mct": {
+    "name": "mct",
+    "label": "Collections Tracker",
+    "table": "money.collections_tracker",
+    "pkey": "id",
+    "pkey_sequence": "money.collections_tracker_id_seq",
+    "fields": [
+      {
+        "name": "collector",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "enter_time", "datatype": "timestamp" },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "location",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["money.collections_tracker.create"] },
+      "retrieve": { "perms": ["money.collections_tracker.create"] },
+      "delete": { "perms": ["money.collections_tracker.create"] }
+    }
+  },
+  "mde": {
+    "name": "mde",
+    "label": "Display Field Entry",
+    "table": "metabib.display_entry",
+    "pkey": "id",
+    "pkey_sequence": "metabib.display_entry_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" },
+      { "name": "highlight", "virtual": true, "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "mdp": {
+    "name": "mdp",
+    "label": "Payments: Desk",
+    "table": "money.desk_payment_view",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      { "name": "id", "label": "Payment ID", "datatype": "id" },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "payment_ts",
+        "label": "Payment Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "payment_type", "label": "Payment Type", "datatype": "text" },
+      {
+        "name": "xact",
+        "label": "Billable Transaction",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "accepting_usr",
+        "label": "Accepting User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cash_drawer",
+        "label": "Cash Drawer",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "voided", "label": "Voided?", "datatype": "bool" },
+      {
+        "name": "cash_payment",
+        "label": "Cash Payment",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mcp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "credit_card_payment",
+        "label": "Credit Card Payment",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mccp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "check_payment",
+        "label": "Check Payment",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mckp",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ]
+  },
+  "mfae": {
+    "name": "mfae",
+    "label": "Combined Facet Entry",
+    "table": "metabib.facet_entry",
+    "pkey": "id",
+    "pkey_sequence": "metabib.facet_entry_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ]
+  },
+  "mfde": {
+    "name": "mfde",
+    "label": "Flat Display Entry",
+    "table": "metabib.flat_display_entry",
+    "fields": [
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "name",
+        "type": "link",
+        "key": "name",
+        "class": "cdfm",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "multi", "datatype": "bool" },
+      { "name": "label", "datatype": "text" },
+      {
+        "name": "field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "mfe": {
+    "name": "mfe",
+    "label": "Combined Field Entry View",
+    "source": "( SELECT * FROM metabib.author_field_entry UNION ALL SELECT * FROM metabib.keyword_field_entry UNION ALL SELECT * FROM metabib.identifier_field_entry UNION ALL SELECT * FROM metabib.title_field_entry UNION ALL SELECT * FROM metabib.subject_field_entry UNION ALL SELECT * FROM metabib.series_field_entry )",
+    "fields": [
+      {
+        "name": "field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ]
+  },
+  "mfp": {
+    "name": "mfp",
+    "label": "Forgive Payment",
+    "table": "money.forgive_payment",
+    "pkey": "id",
+    "pkey_sequence": "money.payment_id_seq",
+    "fields": [
+      {
+        "name": "accepting_usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "datatype": "money" },
+      { "name": "amount_collected", "datatype": "money" },
+      { "name": "id", "datatype": "id" },
+      { "name": "note", "datatype": "text" },
+      { "name": "payment_ts", "datatype": "timestamp" },
+      {
+        "name": "xact",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "payment_type", "virtual": true, "datatype": "text" },
+      {
+        "name": "payment",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mp",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mfr": {
+    "name": "mfr",
+    "label": "Flattened MARC Fields",
+    "table": "metabib.full_rec",
+    "pkey": "id",
+    "pkey_sequence": "metabib.full_rec_id_seq",
+    "fields": [
+      { "name": "id", "label": "Field ID", "datatype": "id" },
+      { "name": "ind1", "label": "Indicator 1", "datatype": "text" },
+      { "name": "ind2", "label": "Indicator 2", "datatype": "text" },
+      {
+        "name": "record",
+        "label": "Bib Record Entry",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "subfield", "label": "Subfield", "datatype": "text" },
+      { "name": "tag", "label": "Tag", "datatype": "text" },
+      { "name": "value", "label": "Normalized Value", "datatype": "text" }
+    ]
+  },
+  "mg": {
+    "name": "mg",
+    "label": "Grocery Transaction",
+    "table": "money.grocery",
+    "pkey": "id",
+    "pkey_sequence": "money.billable_xact_id_seq",
+    "fields": [
+      {
+        "name": "billing_location",
+        "label": "Billing Location",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "Transaction ID", "datatype": "id" },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "xact_finish",
+        "label": "Transaction Finish Timestamp",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact_start",
+        "label": "Transaction Start Timestamp",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "billings",
+        "label": "Billings",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mb",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "payments",
+        "label": "Payments",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mp",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "billable_transaction",
+        "label": "Billable Transaction link",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "billing_total",
+        "label": "Billing Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxbt",
+        "reltype": "might_have",
+        "datatype": "money"
+      },
+      {
+        "name": "payment_total",
+        "label": "Payment Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxpt",
+        "reltype": "might_have",
+        "datatype": "money"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mgp": {
+    "name": "mgp",
+    "label": "Goods Payment",
+    "table": "money.goods_payment",
+    "pkey": "id",
+    "pkey_sequence": "money.payment_id_seq",
+    "fields": [
+      {
+        "name": "accepting_usr",
+        "label": "Accepting Staff Member",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      {
+        "name": "amount_collected",
+        "label": "Amount Collected",
+        "datatype": "money"
+      },
+      { "name": "id", "label": "Payment ID", "datatype": "id" },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "payment_ts",
+        "label": "Payment Timestamp",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact",
+        "label": "Transaction ID",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "payment",
+        "label": "Payment link",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "payment_type",
+        "label": "Payment Type",
+        "virtual": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mife": {
+    "name": "mife",
+    "label": "Identifier Field Entry",
+    "table": "metabib.identifier_field_entry",
+    "pkey": "id",
+    "pkey_sequence": "metabib.identifier_field_entry_id_seq",
+    "fields": [
+      {
+        "name": "field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ]
+  },
+  "mkfe": {
+    "name": "mkfe",
+    "label": "Keyword Field Entry",
+    "table": "metabib.keyword_field_entry",
+    "pkey": "id",
+    "pkey_sequence": "metabib.keyword_field_entry_id_seq",
+    "fields": [
+      {
+        "name": "field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ]
+  },
+  "mmr": {
+    "name": "mmr",
+    "label": "Metarecord",
+    "table": "metabib.metarecord",
+    "pkey": "id",
+    "pkey_sequence": "metabib.metarecord_id_seq",
+    "fields": [
+      { "name": "fingerprint", "datatype": "text" },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "master_record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "mods", "datatype": "text" },
+      {
+        "name": "source_records",
+        "virtual": true,
+        "type": "link",
+        "key": "metarecord",
+        "class": "mmrsm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ]
+  },
+  "mmrsm": {
+    "name": "mmrsm",
+    "label": "Metarecord Source Map",
+    "table": "metabib.metarecord_source_map",
+    "pkey": "id",
+    "pkey_sequence": "metabib.metarecord_source_map_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "metarecord",
+        "type": "link",
+        "key": "id",
+        "class": "mmr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "mndp": {
+    "name": "mndp",
+    "label": "Payments: Non-drawer Staff",
+    "table": "money.non_drawer_payment_view",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      { "name": "id", "label": "Payment ID", "datatype": "id" },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "payment_ts",
+        "label": "Payment Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "payment_type", "label": "Payment Type", "datatype": "text" },
+      {
+        "name": "xact",
+        "label": "Billable Transaction",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "voided", "label": "Voided?", "datatype": "bool" },
+      {
+        "name": "work_payment",
+        "label": "Work Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mwp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "forgive_payment",
+        "label": "Forgive Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mfp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "goods_payment",
+        "label": "Goods Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mgp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "credit_payment",
+        "label": "Credit Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mcrp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "account_adjustment",
+        "label": "Account Adjustment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "maa",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ]
+  },
+  "mobts": {
+    "name": "mobts",
+    "label": "Open Billable Transaction Summary",
+    "table": "money.open_billable_xact_summary",
+    "pkey": "id",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "balance_owed", "datatype": "money" },
+      { "name": "id", "datatype": "id" },
+      { "name": "last_billing_note", "datatype": "text" },
+      { "name": "last_billing_ts", "datatype": "timestamp" },
+      { "name": "last_billing_type", "datatype": "text" },
+      { "name": "last_payment_note", "datatype": "text" },
+      { "name": "last_payment_ts", "datatype": "timestamp" },
+      { "name": "last_payment_type", "datatype": "text" },
+      { "name": "total_owed", "datatype": "money" },
+      { "name": "total_paid", "datatype": "money" },
+      {
+        "name": "usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "xact_finish", "datatype": "timestamp" },
+      { "name": "xact_start", "datatype": "timestamp" },
+      { "name": "xact_type", "datatype": "text" },
+      {
+        "name": "xact",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "grocery",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mg",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "circulation",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "reservation",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "bresv",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "billing_location",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "moucs": {
+    "name": "moucs",
+    "label": "Open User Circulation Summary",
+    "table": "money.open_usr_circulation_summary",
+    "pkey": "usr",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "balance_owed", "datatype": "money" },
+      { "name": "total_owed", "datatype": "money" },
+      { "name": "total_paid", "datatype": "money" },
+      {
+        "name": "usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "mous": {
+    "name": "mous",
+    "label": "Open User Summary",
+    "table": "money.open_usr_summary",
+    "pkey": "usr",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "balance_owed", "datatype": "money" },
+      { "name": "total_owed", "datatype": "money" },
+      { "name": "total_paid", "datatype": "money" },
+      {
+        "name": "usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER"] } }
+  },
+  "mp": {
+    "name": "mp",
+    "label": "Payments: All",
+    "table": "money.payment_view",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      { "name": "id", "label": "Payment ID", "datatype": "id" },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "payment_ts",
+        "label": "Payment Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "payment_type", "label": "Payment Type", "datatype": "text" },
+      {
+        "name": "xact",
+        "label": "Billable Transaction",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "voided", "label": "Voided?", "datatype": "bool" },
+      {
+        "name": "cash_payment",
+        "label": "Cash Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mcp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "credit_card_payment",
+        "label": "Credit Card Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mccp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "credit_payment",
+        "label": "Credit Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mcrp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "check_payment",
+        "label": "Check Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mckp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "work_payment",
+        "label": "Work Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mwp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "forgive_payment",
+        "label": "Forgive Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mfp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "goods_payment",
+        "label": "Goods Payment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mgp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "account_adjustment",
+        "label": "Account Adjustment Detail",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "maa",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mra": {
+    "name": "mra",
+    "label": "SVF Record Attribute",
+    "table": "metabib.record_attr",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Record ID",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "attrs",
+        "label": "Attributes",
+        "required": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "mraf": {
+    "name": "mraf",
+    "label": "MVF Record Attribute Flat List",
+    "table": "metabib.record_attr_flat",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Record ID",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "attr",
+        "label": "Attribute",
+        "required": true,
+        "datatype": "text"
+      },
+      {
+        "name": "value",
+        "label": "Value",
+        "required": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "mravl": {
+    "name": "mravl",
+    "label": "MVF Record Attribute Vectors",
+    "table": "metabib.record_attr_vector_list",
+    "pkey": "source",
+    "fields": [
+      {
+        "name": "source",
+        "label": "Record ID",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "vlist",
+        "label": "Vector",
+        "required": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "mrd": {
+    "name": "mrd",
+    "label": "Basic Record Descriptor",
+    "table": "metabib.rec_descriptor",
+    "pkey": "id",
+    "pkey_sequence": "metabib.rec_descriptor_id_seq",
+    "fields": [
+      {
+        "name": "audience",
+        "label": "Audn",
+        "type": "link",
+        "key": "code",
+        "class": "cam",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "bib_level",
+        "label": "BLvl",
+        "type": "link",
+        "key": "code",
+        "class": "cblvl",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "cat_form", "label": "Cat Form", "datatype": "text" },
+      {
+        "name": "char_encoding",
+        "label": "Character Encoding",
+        "datatype": "text"
+      },
+      { "name": "control_type", "label": "Ctrl", "datatype": "text" },
+      { "name": "enc_level", "label": "ELvl", "datatype": "text" },
+      { "name": "id", "label": "Descriptor ID", "datatype": "id" },
+      {
+        "name": "item_form",
+        "label": "Form",
+        "type": "link",
+        "key": "code",
+        "class": "cifm",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "item_lang",
+        "label": "Lang",
+        "type": "link",
+        "key": "code",
+        "class": "clm",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "item_type",
+        "label": "Type",
+        "type": "link",
+        "key": "code",
+        "class": "citm",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "lit_form",
+        "label": "LitF",
+        "type": "link",
+        "key": "code",
+        "class": "clfm",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "pub_status", "label": "Pub Status", "datatype": "text" },
+      {
+        "name": "record",
+        "label": "Bib Record Entry",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "type_mat", "label": "TMat", "datatype": "text" },
+      {
+        "name": "vr_format",
+        "label": "Video Recording Format",
+        "datatype": "text"
+      },
+      { "name": "date1", "label": "Date1", "datatype": "text" },
+      { "name": "date2", "label": "Date2", "datatype": "text" }
+    ]
+  },
+  "mrs": {
+    "name": "mrs",
+    "label": "Record Sort Values",
+    "table": "metabib.record_sorter",
+    "pkey": "id",
+    "pkey_sequence": "metabib.record_sorter_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "required": true, "datatype": "id" },
+      {
+        "name": "source",
+        "label": "Bib Record ID",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "int"
+      },
+      {
+        "name": "attr",
+        "label": "Attribute",
+        "required": true,
+        "type": "link",
+        "key": "name",
+        "class": "crad",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "value",
+        "label": "Value",
+        "required": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "msefe": {
+    "name": "msefe",
+    "label": "Series Field Entry",
+    "table": "metabib.series_field_entry",
+    "pkey": "id",
+    "pkey_sequence": "metabib.series_field_entry_id_seq",
+    "fields": [
+      {
+        "name": "field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ]
+  },
+  "msfe": {
+    "name": "msfe",
+    "label": "Subject Field Entry",
+    "table": "metabib.subject_field_entry",
+    "pkey": "id",
+    "pkey_sequence": "metabib.subject_field_entry_id_seq",
+    "fields": [
+      {
+        "name": "field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ]
+  },
+  "mtfe": {
+    "name": "mtfe",
+    "label": "Title Field Entry",
+    "table": "metabib.title_field_entry",
+    "pkey": "id",
+    "pkey_sequence": "metabib.title_field_entry_id_seq",
+    "fields": [
+      {
+        "name": "field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "source",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "datatype": "text" }
+    ]
+  },
+  "mucs": {
+    "name": "mucs",
+    "label": "User Circulation Summary",
+    "table": "money.usr_circulation_summary",
+    "pkey": "usr",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "balance_owed", "datatype": "money" },
+      { "name": "total_owed", "datatype": "money" },
+      { "name": "total_paid", "datatype": "money" },
+      {
+        "name": "usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "mups": {
+    "name": "mups",
+    "label": "User Payment Summary",
+    "virtual": true,
+    "fields": [
+      {
+        "name": "usr",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "forgive_payment", "virtual": true, "datatype": "text" },
+      { "name": "work_payment", "virtual": true, "datatype": "text" },
+      { "name": "credit_payment", "virtual": true, "datatype": "text" },
+      { "name": "goods_payment", "virtual": true, "datatype": "text" },
+      { "name": "account_adjustment", "virtual": true, "datatype": "text" }
+    ]
+  },
+  "murav": {
+    "name": "murav",
+    "label": "Uncontrolled Record Attribute Values",
+    "table": "metabib.uncontrolled_record_attr_value",
+    "pkey": "id",
+    "pkey_sequence": "metabib.uncontrolled_record_attr_value_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "required": true, "datatype": "id" },
+      {
+        "name": "attr",
+        "label": "Attribute",
+        "required": true,
+        "type": "link",
+        "key": "name",
+        "class": "crad",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      {
+        "name": "value",
+        "label": "Value",
+        "required": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "mus": {
+    "name": "mus",
+    "label": "User Summary",
+    "table": "money.usr_summary",
+    "pkey": "usr",
+    "pkey_sequence": "",
+    "fields": [
+      { "name": "balance_owed", "datatype": "money" },
+      { "name": "total_owed", "datatype": "money" },
+      { "name": "total_paid", "datatype": "money" },
+      {
+        "name": "usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "mvr": {
+    "name": "mvr",
+    "label": "Virtual Record",
+    "virtual": true,
+    "fields": [
+      { "name": "title", "virtual": true, "datatype": "text" },
+      { "name": "author", "virtual": true, "datatype": "text" },
+      { "name": "doc_id", "virtual": true, "datatype": "text" },
+      { "name": "doc_type", "virtual": true, "datatype": "text" },
+      { "name": "pubdate", "virtual": true, "datatype": "text" },
+      { "name": "isbn", "virtual": true, "datatype": "text" },
+      { "name": "publisher", "virtual": true, "datatype": "text" },
+      { "name": "tcn", "virtual": true, "datatype": "text" },
+      { "name": "subject", "virtual": true, "datatype": "text" },
+      { "name": "types_of_resource", "virtual": true, "datatype": "text" },
+      { "name": "call_numbers", "virtual": true, "datatype": "text" },
+      { "name": "edition", "virtual": true, "datatype": "text" },
+      { "name": "online_loc", "virtual": true, "datatype": "text" },
+      { "name": "synopsis", "virtual": true, "datatype": "text" },
+      { "name": "physical_description", "virtual": true, "datatype": "text" },
+      { "name": "toc", "virtual": true, "datatype": "text" },
+      { "name": "copy_count", "virtual": true, "datatype": "text" },
+      { "name": "series", "virtual": true, "datatype": "text" },
+      { "name": "serials", "virtual": true, "datatype": "text" },
+      { "name": "foreign_copy_maps", "virtual": true, "datatype": "text" }
+    ]
+  },
+  "mwde": {
+    "name": "mwde",
+    "label": "Wide Display Entry",
+    "table": "metabib.wide_display_entry",
+    "pkey": "source",
+    "fields": [
+      {
+        "name": "source",
+        "label": "Record ID",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      { "name": "title", "label": "Title", "datatype": "text" },
+      { "name": "author", "label": "Author", "datatype": "text" },
+      { "name": "creators", "label": "Creators", "datatype": "text" },
+      { "name": "isbn", "label": "ISBN", "datatype": "text" },
+      { "name": "issn", "label": "ISSN", "datatype": "text" },
+      { "name": "upc", "label": "UPC", "datatype": "text" },
+      { "name": "tcn", "label": "TCN", "datatype": "text" },
+      { "name": "edition", "label": "Edition", "datatype": "text" },
+      {
+        "name": "physical_description",
+        "label": "Physical Description",
+        "datatype": "text"
+      },
+      { "name": "publisher", "label": "Publisher", "datatype": "text" },
+      { "name": "series_title", "label": "Series Title", "datatype": "text" },
+      {
+        "name": "subject_geographic",
+        "label": "Geographic Subject",
+        "datatype": "text"
+      },
+      { "name": "subject_name", "label": "Name Subject", "datatype": "text" },
+      {
+        "name": "subject_temporal",
+        "label": "Temporal Subject",
+        "datatype": "text"
+      },
+      { "name": "subject_topic", "label": "Topic Subject", "datatype": "text" },
+      { "name": "abstract", "label": "Abstract", "datatype": "text" },
+      { "name": "toc", "label": "Table of Contents", "datatype": "text" },
+      { "name": "pubdate", "label": "Publication Date", "datatype": "text" },
+      {
+        "name": "type_of_resource",
+        "label": "Type of Resource",
+        "datatype": "text"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "mwp": {
+    "name": "mwp",
+    "label": "Work Payment",
+    "table": "money.work_payment",
+    "pkey": "id",
+    "pkey_sequence": "money.payment_id_seq",
+    "fields": [
+      {
+        "name": "accepting_usr",
+        "label": "Accepting Staff Member",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "amount", "label": "Amount", "datatype": "money" },
+      {
+        "name": "amount_collected",
+        "label": "Amount Collected",
+        "datatype": "money"
+      },
+      { "name": "id", "label": "Payment ID", "datatype": "id" },
+      { "name": "note", "label": "Note", "datatype": "text" },
+      {
+        "name": "payment_ts",
+        "label": "Payment Timestamp",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact",
+        "label": "Transaction ID",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "payment",
+        "label": "Payment link",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mp",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "payment_type",
+        "label": "Payment Type",
+        "virtual": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["VIEW_USER_TRANSACTIONS"] } }
+  },
+  "mwps": {
+    "name": "mwps",
+    "label": "Workstation Payment Summary",
+    "virtual": true,
+    "fields": [
+      {
+        "name": "workstation",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "cash_payment", "virtual": true, "datatype": "text" },
+      { "name": "check_payment", "virtual": true, "datatype": "text" },
+      { "name": "credit_card_payment", "virtual": true, "datatype": "text" }
+    ]
+  },
+  "ocirccount": {
+    "name": "ocirccount",
+    "label": "Open Circulation Count",
+    "source": "(SELECT  usr, SUM( CASE WHEN ( ((fine_interval >= '1 day' AND due_date >= 'today') OR (fine_interval < '1 day'  AND due_date > 'now')) AND (stop_fines IS NULL OR stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE')) ) THEN 1 ELSE 0 END ) AS out, SUM( CASE WHEN ( ((fine_interval >= '1 day' AND due_date < 'today') OR (fine_interval < '1 day'  AND due_date < 'now')) AND (stop_fines IS NULL OR stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE')) ) THEN 1 ELSE 0 END ) AS overdue, SUM( CASE WHEN (xact_finish IS NULL AND stop_fines = 'LOST') THEN 1 ELSE 0 END) AS lost, SUM( CASE WHEN stop_fines = 'CLAIMSRETURNED' THEN 1 ELSE 0 END) AS claims_returned, SUM( CASE WHEN (xact_finish IS NULL AND stop_fines = 'LONGOVERDUE') THEN 1 ELSE 0 END) AS long_overdue FROM  action.circulation WHERE checkin_time IS NULL GROUP BY 1 )",
+    "pkey": "usr",
+    "fields": [
+      {
+        "name": "usr",
+        "label": "User ID",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "out", "label": "Out", "datatype": "text" },
+      { "name": "overdue", "label": "Overdue", "datatype": "text" },
+      { "name": "lost", "label": "Lost", "datatype": "text" },
+      {
+        "name": "claims_returned",
+        "label": "Claims Returned",
+        "datatype": "text"
+      },
+      { "name": "long_overdue", "label": "Long Overdue", "datatype": "text" }
+    ]
+  },
+  "ocirclist": {
+    "name": "ocirclist",
+    "label": "Open Circulation List",
+    "source": "(SELECT  usr, STRING_AGG( CASE WHEN ( ((fine_interval >= '1 day' AND due_date >= 'today') OR (fine_interval < '1 day'  AND due_date > 'now')) AND (stop_fines IS NULL OR stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE')) ) THEN id::TEXT ELSE '0' END ,',') AS out, STRING_AGG( CASE WHEN ( ((fine_interval >= '1 day' AND due_date < 'today') OR (fine_interval < '1 day'  AND due_date < 'now')) AND (stop_fines IS NULL OR stop_fines NOT IN ('LOST','CLAIMSRETURNED','LONGOVERDUE')) ) THEN id::TEXT ELSE '0' END ,',') AS overdue, STRING_AGG( CASE WHEN (xact_finish IS NULL AND stop_fines = 'LOST') THEN id::TEXT ELSE '0' END,',') AS lost, STRING_AGG( CASE WHEN stop_fines = 'CLAIMSRETURNED' THEN id::TEXT ELSE '0' END,',') AS claims_returned, STRING_AGG( CASE WHEN (xact_finish IS NULL AND stop_fines = 'LONGOVERDUE') THEN id::TEXT ELSE '0' END,',') AS long_overdue FROM  action.circulation WHERE checkin_time IS NULL GROUP BY 1 )",
+    "pkey": "usr",
+    "fields": [
+      {
+        "name": "usr",
+        "label": "User ID",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "out", "label": "Out", "datatype": "text" },
+      { "name": "overdue", "label": "Overdue", "datatype": "text" },
+      { "name": "lost", "label": "Lost", "datatype": "text" },
+      {
+        "name": "claims_returned",
+        "label": "Claims Returned",
+        "datatype": "text"
+      },
+      { "name": "long_overdue", "label": "Long Overdue", "datatype": "text" }
+    ]
+  },
+  "perm_ex": {
+    "name": "perm_ex",
+    "virtual": true,
+    "fields": [
+      { "name": "err_msg", "virtual": true, "datatype": "text" },
+      { "name": "type", "virtual": true, "datatype": "text" }
+    ]
+  },
+  "pgpm": {
+    "name": "pgpm",
+    "label": "Group Permission Map",
+    "table": "permission.grp_perm_map",
+    "pkey": "id",
+    "pkey_sequence": "permission.grp_perm_map_id_seq",
+    "fields": [
+      { "name": "depth", "datatype": "int" },
+      { "name": "grantable", "datatype": "bool" },
+      {
+        "name": "grp",
+        "type": "link",
+        "key": "id",
+        "class": "pgt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "perm",
+        "type": "link",
+        "key": "id",
+        "class": "ppl",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ASSIGN_GROUP_PERM"] },
+      "retrieve": {
+        "perms": ["ASSIGN_GROUP_PERM", "UPDATE_GROUP_PERM", "REMOVE_GROUP_PERM"]
+      },
+      "update": { "perms": ["UPDATE_GROUP_PERM"] },
+      "delete": { "perms": ["REMOVE_GROUP_PERM"] }
+    }
+  },
+  "pgpt": {
+    "name": "pgpt",
+    "label": "Group Penalty Threshold",
+    "table": "permission.grp_penalty_threshold",
+    "pkey": "id",
+    "pkey_sequence": "permission.grp_penalty_threshold_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      {
+        "name": "grp",
+        "label": "Group",
+        "type": "link",
+        "key": "id",
+        "class": "pgt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "penalty",
+        "label": "Penalty",
+        "type": "link",
+        "key": "id",
+        "class": "csp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "threshold", "label": "Threshold", "datatype": "float" },
+      {
+        "name": "org_unit",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_GROUP_PENALTY_THRESHOLD"] },
+      "retrieve": {
+        "perms": [
+          "VIEW_GROUP_PENALTY_THRESHOLD",
+          "ADMIN_GROUP_PENALTY_THRESHOLD"
+        ]
+      },
+      "update": { "perms": ["ADMIN_GROUP_PENALTY_THRESHOLD"] },
+      "delete": { "perms": ["ADMIN_GROUP_PENALTY_THRESHOLD"] }
+    }
+  },
+  "pgt": {
+    "name": "pgt",
+    "label": "Permission Group",
+    "table": "permission.grp_tree",
+    "pkey": "id",
+    "pkey_sequence": "permission.grp_tree_id_seq",
+    "fields": [
+      {
+        "name": "children",
+        "label": "Child Groups",
+        "virtual": true,
+        "type": "link",
+        "key": "parent",
+        "class": "pgt",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "id",
+        "label": "Group ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "name",
+        "label": "Group Name",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "parent",
+        "label": "Parent Group",
+        "type": "link",
+        "key": "id",
+        "class": "pgt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "perm_interval",
+        "label": "User Expiration Interval",
+        "datatype": "interval"
+      },
+      {
+        "name": "application_perm",
+        "label": "Required Permission",
+        "datatype": "text"
+      },
+      { "name": "usergroup", "label": "Is User Group", "datatype": "bool" },
+      { "name": "hold_priority", "label": "Hold Priority", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_PERM"] },
+      "retrieve": { "perms": ["STAFF_LOGIN"] },
+      "update": { "perms": ["UPDATE_PERM"] },
+      "delete": { "perms": ["DELETE_PERM"] }
+    }
+  },
+  "pgtde": {
+    "name": "pgtde",
+    "label": "Permission Group Tree Display Entry",
+    "table": "permission.grp_tree_display_entry",
+    "pkey": "id",
+    "pkey_sequence": "permission.grp_tree_display_entry_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Entry ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "grp",
+        "label": "Group ID",
+        "i18n": true,
+        "type": "link",
+        "key": "id",
+        "class": "pgt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "parent",
+        "label": "Parent Group",
+        "type": "link",
+        "key": "id",
+        "class": "pgtde",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "org",
+        "label": "Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "position", "label": "Position", "datatype": "int" },
+      {
+        "name": "children",
+        "label": "Child Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "parent",
+        "class": "pgtde",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["MANAGE_CUSTOM_PERM_GRP_TREE"] },
+      "retrieve": { "perms": ["STAFF_LOGIN"] },
+      "update": { "perms": ["MANAGE_CUSTOM_PERM_GRP_TREE"] },
+      "delete": { "perms": ["MANAGE_CUSTOM_PERM_GRP_TREE"] }
+    }
+  },
+  "ppl": {
+    "name": "ppl",
+    "label": "Permission List",
+    "table": "permission.perm_list",
+    "pkey": "id",
+    "pkey_sequence": "permission.perm_list_id_seq",
+    "fields": [
+      { "name": "code", "datatype": "text" },
+      { "name": "description", "i18n": true, "datatype": "text" },
+      { "name": "id", "selector": "code", "datatype": "id" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_PERM"] },
+      "retrieve": { "perms": ["CREATE_PERM", "UPDATE_PERM", "DELETE_PERM"] },
+      "update": { "perms": ["UPDATE_PERM"] },
+      "delete": { "perms": ["DELETE_PERM"] }
+    }
+  },
+  "pugm": {
+    "name": "pugm",
+    "label": "User Group Map",
+    "table": "permission.usr_grp_map",
+    "pkey": "id",
+    "pkey_sequence": "permission.usr_grp_map_id_seq",
+    "fields": [
+      {
+        "name": "grp",
+        "type": "link",
+        "key": "id",
+        "class": "pgt",
+        "reltype": "has_a",
+        "datatype": "text"
+      },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "text"
+      }
+    ]
+  },
+  "puopm": {
+    "name": "puopm",
+    "label": "User Object Permission Map",
+    "table": "permission.usr_object_perm_map",
+    "pkey": "id",
+    "pkey_sequence": "permission.usr_object_perm_map_id_seq",
+    "fields": [
+      { "name": "object_id", "datatype": "text" },
+      { "name": "grantable", "datatype": "bool" },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "perm",
+        "type": "link",
+        "key": "id",
+        "class": "ppl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "object_type", "datatype": "text" }
+    ]
+  },
+  "pupm": {
+    "name": "pupm",
+    "label": "User Permission Map",
+    "table": "permission.usr_perm_map",
+    "pkey": "id",
+    "pkey_sequence": "permission.usr_perm_map_id_seq",
+    "fields": [
+      { "name": "depth", "datatype": "int" },
+      { "name": "grantable", "datatype": "bool" },
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "perm",
+        "type": "link",
+        "key": "id",
+        "class": "ppl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "puwoum": {
+    "name": "puwoum",
+    "label": "User Work Org Unit Map",
+    "table": "permission.usr_work_ou_map",
+    "pkey": "id",
+    "pkey_sequence": "permission.usr_work_ou_map_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "User/Working Location Map ID",
+        "datatype": "int"
+      },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "work_ou",
+        "label": "Working Location",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "qbv": {
+    "name": "qbv",
+    "label": "Bind Variable",
+    "table": "query.bind_variable",
+    "pkey": "name",
+    "fields": [
+      { "name": "name", "label": "Name", "datatype": "id" },
+      { "name": "label", "label": "Label", "i18n": true, "datatype": "text" },
+      { "name": "type", "label": "Type", "datatype": "text" },
+      { "name": "description", "label": "Description", "datatype": "text" },
+      { "name": "default_value", "label": "Default Value", "datatype": "text" },
+      {
+        "name": "actual_value",
+        "label": "Actual Value",
+        "virtual": true,
+        "datatype": "text"
+      }
+    ]
+  },
+  "qcb": {
+    "name": "qcb",
+    "label": "Case Branch",
+    "table": "query.case_branch",
+    "pkey": "id",
+    "pkey_sequence": "query.case_branch_id_seq",
+    "fields": [
+      { "name": "id", "label": "Case Branch ID", "datatype": "id" },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "condition",
+        "label": "Condition",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "result",
+        "label": "Result",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "qdt": {
+    "name": "qdt",
+    "label": "Datatype",
+    "table": "query.datatype",
+    "pkey": "id",
+    "pkey_sequence": "query.datatype_id_seq",
+    "fields": [
+      { "name": "id", "label": "Datatype ID", "datatype": "id" },
+      { "name": "datatype_name", "label": "Datatype Name", "datatype": "text" },
+      { "name": "is_numeric", "label": "Is Numeric", "datatype": "bool" },
+      { "name": "is_composite", "label": "Is Composite", "datatype": "bool" }
+    ]
+  },
+  "qfpd": {
+    "name": "qfpd",
+    "label": "Function Parameter Definition",
+    "table": "query.function_param_def",
+    "pkey": "id",
+    "pkey_sequence": "query.function_param_def_id_seq",
+    "fields": [
+      { "name": "id", "label": "Function Param Def ID", "datatype": "id" },
+      {
+        "name": "function_id",
+        "label": "Function ID",
+        "type": "link",
+        "key": "id",
+        "class": "qfs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "datatype",
+        "label": "Datatype",
+        "type": "link",
+        "key": "id",
+        "class": "qdt",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "qfr": {
+    "name": "qfr",
+    "label": "From Relation",
+    "table": "query.from_relation",
+    "pkey": "id",
+    "pkey_sequence": "query.from_relation_id_seq",
+    "fields": [
+      { "name": "id", "label": "From Relation ID", "datatype": "id" },
+      { "name": "type", "label": "From Relation Type", "datatype": "text" },
+      { "name": "table_name", "label": "Table Name", "datatype": "text" },
+      { "name": "class_name", "label": "Class Name", "datatype": "text" },
+      {
+        "name": "subquery",
+        "label": "Subquery ID",
+        "type": "link",
+        "key": "id",
+        "class": "qsq",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "function_call",
+        "label": "Function Call ID",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "table_alias", "label": "Table Alias", "datatype": "text" },
+      {
+        "name": "parent_relation",
+        "label": "Parent Relation ID",
+        "type": "link",
+        "key": "id",
+        "class": "qfr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      { "name": "join_type", "label": "Join Type", "datatype": "text" },
+      {
+        "name": "on_clause",
+        "label": "On Clause ID",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "qfs": {
+    "name": "qfs",
+    "label": "Function Signature",
+    "table": "query.function_sig",
+    "pkey": "id",
+    "pkey_sequence": "query.function_sig_id_seq",
+    "fields": [
+      { "name": "id", "label": "Function Signature ID", "datatype": "id" },
+      { "name": "function_name", "label": "Function Name", "datatype": "text" },
+      {
+        "name": "return_type",
+        "label": "Return Type",
+        "type": "link",
+        "key": "id",
+        "class": "qdt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "is_aggregate", "label": "Is Aggregate", "datatype": "bool" }
+    ]
+  },
+  "qobi": {
+    "name": "qobi",
+    "label": "Order By Item",
+    "table": "query.order_by_item",
+    "pkey": "id",
+    "pkey_sequence": "query.order_by_item_id_seq",
+    "fields": [
+      { "name": "id", "label": "Order By Item ID", "datatype": "id" },
+      {
+        "name": "stored_query",
+        "label": "Stored Query ID",
+        "type": "link",
+        "key": "id",
+        "class": "qsq",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "expression",
+        "label": "Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "qrc": {
+    "name": "qrc",
+    "label": "Record Column",
+    "table": "query.record_column",
+    "pkey": "id",
+    "pkey_sequence": "query.record_column_id_seq",
+    "fields": [
+      { "name": "id", "label": "Record Column ID", "datatype": "id" },
+      {
+        "name": "from_relation",
+        "label": "From Relation ID",
+        "type": "link",
+        "key": "id",
+        "class": "qfr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      { "name": "column_name", "label": "Column Name", "datatype": "text" },
+      {
+        "name": "column_type",
+        "label": "Column Type",
+        "type": "link",
+        "key": "id",
+        "class": "qdt",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "qseq": {
+    "name": "qseq",
+    "label": "Query Sequence",
+    "table": "query.query_sequence",
+    "pkey": "id",
+    "pkey_sequence": "query.query_sequence_id_seq",
+    "fields": [
+      { "name": "id", "label": "Query Seq ID", "datatype": "id" },
+      {
+        "name": "parent_query",
+        "label": "Parent Query",
+        "type": "link",
+        "key": "id",
+        "class": "qsq",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "child_query",
+        "label": "Child Query",
+        "type": "link",
+        "key": "id",
+        "class": "qsq",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "qsf": {
+    "name": "qsf",
+    "label": "Subfield",
+    "table": "query.subfield",
+    "pkey": "id",
+    "pkey_sequence": "query.subfield_id_seq",
+    "fields": [
+      { "name": "id", "label": "Subfield ID", "datatype": "id" },
+      {
+        "name": "composite_type",
+        "label": "Composite Type",
+        "type": "link",
+        "key": "id",
+        "class": "qdt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "subfield_type",
+        "label": "Subfield Type",
+        "type": "link",
+        "key": "id",
+        "class": "qdt",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "qsi": {
+    "name": "qsi",
+    "label": "Select Item",
+    "table": "query.select_item",
+    "pkey": "id",
+    "pkey_sequence": "query.select_item_id_seq",
+    "fields": [
+      { "name": "id", "label": "Select Item ID", "datatype": "id" },
+      {
+        "name": "stored_query",
+        "label": "Stored Query ID",
+        "type": "link",
+        "key": "id",
+        "class": "qsq",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "expression",
+        "label": "Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "column_alias", "label": "Column Alias", "datatype": "text" },
+      { "name": "grouped_by", "label": "Is Grouped By", "datatype": "bool" }
+    ]
+  },
+  "qsq": {
+    "name": "qsq",
+    "label": "Stored Query",
+    "table": "query.stored_query",
+    "pkey": "id",
+    "pkey_sequence": "query.stored_query_id_seq",
+    "fields": [
+      { "name": "id", "label": "Query ID", "datatype": "id" },
+      { "name": "type", "label": "Query type", "datatype": "text" },
+      { "name": "use_all", "label": "Use ALL", "datatype": "bool" },
+      { "name": "use_distinct", "label": "Use DISTINCT", "datatype": "bool" },
+      {
+        "name": "from_clause",
+        "label": "FROM Clause",
+        "type": "link",
+        "key": "id",
+        "class": "qfr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "where_clause",
+        "label": "WHERE Clause",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "having_clause",
+        "label": "HAVING Clause",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "limit_count",
+        "label": "LIMIT count",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "offset_count",
+        "label": "OFFSET count",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "qxp": {
+    "name": "qxp",
+    "label": "Expression",
+    "table": "query.expression",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      { "name": "type", "label": "Expression Type", "datatype": "text" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      { "name": "literal", "label": "Literal", "datatype": "text" },
+      { "name": "table_alias", "label": "Table Alias", "datatype": "text" },
+      { "name": "column_name", "label": "Column Name", "datatype": "text" },
+      {
+        "name": "left_operand",
+        "label": "Left Operand",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "operator", "label": "Operator", "datatype": "text" },
+      {
+        "name": "right_operand",
+        "label": "Right Operand",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "function_id",
+        "label": "Function ID",
+        "type": "link",
+        "key": "id",
+        "class": "qfs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "subquery",
+        "label": "Subquery",
+        "type": "link",
+        "key": "id",
+        "class": "qsq",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cast_type",
+        "label": "Cast Type",
+        "type": "link",
+        "key": "id",
+        "class": "qdt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" },
+      {
+        "name": "bind_variable",
+        "label": "Bind Variable",
+        "type": "link",
+        "key": "name",
+        "class": "qbv",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "rb": {
+    "name": "rb",
+    "label": "Statistical Popularity Badge",
+    "table": "rating.badge",
+    "pkey": "id",
+    "pkey_sequence": "rating.badge_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      {
+        "name": "scope",
+        "label": "Scope",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "weight", "label": "Weight", "datatype": "int" },
+      { "name": "horizon_age", "label": "Age Horizon", "datatype": "text" },
+      {
+        "name": "importance_age",
+        "label": "Importance Horizon",
+        "datatype": "text"
+      },
+      {
+        "name": "importance_interval",
+        "label": "Importance Interval",
+        "datatype": "text"
+      },
+      {
+        "name": "importance_scale",
+        "label": "Importance Scale",
+        "datatype": "text"
+      },
+      { "name": "percentile", "label": "Percentile", "datatype": "float" },
+      {
+        "name": "attr_filter",
+        "label": "Attribute Filter",
+        "datatype": "text"
+      },
+      {
+        "name": "circ_mod_filter",
+        "label": "Circ Mod Filter",
+        "type": "link",
+        "key": "code",
+        "class": "ccm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "src_filter",
+        "label": "Bib Source Filter",
+        "type": "link",
+        "key": "id",
+        "class": "cbs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "loc_grp_filter",
+        "label": "Location Group Filter",
+        "type": "link",
+        "key": "id",
+        "class": "acplg",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "recalc_interval",
+        "label": "Recalculation Interval",
+        "datatype": "text"
+      },
+      { "name": "fixed_rating", "label": "Fixed Rating", "datatype": "int" },
+      { "name": "discard", "label": "Discard Value Count", "datatype": "int" },
+      {
+        "name": "last_calc",
+        "label": "Last Refresh Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "popularity_parameter",
+        "label": "Popularity Parameter",
+        "type": "link",
+        "key": "id",
+        "class": "rp",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_POP_BADGE"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_POP_BADGE"] },
+      "delete": { "perms": ["DELETE_POP_BADGE"] }
+    }
+  },
+  "rccbs": {
+    "name": "rccbs",
+    "label": "Classic Open Transaction Summary",
+    "table": "reporter.classic_current_billing_summary",
+    "core": true,
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Transaction ID",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "billing_location_shortname",
+        "label": "Billing Location Short (Policy) Name",
+        "datatype": "text"
+      },
+      {
+        "name": "billing_location_name",
+        "label": "Billing Location Name",
+        "datatype": "text"
+      },
+      {
+        "name": "billing_location",
+        "label": "Billing Location Link",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "usr_home_ou_shortname",
+        "label": "User Home Library Short (Policy) Name",
+        "datatype": "text"
+      },
+      {
+        "name": "usr_home_ou_name",
+        "label": "User Home Library Name",
+        "datatype": "text"
+      },
+      {
+        "name": "usr_home_ou",
+        "label": "User Home Library Link",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "barcode", "label": "User Barcode", "datatype": "text" },
+      {
+        "name": "usr",
+        "label": "User Link",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "xact_start",
+        "label": "Transaction Start Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact_finish",
+        "label": "Transaction End Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "xact_type", "label": "Transaction Type", "datatype": "text" },
+      { "name": "total_paid", "label": "Total Paid", "datatype": "money" },
+      { "name": "total_owed", "label": "Total Billed", "datatype": "money" },
+      {
+        "name": "last_payment_ts",
+        "label": "Last Payment Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "last_payment_note",
+        "label": "Last Payment Note",
+        "datatype": "text"
+      },
+      {
+        "name": "last_payment_type",
+        "label": "Last Payment Type",
+        "datatype": "text"
+      },
+      {
+        "name": "last_billing_ts",
+        "label": "Last Billing Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "last_billing_note",
+        "label": "Last Billing Note",
+        "datatype": "text"
+      },
+      {
+        "name": "last_billing_type",
+        "label": "Last Billing Type",
+        "datatype": "text"
+      },
+      {
+        "name": "demographic_general_division",
+        "label": "User Age Demographic",
+        "datatype": "text"
+      },
+      { "name": "patron_county", "label": "User County", "datatype": "text" },
+      { "name": "patron_city", "label": "User City", "datatype": "text" },
+      { "name": "patron_zip", "label": "User ZIP Code", "datatype": "text" },
+      { "name": "balance_owed", "label": "Balance Owed", "datatype": "money" },
+      {
+        "name": "profile_group",
+        "label": "User Profile Group",
+        "datatype": "text"
+      }
+    ]
+  },
+  "rccc": {
+    "name": "rccc",
+    "label": "Classic Circulation View",
+    "table": "reporter.classic_current_circ",
+    "core": true,
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Circulation",
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Library Circulation Location Short (Policy) Name",
+        "datatype": "text"
+      },
+      {
+        "name": "circ_lib_id",
+        "label": "Library Circulation Location Link",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "xact_start",
+        "label": "Circulation Date/Time",
+        "datatype": "timestamp"
+      },
+      { "name": "circ_type", "label": "Circulation Type", "datatype": "text" },
+      {
+        "name": "copy_id",
+        "label": "Copy Link",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "circ_modifier", "label": "Circ Modifier", "datatype": "text" },
+      {
+        "name": "owning_lib_name",
+        "label": "Owning Library Short (Policy) Name",
+        "datatype": "text"
+      },
+      { "name": "language", "label": "Item Language", "datatype": "text" },
+      { "name": "lit_form", "label": "Literary Form", "datatype": "text" },
+      { "name": "item_form", "label": "MARC Form", "datatype": "text" },
+      { "name": "item_type", "label": "MARC Type", "datatype": "text" },
+      {
+        "name": "shelving_location",
+        "label": "Shelving Location",
+        "datatype": "text"
+      },
+      {
+        "name": "profile_group",
+        "label": "Patron Profile Group",
+        "datatype": "text"
+      },
+      {
+        "name": "demographic_general_division",
+        "label": "Patron Age Demographic",
+        "datatype": "text"
+      },
+      {
+        "name": "call_number",
+        "label": "Call Number Link",
+        "type": "link",
+        "key": "id",
+        "class": "acn",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "call_number_label",
+        "label": "Call Number Label",
+        "datatype": "text"
+      },
+      {
+        "name": "dewey",
+        "label": "Call Number Dewey/Prefix",
+        "datatype": "text"
+      },
+      {
+        "name": "patron_id",
+        "label": "Patron Link",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "patron_home_lib",
+        "label": "Patron Home Library Link",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "patron_home_lib_shortname",
+        "label": "Patron Home Library Short (Policy) Name",
+        "datatype": "text"
+      },
+      { "name": "patron_county", "label": "Patron County", "datatype": "text" },
+      { "name": "patron_city", "label": "Patron City", "datatype": "text" },
+      { "name": "patron_zip", "label": "Patron ZIP Code", "datatype": "text" },
+      {
+        "name": "stat_cat_1",
+        "label": "Legacy CAT1 Link",
+        "type": "link",
+        "key": "id",
+        "class": "rsce1",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat_2",
+        "label": "Legacy CAT2 Link",
+        "type": "link",
+        "key": "id",
+        "class": "rsce2",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "dewey_range_tens",
+        "label": "Dewey Range - Tens",
+        "datatype": "text"
+      },
+      {
+        "name": "dewey_range_hundreds",
+        "label": "Dewey Range - Hundreds",
+        "datatype": "text"
+      },
+      {
+        "name": "dewey_block_tens",
+        "label": "Dewey Block - Tens",
+        "datatype": "text"
+      },
+      {
+        "name": "dewey_block_hundreds",
+        "label": "Dewey Block - Hundreds",
+        "datatype": "text"
+      },
+      {
+        "name": "stat_cat_1_value",
+        "label": "Legacy CAT1 Value",
+        "datatype": "text"
+      },
+      {
+        "name": "stat_cat_2_value",
+        "label": "Legacy CAT2 Value",
+        "datatype": "text"
+      }
+    ]
+  },
+  "rcirct": {
+    "name": "rcirct",
+    "label": "Circulation Type",
+    "table": "reporter.circ_type",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Circulation ID",
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "might_have",
+        "datatype": "id"
+      },
+      { "name": "type", "label": "Circulation Type", "datatype": "text" }
+    ]
+  },
+  "rhcrpb": {
+    "name": "rhcrpb",
+    "label": "Hold/Copy Ratio per Bib",
+    "core": true,
+    "source": "( SELECT y.bre AS id, COALESCE( x.copy_count, 0 ) AS copy_count, y.hold_count AS hold_count, (y.hold_count::REAL / (CASE WHEN x.copy_count = 0 OR x.copy_count IS NULL THEN 0.1 ELSE x.copy_count::REAL END)) AS hold_copy_ratio FROM ( SELECT (SELECT bib_record FROM reporter.hold_request_record r WHERE r.id = h.id LIMIT 1) AS bre, COUNT(*) AS hold_count FROM action.hold_request h WHERE cancel_time IS NULL AND fulfillment_time IS NULL GROUP BY 1 )y LEFT JOIN ( SELECT  (SELECT id FROM biblio.record_entry  WHERE id = (SELECT record FROM asset.call_number WHERE id = call_number and deleted is false) ) AS bre,  COUNT(*) AS copy_count FROM asset.copy JOIN asset.copy_location loc ON (copy.location = loc.id AND loc.holdable) WHERE copy.holdable  AND NOT copy.deleted  AND copy.status IN ( SELECT id FROM config.copy_status WHERE holdable )  GROUP BY 1 )x ON x.bre = y.bre )",
+    "pkey": "id",
+    "pkey_sequence": "biblio.record_entry",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Record ID",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "copy_count",
+        "label": "Holdable Copy Count",
+        "datatype": "int"
+      },
+      { "name": "hold_count", "label": "Active Holds", "datatype": "int" },
+      {
+        "name": "hold_copy_ratio",
+        "label": "Hold/Copy Ratio",
+        "datatype": "float"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "rhcrpbap": {
+    "name": "rhcrpbap",
+    "label": "Hold/Copy Ratio per Bib and Pickup Library",
+    "source": "( SELECT *, CASE WHEN copy_count_at_pickup_library = 0 THEN 'Infinity'::FLOAT ELSE holds_at_pickup_library::FLOAT/copy_count_at_pickup_library END AS pickup_library_ratio, CASE WHEN copy_count_everywhere = 0 THEN 'Infinity'::FLOAT ELSE holds_everywhere::FLOAT/copy_count_everywhere END AS everywhere_ratio FROM (SELECT bib_record as id, pickup_lib, count(DISTINCT ahr.id) AS holds_at_pickup_library, COALESCE(count(DISTINCT ac.id),0) as copy_count_at_pickup_library FROM action.hold_request ahr JOIN reporter.hold_request_record rhrr USING (id) LEFT JOIN action.hold_copy_map ahcm ON (ahr.id = ahcm.hold) LEFT JOIN asset.copy ac ON (ahcm.target_copy = ac.id AND ahr.pickup_lib = ac.circ_lib) WHERE ahr.cancel_time IS NULL AND ahr.fulfillment_time IS NULL GROUP BY bib_record, pickup_lib )x JOIN (SELECT bib_record as id, count(DISTINCT ahr.id) AS holds_everywhere, COALESCE(count(DISTINCT target_copy),0) as copy_count_everywhere FROM action.hold_request ahr JOIN reporter.hold_request_record rhrr USING (id) LEFT JOIN action.hold_copy_map ahcm ON (ahr.id = ahcm.hold) WHERE ahr.cancel_time IS NULL AND ahr.fulfillment_time IS NULL GROUP BY bib_record )y USING (id) )",
+    "pkey": "id",
+    "pkey_sequence": "biblio.record_entry",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Record ID",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "pickup_lib",
+        "label": "Pickup Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "holds_at_pickup_library",
+        "label": "Active Holds at Pickup Library",
+        "datatype": "int"
+      },
+      {
+        "name": "copy_count_at_pickup_library",
+        "label": "Holdable Copy Count at Pickup Library",
+        "datatype": "int"
+      },
+      {
+        "name": "holds_everywhere",
+        "label": "Active Holds Everywhere",
+        "datatype": "int"
+      },
+      {
+        "name": "copy_count_everywhere",
+        "label": "Holdable Copy Count Everywhere",
+        "datatype": "int"
+      },
+      {
+        "name": "pickup_library_ratio",
+        "label": "Hold/Copy Ratio at Pickup Library",
+        "datatype": "float"
+      },
+      {
+        "name": "everywhere_ratio",
+        "label": "Hold/Copy Ratio Everywhere",
+        "datatype": "float"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "rhcrpbapd": {
+    "name": "rhcrpbapd",
+    "label": "Hold/Copy Ratio per Bib and Pickup Library (and Descendants) ",
+    "source": "( WITH counts_at_ou AS ( SELECT  rhrr.bib_record AS id, aou.id AS pickup_lib_or_desc, COUNT(DISTINCT ahr.id) AS holds_at_or_below, COALESCE(COUNT(DISTINCT ac.id),0) AS copy_count_at_or_below FROM  actor.org_unit aou JOIN actor.org_unit_type aout ON (aou.ou_type = aout.id), action.hold_request ahr JOIN reporter.hold_request_record rhrr USING (id) LEFT JOIN action.hold_copy_map ahcm ON (ahr.id = ahcm.hold) LEFT JOIN asset.copy ac ON (ahcm.target_copy = ac.id) WHERE ahr.cancel_time IS NULL AND ahr.fulfillment_time IS NULL AND ac.circ_lib IN (SELECT id FROM actor.org_unit_descendants(aou.id)) AND (actor.org_unit_ancestor_at_depth(ahr.pickup_lib,aout.depth)).id = (actor.org_unit_ancestor_at_depth(ac.circ_lib,aout.depth)).id GROUP BY 1, 2 ) SELECT x.id, x.pickup_lib_or_desc, x.holds_at_or_below, x.copy_count_at_or_below, y.holds_everywhere, y.copy_count_everywhere, CASE WHEN copy_count_at_or_below = 0 THEN 'Infinity'::FLOAT ELSE x.holds_at_or_below::FLOAT/x.copy_count_at_or_below END AS hold_copy_ratio_at_or_below_ou, CASE WHEN copy_count_everywhere = 0 THEN 'Infinity'::FLOAT ELSE y.holds_everywhere::FLOAT/y.copy_count_everywhere END AS everywhere_ratio FROM counts_at_ou x JOIN (SELECT bib_record AS id, count(DISTINCT ahr.id) AS holds_everywhere, COALESCE(count(DISTINCT target_copy),0) as copy_count_everywhere FROM action.hold_request ahr JOIN reporter.hold_request_record rhrr USING (id) LEFT JOIN action.hold_copy_map ahcm ON (ahr.id = ahcm.hold) WHERE ahr.cancel_time IS NULL AND ahr.fulfillment_time IS NULL GROUP BY bib_record )y USING (id) )",
+    "pkey": "id",
+    "pkey_sequence": "biblio.record_entry",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Record ID",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "pickup_lib_or_desc",
+        "label": "Pickup Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "holds_at_or_below",
+        "label": "Active Holds at Pickup Library and its Descendants",
+        "datatype": "int"
+      },
+      {
+        "name": "copy_count_at_or_below",
+        "label": "Holdable Copy Count at Pickup Library and its Descendants",
+        "datatype": "int"
+      },
+      {
+        "name": "holds_everywhere",
+        "label": "Active Holds Everywhere",
+        "datatype": "int"
+      },
+      {
+        "name": "copy_count_everywhere",
+        "label": "Holdable Copy Count Everywhere",
+        "datatype": "int"
+      },
+      {
+        "name": "hold_copy_ratio_at_or_below_ou",
+        "label": "Hold/Copy Ratio at Pickup Library and its Descendants",
+        "datatype": "float"
+      },
+      {
+        "name": "everywhere_ratio",
+        "label": "Hold/Copy Ratio Everywhere",
+        "datatype": "float"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "rhr": {
+    "name": "rhr",
+    "virtual": true,
+    "fields": [
+      { "name": "public_name", "virtual": true, "datatype": "text" },
+      { "name": "target_url", "virtual": true, "datatype": "text" },
+      { "name": "target_coverage", "virtual": true, "datatype": "text" },
+      { "name": "target_embargo", "virtual": true, "datatype": "text" }
+    ]
+  },
+  "rhrr": {
+    "name": "rhrr",
+    "label": "Hold Request Record",
+    "table": "reporter.hold_request_record",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Hold ID",
+        "type": "link",
+        "key": "id",
+        "class": "ahr",
+        "reltype": "might_have",
+        "datatype": "id"
+      },
+      { "name": "target", "label": "Hold Target", "datatype": "int" },
+      { "name": "hold_type", "label": "Hold Request Type", "datatype": "text" },
+      {
+        "name": "bib_record",
+        "label": "Target Bib Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "rlc": {
+    "name": "rlc",
+    "label": "Last Circulation or Creation Date",
+    "source": "( SELECT ac.id, COALESCE(MAX(actac.xact_start), ac.create_date) AS last_circ_or_create, MAX(actac.xact_start) AS last_circ FROM asset.copy ac LEFT JOIN action.all_circulation actac ON ac.id = actac.target_copy GROUP BY ac.id )",
+    "pkey": "id",
+    "pkey_sequence": "biblio.record_entry",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Copy ID",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "last_circ_or_create",
+        "label": "Last Circulation or Creation Date",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "last_circ",
+        "label": "Last Circulation Date",
+        "datatype": "timestamp"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "rlcd": {
+    "name": "rlcd",
+    "label": "Last Copy Delete Time",
+    "core": true,
+    "source": "( SELECT  b.id, MAX(dcp.edit_date) AS last_delete_date FROM   biblio.record_entry b JOIN asset.call_number cn ON (cn.record = b.id) JOIN asset.copy dcp ON (cn.id = dcp.call_number) WHERE  NOT b.deleted GROUP BY b.id HAVING SUM( CASE WHEN NOT dcp.deleted THEN 1 ELSE 0 END) = 0  )",
+    "pkey": "id",
+    "pkey_sequence": "biblio.record_entry",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Record ID",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      {
+        "name": "last_delete_date",
+        "label": "Delete Date/Time",
+        "datatype": "timestamp"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "rmobbcol": {
+    "name": "rmobbcol",
+    "label": "Open Circulation Balance by Circulating Library and Owning Library",
+    "table": "money.open_balance_by_circ_and_owning_lib",
+    "core": true,
+    "pkey": "circ_lib",
+    "fields": [
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "billing_types", "label": "Billing Types", "datatype": "text" },
+      { "name": "balance", "label": "Balance", "datatype": "money" }
+    ]
+  },
+  "rmobbhol": {
+    "name": "rmobbhol",
+    "label": "Open Circulation Balance by User Home Library and Owning Library",
+    "table": "money.open_balance_by_usr_home_and_owning_lib",
+    "core": true,
+    "pkey": "home_ou",
+    "fields": [
+      {
+        "name": "home_ou",
+        "label": "User Home Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "billing_types", "label": "Billing Types", "datatype": "text" },
+      { "name": "balance", "label": "Balance", "datatype": "money" }
+    ]
+  },
+  "rmobbol": {
+    "name": "rmobbol",
+    "label": "Open Circulation Balance by Owning Library",
+    "table": "money.open_balance_by_owning_lib",
+    "core": true,
+    "pkey": "owning_lib",
+    "fields": [
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "billing_types", "label": "Billing Types", "datatype": "text" },
+      { "name": "balance", "label": "Balance", "datatype": "money" }
+    ]
+  },
+  "rmocbbcol": {
+    "name": "rmocbbcol",
+    "label": "Open Circulation Billing by Circulating Library and Owning Library",
+    "table": "money.open_circ_balance_by_circ_and_owning_lib",
+    "core": true,
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Circulation ID",
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "billing_type", "label": "Billing Type", "datatype": "text" },
+      { "name": "billed", "label": "Total Billed", "datatype": "money" }
+    ]
+  },
+  "rmocbbhol": {
+    "name": "rmocbbhol",
+    "label": "Open Circulation Billing by User Home Library and Owning Library",
+    "table": "money.open_circ_balance_by_usr_home_and_owning_lib",
+    "core": true,
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Circulation ID",
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "home_ou",
+        "label": "User Home Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "billing_type", "label": "Billing Type", "datatype": "text" },
+      { "name": "billed", "label": "Total Billed", "datatype": "money" }
+    ]
+  },
+  "rmocbbol": {
+    "name": "rmocbbol",
+    "label": "Open Circulation Billing by Owning Library",
+    "table": "money.open_circ_balance_by_owning_lib",
+    "core": true,
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Circulation ID",
+        "type": "link",
+        "key": "id",
+        "class": "circ",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "billing_type", "label": "Billing Type", "datatype": "text" },
+      { "name": "billed", "label": "Total Billed", "datatype": "money" }
+    ]
+  },
+  "rmsr": {
+    "name": "rmsr",
+    "label": "Fast Simple Record Extracts",
+    "table": "reporter.materialized_simple_record",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "label": "Record ID", "datatype": "id" },
+      { "name": "fingerprint", "label": "Fingerprint", "datatype": "text" },
+      {
+        "name": "quality",
+        "label": "Overall Record Quality",
+        "datatype": "int"
+      },
+      { "name": "tcn_source", "label": "TCN Source", "datatype": "text" },
+      { "name": "tcn_value", "label": "TCN Value", "datatype": "text" },
+      {
+        "name": "title",
+        "label": "Title Proper (normalized)",
+        "datatype": "text"
+      },
+      { "name": "author", "label": "Author (normalized)", "datatype": "text" },
+      {
+        "name": "publisher",
+        "label": "Publisher (normalized)",
+        "datatype": "text"
+      },
+      {
+        "name": "pubdate",
+        "label": "Publication Year (normalized)",
+        "datatype": "int"
+      },
+      { "name": "isbn", "label": "ISBN", "datatype": "text" },
+      { "name": "issn", "label": "ISSN", "datatype": "text" },
+      {
+        "name": "biblio_record",
+        "label": "Full Bibliographic record",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "rocit": {
+    "name": "rocit",
+    "label": "Classic Item List",
+    "table": "reporter.classic_item_list",
+    "core": true,
+    "pkey": "id",
+    "fields": [
+      { "name": "title", "label": "Title", "datatype": "text" },
+      { "name": "author", "label": "Author", "datatype": "text" },
+      { "name": "pubdate", "label": "Pubdate", "datatype": "text" },
+      {
+        "name": "id",
+        "label": "Copy ID",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "id"
+      },
+      { "name": "price", "label": "Price", "datatype": "money" },
+      { "name": "barcode", "label": "Barcode", "datatype": "text" },
+      {
+        "name": "call_number_label",
+        "label": "Callnumber Label",
+        "datatype": "text"
+      },
+      { "name": "dewey_block_tens", "label": "Dewy Tens", "datatype": "text" },
+      {
+        "name": "dewey_block_hundreds",
+        "label": "Dewy Hundreds",
+        "datatype": "text"
+      },
+      { "name": "use_count", "label": "Use Count", "datatype": "int" },
+      { "name": "circ_modifier", "label": "Circ Modifier", "datatype": "text" },
+      {
+        "name": "shelving_location",
+        "label": "Shelving Location Name",
+        "datatype": "text"
+      },
+      {
+        "name": "stat_cat_1",
+        "label": "Legacy Stat Cat 1",
+        "type": "link",
+        "key": "id",
+        "class": "rsce1",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat_2",
+        "label": "Legacy Stat Cat 2",
+        "type": "link",
+        "key": "id",
+        "class": "rsce2",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat_1_value",
+        "label": "Legacy Stat Cat 1 Value",
+        "datatype": "text"
+      },
+      {
+        "name": "stat_cat_2_value",
+        "label": "Legacy Stat Cat 2 Value",
+        "datatype": "text"
+      },
+      { "name": "edit_date", "label": "Edit Date", "datatype": "timestamp" },
+      {
+        "name": "create_date",
+        "label": "Create Date",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "owning_lib_name",
+        "label": "Owning Lib Name",
+        "datatype": "text"
+      },
+      { "name": "circ_lib_name", "label": "Circ Lib Name", "datatype": "text" },
+      {
+        "name": "owning_lib",
+        "label": "Owning Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Circ Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "age_protect",
+        "label": "Age Protection",
+        "type": "link",
+        "key": "id",
+        "class": "crahp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "opac_visible", "label": "OPAC Visible", "datatype": "bool" },
+      { "name": "ref", "label": "Reference", "datatype": "bool" },
+      {
+        "name": "deposit_amount",
+        "label": "Deposit Amount",
+        "datatype": "text"
+      },
+      { "name": "deleted", "label": "Deleted", "datatype": "bool" },
+      { "name": "tcn_value", "label": "TCN", "datatype": "text" },
+      {
+        "name": "status",
+        "label": "Status",
+        "type": "link",
+        "key": "id",
+        "class": "ccs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "stop_fines",
+        "label": "Stop Fines Reason",
+        "datatype": "text"
+      },
+      { "name": "due_date", "label": "Due Date", "datatype": "timestamp" },
+      {
+        "name": "patron_barcode",
+        "label": "Patron Barcode",
+        "datatype": "text"
+      },
+      { "name": "patron_name", "label": "Patron Name", "datatype": "text" }
+    ]
+  },
+  "rodcirc": {
+    "name": "rodcirc",
+    "label": "Overdue Circulation",
+    "table": "reporter.overdue_circs",
+    "core": true,
+    "pkey": "id",
+    "pkey_sequence": "money.billable_xact_id_seq",
+    "fields": [
+      {
+        "name": "checkin_lib",
+        "label": "Check In Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "checkin_staff",
+        "label": "Check In Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "checkin_time",
+        "label": "Check In Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "circ_staff",
+        "label": "Circulating Staff",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "desk_renewal", "label": "Desk Renewal", "datatype": "bool" },
+      { "name": "due_date", "label": "Due Date/Time", "datatype": "timestamp" },
+      {
+        "name": "duration",
+        "label": "Circulation Duration",
+        "datatype": "interval"
+      },
+      {
+        "name": "duration_rule",
+        "label": "Circ Duration Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crcd",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "fine_interval",
+        "label": "Fine Interval",
+        "datatype": "interval"
+      },
+      { "name": "id", "label": "Circ ID", "datatype": "id" },
+      { "name": "max_fine", "label": "Max Fine Amount", "datatype": "money" },
+      {
+        "name": "max_fine_rule",
+        "label": "Max Fine Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "opac_renewal", "label": "OPAC Renewal", "datatype": "bool" },
+      { "name": "phone_renewal", "label": "Phone Renewal", "datatype": "bool" },
+      {
+        "name": "recurring_fine",
+        "label": "Recurring Fine Amount",
+        "datatype": "money"
+      },
+      {
+        "name": "recurring_fine_rule",
+        "label": "Recurring Fine Rule",
+        "type": "link",
+        "key": "name",
+        "class": "crrf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "renewal_remaining",
+        "label": "Remaining Renewals",
+        "datatype": "int"
+      },
+      { "name": "stop_fines", "label": "Fine Stop Reason", "datatype": "text" },
+      {
+        "name": "stop_fines_time",
+        "label": "Fine Stop Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "target_copy",
+        "label": "Circulating Item",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "usr",
+        "label": "Patron",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "xact_finish",
+        "label": "Transaction Finish Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "xact_start",
+        "label": "Checkout Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "billings",
+        "label": "Transaction Billings",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mb",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "payments",
+        "label": "Transaction Payments",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "mp",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "billable_transaction",
+        "label": "Base Transaction",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_type",
+        "label": "Circulation Type",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "rcirct",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "billing_total",
+        "label": "Billing Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxbt",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "payment_total",
+        "label": "Payment Totals",
+        "virtual": true,
+        "type": "link",
+        "key": "xact",
+        "class": "rxpt",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ]
+  },
+  "rof": {
+    "name": "rof",
+    "label": "Output Folder",
+    "table": "reporter.output_folder",
+    "pkey": "id",
+    "pkey_sequence": "reporter.output_folder_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "parent",
+        "type": "link",
+        "key": "id",
+        "class": "rof",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "create_time", "datatype": "timestamp" },
+      { "name": "name", "datatype": "text" },
+      { "name": "shared", "datatype": "bool" },
+      {
+        "name": "share_with",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "children",
+        "virtual": true,
+        "type": "link",
+        "key": "parent",
+        "class": "rof",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "outputs",
+        "virtual": true,
+        "type": "link",
+        "key": "folder",
+        "class": "rs",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ]
+  },
+  "rp": {
+    "name": "rp",
+    "label": "Statistical Popularity Parameter",
+    "table": "rating.popularity_parameter",
+    "pkey": "id",
+    "pkey_sequence": "rating.popularity_parameter_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      { "name": "description", "label": "Description", "datatype": "text" },
+      { "name": "func", "label": "Population Function", "datatype": "text" },
+      {
+        "name": "require_horizon",
+        "label": "Require Horizon",
+        "datatype": "bool"
+      },
+      {
+        "name": "require_percentile",
+        "label": "Require Percentile",
+        "datatype": "bool"
+      },
+      {
+        "name": "require_importance",
+        "label": "Require Importance",
+        "datatype": "bool"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_POP_PARAMETER"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_POP_PARAMETER"] },
+      "delete": { "perms": ["DELETE_POP_PARAMETER"] }
+    }
+  },
+  "rr": {
+    "name": "rr",
+    "label": "Report",
+    "table": "reporter.report",
+    "pkey": "id",
+    "pkey_sequence": "reporter.report_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "create_time", "datatype": "timestamp" },
+      {
+        "name": "template",
+        "type": "link",
+        "key": "id",
+        "class": "rt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "data", "datatype": "text" },
+      {
+        "name": "folder",
+        "type": "link",
+        "key": "id",
+        "class": "rrf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "recur", "datatype": "bool" },
+      { "name": "recurrence", "datatype": "interval" },
+      { "name": "name", "datatype": "text" },
+      { "name": "description", "datatype": "text" },
+      {
+        "name": "runs",
+        "virtual": true,
+        "type": "link",
+        "key": "report",
+        "class": "rs",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ]
+  },
+  "rrbs": {
+    "name": "rrbs",
+    "label": "Statistical Popularity Badge",
+    "table": "rating.record_badge_score",
+    "pkey": "id",
+    "pkey_sequence": "rating.record_badge_score_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      {
+        "name": "badge",
+        "label": "Badge",
+        "type": "link",
+        "key": "id",
+        "class": "rb",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "record",
+        "label": "Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "score", "label": "Score", "datatype": "int" }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "rrf": {
+    "name": "rrf",
+    "label": "Report Folder",
+    "table": "reporter.report_folder",
+    "pkey": "id",
+    "pkey_sequence": "reporter.report_folder_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "parent",
+        "type": "link",
+        "key": "id",
+        "class": "rrf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "create_time", "datatype": "timestamp" },
+      { "name": "name", "datatype": "text" },
+      { "name": "shared", "datatype": "bool" },
+      {
+        "name": "share_with",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "children",
+        "virtual": true,
+        "type": "link",
+        "key": "parent",
+        "class": "rrf",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "reports",
+        "virtual": true,
+        "type": "link",
+        "key": "folder",
+        "class": "rr",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ]
+  },
+  "rs": {
+    "name": "rs",
+    "label": "Schedule",
+    "table": "reporter.schedule",
+    "pkey": "id",
+    "pkey_sequence": "reporter.schedule_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "runner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "start_time", "datatype": "timestamp" },
+      { "name": "complete_time", "datatype": "timestamp" },
+      { "name": "run_time", "datatype": "timestamp" },
+      { "name": "email", "datatype": "text" },
+      { "name": "excel_format", "datatype": "bool" },
+      { "name": "csv_format", "datatype": "bool" },
+      { "name": "html_format", "datatype": "bool" },
+      { "name": "error_code", "datatype": "int" },
+      { "name": "error_text", "datatype": "text" },
+      {
+        "name": "report",
+        "type": "link",
+        "key": "id",
+        "class": "rr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "folder",
+        "type": "link",
+        "key": "id",
+        "class": "rof",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "chart_pie", "datatype": "bool" },
+      { "name": "chart_bar", "datatype": "bool" },
+      { "name": "chart_line", "datatype": "bool" }
+    ]
+  },
+  "rsce1": {
+    "name": "rsce1",
+    "label": "CAT1 Entry",
+    "table": "reporter.legacy_cat1",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Entry ID",
+        "selector": "value",
+        "datatype": "id"
+      },
+      {
+        "name": "owner",
+        "label": "Entry Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "label": "Entry Value", "datatype": "text" }
+    ]
+  },
+  "rsce2": {
+    "name": "rsce2",
+    "label": "CAT2 Entry",
+    "table": "reporter.legacy_cat2",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Entry ID",
+        "selector": "value",
+        "datatype": "id"
+      },
+      {
+        "name": "owner",
+        "label": "Entry Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "value", "label": "Entry Value", "datatype": "text" }
+    ]
+  },
+  "rsr": {
+    "name": "rsr",
+    "label": "Simple Record",
+    "table": "reporter.simple_record",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "label": "Record ID", "datatype": "id" },
+      {
+        "name": "metarecord",
+        "label": "Metarecord",
+        "type": "link",
+        "key": "id",
+        "class": "mmr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "fingerprint", "label": "Fingerprint", "datatype": "text" },
+      {
+        "name": "quality",
+        "label": "Overall Record Quality",
+        "datatype": "int"
+      },
+      { "name": "tcn_source", "label": "TCN Source", "datatype": "text" },
+      { "name": "tcn_value", "label": "TCN Value", "datatype": "text" },
+      {
+        "name": "title",
+        "label": "Title Proper (normalized)",
+        "datatype": "text"
+      },
+      {
+        "name": "uniform_title",
+        "label": "Uniform Title (normalized)",
+        "datatype": "text"
+      },
+      { "name": "author", "label": "Author (normalized)", "datatype": "text" },
+      {
+        "name": "publisher",
+        "label": "Publisher (normalized)",
+        "datatype": "text"
+      },
+      {
+        "name": "pubdate",
+        "label": "Publication Year (normalized)",
+        "datatype": "int"
+      },
+      {
+        "name": "series_title",
+        "label": "Series Title (normalized)",
+        "datatype": "text"
+      },
+      {
+        "name": "series_statement",
+        "label": "Series Statement (normalized)",
+        "datatype": "text"
+      },
+      {
+        "name": "summary",
+        "label": "Summary (normalized)",
+        "datatype": "text"
+      },
+      { "name": "isbn", "label": "ISBN", "datatype": "text" },
+      { "name": "issn", "label": "ISSN", "datatype": "text" },
+      {
+        "name": "topic_subject",
+        "label": "Topic Subjects (normalized)",
+        "datatype": "text"
+      },
+      {
+        "name": "geographic_subject",
+        "label": "Geographic Subjects (normalized)",
+        "datatype": "text"
+      },
+      { "name": "genre", "label": "Genres (normalized)", "datatype": "text" },
+      {
+        "name": "name_subject",
+        "label": "Personal Name Subjects (normalized)",
+        "datatype": "text"
+      },
+      {
+        "name": "corporate_subject",
+        "label": "Corporate Name Subjects (normalized)",
+        "datatype": "text"
+      },
+      {
+        "name": "external_uri",
+        "label": "External URI List (normalized)",
+        "datatype": "text"
+      },
+      {
+        "name": "biblio_record",
+        "label": "Full Bibliographic record",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ]
+  },
+  "rssr": {
+    "name": "rssr",
+    "label": "Simple Record Extracts",
+    "table": "reporter.super_simple_record",
+    "pkey": "id",
+    "fields": [
+      { "name": "id", "label": "Record ID", "datatype": "id" },
+      { "name": "fingerprint", "label": "Fingerprint", "datatype": "text" },
+      {
+        "name": "quality",
+        "label": "Overall Record Quality",
+        "datatype": "int"
+      },
+      { "name": "tcn_source", "label": "TCN Source", "datatype": "text" },
+      { "name": "tcn_value", "label": "TCN Value", "datatype": "text" },
+      {
+        "name": "title",
+        "label": "Title Proper (normalized)",
+        "datatype": "text"
+      },
+      { "name": "author", "label": "Author (normalized)", "datatype": "text" },
+      {
+        "name": "publisher",
+        "label": "Publisher (normalized)",
+        "datatype": "text"
+      },
+      {
+        "name": "pubdate",
+        "label": "Publication Year (normalized)",
+        "datatype": "int"
+      },
+      { "name": "isbn", "label": "ISBN", "datatype": "text" },
+      { "name": "issn", "label": "ISSN", "datatype": "text" },
+      {
+        "name": "biblio_record",
+        "label": "Full Bibliographic record",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ]
+  },
+  "rt": {
+    "name": "rt",
+    "label": "Template",
+    "table": "reporter.template",
+    "pkey": "id",
+    "pkey_sequence": "reporter.template_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "create_time", "datatype": "timestamp" },
+      { "name": "name", "datatype": "text" },
+      { "name": "data", "datatype": "text" },
+      {
+        "name": "folder",
+        "type": "link",
+        "key": "id",
+        "class": "rtf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "description", "datatype": "text" },
+      {
+        "name": "reports",
+        "virtual": true,
+        "type": "link",
+        "key": "template",
+        "class": "rr",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["RUN_REPORTS"] },
+      "retrieve": { "perms": ["RUN_REPORTS"] },
+      "update": { "perms": ["RUN_REPORTS"] },
+      "delete": { "perms": ["RUN_REPORTS"] }
+    }
+  },
+  "rtf": {
+    "name": "rtf",
+    "label": "Template Folder",
+    "table": "reporter.template_folder",
+    "pkey": "id",
+    "pkey_sequence": "reporter.template_folder_id_seq",
+    "fields": [
+      { "name": "id", "datatype": "id" },
+      {
+        "name": "parent",
+        "type": "link",
+        "key": "id",
+        "class": "rtf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "owner",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "create_time", "datatype": "timestamp" },
+      { "name": "name", "datatype": "text" },
+      { "name": "shared", "datatype": "bool" },
+      {
+        "name": "share_with",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "children",
+        "virtual": true,
+        "type": "link",
+        "key": "parent",
+        "class": "rtf",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "templates",
+        "virtual": true,
+        "type": "link",
+        "key": "folder",
+        "class": "rt",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ]
+  },
+  "rud": {
+    "name": "rud",
+    "label": "User Demographics",
+    "table": "reporter.demographic",
+    "pkey": "id",
+    "fields": [
+      {
+        "name": "id",
+        "label": "User ID",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "might_have",
+        "datatype": "id"
+      },
+      { "name": "dob", "label": "Date of Birth", "datatype": "timestamp" },
+      {
+        "name": "general_division",
+        "label": "General Demographic Division",
+        "datatype": "text"
+      }
+    ]
+  },
+  "rxbt": {
+    "name": "rxbt",
+    "label": "Transaction Billing Totals",
+    "table": "reporter.xact_billing_totals",
+    "pkey": "xact",
+    "fields": [
+      {
+        "name": "xact",
+        "label": "Transaction ID",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "might_have",
+        "datatype": "int"
+      },
+      {
+        "name": "unvoided",
+        "label": "Unvoided Billing Amount",
+        "datatype": "int"
+      },
+      {
+        "name": "voided",
+        "label": "Voided Billing Amount",
+        "datatype": "money"
+      },
+      { "name": "total", "label": "Total Billing Amount", "datatype": "money" }
+    ]
+  },
+  "rxpt": {
+    "name": "rxpt",
+    "label": "Transaction Paid Totals",
+    "table": "reporter.xact_paid_totals",
+    "pkey": "xact",
+    "fields": [
+      {
+        "name": "xact",
+        "label": "Transaction ID",
+        "type": "link",
+        "key": "id",
+        "class": "mbt",
+        "reltype": "might_have",
+        "datatype": "int"
+      },
+      {
+        "name": "unvoided",
+        "label": "Unvoided Paid Amount",
+        "datatype": "int"
+      },
+      {
+        "name": "voided",
+        "label": "Voided (Returned) Paid Amount",
+        "datatype": "money"
+      },
+      { "name": "total", "label": "Total Paid Amount", "datatype": "money" }
+    ]
+  },
+  "sasum": {
+    "name": "sasum",
+    "label": "All Issues' Summaries",
+    "table": "serial.any_summary",
+    "fields": [
+      { "name": "summary_type", "label": "Summary Type", "datatype": "text" },
+      { "name": "id", "label": "Native ID", "datatype": "int" },
+      {
+        "name": "distribution",
+        "label": "Distribution",
+        "type": "link",
+        "key": "id",
+        "class": "sdist",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "generated_coverage",
+        "label": "Generated Coverage",
+        "datatype": "text"
+      },
+      {
+        "name": "show_generated",
+        "label": "Show Generated?",
+        "datatype": "bool"
+      }
+    ]
+  },
+  "sbsum": {
+    "name": "sbsum",
+    "label": "Basic Issue Summary",
+    "table": "serial.basic_summary",
+    "pkey": "id",
+    "pkey_sequence": "serial.basic_summary_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "distribution",
+        "label": "Distribution",
+        "type": "link",
+        "key": "id",
+        "class": "sdist",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "generated_coverage",
+        "label": "Generated Coverage",
+        "datatype": "text"
+      },
+      {
+        "name": "textual_holdings",
+        "label": "Textual Holdings",
+        "datatype": "text"
+      },
+      {
+        "name": "show_generated",
+        "label": "Show Generated?",
+        "datatype": "bool"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] },
+      "delete": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] }
+    }
+  },
+  "scap": {
+    "name": "scap",
+    "label": "Caption and Pattern",
+    "table": "serial.caption_and_pattern",
+    "pkey": "id",
+    "pkey_sequence": "serial.caption_and_pattern_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "subscription",
+        "label": "Subscription",
+        "type": "link",
+        "key": "id",
+        "class": "ssub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "type", "label": "Type", "datatype": "text" },
+      {
+        "name": "create_date",
+        "label": "Create Date",
+        "datatype": "timestamp"
+      },
+      { "name": "start_date", "label": "Start Date", "datatype": "timestamp" },
+      { "name": "end_date", "label": "End Date", "datatype": "timestamp" },
+      { "name": "active", "label": "Active?", "datatype": "bool" },
+      { "name": "pattern_code", "label": "Pattern Code", "datatype": "text" },
+      { "name": "enum_1", "label": "Enum 1", "datatype": "text" },
+      { "name": "enum_2", "label": "Enum 2", "datatype": "text" },
+      { "name": "enum_3", "label": "Enum 3", "datatype": "text" },
+      { "name": "enum_4", "label": "Enum 4", "datatype": "text" },
+      { "name": "enum_5", "label": "Enum 5", "datatype": "text" },
+      { "name": "enum_6", "label": "Enum 6", "datatype": "text" },
+      { "name": "chron_1", "label": "Chron 1", "datatype": "text" },
+      { "name": "chron_2", "label": "Chron 2", "datatype": "text" },
+      { "name": "chron_3", "label": "Chron 3", "datatype": "text" },
+      { "name": "chron_4", "label": "Chron 4", "datatype": "text" },
+      { "name": "chron_5", "label": "Chron 5", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_CAPTION_PATTERN"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SERIAL_CAPTION_PATTERN"] },
+      "delete": { "perms": ["ADMIN_SERIAL_CAPTION_PATTERN"] }
+    }
+  },
+  "sdist": {
+    "name": "sdist",
+    "label": "Distribution",
+    "table": "serial.distribution",
+    "pkey": "id",
+    "pkey_sequence": "serial.distribution_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "record_entry",
+        "label": "Legacy Record Entry",
+        "type": "link",
+        "key": "id",
+        "class": "sre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "summary_method",
+        "label": "Summary Method",
+        "datatype": "text"
+      },
+      {
+        "name": "subscription",
+        "label": "Subscription",
+        "type": "link",
+        "key": "id",
+        "class": "ssub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "holding_lib",
+        "label": "Holding Lib",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "label", "label": "Label", "datatype": "text" },
+      {
+        "name": "receive_call_number",
+        "label": "Receive Call Number",
+        "type": "link",
+        "key": "id",
+        "class": "acn",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "receive_unit_template",
+        "label": "Receive Unit Template",
+        "type": "link",
+        "key": "id",
+        "class": "act",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "bind_call_number",
+        "label": "Bind Call Number",
+        "type": "link",
+        "key": "id",
+        "class": "acn",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "bind_unit_template",
+        "label": "Bind Unit Template",
+        "type": "link",
+        "key": "id",
+        "class": "act",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "unit_label_prefix",
+        "label": "Unit Label Prefix",
+        "datatype": "text"
+      },
+      {
+        "name": "unit_label_suffix",
+        "label": "Unit Label Suffix",
+        "datatype": "text"
+      },
+      {
+        "name": "display_grouping",
+        "label": "Display Grouping",
+        "datatype": "text"
+      },
+      {
+        "name": "streams",
+        "label": "Streams",
+        "virtual": true,
+        "type": "link",
+        "key": "distribution",
+        "class": "sstr",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "notes",
+        "label": "Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "distribution",
+        "class": "sdistn",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "basic_summary",
+        "label": "Basic Issue Summary",
+        "virtual": true,
+        "type": "link",
+        "key": "distribution",
+        "class": "sbsum",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "supplement_summary",
+        "label": "Supplemental Issue Summary",
+        "virtual": true,
+        "type": "link",
+        "key": "distribution",
+        "class": "sssum",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "index_summary",
+        "label": "Index Issue Summary",
+        "virtual": true,
+        "type": "link",
+        "key": "distribution",
+        "class": "sisum",
+        "reltype": "might_have",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] },
+      "delete": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] }
+    }
+  },
+  "sdistn": {
+    "name": "sdistn",
+    "label": "Distribution Note",
+    "table": "serial.distribution_note",
+    "pkey": "id",
+    "pkey_sequence": "serial.distribution_note_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "distribution",
+        "label": "Distribution",
+        "type": "link",
+        "key": "id",
+        "class": "sdist",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_date",
+        "label": "Create Date",
+        "datatype": "timestamp"
+      },
+      { "name": "pub", "label": "Public?", "datatype": "bool" },
+      { "name": "alert", "label": "Alert?", "datatype": "bool" },
+      { "name": "title", "label": "Title", "datatype": "text" },
+      { "name": "value", "label": "Value", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] },
+      "retrieve": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] },
+      "update": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] },
+      "delete": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] }
+    }
+  },
+  "sin": {
+    "name": "sin",
+    "label": "Item Note",
+    "table": "serial.item_note",
+    "pkey": "id",
+    "pkey_sequence": "serial.item_note_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "item",
+        "label": "Item",
+        "type": "link",
+        "key": "id",
+        "class": "sitem",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_date",
+        "label": "Create Date",
+        "datatype": "timestamp"
+      },
+      { "name": "pub", "label": "Public?", "datatype": "bool" },
+      { "name": "alert", "label": "Alert?", "datatype": "bool" },
+      { "name": "title", "label": "Title", "datatype": "text" },
+      { "name": "value", "label": "Value", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_ITEM"] },
+      "retrieve": { "perms": ["ADMIN_SERIAL_ITEM"] },
+      "update": { "perms": ["ADMIN_SERIAL_ITEM"] },
+      "delete": { "perms": ["ADMIN_SERIAL_ITEM"] }
+    }
+  },
+  "siss": {
+    "name": "siss",
+    "label": "Issuance",
+    "table": "serial.issuance",
+    "pkey": "id",
+    "pkey_sequence": "serial.issuance_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "editor",
+        "label": "Editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_date",
+        "label": "Create Date",
+        "datatype": "timestamp"
+      },
+      { "name": "edit_date", "label": "Edit Date", "datatype": "timestamp" },
+      {
+        "name": "subscription",
+        "label": "Subscription",
+        "type": "link",
+        "key": "id",
+        "class": "ssub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "caption_and_pattern",
+        "label": "Caption/Pattern",
+        "type": "link",
+        "key": "id",
+        "class": "scap",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "label", "label": "Label", "datatype": "text" },
+      {
+        "name": "date_published",
+        "label": "Date Published",
+        "datatype": "timestamp"
+      },
+      { "name": "holding_code", "label": "Holding Code", "datatype": "text" },
+      { "name": "holding_type", "label": "Holding Type", "datatype": "text" },
+      {
+        "name": "holding_link_id",
+        "label": "Holding Link ID",
+        "datatype": "int"
+      },
+      {
+        "name": "items",
+        "label": "Items",
+        "virtual": true,
+        "type": "link",
+        "key": "issuance",
+        "class": "sitem",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_SUBSCRIPTION"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SERIAL_SUBSCRIPTION"] },
+      "delete": { "perms": ["ADMIN_SERIAL_SUBSCRIPTION"] }
+    }
+  },
+  "sisum": {
+    "name": "sisum",
+    "label": "Index Issue Summary",
+    "table": "serial.index_summary",
+    "pkey": "id",
+    "pkey_sequence": "serial.index_summary_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "distribution",
+        "label": "Distribution",
+        "type": "link",
+        "key": "id",
+        "class": "sdist",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "generated_coverage",
+        "label": "Generated Coverage",
+        "datatype": "text"
+      },
+      {
+        "name": "textual_holdings",
+        "label": "Textual Holdings",
+        "datatype": "text"
+      },
+      {
+        "name": "show_generated",
+        "label": "Show Generated?",
+        "datatype": "bool"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] },
+      "delete": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] }
+    }
+  },
+  "sitem": {
+    "name": "sitem",
+    "label": "Item",
+    "table": "serial.item",
+    "pkey": "id",
+    "pkey_sequence": "serial.item_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "editor",
+        "label": "Editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_date",
+        "label": "Create Date",
+        "datatype": "timestamp"
+      },
+      { "name": "edit_date", "label": "Edit Date", "datatype": "timestamp" },
+      {
+        "name": "issuance",
+        "label": "Issuance",
+        "type": "link",
+        "key": "id",
+        "class": "siss",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "stream",
+        "label": "Stream",
+        "type": "link",
+        "key": "id",
+        "class": "sstr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "unit",
+        "label": "Unit",
+        "type": "link",
+        "key": "id",
+        "class": "sunit",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "uri",
+        "label": "URI",
+        "type": "link",
+        "key": "id",
+        "class": "auri",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "date_expected",
+        "label": "Date Expected",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "date_received",
+        "label": "Date Received",
+        "datatype": "timestamp"
+      },
+      { "name": "status", "label": "Status", "datatype": "text" },
+      {
+        "name": "notes",
+        "label": "Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "item",
+        "class": "sin",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "shadowed", "label": "Shadowed?", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_ITEM"] },
+      "retrieve": { "perms": ["ADMIN_SERIAL_ITEM"] },
+      "update": { "perms": ["ADMIN_SERIAL_ITEM"] },
+      "delete": { "perms": ["ADMIN_SERIAL_ITEM"] }
+    }
+  },
+  "smhc": {
+    "name": "smhc",
+    "label": "Materialized Holding Code",
+    "table": "serial.materialized_holding_code",
+    "pkey": "id",
+    "pkey_sequence": "serial.materialized_holding_code_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "issuance",
+        "label": "Issuance",
+        "type": "link",
+        "key": "id",
+        "class": "siss",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "holding_type", "label": "Holding Type", "datatype": "text" },
+      { "name": "ind1", "label": "First Indicator", "datatype": "text" },
+      { "name": "ind2", "label": "Second Indicator", "datatype": "text" },
+      { "name": "subfield", "label": "Subfield", "datatype": "text" },
+      { "name": "value", "label": "Value", "datatype": "text" }
+    ]
+  },
+  "spt": {
+    "name": "spt",
+    "label": "Prediction Pattern Template",
+    "table": "serial.pattern_template",
+    "pkey": "id",
+    "pkey_sequence": "serial.pattern_template_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "name", "label": "Name", "required": true, "datatype": "text" },
+      {
+        "name": "pattern_code",
+        "label": "Pattern Code",
+        "required": true,
+        "datatype": "text"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "share_depth", "label": "Share Depth", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_PATTERN_TEMPLATE"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SERIAL_PATTERN_TEMPLATE"] },
+      "delete": { "perms": ["ADMIN_SERIAL_PATTERN_TEMPLATE"] }
+    }
+  },
+  "sra": {
+    "name": "sra",
+    "label": "Relevance Adjustment",
+    "table": "search.relevance_adjustment",
+    "pkey": "id",
+    "pkey_sequence": "search.relevance_adjustment_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "active", "label": "Active", "datatype": "bool" },
+      {
+        "name": "field",
+        "label": "Index Field",
+        "type": "link",
+        "key": "id",
+        "class": "cmf",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "bump_type", "label": "Bump Type", "datatype": "text" },
+      { "name": "multiplier", "label": "Multiplier", "datatype": "number" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_RELEVANCE_ADJUSTMENT"] },
+      "retrieve": {
+        "perms": [
+          "CREATE_RELEVANCE_ADJUSTMENT",
+          "UPDATE_RELEVANCE_ADJUSTMENT",
+          "DELETE_RELEVANCE_ADJUSTMENT"
+        ]
+      },
+      "update": { "perms": ["UPDATE_RELEVANCE_ADJUSTMENT"] },
+      "delete": { "perms": ["DELETE_RELEVANCE_ADJUSTMENT"] }
+    }
+  },
+  "sre": {
+    "name": "sre",
+    "label": "Serial Record Entry",
+    "table": "serial.record_entry",
+    "pkey": "id",
+    "pkey_sequence": "serial.record_entry_id_seq",
+    "fields": [
+      { "name": "active", "label": "Is Active", "datatype": "bool" },
+      {
+        "name": "record",
+        "label": "Bib Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_date",
+        "label": "Create Date",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "deleted", "label": "Is Deleted", "datatype": "bool" },
+      { "name": "edit_date", "label": "Edit date", "datatype": "timestamp" },
+      {
+        "name": "editor",
+        "label": "Editor",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "last_xact_id",
+        "label": "Last Transaction ID",
+        "datatype": "text"
+      },
+      { "name": "marc", "label": "MARC", "datatype": "text" },
+      { "name": "source", "label": "Source", "datatype": "int" },
+      {
+        "name": "owning_lib",
+        "label": "Owning Org Unit",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_MFHD_RECORD"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_MFHD_RECORD"] },
+      "delete": { "perms": ["DELETE_MFHD_RECORD"] }
+    }
+  },
+  "srlu": {
+    "name": "srlu",
+    "label": "Routing List User",
+    "table": "serial.routing_list_user",
+    "pkey": "id",
+    "pkey_sequence": "serial.routing_list_user_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "stream",
+        "label": "Stream",
+        "type": "link",
+        "key": "id",
+        "class": "sstr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "pos", "label": "Position", "datatype": "int" },
+      {
+        "name": "reader",
+        "label": "Reader",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "department", "label": "Department", "datatype": "text" },
+      { "name": "note", "label": "Note", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_STREAM"] },
+      "retrieve": { "perms": ["RECEIVE_SERIAL"] },
+      "update": { "perms": ["ADMIN_SERIAL_STREAM"] },
+      "delete": { "perms": ["ADMIN_SERIAL_STREAM"] }
+    }
+  },
+  "ssr": {
+    "name": "ssr",
+    "label": "Search Result",
+    "table": "search.search_result",
+    "pkey": "id",
+    "pkey_sequence": "actor.org_unit_proximity_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "rel", "label": "Relevance", "datatype": "float" },
+      { "name": "record", "label": "Record", "datatype": "link" },
+      { "name": "total", "label": "Total Results", "datatype": "int" },
+      { "name": "checked", "label": "Checked", "datatype": "int" },
+      { "name": "visible", "label": "Visible", "datatype": "int" },
+      { "name": "deleted", "label": "Deleted", "datatype": "int" },
+      { "name": "excluded", "label": "Excluded", "datatype": "int" }
+    ]
+  },
+  "sssum": {
+    "name": "sssum",
+    "label": "Supplemental Issue Summary",
+    "table": "serial.supplement_summary",
+    "pkey": "id",
+    "pkey_sequence": "serial.supplement_summary_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "distribution",
+        "label": "Distribution",
+        "type": "link",
+        "key": "id",
+        "class": "sdist",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "generated_coverage",
+        "label": "Generated Coverage",
+        "datatype": "text"
+      },
+      {
+        "name": "textual_holdings",
+        "label": "Textual Holdings",
+        "datatype": "text"
+      },
+      {
+        "name": "show_generated",
+        "label": "Show Generated?",
+        "datatype": "bool"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] },
+      "delete": { "perms": ["ADMIN_SERIAL_DISTRIBUTION"] }
+    }
+  },
+  "sstr": {
+    "name": "sstr",
+    "label": "Stream",
+    "table": "serial.stream",
+    "pkey": "id",
+    "pkey_sequence": "serial.stream_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "distribution",
+        "label": "Distribution",
+        "type": "link",
+        "key": "id",
+        "class": "sdist",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "routing_label", "label": "Routing Label", "datatype": "text" },
+      {
+        "name": "items",
+        "label": "Items",
+        "virtual": true,
+        "type": "link",
+        "key": "stream",
+        "class": "sitem",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "routing_list_users",
+        "label": "Routing List Users",
+        "virtual": true,
+        "type": "link",
+        "key": "stream",
+        "class": "srlu",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_STREAM"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SERIAL_STREAM"] },
+      "delete": { "perms": ["ADMIN_SERIAL_STREAM"] }
+    }
+  },
+  "ssub": {
+    "name": "ssub",
+    "label": "Subscription",
+    "table": "serial.subscription",
+    "pkey": "id",
+    "pkey_sequence": "serial.subscription_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      { "name": "start_date", "label": "Start Date", "datatype": "timestamp" },
+      { "name": "end_date", "label": "End Date", "datatype": "timestamp" },
+      {
+        "name": "record_entry",
+        "label": "Bibliographic Record Entry",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "expected_date_offset",
+        "label": "Expected Date Offset",
+        "datatype": "interval"
+      },
+      {
+        "name": "distributions",
+        "label": "Distributions",
+        "virtual": true,
+        "type": "link",
+        "key": "subscription",
+        "class": "sdist",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "issuances",
+        "label": "Issuances",
+        "virtual": true,
+        "type": "link",
+        "key": "subscription",
+        "class": "siss",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "scaps",
+        "label": "Captions and Patterns",
+        "virtual": true,
+        "type": "link",
+        "key": "subscription",
+        "class": "scap",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "notes",
+        "label": "Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "subscription",
+        "class": "ssubn",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_SUBSCRIPTION"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SERIAL_SUBSCRIPTION"] },
+      "delete": { "perms": ["ADMIN_SERIAL_SUBSCRIPTION"] }
+    }
+  },
+  "ssubn": {
+    "name": "ssubn",
+    "label": "Subscription Note",
+    "table": "serial.subscription_note",
+    "pkey": "id",
+    "pkey_sequence": "serial.subscription_note_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "subscription",
+        "label": "Subscription",
+        "type": "link",
+        "key": "id",
+        "class": "ssub",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_date",
+        "label": "Create Date",
+        "datatype": "timestamp"
+      },
+      { "name": "pub", "label": "Public?", "datatype": "bool" },
+      { "name": "alert", "label": "Alert?", "datatype": "bool" },
+      { "name": "title", "label": "Title", "datatype": "text" },
+      { "name": "value", "label": "Value", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_SERIAL_SUBSCRIPTION"] },
+      "retrieve": {},
+      "update": { "perms": ["ADMIN_SERIAL_SUBSCRIPTION"] },
+      "delete": { "perms": ["ADMIN_SERIAL_SUBSCRIPTION"] }
+    }
+  },
+  "stgba": {
+    "name": "stgba",
+    "label": "Billing Address Stage",
+    "table": "staging.billing_address_stage",
+    "pkey": "row_id",
+    "pkey_sequence": "staging.mailing_address_stage_row_id_seq",
+    "fields": [
+      { "name": "row_id", "label": "Row ID", "datatype": "id" },
+      { "name": "row_date", "label": "Row Date", "datatype": "timestamp" },
+      { "name": "usrname", "label": "User Name", "datatype": "text" },
+      { "name": "street1", "label": "Street (1)", "datatype": "text" },
+      { "name": "street2", "label": "Street (2)", "datatype": "text" },
+      { "name": "city", "label": "City", "datatype": "text" },
+      { "name": "county", "label": "County", "datatype": "text" },
+      { "name": "state", "label": "State", "datatype": "text" },
+      { "name": "country", "label": "Country", "datatype": "text" },
+      { "name": "post_code", "label": "Postal Code", "datatype": "text" },
+      { "name": "complete", "label": "Complete", "datatype": "bool" }
+    ]
+  },
+  "stgc": {
+    "name": "stgc",
+    "label": "Card Stage",
+    "table": "staging.card_stage",
+    "pkey": "row_id",
+    "pkey_sequence": "staging.card_stage_row_id_seq",
+    "fields": [
+      { "name": "row_id", "label": "Row ID", "datatype": "id" },
+      { "name": "row_date", "label": "Row Date", "datatype": "timestamp" },
+      { "name": "usrname", "label": "User Name", "datatype": "text" },
+      { "name": "barcode", "label": "Barcode", "datatype": "text" },
+      { "name": "complete", "label": "Complete", "datatype": "bool" }
+    ]
+  },
+  "stgma": {
+    "name": "stgma",
+    "label": "Mailing Address Stage",
+    "table": "staging.mailing_address_stage",
+    "pkey": "row_id",
+    "pkey_sequence": "staging.mailing_address_stage_row_id_seq",
+    "fields": [
+      { "name": "row_id", "label": "Row ID", "datatype": "id" },
+      { "name": "row_date", "label": "Row Date", "datatype": "timestamp" },
+      { "name": "usrname", "label": "User Name", "datatype": "text" },
+      { "name": "street1", "label": "Street (1)", "datatype": "text" },
+      { "name": "street2", "label": "Street (2)", "datatype": "text" },
+      { "name": "city", "label": "City", "datatype": "text" },
+      { "name": "county", "label": "County", "datatype": "text" },
+      { "name": "state", "label": "State", "datatype": "text" },
+      { "name": "country", "label": "Country", "datatype": "text" },
+      { "name": "post_code", "label": "Postal Code", "datatype": "text" },
+      { "name": "complete", "label": "Complete", "datatype": "bool" }
+    ]
+  },
+  "stgs": {
+    "name": "stgs",
+    "label": "User Setting Stage",
+    "table": "staging.setting_stage",
+    "pkey": "row_id",
+    "pkey_sequence": "staging.setting_stage_row_id_seq",
+    "fields": [
+      { "name": "row_id", "label": "Row ID", "datatype": "id" },
+      { "name": "row_date", "label": "Row Date", "datatype": "timestamp" },
+      { "name": "usrname", "label": "User Name", "datatype": "text" },
+      { "name": "setting", "label": "User Setting Code", "datatype": "text" },
+      { "name": "value", "label": "User Setting Value", "datatype": "text" },
+      { "name": "complete", "label": "Complete", "datatype": "bool" }
+    ]
+  },
+  "stgsc": {
+    "name": "stgsc",
+    "label": "Statistical Category Stage",
+    "table": "staging.statcat_stage",
+    "pkey": "row_id",
+    "pkey_sequence": "staging.statcat_stage_row_id_seq",
+    "fields": [
+      { "name": "row_id", "label": "Row ID", "datatype": "id" },
+      { "name": "row_date", "label": "Row Date", "datatype": "timestamp" },
+      { "name": "usrname", "label": "User Name", "datatype": "text" },
+      { "name": "statcat", "label": "Stat Cat ID", "datatype": "text" },
+      { "name": "value", "label": "Stat Cat Value", "datatype": "text" },
+      { "name": "complete", "label": "Complete", "datatype": "bool" }
+    ]
+  },
+  "stgu": {
+    "name": "stgu",
+    "label": "User Stage",
+    "table": "staging.user_stage",
+    "pkey": "row_id",
+    "pkey_sequence": "staging.user_stage_row_id_seq",
+    "fields": [
+      { "name": "row_id", "label": "Row ID", "datatype": "id" },
+      { "name": "row_date", "label": "Create Date", "datatype": "timestamp" },
+      { "name": "usrname", "label": "User Name", "datatype": "text" },
+      {
+        "name": "profile",
+        "label": "Main (Profile) Permission Group",
+        "datatype": "text"
+      },
+      { "name": "email", "label": "Email Address", "datatype": "text" },
+      { "name": "passwd", "label": "Password", "datatype": "text" },
+      {
+        "name": "ident_type",
+        "label": "Primary Identification Type",
+        "datatype": "int"
+      },
+      { "name": "first_given_name", "label": "First Name", "datatype": "text" },
+      {
+        "name": "second_given_name",
+        "label": "Middle Name",
+        "datatype": "text"
+      },
+      { "name": "family_name", "label": "Last Name", "datatype": "text" },
+      { "name": "day_phone", "label": "Daytime Phone", "datatype": "text" },
+      { "name": "evening_phone", "label": "Evening Phone", "datatype": "text" },
+      { "name": "home_ou", "label": "Home Library", "datatype": "int" },
+      { "name": "dob", "label": "Date of Birth", "datatype": "text" },
+      { "name": "complete", "label": "Complete", "datatype": "bool" },
+      {
+        "name": "requesting_usr",
+        "label": "Requesting User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "pref_first_given_name",
+        "label": "Preferred First Name",
+        "datatype": "text"
+      },
+      {
+        "name": "pref_second_given_name",
+        "label": "Preferred Middle Name",
+        "datatype": "text"
+      },
+      {
+        "name": "pref_family_name",
+        "label": "Preferred Last Name",
+        "datatype": "text"
+      }
+    ]
+  },
+  "sunit": {
+    "name": "sunit",
+    "label": "Unit",
+    "table": "serial.unit",
+    "pkey": "id",
+    "pkey_sequence": "asset.copy_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      {
+        "name": "age_protect",
+        "label": "Age Hold Protection",
+        "type": "link",
+        "key": "id",
+        "class": "crahp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "alert_message", "label": "Alert Message", "datatype": "text" },
+      { "name": "barcode", "label": "Barcode", "datatype": "text" },
+      {
+        "name": "call_number",
+        "label": "Call Number/Volume",
+        "type": "link",
+        "key": "id",
+        "class": "acn",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "circ_as_type",
+        "label": "Circulation Type (MARC)",
+        "datatype": "text"
+      },
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "circ_modifier",
+        "label": "Circulation Modifier",
+        "type": "link",
+        "key": "code",
+        "class": "ccm",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "circulate", "label": "Can Circulate", "datatype": "bool" },
+      {
+        "name": "copy_number",
+        "label": "Copy Number on Volume",
+        "datatype": "text"
+      },
+      {
+        "name": "create_date",
+        "label": "Creation Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "active_date",
+        "label": "Active Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "creator",
+        "label": "Creating User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "deleted", "label": "Is Deleted", "datatype": "bool" },
+      { "name": "dummy_isbn", "label": "Dummy ISBN", "datatype": "text" },
+      { "name": "deposit", "label": "Is Deposit Required", "datatype": "bool" },
+      {
+        "name": "deposit_amount",
+        "label": "Deposit Amount",
+        "datatype": "money"
+      },
+      {
+        "name": "dummy_author",
+        "label": "Precat Dummy Author",
+        "datatype": "text"
+      },
+      {
+        "name": "dummy_title",
+        "label": "Precat Dummy Title",
+        "datatype": "text"
+      },
+      {
+        "name": "edit_date",
+        "label": "Last Edit Date/Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "editor",
+        "label": "Last Editing User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "fine_level", "label": "Fine Level", "datatype": "int" },
+      { "name": "holdable", "label": "Is Holdable", "datatype": "bool" },
+      { "name": "loan_duration", "label": "Loan Duration", "datatype": "int" },
+      {
+        "name": "location",
+        "label": "Shelving Location",
+        "type": "link",
+        "key": "id",
+        "class": "acpl",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "opac_visible", "label": "OPAC Visible", "datatype": "bool" },
+      { "name": "price", "label": "Price", "datatype": "money" },
+      { "name": "ref", "label": "Is Reference", "datatype": "bool" },
+      {
+        "name": "status",
+        "label": "Copy Status",
+        "type": "link",
+        "key": "id",
+        "class": "ccs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "status_changed_time",
+        "label": "Copy Status Changed Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "mint_condition",
+        "label": "Is Mint Condition",
+        "datatype": "bool"
+      },
+      {
+        "name": "floating",
+        "label": "Floating Group",
+        "type": "link",
+        "key": "id",
+        "class": "cfg",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "cost", "label": "Cost", "datatype": "money" },
+      { "name": "sort_key", "label": "Sort Key", "datatype": "text" },
+      {
+        "name": "summary_contents",
+        "label": "Summary Contents",
+        "datatype": "text"
+      },
+      {
+        "name": "detailed_contents",
+        "label": "Detailed Contents",
+        "datatype": "text"
+      },
+      {
+        "name": "notes",
+        "label": "Copy Notes",
+        "virtual": true,
+        "type": "link",
+        "key": "owning_copy",
+        "class": "acpn",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat_entry_copy_maps",
+        "label": "Stat-Cat entry maps",
+        "virtual": true,
+        "type": "link",
+        "key": "owning_copy",
+        "class": "ascecm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "circulations",
+        "label": "Circulations",
+        "virtual": true,
+        "type": "link",
+        "key": "target_copy",
+        "class": "circ",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "total_circ_count",
+        "label": "Total Circulations",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "erfcc",
+        "reltype": "might_have",
+        "datatype": "link"
+      },
+      {
+        "name": "holds",
+        "label": "Holds",
+        "virtual": true,
+        "type": "link",
+        "key": "target_copy",
+        "class": "ahcm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "stat_cat_entries",
+        "label": "Statistical Category Entries",
+        "virtual": true,
+        "type": "link",
+        "key": "owning_copy",
+        "class": "ascecm",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["RECEIVE_SERIAL", "ADMIN_SERIAL_SUBSCRIPTION"] },
+      "retrieve": {},
+      "update": { "perms": ["RECEIVE_SERIAL", "ADMIN_SERIAL_SUBSCRIPTION"] },
+      "delete": { "perms": ["RECEIVE_SERIAL", "ADMIN_SERIAL_SUBSCRIPTION"] }
+    }
+  },
+  "svr": {
+    "name": "svr",
+    "label": "Serial Virtual Record",
+    "virtual": true,
+    "fields": [
+      { "name": "sre_id", "virtual": true, "datatype": "text" },
+      { "name": "location", "virtual": true, "datatype": "text" },
+      { "name": "owning_lib", "virtual": true, "datatype": "text" },
+      { "name": "basic_holdings", "virtual": true, "datatype": "text" },
+      { "name": "basic_holdings_add", "virtual": true, "datatype": "text" },
+      { "name": "supplement_holdings", "virtual": true, "datatype": "text" },
+      {
+        "name": "supplement_holdings_add",
+        "virtual": true,
+        "datatype": "text"
+      },
+      { "name": "index_holdings", "virtual": true, "datatype": "text" },
+      { "name": "index_holdings_add", "virtual": true, "datatype": "text" },
+      { "name": "online", "virtual": true, "datatype": "text" },
+      { "name": "missing", "virtual": true, "datatype": "text" },
+      { "name": "incomplete", "virtual": true, "datatype": "text" }
+    ]
+  },
+  "uvs": {
+    "name": "uvs",
+    "label": "URL Verification Session",
+    "table": "url_verify.session",
+    "pkey": "id",
+    "pkey_sequence": "url_verify.session_id_seq",
+    "fields": [
+      { "name": "id", "label": "Session ID", "datatype": "id" },
+      { "name": "name", "label": "Name", "required": true, "datatype": "text" },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "creator",
+        "label": "Creator",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "container",
+        "label": "Record Container",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "cbreb",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "create_time",
+        "label": "Create Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "search",
+        "label": "Search Constraints",
+        "required": true,
+        "datatype": "text"
+      },
+      {
+        "name": "selectors",
+        "label": "URL Selectors",
+        "virtual": true,
+        "type": "link",
+        "key": "session",
+        "class": "uvus",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "attempts",
+        "label": "Verification Attempts",
+        "virtual": true,
+        "type": "link",
+        "key": "session",
+        "class": "uvva",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["URL_VERIFY"] } }
+  },
+  "uvsbrem": {
+    "name": "uvsbrem",
+    "label": "URL Verify Session Biblio Record Entry Map",
+    "source": "( SELECT cbrebi.id AS id, uvs.id AS session, uvs.owning_lib, cbrebi.target_biblio_record_entry FROM url_verify.session uvs JOIN container.biblio_record_entry_bucket cbreb ON (uvs.container = cbreb.id) JOIN container.biblio_record_entry_bucket_item cbrebi ON (cbrebi.bucket = cbreb.id) )",
+    "pkey": "id",
+    "pkey_sequence": "container.biblio_record_entry_bucket_item_id_seq",
+    "fields": [
+      { "name": "id", "label": "Bucket Item ID", "datatype": "id" },
+      {
+        "name": "session",
+        "label": "Session",
+        "type": "link",
+        "key": "id",
+        "class": "uvs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "owning_lib",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "org_unit"
+      },
+      {
+        "name": "target_biblio_record_entry",
+        "label": "Target Biblio Record Entry",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": { "retrieve": { "perms": ["URL_VERIFY"] } }
+  },
+  "uvu": {
+    "name": "uvu",
+    "label": "URL Verification URL",
+    "table": "url_verify.url",
+    "pkey": "id",
+    "pkey_sequence": "url_verify.url_id_seq",
+    "fields": [
+      { "name": "id", "label": "URL ID", "datatype": "id" },
+      {
+        "name": "redirect_from",
+        "label": "Redirected From",
+        "type": "link",
+        "key": "id",
+        "class": "uvu",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "item",
+        "label": "Container Item",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "uvsbrem",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "session",
+        "label": "Session",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "uvs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "url_selector",
+        "label": "URL Selector",
+        "type": "link",
+        "key": "id",
+        "class": "uvus",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "tag", "label": "Tag", "datatype": "text" },
+      { "name": "subfield", "label": "Subfield", "datatype": "text" },
+      { "name": "ord", "label": "Ordinal Position", "datatype": "int" },
+      { "name": "full_url", "label": "URL", "datatype": "text" },
+      { "name": "scheme", "label": "Scheme", "datatype": "text" },
+      { "name": "host", "label": "Host", "datatype": "text" },
+      { "name": "domain", "label": "Domain", "datatype": "text" },
+      { "name": "tld", "label": "TLD", "datatype": "text" },
+      { "name": "path", "label": "Path", "datatype": "text" },
+      { "name": "page", "label": "Page", "datatype": "text" },
+      { "name": "query", "label": "Query", "datatype": "text" },
+      { "name": "fragment", "label": "Fragment", "datatype": "text" },
+      {
+        "name": "verifications",
+        "label": "Verifications",
+        "virtual": true,
+        "type": "link",
+        "key": "url",
+        "class": "uvuv",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["URL_VERIFY"] },
+      "retrieve": { "perms": ["URL_VERIFY"] },
+      "update": { "perms": ["URL_VERIFY"] },
+      "delete": { "perms": ["URL_VERIFY"] }
+    }
+  },
+  "uvus": {
+    "name": "uvus",
+    "label": "URL Verification URL Selector",
+    "table": "url_verify.url_selector",
+    "pkey": "id",
+    "pkey_sequence": "url_verify.url_selector_id_seq",
+    "fields": [
+      { "name": "id", "label": "URL Selector ID", "datatype": "id" },
+      {
+        "name": "xpath",
+        "label": "XPath",
+        "required": true,
+        "datatype": "text"
+      },
+      {
+        "name": "session",
+        "label": "Session",
+        "required": true,
+        "type": "link",
+        "key": "id",
+        "class": "uvs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "urls",
+        "label": "URLs",
+        "virtual": true,
+        "type": "link",
+        "key": "id",
+        "class": "uvu",
+        "reltype": "has_many",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["URL_VERIFY"] },
+      "retrieve": { "perms": ["URL_VERIFY"] },
+      "update": { "perms": ["URL_VERIFY"] },
+      "delete": { "perms": ["URL_VERIFY"] }
+    }
+  },
+  "uvuv": {
+    "name": "uvuv",
+    "label": "URL Verification",
+    "table": "url_verify.url_verification",
+    "pkey": "id",
+    "pkey_sequence": "url_verify.url_verification_id_seq",
+    "fields": [
+      { "name": "id", "label": "Verification ID", "datatype": "id" },
+      {
+        "name": "url",
+        "label": "URL",
+        "type": "link",
+        "key": "id",
+        "class": "uvu",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "attempt",
+        "label": "Attempt",
+        "type": "link",
+        "key": "id",
+        "class": "uvva",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "req_time", "label": "Request Time", "datatype": "timestamp" },
+      { "name": "res_time", "label": "Result Time", "datatype": "timestamp" },
+      { "name": "res_code", "label": "Result Code", "datatype": "int" },
+      { "name": "res_text", "label": "Result Text", "datatype": "text" },
+      {
+        "name": "redirect_to",
+        "label": "Redirected To",
+        "type": "link",
+        "key": "id",
+        "class": "uvu",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["URL_VERIFY"] },
+      "retrieve": { "perms": ["URL_VERIFY"] },
+      "update": { "perms": ["URL_VERIFY"] },
+      "delete": { "perms": ["URL_VERIFY"] }
+    }
+  },
+  "uvva": {
+    "name": "uvva",
+    "label": "URL Verification Attempt",
+    "table": "url_verify.verification_attempt",
+    "pkey": "id",
+    "pkey_sequence": "url_verify.verification_attempt_id_seq",
+    "fields": [
+      { "name": "id", "label": "Attempt ID", "datatype": "id" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "session",
+        "label": "Session",
+        "type": "link",
+        "key": "id",
+        "class": "uvs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "start_time", "label": "Start Time", "datatype": "timestamp" },
+      { "name": "finish_time", "label": "Finish Time", "datatype": "timestamp" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["URL_VERIFY"] },
+      "retrieve": { "perms": ["URL_VERIFY"] },
+      "update": { "perms": ["URL_VERIFY"] },
+      "delete": { "perms": ["URL_VERIFY"] }
+    }
+  },
+  "vam": {
+    "name": "vam",
+    "label": "Queued Authority Record Match",
+    "table": "vandelay.authority_match",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.authority_match_id_seq",
+    "fields": [
+      { "name": "id", "label": "Match ID", "datatype": "id" },
+      {
+        "name": "queued_record",
+        "label": "Queued Record",
+        "type": "link",
+        "key": "id",
+        "class": "vqar",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "eg_record",
+        "label": "Evergreen Record",
+        "type": "link",
+        "key": "id",
+        "class": "are",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "quality", "label": "Quality", "datatype": "int" },
+      { "name": "match_score", "label": "Match Score", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_IMPORT_QUEUE"] },
+      "retrieve": {
+        "perms": [
+          "CREATE_AUTHORITY_IMPORT_QUEUE",
+          "UPDATE_AUTHORITY_IMPORT_QUEUE",
+          "DELETE_AUTHORITY_IMPORT_QUEUE"
+        ]
+      },
+      "update": { "perms": ["UPDATE_AUTHORITY_IMPORT_QUEUE"] },
+      "delete": { "perms": ["DELETE_AUTHORITY_IMPORT_QUEUE"] }
+    }
+  },
+  "vaq": {
+    "name": "vaq",
+    "label": "Import/Overlay Authority Queue",
+    "table": "vandelay.authority_queue",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.queue_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Queue ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      { "name": "complete", "label": "Complete", "datatype": "bool" },
+      { "name": "queue_type", "label": "Type", "datatype": "text" },
+      {
+        "name": "match_set",
+        "label": "Match Set",
+        "type": "link",
+        "key": "id",
+        "class": "vms",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_IMPORT_QUEUE"] },
+      "retrieve": {
+        "perms": [
+          "CREATE_AUTHORITY_IMPORT_QUEUE",
+          "UPDATE_AUTHORITY_IMPORT_QUEUE",
+          "DELETE_AUTHORITY_IMPORT_QUEUE"
+        ]
+      },
+      "update": { "perms": ["UPDATE_AUTHORITY_IMPORT_QUEUE"] },
+      "delete": { "perms": ["DELETE_AUTHORITY_IMPORT_QUEUE"] }
+    }
+  },
+  "vbm": {
+    "name": "vbm",
+    "label": "Queued Bib Record Match",
+    "table": "vandelay.bib_match",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.bib_match_id_seq",
+    "fields": [
+      { "name": "id", "label": "Match ID", "datatype": "id" },
+      {
+        "name": "queued_record",
+        "label": "Queued Record",
+        "type": "link",
+        "key": "id",
+        "class": "vqbr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "eg_record",
+        "label": "Evergreen Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "quality", "label": "Quality", "datatype": "text" },
+      { "name": "match_score", "label": "Match Score", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_BIB_IMPORT_QUEUE"] },
+      "retrieve": {
+        "perms": [
+          "CREATE_BIB_IMPORT_QUEUE",
+          "UPDATE_BIB_IMPORT_QUEUE",
+          "DELETE_BIB_IMPORT_QUEUE"
+        ]
+      },
+      "update": { "perms": ["UPDATE_BIB_IMPORT_QUEUE"] },
+      "delete": { "perms": ["DELETE_BIB_IMPORT_QUEUE"] }
+    }
+  },
+  "vbq": {
+    "name": "vbq",
+    "label": "Import/Overlay Bib Queue",
+    "table": "vandelay.bib_queue",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.queue_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Queue ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      { "name": "complete", "label": "Complete", "datatype": "bool" },
+      { "name": "queue_type", "label": "Type", "datatype": "text" },
+      {
+        "name": "match_set",
+        "label": "Match Set",
+        "type": "link",
+        "key": "id",
+        "class": "vms",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "item_attr_def",
+        "label": "Item Import Attribute Definition",
+        "type": "link",
+        "key": "id",
+        "class": "viiad",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "match_bucket",
+        "label": "Match Bucket",
+        "type": "link",
+        "key": "id",
+        "class": "cbreb",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_BIB_IMPORT_QUEUE"] },
+      "retrieve": {
+        "perms": [
+          "CREATE_BIB_IMPORT_QUEUE",
+          "UPDATE_BIB_IMPORT_QUEUE",
+          "DELETE_BIB_IMPORT_QUEUE"
+        ]
+      },
+      "update": { "perms": ["UPDATE_BIB_IMPORT_QUEUE"] },
+      "delete": { "perms": ["DELETE_BIB_IMPORT_QUEUE"] }
+    }
+  },
+  "vibtf": {
+    "name": "vibtf",
+    "label": "Import/Overlay Fields for Removal",
+    "table": "vandelay.import_bib_trash_fields",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.import_bib_trash_fields_id_seq",
+    "fields": [
+      { "name": "id", "label": "Field ID", "datatype": "id" },
+      {
+        "name": "grp",
+        "label": "Group",
+        "type": "link",
+        "key": "id",
+        "class": "vibtg",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "field", "label": "Field", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_IMPORT_TRASH_FIELD"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_IMPORT_TRASH_FIELD"] },
+      "delete": { "perms": ["DELETE_IMPORT_TRASH_FIELD"] }
+    }
+  },
+  "vibtg": {
+    "name": "vibtg",
+    "label": "Import/Overlay Field Groups for Removal",
+    "table": "vandelay.import_bib_trash_group",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.import_bib_trash_group_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "selector": "name", "datatype": "id" },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "label", "label": "Label", "datatype": "text" },
+      { "name": "always_apply", "label": "Always Apply", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_IMPORT_TRASH_FIELD"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_IMPORT_TRASH_FIELD"] },
+      "delete": { "perms": ["DELETE_IMPORT_TRASH_FIELD"] }
+    }
+  },
+  "vie": {
+    "name": "vie",
+    "label": "Import/Overlay Error Definitions",
+    "table": "vandelay.import_error",
+    "pkey": "code",
+    "fields": [
+      {
+        "name": "code",
+        "label": "Error Code",
+        "selector": "description",
+        "datatype": "id"
+      },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      }
+    ],
+    "permacrud": { "retrieve": {} }
+  },
+  "vii": {
+    "name": "vii",
+    "label": "Import Item",
+    "table": "vandelay.import_item",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.import_item_id_seq",
+    "fields": [
+      { "name": "id", "label": "Import Item ID", "datatype": "id" },
+      {
+        "name": "record",
+        "label": "Import Record",
+        "type": "link",
+        "key": "id",
+        "class": "vqbr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "definition",
+        "label": "Attribute Definition",
+        "type": "link",
+        "key": "id",
+        "class": "viiad",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "import_error",
+        "label": "Import Error",
+        "type": "link",
+        "key": "code",
+        "class": "vie",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "error_detail",
+        "label": "Import Error Detail",
+        "datatype": "text"
+      },
+      {
+        "name": "imported_as",
+        "label": "Final Target Copy",
+        "type": "link",
+        "key": "id",
+        "class": "acp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "import_time",
+        "label": "Import Time",
+        "datatype": "timestamp"
+      },
+      { "name": "owning_lib", "label": "Owning Library", "datatype": "int" },
+      { "name": "circ_lib", "label": "Circulating Library", "datatype": "int" },
+      { "name": "call_number", "label": "Call Number", "datatype": "text" },
+      { "name": "copy_number", "label": "Copy Number", "datatype": "int" },
+      { "name": "status", "label": "Status", "datatype": "int" },
+      { "name": "location", "label": "Shelving Location", "datatype": "int" },
+      { "name": "circulate", "label": "Circulate", "datatype": "bool" },
+      { "name": "deposit", "label": "Deposit", "datatype": "bool" },
+      {
+        "name": "deposit_amount",
+        "label": "Deposit Amount",
+        "datatype": "money"
+      },
+      { "name": "ref", "label": "Reference", "datatype": "bool" },
+      { "name": "holdable", "label": "Holdable", "datatype": "bool" },
+      { "name": "price", "label": "Price", "datatype": "money" },
+      { "name": "barcode", "label": "Barcode", "datatype": "text" },
+      {
+        "name": "circ_modifier",
+        "label": "Circulation Modifier",
+        "datatype": "text"
+      },
+      {
+        "name": "circ_as_type",
+        "label": "Circulate As MARC Type",
+        "datatype": "text"
+      },
+      { "name": "alert_message", "label": "Alert Message", "datatype": "text" },
+      { "name": "pub_note", "label": "Public Note", "datatype": "text" },
+      { "name": "priv_note", "label": "Private Note", "datatype": "text" },
+      { "name": "opac_visible", "label": "OPAC Visible", "datatype": "bool" },
+      { "name": "internal_id", "label": "Overlay Match ID", "datatype": "int" },
+      { "name": "stat_cat_data", "label": "Stat Cat Data", "datatype": "text" },
+      { "name": "parts_data", "label": "Parts Data", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_IMPORT_ITEM"] },
+      "retrieve": {
+        "perms": [
+          "CREATE_IMPORT_ITEM",
+          "UPDATE_IMPORT_ITEM",
+          "DELETE_IMPORT_ITEM"
+        ]
+      },
+      "update": { "perms": ["UPDATE_IMPORT_ITEM"] },
+      "delete": { "perms": ["DELETE_IMPORT_ITEM"] }
+    }
+  },
+  "viiad": {
+    "name": "viiad",
+    "label": "Import Item Attribute Definition",
+    "table": "vandelay.import_item_attr_definition",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.import_item_attr_definition_id_seq",
+    "fields": [
+      { "name": "id", "label": "Definition ID", "datatype": "id" },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      { "name": "tag", "label": "Tag", "datatype": "text" },
+      { "name": "owning_lib", "label": "Owning Library", "datatype": "text" },
+      {
+        "name": "circ_lib",
+        "label": "Circulating Library",
+        "datatype": "text"
+      },
+      { "name": "call_number", "label": "Call Number", "datatype": "text" },
+      { "name": "status", "label": "Status", "datatype": "text" },
+      { "name": "location", "label": "Shelving Location", "datatype": "text" },
+      { "name": "circulate", "label": "Circulate", "datatype": "text" },
+      { "name": "deposit", "label": "Deposit", "datatype": "text" },
+      {
+        "name": "deposit_amount",
+        "label": "Deposit Amount",
+        "datatype": "text"
+      },
+      { "name": "ref", "label": "Reference", "datatype": "text" },
+      { "name": "holdable", "label": "Holdable", "datatype": "text" },
+      { "name": "price", "label": "Price", "datatype": "text" },
+      { "name": "barcode", "label": "Barcode", "datatype": "text" },
+      {
+        "name": "circ_modifier",
+        "label": "Circulation Modifier",
+        "datatype": "text"
+      },
+      {
+        "name": "circ_as_type",
+        "label": "Circulate As MARC Type",
+        "datatype": "text"
+      },
+      { "name": "alert_message", "label": "Alert Message", "datatype": "text" },
+      { "name": "pub_note", "label": "Public Note", "datatype": "text" },
+      { "name": "priv_note", "label": "Private Note", "datatype": "text" },
+      { "name": "opac_visible", "label": "OPAC Visible", "datatype": "text" },
+      { "name": "copy_number", "label": "Copy Number", "datatype": "text" },
+      {
+        "name": "internal_id",
+        "label": "Overlay Match ID",
+        "datatype": "text"
+      },
+      { "name": "stat_cat_data", "label": "Stat Cat Data", "datatype": "text" },
+      { "name": "parts_data", "label": "Parts Data", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": {
+        "perms": ["CREATE_IMPORT_ITEM_ATTR_DEF", "ADMIN_IMPORT_ITEM_ATTR_DEF"]
+      },
+      "retrieve": {
+        "perms": [
+          "CREATE_IMPORT_ITEM_ATTR_DEF",
+          "UPDATE_IMPORT_ITEM_ATTR_DEF",
+          "DELETE_IMPORT_ITEM_ATTR_DEF",
+          "ADMIN_IMPORT_ITEM_ATTR_DEF"
+        ]
+      },
+      "update": {
+        "perms": ["UPDATE_IMPORT_ITEM_ATTR_DEF", "ADMIN_IMPORT_ITEM_ATTR_DEF"]
+      },
+      "delete": {
+        "perms": ["DELETE_IMPORT_ITEM_ATTR_DEF", "ADMIN_IMPORT_ITEM_ATTR_DEF"]
+      }
+    }
+  },
+  "vmp": {
+    "name": "vmp",
+    "label": "Bib Import Merge Profile",
+    "table": "vandelay.merge_profile",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.merge_profile_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Field ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      {
+        "name": "owner",
+        "label": "Owner",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "name", "label": "Name", "i18n": true, "datatype": "text" },
+      { "name": "add_spec", "label": "Add Specification", "datatype": "text" },
+      {
+        "name": "replace_spec",
+        "label": "Replace Specification",
+        "datatype": "text"
+      },
+      {
+        "name": "strip_spec",
+        "label": "Remove Specification",
+        "datatype": "text"
+      },
+      {
+        "name": "preserve_spec",
+        "label": "Preserve Specification",
+        "datatype": "text"
+      },
+      {
+        "name": "lwm_ratio",
+        "label": "Min. Quality Ratio",
+        "datatype": "float"
+      },
+      {
+        "name": "update_bib_source",
+        "label": "Update Bib. Source",
+        "datatype": "bool"
+      }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_MERGE_PROFILE", "CREATE_MERGE_PROFILE"] },
+      "retrieve": {
+        "perms": [
+          "ADMIN_MERGE_PROFILE",
+          "CREATE_MERGE_PROFILE",
+          "UPDATE_MERGE_PROFILE",
+          "DELETE_MERGE_PROFILE",
+          "VIEW_MERGE_PROFILE"
+        ]
+      },
+      "update": { "perms": ["ADMIN_MERGE_PROFILE", "UPDATE_MERGE_PROFILE"] },
+      "delete": { "perms": ["ADMIN_MERGE_PROFILE", "DELETE_MERGE_PROFILE"] }
+    }
+  },
+  "vms": {
+    "name": "vms",
+    "label": "Record Matching Definition Set",
+    "table": "vandelay.match_set",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.match_set_id_seq",
+    "fields": [
+      {
+        "name": "id",
+        "label": "Match Set ID",
+        "selector": "name",
+        "datatype": "id"
+      },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      {
+        "name": "owner",
+        "label": "Owning Library",
+        "type": "link",
+        "key": "id",
+        "class": "aou",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "mtype", "label": "Match Set Type", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_IMPORT_MATCH_SET"] },
+      "retrieve": {
+        "perms": ["ADMIN_IMPORT_MATCH_SET", "VIEW_IMPORT_MATCH_SET"]
+      },
+      "update": { "perms": ["ADMIN_IMPORT_MATCH_SET"] },
+      "delete": { "perms": ["ADMIN_IMPORT_MATCH_SET"] }
+    }
+  },
+  "vmsp": {
+    "name": "vmsp",
+    "label": "Record Matching Definition",
+    "table": "vandelay.match_set_point",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.match_set_point_id_seq",
+    "fields": [
+      { "name": "id", "label": "Match Definition ID", "datatype": "id" },
+      {
+        "name": "parent",
+        "label": "Expression Tree Parent",
+        "type": "link",
+        "key": "id",
+        "class": "vmsp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "match_set",
+        "label": "Match Set",
+        "type": "link",
+        "key": "id",
+        "class": "vms",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "bool_op", "label": "Boolean Operator", "datatype": "text" },
+      {
+        "name": "svf",
+        "label": "Coded Field",
+        "type": "link",
+        "key": "id",
+        "class": "crad",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "tag", "label": "Tag", "datatype": "text" },
+      { "name": "subfield", "label": "Subfield", "datatype": "text" },
+      { "name": "negate", "label": "Negate", "datatype": "bool" },
+      { "name": "quality", "label": "Importance", "datatype": "int" },
+      {
+        "name": "children",
+        "label": "Expression Tree Children",
+        "virtual": true,
+        "type": "link",
+        "key": "parent",
+        "class": "vmsp",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "heading", "label": "Authority Heading", "datatype": "bool" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_IMPORT_MATCH_SET"] },
+      "retrieve": {
+        "perms": ["ADMIN_IMPORT_MATCH_SET", "VIEW_IMPORT_MATCH_SET"]
+      },
+      "update": { "perms": ["ADMIN_IMPORT_MATCH_SET"] },
+      "delete": { "perms": ["ADMIN_IMPORT_MATCH_SET"] }
+    }
+  },
+  "vmsq": {
+    "name": "vmsq",
+    "label": "Record Quality Metric",
+    "table": "vandelay.match_set_quality",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.match_set_quality_id_seq",
+    "fields": [
+      { "name": "id", "label": "Quality Metric ID", "datatype": "id" },
+      {
+        "name": "match_set",
+        "label": "Match Set",
+        "type": "link",
+        "key": "id",
+        "class": "vms",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "svf", "label": "Record Attribute", "datatype": "text" },
+      { "name": "tag", "label": "Tag", "datatype": "text" },
+      { "name": "subfield", "label": "Subfield", "datatype": "text" },
+      { "name": "value", "label": "Value", "datatype": "text" },
+      { "name": "quality", "label": "Quality", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["ADMIN_IMPORT_MATCH_SET"] },
+      "retrieve": { "perms": ["ADMIN_IMPORT_MATCH_SET"] },
+      "update": { "perms": ["ADMIN_IMPORT_MATCH_SET"] },
+      "delete": { "perms": ["ADMIN_IMPORT_MATCH_SET"] }
+    }
+  },
+  "vqar": {
+    "name": "vqar",
+    "label": "Queued Authority Record",
+    "table": "vandelay.queued_authority_record",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.queued_record_id_seq",
+    "fields": [
+      { "name": "id", "label": "Record ID", "datatype": "id" },
+      {
+        "name": "create_time",
+        "label": "Create Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "import_time",
+        "label": "Import Time",
+        "datatype": "timestamp"
+      },
+      { "name": "marc", "label": "MARC", "datatype": "text" },
+      {
+        "name": "queue",
+        "label": "Queue",
+        "type": "link",
+        "key": "id",
+        "class": "vaq",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "imported_as",
+        "label": "Final Target Record",
+        "type": "link",
+        "key": "id",
+        "class": "are",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "import_error",
+        "label": "Import Error",
+        "type": "link",
+        "key": "code",
+        "class": "vie",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "error_detail",
+        "label": "Import Error Detail",
+        "datatype": "text"
+      },
+      { "name": "purpose", "label": "Purpose", "datatype": "text" },
+      {
+        "name": "attributes",
+        "label": "Attributes",
+        "virtual": true,
+        "type": "link",
+        "key": "record",
+        "class": "vqara",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "matches",
+        "label": "Matches",
+        "virtual": true,
+        "type": "link",
+        "key": "queued_record",
+        "class": "vam",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "quality", "label": "Quality", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_IMPORT_QUEUE"] },
+      "retrieve": {
+        "perms": [
+          "CREATE_AUTHORITY_IMPORT_QUEUE",
+          "UPDATE_AUTHORITY_IMPORT_QUEUE",
+          "DELETE_AUTHORITY_IMPORT_QUEUE"
+        ]
+      },
+      "update": { "perms": ["UPDATE_AUTHORITY_IMPORT_QUEUE"] },
+      "delete": { "perms": ["DELETE_AUTHORITY_IMPORT_QUEUE"] }
+    }
+  },
+  "vqara": {
+    "name": "vqara",
+    "label": "Queued Authority Record Attribute",
+    "table": "vandelay.queued_authority_record_attr",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.queued_authority_record_attr_id_seq",
+    "fields": [
+      { "name": "id", "label": "Attribute ID", "datatype": "id" },
+      {
+        "name": "record",
+        "label": "Record",
+        "type": "link",
+        "key": "id",
+        "class": "vqar",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "field",
+        "label": "Field",
+        "type": "link",
+        "key": "id",
+        "class": "vqarad",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "attr_value", "label": "Value", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_IMPORT_QUEUE"] },
+      "retrieve": {
+        "perms": [
+          "CREATE_AUTHORITY_IMPORT_QUEUE",
+          "UPDATE_AUTHORITY_IMPORT_QUEUE",
+          "DELETE_AUTHORITY_IMPORT_QUEUE"
+        ]
+      },
+      "update": { "perms": ["UPDATE_AUTHORITY_IMPORT_QUEUE"] },
+      "delete": { "perms": ["DELETE_AUTHORITY_IMPORT_QUEUE"] }
+    }
+  },
+  "vqarad": {
+    "name": "vqarad",
+    "label": "Queued Authority Record Attribute Definition",
+    "table": "vandelay.authority_attr_definition",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.authority_attr_definition_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "xpath", "label": "XPath", "datatype": "text" },
+      { "name": "remove", "label": "Remove RegExp", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF"] },
+      "delete": { "perms": ["DELETE_AUTHORITY_IMPORT_IMPORT_FIELD_DEF"] }
+    }
+  },
+  "vqbr": {
+    "name": "vqbr",
+    "label": "Queued Bib Record",
+    "table": "vandelay.queued_bib_record",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.queued_record_id_seq",
+    "fields": [
+      { "name": "id", "label": "Record ID", "datatype": "id" },
+      {
+        "name": "create_time",
+        "label": "Create Time",
+        "datatype": "timestamp"
+      },
+      {
+        "name": "import_time",
+        "label": "Import Time",
+        "datatype": "timestamp"
+      },
+      { "name": "marc", "label": "MARC", "datatype": "text" },
+      {
+        "name": "queue",
+        "label": "Queue",
+        "type": "link",
+        "key": "id",
+        "class": "vbq",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "bib_source",
+        "label": "Bib Source",
+        "type": "link",
+        "key": "id",
+        "class": "cbs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "imported_as",
+        "label": "Final Target Record",
+        "type": "link",
+        "key": "id",
+        "class": "bre",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "import_error",
+        "label": "Import Error",
+        "type": "link",
+        "key": "code",
+        "class": "vie",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "error_detail",
+        "label": "Import Error Detail",
+        "datatype": "text"
+      },
+      { "name": "purpose", "label": "Purpose", "datatype": "text" },
+      {
+        "name": "attributes",
+        "label": "Attributes",
+        "virtual": true,
+        "type": "link",
+        "key": "record",
+        "class": "vqbra",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "matches",
+        "label": "Matches",
+        "virtual": true,
+        "type": "link",
+        "key": "queued_record",
+        "class": "vbm",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      {
+        "name": "import_items",
+        "label": "Import Items",
+        "virtual": true,
+        "type": "link",
+        "key": "record",
+        "class": "vii",
+        "reltype": "has_many",
+        "datatype": "link"
+      },
+      { "name": "quality", "label": "Quality", "datatype": "int" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_BIB_IMPORT_QUEUE"] },
+      "retrieve": {
+        "perms": [
+          "CREATE_BIB_IMPORT_QUEUE",
+          "UPDATE_BIB_IMPORT_QUEUE",
+          "DELETE_BIB_IMPORT_QUEUE"
+        ]
+      },
+      "update": { "perms": ["UPDATE_BIB_IMPORT_QUEUE"] },
+      "delete": { "perms": ["DELETE_BIB_IMPORT_QUEUE"] }
+    }
+  },
+  "vqbra": {
+    "name": "vqbra",
+    "label": "Queued Bib Record Attribute",
+    "table": "vandelay.queued_bib_record_attr",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.queued_bib_record_attr_id_seq",
+    "fields": [
+      { "name": "id", "label": "Attribute ID", "datatype": "id" },
+      {
+        "name": "record",
+        "label": "Record",
+        "type": "link",
+        "key": "id",
+        "class": "vqbr",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "field",
+        "label": "Field",
+        "type": "link",
+        "key": "id",
+        "class": "vqbrad",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "attr_value", "label": "Value", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_BIB_IMPORT_QUEUE"] },
+      "retrieve": {
+        "perms": [
+          "CREATE_BIB_IMPORT_QUEUE",
+          "UPDATE_BIB_IMPORT_QUEUE",
+          "DELETE_BIB_IMPORT_QUEUE"
+        ]
+      },
+      "update": { "perms": ["UPDATE_BIB_IMPORT_QUEUE"] },
+      "delete": { "perms": ["DELETE_BIB_IMPORT_QUEUE"] }
+    }
+  },
+  "vqbrad": {
+    "name": "vqbrad",
+    "label": "Queued Bib Record Attribute Definition",
+    "table": "vandelay.bib_attr_definition",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.bib_attr_definition_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "code", "label": "Code", "datatype": "text" },
+      {
+        "name": "description",
+        "label": "Description",
+        "i18n": true,
+        "datatype": "text"
+      },
+      { "name": "xpath", "label": "XPath", "datatype": "text" },
+      { "name": "remove", "label": "Remove RegExp", "datatype": "text" }
+    ],
+    "permacrud": {
+      "create": { "perms": ["CREATE_BIB_IMPORT_FIELD_DEF"] },
+      "retrieve": {},
+      "update": { "perms": ["UPDATE_BIB_IMPORT_IMPORT_FIELD_DEF"] },
+      "delete": { "perms": ["DELETE_BIB_IMPORT_IMPORT_FIELD_DEF"] }
+    }
+  },
+  "vst": {
+    "name": "vst",
+    "label": "Vandelay Session Tracker",
+    "table": "vandelay.session_tracker",
+    "pkey": "id",
+    "pkey_sequence": "vandelay.session_tracker_id_seq",
+    "fields": [
+      { "name": "id", "label": "ID", "datatype": "id" },
+      { "name": "session_key", "label": "Session Key", "datatype": "text" },
+      { "name": "name", "label": "Name", "datatype": "text" },
+      {
+        "name": "usr",
+        "label": "User",
+        "type": "link",
+        "key": "id",
+        "class": "au",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "workstation",
+        "label": "Workstation",
+        "type": "link",
+        "key": "id",
+        "class": "aws",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "record_type", "label": "Record Type", "datatype": "text" },
+      { "name": "queue", "label": "Source Queue", "datatype": "int" },
+      {
+        "name": "create_time",
+        "label": "Create Time",
+        "datatype": "timestsamp"
+      },
+      {
+        "name": "update_time",
+        "label": "Update Time",
+        "datatype": "timestsamp"
+      },
+      { "name": "state", "label": "State", "datatype": "text" },
+      { "name": "action_type", "label": "Action Type", "datatype": "text" },
+      { "name": "total_actions", "label": "Total Actions", "datatype": "int" },
+      {
+        "name": "actions_performed",
+        "label": "Actions Performed",
+        "datatype": "int"
+      }
+    ],
+    "permacrud": {
+      "retrieve": {
+        "perms": ["CREATE_BIB_IMPORT_QUEUE", "CREATE_AUTHORITY_IMPORT_QUEUE"]
+      },
+      "update": {
+        "perms": ["UPDATE_BIB_IMPORT_QUEUE", "UPDATE_AUTHORITY_IMPORT_QUEUE"]
+      },
+      "delete": {
+        "perms": ["DELETE_BIB_IMPORT_QUEUE", "DELETE_AUTHORITY_IMPORT_QUEUE"]
+      }
+    }
+  },
+  "xbet": {
+    "name": "xbet",
+    "label": "Between Expression",
+    "table": "query.expr_xbet",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "left_operand",
+        "label": "Left Operand",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" }
+    ]
+  },
+  "xbind": {
+    "name": "xbind",
+    "label": "Bind Variable Expression",
+    "table": "query.expr_xbind",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "bind_variable",
+        "label": "Bind Variable",
+        "type": "link",
+        "key": "name",
+        "class": "qbv",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  },
+  "xbool": {
+    "name": "xbool",
+    "label": "Boolean Expression",
+    "table": "query.expr_xbool",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      { "name": "literal", "label": "Literal", "datatype": "text" },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" }
+    ]
+  },
+  "xcase": {
+    "name": "xcase",
+    "label": "Case Expression",
+    "table": "query.expr_xcase",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "left_operand",
+        "label": "Left Operand",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" }
+    ]
+  },
+  "xcast": {
+    "name": "xcast",
+    "label": "Cast Expression",
+    "table": "query.expr_xcast",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "left_operand",
+        "label": "Left Operand",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "cast_type",
+        "label": "Cast Type",
+        "type": "link",
+        "key": "id",
+        "class": "qdt",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" }
+    ]
+  },
+  "xcol": {
+    "name": "xcol",
+    "label": "Column Expression",
+    "table": "query.expr_xcol",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      { "name": "table_alias", "label": "Table Alias", "datatype": "text" },
+      { "name": "column_name", "label": "Column Name", "datatype": "text" },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" }
+    ]
+  },
+  "xex": {
+    "name": "xex",
+    "label": "Exists Expression",
+    "table": "query.expr_xex",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "subquery",
+        "label": "Subquery",
+        "type": "link",
+        "key": "id",
+        "class": "qsq",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" }
+    ]
+  },
+  "xfunc": {
+    "name": "xfunc",
+    "label": "Function Expression",
+    "table": "query.expr_xfunc",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      { "name": "column_name", "label": "Column Name", "datatype": "text" },
+      {
+        "name": "function_id",
+        "label": "Function ID",
+        "type": "link",
+        "key": "id",
+        "class": "qfs",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" }
+    ]
+  },
+  "xin": {
+    "name": "xin",
+    "label": "In Expression",
+    "table": "query.expr_xin",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "left_operand",
+        "label": "Left Operand",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      {
+        "name": "subquery",
+        "label": "Subquery",
+        "type": "link",
+        "key": "id",
+        "class": "qsq",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" }
+    ]
+  },
+  "xisnull": {
+    "name": "xisnull",
+    "label": "IS NULL Expression",
+    "table": "query.expr_xisnull",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "left_operand",
+        "label": "Left Operand",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" }
+    ]
+  },
+  "xnull": {
+    "name": "xnull",
+    "label": "Null Expression",
+    "table": "query.expr_xnull",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" }
+    ]
+  },
+  "xnum": {
+    "name": "xnum",
+    "label": "Number Expression",
+    "table": "query.expr_xnum",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      { "name": "literal", "label": "Literal", "datatype": "text" }
+    ]
+  },
+  "xop": {
+    "name": "xop",
+    "label": "Operator Expression",
+    "table": "query.expr_xop",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "left_operand",
+        "label": "Left Operand",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "operator", "label": "Operator", "datatype": "text" },
+      {
+        "name": "right_operand",
+        "label": "Right Operand",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" }
+    ]
+  },
+  "xser": {
+    "name": "xser",
+    "label": "Operator Expression",
+    "table": "query.expr_xser",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      { "name": "operator", "label": "Operator", "datatype": "text" },
+      { "name": "negate", "label": "Negate?", "datatype": "bool" }
+    ]
+  },
+  "xstr": {
+    "name": "xstr",
+    "label": "String Expression",
+    "table": "query.expr_xstr",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      { "name": "literal", "label": "Literal", "datatype": "text" }
+    ]
+  },
+  "xsubq": {
+    "name": "xsubq",
+    "label": "Subquery Expression",
+    "table": "query.expr_xsubq",
+    "pkey": "id",
+    "pkey_sequence": "query.expression_id_seq",
+    "fields": [
+      { "name": "id", "label": "Expression ID", "datatype": "id" },
+      {
+        "name": "parenthesize",
+        "label": "Is Parenthesized",
+        "datatype": "bool"
+      },
+      {
+        "name": "parent_expr",
+        "label": "Parent Expression",
+        "type": "link",
+        "key": "id",
+        "class": "qxp",
+        "reltype": "has_a",
+        "datatype": "link"
+      },
+      { "name": "seq_no", "label": "Sequence Number", "datatype": "int" },
+      {
+        "name": "subquery",
+        "label": "Subquery",
+        "type": "link",
+        "key": "id",
+        "class": "qsq",
+        "reltype": "has_a",
+        "datatype": "link"
+      }
+    ]
+  }
+}
+
index f66a5d3..788e25b 100644 (file)
@@ -158,7 +158,7 @@ class templateController {
                                        else {  //display the template form
                                                $typeListData = $templateObj->getTemplateTypesList();
                                                $groupListData = $templateObj->getTemplategroupsList();
-                                               $template->doc_url=json_decode($template->dataDecoded)->docURL;
+                                               isset($template->doc_url) ? $template->doc_url=json_decode($template->dataDecoded)->docURL : false;
                                                $templateView->displayTemplateInfoForm($template, $typeListData, $groupListData);
                                        }               
                                }
diff --git a/images/PINESLogo.gif b/images/PINESLogo.gif
new file mode 100644 (file)
index 0000000..4721609
Binary files /dev/null and b/images/PINESLogo.gif differ
diff --git a/images/pinetree-banner.png b/images/pinetree-banner.png
new file mode 100644 (file)
index 0000000..d793822
Binary files /dev/null and b/images/pinetree-banner.png differ
old mode 100755 (executable)
new mode 100644 (file)
index 97f10f0..b1ee082 100644 (file)
@@ -156,7 +156,23 @@ class report extends db
                                        }
                                        return $fieldDocArray;
                                        break;
+
+                               case 'config.circ_modifier':
+                                       $query = 'select code as id, name from config.circ_modifier order by name';
+                                       break;
+                               
+                               case 'config.item_form_map':
+                                       $query = 'select code as id, value as name from config.item_form_map order by value';
+                                       break;
+                               
+                               case 'config.language_map':
+                                       $query = 'select code as id, value as name from config.language_map order by value';
+                                       break;
                                        
+                               case 'config.audience_map':
+                                       $query = 'select code as id, value as name from config.audience_map order by value';
+                                       break;
+
                                default:        
                                        return NULL;
                                        break;
diff --git a/models/temp.json b/models/temp.json
new file mode 100644 (file)
index 0000000..f91c4cf
--- /dev/null
@@ -0,0 +1 @@
+{"docURL":"","reportColumns":{"0":{"name":"Circulating Library","aggregate":false,"transformLabel":"Raw Data"},"1":{"name":"Shelving Location","aggregate":false,"transformLabel":"Raw Data"},"2":{"name":"Copy Status","aggregate":false,"transformLabel":"Raw Data"},"3":{"name":"Precat Title","aggregate":false,"transformLabel":"Raw Data"},"4":{"name":"Precat Author","aggregate":false,"transformLabel":"Raw Data"},"5":{"name":"Precat Call Number","aggregate":false,"transformLabel":"Raw Data"},"6":{"name":"Barcode","aggregate":false,"transformLabel":"Raw Data"},"7":{"name":"Creation Date\/Time","aggregate":false,"transformLabel":"Raw Data"},"8":{"name":"Last Edit Date\/Time","aggregate":false,"transformLabel":"Raw Data"},"9":{"name":"Name","aggregate":false,"transformLabel":"Raw Data"},"10":{"name":"OPAC\/Staff Client User Name","aggregate":false,"transformLabel":"Raw Data"}},"userParams":{"0":{"column":"Item","transform":"Bare","transformLabel":"Raw Data","op":"=","opLabel":"Equals","param":"::P0","fieldDoc":"","aggregate":"","dataType":"bool","table":"asset.copy","paramType":"user"}},"staticParams":{"0":{"column":"Item -> Call Number\/Volume","transform":"Bare","transformLabel":"Raw Data","op":"=","opLabel":"Equals","param":"1","fieldDoc":"","aggregate":"","dataType":"org_unit","table":"asset.call_number","paramType":"static"},"1":{"column":"Item -> Call Number\/Volume","transform":"Bare","transformLabel":"Raw Data","op":"=","opLabel":"Equals","param":"UNCATALOGED","fieldDoc":"","aggregate":"","dataType":"org_unit","table":"asset.call_number","paramType":"static"},"2":{"column":"Item","transform":"Bare","transformLabel":"Raw Data","op":"=","opLabel":"Equals","param":"f","fieldDoc":"","aggregate":"","dataType":"bool","table":"asset.copy","paramType":"static"}}}
\ No newline at end of file
diff --git a/models/temp2.json b/models/temp2.json
new file mode 100644 (file)
index 0000000..89e6f75
--- /dev/null
@@ -0,0 +1 @@
+{"version":5,"doc_url":"","core_class":"acp","select":[{"alias":"Circulating Library","path":"aou-shortname","field_doc":"","relation":"d9bb0f1ae1cb5d9aac6e4deeef4da9af","column":{"colname":"shortname","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Shelving Location","path":"acpl-name","field_doc":"","relation":"997a0e361cbf1f5a57941642d5fb088a","column":{"colname":"name","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Copy Status","path":"ccs-name","field_doc":"","relation":"8129cbef75ca108b4c84d2b9874ab89a","column":{"colname":"name","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Precat Title","path":"acp-dummy_title","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"dummy_title","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Precat Author","path":"acp-dummy_author","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"dummy_author","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Precat Call Number","path":"acp-dummy_isbn","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"dummy_isbn","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Barcode","path":"acp-barcode","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"barcode","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Creation Date/Time","path":"acp-create_date","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"create_date","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Last Edit Date/Time","path":"acp-edit_date","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"edit_date","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Name","path":"ccm-name","field_doc":"","relation":"851029826a8f1e629d4b7136a04f86f8","column":{"colname":"name","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"OPAC/Staff Client User Name","path":"au-usrname","field_doc":"","relation":"7ebcb384ce3181abb47f6deefdb5c79f","column":{"colname":"usrname","transform":"Bare","transform_label":"Raw Data","aggregate":false}}],"from":{"alias":"7d74f3b92b19da5e606d737d339a9679","path":"acp-acp","table":"asset.copy","idlclass":"acp","join":{"circ_lib-eb2d7f1fefe6a54c8f29fd69d7d4f600":{"type":"inner","key":"id","alias":"d9bb0f1ae1cb5d9aac6e4deeef4da9af","path":"acp-circ_lib","table":"actor.org_unit","idlclass":"aou","label":"Item -> Circulating Library"},"location-ccdc1d371ff6eeb5e16397677300bf76":{"type":"inner","key":"id","alias":"997a0e361cbf1f5a57941642d5fb088a","path":"acp-location","table":"asset.copy_location","idlclass":"acpl","label":"Item -> Shelving Location"},"status-8f0bbe545ab37e7c4d7759476aec9631":{"type":"inner","key":"id","alias":"8129cbef75ca108b4c84d2b9874ab89a","path":"acp-status","table":"config.copy_status","idlclass":"ccs","label":"Item -> Copy Status"},"circ_modifier-706fb26126e429c6ec8e61be820fe758":{"type":"inner","key":"code","alias":"851029826a8f1e629d4b7136a04f86f8","path":"acp-circ_modifier","table":"config.circ_modifier","idlclass":"ccm","label":"Item -> Circulation Modifier"},"creator-38cb3a347e51d3575f004b7007dffc47":{"type":"inner","key":"id","alias":"7ebcb384ce3181abb47f6deefdb5c79f","path":"acp-creator","table":"actor.usr","idlclass":"au","label":"Item -> Creating User"},"call_number-ed55d72666ad50c3c4b9652f5627aba0":{"type":"inner","key":"id","alias":"b2cf79747613caddc0cc6635315db347","path":"acp-call_number","table":"asset.call_number","idlclass":"acn","label":"Item -> Call Number/Volume"}},"label":"Item"},"where":[{"alias":"Owning Library","path":"acn-owning_lib","field_doc":"","relation":"b2cf79747613caddc0cc6635315db347","column":{"colname":"owning_lib","transform":"Bare","transform_label":"Raw Data","aggregate":0},"condition":{"=":"1"}},{"alias":"Call Number Label","path":"acn-label","field_doc":"","relation":"b2cf79747613caddc0cc6635315db347","column":{"colname":"label","transform":"Bare","transform_label":"Raw Data","aggregate":0},"condition":{"=":"UNCATALOGED"}},{"alias":"Is Deleted","path":"acp-deleted","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"deleted","transform":"Bare","transform_label":"Raw Data","aggregate":0},"condition":{"=":"f"}},{"alias":"Circulating Library","path":"acp-circ_lib","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"circ_lib","transform":"Bare","transform_label":"Raw Data","aggregate":0},"condition":{"in":"::P0"}}],"having":[],"display_cols":[{"name":"shortname","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Organizational Unit","from":"acp","link":{"name":"circ_lib","label":"Circulating Library","type":"link","key":"id","class":"aou","reltype":"has_a","datatype":"org_unit"},"id":"acp.aou","uplink":{"name":"circ_lib","label":"Circulating Library","type":"link","key":"id","class":"aou","reltype":"has_a","datatype":"org_unit"},"classname":"aou","struct":{"name":"aou","label":"Organizational Unit","table":"actor.org_unit","pkey":"id","pkey_sequence":"actor.org_unit_id_seq","core_label":"Non-core sources","classname":"aou"},"table":"actor.org_unit"}],"label":"Circulating Library","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item -> Circulating Library","index":0},{"name":"name","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Copy/Shelving Location","from":"acp","link":{"name":"location","label":"Shelving Location","type":"link","key":"id","class":"acpl","reltype":"has_a","datatype":"link"},"id":"acp.acpl","uplink":{"name":"location","label":"Shelving Location","type":"link","key":"id","class":"acpl","reltype":"has_a","datatype":"link"},"classname":"acpl","struct":{"name":"acpl","label":"Copy/Shelving Location","table":"asset.copy_location","pkey":"id","pkey_sequence":"asset.copy_location_id_seq","core_label":"Non-core sources","classname":"acpl"},"table":"asset.copy_location"}],"label":"Shelving Location","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item -> Shelving Location","index":1},{"name":"name","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Copy Status","from":"acp","link":{"name":"status","label":"Copy Status","type":"link","key":"id","class":"ccs","reltype":"has_a","datatype":"link"},"id":"acp.ccs","uplink":{"name":"status","label":"Copy Status","type":"link","key":"id","class":"ccs","reltype":"has_a","datatype":"link"},"classname":"ccs","struct":{"name":"ccs","label":"Copy Status","restrict_primary":"100","table":"config.copy_status","pkey":"id","pkey_sequence":"config.copy_status_id_seq","core_label":"Non-core sources","classname":"ccs"},"table":"config.copy_status"}],"label":"Copy Status","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item -> Copy Status","index":2},{"name":"dummy_title","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Precat Title","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","index":3},{"name":"dummy_author","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Precat Author","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","index":4},{"name":"dummy_isbn","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Precat Call Number","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","index":5},{"name":"barcode","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Barcode","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","index":6},{"name":"create_date","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Creation Date/Time","datatype":"timestamp","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","index":7},{"name":"edit_date","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Last Edit Date/Time","datatype":"timestamp","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","index":8},{"name":"name","label":"Name","i18n":true,"datatype":"text","index":9,"path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Circulation Modifier","from":"acp","link":{"name":"circ_modifier","label":"Circulation Modifier","type":"link","key":"code","class":"ccm","reltype":"has_a","datatype":"link"},"id":"acp.ccm","uplink":{"name":"circ_modifier","label":"Circulation Modifier","type":"link","key":"code","class":"ccm","reltype":"has_a","datatype":"link"},"classname":"ccm","struct":{"name":"ccm","label":"Circulation Modifier","table":"config.circ_modifier","pkey":"code","core_label":"Non-core sources","classname":"ccm"},"table":"config.circ_modifier"}],"path_label":"Item -> Circulation Modifier","transform":{"transform":"Bare","label":"Raw Data","aggregate":false},"doc_text":""},{"name":"usrname","label":"OPAC/Staff Client User Name","datatype":"text","index":10,"path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Creating User","from":"acp","link":{"name":"creator","label":"Creating User","type":"link","key":"id","class":"au","reltype":"has_a","datatype":"link"},"id":"acp.au","uplink":{"name":"creator","label":"Creating User","type":"link","key":"id","class":"au","reltype":"has_a","datatype":"link"},"classname":"au","struct":{"name":"au","label":"ILS User","table":"actor.usr","core":true,"pkey":"id","pkey_sequence":"actor.usr_id_seq","core_label":"Core sources","classname":"au"},"table":"actor.usr"}],"path_label":"Item -> Creating User","transform":{"transform":"Bare","label":"Raw Data","aggregate":false},"doc_text":""}],"filter_cols":[{"name":"owning_lib","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Call Number/Volume","from":"acp","link":{"name":"call_number","label":"Call Number/Volume","type":"link","key":"id","class":"acn","reltype":"has_a","datatype":"link"},"id":"acp.acn","uplink":{"name":"call_number","label":"Call Number/Volume","type":"link","key":"id","class":"acn","reltype":"has_a","datatype":"link"},"classname":"acn","struct":{"name":"acn","label":"Call Number/Volume","table":"asset.call_number","pkey":"id","pkey_sequence":"asset.call_number_id_seq","core_label":"Non-core sources","classname":"acn"},"table":"asset.call_number"}],"label":"Owning Library","datatype":"org_unit","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item -> Call Number/Volume","operator":{"op":"=","label":"Equals"},"index":0,"value":"1"},{"name":"label","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Call Number/Volume","from":"acp","link":{"name":"call_number","label":"Call Number/Volume","type":"link","key":"id","class":"acn","reltype":"has_a","datatype":"link"},"id":"acp.acn","uplink":{"name":"call_number","label":"Call Number/Volume","type":"link","key":"id","class":"acn","reltype":"has_a","datatype":"link"},"classname":"acn","struct":{"name":"acn","label":"Call Number/Volume","table":"asset.call_number","pkey":"id","pkey_sequence":"asset.call_number_id_seq","core_label":"Non-core sources","classname":"acn"},"table":"asset.call_number"}],"label":"Call Number Label","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item -> Call Number/Volume","operator":{"op":"=","label":"Equals"},"index":1,"value":"UNCATALOGED"},{"name":"deleted","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Is Deleted","datatype":"bool","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","operator":{"op":"=","label":"Equals"},"index":2,"value":"f"},{"name":"circ_lib","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Circulating Library","datatype":"org_unit","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","operator":{"op":"in","label":"In list"},"index":3}]}
\ No newline at end of file
diff --git a/models/temp3.json b/models/temp3.json
new file mode 100644 (file)
index 0000000..f17e98b
--- /dev/null
@@ -0,0 +1,2 @@
+{"version":5,"doc_url":"","core_class":"acp","select":[{"alias":"Circulating Library","path":"aou-shortname","field_doc":"","relation":"d9bb0f1ae1cb5d9aac6e4deeef4da9af","column":{"colname":"shortname","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Shelving Location","path":"acpl-name","field_doc":"","relation":"997a0e361cbf1f5a57941642d5fb088a","column":{"colname":"name","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Copy Status","path":"ccs-name","field_doc":"","relation":"8129cbef75ca108b4c84d2b9874ab89a","column":{"colname":"name","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Precat Title","path":"acp-dummy_title","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"dummy_title","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Precat Author","path":"acp-dummy_author","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"dummy_author","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Precat Call Number","path":"acp-dummy_isbn","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"dummy_isbn","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Barcode","path":"acp-barcode","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"barcode","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Creation Date/Time","path":"acp-create_date","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"create_date","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Last Edit Date/Time","path":"acp-edit_date","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"edit_date","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Name","path":"ccm-name","field_doc":"","relation":"851029826a8f1e629d4b7136a04f86f8","column":{"colname":"name","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"OPAC/Staff Client User Name","path":"au-usrname","field_doc":"","relation":"7ebcb384ce3181abb47f6deefdb5c79f","column":{"colname":"usrname","transform":"Bare","transform_label":"Raw Data","aggregate":false}}],"from":{"alias":"7d74f3b92b19da5e606d737d339a9679","path":"acp-acp","table":"asset.copy","idlclass":"acp","join":{"circ_lib-eb2d7f1fefe6a54c8f29fd69d7d4f600":{"type":"inner","key":"id","alias":"d9bb0f1ae1cb5d9aac6e4deeef4da9af","path":"acp-circ_lib","table":"actor.org_unit","idlclass":"aou","label":"Item -> Circulating Library"},"location-ccdc1d371ff6eeb5e16397677300bf76":{"type":"inner","key":"id","alias":"997a0e361cbf1f5a57941642d5fb088a","path":"acp-location","table":"asset.copy_location","idlclass":"acpl","label":"Item -> Shelving Location"},"status-8f0bbe545ab37e7c4d7759476aec9631":{"type":"inner","key":"id","alias":"8129cbef75ca108b4c84d2b9874ab89a","path":"acp-status","table":"config.copy_status","idlclass":"ccs","label":"Item -> Copy Status"},"circ_modifier-706fb26126e429c6ec8e61be820fe758":{"type":"inner","key":"code","alias":"851029826a8f1e629d4b7136a04f86f8","path":"acp-circ_modifier","table":"config.circ_modifier","idlclass":"ccm","label":"Item -> Circulation Modifier"},"creator-38cb3a347e51d3575f004b7007dffc47":{"type":"inner","key":"id","alias":"7ebcb384ce3181abb47f6deefdb5c79f","path":"acp-creator","table":"actor.usr","idlclass":"au","label":"Item -> Creating User"},"call_number-ed55d72666ad50c3c4b9652f5627aba0":{"type":"inner","key":"id","alias":"b2cf79747613caddc0cc6635315db347","path":"acp-call_number","table":"asset.call_number","idlclass":"acn","label":"Item -> Call Number/Volume"}},"label":"Item"},"where":[{"alias":"Owning Library","path":"acn-owning_lib","field_doc":"","relation":"b2cf79747613caddc0cc6635315db347","column":{"colname":"owning_lib","transform":"Bare","transform_label":"Raw Data","aggregate":0},"condition":{"=":"1"}},{"alias":"Call Number Label","path":"acn-label","field_doc":"","relation":"b2cf79747613caddc0cc6635315db347","column":{"colname":"label","transform":"Bare","transform_label":"Raw Data","aggregate":0},"condition":{"=":"UNCATALOGED"}},{"alias":"Is Deleted","path":"acp-deleted","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"deleted","transform":"Bare","transform_label":"Raw Data","aggregate":0},"condition":{"=":"f"}},{"alias":"Circulating Library","path":"acp-circ_lib","field_doc":"","relation":"7d74f3b92b19da5e606d737d339a9679","column":{"colname":"circ_lib","transform":"Bare","transform_label":"Raw Data","aggregate":0},"condition":{"in":"::P0"}}],"having":[],"display_cols":[{"name":"shortname","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Organizational Unit","from":"acp","link":{"name":"circ_lib","label":"Circulating Library","type":"link","key":"id","class":"aou","reltype":"has_a","datatype":"org_unit"},"id":"acp.aou","uplink":{"name":"circ_lib","label":"Circulating Library","type":"link","key":"id","class":"aou","reltype":"has_a","datatype":"org_unit"},"classname":"aou","struct":{"name":"aou","label":"Organizational Unit","table":"actor.org_unit","pkey":"id","pkey_sequence":"actor.org_unit_id_seq","core_label":"Non-core sources","classname":"aou"},"table":"actor.org_unit"}],"label":"Circulating Library","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item -> Circulating Library","index":0},{"name":"name","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Copy/Shelving Location","from":"acp","link":{"name":"location","label":"Shelving Location","type":"link","key":"id","class":"acpl","reltype":"has_a","datatype":"link"},"id":"acp.acpl","uplink":{"name":"location","label":"Shelving Location","type":"link","key":"id","class":"acpl","reltype":"has_a","datatype":"link"},"classname":"acpl","struct":{"name":"acpl","label":"Copy/Shelving Location","table":"asset.copy_location","pkey":"id","pkey_sequence":"asset.copy_location_id_seq","core_label":"Non-core sources","classname":"acpl"},"table":"asset.copy_location"}],"label":"Shelving Location","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item -> Shelving Location","index":1},{"name":"name","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Copy Status","from":"acp","link":{"name":"status","label":"Copy Status","type":"link","key":"id","class":"ccs","reltype":"has_a","datatype":"link"},"id":"acp.ccs","uplink":{"name":"status","label":"Copy Status","type":"link","key":"id","class":"ccs","reltype":"has_a","datatype":"link"},"classname":"ccs","struct":{"name":"ccs","label":"Copy Status","restrict_primary":"100","table":"config.copy_status","pkey":"id","pkey_sequence":"config.copy_status_id_seq","core_label":"Non-core sources","classname":"ccs"},"table":"config.copy_status"}],"label":"Copy Status","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item -> Copy Status","index":2},{"name":"dummy_title","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Precat Title","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","index":3},{"name":"dummy_author","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Precat Author","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","index":4},{"name":"dummy_isbn","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Precat Call Number","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","index":5},{"name":"barcode","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Barcode","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","index":6},{"name":"create_date","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Creation Date/Time","datatype":"timestamp","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","index":7},{"name":"edit_date","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Last Edit Date/Time","datatype":"timestamp","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","index":8},{"name":"name","label":"Name","i18n":true,"datatype":"text","index":9,"path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Circulation Modifier","from":"acp","link":{"name":"circ_modifier","label":"Circulation Modifier","type":"link","key":"code","class":"ccm","reltype":"has_a","datatype":"link"},"id":"acp.ccm","uplink":{"name":"circ_modifier","label":"Circulation Modifier","type":"link","key":"code","class":"ccm","reltype":"has_a","datatype":"link"},"classname":"ccm","struct":{"name":"ccm","label":"Circulation Modifier","table":"config.circ_modifier","pkey":"code","core_label":"Non-core sources","classname":"ccm"},"table":"config.circ_modifier"}],"path_label":"Item -> Circulation Modifier","transform":{"transform":"Bare","label":"Raw Data","aggregate":false},"doc_text":""},{"name":"usrname","label":"OPAC/Staff Client User Name","datatype":"text","index":10,"path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Creating User","from":"acp","link":{"name":"creator","label":"Creating User","type":"link","key":"id","class":"au","reltype":"has_a","datatype":"link"},"id":"acp.au","uplink":{"name":"creator","label":"Creating User","type":"link","key":"id","class":"au","reltype":"has_a","datatype":"link"},"classname":"au","struct":{"name":"au","label":"ILS User","table":"actor.usr","core":true,"pkey":"id","pkey_sequence":"actor.usr_id_seq","core_label":"Core sources","classname":"au"},"table":"actor.usr"}],"path_label":"Item -> Creating User","transform":{"transform":"Bare","label":"Raw Data","aggregate":false},"doc_text":""}],"filter_cols":[{"name":"owning_lib","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Call Number/Volume","from":"acp","link":{"name":"call_number","label":"Call Number/Volume","type":"link","key":"id","class":"acn","reltype":"has_a","datatype":"link"},"id":"acp.acn","uplink":{"name":"call_number","label":"Call Number/Volume","type":"link","key":"id","class":"acn","reltype":"has_a","datatype":"link"},"classname":"acn","struct":{"name":"acn","label":"Call Number/Volume","table":"asset.call_number","pkey":"id","pkey_sequence":"asset.call_number_id_seq","core_label":"Non-core sources","classname":"acn"},"table":"asset.call_number"}],"label":"Owning Library","datatype":"org_unit","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item -> Call Number/Volume","operator":{"op":"=","label":"Equals"},"index":0,"value":"1"},{"name":"label","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"},{"label":"Call Number/Volume","from":"acp","link":{"name":"call_number","label":"Call Number/Volume","type":"link","key":"id","class":"acn","reltype":"has_a","datatype":"link"},"id":"acp.acn","uplink":{"name":"call_number","label":"Call Number/Volume","type":"link","key":"id","class":"acn","reltype":"has_a","datatype":"link"},"classname":"acn","struct":{"name":"acn","label":"Call Number/Volume","table":"asset.call_number","pkey":"id","pkey_sequence":"asset.call_number_id_seq","core_label":"Non-core sources","classname":"acn"},"table":"asset.call_number"}],"label":"Call Number Label","datatype":"text","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item -> Call Number/Volume","operator":{"op":"=","label":"Equals"},"index":1,"value":"UNCATALOGED"},{"name":"deleted","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Is Deleted","datatype":"bool","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","operator":{"op":"=","label":"Equals"},"index":2,"value":"f"},{"name":"circ_lib","path":[{"label":"Item","id":"acp","classname":"acp","struct":{"name":"acp","label":"Item","table":"asset.copy","core":true,"pkey":"id","pkey_sequence":"asset.copy_id_seq","core_label":"Core sources","classname":"acp"},"table":"asset.copy"}],"label":"Circulating Library","datatype":"org_unit","doc_text":"","transform":{"label":"Raw Data","transform":"Bare","aggregate":null},"path_label":"Item","operator":{"op":"in","label":"In list"},"index":3}]}
+    [data] => {"docURL":"","reportColumns":{"0":{"name":"Circulating Library","aggregate":false,"transformLabel":"Raw Data"},"1":{"name":"Shelving Location","aggregate":false,"transformLabel":"Raw Data"},"2":{"name":"Copy Status","aggregate":false,"transformLabel":"Raw Data"},"3":{"name":"Precat Title","aggregate":false,"transformLabel":"Raw Data"},"4":{"name":"Precat Author","aggregate":false,"transformLabel":"Raw Data"},"5":{"name":"Precat Call Number","aggregate":false,"transformLabel":"Raw Data"},"6":{"name":"Barcode","aggregate":false,"transformLabel":"Raw Data"},"7":{"name":"Creation Date\/Time","aggregate":false,"transformLabel":"Raw Data"},"8":{"name":"Last Edit Date\/Time","aggregate":false,"transformLabel":"Raw Data"},"9":{"name":"Name","aggregate":false,"transformLabel":"Raw Data"},"10":{"name":"OPAC\/Staff Client User Name","aggregate":false,"transformLabel":"Raw Data"}},"userParams":{"0":{"column":"Item","transform":"Bare","transformLabel":"Raw Data","op":"=","opLabel":"Equals","param":"::P0","fieldDoc":"","aggregate":"","dataType":"bool","table":"asset.copy","paramType":"user"}},"staticParams":{"0":{"column":"Item -> Call Number\/Volume","transform":"Bare","transformLabel":"Raw Data","op":"=","opLabel":"Equals","param":"1","fieldDoc":"","aggregate":"","dataType":"org_unit","table":"asset.call_number","paramType":"static"},"1":{"column":"Item -> Call Number\/Volume","transform":"Bare","transformLabel":"Raw Data","op":"=","opLabel":"Equals","param":"UNCATALOGED","fieldDoc":"","aggregate":"","dataType":"org_unit","table":"asset.call_number","paramType":"static"},"2":{"column":"Item","transform":"Bare","transformLabel":"Raw Data","op":"=","opLabel":"Equals","param":"f","fieldDoc":"","aggregate":"","dataType":"bool","table":"asset.copy","paramType":"static"}}}
\ No newline at end of file
index 0000650..dc6381f 100644 (file)
@@ -7,127 +7,172 @@ class templateDecoder
        function createTemplateObject ($reporterTemplateID) {
                
                $templateObj = new stdClass();
-               $templateObj->id = $result['id'];
-               $templateObj->name = $result['name'];
-               $templateObj->description = $result['description'];
-               $templateObj->owner = $result['owner'];
-               $templateObj->folder = $result['folder'];
-               $templateObj->createTime = $result['create_time'];
-               $templateObj->data = $result['data'];
-               $templateObj->dataDecoded = $this->getDecodedTemplateData($result['data']);             
+               $templateObj->id = $result["id"];
+               $templateObj->name = $result["name"];
+               $templateObj->description = $result["description"];
+               $templateObj->owner = $result["owner"];
+               $templateObj->folder = $result["folder"];
+               $templateObj->createTime = $result["create_time"];
+               $templateObj->data = $result["data"];
+               $templateObj->dataDecoded = $this->getDecodedTemplateData($result["data"]);             
        }
        
        public function decodeTemplateData ($templateData) {
-               
-               $userParamsArray=array();
-               $staticParamsArray=array();
-               $reportColumnsArray=array();
-               $returnObj=new stdClass();
-
-               $jsonData=json_decode($templateData, false);
-               if (NULL == $jsonData) {
-                       new displayMessageView('JSON format error decoding template data.');
-                       return NULL;
-               }
-                               
-               $version=$jsonData->version;
-               if ($version != '3' && $version != '4') {
-                       new displayMessageView('Error: Invalid template version: '.$version);
-                       return NULL;
-               }
+               $userParamsArray = array();
+               $staticParamsArray = array();
+               $reportColumnsArray = array();
+               $returnObj = new stdClass();
 
-               
-               $select=$jsonData->select;
-               $relCache=$jsonData->rel_cache;
-               $where=(isset($jsonData->where) ? $jsonData->where : NULL);
-               $having=(isset($jsonData->having) ? $jsonData->having : NULL);
+               $jsonData = json_decode( $templateData, false );
+               $validData = ( $jsonData != NULL );
+
+               if ( $jsonData->version != "5") {
+                   new displayMessageView( "Error: Invalid template version. Must be Version 5." );
+                    return NULL;
+                }
+
+               if ( $validData ) {
+                       $select = $jsonData->select;
+                       $where = ( isset( $jsonData->where ) ? $jsonData->where : NULL );
+                       $having = ( isset( $jsonData->having ) ? $jsonData->having : NULL );
+
+                       foreach ( $select as $s ) {
+                               $columnName = $s->column->colname;
+                               $r = $s->relation;
+                               $relCol = $s->column;
+                               $displayAggregate = isset( $relCol->aggregate ) ? $relCol->aggregate : NULL;
+                               $displayTransformLabel = isset ( $relCol->transform_label ) ? $relCol->transform_label : NULL;
+       
+                               $columnArray = array(
+                                       "name" => $s->alias,
+                                       "aggregate" => $displayAggregate,
+                                       "transformLabel"=>$displayTransformLabel
+                               );
                                
-               foreach ($select as $s )
-               {
-                       $columnName=$s->column->colname;
-                       $r=$s->relation;
-                       $displayAggregate = isset($relCache->$r->fields->dis_tab->$columnName->aggregate) ? $relCache->$r->fields->dis_tab->$columnName->aggregate : NULL;
-                       $displayTransformLabel = isset($relCache->$r->fields->dis_tab->$columnName->transform_label) ? $relCache->$r->fields->dis_tab->$columnName->transform_label : NULL;
-                       $columnArray=array('name'=>$s->alias, 'aggregate'=>$displayAggregate, 'transformLabel'=>$displayTransformLabel);
-                       $reportColumnsArray[] = (object) $columnArray;
+                               $reportColumnsArray[] = (object) $columnArray;
+                       };
+
+                       foreach( array( $where, $having ) as $clause ) {
+                if ( isset( $clause ) ) {
+                    foreach ( $clause as $cl ) {
+                        $paramsArray = (object) $this->returnClause( $cl, $jsonData );
+                        if (isset ( $paramsArray->paramType ) ) {
+                            if ( $paramsArray->paramType == "user" ) {
+                                $userParamsArray[] = (object) $paramsArray;
+                            } else {
+                                $staticParamsArray[] = (object) $paramsArray;
+                            }
+                        }
+                    }
+                }
+               }
+
+                       $returnObj->docURL = isset($jsonData->doc_url) ? $jsonData->doc_url : NULL;             //version 4 templates only
+                       $returnObj->reportColumns = (object) $reportColumnsArray;
+                       $returnObj->userParams = (object) $userParamsArray;
+                       $returnObj->staticParams = (object) $staticParamsArray;
+            
+                       return($returnObj);
+               } else {
+                       new displayMessageView( "JSON format error decoding template data." );
                }
-               
-               $clauses = array('where', 'having');    //look for params in both where and having clauses
-               foreach ($clauses as $c) {
-                       
-                       if ('where' == $c) {
-                               if (NULL == $where) continue;
-                               $clause = $where;
-                       }
-                       else {
-                               if (NULL == $having) continue;
-                               $clause = $having;
-                       }
-               
-                       foreach ($clause as $cl) {
-                               $relation=$cl->relation;
-                               $colName=$cl->column->colname;
-                               
-                               if ('where' == $c)
-                                       $filterTab=$relCache->$relation->fields->filter_tab;
-                               else
-                                       $filterTab=$relCache->$relation->fields->aggfilter_tab;
-                               
-                               $columnLabel = str_replace('::','->',$relCache->$relation->label) .' -> '. $cl->alias;
-                       
-                               //Transform
-                               //*** Some templates do not have a transform label
-                               $transform = $cl->column->transform;
-                               if (isset($cl->column->transform_label)) {
-                                       $transformLabel = $cl->column->transform_label;
-                               }
-                               else {
-                                       $transformLabel = '';
-                               }
-                       
-                               //Data Type
-                               $dataType=$filterTab->$colName->datatype;
-                               $tableName=$relCache->$relation->table;
-                       
-                               //Action / Operation            
-                               $op=$filterTab->$colName->op;
-                               $opLabel=$filterTab->$colName->op_label;
-                               $fieldDoc = isset($filterTab->$colName->field_doc) ? $filterTab->$colName->field_doc : NULL;
-                               $aggregate = isset($filterTab->$colName->aggregate) ? $filterTab->$colName->aggregate : NULL;                           
-                               $P=$cl->condition;      
-
-                               list($key, $opValue) = each($P);                                                        //get the first (and only) value
-                               if (is_array($opValue)) $opValue = implode(',', $opValue);      //if array convert it back to a string
-                       
-                               $paramsArray = array(
-                                                       'column' => $columnLabel
-                                                       ,'transform' => $transform
-                                                       ,'transformLabel' => $transformLabel
-                                                       ,'op' => $op
-                                                       ,'opLabel' => $opLabel
-                                                       ,'param'=> $opValue
-                                                       ,'fieldDoc' => $fieldDoc
-                                                       ,'aggregate' => $aggregate
-                                                       ,'dataType' => $dataType
-                                                       ,'table' => $relCache->$relation->table
-                                                       );
-                       
-                               //if (mb_substr($opValue,0,3,'UTF-8')=='::P') {
-                               if (substr($opValue,0,3) == '::P') {
-                                       $userParamsArray[] = (object) $paramsArray;
-                               }
-                               else {
-                                       $staticParamsArray[] = (object) $paramsArray;
+       }
+
+       function pullLabel ( $d, $str, &$out, $tag, $subtag, $val ) {
+               if ( $d->$tag == $str ) {
+                       $out = $d->$val;
+                       return;
+               } else {
+                       if ( isset( $d->$subtag ) ) {
+                               if ( $d->$subtag ) {
+                                       foreach ( $d->$subtag as $j ) {
+                                               $this->pullLabel( $j, $str, $out, $tag, $subtag, $val );
+                                       }
                                }
+                       } else {
+                               return;
                        }
                }
-                               
-               $returnObj->docURL = isset($jsonData->doc_url) ? $jsonData->doc_url : NULL;             //version 4 templates only
-               $returnObj->reportColumns = (object) $reportColumnsArray;
-               $returnObj->userParams = (object) $userParamsArray;
-               $returnObj->staticParams = (object) $staticParamsArray;
-
-               return($returnObj);
        }
+
+    function returnClause( $cl, $jsonData ) {
+        $relation = isset( $cl->relation ) ? $cl->relation : null;
+        $colName = isset( $cl->column->colname ) ? $cl->column->colname : null; 
+
+        $columnLabel = "";
+        $this->pullLabel( $jsonData->from, $relation, $columnLabel, "alias", "join", "label" );
+
+        $columnLabelFull = $columnLabel . " -> " . $cl->alias;
+
+        $transform = isset( $cl->column->transform ) ? $cl->column->transform : null;
+        $transformLabel = isset( $cl->column->transform_label ) ? $cl->column->transform_label : "";
+
+        $dataType = "";
+        $op = "";
+        $opLabel = "";
+        $opValue = "";
+        $fieldDoc = "";
+        $aggregate = "";
+
+        if ( isset( $jsonData->filter_cols ) ) {
+            foreach ( $jsonData->filter_cols as $fc ) {
+                    if ( $fc->path_label === $columnLabel ) {
+                        $dataType = $fc->datatype;
+                        $op = $fc->operator->op;
+                        $opLabel = $fc->operator->label;
+                        isset( $fc->doc_text ) ? $fieldDoc = $fc->doc_text : false;
+                        if ( isset( $fc->transform->aggregate ) ) {
+                            if ( $fc->transform->aggregate != "undefined" ) {
+                                $aggregate = $fc->transform->aggregate;
+                            }
+                        }   
+                        break;
+                    }
+            }
+        }
+
+        $tableName = "";
+        $this->pullLabel( $jsonData->from, $relation, $tableName, "alias", "join", "table" );
+        $P = isset( $cl->condition ) ? $cl->condition : null; 
+
+        if ( isset( $P ) ) {
+                list( $key, $opValue ) = each( $P );  //get the first (and only) value
+        }
+
+        if ( isset( $opValue ) ) {
+              if ( is_array( $opValue ) ) $opValue = implode( ',', $opValue );      //if array convert it back to a string
+        } else {
+            $opValue = "";
+        }
+
+        $paramType = strlen( $opValue ) > 2 ? substr( $opValue, 0, 3 ) == "::P" ? "user" : "static" : "static"; 
+
+        return array(  
+                'column' => $columnLabelFull
+                ,'transform' => $transform
+                ,'transformLabel' => $transformLabel
+                ,'op' => $op
+                ,'opLabel' => $opLabel
+                ,'param'=> $opValue
+                ,'fieldDoc' => $fieldDoc
+                ,'aggregate' => $aggregate
+                ,'dataType' => $dataType
+                ,'table' => $tableName
+                ,'paramType' => $paramType
+        );
+    }
+
+    function returnColumnLabel( $d, $rel, $tag, $val, $retVal ) {
+        $val = "";
+        foreach( $d as $d1 ) {
+            if ( isset( $d1->$tag ) ) {
+                if ( $d1->$tag == $val ) {
+                    $val = $d1->$retVal;
+                    break;
+                }
+            }
+        }
+        return $val;
+    }
 }      
 ?>
diff --git a/models/templateDecoder.class.php.20201216 b/models/templateDecoder.class.php.20201216
new file mode 100644 (file)
index 0000000..11cd50a
--- /dev/null
@@ -0,0 +1,355 @@
+<?php 
+class templateDecoder
+{
+
+       function __construct( ){}
+
+       function createTemplateObject ($reporterTemplateID) {
+               
+               $templateObj = new stdClass();
+               $templateObj->id = $result["id"];
+               $templateObj->name = $result["name"];
+               $templateObj->description = $result["description"];
+               $templateObj->owner = $result["owner"];
+               $templateObj->folder = $result["folder"];
+               $templateObj->createTime = $result["create_time"];
+               $templateObj->data = $result["data"];
+               $templateObj->dataDecoded = $this->getDecodedTemplateData($result["data"]);             
+       }
+       
+       public function decodeTemplateData ($templateData) {
+               $validData = false;
+               $version = 3;
+
+               $userParamsArray = array();
+               $staticParamsArray = array();
+               $reportColumnsArray = array();
+               $returnObj = new stdClass();
+
+               $jsonData = json_decode( $templateData, false );
+               if ( $jsonData != NULL ) {
+                       $validData = $jsonData->version != NULL ? true : false;
+                       $version = $jsonData->version;
+               }
+               if ( $validData ) {
+                       $version === 3 || $version === 4 ? $jsonData = $this->convertXULTemplate( $jsonData ) : false;
+                       $select = $jsonData->select;
+                       $where = ( isset( $jsonData->where ) ? $jsonData->where : NULL );
+                       $having = ( isset( $jsonData->having ) ? $jsonData->having : NULL );
+
+                       foreach ( $select as $s ) {
+                               $columnName = $s->column->colname;
+                               $r = $s->relation;
+                               $relCol = $s->column;
+                               $displayAggregate = isset( $relCol->aggregate ) ? $relCol->aggregate : NULL;
+                               $displayTransformLabel = isset ( $relCol->transform_label ) ? $relCol->transform_label : NULL;
+       
+                               $columnArray = array(
+                                       "name" => $s->alias,
+                                       "aggregate" => $displayAggregate,
+                                       "transformLabel"=>$displayTransformLabel
+                               );
+                               
+                               $reportColumnsArray[] = (object) $columnArray;
+
+                               $where = isset( $jsonData->where ) ?
+                                       array(
+                                               "name" => "where",
+                                               "columns" => $jsonData->where
+                                       ) : NULL;
+                               $having = isset( $jsonData->having ) ?
+                                       array(
+                                               "name" => "having",
+                                               "columns" => $jsonData->having
+                                       ) : NULL;
+
+                               foreach ( array( "where", "having" ) as $c ) {
+                                       if ( $c == "where" ) {
+                                               if ( !isset( $where ) ) continue;
+                                               $clause = $where;
+                                       }
+                                       if ( $c == "having" ) {
+                                               if ( !isset( $having ) ) continue;
+                                               $clause = $having;
+                                       }
+
+                                       foreach ( $clause as $cl ) {
+                                               $relation = isset( $cl->relation ) ? $cl->relation : null;
+                                               $colName = isset( $cl->column->colname ) ? $cl->column->colname : null;
+
+                                               $columnLabel = "";
+                                               $this->pullLabel( $jsonData->from, $relation, $columnLabel, "alias", "join", "label" );
+                                               $columnLabel = str_replace( '::', '->', $columnLabel);
+
+                                               $transform = isset( $cl->column->transform ) ? $cl->column->transform : null;
+                                               $transformLabel = isset( $cl->column->transform_label ) ? $cl->column->transform_label : "";
+
+                                               $dataType = "";
+                                               $op = "";
+                                               $opLabel = "";
+                                               $fieldDoc = "";
+                                               $aggregate = "";
+                                               foreach ( $jsonData->filter_cols as $fc ) {
+                                                       if ( $fc->name === $colName ) {
+                                                               $dataType = $fc->datatype;
+                                                               $op = $fc->operator->op;
+                                                               $opLabel = $fc->operator->label;
+                                                               isset( $fc->doc_text ) ? $fieldDoc = $fc->doc_text : false;
+                                                               if ( isset( $fc->transform->aggregate ) ) {
+                                                                       if ( $fc->transform->aggregate != "undefined" ) {
+                                                                               $aggregate = $fc->transform->aggregate;
+                                                                       }
+                                                               }
+                                                               break;
+                                                       }
+                                               }
+                                               $tableName = "";
+                                               $this->pullLabel( $jsonData->from, $relation, $tableName, "alias", "join", "table" );
+                                               $P = isset( $cl->condition ) ? $cl->condition : null;
+
+                                               if ( isset( $P ) ) {
+                                                       list($key, $opValue) = each($P);  //get the first (and only) value
+                                               }
+                                               if ( isset( $opValue ) ) {
+                                                       if (is_array($opValue)) $opValue = implode(',', $opValue);      //if array convert it back to a string
+                                               } else {
+                                                       $opValue = null;
+                                               }
+
+                                               $paramsArray = array(
+                                                  'column' => $columnLabel
+                                                  ,'transform' => $transform
+                                                  ,'transformLabel' => $transformLabel
+                                                  ,'op' => $op
+                                                  ,'opLabel' => $opLabel
+                                                  ,'param'=> $opValue
+                                                  ,'fieldDoc' => $fieldDoc
+                                                  ,'aggregate' => $aggregate
+                                                  ,'dataType' => $dataType
+                                                  ,'table' => $tableName
+                                                  );
+                                       //if (mb_substr($opValue,0,3,'UTF-8')=='::P') {
+                                               if (substr($opValue,0,3) == '::P') {
+                                                       $userParamsArray[] = (object) $paramsArray;
+                                               }
+                                               else {
+                                                       $staticParamsArray[] = (object) $paramsArray;
+                                               }                                       
+                                       }
+                               }
+                               $returnObj->docURL = isset($jsonData->doc_url) ? $jsonData->doc_url : NULL;             //version 4 templates only
+                               $returnObj->reportColumns = (object) $reportColumnsArray;
+                               $returnObj->userParams = (object) $userParamsArray;
+                               $returnObj->staticParams = (object) $staticParamsArray;
+               
+                               return($returnObj);
+                       }               
+               } else {
+                       new displayMessageView( "JSON format error decoding template data." );
+               }
+       }
+
+       function convertXULTemplate ( $template ) {
+               $data = ( object )[
+                       "version" => 5,
+                       "core_class" => $template->core_class,
+                       "select" => $template->select,
+                       "from" => $template->from,
+                       "where" => $template->where,
+                       "having" => $template->having,
+                       "display_cols" => array(),
+                       "filter_cols" => array()
+               ];
+       
+               $rels = [];
+               $order_by = "";
+       
+               foreach( $template->rel_cache as $k => $v ) {
+                       $k == "order_by" ? $order_by = $v : $rels{$k} = $v; //array_push( $rels, $v );
+               }
+       
+               $select = $template->select;
+               $sel_order = array();
+               $idx = 0;
+               foreach ( $select as $s ) {
+                       $sel_order[strval($s->relation) . strval($s->column->colname)] = $idx;
+                       $idx++;
+               }
+       
+               $idx = 0;
+
+               $IDL = json_decode( file_get_contents( 'config/IDL.json' ) );
+                
+               foreach ( $rels as $r ) {
+                       if ( is_array($r) || is_object($r) ) {
+                               $this->buildCols( $r, 'dis_tab', $sel_order, $data->display_cols, $IDL);
+                               $this->buildCols( $r, 'filter_tab', NULL, $data->filter_cols, $IDL);
+                               $this->buildCols( $r, 'aggfilter_tab', NULL, $data->filter_cols, $IDL);
+                       }
+       
+               }
+
+               return $data;
+       }
+
+       function buildCols( $r, $tt, $sel_order, &$d, $IDL ) {
+               $colType = $tt == 'dis_tab' ? 'display_cols' : 'filter_cols';
+               $ci = 0;
+               foreach ( $r->fields->{$tt} as $n =>$c ) {
+                       $orig = $r->fields->{$tt}->$n;
+                       $col = ( object ) [
+                               "name" => $c->colname,
+                               "path" => $this->convertPath( $orig, $r , $IDL),        //needs fixed
+                               "label" => $orig->alias,
+                               "datatype" => $c->datatype,
+                               "doc_text" => $c->field_doc,
+                               "transform" => ( object ) [
+                                       "label" => $orig->transform_label,
+                                       "transform" => $orig->transform,
+                                       "aggregate" => !isset( $orig->aggregate ) ? NULL : $orig->aggregate
+                               ],
+                               "path_label" => preg_replace( "/\:\:/", "->", $r->label),
+                               "index" => false
+                       ];
+                       if ( $colType == "filter_cols" ) {
+                               @$col->operator = [
+                                       "op" => $orig->op,
+                                       "label" => $orig->op_label
+                               ];
+                               @$col->index = $ci++;
+                               isset( $orig->op_value->value ) ? @$col->value = $orig->op_value->value : FALSE;
+                       } else {
+                               isset( $sel_order[$r->alias . $orig->colname] ) ? @$col->index = $sel_order[$r->alias . $orig->colname] : @$col->index = false;
+                       }
+                       array_push( $d, $col );
+               }                       
+       }
+
+       function buildNode( $cls, $args, $IDL ) {
+               if ( !isset( $cls ) || !isset( $args ) ) {
+                       return null;
+               } else {
+                       $n = isset( $IDL->{ $cls } ) ? $IDL->{ $cls } : null;
+               }
+
+               if ( !$n ) {
+                       return null;
+               } else {
+                       if ( !$args ) {
+                               $args = ( object ) [
+                                       "label" => $n->label
+                               ];
+                       }
+                       $args->id = $cls;
+                       if ( isset( $args->from ) ) {
+                               $args->id = $args->from . "." . $args->id;
+                       }
+                       $links = array();
+                       foreach( $n->fields as $x ) {
+                            if ( isset( $x->type ) ) {
+                               $x->type == "link" ? array_push( $links, $x ) : false;
+                            }
+                       }
+
+                       $args->idl = $this->service($cls, null);
+                       $args->uplink = isset( $args->link ) ? $args->link : null;
+                       $args->classname = $cls;
+                       $args->struct = $n;
+                       $args->table = isset( $n->table ) ? $n->table : null;
+                       $args->fields = $this->_sort_class_fields($n->fields);
+                       $args->links = $this->_sort_class_fields($links);
+                       $args->children = [];
+
+                       $args = json_encode( $args );
+
+                       return $args;
+               }
+       }
+
+       function convertPath( $orig, $rel, $IDL ) {
+               $new_path = [];
+               $table_path = preg_split( "/\./", $rel->path );
+               if ( count( $table_path ) > 1 || strpos( $rel->path, "-" ) ) {
+                       array_push( $table_path, $rel->idlclass );
+               }
+               $prev_type= "";
+               $prev_link = "";
+
+               foreach( $table_path as $tp ) {
+                       $cl_split = preg_split( "/-/", $tp);
+                       $cls = $cl_split[0];
+                       $fld = isset( $cl_split[1] ) ? $cl_split[1] : null;
+                       $args = ( object )[
+                               "label" => isset( $IDL->{$cls}->label ) ? $IDL->{$cls}->label : null
+                       ];
+
+                       if( $prev_link != "" ) {
+                               $link_parts = preg_split( "/-/", $prev_link );
+                               $args->from = $link_parts[0];
+                               $join_parts = preg_split( "/>/", $link_parts[1]);
+                               $prev_col = $join_parts[0];
+                               foreach( $IDL->{$link_parts[0]}->fields as $f ) {
+                                       if ( $prev_col == $f->name ) {
+                                               $args->link = $f;
+                                       }
+                               }
+                               $args->jtype = isset( $join_parts[1] ) ? $join_parts[1] : null;
+                       }
+
+                       array_push( $new_path, $this->buildNode($cls, $args, $IDL));
+                       $prev_link = $tp;
+               }
+       }
+
+       function pullLabel ( $d, $str, &$out, $tag, $subtag, $val ) {
+               if ( $d->$tag == $str ) {
+                       $out = $d->$val;
+                       return;
+               } else {
+                       if ( isset( $d->$subtag ) ) {
+                               if ( $d->$subtag ) {
+                                       foreach ( $d->$subtag as $j ) {
+                                               $this->pullLabel( $j, $str, $out, $tag, $subtag, $val );
+                                       }
+                               }
+                       } else {
+                               return;
+                       }
+               }
+       }
+
+       function service( $cls, $seed) {
+               return ( object ) [
+                       "a" => ( $seed ? $seed : ( object )[] ),
+                       "classname" => $cls,
+                       "_isfieldmapper" => true
+               ];
+       }
+
+       function _sort_class_fields( $arr ) {
+               $out = array();
+               if ( isset( $arr[0] ) ) {
+                   array_push( $out, $arr[0] );
+                   array_shift($arr);
+                   $i = 0;
+                   while ( count($arr) > 0 ) {
+                       $arrLabel = isset( $arr[0]->label  ) ? $arr[0]->label : "";
+                        $arrName = isset( $arr[0]->name ) ? $arr[0]->name : "";
+
+                        //$aname = $arr[0]->label ? $arr[0]->label : $arr[0]->name;
+
+                        $bName = isset( $out[$i]->label  ) ? $out[$i]->label : "";
+                        $bLabel = isset( $out[$i]->label ) ? $out[$i]->label : $bName;
+                       $bName = isset( $bLabel ) ? $bLabel : $bName; //$out[$i]->label ? $out[$i]->label : $out[$i]->name;
+                       while ( strcmp( $arrName, $bName) > 0 && $i < count( $arr ) ) {
+                               $i++;
+                       }
+                       array_splice( $out, $i, 0, array( $arr[0] ) );
+                       array_shift( $arr );
+                       $i = 0;
+                   }
+                }
+               return $out;
+       }
+}      
+?>
diff --git a/models/templateDecoder.class.php.202012162234.php b/models/templateDecoder.class.php.202012162234.php
new file mode 100644 (file)
index 0000000..11cd50a
--- /dev/null
@@ -0,0 +1,355 @@
+<?php 
+class templateDecoder
+{
+
+       function __construct( ){}
+
+       function createTemplateObject ($reporterTemplateID) {
+               
+               $templateObj = new stdClass();
+               $templateObj->id = $result["id"];
+               $templateObj->name = $result["name"];
+               $templateObj->description = $result["description"];
+               $templateObj->owner = $result["owner"];
+               $templateObj->folder = $result["folder"];
+               $templateObj->createTime = $result["create_time"];
+               $templateObj->data = $result["data"];
+               $templateObj->dataDecoded = $this->getDecodedTemplateData($result["data"]);             
+       }
+       
+       public function decodeTemplateData ($templateData) {
+               $validData = false;
+               $version = 3;
+
+               $userParamsArray = array();
+               $staticParamsArray = array();
+               $reportColumnsArray = array();
+               $returnObj = new stdClass();
+
+               $jsonData = json_decode( $templateData, false );
+               if ( $jsonData != NULL ) {
+                       $validData = $jsonData->version != NULL ? true : false;
+                       $version = $jsonData->version;
+               }
+               if ( $validData ) {
+                       $version === 3 || $version === 4 ? $jsonData = $this->convertXULTemplate( $jsonData ) : false;
+                       $select = $jsonData->select;
+                       $where = ( isset( $jsonData->where ) ? $jsonData->where : NULL );
+                       $having = ( isset( $jsonData->having ) ? $jsonData->having : NULL );
+
+                       foreach ( $select as $s ) {
+                               $columnName = $s->column->colname;
+                               $r = $s->relation;
+                               $relCol = $s->column;
+                               $displayAggregate = isset( $relCol->aggregate ) ? $relCol->aggregate : NULL;
+                               $displayTransformLabel = isset ( $relCol->transform_label ) ? $relCol->transform_label : NULL;
+       
+                               $columnArray = array(
+                                       "name" => $s->alias,
+                                       "aggregate" => $displayAggregate,
+                                       "transformLabel"=>$displayTransformLabel
+                               );
+                               
+                               $reportColumnsArray[] = (object) $columnArray;
+
+                               $where = isset( $jsonData->where ) ?
+                                       array(
+                                               "name" => "where",
+                                               "columns" => $jsonData->where
+                                       ) : NULL;
+                               $having = isset( $jsonData->having ) ?
+                                       array(
+                                               "name" => "having",
+                                               "columns" => $jsonData->having
+                                       ) : NULL;
+
+                               foreach ( array( "where", "having" ) as $c ) {
+                                       if ( $c == "where" ) {
+                                               if ( !isset( $where ) ) continue;
+                                               $clause = $where;
+                                       }
+                                       if ( $c == "having" ) {
+                                               if ( !isset( $having ) ) continue;
+                                               $clause = $having;
+                                       }
+
+                                       foreach ( $clause as $cl ) {
+                                               $relation = isset( $cl->relation ) ? $cl->relation : null;
+                                               $colName = isset( $cl->column->colname ) ? $cl->column->colname : null;
+
+                                               $columnLabel = "";
+                                               $this->pullLabel( $jsonData->from, $relation, $columnLabel, "alias", "join", "label" );
+                                               $columnLabel = str_replace( '::', '->', $columnLabel);
+
+                                               $transform = isset( $cl->column->transform ) ? $cl->column->transform : null;
+                                               $transformLabel = isset( $cl->column->transform_label ) ? $cl->column->transform_label : "";
+
+                                               $dataType = "";
+                                               $op = "";
+                                               $opLabel = "";
+                                               $fieldDoc = "";
+                                               $aggregate = "";
+                                               foreach ( $jsonData->filter_cols as $fc ) {
+                                                       if ( $fc->name === $colName ) {
+                                                               $dataType = $fc->datatype;
+                                                               $op = $fc->operator->op;
+                                                               $opLabel = $fc->operator->label;
+                                                               isset( $fc->doc_text ) ? $fieldDoc = $fc->doc_text : false;
+                                                               if ( isset( $fc->transform->aggregate ) ) {
+                                                                       if ( $fc->transform->aggregate != "undefined" ) {
+                                                                               $aggregate = $fc->transform->aggregate;
+                                                                       }
+                                                               }
+                                                               break;
+                                                       }
+                                               }
+                                               $tableName = "";
+                                               $this->pullLabel( $jsonData->from, $relation, $tableName, "alias", "join", "table" );
+                                               $P = isset( $cl->condition ) ? $cl->condition : null;
+
+                                               if ( isset( $P ) ) {
+                                                       list($key, $opValue) = each($P);  //get the first (and only) value
+                                               }
+                                               if ( isset( $opValue ) ) {
+                                                       if (is_array($opValue)) $opValue = implode(',', $opValue);      //if array convert it back to a string
+                                               } else {
+                                                       $opValue = null;
+                                               }
+
+                                               $paramsArray = array(
+                                                  'column' => $columnLabel
+                                                  ,'transform' => $transform
+                                                  ,'transformLabel' => $transformLabel
+                                                  ,'op' => $op
+                                                  ,'opLabel' => $opLabel
+                                                  ,'param'=> $opValue
+                                                  ,'fieldDoc' => $fieldDoc
+                                                  ,'aggregate' => $aggregate
+                                                  ,'dataType' => $dataType
+                                                  ,'table' => $tableName
+                                                  );
+                                       //if (mb_substr($opValue,0,3,'UTF-8')=='::P') {
+                                               if (substr($opValue,0,3) == '::P') {
+                                                       $userParamsArray[] = (object) $paramsArray;
+                                               }
+                                               else {
+                                                       $staticParamsArray[] = (object) $paramsArray;
+                                               }                                       
+                                       }
+                               }
+                               $returnObj->docURL = isset($jsonData->doc_url) ? $jsonData->doc_url : NULL;             //version 4 templates only
+                               $returnObj->reportColumns = (object) $reportColumnsArray;
+                               $returnObj->userParams = (object) $userParamsArray;
+                               $returnObj->staticParams = (object) $staticParamsArray;
+               
+                               return($returnObj);
+                       }               
+               } else {
+                       new displayMessageView( "JSON format error decoding template data." );
+               }
+       }
+
+       function convertXULTemplate ( $template ) {
+               $data = ( object )[
+                       "version" => 5,
+                       "core_class" => $template->core_class,
+                       "select" => $template->select,
+                       "from" => $template->from,
+                       "where" => $template->where,
+                       "having" => $template->having,
+                       "display_cols" => array(),
+                       "filter_cols" => array()
+               ];
+       
+               $rels = [];
+               $order_by = "";
+       
+               foreach( $template->rel_cache as $k => $v ) {
+                       $k == "order_by" ? $order_by = $v : $rels{$k} = $v; //array_push( $rels, $v );
+               }
+       
+               $select = $template->select;
+               $sel_order = array();
+               $idx = 0;
+               foreach ( $select as $s ) {
+                       $sel_order[strval($s->relation) . strval($s->column->colname)] = $idx;
+                       $idx++;
+               }
+       
+               $idx = 0;
+
+               $IDL = json_decode( file_get_contents( 'config/IDL.json' ) );
+                
+               foreach ( $rels as $r ) {
+                       if ( is_array($r) || is_object($r) ) {
+                               $this->buildCols( $r, 'dis_tab', $sel_order, $data->display_cols, $IDL);
+                               $this->buildCols( $r, 'filter_tab', NULL, $data->filter_cols, $IDL);
+                               $this->buildCols( $r, 'aggfilter_tab', NULL, $data->filter_cols, $IDL);
+                       }
+       
+               }
+
+               return $data;
+       }
+
+       function buildCols( $r, $tt, $sel_order, &$d, $IDL ) {
+               $colType = $tt == 'dis_tab' ? 'display_cols' : 'filter_cols';
+               $ci = 0;
+               foreach ( $r->fields->{$tt} as $n =>$c ) {
+                       $orig = $r->fields->{$tt}->$n;
+                       $col = ( object ) [
+                               "name" => $c->colname,
+                               "path" => $this->convertPath( $orig, $r , $IDL),        //needs fixed
+                               "label" => $orig->alias,
+                               "datatype" => $c->datatype,
+                               "doc_text" => $c->field_doc,
+                               "transform" => ( object ) [
+                                       "label" => $orig->transform_label,
+                                       "transform" => $orig->transform,
+                                       "aggregate" => !isset( $orig->aggregate ) ? NULL : $orig->aggregate
+                               ],
+                               "path_label" => preg_replace( "/\:\:/", "->", $r->label),
+                               "index" => false
+                       ];
+                       if ( $colType == "filter_cols" ) {
+                               @$col->operator = [
+                                       "op" => $orig->op,
+                                       "label" => $orig->op_label
+                               ];
+                               @$col->index = $ci++;
+                               isset( $orig->op_value->value ) ? @$col->value = $orig->op_value->value : FALSE;
+                       } else {
+                               isset( $sel_order[$r->alias . $orig->colname] ) ? @$col->index = $sel_order[$r->alias . $orig->colname] : @$col->index = false;
+                       }
+                       array_push( $d, $col );
+               }                       
+       }
+
+       function buildNode( $cls, $args, $IDL ) {
+               if ( !isset( $cls ) || !isset( $args ) ) {
+                       return null;
+               } else {
+                       $n = isset( $IDL->{ $cls } ) ? $IDL->{ $cls } : null;
+               }
+
+               if ( !$n ) {
+                       return null;
+               } else {
+                       if ( !$args ) {
+                               $args = ( object ) [
+                                       "label" => $n->label
+                               ];
+                       }
+                       $args->id = $cls;
+                       if ( isset( $args->from ) ) {
+                               $args->id = $args->from . "." . $args->id;
+                       }
+                       $links = array();
+                       foreach( $n->fields as $x ) {
+                            if ( isset( $x->type ) ) {
+                               $x->type == "link" ? array_push( $links, $x ) : false;
+                            }
+                       }
+
+                       $args->idl = $this->service($cls, null);
+                       $args->uplink = isset( $args->link ) ? $args->link : null;
+                       $args->classname = $cls;
+                       $args->struct = $n;
+                       $args->table = isset( $n->table ) ? $n->table : null;
+                       $args->fields = $this->_sort_class_fields($n->fields);
+                       $args->links = $this->_sort_class_fields($links);
+                       $args->children = [];
+
+                       $args = json_encode( $args );
+
+                       return $args;
+               }
+       }
+
+       function convertPath( $orig, $rel, $IDL ) {
+               $new_path = [];
+               $table_path = preg_split( "/\./", $rel->path );
+               if ( count( $table_path ) > 1 || strpos( $rel->path, "-" ) ) {
+                       array_push( $table_path, $rel->idlclass );
+               }
+               $prev_type= "";
+               $prev_link = "";
+
+               foreach( $table_path as $tp ) {
+                       $cl_split = preg_split( "/-/", $tp);
+                       $cls = $cl_split[0];
+                       $fld = isset( $cl_split[1] ) ? $cl_split[1] : null;
+                       $args = ( object )[
+                               "label" => isset( $IDL->{$cls}->label ) ? $IDL->{$cls}->label : null
+                       ];
+
+                       if( $prev_link != "" ) {
+                               $link_parts = preg_split( "/-/", $prev_link );
+                               $args->from = $link_parts[0];
+                               $join_parts = preg_split( "/>/", $link_parts[1]);
+                               $prev_col = $join_parts[0];
+                               foreach( $IDL->{$link_parts[0]}->fields as $f ) {
+                                       if ( $prev_col == $f->name ) {
+                                               $args->link = $f;
+                                       }
+                               }
+                               $args->jtype = isset( $join_parts[1] ) ? $join_parts[1] : null;
+                       }
+
+                       array_push( $new_path, $this->buildNode($cls, $args, $IDL));
+                       $prev_link = $tp;
+               }
+       }
+
+       function pullLabel ( $d, $str, &$out, $tag, $subtag, $val ) {
+               if ( $d->$tag == $str ) {
+                       $out = $d->$val;
+                       return;
+               } else {
+                       if ( isset( $d->$subtag ) ) {
+                               if ( $d->$subtag ) {
+                                       foreach ( $d->$subtag as $j ) {
+                                               $this->pullLabel( $j, $str, $out, $tag, $subtag, $val );
+                                       }
+                               }
+                       } else {
+                               return;
+                       }
+               }
+       }
+
+       function service( $cls, $seed) {
+               return ( object ) [
+                       "a" => ( $seed ? $seed : ( object )[] ),
+                       "classname" => $cls,
+                       "_isfieldmapper" => true
+               ];
+       }
+
+       function _sort_class_fields( $arr ) {
+               $out = array();
+               if ( isset( $arr[0] ) ) {
+                   array_push( $out, $arr[0] );
+                   array_shift($arr);
+                   $i = 0;
+                   while ( count($arr) > 0 ) {
+                       $arrLabel = isset( $arr[0]->label  ) ? $arr[0]->label : "";
+                        $arrName = isset( $arr[0]->name ) ? $arr[0]->name : "";
+
+                        //$aname = $arr[0]->label ? $arr[0]->label : $arr[0]->name;
+
+                        $bName = isset( $out[$i]->label  ) ? $out[$i]->label : "";
+                        $bLabel = isset( $out[$i]->label ) ? $out[$i]->label : $bName;
+                       $bName = isset( $bLabel ) ? $bLabel : $bName; //$out[$i]->label ? $out[$i]->label : $out[$i]->name;
+                       while ( strcmp( $arrName, $bName) > 0 && $i < count( $arr ) ) {
+                               $i++;
+                       }
+                       array_splice( $out, $i, 0, array( $arr[0] ) );
+                       array_shift( $arr );
+                       $i = 0;
+                   }
+                }
+               return $out;
+       }
+}      
+?>
diff --git a/models/ver5_formatted.json b/models/ver5_formatted.json
new file mode 100644 (file)
index 0000000..01fa721
--- /dev/null
@@ -0,0 +1,503 @@
+{\r
+  "version": 5,\r
+  "core_class": "acp",\r
+  "select": [\r
+    {\r
+      "alias": "Barcode",\r
+      "column": {\r
+        "colname": "barcode",\r
+        "transform": "Bare",\r
+        "transform_label": "Raw Data"\r
+      },\r
+      "path": "acp-barcode",\r
+      "relation": "7d74f3b92b19da5e606d737d339a9679"\r
+    },\r
+    {\r
+      "alias": "TCN Value",\r
+      "column": {\r
+        "colname": "tcn_value",\r
+        "transform": "Bare",\r
+        "transform_label": "Raw Data"\r
+      },\r
+      "path": "acp-call_number-acn-record-bre-tcn_value",\r
+      "relation": "640e9f1ba83104cf4de312413f51b877"\r
+    },\r
+    {\r
+      "alias": "Creation Date/Time",\r
+      "column": {\r
+        "colname": "create_date",\r
+        "transform": "date",\r
+        "transform_label": "Date"\r
+      },\r
+      "path": "acp-create_date",\r
+      "relation": "7d74f3b92b19da5e606d737d339a9679"\r
+    },\r
+    {\r
+      "alias": "Call Number Label",\r
+      "column": {\r
+        "colname": "label",\r
+        "transform": "Bare",\r
+        "transform_label": "Raw Data"\r
+      },\r
+      "path": "acp-call_number-acn-label",\r
+      "relation": "286d7899ae25bee8bdd7dcde49f9e0b7"\r
+    },\r
+    {\r
+      "alias": "Title Proper (normalized)",\r
+      "column": {\r
+        "colname": "title",\r
+        "transform": "Bare",\r
+        "transform_label": "Raw Data"\r
+      },\r
+      "path": "acp-call_number-acn-record-bre-simple_record-rmsr-title",\r
+      "relation": "df8d81aecbe6b10702cbd762ac04cac9"\r
+    },\r
+    {\r
+      "alias": "Author (normalized)",\r
+      "column": {\r
+        "colname": "author",\r
+        "transform": "Bare",\r
+        "transform_label": "Raw Data"\r
+      },\r
+      "path": "acp-call_number-acn-record-bre-simple_record-rmsr-author",\r
+      "relation": "df8d81aecbe6b10702cbd762ac04cac9"\r
+    },\r
+    {\r
+      "alias": "Shelving Location",\r
+      "column": {\r
+        "colname": "name",\r
+        "transform": "Bare",\r
+        "transform_label": "Raw Data"\r
+      },\r
+      "path": "acp-location-acpl-name",\r
+      "relation": "c17ecc44e3cd2de457e5c9f1e6e0a26f"\r
+    },\r
+    {\r
+      "alias": "Copy Status",\r
+      "column": {\r
+        "colname": "name",\r
+        "transform": "Bare",\r
+        "transform_label": "Raw Data"\r
+      },\r
+      "path": "acp-status-ccs-name",\r
+      "relation": "9547fadabf916ce4fd3eb232e0902c9c"\r
+    },\r
+    {\r
+      "alias": "Publication Year (normalized)",\r
+      "column": {\r
+        "colname": "pubdate",\r
+        "transform": "Bare",\r
+        "transform_label": "Raw Data"\r
+      },\r
+      "path": "acp-call_number-acn-record-bre-simple_record-rmsr-pubdate",\r
+      "relation": "df8d81aecbe6b10702cbd762ac04cac9"\r
+    },\r
+    {\r
+      "alias": "Check Out Date/Time",\r
+      "column": {\r
+        "colname": "xact_start",\r
+        "transform": "max",\r
+        "transform_label": "Max"\r
+      },\r
+      "path": "acp-circulations-circ-xact_start",\r
+      "relation": "ddeeaf1839fe1496b309babab563fea7"\r
+    },\r
+    {\r
+      "alias": "Circulation Modifier",\r
+      "column": {\r
+        "colname": "circ_modifier",\r
+        "transform": "upper",\r
+        "transform_label": "Upper case"\r
+      },\r
+      "path": "acp-circ_modifier",\r
+      "relation": "7d74f3b92b19da5e606d737d339a9679"\r
+    },\r
+    {\r
+      "alias": "Circ ID",\r
+      "column": {\r
+        "colname": "id",\r
+        "transform": "count_distinct",\r
+        "transform_label": "Count Distinct"\r
+      },\r
+      "path": "acp-circulations-circ-id",\r
+      "relation": "ddeeaf1839fe1496b309babab563fea7"\r
+    }\r
+  ],\r
+  "from": {\r
+    "path": "acp-status",\r
+    "table": "asset.copy",\r
+    "label": "Item",\r
+    "alias": "7d74f3b92b19da5e606d737d339a9679",\r
+    "idlclass": "acp",\r
+    "template_path": "acp",\r
+    "join": {\r
+      "call_number-7d74f3b92b19da5e606d737d339a9679": {\r
+        "key": "id",\r
+        "path": "acp-call_number-acn-record",\r
+        "table": "asset.call_number",\r
+        "label": "Item :: Call Number/Volume",\r
+        "alias": "286d7899ae25bee8bdd7dcde49f9e0b7",\r
+        "idlclass": "acn",\r
+        "template_path": "acp-call_number",\r
+        "type": "left",\r
+        "join": {\r
+          "record-286d7899ae25bee8bdd7dcde49f9e0b7": {\r
+            "type": "left",\r
+            "key": "id",\r
+            "path": "acp-call_number-acn-record-bre",\r
+            "table": "biblio.record_entry",\r
+            "alias": "640e9f1ba83104cf4de312413f51b877",\r
+            "join": {\r
+              "id-rmsr-id-7f0e2da56d7bdf7c7434e87c5abaab5c": {\r
+                "type": "left",\r
+                "key": "id",\r
+                "path": "acp-call_number-acn-record-bre-simple_record-rmsr",\r
+                "table": "reporter.materialized_simple_record",\r
+                "label": "Item -> Call Number/Volume -> Bibliographic Record :: Simple Record Extracts ",\r
+                "alias": "df8d81aecbe6b10702cbd762ac04cac9",\r
+                "idlclass": "rmsr",\r
+                "template_path": "acp-call_number.acn-record.bre-simple_record"\r
+              }\r
+            },\r
+            "label": "Item -> Call Number/Volume :: Bib Record",\r
+            "idlclass": "bre",\r
+            "template_path": "acp-call_number.acn-record"\r
+          }\r
+        }\r
+      },\r
+      "id-circ-target_copy-7d74f3b92b19da5e606d737d339a9679": {\r
+        "key": "target_copy",\r
+        "type": "left",\r
+        "path": "acp-circulations-circ",\r
+        "table": "action.circulation",\r
+        "label": "Item :: Circulations",\r
+        "alias": "ddeeaf1839fe1496b309babab563fea7",\r
+        "idlclass": "circ",\r
+        "template_path": "acp-circulations"\r
+      },\r
+      "circ_lib-7d74f3b92b19da5e606d737d339a9679": {\r
+        "key": "id",\r
+        "path": "acp-circ_lib-aou",\r
+        "table": "actor.org_unit",\r
+        "label": "Item :: Circulating Library",\r
+        "alias": "ab9ff91ac334900edb50f0a5a8e3501f",\r
+        "idlclass": "aou",\r
+        "template_path": "acp-circ_lib"\r
+      },\r
+      "location-7d74f3b92b19da5e606d737d339a9679": {\r
+        "key": "id",\r
+        "path": "acp-location-acpl",\r
+        "table": "asset.copy_location",\r
+        "label": "Item :: Shelving Location",\r
+        "alias": "c17ecc44e3cd2de457e5c9f1e6e0a26f",\r
+        "idlclass": "acpl",\r
+        "template_path": "acp-location"\r
+      },\r
+      "status-7d74f3b92b19da5e606d737d339a9679": {\r
+        "key": "id",\r
+        "path": "acp-status-ccs",\r
+        "table": "config.copy_status",\r
+        "label": "Item :: Copy Status",\r
+        "alias": "9547fadabf916ce4fd3eb232e0902c9c",\r
+        "idlclass": "ccs",\r
+        "template_path": "acp-status"\r
+      }\r
+    }\r
+  },\r
+  "where": [\r
+    {\r
+      "alias": "Creation Date/Time",\r
+      "column": {\r
+        "colname": "create_date",\r
+        "transform": "date",\r
+        "transform_label": "Date"\r
+      },\r
+      "path": "acp-create_date",\r
+      "relation": "7d74f3b92b19da5e606d737d339a9679",\r
+      "condition": { "<=": "::P0" }\r
+    },\r
+    {\r
+      "alias": "Is Deleted",\r
+      "column": {\r
+        "colname": "deleted",\r
+        "transform": "Bare",\r
+        "transform_label": "Raw Data"\r
+      },\r
+      "path": "acp-deleted",\r
+      "relation": "7d74f3b92b19da5e606d737d339a9679",\r
+      "condition": { "=": "f" }\r
+    },\r
+    {\r
+      "alias": "Call Number Label",\r
+      "column": {\r
+        "colname": "label",\r
+        "transform": "Bare",\r
+        "transform_label": "Raw Data"\r
+      },\r
+      "path": "acp-call_number-acn-label",\r
+      "relation": "286d7899ae25bee8bdd7dcde49f9e0b7",\r
+      "condition": { "between": ["J 000", "J 100"] }\r
+    },\r
+    {\r
+      "alias": "Organizational Unit ID",\r
+      "column": {\r
+        "colname": "id",\r
+        "transform": "Bare",\r
+        "transform_label": "Raw Data"\r
+      },\r
+      "path": "acp-circ_lib-aou-id",\r
+      "relation": "ab9ff91ac334900edb50f0a5a8e3501f",\r
+      "condition": { "in": "::P2" }\r
+    }\r
+  ],\r
+  "having": [\r
+    {\r
+      "alias": "Circ ID",\r
+      "column": {\r
+        "colname": "id",\r
+        "transform": "count_distinct",\r
+        "transform_label": "Count Distinct"\r
+      },\r
+      "path": "acp-circulations-circ-id",\r
+      "relation": "ddeeaf1839fe1496b309babab563fea7",\r
+      "condition": { "<=": "::P1" }\r
+    }\r
+  ],\r
+  "display_cols": [\r
+    {\r
+      "name": "barcode",\r
+      "path": null,\r
+      "label": "Barcode",\r
+      "datatype": "text",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Raw Data",\r
+        "transform": "Bare",\r
+        "aggregate": null\r
+      },\r
+      "path_label": "Item",\r
+      "index": 0\r
+    },\r
+    {\r
+      "name": "create_date",\r
+      "path": null,\r
+      "label": "Creation Date/Time",\r
+      "datatype": "timestamp",\r
+      "doc_text": null,\r
+      "transform": { "label": "Date", "transform": "date", "aggregate": null },\r
+      "path_label": "Item",\r
+      "index": 2\r
+    },\r
+    {\r
+      "name": "circ_modifier",\r
+      "path": null,\r
+      "label": "Circulation Modifier",\r
+      "datatype": "text",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Upper case",\r
+        "transform": "upper",\r
+        "aggregate": null\r
+      },\r
+      "path_label": "Item",\r
+      "index": 10\r
+    },\r
+    {\r
+      "name": "label",\r
+      "path": null,\r
+      "label": "Call Number Label",\r
+      "datatype": "text",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Raw Data",\r
+        "transform": "Bare",\r
+        "aggregate": null\r
+      },\r
+      "path_label": "Item -> Call Number/Volume",\r
+      "index": 3\r
+    },\r
+    {\r
+      "name": "title",\r
+      "path": null,\r
+      "label": "Title Proper (normalized)",\r
+      "datatype": "text",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Raw Data",\r
+        "transform": "Bare",\r
+        "aggregate": null\r
+      },\r
+      "path_label": "Item -> Call Number/Volume -> Bibliographic Record -> Simple Record Extracts ",\r
+      "index": 4\r
+    },\r
+    {\r
+      "name": "author",\r
+      "path": null,\r
+      "label": "Author (normalized)",\r
+      "datatype": "text",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Raw Data",\r
+        "transform": "Bare",\r
+        "aggregate": null\r
+      },\r
+      "path_label": "Item -> Call Number/Volume -> Bibliographic Record -> Simple Record Extracts ",\r
+      "index": 5\r
+    },\r
+    {\r
+      "name": "pubdate",\r
+      "path": null,\r
+      "label": "Publication Year (normalized)",\r
+      "datatype": "int",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Raw Data",\r
+        "transform": "Bare",\r
+        "aggregate": null\r
+      },\r
+      "path_label": "Item -> Call Number/Volume -> Bibliographic Record -> Simple Record Extracts ",\r
+      "index": 8\r
+    },\r
+    {\r
+      "name": "xact_start",\r
+      "path": null,\r
+      "label": "Check Out Date/Time",\r
+      "datatype": "timestamp",\r
+      "doc_text": null,\r
+      "transform": { "label": "Max", "transform": "max", "aggregate": true },\r
+      "path_label": "Item -> Circulations",\r
+      "index": 9\r
+    },\r
+    {\r
+      "name": "id",\r
+      "path": null,\r
+      "label": "Circ ID",\r
+      "datatype": "id",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Count Distinct",\r
+        "transform": "count_distinct",\r
+        "aggregate": true\r
+      },\r
+      "path_label": "Item -> Circulations",\r
+      "index": 11\r
+    },\r
+    {\r
+      "name": "name",\r
+      "path": null,\r
+      "label": "Shelving Location",\r
+      "datatype": "text",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Raw Data",\r
+        "transform": "Bare",\r
+        "aggregate": null\r
+      },\r
+      "path_label": "Item -> Shelving Location",\r
+      "index": 6\r
+    },\r
+    {\r
+      "name": "tcn_value",\r
+      "path": null,\r
+      "label": "TCN Value",\r
+      "datatype": "text",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Raw Data",\r
+        "transform": "Bare",\r
+        "aggregate": null\r
+      },\r
+      "path_label": "Item -> Call Number/Volume -> Bib Record",\r
+      "index": 1\r
+    },\r
+    {\r
+      "name": "name",\r
+      "path": null,\r
+      "label": "Copy Status",\r
+      "datatype": "text",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Raw Data",\r
+        "transform": "Bare",\r
+        "aggregate": null\r
+      },\r
+      "path_label": "Item -> Copy Status",\r
+      "index": 7\r
+    }\r
+  ],\r
+  "filter_cols": [\r
+    {\r
+      "name": "create_date",\r
+      "path": null,\r
+      "label": "Creation Date/Time",\r
+      "datatype": "timestamp",\r
+      "doc_text": null,\r
+      "transform": { "label": "Date", "transform": "date", "aggregate": null },\r
+      "path_label": "Item",\r
+      "index": 0,\r
+      "operator": { "op": "<=", "label": "On or Before (Date/Time)" }\r
+    },\r
+    {\r
+      "name": "deleted",\r
+      "path": null,\r
+      "label": "Is Deleted",\r
+      "datatype": "bool",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Raw Data",\r
+        "transform": "Bare",\r
+        "aggregate": null\r
+      },\r
+      "path_label": "Item",\r
+      "index": 1,\r
+      "operator": { "op": "=", "label": "Equals" },\r
+      "value": "f"\r
+    },\r
+    {\r
+      "name": "label",\r
+      "path": null,\r
+      "label": "Call Number Label",\r
+      "datatype": "text",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Raw Data",\r
+        "transform": "Bare",\r
+        "aggregate": "undefined"\r
+      },\r
+      "path_label": "Item -> Call Number/Volume",\r
+      "index": 0,\r
+      "operator": { "op": "between", "label": "Between" },\r
+      "value": ["J 000", "J 100"]\r
+    },\r
+    {\r
+      "name": "id",\r
+      "path": null,\r
+      "label": "Circ ID",\r
+      "datatype": "id",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Count Distinct",\r
+        "transform": "count_distinct",\r
+        "aggregate": true\r
+      },\r
+      "path_label": "Item -> Circulations",\r
+      "index": 0,\r
+      "operator": { "op": "<=", "label": "Less than or equal to" }\r
+    },\r
+    {\r
+      "name": "id",\r
+      "path": null,\r
+      "label": "Organizational Unit ID",\r
+      "datatype": "org_unit",\r
+      "doc_text": null,\r
+      "transform": {\r
+        "label": "Raw Data",\r
+        "transform": "Bare",\r
+        "aggregate": null\r
+      },\r
+      "path_label": "Item -> Circulating Library",\r
+      "index": 0,\r
+      "operator": { "op": "in", "label": "In list" }\r
+    }\r
+  ]\r
+}\r
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
old mode 100755 (executable)
new mode 100644 (file)
diff --git a/tester.20201216.php.bak b/tester.20201216.php.bak
new file mode 100644 (file)
index 0000000..112387e
--- /dev/null
@@ -0,0 +1,266 @@
+<?php 
+    
+    $data = file_get_contents( "/openils/var/web/report-creator/ver5.json" );
+
+    $data = json_encode( decodeTemplateData( $data ) ); 
+    // print_r( $data );
+
+       function decodeTemplateData ($templateData) {
+
+               $userParamsArray = array();
+               $staticParamsArray = array();
+               $reportColumnsArray = array();
+               $returnObj = new stdClass();
+
+               $jsonData = json_decode( $templateData, false );
+        $select = $jsonData->select;
+        // $returnObj->select = $select;
+
+        $where = ( isset( $jsonData->where ) ? $jsonData->where : NULL );
+        $having = ( isset( $jsonData->having ) ? $jsonData->having : NULL );
+
+        // $returnObj->where = $where;
+        // $returnObj->having = $having;
+                       foreach ( $select as $s ) {
+                               $columnName = $s->column->colname;
+                               $r = $s->relation;
+                               $relCol = $s->column;
+                               $displayAggregate = isset( $relCol->aggregate ) ? $relCol->aggregate : NULL;
+                               $displayTransformLabel = isset ( $relCol->transform_label ) ? $relCol->transform_label : NULL;
+       
+                               $columnArray = array(
+                                       "name" => $s->alias,
+                                       "aggregate" => $displayAggregate,
+                                       "transformLabel"=>$displayTransformLabel
+                               );
+                               
+                               $reportColumnsArray[] = (object) $columnArray;
+
+
+                               $where = $jsonData->where ?? null;
+                                $having = $jsonData->having ?? null;
+
+                               if ( isset( $where ) ) {                        
+                                    foreach ( $where as $w ) {
+                                       $relation = $w->relation;
+                                        $colName = $w->column->colname;
+                                       print_r( $colName );
+
+                                        $columnLabel = "";
+                                        pullLabel( $jsonData->from, $relation, $columnLabel, "alias", "join", "label");
+                                   }
+                               }        
+
+                       }
+                       //      $returnObj->docURL = isset($jsonData->doc_url) ? $jsonData->doc_url : NULL;             //version 4 templates only
+                               $returnObj->reportColumns = (object) $reportColumnsArray;
+                       //      $returnObj->userParams = (object) $userParamsArray;
+                       //      $returnObj->staticParams = (object) $staticParamsArray;
+               
+                               return($returnObj);
+       }
+
+       // function convertXULTemplate ( $template ) {
+       //      $data = ( object )[
+       //              "version" => 5,
+       //              "core_class" => $template->core_class,
+       //              "select" => $template->select,
+       //              "from" => $template->from,
+       //              "where" => $template->where,
+       //              "having" => $template->having,
+       //              "display_cols" => array(),
+       //              "filter_cols" => array()
+       //      ];
+       
+       //      $rels = [];
+       //      $order_by = "";
+       
+       //      foreach( $template->rel_cache as $k => $v ) {
+       //              $k == "order_by" ? $order_by = $v : $rels{$k} = $v; //array_push( $rels, $v );
+       //      }
+       
+       //      $select = $template->select;
+       //      $sel_order = array();
+       //      $idx = 0;
+       //      foreach ( $select as $s ) {
+       //              $sel_order[strval($s->relation) . strval($s->column->colname)] = $idx;
+       //              $idx++;
+       //      }
+       
+       //      $idx = 0;
+
+       //      $IDL = json_decode( file_get_contents( 'config/IDL.json' ) );
+                
+       //      foreach ( $rels as $r ) {
+       //              if ( is_array($r) || is_object($r) ) {
+       //                      $this->buildCols( $r, 'dis_tab', $sel_order, $data->display_cols, $IDL);
+       //                      $this->buildCols( $r, 'filter_tab', NULL, $data->filter_cols, $IDL);
+       //                      $this->buildCols( $r, 'aggfilter_tab', NULL, $data->filter_cols, $IDL);
+       //              }
+       
+       //      }
+
+       //      return $data;
+       // }
+
+//     function buildCols( $r, $tt, $sel_order, &$d, $IDL ) {
+//             $colType = $tt == 'dis_tab' ? 'display_cols' : 'filter_cols';
+//             $ci = 0;
+//             foreach ( $r->fields->{$tt} as $n =>$c ) {
+//                     $orig = $r->fields->{$tt}->$n;
+//                     $col = ( object ) [
+//                             "name" => $c->colname,
+//                             "path" => $this->convertPath( $orig, $r , $IDL),        //needs fixed
+//                             "label" => $orig->alias,
+//                             "datatype" => $c->datatype,
+//                             "doc_text" => $c->field_doc,
+//                             "transform" => ( object ) [
+//                                     "label" => $orig->transform_label,
+//                                     "transform" => $orig->transform,
+//                                     "aggregate" => !isset( $orig->aggregate ) ? NULL : $orig->aggregate
+//                             ],
+//                             "path_label" => preg_replace( "/\:\:/", "->", $r->label),
+//                             "index" => false
+//                     ];
+//                     if ( $colType == "filter_cols" ) {
+//                             @$col->operator = [
+//                                     "op" => $orig->op,
+//                                     "label" => $orig->op_label
+//                             ];
+//                             @$col->index = $ci++;
+//                             isset( $orig->op_value->value ) ? @$col->value = $orig->op_value->value : FALSE;
+//                     } else {
+//                             isset( $sel_order[$r->alias . $orig->colname] ) ? @$col->index = $sel_order[$r->alias . $orig->colname] : @$col->index = false;
+//                     }
+//                     array_push( $d, $col );
+//             }                       
+//     }
+
+//     function buildNode( $cls, $args, $IDL ) {
+//             if ( !isset( $cls ) || !isset( $args ) ) {
+//                     return null;
+//             } else {
+//                     $n = isset( $IDL->{ $cls } ) ? $IDL->{ $cls } : null;
+//             }
+
+//             if ( !$n ) {
+//                     return null;
+//             } else {
+//                     if ( !$args ) {
+//                             $args = ( object ) [
+//                                     "label" => $n->label
+//                             ];
+//                     }
+//                     $args->id = $cls;
+//                     if ( isset( $args->from ) ) {
+//                             $args->id = $args->from . "." . $args->id;
+//                     }
+//                     $links = array();
+//                     foreach( $n->fields as $x ) {
+//                             if ( isset( $x->type ) ) {
+//                             $x->type == "link" ? array_push( $links, $x ) : false;
+//                             }
+//                     }
+
+//                     $args->idl = $this->service($cls, null);
+//                     $args->uplink = isset( $args->link ) ? $args->link : null;
+//                     $args->classname = $cls;
+//                     $args->struct = $n;
+//                     $args->table = isset( $n->table ) ? $n->table : null;
+//                     $args->fields = $this->_sort_class_fields($n->fields);
+//                     $args->links = $this->_sort_class_fields($links);
+//                     $args->children = [];
+
+//                     $args = json_encode( $args );
+
+//                     return $args;
+//             }
+//     }
+
+//     function convertPath( $orig, $rel, $IDL ) {
+//             $new_path = [];
+//             $table_path = preg_split( "/\./", $rel->path );
+//             if ( count( $table_path ) > 1 || strpos( $rel->path, "-" ) ) {
+//                     array_push( $table_path, $rel->idlclass );
+//             }
+//             $prev_type= "";
+//             $prev_link = "";
+
+//             foreach( $table_path as $tp ) {
+//                     $cl_split = preg_split( "/-/", $tp);
+//                     $cls = $cl_split[0];
+//                     $fld = isset( $cl_split[1] ) ? $cl_split[1] : null;
+//                     $args = ( object )[
+//                             "label" => isset( $IDL->{$cls}->label ) ? $IDL->{$cls}->label : null
+//                     ];
+
+//                     if( $prev_link != "" ) {
+//                             $link_parts = preg_split( "/-/", $prev_link );
+//                             $args->from = $link_parts[0];
+//                             $join_parts = preg_split( "/>/", $link_parts[1]);
+//                             $prev_col = $join_parts[0];
+//                             foreach( $IDL->{$link_parts[0]}->fields as $f ) {
+//                                     if ( $prev_col == $f->name ) {
+//                                             $args->link = $f;
+//                                     }
+//                             }
+//                             $args->jtype = isset( $join_parts[1] ) ? $join_parts[1] : null;
+//                     }
+
+//                     array_push( $new_path, $this->buildNode($cls, $args, $IDL));
+//                     $prev_link = $tp;
+//             }
+//     }
+
+       function pullLabel ( $d, $str, &$out, $tag, $subtag, $val ) {
+               if ( $d->$tag == $str ) {
+                       $out = $d->$val;
+                       return;
+               } else {
+                       if ( isset( $d->$subtag ) ) {
+                               if ( $d->$subtag ) {
+                                       foreach ( $d->$subtag as $j ) {
+                                               pullLabel( $j, $str, $out, $tag, $subtag, $val );
+                                       }
+                               }
+                       } else {
+                               return;
+                       }
+               }
+       }
+
+//     function service( $cls, $seed) {
+//             return ( object ) [
+//                     "a" => ( $seed ? $seed : ( object )[] ),
+//                     "classname" => $cls,
+//                     "_isfieldmapper" => true
+//             ];
+//     }
+
+//     function _sort_class_fields( $arr ) {
+//             $out = array();
+//             if ( isset( $arr[0] ) ) {
+//                 array_push( $out, $arr[0] );
+//                 array_shift($arr);
+//                 $i = 0;
+//                 while ( count($arr) > 0 ) {
+//                     $arrLabel = isset( $arr[0]->label  ) ? $arr[0]->label : "";
+//                         $arrName = isset( $arr[0]->name ) ? $arr[0]->name : "";
+
+//                         //$aname = $arr[0]->label ? $arr[0]->label : $arr[0]->name;
+
+//                         $bName = isset( $out[$i]->label  ) ? $out[$i]->label : "";
+//                         $bLabel = isset( $out[$i]->label ) ? $out[$i]->label : $bName;
+//                     $bName = isset( $bLabel ) ? $bLabel : $bName; //$out[$i]->label ? $out[$i]->label : $out[$i]->name;
+//                     while ( strcmp( $arrName, $bName) > 0 && $i < count( $arr ) ) {
+//                             $i++;
+//                     }
+//                     array_splice( $out, $i, 0, array( $arr[0] ) );
+//                     array_shift( $arr );
+//                     $i = 0;
+//                 }
+//                 }
+//             return $out;
+//     }
+// }   
+?>
diff --git a/tester.php b/tester.php
new file mode 100644 (file)
index 0000000..6155426
--- /dev/null
@@ -0,0 +1,133 @@
+<?php
+
+    $data = file_get_contents( "/openils/var/web/report-creator/ver5.json" );
+    $data = json_encode( decodeTemplateData( $data ) );
+
+    function decodeTemplateData ($templateData) {
+
+        $userParamsArray = array();
+        $staticParamsArray = array();
+        $reportColumnsArray = array();
+        $returnObj = new stdClass();
+
+        $jsonData = json_decode( $templateData, false );
+        $select = $jsonData->select;
+        $where = ( isset( $jsonData->where ) ? $jsonData->where : NULL );
+        $having = ( isset( $jsonData->having ) ? $jsonData->having : NULL );
+
+        foreach ( $select as $s ) {
+                $columnName = $s->column->colname;
+                $r = $s->relation;
+                $relCol = $s->column;
+                $displayAggregate = isset( $relCol->aggregate ) ? $relCol->aggregate : NULL;
+                $displayTransformLabel = isset ( $relCol->transform_label ) ? $relCol->transform_label : NULL;
+
+                $columnArray = array(
+                    "name" => $s->alias,
+                    "aggregate" => $displayAggregate,
+                    "transformLabel"=>$displayTransformLabel
+                );
+
+                $reportColumnsArray[] = (object) $columnArray;
+        }
+
+        foreach( array( $where, $having ) as $clause ) {
+                if ( isset( $clause ) ) {
+                    foreach ( $clause as $cl ) {
+                        $paramsArray = returnClause( $cl, $jsonData );
+                        if ( substr( $paramsArray->param, 0, 3) == "::P" ) {
+                                $userParamsArray[] = (object) $paramsArray;
+                        } else {
+                                $staticParamsArray[] = (object) $paramsArray;
+                        }
+                    }
+                }
+        }
+
+        $returnObj->docURL = isset($jsonData->doc_url) ? $jsonData->doc_url : NULL;             //version 4 templates only
+        $returnObj->reportColumns = (object) $reportColumnsArray;
+        $returnObj->userParams = (object) $userParamsArray;
+        $returnObj->staticParams = (object) $staticParamsArray;
+
+       print_r( $returnObj );
+
+        return($returnObj);
+    }
+
+    function pullLabel ( $d, $str, &$out, $tag, $subtag, $val ) {
+        if ( $d->$tag == $str ) {
+                $out = $d->$val;
+                return;
+        } else {
+            if ( isset( $d->$subtag ) ) {
+                if ( $d->$subtag ) {
+                        foreach ( $d->$subtag as $j ) {
+                            pullLabel( $j, $str, $out, $tag, $subtag, $val );
+                        }
+                }
+            } else {
+                    return;
+            }
+        }
+    }
+    
+    function returnClause( $cl, $jsonData ) {
+        $relation = isset( $cl->relation ) ? $cl->relation : null;
+        $colName = isset( $cl->column->colname ) ? $cl->column->colname : null;
+
+        $columnLabel = "";
+        pullLabel( $jsonData->from, $relation, $columnLabel, "alias", "join", "label" );
+        $columnLabel = str_replace( '::', '->', $columnLabel);
+
+        $transform = isset( $cl->column->transform ) ? $cl->column->transform : null;
+        $transformLabel = isset( $cl->column->transform_label ) ? $cl->column->transform_label : "";
+
+        $dataType = "";
+        $op = "";
+        $opLabel = "";
+        $fieldDoc = "";
+        $aggregate = "";
+
+        foreach ( $jsonData->filter_cols as $fc ) {
+                if ( $fc->name === $colName ) {
+                    $dataType = $fc->datatype;
+                    $op = $fc->operator->op;
+                    $opLabel = $fc->operator->label;
+                    isset( $fc->doc_text ) ? $fieldDoc = $fc->doc_text : false;
+                    if ( isset( $fc->transform->aggregate ) ) {
+                        if ( $fc->transform->aggregate != "undefined" ) {
+                            $aggregate = $fc->transform->aggregate;
+                        }
+                    }
+                    break;
+                }
+        }
+
+        $tableName = "";
+        pullLabel( $jsonData->from, $relation, $tableName, "alias", "join", "table" );
+        $P = isset( $cl->condition ) ? $cl->condition : null;
+
+        if ( isset( $P ) ) {
+                list( $key, $opValue ) = each( $P );  //get the first (and only) value
+        }
+
+        if ( isset( $opValue ) ) {
+                if ( is_array( $opValue ) ) $opValue = implode( ',', $opValue );      //if array convert it back to a string
+        } else {
+                $opValue = "";
+        }
+
+        return array(
+                'column' => $columnLabel
+                ,'transform' => $transform
+                ,'transformLabel' => $transformLabel
+                ,'op' => $op
+                ,'opLabel' => $opLabel
+                ,'param'=> $opValue
+                ,'fieldDoc' => $fieldDoc
+                ,'aggregate' => $aggregate
+                ,'dataType' => $dataType
+                ,'table' => $tableName
+        );
+    }
+?>
diff --git a/update-installed.sh b/update-installed.sh
new file mode 100755 (executable)
index 0000000..ac85baf
--- /dev/null
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+REPO_NAME="report-creator"
+BRICK_HEADS="brick02-head brick03-head brick04-head brick05-head brick06-head"
+OSRF_WEB_ROOT="/openils/var/web"
+GIT_LOCATION="/home/opensrf/$REPO_NAME"
+PROD_BACKUP="/home/opensrf/report-creator-prod-backup"
+
+# back up what's already installed
+if [ ! -d "$PROD_BACKUP" ]; then
+       echo "Production backup directory $PROD_BACKUP not found, creating it..."
+       mkdir "$PROD_BACKUP"
+fi
+rsync -auv "$OSRF_WEB_ROOT"/"$REPO_NAME"/ "$PROD_BACKUP"/
+date > "$PROD_BACKUP"/last_sync_date
+
+# quick sed to change the prod URL in a config file
+sed -i 's/next.gapines.org/gapines.org/' $GIT_LOCATION/config/production.config.php
+
+# now copy the git files over to the web dir
+rsync -auv --exclude="install*.sh" --exclude=".git" "$GIT_LOCATION"/ "$OSRF_WEB_ROOT"/"$REPO_NAME"/
+
+# and now do the rest of the bricks
+for i in $BRICK_HEADS; do
+       rsync -auvz --exclude="install*.sh" --exclude=".git" "$OSRF_WEB_ROOT"/"$REPO_NAME"/ "$i":"$OSRF_WEB_ROOT"/"$REPO_NAME"/
+done
diff --git a/ver5.json b/ver5.json
new file mode 100644 (file)
index 0000000..db96040
--- /dev/null
+++ b/ver5.json
@@ -0,0 +1,809 @@
+{
+  "version": 5,
+  "core_class": "ahr",
+  "select": [
+    {
+      "alias": "Hold ID",
+      "path": "ahr-id",
+      "field_doc": "",
+      "relation": "3b0d7d05c65006de7b2ca20f5fe39690",
+      "column": {
+        "colname": "id",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": false
+      }
+    },
+    {
+      "alias": "Request Date/Time",
+      "path": "ahr-request_time",
+      "field_doc": "",
+      "relation": "3b0d7d05c65006de7b2ca20f5fe39690",
+      "column": {
+        "colname": "request_time",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": false
+      }
+    },
+    {
+      "alias": "Target Object ID",
+      "path": "ahr-target",
+      "field_doc": "",
+      "relation": "3b0d7d05c65006de7b2ca20f5fe39690",
+      "column": {
+        "colname": "target",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": false
+      }
+    },
+    {
+      "alias": "Currently Frozen",
+      "path": "ahr-frozen",
+      "field_doc": "",
+      "relation": "3b0d7d05c65006de7b2ca20f5fe39690",
+      "column": {
+        "colname": "frozen",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": false
+      }
+    },
+    {
+      "alias": "Pickup Lib",
+      "path": "aou-shortname",
+      "field_doc": "",
+      "relation": "413df8472eb3495de6137209d94c2539",
+      "column": {
+        "colname": "shortname",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": false
+      }
+    },
+    {
+      "alias": "Request Lib",
+      "path": "aou-shortname",
+      "field_doc": "",
+      "relation": "462716f66fc7b046f1eb8a64b9beff2b",
+      "column": {
+        "colname": "shortname",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": false
+      }
+    },
+    {
+      "alias": "Hold User",
+      "path": "au-id",
+      "field_doc": "",
+      "relation": "0d692e82dd1cfc230f6c9d0b5f9c76ee",
+      "column": {
+        "colname": "id",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": false
+      }
+    },
+    {
+      "alias": "User Placed the Hold",
+      "path": "au-id",
+      "field_doc": "",
+      "relation": "21dac70a3544f1b89d90c251302902ad",
+      "column": {
+        "colname": "id",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": false
+      }
+    }
+  ],
+  "from": {
+    "alias": "3b0d7d05c65006de7b2ca20f5fe39690",
+    "path": "ahr-ahr",
+    "table": "action.hold_request",
+    "idlclass": "ahr",
+    "label": "Hold Request",
+    "join": {
+      "pickup_lib-a83aec92287ef2eed487e52c74b46f81": {
+        "type": "inner",
+        "key": "id",
+        "alias": "413df8472eb3495de6137209d94c2539",
+        "path": "ahr-pickup_lib",
+        "table": "actor.org_unit",
+        "idlclass": "aou",
+        "label": "Hold Request -> Pickup Library"
+      },
+      "request_lib-1c6ab274a890bb96a1991321619cfea5": {
+        "type": "inner",
+        "key": "id",
+        "alias": "462716f66fc7b046f1eb8a64b9beff2b",
+        "path": "ahr-request_lib",
+        "table": "actor.org_unit",
+        "idlclass": "aou",
+        "label": "Hold Request -> Requesting Library"
+      },
+      "usr-4e09cff1d200f1b2657c55ddd4fdf2ee": {
+        "type": "inner",
+        "key": "id",
+        "alias": "0d692e82dd1cfc230f6c9d0b5f9c76ee",
+        "path": "ahr-usr",
+        "table": "actor.usr",
+        "idlclass": "au",
+        "label": "Hold Request -> Hold User"
+      },
+      "requestor-ec37b94ce77dcc7440f642f250a33297": {
+        "type": "inner",
+        "key": "id",
+        "alias": "21dac70a3544f1b89d90c251302902ad",
+        "path": "ahr-requestor",
+        "table": "actor.usr",
+        "idlclass": "au",
+        "label": "Hold Request -> Requesting User"
+      }
+    }
+  },
+  "where": [
+    {
+      "alias": "Fulfillment Date/Time",
+      "path": "ahr-fulfillment_time",
+      "field_doc": "",
+      "relation": "3b0d7d05c65006de7b2ca20f5fe39690",
+      "column": {
+        "colname": "fulfillment_time",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": 0
+      },
+      "condition": { "is": null }
+    },
+    {
+      "alias": "Hold Cancel Date/Time",
+      "path": "ahr-cancel_time",
+      "field_doc": "",
+      "relation": "3b0d7d05c65006de7b2ca20f5fe39690",
+      "column": {
+        "colname": "cancel_time",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": 0
+      },
+      "condition": { "is": null }
+    },
+    {
+      "alias": "Hold Type",
+      "path": "ahr-hold_type",
+      "field_doc": "",
+      "relation": "3b0d7d05c65006de7b2ca20f5fe39690",
+      "column": {
+        "colname": "hold_type",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": 0
+      },
+      "condition": { "=": "T" }
+    },
+    {
+      "alias": "Capture Date/Time",
+      "path": "ahr-capture_time",
+      "field_doc": "",
+      "relation": "3b0d7d05c65006de7b2ca20f5fe39690",
+      "column": {
+        "colname": "capture_time",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": 0
+      },
+      "condition": { "is": null }
+    },
+    {
+      "alias": "Organizational Unit ID",
+      "path": "aou-id",
+      "field_doc": "",
+      "relation": "462716f66fc7b046f1eb8a64b9beff2b",
+      "column": {
+        "colname": "id",
+        "transform": "Bare",
+        "transform_label": "Raw Data",
+        "aggregate": 0
+      },
+      "condition": { "in": "::P0" }
+    }
+  ],
+  "having": [],
+  "display_cols": [
+    {
+      "name": "id",
+      "label": "Hold ID",
+      "datatype": "id",
+      "index": 0,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        }
+      ],
+      "path_label": "Hold Request",
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": ""
+    },
+    {
+      "name": "request_time",
+      "label": "Request Date/Time",
+      "datatype": "timestamp",
+      "index": 1,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        }
+      ],
+      "path_label": "Hold Request",
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": ""
+    },
+    {
+      "name": "target",
+      "label": "Target Object ID",
+      "datatype": "link",
+      "index": 2,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        }
+      ],
+      "path_label": "Hold Request",
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": ""
+    },
+    {
+      "name": "frozen",
+      "label": "Currently Frozen",
+      "datatype": "bool",
+      "index": 3,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        }
+      ],
+      "path_label": "Hold Request",
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": ""
+    },
+    {
+      "name": "shortname",
+      "label": "Pickup Lib",
+      "required": true,
+      "datatype": "text",
+      "index": 4,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        },
+        {
+          "label": "Pickup Library",
+          "from": "ahr",
+          "link": {
+            "name": "pickup_lib",
+            "label": "Pickup Library",
+            "type": "link",
+            "key": "id",
+            "class": "aou",
+            "reltype": "has_a",
+            "datatype": "org_unit"
+          },
+          "id": "ahr.aou",
+          "uplink": {
+            "name": "pickup_lib",
+            "label": "Pickup Library",
+            "type": "link",
+            "key": "id",
+            "class": "aou",
+            "reltype": "has_a",
+            "datatype": "org_unit"
+          },
+          "classname": "aou",
+          "struct": {
+            "name": "aou",
+            "label": "Organizational Unit",
+            "table": "actor.org_unit",
+            "pkey": "id",
+            "pkey_sequence": "actor.org_unit_id_seq",
+            "core_label": "Non-core sources",
+            "classname": "aou"
+          },
+          "table": "actor.org_unit"
+        }
+      ],
+      "path_label": "Hold Request -> Pickup Library",
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": ""
+    },
+    {
+      "name": "shortname",
+      "label": "Request Lib",
+      "required": true,
+      "datatype": "text",
+      "index": 5,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        },
+        {
+          "label": "Requesting Library",
+          "from": "ahr",
+          "link": {
+            "name": "request_lib",
+            "label": "Requesting Library",
+            "type": "link",
+            "key": "id",
+            "class": "aou",
+            "reltype": "has_a",
+            "datatype": "org_unit"
+          },
+          "id": "ahr.aou",
+          "uplink": {
+            "name": "request_lib",
+            "label": "Requesting Library",
+            "type": "link",
+            "key": "id",
+            "class": "aou",
+            "reltype": "has_a",
+            "datatype": "org_unit"
+          },
+          "classname": "aou",
+          "struct": {
+            "name": "aou",
+            "label": "Organizational Unit",
+            "table": "actor.org_unit",
+            "pkey": "id",
+            "pkey_sequence": "actor.org_unit_id_seq",
+            "core_label": "Non-core sources",
+            "classname": "aou"
+          },
+          "table": "actor.org_unit"
+        }
+      ],
+      "path_label": "Hold Request -> Requesting Library",
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": ""
+    },
+    {
+      "name": "id",
+      "label": "Hold User",
+      "selector": "usrname",
+      "datatype": "id",
+      "index": 6,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        },
+        {
+          "label": "Hold User",
+          "from": "ahr",
+          "link": {
+            "name": "usr",
+            "label": "Hold User",
+            "type": "link",
+            "key": "id",
+            "class": "au",
+            "reltype": "has_a",
+            "datatype": "link"
+          },
+          "id": "ahr.au",
+          "uplink": {
+            "name": "usr",
+            "label": "Hold User",
+            "type": "link",
+            "key": "id",
+            "class": "au",
+            "reltype": "has_a",
+            "datatype": "link"
+          },
+          "classname": "au",
+          "struct": {
+            "name": "au",
+            "label": "ILS User",
+            "table": "actor.usr",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "actor.usr_id_seq",
+            "core_label": "Core sources",
+            "classname": "au"
+          },
+          "table": "actor.usr"
+        }
+      ],
+      "path_label": "Hold Request -> Hold User",
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": ""
+    },
+    {
+      "name": "id",
+      "label": "User Placed the Hold",
+      "selector": "usrname",
+      "datatype": "id",
+      "index": 7,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        },
+        {
+          "label": "Requesting User",
+          "from": "ahr",
+          "link": {
+            "name": "requestor",
+            "label": "Requesting User",
+            "type": "link",
+            "key": "id",
+            "class": "au",
+            "reltype": "has_a",
+            "datatype": "link"
+          },
+          "id": "ahr.au",
+          "uplink": {
+            "name": "requestor",
+            "label": "Requesting User",
+            "type": "link",
+            "key": "id",
+            "class": "au",
+            "reltype": "has_a",
+            "datatype": "link"
+          },
+          "classname": "au",
+          "struct": {
+            "name": "au",
+            "label": "ILS User",
+            "table": "actor.usr",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "actor.usr_id_seq",
+            "core_label": "Core sources",
+            "classname": "au"
+          },
+          "table": "actor.usr"
+        }
+      ],
+      "path_label": "Hold Request -> Requesting User",
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": ""
+    }
+  ],
+  "filter_cols": [
+    {
+      "name": "fulfillment_time",
+      "label": "Fulfillment Date/Time",
+      "datatype": "timestamp",
+      "index": 0,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        }
+      ],
+      "path_label": "Hold Request",
+      "operator": { "label": "Is NULL", "op": "is" },
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": ""
+    },
+    {
+      "name": "cancel_time",
+      "label": "Hold Cancel Date/Time",
+      "datatype": "timestamp",
+      "index": 1,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        }
+      ],
+      "path_label": "Hold Request",
+      "operator": { "label": "Is NULL", "op": "is" },
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": ""
+    },
+    {
+      "name": "hold_type",
+      "label": "Hold Type",
+      "type": "link",
+      "key": "hold_type",
+      "class": "cht",
+      "reltype": "has_a",
+      "datatype": "text",
+      "index": 2,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        }
+      ],
+      "path_label": "Hold Request",
+      "operator": { "op": "=", "label": "Equals" },
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": "",
+      "value": "T"
+    },
+    {
+      "name": "capture_time",
+      "label": "Capture Date/Time",
+      "datatype": "timestamp",
+      "index": 3,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        }
+      ],
+      "path_label": "Hold Request",
+      "operator": { "label": "Is NULL", "op": "is" },
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": ""
+    },
+    {
+      "name": "id",
+      "label": "Organizational Unit ID",
+      "selector": "shortname",
+      "datatype": "org_unit",
+      "index": 4,
+      "path": [
+        {
+          "label": "Hold Request",
+          "id": "ahr",
+          "classname": "ahr",
+          "struct": {
+            "name": "ahr",
+            "label": "Hold Request",
+            "table": "action.hold_request",
+            "core": true,
+            "pkey": "id",
+            "pkey_sequence": "action.hold_request_id_seq",
+            "core_label": "Core sources",
+            "classname": "ahr"
+          },
+          "table": "action.hold_request"
+        },
+        {
+          "label": "Requesting Library",
+          "from": "ahr",
+          "link": {
+            "name": "request_lib",
+            "label": "Requesting Library",
+            "type": "link",
+            "key": "id",
+            "class": "aou",
+            "reltype": "has_a",
+            "datatype": "org_unit"
+          },
+          "id": "ahr.aou",
+          "uplink": {
+            "name": "request_lib",
+            "label": "Requesting Library",
+            "type": "link",
+            "key": "id",
+            "class": "aou",
+            "reltype": "has_a",
+            "datatype": "org_unit"
+          },
+          "classname": "aou",
+          "struct": {
+            "name": "aou",
+            "label": "Organizational Unit",
+            "table": "actor.org_unit",
+            "pkey": "id",
+            "pkey_sequence": "actor.org_unit_id_seq",
+            "core_label": "Non-core sources",
+            "classname": "aou"
+          },
+          "table": "actor.org_unit"
+        }
+      ],
+      "path_label": "Hold Request -> Requesting Library",
+      "operator": { "label": "In list", "op": "in" },
+      "transform": {
+        "transform": "Bare",
+        "label": "Raw Data",
+        "aggregate": false
+      },
+      "doc_text": ""
+    }
+  ]
+}
index d4753ab..d9acbe3 100644 (file)
@@ -18,15 +18,21 @@ class baseReportView {
                                case 2:  $spaces = '&nbsp;&nbsp;&nbsp;&nbsp;'; break;
                                default: $spaces = '&nbsp;'; break;
                        }
-                       if ((isset($this->defaultValues->paramsDecoded->$name) && in_array($values->id, $this->defaultValues->paramsDecoded->$name))
+
+                       $valueCount = false;
+                       $selected = "";
+                       if ( isset( $this->defaultValues ) && isset ( $values ) ){
+                               if ((isset($this->defaultValues->paramsDecoded->$name) && in_array($values->id, $this->defaultValues->paramsDecoded->$name))
                                || (count($this->defaultValues)==0 && $values->id==$_SESSION['homeOU'])) {
                                $selected = ' selected ';
                                $selectedValues .= $values->shortname.'&nbsp;&nbsp;<br>';
-                               if (NULL == $firstSelected) $firstSelected = $index;
+                                       if (NULL == $firstSelected) $firstSelected = $index;
                                }
-                       else {
-                               $selected = '';
-                       }                               
+                               else {
+                                       $selected = "";
+                               }
+                       }
+               
                        $select .= '<option '.$selected.' value="'.$values->id.'">'.$spaces.$values->shortname.'</option>';
                        $index++;
                }
index abec704..d1eacab 100644 (file)
@@ -305,7 +305,7 @@ class reportView extends baseReportView {
                        return submitReport(saveType); 
                }
 
-               var columnNames=<?php echo '{',$jsColumnNamesString,"};\r\n"; ?>
+               var columnNames=<?php echo '{',$jsColumnNamesString,'};'?>
                </script>
                                        
        <?php                   
index f3fc3ba..7c6c451 100644 (file)
@@ -108,7 +108,7 @@ class templateView {
                <tr><td></td><td>Created by <?php echo ($template->usrname)==''?'id# '.$template->owner:$template->usrname, ' on ', date('m/d/Y \a\t h:i:s A', strtotime($template->create_time)); ?></td></tr>
                <tr><td>Name:</td><td><input class="inputName" name="templateName" id="templateName" type="text" maxlength="100" value="<?php echo $template->name; ?>"></td></tr>
                <tr><td>Description:</td><td><Textarea class="descriptionTextArea" name="description" id="description"><?php echo $template->description; ?></Textarea></td></tr>
-               <tr><td>Documentation URL:</td><td><input class="inputName" name="docURL" id="docURL" type="text" maxlength="100" value="<?php echo $template->doc_url; ?>"></td></tr>
+               <tr><td>Documentation URL:</td><td><input class="inputName" name="docURL" id="docURL" type="text" maxlength="100" value="<?php echo isset( $template->docURL) ? $template->docURL : ""; ?>"></td></tr>
                <tr><td>Type:</td><td><?php echo $this->createSimpleSelectFromObject($typeListData, 'typeList', $typeListSelected); ?></td></tr>
                <tr><td>Group:</td><td><?php echo $this->createSimpleSelectFromObject($groupListData, 'groupList', $groupListSelected); ?></td></tr>
                <tr><td>Active:</td><td><select name="active" id="active"><option value="1" <?php echo (isset($template->active) && $template->active==1)?' selected ':'';?>>Yes</option><option value="0" <?php echo (isset($template->active) && $template->active!=1)?' selected ':'';?>>No</option></select></td></tr>
diff --git a/views/terran_equal_in_list.json b/views/terran_equal_in_list.json
new file mode 100644 (file)
index 0000000..7ed126c
--- /dev/null
@@ -0,0 +1 @@
+{"version":5,"core_class":"combcirc","select":[{"alias":"Home Library","path":"aou-shortname","field_doc":"","relation":"84577380bb6510842561b7f81382af5b","column":{"colname":"shortname","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"School","path":"au-guardian","field_doc":"","relation":"6811e1745e0c3f5d8a9832a43993b722","column":{"colname":"guardian","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Grade","path":"au-name_keywords","field_doc":"","relation":"6811e1745e0c3f5d8a9832a43993b722","column":{"colname":"name_keywords","transform":"Bare","transform_label":"Raw Data","aggregate":false}},{"alias":"Count of Circulations","path":"combcirc-id","field_doc":"","relation":"a28abd4e77ad39f3bff5d8d720b02230","column":{"colname":"id","transform":"count","transform_label":"Count","aggregate":true}}],"from":{"alias":"a28abd4e77ad39f3bff5d8d720b02230","path":"combcirc-combcirc","table":"action.all_circulation","idlclass":"combcirc","join":{"usr_home_ou-812c537716bbeffc37e22c7f0bc829dd":{"type":"inner","key":"id","alias":"84577380bb6510842561b7f81382af5b","path":"combcirc-usr_home_ou","table":"actor.org_unit","idlclass":"aou","label":"Combined Aged and Active Circulations -> Patron Home Library"},"usr-8cee82ea4c86f6887c478253de5f1525":{"type":"inner","key":"id","alias":"6811e1745e0c3f5d8a9832a43993b722","path":"combcirc-usr","table":"actor.usr","idlclass":"au","label":"Combined Aged and Active Circulations -> Patron"},"usr_profile-0b448630158e25fe461a4dab76ed7cb4":{"type":"inner","key":"id","alias":"fbb47dba4979508d40938a2bdde82c77","path":"combcirc-usr_profile","table":"permission.grp_tree","idlclass":"pgt","label":"Combined Aged and Active Circulations -> Patron Profile Group"}},"label":"Combined Aged and Active Circulations"},"where":[{"alias":"Checkout Date/Time","path":"combcirc-xact_start","field_doc":"","relation":"a28abd4e77ad39f3bff5d8d720b02230","column":{"colname":"xact_start","transform":"date","transform_label":"Date","aggregate":0},"condition":{"between":"::P0"}},{"alias":"Group ID","path":"pgt-id","field_doc":"","relation":"fbb47dba4979508d40938a2bdde82c77","column":{"colname":"id","transform":"Bare","transform_label":"Raw Data","aggregate":0},"condition":{"=":"61"}},{"alias":"Organizational Unit ID","path":"aou-id","field_doc":"","relation":"84577380bb6510842561b7f81382af5b","column":{"colname":"id","transform":"Bare","transform_label":"Raw Data","aggregate":0},"condition":{"in":"::P1"}}],"having":[],"display_cols":[{"name":"shortname","label":"Home Library","required":true,"datatype":"text","index":0,"path":[{"label":"Combined Aged and Active Circulations","id":"combcirc","classname":"combcirc","struct":{"name":"combcirc","label":"Combined Aged and Active Circulations","table":"action.all_circulation","core":true,"pkey":"id","pkey_sequence":"money.billable_xact_id_seq","core_label":"Core sources","classname":"combcirc"},"table":"action.all_circulation"},{"label":"Patron Home Library","from":"combcirc","link":{"name":"usr_home_ou","label":"Patron Home Library","type":"link","key":"id","class":"aou","reltype":"has_a","datatype":"link"},"id":"combcirc.aou","uplink":{"name":"usr_home_ou","label":"Patron Home Library","type":"link","key":"id","class":"aou","reltype":"has_a","datatype":"link"},"classname":"aou","struct":{"name":"aou","label":"Organizational Unit","table":"actor.org_unit","pkey":"id","pkey_sequence":"actor.org_unit_id_seq","core_label":"Non-core sources","classname":"aou"},"table":"actor.org_unit"}],"path_label":"Combined Aged and Active Circulations -> Patron Home Library","transform":{"label":"Raw Data","transform":"Bare","aggregate":false},"doc_text":""},{"name":"guardian","label":"School","datatype":"text","index":1,"path":[{"label":"Combined Aged and Active Circulations","id":"combcirc","classname":"combcirc","struct":{"name":"combcirc","label":"Combined Aged and Active Circulations","table":"action.all_circulation","core":true,"pkey":"id","pkey_sequence":"money.billable_xact_id_seq","core_label":"Core sources","classname":"combcirc"},"table":"action.all_circulation"},{"label":"Patron","from":"combcirc","link":{"name":"usr","label":"Patron","type":"link","key":"id","class":"au","reltype":"has_a","datatype":"link"},"id":"combcirc.au","uplink":{"name":"usr","label":"Patron","type":"link","key":"id","class":"au","reltype":"has_a","datatype":"link"},"classname":"au","struct":{"name":"au","label":"ILS User","table":"actor.usr","core":true,"pkey":"id","pkey_sequence":"actor.usr_id_seq","core_label":"Core sources","classname":"au"},"table":"actor.usr"}],"path_label":"Combined Aged and Active Circulations -> Patron","transform":{"label":"Raw Data","transform":"Bare","aggregate":false},"doc_text":""},{"name":"name_keywords","label":"Grade","datatype":"text","index":2,"path":[{"label":"Combined Aged and Active Circulations","id":"combcirc","classname":"combcirc","struct":{"name":"combcirc","label":"Combined Aged and Active Circulations","table":"action.all_circulation","core":true,"pkey":"id","pkey_sequence":"money.billable_xact_id_seq","core_label":"Core sources","classname":"combcirc"},"table":"action.all_circulation"},{"label":"Patron","from":"combcirc","link":{"name":"usr","label":"Patron","type":"link","key":"id","class":"au","reltype":"has_a","datatype":"link"},"id":"combcirc.au","uplink":{"name":"usr","label":"Patron","type":"link","key":"id","class":"au","reltype":"has_a","datatype":"link"},"classname":"au","struct":{"name":"au","label":"ILS User","table":"actor.usr","core":true,"pkey":"id","pkey_sequence":"actor.usr_id_seq","core_label":"Core sources","classname":"au"},"table":"actor.usr"}],"path_label":"Combined Aged and Active Circulations -> Patron","transform":{"label":"Raw Data","transform":"Bare","aggregate":false},"doc_text":""},{"name":"id","label":"Count of Circulations","datatype":"id","index":3,"path":[{"label":"Combined Aged and Active Circulations","id":"combcirc","classname":"combcirc","struct":{"name":"combcirc","label":"Combined Aged and Active Circulations","table":"action.all_circulation","core":true,"pkey":"id","pkey_sequence":"money.billable_xact_id_seq","core_label":"Core sources","classname":"combcirc"},"table":"action.all_circulation"}],"path_label":"Combined Aged and Active Circulations","transform":{"label":"Count","transform":"count","aggregate":true},"doc_text":""}],"filter_cols":[{"name":"xact_start","label":"Checkout Date/Time","datatype":"timestamp","index":0,"path":[{"label":"Combined Aged and Active Circulations","id":"combcirc","classname":"combcirc","struct":{"name":"combcirc","label":"Combined Aged and Active Circulations","table":"action.all_circulation","core":true,"pkey":"id","pkey_sequence":"money.billable_xact_id_seq","core_label":"Core sources","classname":"combcirc"},"table":"action.all_circulation"}],"path_label":"Combined Aged and Active Circulations","operator":{"label":"Between","op":"between"},"transform":{"transform":"date","label":"Date","aggregate":false},"doc_text":""},{"name":"id","label":"Group ID","selector":"name","datatype":"id","index":1,"path":[{"label":"Combined Aged and Active Circulations","id":"combcirc","classname":"combcirc","struct":{"name":"combcirc","label":"Combined Aged and Active Circulations","table":"action.all_circulation","core":true,"pkey":"id","pkey_sequence":"money.billable_xact_id_seq","core_label":"Core sources","classname":"combcirc"},"table":"action.all_circulation"},{"label":"Patron Profile Group","from":"combcirc","link":{"name":"usr_profile","label":"Patron Profile Group","type":"link","key":"id","class":"pgt","reltype":"has_a","datatype":"link"},"id":"combcirc.pgt","uplink":{"name":"usr_profile","label":"Patron Profile Group","type":"link","key":"id","class":"pgt","reltype":"has_a","datatype":"link"},"classname":"pgt","struct":{"name":"pgt","label":"Permission Group","table":"permission.grp_tree","pkey":"id","pkey_sequence":"permission.grp_tree_id_seq","core_label":"Non-core sources","classname":"pgt"},"table":"permission.grp_tree"}],"path_label":"Combined Aged and Active Circulations -> Patron Profile Group","operator":{"op":"=","label":"Equals"},"transform":{"label":"Raw Data","transform":"Bare","aggregate":false},"doc_text":"","value":"61"},{"name":"id","label":"Organizational Unit ID","selector":"shortname","datatype":"org_unit","index":2,"path":[{"label":"Combined Aged and Active Circulations","id":"combcirc","classname":"combcirc","struct":{"name":"combcirc","label":"Combined Aged and Active Circulations","table":"action.all_circulation","core":true,"pkey":"id","pkey_sequence":"money.billable_xact_id_seq","core_label":"Core sources","classname":"combcirc"},"table":"action.all_circulation"},{"label":"Patron Home Library","from":"combcirc","link":{"name":"usr_home_ou","label":"Patron Home Library","type":"link","key":"id","class":"aou","reltype":"has_a","datatype":"link"},"id":"combcirc.aou","uplink":{"name":"usr_home_ou","label":"Patron Home Library","type":"link","key":"id","class":"aou","reltype":"has_a","datatype":"link"},"classname":"aou","struct":{"name":"aou","label":"Organizational Unit","table":"actor.org_unit","pkey":"id","pkey_sequence":"actor.org_unit_id_seq","core_label":"Non-core sources","classname":"aou"},"table":"actor.org_unit"}],"path_label":"Combined Aged and Active Circulations -> Patron Home Library","operator":{"label":"In list","op":"in"},"transform":{"label":"Raw Data","transform":"Bare","aggregate":false},"doc_text":""}]}
diff --git a/views/terran_saved_list.json b/views/terran_saved_list.json
new file mode 100644 (file)
index 0000000..d14cfa3
--- /dev/null
@@ -0,0 +1 @@
+{"docURL":null,"reportColumns":{"0":{"name":"Home Library","aggregate":false,"transformLabel":"Raw Data"},"1":{"name":"School","aggregate":false,"transformLabel":"Raw Data"},"2":{"name":"Grade","aggregate":false,"transformLabel":"Raw Data"},"3":{"name":"Count of Circulations","aggregate":true,"transformLabel":"Count"}},"userParams":{"0":{"column":"Combined Aged and Active Circulations","transform":"date","transformLabel":"Date","op":"between","opLabel":"Between","param":"::P0","fieldDoc":"","aggregate":false,"dataType":"timestamp","table":"action.all_circulation","paramType":"user"},"1":{"column":"Combined Aged and Active Circulations -> Patron Home Library","transform":"Bare","transformLabel":"Raw Data","op":"=","opLabel":"Equals","param":"::P1","fieldDoc":"","aggregate":false,"dataType":"id","table":"actor.org_unit","paramType":"user"}},"staticParams":{"0":{"column":"Combined Aged and Active Circulations -> Patron Profile Group","transform":"Bare","transformLabel":"Raw Data","op":"=","opLabel":"Equals","param":"61","fieldDoc":"","aggregate":false,"dataType":"id","table":"permission.grp_tree","paramType":"static"}}}
\ No newline at end of file