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 } ];