Skip to content

KAN-278 chore: squash migration graph to a fresh baseline - #434

Merged
corrin merged 6 commits into
mainfrom
feat/KAN-278-people-companies
Jul 6, 2026
Merged

KAN-278 chore: squash migration graph to a fresh baseline#434
corrin merged 6 commits into
mainfrom
feat/KAN-278-people-companies

Conversation

@corrin

@corrin corrin commented Jul 6, 2026

Copy link
Copy Markdown
Owner

What

Squashes the entire first-party migration graph (469 files, 11 apps) to a fresh baseline. Step 1 of the KAN-278 redo — a prerequisite for the Client→Company rename (separate PR).

Why

The historic graph carried latent cross-app ordering gaps (e.g. workflow/0157 deleting state models without depending on job/0015; accounts/0017 order-fragile against job/0098+). The graph only worked because Django's DFS leaf order happened to dodge them — any new cross-app dependency edge reshuffles that order and trips the gaps (this burned about a day of the abandoned first rename attempt). A fresh baseline erases the whole failure class.

Mechanism

Fresh 0001_baseline (+ 0002_baseline where cross-app FK cycles force a split) generated by makemigrations, each carrying a replaces list naming every old file-backed migration. Django's check_replacements() records the baselines as applied on any DB whose ledger contains all replaced names — zero DDL on live databases, no --fake, no ledger surgery. Old files are deleted in this PR (all instances are fully applied, so nothing can be partially replaced). New migration names deliberately avoid every historic name (a replaces list naming the migration's own key makes Django's loader report "Cyclical squash replacement").

Data that fresh installs previously got from historic RunPython migrations is re-seeded by five typed, idempotent, reversible seed migrations:

  • accounts/0003 system automation user (Staff.get_automation_user() requires it)
  • job/0002 labour subtype catalogue (final state of old 0093+0098+0099)
  • workflow/0002 the 7 canonical-UUID XeroPayItems (prod backups exclude this table; FKs must resolve)
  • workflow/0003 9 Celery Beat schedules (old 0220+0226+0229)
  • crm/0002 2 phone-call schedules (old crm seeds, net of 0005)

The remaining ~85 RunPython/RunSQL migrations were backfills/repairs of then-existing data or env-gated one-shots — verified no-ops on an empty DB; their effects are baked into every live DB. TrigramExtension() is hand-added at the top of client/0001_baseline (the client_name_trgm_idx GinIndex needs pg_trgm; historically installed by job/0083) — the only schema state makemigrations could not regenerate.

⚠️ Sequencing: deploy to main tip BEFORE merging

Every instance (prod + UAT) must be deployed to current main (≥ 6ebc1b6) before this merges, so its ledger contains every replaced migration. An instance that misses this fails its next migrate loudly and pre-DDL with "Django tried to replace migration … but wasn't able to because some of the replaced migrations are already applied". Recovery: deploy pre-squash main, migrate, then redeploy.

Schema-truth cleanups (the only observable DB changes)

Verification exposed three objects live DBs carry that the models don't declare. Per the fix-the-data posture, three post-baseline migrations (not in any replaces, so they run everywhere; IF EXISTS no-ops on fresh DBs) normalise live DBs to model truth:

  1. purchasing/0002 drops workflow_stock_xero_id_key — a duplicate UNIQUE on stock.xero_id (the Meta constraint unique_xero_id_stock remains).
  2. workflow/0004 drops workflow_companydefaults_company_name_c3a41743_like — an orphaned pattern-ops index with no base index and no model backing.
  3. crm/0003 drops crm_phonenumberclientmapping — an orphaned empty table from a since-renumbered historic migration (0 rows, zero code references).

Verification

  • Fresh-DB schema parity: from-scratch migrate of old graph vs new graph, normalized catalog diff (indexes name-stripped, constraint definitions, columns, tables, extensions) = empty after the cleanups. Raw-dump diff contains only auto-generated name differences (65 indexes, ~111 constraints named under creation-era table names on old DBs vs modern names fresh — Django finds objects by introspection, both generations are safe) plus one accepted mechanism change: companydefaults.id is a serial on existing DBs and GENERATED BY DEFAULT AS IDENTITY on fresh ones (Django 6 default; functionally identical, and django-solo always writes pk=1 explicitly).
  • Existing-DB no-op: on the dev instance, migrate --plan listed only the three cleanups; schema dump before/after differs by exactly the three dropped objects; ledger gained exactly the 20 new migration names; migrate --check and makemigrations --check --dry-run clean. After the cleanups, the dev instance's normalized catalogs match a fresh install exactly except the serial/identity line.
  • Full backend suite green (conftest drops the schema and migrates from scratch each session, so the run exercises the new graph + seeds: LabourSubtypeSeedTests, automation-user tests, kanban trigram tests).
  • bash scripts/check_mypy.sh clean; baseline shrank 4823 → 4627 (orphaned migration entries; seeds added none).
  • E2E not run: schema-identical change with no user-facing surface; the gates above prove the migration behaviour E2E cannot.

Deleted tests

They imported deleted migration modules to replay one-shot historical data repairs (effects long baked into every live DB): test_migration_0017_backfill.py, test_onsite_rerate.py, test_labour_reclassification.py, plus classes CostLineSubtypeBackfillRuleTests and XeroRawJsonMigrationHelperTests.

Notes

  • timesheet has no models and now no migrations; its 5 old ledger rows are inert (as are the other ghost ledger rows from historic renumbering — deliberately excluded from replaces).
  • Dumps taken pre-squash can only be migrated by a pre-squash checkout (docs/updating.md / docs/restore-prod-to-nonprod.md updated; the self-expiring restore-workaround-jobevent-staff-null.md met its own deletion condition and is removed). E2E is unaffected — global-setup takes a fresh dump per run.
  • Follow-up (later, trivial): drop the replaces lists once every instance has migrated once post-merge.

🤖 Generated with Claude Code

corrin and others added 6 commits July 6, 2026 12:35
Deletes all 469 first-party migration files (accounting, accounts, client,
crm, job, operations, process, purchasing, quoting, timesheet, workflow)
ahead of regenerating a fresh baseline. The historic graph carried latent
cross-app ordering gaps (workflow/0157 vs job/0015, accounts/0017 vs
job/0098+) that surface whenever a new dependency edge reshuffles Django's
DFS leaf order.

