diff --git a/issue10053.diff b/issue10053.diff new file mode 100644 index 0000000..c0b9030 --- /dev/null +++ b/issue10053.diff @@ -0,0 +1,385 @@ +--- a/trytond/trytond/modules/party/configuration.py ++++ b/trytond/trytond/modules/party/configuration.py +@@ -1,11 +1,15 @@ + # This file is part of Tryton. The COPYRIGHT file at the top level of + # this repository contains the full copyright notices and license terms. + from trytond import backend ++from trytond.i18n import gettext + from trytond.model import ModelView, ModelSQL, ModelSingleton, fields + from trytond.model import MultiValueMixin, ValueMixin ++from trytond.model.exceptions import AccessError + from trytond.pool import Pool + from trytond.tools.multivalue import migrate_property + ++from .party import IDENTIFIER_TYPES ++ + __all__ = ['Configuration', 'ConfigurationSequence', 'ConfigurationLang'] + + party_sequence = fields.Many2One('ir.sequence', 'Party Sequence', +@@ -23,6 +27,10 @@ class Configuration(ModelSingleton, ModelSQL, ModelView, MultiValueMixin): + + party_sequence = fields.MultiValue(party_sequence) + party_lang = fields.MultiValue(party_lang) ++ identifier_types = fields.MultiSelection( ++ IDENTIFIER_TYPES, "Identifier Types", ++ help="Defines which identifier types are available.\n" ++ "Leave empty for all of them.") + + @classmethod + def default_party_sequence(cls, **pattern): +@@ -33,6 +41,53 @@ class Configuration(ModelSingleton, ModelSQL, ModelView, MultiValueMixin): + except KeyError: + return None + ++ def get_identifier_types(self): ++ selection = self.fields_get( ++ ['identifier_types'])['identifier_types']['selection'] ++ if self.identifier_types: ++ selection = [ ++ (k, v) for k, v in selection if k in self.identifier_types] ++ return selection ++ ++ @classmethod ++ def create(cls, vlist): ++ records = super().create(vlist) ++ ModelView._fields_view_get_cache.clear() ++ return records ++ ++ @classmethod ++ def write(cls, *args): ++ super().write(*args) ++ ModelView._fields_view_get_cache.clear() ++ ++ @classmethod ++ def delete(cls, records): ++ super().delete(records) ++ ModelView._fields_view_get_cache.clear() ++ ++ @classmethod ++ def validate(cls, records): ++ super().validate(records) ++ cls(1).check_identifier_types() ++ ++ def check_identifier_types(self): ++ pool = Pool() ++ Identifier = pool.get('party.identifier') ++ if self.identifier_types: ++ identifiers = Identifier.search([ ++ ('type', 'not in', [None, ''] + self.identifier_types), ++ ], limit=1, order=[]) ++ if identifiers: ++ identifier, = identifiers ++ selection = self.fields_get( ++ ['identifier_types'])['identifier_types']['selection'] ++ selection = dict(selection) ++ raise AccessError(gettext( ++ 'party.msg_identifier_type_remove', ++ type=selection.get(identifier.type, identifier.type), ++ identifier=identifier.rec_name, ++ )) ++ + + class _ConfigurationValue(ModelSQL): + +--- a/trytond/trytond/modules/party/message.xml ++++ b/trytond/trytond/modules/party/message.xml +@@ -39,5 +39,8 @@ this repository contains the full copyright notices and license terms. --> + + The country code on subdivision type must be unique. + ++ ++ To remove the identifier type "%(type)s" from the configuration, you must change it on "%(identifier)s". ++ + + +--- a/trytond/trytond/modules/party/party.py ++++ b/trytond/trytond/modules/party/party.py +@@ -316,6 +316,147 @@ class PartyCategory(ModelSQL): + ondelete='CASCADE', required=True, select=True) + + ++IDENTIFIER_TYPES = [ ++ ('ad_nrt', "Andorra Tax Number"), ++ ('al_nipt', "Albanian VAT Number"), ++ ('ar_cuit', "Argentinian Tax Number"), ++ ('ar_dni', "Argentinian National Identity Number"), ++ ('at_businessid', "Austrian Company Register"), ++ ('at_tin', "Austrian Tax Identification"), ++ ('at_vnr', "Austrian Social Security Number"), ++ ('au_abn', "Australian Business Number"), ++ ('au_acn', "Australian Company Number"), ++ ('au_tfn', "Australian Tax File Number"), ++ ('be_vat', "Belgian Enterprise Number"), ++ ('bg_egn', "Bulgarian Personal Identity Codes"), ++ ('bg_pnf', "Bulgarian Number of a Foreigner"), ++ ('bg_vat', "Bulgarian VAT Number"), ++ ('br_cnpj', "Brazillian Company Identifier"), ++ ('br_cpf', "Brazillian National Identifier"), ++ ('by_unp', "Belarus VAT Number"), ++ ('ca_bn', "Canadian Business Number"), ++ ('ca_sin', "Canadian Social Insurance Number"), ++ ('ch_ssn', "Swiss Social Security Number"), ++ ('ch_uid', "Swiss Business Identifier"), ++ ('ch_vat', "Swiss VAT Number"), ++ ('cl_rut', "Chilean National Tax Number"), ++ ('cn_ric', "Chinese Resident Identity Card Number"), ++ ('cn_uscc', "Chinese Unified Social Credit Code"), ++ ('co_nit', "Colombian Identity Code"), ++ ('co_rut', "Colombian Business Tax Number"), ++ ('cr_cpf', "Costa Rica Physical Person ID Number"), ++ ('cr_cpj', "Costa Rica Tax Number"), ++ ('cr_cr', "Costa Rica Foreigners ID Number"), ++ ('cu_ni', "Cuban Identity Card Number"), ++ ('cy_vat', "Cypriot VAT Number"), ++ ('cz_dic', "Czech VAT Number"), ++ ('cz_rc', "Czech National Identifier"), ++ ('de_handelsregisternummer', "German Company Register Number"), ++ ('de_idnr', "German Personal Tax Number"), ++ ('de_stnr', "German Tax Number"), ++ ('de_vat', "German VAT Number"), ++ ('dk_cpr', "Danish Citizen Number"), ++ ('dk_cvr', "Danish VAT Number"), ++ ('do_cedula', "Dominican Republic National Identification Number"), ++ ('do_rnc', "Dominican Republic Tax"), ++ ('ec_ci', "Ecuadorian Personal Identity Code"), ++ ('ec_ruc', "Ecuadorian Tax Identification"), ++ ('ee_ik', "Estonian Personal ID Number"), ++ ('ee_kmkr', "Estonian VAT Number"), ++ ('ee_registrikood', "Estonian Organisation Registration Code"), ++ ('es_cif', "Spanish Company Tax"), ++ ('es_dni', "Spanish Personal Identity Codes"), ++ ('es_nie', "Spanish Foreigner Number"), ++ ('es_nif', "Spanish VAT Number"), ++ ('eu_at_02', "SEPA Identifier of the Creditor (AT-02)"), ++ ('eu_vat', "European VAT Number"), ++ ('fi_alv', "Finnish VAT Number"), ++ ('fi_associationid', "Finnish Association Identifier"), ++ ('fi_hetu', "Finnish Personal Identity Code"), ++ ('fi_veronumero', "Finnish Individual Tax Number"), ++ ('fi_ytunnus', "Finnish Business Identifier"), ++ ('fr_nif', "French Tax Identification Number"), ++ ('fr_nir', "French Personal Identification Number"), ++ # TODO: remove from party_siren ++ # ('fr_siren', "French Company Identification Number"), ++ ('fr_tva', "French VAT Number"), ++ ('gb_nhs', ++ "United Kingdom National Health Service Patient Identifier"), ++ ('gb_upn', "English Unique Pupil Number"), ++ ('gb_vat', "United Kingdom (and Isle of Man) VAT Number"), ++ ('gr_amka', "Greek Social Security Number"), ++ ('gr_vat', "Greek VAT Number"), ++ ('gt_nit', "Guatemala Tax Number"), ++ ('hr_oib', "Croatian Identification Number"), ++ ('hu_anum', "Hungarian VAT Number"), ++ ('id_npwp', "Indonesian VAT Number"), ++ ('ie_pps', "Irish Personal Number"), ++ ('ie_vat', "Irish VAT Number"), ++ ('il_hp', "Israeli Company Number"), ++ ('il_idnr', "Israeli Identity Number"), ++ ('in_aadhaar', "Indian Digital Resident Personal Identity Number"), ++ ('in_pan', "Indian Income Tax Identifier"), ++ ('is_kennitala', ++ "Icelandic Personal and Organisation Identity Code"), ++ ('is_vsk', "Icelandic VAT Number"), ++ ('it_codicefiscale', "Italian Tax Code for Individuals"), ++ ('it_iva', "Italian VAT Number"), ++ ('jp_cn', "Japanese Corporate Number"), ++ ('kr_brn', "South Korea Business Registration Number"), ++ ('kr_krn', "South Korean Resident Registration Number"), ++ ('lt_asmens', "Lithuanian Personal Number"), ++ ('lt_pvm', "Lithuanian VAT Number"), ++ ('lu_tva', "Luxembourgian VAT Number"), ++ ('lv_pvn', "Latvian VAT Number"), ++ ('mc_tva', "Monacan VAT Number"), ++ ('md_idno', "Moldavian Company Identification Number"), ++ ('mt_vat', "Maltese VAT Number"), ++ ('mu_nid', "Mauritian National Identifier"), ++ ('mx_rfc', "Mexican Tax Number"), ++ ('my_nric', ++ "Malaysian National Registration Identity Card Number"), ++ ('nl_brin', "Dutch School Identification Number"), ++ ('nl_bsn', "Dutch Citizen Identification Number"), ++ ('nl_btw', "Dutch VAT Number"), ++ ('nl_onderwijsnummer', "Dutch Student Identification Number"), ++ ('no_fodselsnummer', ++ "Norwegian Birth Number, the National Identity Number"), ++ ('no_mva', "Norwegian VAT Number"), ++ ('no_orgnr', "Norwegian Organisation Number"), ++ ('nz_ird', "New Zealand Inland Revenue Department Number"), ++ ('pe_cui', "Peruvian Identity Number"), ++ ('pe_ruc', "Peruvian Company Tax Number"), ++ ('pl_nip', "Polish VAT Number"), ++ ('pl_pesel', "Polish National Identification Number"), ++ ('pl_regon', "Polish Register of Economic Units"), ++ ('pt_nif', "Portuguese VAT Number"), ++ ('py_ruc', "Paraguay Tax Number"), ++ ('ro_cf', "Romanian VAT Number"), ++ ('ro_cnp', "Romanian Numerical Personal Code"), ++ ('ro_onrc', "Romanian ONRC Number"), ++ ('rs_pib', "Serbian Tax Identification"), ++ ('ru_inn', "Russian Tax identifier"), ++ ('se_orgnr', "Swedish Company Number"), ++ ('se_personnummer', "Swedish Personal Number"), ++ ('se_vat', "Swedish VAT Number"), ++ ('si_ddv', "Slovenian VAT Number"), ++ ('sk_dph', "Slovak VAT Number"), ++ ('sk_rc', "Slovak Birth Number"), ++ ('sm_coe', "San Marino National Tax Number"), ++ ('tr_tckimlik', "Turkish Personal Identification Number"), ++ ('us_atin', "U.S. Adoption Taxpayer Identification Number"), ++ ('us_ein', "U.S. Employer Identification Number"), ++ ('us_itin', "U.S. Individual Taxpayer Identification Number"), ++ ('us_ptin', "U.S. Preparer Tax Identification Number"), ++ ('us_ssn', "U.S. Social Security Number"), ++ ('us_tin', "U.S. Taxpayer Identification Number"), ++ ('uy_ruc', "Uruguay Tax Number"), ++ ('ve_rif', "Venezuelan VAT Number"), ++ ('za_idnr', "South African Identity Document Number"), ++ ('za_tin', "South African Tax Identification Number"), ++ ] ++ ++ + class PartyIdentifier(sequence_ordered(), ModelSQL, ModelView): + 'Party Identifier' + __name__ = 'party.identifier' +@@ -323,115 +464,7 @@ class PartyIdentifier(sequence_ordered(), ModelSQL, ModelView): + party = fields.Many2One('party.party', 'Party', ondelete='CASCADE', + required=True, select=True, + help="The party identified by this record.") +- type = fields.Selection([ +- (None, ''), +- ('al_nipt', "Albanian VAT Number"), +- ('ar_cuit', "Argentinian Tax Number"), +- ('at_businessid', "Austrian Company Register"), +- ('at_tin', "Austrian Tax Identification"), +- ('au_abn', "Australian Business Number"), +- ('au_acn', "Australian Company Number"), +- ('au_tfn', "Australian Tax File Number"), +- ('be_vat', "Belgian Enterprise Number"), +- ('bg_egn', "Bulgarian Personal Identity Codes"), +- ('bg_pnf', "Bulgarian Number of a Foreigner"), +- ('bg_vat', "Bulgarian VAT Number"), +- ('br_cnpj', "Brazillian Company Identifier"), +- ('br_cpf', "Brazillian National Identifier"), +- ('ca_bn', "Canadian Business Number"), +- ('ca_sin', "Canadian Social Insurance Number"), +- ('ch_ssn', "Swiss Social Security Number"), +- ('ch_uid', "Swiss Business Identifier"), +- ('ch_vat', "Swiss VAT Number"), +- ('cl_rut', "Chilean National Tax Number"), +- ('cn_rit', "Chinese Resident Identity Card Number"), +- ('co_nit', "Colombian Identity Code"), +- ('co_rut', "Colombian Business Tax Number"), +- ('cy_vat', "Cypriot VAT Number"), +- ('cz_dic', "Czech VAT Number"), +- ('cz_rc', "Czech National Identifier"), +- ('de_handelsregisternummer', "German Company Register Number"), +- ('de_idnr', "German Personal Tax Number"), +- ('de_stnr', "German Tax Number"), +- ('de_vat', "German VAT Number"), +- ('dk_cpr', "Danish Citizen Number"), +- ('dk_cvr', "Danish VAT Number"), +- ('do_cedula', "Dominican Republic National Identification Number"), +- ('do_rnc', "Dominican Republic Tax"), +- ('ec_ci', "Ecuadorian Personal Identity Code"), +- ('ec_ruc', "Ecuadorian Tax Identification"), +- ('ee_ik', "Estonian Personcal ID number"), +- ('ee_kmkr', "Estonian VAT Number"), +- ('ee_registrikood', "Estonian Organisation Registration Code"), +- ('es_cif', "Spanish Company Tax"), +- ('es_dni', "Spanish Personal Identity Codes"), +- ('es_nie', "Spanish Foreigner Number"), +- ('es_nif', "Spanish VAT Number"), +- ('eu_at_02', "SEPA Identifier of the Creditor (AT-02)"), +- ('eu_vat', "European VAT Number"), +- ('fi_alv', "Finnish VAT Number"), +- ('fi_associationid', "Finnish Association Identifier"), +- ('fi_hetu', "Finnish Personal Identity Code"), +- ('fi_veronumero', "Finnish individual tax number"), +- ('fi_ytunnus', "Finnish Business Identifier"), +- ('fr_nif', "French Tax Identification Number"), +- ('fr_nir', "French Personal Identification Number"), +- # TODO: remove from party_siren +- # ('fr_siren', "French Company Identification Number"), +- ('fr_tva', "French VAT Number"), +- ('gb_nhs', +- "United Kingdom National Health Service Patient Identifier"), +- ('gb_upn', "English Unique Pupil Number"), +- ('gb_vat', "United Kingdom (and Isle of Man) VAT Number"), +- ('gr_vat', "Greek VAT Number"), +- ('hr_oib', "Croatian Identification Number"), +- ('hu_anum', "Hungarian VAT Number"), +- ('ie_pps', "Irish Personal Number"), +- ('ie_vat', "Irish VAT Number"), +- ('in_aadhaar', "Indian Digital Resident Personal Identity Number"), +- ('in_pan', "Indian Income Tax Identifier"), +- ('is_kennitala', +- "Icelandic Personal and Organisation Identity Code"), +- ('is_vsk', "Icelandic VAT Number"), +- ('it_codicefiscale', "Italian Tax Code for Individuals"), +- ('it_iva', "Italian VAT Number"), +- ('lt_pvm', "Lithuanian VAT Number"), +- ('lu_tva', "Luxembourgian VAT Number"), +- ('lv_pvn', "Latvian VAT Number"), +- ('mc_tva', "Monacan VAT Number"), +- ('mt_vat', "Maltese VAT Number"), +- ('mu_nid', "Mauritian National Identifier"), +- ('mx_rfc', "Mexican Tax Number"), +- ('my_nric', +- "Malaysian National Registration Identity Card Number"), +- ('nl_brin', "Dutch School Identification Number"), +- ('nl_bsn', "Dutch Citizen Identification Number"), +- ('nl_btw', "Dutch VAT Number"), +- ('nl_onderwijsnummer', "Dutch student identification number"), +- ('no_mva', "Norwegian VAT Number"), +- ('no_orgnr', "Norwegian Organisation Number"), +- ('pl_nip', "Polish VAT Number"), +- ('pl_pesel', "Polish National Identification Number"), +- ('pl_regon', "Polish Register of Economic Units"), +- ('pt_nif', "Portuguese VAT Number"), +- ('ro_cf', "Romanian VAT Number"), +- ('ro_cnp', "Romanian Numerical Personal Code"), +- ('rs_pib', "Serbian Tax Identification"), +- ('ru_inn', "Russian Tax identifier"), +- ('se_orgnr', "Swedish Company Number"), +- ('se_vat', "Swedish VAT Number"), +- ('si_ddv', "Slovenian VAT Number"), +- ('sk_dph', "Slovak VAT Number"), +- ('sk_rc', "Slovak Birth Number"), +- ('sm_coe', "San Marino National Tax Number"), +- ('tr_tckimlik', "Turkish Personal Identification Number"), +- ('us_atin', "U.S. Adoption Taxpayer Identification Number"), +- ('us_ein', "U.S. Employer Identification Number"), +- ('us_itin', "U.S. Individual Taxpayer Identification Number"), +- ('us_ptin', "U.S. Preparer Tax Identification Number"), +- ('us_ssn', "U.S. Social Security Number"), +- ('us_tin', "U.S. Taxpayer Identification Number"), +- ], 'Type') ++ type = fields.Selection('get_types', 'Type') + type_string = type.translated('type') + code = fields.Char('Code', required=True) + +@@ -468,6 +501,13 @@ class PartyIdentifier(sequence_ordered(), ModelSQL, ModelView): + party_h.drop_column('vat_number') + party_h.drop_column('vat_country') + ++ @classmethod ++ def get_types(cls): ++ pool = Pool() ++ Configuration = pool.get('party.configuration') ++ configuration = Configuration(1) ++ return [(None, '')] + configuration.get_identifier_types() ++ + @fields.depends('type', 'code') + def on_change_with_code(self): + if self.type and '_' in self.type: +--- a/trytond/trytond/modules/party/view/configuration_form.xml ++++ b/trytond/trytond/modules/party/view/configuration_form.xml +@@ -6,4 +6,7 @@ this repository contains the full copyright notices and license terms. --> + +