From dcaf7cf7d75108c792e2ccc58d6cdc07d69e85c7 Mon Sep 17 00:00:00 2001
From: sufyan-mukadam <96058093+sufyan-mukadam@users.noreply.github.com>
Date: Tue, 15 Jul 2025 00:00:46 +0100
Subject: [PATCH] feat: add tax_id field to Company model and related forms
(#9673)
* feat: add tax_id field to Company model and related forms
* Update 0075_company_tax_id.py to fix typo
* Update models.py to fix typo
* Update tests.py to increment 'column_mappings.count()' to 15
* Update api_version.py
---
.../InvenTree/InvenTree/api_version.py | 6 ++++-
src/backend/InvenTree/company/api.py | 2 +-
.../company/migrations/0075_company_tax_id.py | 23 +++++++++++++++++++
src/backend/InvenTree/company/models.py | 8 +++++++
src/backend/InvenTree/company/serializers.py | 2 ++
src/backend/InvenTree/importer/tests.py | 2 +-
src/frontend/src/forms/CompanyForms.tsx | 1 +
src/frontend/src/functions/icons.tsx | 2 ++
.../src/pages/company/CompanyDetail.tsx | 7 ++++++
9 files changed, 50 insertions(+), 3 deletions(-)
create mode 100644 src/backend/InvenTree/company/migrations/0075_company_tax_id.py
diff --git a/src/backend/InvenTree/InvenTree/api_version.py b/src/backend/InvenTree/InvenTree/api_version.py
index 83dfae13bc..503007bb2e 100644
--- a/src/backend/InvenTree/InvenTree/api_version.py
+++ b/src/backend/InvenTree/InvenTree/api_version.py
@@ -1,12 +1,16 @@
"""InvenTree API version information."""
# InvenTree API version
-INVENTREE_API_VERSION = 367
+INVENTREE_API_VERSION = 368
"""Increment this API version number whenever there is a significant change to the API that any clients need to know about."""
INVENTREE_API_TEXT = """
+v368 -> 2025-07-11 : https://github.com/inventree/InvenTree/pull/9673
+ - Adds 'tax_id' to company model
+ - Adds 'tax_id' to search fields in the 'CompanyList' API endpoint
+
v367 -> 2025-07-10 : https://github.com/inventree/InvenTree/pull/10001
- Adds OAuth2 scopes for importer sessions
diff --git a/src/backend/InvenTree/company/api.py b/src/backend/InvenTree/company/api.py
index d4ba2c0990..5af9187583 100644
--- a/src/backend/InvenTree/company/api.py
+++ b/src/backend/InvenTree/company/api.py
@@ -60,7 +60,7 @@ class CompanyList(DataExportViewMixin, ListCreateAPI):
'active',
]
- search_fields = ['name', 'description', 'website']
+ search_fields = ['name', 'description', 'website', 'tax_id']
ordering_fields = ['active', 'name', 'parts_supplied', 'parts_manufactured']
diff --git a/src/backend/InvenTree/company/migrations/0075_company_tax_id.py b/src/backend/InvenTree/company/migrations/0075_company_tax_id.py
new file mode 100644
index 0000000000..15f8f2ff46
--- /dev/null
+++ b/src/backend/InvenTree/company/migrations/0075_company_tax_id.py
@@ -0,0 +1,23 @@
+# Generated by Django 4.2.21 on 2025-05-17 17:16
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("company", "0074_alter_manufacturerpart_link"),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name="company",
+ name="tax_id",
+ field=models.CharField(
+ blank=True,
+ help_text="Company Tax ID",
+ max_length=50,
+ verbose_name="Tax ID",
+ ),
+ ),
+ ]
diff --git a/src/backend/InvenTree/company/models.py b/src/backend/InvenTree/company/models.py
index e10e4aff8d..8e5efe1454 100644
--- a/src/backend/InvenTree/company/models.py
+++ b/src/backend/InvenTree/company/models.py
@@ -106,6 +106,7 @@ class Company(
is_supplier: boolean value, is this company a supplier
is_manufacturer: boolean value, is this company a manufacturer
currency_code: Specifies the default currency for the company
+ tax_id: Tax ID for the company
"""
class Meta:
@@ -224,6 +225,13 @@ class Company(
validators=[InvenTree.validators.validate_currency_code],
)
+ tax_id = models.CharField(
+ max_length=50,
+ blank=True,
+ verbose_name=_('Tax ID'),
+ help_text=_('Company Tax ID'),
+ )
+
@property
def address(self):
"""Return the string representation for the primary address.
diff --git a/src/backend/InvenTree/company/serializers.py b/src/backend/InvenTree/company/serializers.py
index fa8605bcc3..3763593378 100644
--- a/src/backend/InvenTree/company/serializers.py
+++ b/src/backend/InvenTree/company/serializers.py
@@ -52,6 +52,7 @@ class CompanyBriefSerializer(InvenTreeModelSerializer):
'image',
'thumbnail',
'currency',
+ 'tax_id',
]
read_only_fields = ['currency']
@@ -145,6 +146,7 @@ class CompanySerializer(
'remote_image',
'address_count',
'primary_address',
+ 'tax_id',
]
@staticmethod
diff --git a/src/backend/InvenTree/importer/tests.py b/src/backend/InvenTree/importer/tests.py
index 45ea5052c7..2393feb1cf 100644
--- a/src/backend/InvenTree/importer/tests.py
+++ b/src/backend/InvenTree/importer/tests.py
@@ -39,7 +39,7 @@ class ImporterTest(ImporterMixin, InvenTreeTestCase):
session.extract_columns()
- self.assertEqual(session.column_mappings.count(), 14)
+ self.assertEqual(session.column_mappings.count(), 15)
# Check some of the field mappings
for field, col in [
diff --git a/src/frontend/src/forms/CompanyForms.tsx b/src/frontend/src/forms/CompanyForms.tsx
index d7be251e12..8d0ebb6c45 100644
--- a/src/frontend/src/forms/CompanyForms.tsx
+++ b/src/frontend/src/forms/CompanyForms.tsx
@@ -125,6 +125,7 @@ export function companyFields(): ApiFormFieldSet {
email: {
icon:
},
+ tax_id: {},
is_supplier: {},
is_manufacturer: {},
is_customer: {},
diff --git a/src/frontend/src/functions/icons.tsx b/src/frontend/src/functions/icons.tsx
index bd9a3b0337..1cf0a2d2f3 100644
--- a/src/frontend/src/functions/icons.tsx
+++ b/src/frontend/src/functions/icons.tsx
@@ -87,6 +87,7 @@ import {
IconStack2,
IconStatusChange,
IconTag,
+ IconTax,
IconTestPipe,
IconTool,
IconTools,
@@ -181,6 +182,7 @@ const icons: InvenTreeIconType = {
admin: IconUserBolt,
system: IconSettings,
license: IconLicense,
+ tax_id: IconTax,
// Part Icons
active: IconCheck,
diff --git a/src/frontend/src/pages/company/CompanyDetail.tsx b/src/frontend/src/pages/company/CompanyDetail.tsx
index c8982f2fa1..a108495509 100644
--- a/src/frontend/src/pages/company/CompanyDetail.tsx
+++ b/src/frontend/src/pages/company/CompanyDetail.tsx
@@ -114,6 +114,13 @@ export default function CompanyDetail(props: Readonly) {
label: t`Email Address`,
copy: true,
hidden: !company.email
+ },
+ {
+ type: 'text',
+ name: 'tax_id',
+ label: t`Tax ID`,
+ copy: true,
+ hidden: !company.tax_id
}
];