Also deletes tests that import the deleted migration modules to replay
one-shot historical data repairs (effects long baked into every live DB):
- apps/client/tests/test_migration_0017_backfill.py
- apps/job/tests/test_onsite_rerate.py (replayed job/0102)
- apps/job/tests/test_labour_reclassification.py (replayed job/0100-0101)
- CostLineSubtypeBackfillRuleTests in test_labour_subtypes.py (job/0095)
- XeroRawJsonMigrationHelperTests in test_xero_document_raw_json.py
  (accounting/0008)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
makemigrations output against current models: one 0001_baseline per app,
plus 0002_baseline where cross-app FK cycles force a split (accounting,
accounts). timesheet has no models and gets no migrations. Named
*_baseline (not 0001_initial) because a replacing migration whose key
collides with a name in any replaces list trips Django's "Cyclical squash
replacement" loader check.

Each migration carries a replaces list naming every old file-backed
migration (464 total), so Django's check_replacements() records the
baselines as applied on any up-to-date database - zero DDL on live
instances, no --fake, no ledger surgery. Ghost ledger names from historic
renumbering are deliberately excluded (a replaces entry a DB lacks would
abort as partially applied).

One hand edit: TrigramExtension() opens client/0001_baseline - the
client_name_trgm_idx GinIndex needs pg_trgm at creation time (historically
installed by job/0083); everything else regenerates from model Meta.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Fresh databases (pytest conftest, CI, instance.sh create) get seed data
from migrations, not fixtures. Five typed, idempotent, reversible seeds
carry over what the deleted historic RunPython migrations provided:

- accounts/0003: system automation Staff user
  (Staff.get_automation_user() raises without it)
- job/0002: labour subtype catalogue, final state of old 0093+0098+0099;
  Onsite at 165.00, others at the historical fresh-install default 105.00
  (CompanyDefaults.charge_out_rate no longer exists; per-instance tuning
  happens in the labour-rates admin UI)
- workflow/0002: the 7 canonical-UUID XeroPayItems (prod backups exclude
  this table; Job/CostLine FK references must resolve)
- workflow/0003: 9 Celery Beat schedules (old 0220+0226+0229)
- crm/0002: 2 phone-call schedules (old crm 0001 seed net of 0005)

The remaining ~85 historic RunPython/RunSQL migrations were backfills or
env-gated one-shots - no-ops on an empty database, effects baked into
every live one.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ared

Schema-parity verification (old-graph fresh install vs new-graph fresh
install vs the dev instance) exposed three objects on live databases that
no model declares and the baseline schema does not create. Normalise live
databases to model truth; IF EXISTS makes each a no-op on fresh installs.
These are the only migrations in this PR that execute real DDL on live
instances:

- purchasing/0002: drop workflow_stock_xero_id_key, a duplicate UNIQUE on
  stock.xero_id (the Meta constraint unique_xero_id_stock remains)
- workflow/0004: drop the orphaned varchar_pattern_ops index on
  companydefaults.company_name (companion of an index removed long ago)
- crm/0003: drop crm_phonenumberclientmapping, an empty, code-unreferenced
  table from a since-renumbered historic migration

After these, the dev instance's normalized schema catalogs match a fresh
install exactly, except companydefaults.id being serial on existing DBs vs
identity on fresh ones (Django 6 default; functionally identical, and
django-solo always writes pk=1 explicitly).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…g tests

Both files create Jobs; Job.save -> generate_job_number ->
CompanyDefaults.get_solo(), and the singleton cannot be lazily created
(shop_client is NOT NULL). They previously passed only because an earlier
test in collection order had loaded the fixture; deleting the
migration-replay tests changed the order and surfaced the latent
dependency. Load the fixture explicitly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Baseline shrinks 4823 -> 4627: entries for deleted migration files under
apps/*/migrations/ (only workflow/migrations/ was mypy-excluded). The new
baseline and seed migrations are fully typed and add no entries.

Docs: updating.md and restore-prod-to-nonprod.md note that dumps taken
before the squash can only be migrated by a pre-squash checkout.
restore-workaround-jobevent-staff-null.md met its own stated deletion
condition (post-0079 prod backups everywhere) and referenced migrations
that no longer exist; deleted per its own instruction.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Jul 6, 2026

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 493 files, which is 343 over the limit of 150.

To get a review, narrow the scope:
• coderabbit review --type committed # exclude uncommitted changes
• coderabbit review --dir # limit to a subdirectory
• coderabbit review --base # compare against a closer base

Upgrade to a paid plan to raise the limit.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: cae1a83f-904e-4dbe-a706-b60a0957df6b

📥 Commits

Reviewing files that changed from the base of the PR and between 6ebc1b6 and 020b38c.

📒 Files selected for processing (493)
  • apps/accounting/migrations/0001_baseline.py
  • apps/accounting/migrations/0002_baseline.py
  • apps/accounting/migrations/0002_initial.py
  • apps/accounting/migrations/0003_alter_invoice_job.py
  • apps/accounting/migrations/0004_protect_critical_fks.py
  • apps/accounting/migrations/0005_quote_number.py
  • apps/accounting/migrations/0006_alter_bill_table_alter_billlineitem_table_and_more.py
  • apps/accounting/migrations/0007_partial_invoice_billing_metadata.py
  • apps/accounting/migrations/0008_normalize_xero_raw_json_strings.py
  • apps/accounts/migrations/0001_baseline.py
  • apps/accounts/migrations/0002_baseline.py
  • apps/accounts/migrations/0002_initial.py
  • apps/accounts/migrations/0003_alter_historicalstaff_updated_at_and_more.py
  • apps/accounts/migrations/0003_seed_system_automation_user.py
  • apps/accounts/migrations/0004_add_staff_permissions_tables.py
  • apps/accounts/migrations/0005_alter_staff_groups_alter_staff_user_permissions.py
  • apps/accounts/migrations/0006_historicalstaff_date_left_staff_date_left.py
  • apps/accounts/migrations/0007_auto_20250730_2359.py
  • apps/accounts/migrations/0008_remove_historicalstaff_is_active_and_more.py
  • apps/accounts/migrations/0009_historicalstaff_xero_user_id_staff_xero_user_id.py
  • apps/accounts/migrations/0010_rename_is_staff_historicalstaff_is_office_staff_and_more.py
  • apps/accounts/migrations/0011_remove_ims_payroll_fields.py
  • apps/accounts/migrations/0012_add_base_wage_rate.py
  • apps/accounts/migrations/0013_alter_historicalstaff_table_alter_staff_table.py
  • apps/accounts/migrations/0014_add_is_workshop_staff.py
  • apps/accounts/migrations/0016_historicalstaff_default_labour_subtype_and_more.py
  • apps/accounts/migrations/0017_backfill_staff_default_labour_subtype.py
  • apps/client/migrations/0001_baseline.py
  • apps/client/migrations/0001_initial.py
  • apps/client/migrations/0002_clientcontact.py
  • apps/client/migrations/0003_add_xero_merge_tracking.py
  • apps/client/migrations/0004_populate_merge_fields.py
  • apps/client/migrations/0005_client_is_supplier.py
  • apps/client/migrations/0006_alter_client_name.py
  • apps/client/migrations/0007_delete_empty_name_contacts.py
  • apps/client/migrations/0008_merge_duplicate_contacts.py
  • apps/client/migrations/0009_clientcontact_unique_client_contact_name.py
  • apps/client/migrations/0010_add_is_active_to_clientcontact.py
  • apps/client/migrations/0011_convert_empty_strings_to_null.py
  • apps/client/migrations/0012_supplierpickupaddress.py
  • apps/client/migrations/0013_add_google_fields_to_pickup_address.py
  • apps/client/migrations/0014_add_suburb_to_pickup_address.py
  • apps/client/migrations/0015_populate_xero_addresses.py
  • apps/client/migrations/0016_alter_client_table_alter_clientcontact_table_and_more.py
  • apps/client/migrations/0017_reassign_stranded_merged_client_fks.py
  • apps/client/migrations/0018_client_allow_jobs.py
  • apps/client/migrations/0019_client_name_fts_index.py
  • apps/client/migrations/0020_suppliersearchalias_and_more.py
  • apps/client/migrations/0021_clientcontactmethod.py
  • apps/client/migrations/0022_client_name_trgm_index.py
  • apps/client/migrations/0023_drop_scalar_phone_fields.py
  • apps/client/tests/test_migration_0017_backfill.py
  • apps/crm/migrations/0001_baseline.py
  • apps/crm/migrations/0001_initial.py
  • apps/crm/migrations/0002_seed_phone_call_schedules.py
  • apps/crm/migrations/0003_drop_orphaned_phone_mapping_table.py
  • apps/crm/migrations/0003_phonecallrecording_archive_error.py
  • apps/crm/migrations/0004_phonecallrecord_job_link.py
  • apps/crm/migrations/0006_phone_endpoints_and_classification.py
  • apps/crm/migrations/0007_alter_phoneprovidersettings_password_and_more.py
  • apps/crm/migrations/0008_phone_call_number_indexes.py
  • apps/crm/migrations/0009_phone_call_normalized_numbers.py
  • apps/job/migrations/0001_baseline.py
  • apps/job/migrations/0001_initial.py
  • apps/job/migrations/0002_alter_historicaljob_pricing_type_and_more.py
  • apps/job/migrations/0002_seed_labour_subtypes.py
  • apps/job/migrations/0003_historicaljob_contact_email_job_contact_email.py
  • apps/job/migrations/0004_alter_historicaljob_contact_phone_and_more.py
  • apps/job/migrations/0005_remove_materialentry_source_stock_and_more.py
  • apps/job/migrations/0006_add_material_adjustment_jobpart_models.py
  • apps/job/migrations/0007_add_materialentry_add_adjustmententry.py
  • apps/job/migrations/0007_fix_jobpart_state.py
  • apps/job/migrations/0008_alter_jobpart_options_and_more.py
  • apps/job/migrations/0009_historicaljob_priority_job_priority_and_more.py
  • apps/job/migrations/0010_populate_priority_for_existing_jobs.py
  • apps/job/migrations/0011_rename_revenue_adjustment_adjustmententry_price_adjustment_and_more.py
  • apps/job/migrations/0011_update_purchase_order_line_reference.py
  • apps/job/migrations/0012_alter_jobevent_job.py
  • apps/job/migrations/0012_merge_20250604_2123.py
  • apps/job/migrations/0013_merge_20250605_0811.py
  • apps/job/migrations/0014_alter_jobpart_table.py
  • apps/job/migrations/0015_alter_historicaljob_client_alter_job_client_and_more.py
  • apps/job/migrations/0016_add_contact_foreignkey.py
  • apps/job/migrations/0017_migrate_contact_data.py
  • apps/job/migrations/0018_add_accounting_date_fields.py
  • apps/job/migrations/0018_costing_initial.py
  • apps/job/migrations/0019_job_latest_sets.py
  • apps/job/migrations/0019_populate_accounting_dates.py
  • apps/job/migrations/0020_change_priority_to_float.py
  • apps/job/migrations/0021_add_is_quote_adjustment_field.py
  • apps/job/migrations/0022_merge_20250615_1511.py
  • apps/job/migrations/0023_add_new_job_statuses.py
  • apps/job/migrations/0024_rename_pricing_jobpricing.py
  • apps/job/migrations/0025_update_job_statuses_for_kanban.py
  • apps/job/migrations/0026_alter_historicaljob_status_alter_job_status.py
  • apps/job/migrations/0027_quotespreadsheet.py
  • apps/job/migrations/0028_add_job_quote_chat_model.py
  • apps/job/migrations/0029_remove_historicaljob_contact_email_and_more.py
  • apps/job/migrations/0030_migrate_pricing_to_costing_and_cleanup.py
  • apps/job/migrations/0031_remove_jobpart_job_pricing_and_more.py
  • apps/job/migrations/0032_fix_blank_job_names.py
  • apps/job/migrations/0033_update_job_statuses_for_simplified_kanban.py
  • apps/job/migrations/0034_remove_legacy_status_choices.py
  • apps/job/migrations/0035_alter_jobevent_id.py
  • apps/job/migrations/0036_complete_uuid_transition.py
  • apps/job/migrations/0037_finalize_uuid_transition.py
  • apps/job/migrations/0038_add_event_deduplication.py
  • apps/job/migrations/0039_alter_job_options_costline_xero_expense_id_and_more.py
  • apps/job/migrations/0040_historicaljob_fully_invoiced_job_fully_invoiced.py
  • apps/job/migrations/0041_populate_fully_invoiced.py
  • apps/job/migrations/0042_add_xero_default_task_id.py
  • apps/job/migrations/0043_alter_costline_xero_last_modified_and_more.py
  • apps/job/migrations/0044_alter_costline_options_costline_created_at_and_more.py
  • apps/job/migrations/0045_create_job_delta_rejection.py
  • apps/job/migrations/0046_add_delta_fields_to_job_event.py
  • apps/job/migrations/0047_add_accounting_date_nullable.py
  • apps/job/migrations/0048_populate_accounting_date.py
  • apps/job/migrations/0049_make_accounting_date_not_null.py
  • apps/job/migrations/0050_backfill_costset_summaries.py
  • apps/job/migrations/0051_fix_costset_summary_default.py
  • apps/job/migrations/0052_alter_costline_desc.py
  • apps/job/migrations/0053_add_speed_quality_tradeoff.py
  • apps/job/migrations/0054_protect_critical_fks.py
  • apps/job/migrations/0055_add_price_cap.py
  • apps/job/migrations/0056_add_safety_document.py
  • apps/job/migrations/0057_safetydocument_google_docs.py
  • apps/job/migrations/0058_safetydocument_document_number_and_more.py
  • apps/job/migrations/0059_costline_approved.py
  • apps/job/migrations/0060_alter_historicaljob_rejected_flag_and_more.py
  • apps/job/migrations/0061_fix_labour_cost_lines.py
  • apps/job/migrations/0062_alter_costline_meta_ext_refs.py
  • apps/job/migrations/0063_job_payroll_category.py
  • apps/job/migrations/0064_job_default_xero_pay_item.py
  • apps/job/migrations/0065_make_default_xero_pay_item_required.py
  • apps/job/migrations/0066_zero_shop_job_revenue.py
  • apps/job/migrations/0067_normalize_wage_rate_multiplier.py
  • apps/job/migrations/0068_add_completed_at.py
  • apps/job/migrations/0069_fix_fully_invoiced.py
  • apps/job/migrations/0070_delete_safetydocument.py
  • apps/job/migrations/0071_add_rdti_type.py
  • apps/job/migrations/0072_rename_job_quote_c_job_id_24cfd1_idx_job_jobquot_job_id_c83a63_idx_and_more.py
  • apps/job/migrations/0073_add_min_max_people.py
  • apps/job/migrations/0074_jobdeltarejection_resolved_and_more.py
  • apps/job/migrations/0075_backfill_jobevent_status_from_historicaljob.py
  • apps/job/migrations/0076_add_jobevent_detail_field.py
  • apps/job/migrations/0077_backfill_jobevent_detail.py
  • apps/job/migrations/0078_backfill_jobevent_staff_from_history.py
  • apps/job/migrations/0079_alter_jobevent_staff_not_null.py
  • apps/job/migrations/0080_backfill_jobevent_status_delta.py
  • apps/job/migrations/0081_backfill_jobevent_creation_delta.py
  • apps/job/migrations/0082_drop_jobevent_description.py
  • apps/job/migrations/0083_enable_pg_trgm.py
  • apps/job/migrations/0084_reconcile_time_xero_pay_items.py
  • apps/job/migrations/0085_backfill_time_rate_multipliers.py
  • apps/job/migrations/0086_repoint_stale_time_pay_items.py
  • apps/job/migrations/0087_costline_staff_entry_seq.py
  • apps/job/migrations/0088_reclassify_stock_consumption_costlines.py
  • apps/job/migrations/0089_backfill_costline_staff_entry_seq.py
  • apps/job/migrations/0090_costline_staff_entry_seq_constraints.py
  • apps/job/migrations/0091_require_latest_costsets_drop_historicaljob.py
  • apps/job/migrations/0092_laboursubtype_joblabourrate.py
  • apps/job/migrations/0093_seed_labour_subtypes.py
  • apps/job/migrations/0094_costline_labour_subtype.py
  • apps/job/migrations/0095_backfill_job_labour_rates_and_costline_subtypes.py
  • apps/job/migrations/0096_remove_job_charge_out_rate.py
  • apps/job/migrations/0097_alter_joblabourrate_options.py
  • apps/job/migrations/0098_clean_labour_subtype_catalogue.py
  • apps/job/migrations/0099_add_onsite_quoting_and_reactivate_delivery.py
  • apps/job/migrations/0100_reclassify_labour_cost_lines.py
  • apps/job/migrations/0101_reclassify_generic_labour_cost_lines.py
  • apps/job/migrations/0102_rerate_onsite_open_jobs.py
  • apps/job/migrations/0103_add_job_is_urgent.py
  • apps/job/migrations/0104_non_negative_labour_rates.py
  • apps/job/tests/test_labour_reclassification.py
  • apps/job/tests/test_labour_subtypes.py
  • apps/job/tests/test_onsite_rerate.py
  • apps/operations/migrations/0001_baseline.py
  • apps/operations/migrations/0002_not_reached_in_horizon.py
  • apps/process/migrations/0001_baseline.py
  • apps/process/migrations/0002_formentry_staff_historicalformentry_staff_and_more.py
  • apps/process/migrations/0003_alter_form_table_alter_formentry_table_and_more.py
  • apps/purchasing/migrations/0001_baseline.py
  • apps/purchasing/migrations/0001_move_purchase_models_state.py
  • apps/purchasing/migrations/0002_drop_legacy_stock_xero_id_dupe.py
  • apps/purchasing/migrations/0002_move_purchase_models_database.py
  • apps/purchasing/migrations/0003_alter_purchaseorder_xero_tenant_id_and_more.py
  • apps/purchasing/migrations/0004_stock.py
  • apps/purchasing/migrations/0005_add_stock_in_database.py
  • apps/purchasing/migrations/0006_add_stock_item_code_xero_id.py
  • apps/purchasing/migrations/0007_stock_unique_xero_id.py
  • apps/purchasing/migrations/0008_stock_parsed_at_stock_parser_confidence_and_more.py
  • apps/purchasing/migrations/0009_purchaseorderline_item_code.py
  • apps/purchasing/migrations/0010_add_raw_json_to_purchaseorder.py
  • apps/purchasing/migrations/0011_stock_xero_inventory_tracked.py
  • apps/purchasing/migrations/0012_add_unit_revenue_to_stock.py
  • apps/purchasing/migrations/0013_populate_unit_revenue_from_existing_data.py
  • apps/purchasing/migrations/0014_remove_retail_rate_field.py
  • apps/purchasing/migrations/0015_stock_active_source_purchase_order_line_id_and_more.py
  • apps/purchasing/migrations/0016_add_product_catalog_source.py
  • apps/purchasing/migrations/0017_remove_stock_notes.py
  • apps/purchasing/migrations/0018_add_xero_line_item_id.py
  • apps/purchasing/migrations/0019_populate_xero_line_item_id.py
  • apps/purchasing/migrations/0020_add_purchaseorderevent.py
  • apps/purchasing/migrations/0021_clean_po_line_descriptions.py
  • apps/purchasing/migrations/0022_add_pickup_address_to_po.py
  • apps/purchasing/migrations/0023_dedupe_stock_item_codes.py
  • apps/purchasing/migrations/0024_stock_item_code_unique.py
  • apps/purchasing/migrations/0025_add_xero_last_synced_to_stock.py
  • apps/purchasing/migrations/0026_remove_xero_last_synced_default.py
  • apps/purchasing/migrations/0027_add_created_by_to_purchase_order.py
  • apps/purchasing/migrations/0028_update_created_by_from_events.py
  • apps/purchasing/migrations/0029_alter_purchaseorder_table_and_more.py
  • apps/purchasing/migrations/0030_add_stock_updated_at.py
  • apps/purchasing/migrations/0031_stock_fts_index.py
  • apps/purchasing/migrations/0032_stock_parser_attempted_at.py
  • apps/purchasing/migrations/0033_use_aluminium_metal_type.py
  • apps/purchasing/tests/test_purchase_order_line_usage.py
  • apps/purchasing/tests/test_stock_metadata_tasks.py
  • apps/quoting/migrations/0001_baseline.py
  • apps/quoting/migrations/0001_initial.py
  • apps/quoting/migrations/0002_supplierpricelist_supplierproduct_price_list.py
  • apps/quoting/migrations/0003_alter_supplierpricelist_supplier_and_more.py
  • apps/quoting/migrations/0004_scrapejob.py
  • apps/quoting/migrations/0005_alter_supplierproduct_unique_together_and_more.py
  • apps/quoting/migrations/0006_alter_supplierproduct_unique_together_and_more.py
  • apps/quoting/migrations/0007_supplierproduct_parsed_alloy_and_more.py
  • apps/quoting/migrations/0008_parse_existing_products.py
  • apps/quoting/migrations/0010_productparsingmapping_item_code_is_in_xero.py
  • apps/quoting/migrations/0011_add_mapping_hash_to_supplierproduct.py
  • apps/quoting/migrations/0012_supplierproduct_last_scraped.py
  • apps/quoting/migrations/0013_productparsingmapping_derived_key.py
  • apps/quoting/migrations/0014_make_parser_fields_nullable.py
  • apps/quoting/migrations/0015_protect_critical_fks.py
  • apps/quoting/migrations/0016_protect_supplier_relationships.py
  • apps/quoting/migrations/0017_add_is_discontinued_to_supplierproduct.py
  • apps/quoting/migrations/0018_mark_404_products_as_discontinued.py
  • apps/quoting/migrations/0019_use_aluminium_metal_type.py
  • apps/quoting/migrations/0020_suppliercredential_supplierscraperconfig_and_more.py
  • apps/quoting/migrations/0021_migrate_steel_and_tube_credentials.py
  • apps/timesheet/migrations/0001_initial.py
  • apps/timesheet/migrations/0002_alter_timeentry_job_pricing_fk.py
  • apps/timesheet/migrations/0003_delete_timeentry.py
  • apps/timesheet/migrations/0005_xero_payrun.py
  • apps/timesheet/migrations/0006_delete_xeropayrun_model.py
  • apps/workflow/migrations/0001_baseline.py
  • apps/workflow/migrations/0001_initial.py
  • apps/workflow/migrations/0002_seed_xero_pay_items.py
  • apps/workflow/migrations/0003_companydefaults_alter_client_xero_contact_id.py
  • apps/workflow/migrations/0003_seed_celery_beat_schedules.py
  • apps/workflow/migrations/0004_companydefaults_company_name.py
  • apps/workflow/migrations/0004_drop_orphaned_company_name_index.py
  • apps/workflow/migrations/0005_remove_companydefaults_id_and_more.py
  • apps/workflow/migrations/0006_quotepricing.py
  • apps/workflow/migrations/0007_remove_historicaljob_client_name_and_more.py
  • apps/workflow/migrations/0008_remove_jobpricing_job_pricing_number.py
  • apps/workflow/migrations/0009_historicaljob_job_is_valid_job_job_is_valid.py
  • apps/workflow/migrations/0010_remove_historicaljob_job_name_remove_job_job_name.py
  • apps/workflow/migrations/0011_remove_timeentry_minutes_timeentry_description_and_more.py
  • apps/workflow/migrations/0012_alter_timeentry_staff.py
  • apps/workflow/migrations/0013_alter_timeentry_date.py
  • apps/workflow/migrations/0014_historicaljob_quote_acceptance_date_and_more.py
  • apps/workflow/migrations/0015_historicaljob_delivery_date_job_delivery_date.py
  • apps/workflow/migrations/0016_materialentry_item_code.py
  • apps/workflow/migrations/0017_materialentry_comments.py
  • apps/workflow/migrations/0018_rename_cost_adjustmententry_cost_adjustment_and_more.py
  • apps/workflow/migrations/0019_alter_historicaljob_delivery_date_and_more.py
  • apps/workflow/migrations/0020_historicaljob_material_gauge_quantity_and_more.py
  • apps/workflow/migrations/0021_alter_historicaljob_description_and_more.py
  • apps/workflow/migrations/0022_alter_historicaljob_description_and_more.py
  • apps/workflow/migrations/0023_alter_historicaljob_contact_phone_and_more.py
  • apps/workflow/migrations/0024_alter_jobpricing_options_jobpricing_revision_number.py
  • apps/workflow/migrations/0025_historicaljob_latest_estimate_pricing_and_more.py
  • apps/workflow/migrations/0026_alter_job_latest_estimate_pricing_and_more.py
  • apps/workflow/migrations/0027_remove_jobpricing_job.py
  • apps/workflow/migrations/0028_jobpricing_job.py
  • apps/workflow/migrations/0029_alter_jobpricing_job.py
  • apps/workflow/migrations/0030_alter_jobpricing_job.py
  • apps/workflow/migrations/0031_alter_jobpricing_job.py
  • apps/workflow/migrations/0032_alter_job_latest_estimate_pricing_and_more.py
  • apps/workflow/migrations/0033_remove_jobpricing_job_and_more.py
  • apps/workflow/migrations/0034_alter_materialentry_quantity_and_more.py
  • apps/workflow/migrations/0035_alter_adjustmententry_comments_and_more.py
  • apps/workflow/migrations/0036_historicalstaff_hours_fri_historicalstaff_hours_mon_and_more.py
  • apps/workflow/migrations/0037_remove_historicalstaff_charge_out_rate_and_more.py
  • apps/workflow/migrations/0038_historicaljob_shop_job_job_shop_job.py
  • apps/workflow/migrations/0039_historicaljob_charge_out_rate_job_charge_out_rate.py
  • apps/workflow/migrations/0040_alter_historicaljob_charge_out_rate_and_more.py
  • apps/workflow/migrations/0041_timeentry_wage_rate_multiplier.py
  • apps/workflow/migrations/0042_jobpricing_job.py
  • apps/workflow/migrations/0043_alter_jobpricing_job.py
  • apps/workflow/migrations/0044_remove_timeentry_mins_per_item_timeentry_hours_and_more.py
  • apps/workflow/migrations/0045_remove_timeentry_minutes.py
  • apps/workflow/migrations/0046_alter_adjustmententry_options_alter_bill_options_and_more.py
  • apps/workflow/migrations/0047_rename_last_modified_bill_xero_last_modified_and_more.py
  • apps/workflow/migrations/0048_billlineitem_xero_id_invoicelineitem_xero_id.py
  • apps/workflow/migrations/0049_companydefaults_created_at_and_more.py
  • apps/workflow/migrations/0050_alter_historicalstaff_created_at_and_more.py
  • apps/workflow/migrations/0051_alter_historicalstaff_updated_at_and_more.py
  • apps/workflow/migrations/0052_alter_jobpricing_job.py
  • apps/workflow/migrations/0053_alter_job_latest_estimate_pricing_and_more.py
  • apps/workflow/migrations/0054_remove_historicaljob_shop_job_remove_job_shop_job_and_more.py
  • apps/workflow/migrations/0055_alter_historicaljob_description_and_more.py
  • apps/workflow/migrations/0056_rename_total_bill_total_excl_tax_and_more.py
  • apps/workflow/migrations/0057_rename_line_amount_billlineitem_line_amount_excl_tax_and_more.py
  • apps/workflow/migrations/0058_alter_billlineitem_options_and_more.py
  • apps/workflow/migrations/0059_rename_creditlineitem_creditnotelineitem_and_more.py
  • apps/workflow/migrations/0060_xerojournal_xerojournallineitem.py
  • apps/workflow/migrations/0061_xerojournallineitem_xero_last_modified.py
  • apps/workflow/migrations/0062_xerojournal_xero_last_modified.py
  • apps/workflow/migrations/0063_rename_date_xerojournal_journal_date.py
  • apps/workflow/migrations/0064_remove_xerojournallineitem_xero_last_modified.py
  • apps/workflow/migrations/0065_alter_xerojournal_journal_number.py
  • apps/workflow/migrations/0066_jobfile.py
  • apps/workflow/migrations/0067_jobfile_status.py
  • apps/workflow/migrations/0067_supplier_purchase_purchaseline_and_more.py
  • apps/workflow/migrations/0068_jobevent.py
  • apps/workflow/migrations/0068_purchase_created_at_purchase_updated_at_and_more.py
  • apps/workflow/migrations/0069_rename_user_jobevent_staff.py
  • apps/workflow/migrations/0070_jobevent_event_type.py
  • apps/workflow/migrations/0071_alter_jobevent_timestamp.py
  • apps/workflow/migrations/0072_merge_20250113_1626.py
  • apps/workflow/migrations/0073_jobpricing_is_historical.py
  • apps/workflow/migrations/0074_bill_xero_last_synced_client_xero_last_synced_and_more.py
  • apps/workflow/migrations/0075_invoice_online_url_quote.py
  • apps/workflow/migrations/0075_jobfile_print_on_jobsheet.py
  • apps/workflow/migrations/0076_invoice_job.py
  • apps/workflow/migrations/0076_remove_jobpricing_pricing_type_and_more.py
  • apps/workflow/migrations/0077_alter_quote_job.py
  • apps/workflow/migrations/0078_alter_quote_job.py
  • apps/workflow/migrations/0079_merge_20250207_1950.py
  • apps/workflow/migrations/0080_alter_historicaljob_material_gauge_quantity_and_more.py
  • apps/workflow/migrations/0080_historicaljob_complex_job_job_complex_job_and_more.py
  • apps/workflow/migrations/0081_add_last_xero_sync_to_company_defaults.py
  • apps/workflow/migrations/0082_add_last_xero_deep_sync.py
  • apps/workflow/migrations/0083_setup_xero_sync_service.py
  • apps/workflow/migrations/0084_cleanup_company_defaults.py
  • apps/workflow/migrations/0085_auto_20250302_2205.py
  • apps/workflow/migrations/0086_alter_historicaljob_contact_person_and_more.py
  • apps/workflow/migrations/0087_companydefaults_is_primary.py
  • apps/workflow/migrations/0088_merge_20250305_0549.py
  • apps/workflow/migrations/0089_companydefaults_starting_job_number_and_more.py
  • apps/workflow/migrations/0090_alter_staff_options.py
  • apps/workflow/migrations/0091_rename_coolected_historicaljob_collected_and_more.py
  • apps/workflow/migrations/0093_historicaljob_notes_job_notes.py
  • apps/workflow/migrations/0094_migrate_material_gauge_to_notes.py
  • apps/workflow/migrations/0095_alter_staff_options_and_more.py
  • apps/workflow/migrations/0096_merge_20250310_2039.py
  • apps/workflow/migrations/0097_alter_historicalstaff_ims_payroll_id_and_more.py
  • apps/workflow/migrations/0098_alter_historicalstaff_ims_payroll_id_and_more.py
  • apps/workflow/migrations/0099_historicaljob_created_by_job_created_by.py
  • apps/workflow/migrations/0100_companydefaults_xero_tenant_id.py
  • apps/workflow/migrations/0101_merge_20250317_1527.py
  • apps/workflow/migrations/0102_add_job_to_purchase_line.py
  • apps/workflow/migrations/0103_companydefaults_starting_po_number.py
  • apps/workflow/migrations/0104_alter_purchaseorder_expected_delivery.py
  • apps/workflow/migrations/0105_add_xero_fields_to_purchase_order.py
  • apps/workflow/migrations/0106_add_price_tbc_to_purchase_order_line.py
  • apps/workflow/migrations/0107_purchaseorder_online_url_purchaseorder_raw_json.py
  • apps/workflow/migrations/0108_xeroaccount_xero_last_synced.py
  • apps/workflow/migrations/0109_stock.py
  • apps/workflow/migrations/0110_purchaseorder_reference.py
  • apps/workflow/migrations/0111_alter_timeentry_minutes_per_item.py
  • apps/workflow/migrations/0112_remove_purchaseline_purchase_and_more.py
  • apps/workflow/migrations/0113_remove_stock_source_id_materialentry_source_stock_and_more.py
  • apps/workflow/migrations/0114_stock_is_active.py
  • apps/workflow/migrations/0115_alter_stock_id.py
  • apps/workflow/migrations/0116_stock_alloy_stock_location_stock_metal_type_and_more.py
  • apps/workflow/migrations/0117_alter_stock_metal_type.py
  • apps/workflow/migrations/0118_alter_materialentry_source_stock.py
  • apps/workflow/migrations/0119_alter_materialentry_source_stock.py
  • apps/workflow/migrations/0120_add_purchase_order_deleted_status.py
  • apps/workflow/migrations/0121_purchaseorderline_alloy_purchaseorderline_location_and_more.py
  • apps/workflow/migrations/0122_companydefaults_anthropic_api_key_and_more.py
  • apps/workflow/migrations/0123_alter_purchaseorder_order_date_and_more.py
  • apps/workflow/migrations/0124_companydefaults_billable_threshold_amber_and_more.py
  • apps/workflow/migrations/0125_normalize_po_numbers.py
  • apps/workflow/migrations/0126_alter_purchaseorder_order_date.py
  • apps/workflow/migrations/0127_remove_purchaseorder_raw_json_and_more.py
  • apps/workflow/migrations/0128_stock_retail_rate.py
  • apps/workflow/migrations/0129_companydefaults_gemini_api_key_stock_job_and_more.py
  • apps/workflow/migrations/0130_purchaseorderline_raw_line_data_stock_job_and_more.py
  • apps/workflow/migrations/0131_aiprovider_companydefaults_anthropic_api_key_and_more.py
  • apps/workflow/migrations/0132_stock_job_stock_source_purchase_order_line.py
  • apps/workflow/migrations/0133_bill_xero_tenant_id_client_xero_tenant_id_and_more.py
  • apps/workflow/migrations/0134_alter_purchaseorder_order_date.py
  • apps/workflow/migrations/0135_job_people_staff_icon_and_more.py
  • apps/workflow/migrations/0136_rename_job_status.py
  • apps/workflow/migrations/0137_auto_20250508_2012.py
  • apps/workflow/migrations/0138_stock_job_stock_source_purchase_order_line.py
  • apps/workflow/migrations/0139_bill_xero_tenant_id_client_xero_tenant_id_and_more.py
  • apps/workflow/migrations/0140_remove_staff_groups_remove_staff_user_permissions_and_more.py
  • apps/workflow/migrations/0141_remove_timeentry_job_pricing_remove_timeentry_staff_and_more.py
  • apps/workflow/migrations/0142_remove_historicaljob_client_and_more.py
  • apps/workflow/migrations/0143_alter_stock_job.py
  • apps/workflow/migrations/0144_remove_adjustmententry_job_pricing_and_more.py
  • apps/workflow/migrations/0145_fix_jobpricing_chain.py
  • apps/workflow/migrations/0146_delete_adjustmententry_delete_materialentry.py
  • apps/workflow/migrations/0147_companydefaults_po_prefix.py
  • apps/workflow/migrations/0148_client_primary_contact_email_and_more.py
  • apps/workflow/migrations/0149_remove_client_secondary_contact_email_and_more.py
  • apps/workflow/migrations/0150_client_all_phones.py
  • apps/workflow/migrations/0151_remove_purchaseline_purchase_and_more.py
  • apps/workflow/migrations/0152_remove_companydefaults_anthropic_api_key_and_more.py
  • apps/workflow/migrations/0153_delete_client_client.py
  • apps/workflow/migrations/0154_auto_20250604_1054.py
  • apps/workflow/migrations/0155_remove_stock_job_remove_stock_source_parent_stock_and_more.py
  • apps/workflow/migrations/0156_remove_stock_job_remove_stock_source_parent_stock_and_more.py
  • apps/workflow/migrations/0157_remove_bill_client_remove_billlineitem_bill_and_more.py
  • apps/workflow/migrations/0158_delete_bill_delete_billlineitem_delete_creditnote_and_more.py
  • apps/workflow/migrations/0159_add_shop_client_name_field.py
  • apps/workflow/migrations/0160_alter_aiprovider_provider_type.py
  • apps/workflow/migrations/0161_companydefaults_gdrive_quotes_folder_id_and_more.py
  • apps/workflow/migrations/0162_alter_companydefaults_gdrive_quotes_folder_id_and_more.py
  • apps/workflow/migrations/0163_rename_active_to_default_add_model_name.py
  • apps/workflow/migrations/0164_serviceapikey.py
  • apps/workflow/migrations/0165_app_error_models.py
  • apps/workflow/migrations/0166_alter_apperror_options_alter_xeroerror_options_and_more.py
  • apps/workflow/migrations/0167_alter_aiprovider_table.py
  • apps/workflow/migrations/0168_enhance_app_error_model.py
  • apps/workflow/migrations/0169_remove_aiprovider_company_field.py
  • apps/workflow/migrations/0170_companydefaults_xero_annual_leave_earnings_rate_id_and_more.py
  • apps/workflow/migrations/0171_protect_critical_fks.py
  • apps/workflow/migrations/0172_alter_xerotoken_scope.py
  • apps/workflow/migrations/0173_add_test_client_name_field.py
  • apps/workflow/migrations/0174_add_xero_payroll_models.py
  • apps/workflow/migrations/0175_make_payroll_fields_required.py
  • apps/workflow/migrations/0176_add_company_address_fields.py
  • apps/workflow/migrations/0177_add_company_email_url.py
  • apps/workflow/migrations/0178_add_company_acronym.py
  • apps/workflow/migrations/0179_add_xero_payroll_calendar_id.py
  • apps/workflow/migrations/0180_alter_xerotoken_scope.py
  • apps/workflow/migrations/0181_payrollcategory.py
  • apps/workflow/migrations/0182_populate_payroll_categories.py
  • apps/workflow/migrations/0183_remove_payroll_fields_from_companydefaults.py
  • apps/workflow/migrations/0184_add_xero_shortcode.py
  • apps/workflow/migrations/0185_fix_unpaid_leave_and_remove_posts_to_xero.py
  • apps/workflow/migrations/0186_simplify_payroll_category.py
  • apps/workflow/migrations/0187_create_xero_pay_item.py
  • apps/workflow/migrations/0188_delete_payrollcategory.py
  • apps/workflow/migrations/0189_add_xero_payroll_calendar_id.py
  • apps/workflow/migrations/0190_add_openai_provider_type.py
  • apps/workflow/migrations/0191_add_annual_leave_loading.py
  • apps/workflow/migrations/0192_add_financial_year_start_month.py
  • apps/workflow/migrations/0193_add_job_gp_target_percentage.py
  • apps/workflow/migrations/0194_add_profit_thresholds.py
  • apps/workflow/migrations/0195_rename_kpi_threshold_fields.py
  • apps/workflow/migrations/0196_alter_companydefaults_kpi_daily_billable_hours_amber_and_more.py
  • apps/workflow/migrations/0197_alter_xerotoken_scope.py
  • apps/workflow/migrations/0198_add_shared_drive_fields.py
  • apps/workflow/migrations/0199_populate_shared_drive_ids.py
  • apps/workflow/migrations/0200_xerosynccursor.py
  • apps/workflow/migrations/0201_add_xero_payroll_start_date.py
  • apps/workflow/migrations/0202_populate_xero_payroll_start_date.py
  • apps/workflow/migrations/0203_companydefaults_solo.py
  • apps/workflow/migrations/0204_alter_xerotoken_scope.py
  • apps/workflow/migrations/0205_companydefaults_company_phone.py
  • apps/workflow/migrations/0206_companydefaults_logo_companydefaults_logo_wide.py
  • apps/workflow/migrations/0207_unique_pay_item_name.py
  • apps/workflow/migrations/0208_enable_xero_sync.py
  • apps/workflow/migrations/0209_add_accounting_provider.py
  • apps/workflow/migrations/0209_rename_workflow_ap_timesta_ae5a69_idx_workflow_ap_timesta_a3d224_idx_and_more.py
  • apps/workflow/migrations/0210_merge_20260412_2225.py
  • apps/workflow/migrations/0211_apperror_app_error_resolved_msg_idx.py
  • apps/workflow/migrations/0212_companydefaults_singleton_check.py
  • apps/workflow/migrations/0213_companydefaults_weekend_timesheets_enabled.py
  • apps/workflow/migrations/0214_cachestate.py
  • apps/workflow/migrations/0215_add_daily_approved_hours_target.py
  • apps/workflow/migrations/0216_workshop_efficiency_factor.py
  • apps/workflow/migrations/0217_xeroapp.py
  • apps/workflow/migrations/0218_populate_xero_app.py
  • apps/workflow/migrations/0219_delete_xerotoken.py
  • apps/workflow/migrations/0221_drop_django_apscheduler_tables.py
  • apps/workflow/migrations/0222_remove_xero_sync_service.py
  • apps/workflow/migrations/0223_delete_cachestate.py
  • apps/workflow/migrations/0224_remove_app_error_resolved_msg_idx.py
  • apps/workflow/migrations/0225_alter_companydefaults_annual_leave_loading.py
  • apps/workflow/migrations/0226_seed_stock_metadata_parse_schedule.py
  • apps/workflow/migrations/0227_delete_xero_journal.py
  • apps/workflow/migrations/0228_session_replay.py
  • apps/workflow/migrations/0229_seed_session_replay_purge_schedule.py
  • apps/workflow/migrations/0230_session_replay_file_storage.py
  • apps/workflow/migrations/0231_companydefaults_shop_client_fk.py
  • apps/workflow/migrations/0232_rename_workflow_ap_timesta_a3d224_idx_workflow_apperror_time_sev_idx_and_more.py
  • apps/workflow/migrations/0233_companydefaults_job_delta_soft_fail_and_more.py
  • apps/workflow/migrations/0234_nullable_company_defaults_optional_urls.py
  • apps/workflow/migrations/0235_searchtelemetryevent.py
  • apps/workflow/migrations/0236_remove_companydefaults_charge_out_rate.py
  • apps/workflow/migrations/0237_remove_companydefaults_phone_fields.py
  • apps/workflow/tests/test_xero_document_raw_json.py
  • docs/restore-prod-to-nonprod.md
  • docs/restore-workaround-jobevent-staff-null.md
  • docs/updating.md
  • mypy-baseline.txt

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/KAN-278-people-companies

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot wasn't able to review this pull request because it exceeds the maximum number of files (300). Try reducing the number of changed files and requesting a review from Copilot again.

@corrin
corrin merged commit 7eb2038 into main Jul 6, 2026
10 checks passed
@corrin
corrin deleted the feat/KAN-278-people-companies branch July 6, 2026 08:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants