]> git.ipfire.org Git - thirdparty/python-fints.git/commitdiff
Fall back to CAMT parsing if MT940 is no longer available camt-parser 202/head
authorRaphael Michel <michel@rami.io>
Thu, 27 Nov 2025 16:07:57 +0000 (17:07 +0100)
committerRaphael Michel <michel@rami.io>
Thu, 27 Nov 2025 16:09:30 +0000 (17:09 +0100)
fints/camt_parser.py [new file with mode: 0644]
fints/client.py
fints/models.py
fints/utils.py
pyproject.toml
requirements.txt
tests/test_camt_parser.py [new file with mode: 0644]

diff --git a/fints/camt_parser.py b/fints/camt_parser.py
new file mode 100644 (file)
index 0000000..a284124
--- /dev/null
@@ -0,0 +1,2981 @@
+"""
+Built on https://github.com/phoughton/pyiso20022
+
+MIT License
+
+Copyright (c) 2021 Peter Houghton
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+"""
+from datetime import datetime
+from decimal import Decimal
+
+from lxml import etree
+import re
+
+from fints.models import Amount
+
+mnemonics = {
+    'Abbrvtd': 'Abbreviated',
+    'Ablty': 'Ability',
+    'Abnrml': 'Abnormal',
+    'Abrt': 'Abort',
+    'Abov': 'Above',
+    'Abs': 'Absolute',
+    'Abstn': 'Abstain',
+    'Acclrtn': 'Acceleration',
+    'Accpt': 'Accept',
+    'Accptbl': 'Acceptable',
+    'Accptnc': 'Acceptance',
+    'Accptd': 'Accepted',
+    'Accptr': 'Acceptor',
+    'Accs': 'Access',
+    'Accsd': 'Accessed',
+    'Acct': 'Account',
+    'Acctg': 'Accounting',
+    'Accts': 'Accounts',
+    'Acrl': 'Accrual',
+    'Acrd': 'Accrued',
+    'Acmltd': 'Accumulated',
+    'Acmltn': 'Accumulation',
+    'Ackd': 'Acknowledged',
+    'Ack': 'Acknowledgement',
+    'Acqr': 'Acquire',
+    'Acqrr': 'Acquirer',
+    'Acqrg': 'Acquiring',
+    'Acqstn': 'Acquisition',
+    'Acrnm': 'Acronym',
+    'Act': 'Act',
+    'Actn': 'Action',
+    'Actns': 'Actions',
+    'Actvt': 'Activate',
+    'Actvtd': 'Activated',
+    'Actvtn': 'Activation',
+    'Actv': 'Active',
+    'Actvty': 'Activity',
+    'Actl': 'Actual',
+    'Ad': 'Ad',
+    'Adptr': 'Adapter',
+    'Add': 'Add',
+    'Added': 'Added',
+    'Adddm': 'Addendum',
+    'Addtn': 'Addition',
+    'Addtl': 'Additional',
+    'Adr': 'Address',
+    'Adrs': 'Addresses',
+    'Adqcy': 'Adequacy',
+    'Adjdctn': 'Adjudication',
+    'Adjst': 'Adjust',
+    'Adjstd': 'Adjusted',
+    'Adjstmnt': 'Adjustment',
+    'Admstn': 'Administration',
+    'Admstv': 'Administrative',
+    'Admstr': 'Administrator',
+    'Admssn': 'Admission',
+    'Admt': 'Admit',
+    'Admttnc': 'Admittance',
+    'Adlts': 'Adults',
+    'Advnc': 'Advance',
+    'Advncd': 'Advanced',
+    'Advntg': 'Advantage',
+    'Advc': 'Advice',
+    'Advsd': 'Advised',
+    'Advsg': 'Advising',
+    'Advsr': 'Advisor',
+    'Afctd': 'Affected',
+    'Afflt': 'Affiliate',
+    'Affltd': 'Affiliated',
+    'Affltn': 'Affiliation',
+    'Affirm': 'Affirmation',
+    'Affrmd': 'Affirmed',
+    'Affrmg': 'Affirming',
+    'Aftr': 'After',
+    'Agnst': 'Against',
+    'Age': 'Age',
+    'Agcy': 'Agency',
+    'Agnd': 'Agenda',
+    'Agt': 'Agent',
+    'Agts': 'Agents',
+    'Aggt': 'Aggregate',
+    'Aggtd': 'Aggregated',
+    'Aggtn': 'Aggregation',
+    'Aggrssv': 'Aggressive',
+    'Agr': 'Agree',
+    'Agrd': 'Agreed',
+    'Agrmt': 'Agreement',
+    'Agrmts': 'Agreements',
+    'Agrcltrl': 'Agricultural',
+    'Air': 'Air',
+    'Airprt': 'Airport',
+    'Aktngwn': 'Aktiengewinn',
+    'Alrt': 'Alert',
+    'Algo': 'Algorithm',
+    'Aln': 'Alien',
+    'All': 'All',
+    'Allgd': 'Alleged',
+    'Allgmt': 'Allegement',
+    'Allctd': 'Allocated',
+    'Allcn': 'Allocation',
+    'Allcns': 'Allocations',
+    'Alltd': 'Alloted',
+    'Alltmt': 'Allotment',
+    'Allwbl': 'Allowable',
+    'Allwnc': 'Allowance',
+    'Allwncs': 'Allowances',
+    'Allwd': 'Allowed',
+    'Alone': 'Alone',
+    'Along': 'Along',
+    'Alpha': 'Alpha',
+    'Alrdy': 'Already',
+    'Altrn': 'Alternate',
+    'Altrntv': 'Alternative',
+    'Amd': 'Amend',
+    'Amdd': 'Amended',
+    'Amdmnt': 'Amendment',
+    'Amnty': 'Amenity',
+    'Amrcn': 'American',
+    'AMF': 'AMF',
+    'Ammn': 'Ammonia',
+    'Ammnm': 'Ammonium',
+    'Amtsbl': 'Amortisable',
+    'Amtstn': 'Amortisation',
+    'Amtsd': 'Amortised',
+    'Amtsg': 'Amortising',
+    'Amt': 'Amount',
+    'Amts': 'Amounts',
+    'Anlys': 'Analysis',
+    'Ancllry': 'Ancillary',
+    'And': 'And',
+    'Anx': 'Annex',
+    'Anncd': 'Announced',
+    'Anncmnt': 'Announcement',
+    'Anl': 'Annual',
+    'Anlsd': 'Annualised',
+    'Anmty': 'Anonymity',
+    'Ante': 'Ante',
+    'Antcptd': 'Anticipated',
+    'AML': 'AntiMoneyLaundering',
+    'Any': 'Any',
+    'APDU': 'APDU',
+    'API': 'API',
+    'Apprnc': 'Appearance',
+    'Aplbl': 'Applicable',
+    'Applcnt': 'Applicant',
+    'Appl': 'Application',
+    'Apld': 'Applied',
+    'Apls': 'Applies',
+    'Apply': 'Apply',
+    'Appntd': 'Appointed',
+    'Appntmnt': 'Appointment',
+    'Apprsl': 'Appraisal',
+    'Apprch': 'Approach',
+    'Apprprtnss': 'Appropriateness',
+    'Apprvl': 'Approval',
+    'Apprvd': 'Approved',
+    'Apprvg': 'Approving',
+    'Area': 'Area',
+    'Arrgmnt': 'Arrangement',
+    'Arrgmnts': 'Arrangements',
+    'Arrears': 'Arrears',
+    'Arrst': 'Arrest',
+    'Arrstd': 'Arrested',
+    'Arrsts': 'Arrests',
+    'Arrs': 'Arriers',
+    'Arrvl': 'Arrival',
+    'As': 'As',
+    'Aspts': 'Aspects',
+    'Assntd': 'Assented',
+    'Assessbl': 'Assessable',
+    'Assmnt': 'Assessment',
+    'Asst': 'Asset',
+    'Assts': 'Assets',
+    'Assgnd': 'Assigned',
+    'Assgne': 'Assignee',
+    'Assgnr': 'Assigner',
+    'Assgnmt': 'Assignment',
+    'Assoctd': 'Associated',
+    'Assoctn': 'Association',
+    'Assmptn': 'Assumption',
+    'Assrnc': 'Assurance',
+    'Assrd': 'Assured',
+    'ASX': 'ASX',
+    'Asmmtrc': 'Asymmetric',
+    'At': 'At',
+    'ATM': 'ATM',
+    'ATMPIN': 'ATMPIN',
+    'ATR': 'ATR',
+    'Attchd': 'Attached',
+    'Attchmnt': 'Attachment',
+    'Attchmnts': 'Attachments',
+    'Attndnc': 'Attendance',
+    'Attndnt': 'Attendant',
+    'Attndd': 'Attended',
+    'Attndee': 'Attendee',
+    'Attn': 'Attention',
+    'Attny': 'Attorney',
+    'Attr': 'Attribute',
+    'Attrbts': 'Attributes',
+    'Auctn': 'Auction',
+    'Auctns': 'Auctions',
+    'Audt': 'Audit',
+    'Audtd': 'Audited',
+    'Audtr': 'Auditor',
+    'AUBSBx': 'AustralianExtensiveBranchNetworkIdentification',
+    'AUBSBs': 'AustralianSmallNetworkIdentification',
+    'ATBLZ': 'AustrianBankleitzahlIdentification',
+    'Authntcd': 'Authenticated',
+    'Authntcn': 'Authentication',
+    'Authsb': 'Authorisable',
+    'Authstn': 'Authorisation',
+    'Authrsd': 'Authorised',
+    'Authrty': 'Authority',
+    'Auto': 'Auto',
+    'Automtd': 'Automated',
+    'Automtc': 'Automatic',
+    'Autombl': 'Automobile',
+    'Avlbty': 'Availability',
+    'Avlbl': 'Available',
+    'Avrg': 'Average',
+    'Baby': 'Baby',
+    'Bck': 'Back',
+    'Bckd': 'Backed',
+    'Bckp': 'Backup',
+    'Bail': 'Bail',
+    'Bal': 'Balance',
+    'Bals': 'Balances',
+    'Blln': 'Balloon',
+    'Bllt': 'Ballot',
+    'Bk': 'Bank',
+    'Bkrs': 'Bankers',
+    'Bkg': 'Banking',
+    'Bnkrptcy': 'Bankruptcy',
+    'Bks': 'Banks',
+    'Brcd': 'Barcode',
+    'Brgn': 'Bargain',
+    'Brrr': 'Barrier',
+    'Base': 'Base',
+    'Based': 'Based',
+    'Basel': 'Basel',
+    'Baseln': 'Baseline',
+    'Bsic': 'Basic',
+    'Bsis': 'Basis',
+    'Bskt': 'Basket',
+    'Btch': 'Batch',
+    'Btchs': 'Batches',
+    'Bttry': 'Battery',
+    'BBAN': 'BBAN',
+    'BCE': 'BCE',
+    'Be': 'Be',
+    'Bear': 'Bear',
+    'Br': 'Bearer',
+    'Brg': 'Bearing',
+    'Bed': 'Bed',
+    'Beep': 'Beep',
+    'Bfr': 'Before',
+    'Begn': 'Begin',
+    'BEI': 'BEI',
+    'Belgn': 'Belgian',
+    'Blw': 'Below',
+    'Bchmk': 'Benchmark',
+    'Bnfcl': 'Beneficial',
+    'Bnfcry': 'Beneficiary',
+    'Bnft': 'Benefit',
+    'Bnfts': 'Benefits',
+    'Bspk': 'Bespoke',
+    'Best': 'Best',
+    'Bynd': 'Beyond',
+    'BIC': 'BIC',
+    'BICFI': 'BICFI',
+    'BICNonFI': 'BICNonFI',
+    'Bid': 'Bid',
+    'Bddr': 'Bidder',
+    'Bddrs': 'Bidders',
+    'Biddg': 'Bidding',
+    'Bids': 'Bids',
+    'Bil': 'Bilateral',
+    'Bily': 'Bilaterally',
+    'Bll': 'Bill',
+    'Blld': 'Billed',
+    'Bllg': 'Billing',
+    'BIN': 'BIN',
+    'Binry': 'Binary',
+    'Bndg': 'Binding',
+    'Birth': 'Birth',
+    'Blnk': 'Blank',
+    'Blck': 'Block',
+    'Blckd': 'Blocked',
+    'Blckg': 'Blocking',
+    'Blmbrg': 'Bloomberg',
+    'Brd': 'Board',
+    'Body': 'Body',
+    'Bd': 'Bond',
+    'Bds': 'Bonds',
+    'Bns': 'Bonus',
+    'Book': 'Book',
+    'Bookg': 'Booking',
+    'Brrwd': 'Borrowed',
+    'Brrwr': 'Borrower',
+    'Brrwg': 'Borrowing',
+    'Both': 'Both',
+    'Bght': 'Bought',
+    'Bdry': 'Boundary',
+    'Bx': 'Box',
+    'BPN': 'BPN',
+    'Brakg': 'Braking',
+    'Brnch': 'Branch',
+    'Brnd': 'Brand',
+    'Brch': 'Breach',
+    'Brkg': 'Breakage',
+    'Brkdwn': 'Breakdown',
+    'Brkr': 'Broker',
+    'Brkrg': 'Brokerage',
+    'Brkrd': 'Brokered',
+    'Brkrs': 'Brokers',
+    'Brght': 'Brought',
+    'Bckt': 'Bucket',
+    'Bffr': 'Buffer',
+    'Bld': 'Build',
+    'Bldg': 'Building',
+    'Blt': 'Built',
+    'Blk': 'Bulk',
+    'Bndl': 'Bundle',
+    'Biz': 'Business',
+    'Buy': 'Buy',
+    'Buyr': 'Buyer',
+    'By': 'By',
+    'Bpss': 'Bypass',
+    'B': 'Byte',
+    'C10': 'C10',
+    'CA': 'CA',
+    'Clctd': 'Calculated',
+    'Clctn': 'Calculation',
+    'Cal': 'Calendar',
+    'Call': 'Call',
+    'Cllbl': 'Callable',
+    'Clld': 'Called',
+    'CACPA': 'CanadianPaymentsAssociationRoutingNumberIdentification',
+    'Ccl': 'Cancel',
+    'Cxl': 'Cancellation',
+    'Cxls': 'Cancellations',
+    'Canc': 'Cancelled',
+    'Cap': 'Cap',
+    'Cpblties': 'Capabilities',
+    'Cpblty': 'Capability',
+    'Cpbl': 'Capable',
+    'Cpcty': 'Capacity',
+    'Cptl': 'Capital',
+    'Cptlstn': 'Capitalisation',
+    'Cptlsd': 'Capitalised',
+    'Capd': 'Capped',
+    'Captr': 'Capture',
+    'Captrd': 'Captured',
+    'Car': 'Car',
+    'Crbn': 'Carbon',
+    'Card': 'Card',
+    'Crdhldr': 'Cardholder',
+    'Crds': 'Cards',
+    'Care': 'Care',
+    'Crrd': 'Carried',
+    'Crrier': 'Carrier',
+    'Case': 'Case',
+    'Csh': 'Cash',
+    'Cshr': 'Cashier',
+    'Csstt': 'Cassette',
+    'Cstg': 'Casting',
+    'Ctgrs': 'Categories',
+    'Ctgy': 'Category',
+    'CBRF': 'CBRF',
+    'CCDC': 'CCDC',
+    'CCP': 'CCP',
+    'Clng': 'Ceiling',
+    'Ct': 'Cent',
+    'Cntrl': 'Central',
+    'Cntrld': 'Centralised',
+    'Centrs': 'Centres',
+    'Cert': 'Certificate',
+    'Certd': 'Certificated',
+    'Certs': 'Certificates',
+    'Certfctn': 'Certification',
+    'Certfd': 'Certified',
+    'Cssn': 'Cession',
+    'CFI': 'CFI',
+    'Chain': 'Chain',
+    'Chllng': 'Challenge',
+    'Chng': 'Change',
+    'Chngd': 'Changed',
+    'Chngs': 'Changes',
+    'Chanl': 'Channel',
+    'Char': 'Character',
+    'Chrtc': 'Characteristic',
+    'Chrtcs': 'Characteristics',
+    'Chars': 'Characters',
+    'Chrg': 'Charge',
+    'Chrgbck': 'Chargeback',
+    'Chrgs': 'Charges',
+    'Chrtr': 'Charter',
+    'Chrtrr': 'Charterer',
+    'Chck': 'Check',
+    'Chckng': 'Checking',
+    'Chckpt': 'Checkpoint',
+    'Chcks': 'Checks',
+    'Chcksm': 'Checksum',
+    'Chq': 'Cheque',
+    'Chqs': 'Cheques',
+    'Chldrn': 'Children',
+    'Chill': 'Chill',
+    'USCH': 'CHIPSParticipantIdentification',
+    'USCHU': 'CHIPSUniversalIdentification',
+    'Chc': 'Choice',
+    'Crct': 'Circuit',
+    'Crcts': 'Circuits',
+    'CIT': 'CIT',
+    'Ctznsh': 'Citizenship',
+    'City': 'City',
+    'Cvl': 'Civil',
+    'Clm': 'Claim',
+    'Clmd': 'Claimed',
+    'Clms': 'Claims',
+    'Clss': 'Class',
+    'Clssfctn': 'Classification',
+    'Clause': 'Clause',
+    'Clauses': 'Clauses',
+    'Clean': 'Clean',
+    'Clear': 'Clear',
+    'Clrd': 'Cleared',
+    'Clr': 'Clearing',
+    'Clnt': 'Client',
+    'Clpng': 'Clipping',
+    'Clck': 'Clock',
+    'Cls': 'Close',
+    'Clsd': 'Closed',
+    'Clsg': 'Closing',
+    'Clsr': 'Closure',
+    'CLS': 'CLS',
+    'CMU': 'CMU',
+    'Co': 'Co',
+    'Coal': 'Coal',
+    'Cd': 'Code',
+    'Cdfctn': 'Codification',
+    'Coeff': 'Coefficient',
+    'Coll': 'Collateral',
+    'Collstn': 'Collateralisation',
+    'Collsd': 'Collateralised',
+    'Colltn': 'Collection',
+    'Cllctv': 'Collective',
+    'Cmbnd': 'Combined',
+    'Cmd': 'Command',
+    'Cmds': 'Commands',
+    'Commrtv': 'Commemorative',
+    'Cmcmnt': 'Commencement',
+    'Cmnt': 'Comment',
+    'Cmnts': 'Comments',
+    'Comrc': 'Commerce',
+    'Comrcl': 'Commercial',
+    'Comssn': 'Commission',
+    'Comssns': 'Commissions',
+    'Cmmtmnt': 'Commitment',
+    'Cmmtd': 'Committed',
+    'Cmmdties': 'Commodities',
+    'Cmmdty': 'Commodity',
+    'Cmon': 'Common',
+    'Com': 'Communication',
+    'Cmnty': 'Community',
+    'Cpny': 'Company',
+    'Cmpard': 'Compared',
+    'Compstn': 'Compensation',
+    'Cmptnt': 'Competent',
+    'Cmplt': 'Complete',
+    'Cmpltd': 'Completed',
+    'Cmpltns': 'Completeness',
+    'Cmpltn': 'Completion',
+    'Cmplx': 'Complex',
+    'Cmplc': 'Compliance',
+    'Cmplnt': 'Compliant',
+    'Cmply': 'Comply',
+    'Cmpnt': 'Component',
+    'Cmpsit': 'Composite',
+    'Cmpnd': 'Compound',
+    'Cmprssn': 'Compression',
+    'Cmprmsd': 'Compromised',
+    'Cmplsry': 'Compulsory',
+    'Cmptn': 'Computation',
+    'Cmptd': 'Computed',
+    'Cncntrtn': 'Concentration',
+    'Cncssn': 'Concession',
+    'Cond': 'Condition',
+    'Condl': 'Conditional',
+    'Condly': 'Conditionally',
+    'Conds': 'Conditions',
+    'Cndct': 'Conduct',
+    'Cndt': 'Conduit',
+    'Cnfdnc': 'Confidence',
+    'Cnfdtl': 'Confidential',
+    'Cnfdtlty': 'Confidentiality',
+    'Cfgtn': 'Configuration',
+    'Conf': 'Confirmation',
+    'Confs': 'Confirmations',
+    'Confd': 'Confirmed',
+    'Cnfrmr': 'Confirmer',
+    'Cnfrmg': 'Confirming',
+    'Cnjnctn': 'Conjunction',
+    'Cnnctn': 'Connection',
+    'Cnnctvty': 'Connectivity',
+    'Cnsnt': 'Consent',
+    'Cnsntd': 'Consented',
+    'Cnsqnc': 'Consequence',
+    'Cnsdrtn': 'Consideration',
+    'Cnsdrd': 'Considered',
+    'Consgn': 'Consignee',
+    'Consgnmt': 'Consignment',
+    'Consgnr': 'Consignor',
+    'Cnsltd': 'Consolidated',
+    'Cnsldtn': 'Consolidation',
+    'Cst': 'Constant',
+    'Cnsttnts': 'Constituents',
+    'Cnstrctn': 'Construction',
+    'Csmr': 'Consumer',
+    'Csmptn': 'Consumption',
+    'Ctct': 'Contact',
+    'CT': 'Contain',
+    'Cntnr': 'Container',
+    'Cntt': 'Content',
+    'Cnts': 'Contents',
+    'Cntxt': 'Context',
+    'Cntgnt': 'Contigent',
+    'Conttn': 'Continuation',
+    'Cntnty': 'Continuity',
+    'Contra': 'Contra',
+    'Ctrct': 'Contract',
+    'Ctrctd': 'Contracted',
+    'Ctrctg': 'Contracting',
+    'Ctrcts': 'Contracts',
+    'Ctrctl': 'Contractual',
+    'Cntrbtn': 'Contribution',
+    'Ctrl': 'Control',
+    'Ctrlg': 'Controlling',
+    'Cnvnnc': 'Convenience',
+    'Cnvntn': 'Convention',
+    'Convs': 'Conversion',
+    'Convtd': 'Converted',
+    'Convtbl': 'Convertible',
+    'Coolnt': 'Coolant',
+    'Cordints': 'Coordinates',
+    'Cpd': 'Copied',
+    'Cpy': 'Copy',
+    'Core': 'Core',
+    'Corp': 'Corporate',
+    'Corptn': 'Corporation',
+    'Crps': 'Corpus',
+    'Crrct': 'Correct',
+    'Crrctd': 'Corrected',
+    'Crrctg': 'Correcting',
+    'Crrctn': 'Correction',
+    'Crrctv': 'Corrective',
+    'Crrltn': 'Correlation',
+    'Crspdc': 'Correspondence',
+    'Crspdt': 'Correspondent',
+    'Cost': 'Cost',
+    'Costs': 'Costs',
+    'Cnsl': 'Counsel',
+    'Cnt': 'Count',
+    'Cntr': 'Counter',
+    'Cntrpt': 'Counterpart',
+    'CtrPties': 'Counterparties',
+    'CtrPty': 'Counterparty',
+    'Cntrs': 'Counters',
+    'Cntg': 'Counting',
+    'Ctry': 'Country',
+    'Counts': 'Counts',
+    'Cty': 'County',
+    'Cpn': 'Coupon',
+    'Crt': 'Court',
+    'Cvnnt': 'Covenant',
+    'Cover': 'Cover',
+    'Cvrg': 'Coverage',
+    'Cvrd': 'Covered',
+    'CP': 'CP',
+    'Cret': 'Create',
+    'Cretd': 'Created',
+    'Cre': 'Creation',
+    'Cretr': 'Creator',
+    'Crdntl': 'Credential',
+    'Crdntls': 'Credentials',
+    'Cdt': 'Credit',
+    'Cdtr': 'Creditor',
+    'Crit': 'Criteria',
+    'Critn': 'Criterion',
+    'Cross': 'Cross',
+    'CRS': 'CRS',
+    'Crpt': 'Crypto',
+    'Crstllstn': 'Crystallisation',
+    'Crstllsd': 'Crystallised',
+    'CSC': 'CSC',
+    'CSD': 'CSD',
+    'CTA': 'CTA',
+    'Cum': 'Cum',
+    'Cmltv': 'Cumulative',
+    'Cure': 'Cure',
+    'Ccies': 'Currencies',
+    'Ccy': 'Currency',
+    'Cur': 'Current',
+    'Crv': 'Curve',
+    'CUSIP': 'CUSIP',
+    'Ctdn': 'Custodian',
+    'Ctdy': 'Custody',
+    'Cstm': 'Custom',
+    'Cstmr': 'Customer',
+    'Cstmsd': 'Customised',
+    'Cut': 'Cut',
+    'Cycl': 'Cycle',
+    'Daly': 'Daily',
+    'Dairy': 'Dairy',
+    'Data': 'Data',
+    'DB': 'Database',
+    'Dt': 'Date',
+    'Dtd': 'Dated',
+    'Dts': 'Dates',
+    'Day': 'Day',
+    'Days': 'Days',
+    'De': 'De',
+    'Deactvtn': 'Deactivation',
+    'Ddln': 'Deadline',
+    'Ddlns': 'Deadlines',
+    'Deal': 'Deal',
+    'Dealr': 'Dealer',
+    'Dealg': 'Dealing',
+    'Dth': 'Death',
+    'Dbt': 'Debit',
+    'Dbtd': 'Debited',
+    'Debt': 'Debt',
+    'Dbtr': 'Debtor',
+    'Dcsd': 'Deceased',
+    'Dcml': 'Decimal',
+    'Dcmlstn': 'Decimalisation',
+    'Dcsn': 'Decision',
+    'Dclrtn': 'Declaration',
+    'Dclrd': 'Declared',
+    'Dclnd': 'Declined',
+    'Dcr': 'Decrease',
+    'Dcrmtl': 'Decremental',
+    'Ddctd': 'Dedicated',
+    'Ddctn': 'Deduction',
+    'Dmd': 'Deemed',
+    'Dflt': 'Default',
+    'Dfltd': 'Defaulted',
+    'Dfltrs': 'Defaulters',
+    'Dfrrl': 'Deferral',
+    'Dfrrd': 'Deferred',
+    'Dfcncy': 'Deficiency',
+    'Dfcit': 'Deficit',
+    'Dfnd': 'Defined',
+    'Def': 'Definition',
+    'Defs': 'Definitions',
+    'Dely': 'Delay',
+    'Delyd': 'Delayed',
+    'Dlg': 'Delegate',
+    'Dlgtd': 'Delegated',
+    'Dlgtn': 'Delegation',
+    'Del': 'Delete',
+    'Deltd': 'Deleted',
+    'Deltn': 'Deletion',
+    'Dlmtr': 'Delimiter',
+    'Dlistg': 'Delisting',
+    'Dlvr': 'Deliver',
+    'Dlvrbl': 'Deliverable',
+    'Dlvrr': 'Deliverer',
+    'Dlvrrs': 'Deliverers',
+    'Dlvrg': 'Delivering',
+    'Dlvry': 'Delivery',
+    'Dlta': 'Delta',
+    'Dmnd': 'Demand',
+    'Dmndd': 'Demanded',
+    'Dmtrlsd': 'Dematerialised',
+    'DMnms': 'DeMinimis',
+    'Dnl': 'Denial',
+    'Dnd': 'Denied',
+    'Dnmtn': 'Denomination',
+    'Dnmtr': 'Denominator',
+    'Dept': 'Department',
+    'Dprture': 'Departure',
+    'Dpst': 'Deposit',
+    'Dpstary': 'Depositary',
+    'Dpstd': 'Deposited',
+    'Dpstries': 'Depositories',
+    'Dpstry': 'Depository',
+    'Dprctn': 'Depreciation',
+    'Derivtn': 'Derivation',
+    'Deriv': 'Derivative',
+    'Derivs': 'Derivatives',
+    'Drvd': 'Derived',
+    'Drgtn': 'Derogation',
+    'Dscndg': 'Descending',
+    'Desc': 'Description',
+    'Dscrptr': 'Descriptor',
+    'Dsgntd': 'Designated',
+    'Dsgnt': 'Designation',
+    'Dsk': 'Desk',
+    'Dstn': 'Destination',
+    'Dtchmnt': 'Detachment',
+    'Dtl': 'Detail',
+    'Dtld': 'Detailed',
+    'Dtls': 'Details',
+    'Dtrmntn': 'Determination',
+    'Dtrmnd': 'Determined',
+    'Devtg': 'Deviating',
+    'Dvtn': 'Deviation',
+    'Dvc': 'Device',
+    'Dgnss': 'Diagnosis',
+    'Dgnstc': 'Diagnostic',
+    'Dgnstcs': 'Diagnostics',
+    'Dmmnm': 'Diammonium',
+    'Diff': 'Difference',
+    'Dgst': 'Digest',
+    'Dgstd': 'Digested',
+    'Dgt': 'Digit',
+    'Dgtl': 'Digital',
+    'Dgts': 'Digits',
+    'Dltn': 'Dilution',
+    'Dmnsns': 'Dimensions',
+    'Drct': 'Direct',
+    'Drctd': 'Directed',
+    'Drctn': 'Direction',
+    'Drctv': 'Directive',
+    'Drctly': 'Directly',
+    'Drctry': 'Directory',
+    'Drty': 'Dirty',
+    'Dsbl': 'Disable',
+    'Dsbld': 'Disabled',
+    'Dsbrsd': 'Disbursed',
+    'Dsbrsmnt': 'Disbursement',
+    'Dsbrsmnts': 'Disbursements',
+    'Dscrdd': 'Discarded',
+    'Dschrge': 'Discharge',
+    'Dschrgd': 'Discharged',
+    'Dsclmr': 'Disclaimer',
+    'Dscld': 'Disclosed',
+    'Dsclsr': 'Disclosure',
+    'Dscnt': 'Discount',
+    'Dscvry': 'Discovery',
+    'Dscrpncy': 'Discrepancy',
+    'Dscrtn': 'Discretion',
+    'Dscrtnry': 'Discretionary',
+    'Dsptchd': 'Dispatched',
+    'Dspnsbl': 'Dispensable',
+    'Dspns': 'Dispense',
+    'Dspnsd': 'Dispensed',
+    'Dsplcmnt': 'Displacement',
+    'Disp': 'Display',
+    'Dispd': 'Displayed',
+    'Dspsl': 'Disposal',
+    'Dspstn': 'Disposition',
+    'Dspt': 'Dispute',
+    'Dsptd': 'Disputed',
+    'Dssmntn': 'Dissemination',
+    'Dsstr': 'Dissenter',
+    'Dstnc': 'Distance',
+    'Dstllts': 'Distillates',
+    'Dstngshd': 'Distinguished',
+    'Dstrbtd': 'Distributed',
+    'Dstrbtn': 'Distribution',
+    'Dstrbtr': 'Distributor',
+    'Dstrct': 'District',
+    'DIV': 'DIV',
+    'DIVANN': 'DIVANN',
+    'Dvd': 'Divide',
+    'Dvdd': 'Dividend',
+    'Dvsn': 'Division',
+    'DN': 'DN',
+    'Do': 'Do',
+    'Dctrn': 'Doctrine',
+    'Doc': 'Document',
+    'Dcmntry': 'Documentary',
+    'Dcmnttn': 'Documentation',
+    'Docs': 'Documents',
+    'Domn': 'Domain',
+    'Dmst': 'Domestic',
+    'Dmcl': 'Domicile',
+    'Dmcltn': 'Domiciliation',
+    'Dontn': 'Donation',
+    'Done': 'Done',
+    'Dont': 'Dont',
+    'Dwn': 'Down',
+    'Dwnld': 'Download',
+    'Drft': 'Draft',
+    'Drwdwn': 'Drawdown',
+    'Drwee': 'Drawee',
+    'Drwr': 'Drawer',
+    'Drwg': 'Drawing',
+    'Drwn': 'Drawn',
+    'Drip': 'DRIP',
+    'Drv': 'Drive',
+    'Drvr': 'Driver',
+    'Drvrs': 'Drivers',
+    'Drvg': 'Driving',
+    'Drp': 'Drop',
+    'Dry': 'Dry',
+    'DSS': 'DSS',
+    'DTC': 'DTC',
+    'DTCC': 'DTCC',
+    'DTCCCACO': 'DTCCCACO',
+    'DTCCCANO': 'DTCCCANO',
+    'DTCCCANOCSD': 'DTCCCANOCSD',
+    'DTCCCAPA': 'DTCCCAPA',
+    'DTCCCAPS': 'DTCCCAPS',
+    'DTCFCP': 'DTCFCP',
+    'DTCUS': 'DTCUS',
+    'Dual': 'Dual',
+    'Due': 'Due',
+    'DUNS': 'DUNS',
+    'Dplct': 'Duplicate',
+    'Drtn': 'Duration',
+    'Durg': 'During',
+    'Dtch': 'Dutch',
+    'Dty': 'Duty',
+    'EANGLN': 'EANGLN',
+    'EANUPC': 'EANUPC',
+    'Earlr': 'Earlier',
+    'Earlst': 'Earliest',
+    'Early': 'Early',
+    'Earmrk': 'Earmark',
+    'Earngs': 'Earnings',
+    'Estwrd': 'Eastward',
+    'Ecnmc': 'Economic',
+    'Ecnmy': 'Economy',
+    'EDS': 'EDS',
+    'Edctn': 'Education',
+    'EEA': 'EEA',
+    'Fct': 'Effect',
+    'Fctv': 'Effective',
+    'Effcncy': 'Efficiency',
+    'Effcnt': 'Efficient',
+    'EIPP': 'EIPP',
+    'Elstc': 'Elastic',
+    'Elctd': 'Elected',
+    'Elctn': 'Election',
+    'Elctrcty': 'Electricity',
+    'Elctrnc': 'Electronic',
+    'Elmt': 'Element',
+    'Elmts': 'Elements',
+    'Elgblty': 'Eligibility',
+    'Elgbl': 'Eligible',
+    'Lswhr': 'Elsewhere',
+    'Email': 'Email',
+    'Mbdd': 'Embedded',
+    'EMIR': 'EMIR',
+    'Emssn': 'Emission',
+    'Emssns': 'Emissions',
+    'Mplyee': 'Employee',
+    'Mplyees': 'Employees',
+    'Mplyr': 'Employer',
+    'Emplng': 'Employing',
+    'Mplymnt': 'Employment',
+    'Mpty': 'Empty',
+    'Nbl': 'Enable',
+    'Nbld': 'Enabled',
+    'Ncpsltd': 'Encapsulated',
+    'Ncphrmnt': 'Encipherment',
+    'Nclsd': 'Enclosed',
+    'Nclsr': 'Enclosure',
+    'Ncodg': 'Encoding',
+    'Ncrpt': 'Encrypt',
+    'Ncrptd': 'Encrypted',
+    'Ncrptn': 'Encryption',
+    'Ncmbrd': 'Encumbered',
+    'End': 'End',
+    'Endd': 'Ended',
+    'Endg': 'Ending',
+    'Ndrsng': 'Endorsing',
+    'Nrgy': 'Energy',
+    'Nfrcmnt': 'Enforcement',
+    'Ngn': 'Engine',
+    'En': 'English',
+    'Nhncd': 'Enhanced',
+    'Nhncmnt': 'Enhancement',
+    'Enqry': 'Enquiry',
+    'Enrlmnt': 'Enrolment',
+    'Nsrd': 'Ensured',
+    'Ntrd': 'Entered',
+    'Ntrg': 'Entering',
+    'Ntrprs': 'Enterprise',
+    'Ntties': 'Entities',
+    'Entitld': 'Entitled',
+    'Entitlmnt': 'Entitlement',
+    'Ntty': 'Entity',
+    'Ntrprnrshp': 'Entrepreneurship',
+    'Ntries': 'Entries',
+    'Ntry': 'Entry',
+    'Envlp': 'Envelope',
+    'Envlpd': 'Enveloped',
+    'Envt': 'Environment',
+    'Envttl': 'Environmental',
+    'EQ': 'Equal',
+    'Equlstn': 'Equalisation',
+    'Eqlzt': 'Equalization',
+    'Eqpmnt': 'Equipment',
+    'Eqty': 'Equity',
+    'Eqvt': 'Equivalent',
+    'ERISA': 'ERISA',
+    'Err': 'Error',
+    'Errs': 'Errors',
+    'Escrw': 'Escrow',
+    'Escrwd': 'Escrowed',
+    'ESG': 'ESG',
+    'ESMA': 'ESMA',
+    'Estrc': 'Esoteric',
+    'Estblishd': 'Established',
+    'Estblishmt': 'Establishment',
+    'Estt': 'Estate',
+    'Estmt': 'Estimate',
+    'Estmtd': 'Estimated',
+    'ETC': 'ETC',
+    'ETD': 'ETD',
+    'Ethncty': 'Ethnicity',
+    'EU': 'EU',
+    'EUPSD': 'EUPSD',
+    'EUPSD2SCA': 'EUPSD2SCA',
+    'EUR': 'EUR',
+    'Euro': 'Euro',
+    'ED': 'Eurodollar',
+    'Eurpn': 'European',
+    'Evt': 'Event',
+    'Evts': 'Events',
+    'Evdnc': 'Evidence',
+    'Ex': 'Ex',
+    'Excdg': 'Exceeding',
+    'Xcptn': 'Exception',
+    'Xcptnl': 'Exceptional',
+    'Xcptns': 'Exceptions',
+    'Xcss': 'Excess',
+    'Xchg': 'Exchange',
+    'Xchgd': 'Exchanged',
+    'Excld': 'Excluded',
+    'Exclg': 'Excluding',
+    'Exclsn': 'Exclusion',
+    'Exclsv': 'Exclusive',
+    'Exctbl': 'Executable',
+    'Exct': 'Execute',
+    'Exctd': 'Executed',
+    'Exctg': 'Executing',
+    'Exctn': 'Execution',
+    'Xmpt': 'Exempt',
+    'Xmptd': 'Exempted',
+    'Xmptn': 'Exemption',
+    'Exrcbl': 'Exercisable',
+    'Exrc': 'Exercise',
+    'Exstg': 'Existing',
+    'Exit': 'Exit',
+    'Extc': 'Exotic',
+    'Xpctd': 'Expected',
+    'Expndtr': 'Expenditure',
+    'Expns': 'Expense',
+    'Expnss': 'Expenses',
+    'Exprnc': 'Experience',
+    'Exprt': 'Expert',
+    'Xprtn': 'Expiration',
+    'Xpry': 'Expiry',
+    'Expltn': 'Explanation',
+    'Expnt': 'Exponent',
+    'Exptr': 'Exporter',
+    'Xpsd': 'Exposed',
+    'Xpsr': 'Exposure',
+    'Xpsrs': 'Exposures',
+    'Xtnd': 'Extend',
+    'Xtnded': 'Extended',
+    'Xtndbl': 'Extendible',
+    'Xtnsn': 'Extension',
+    'Xtnt': 'Extent',
+    'Xtrnl': 'External',
+    'Xtrnly': 'Externally',
+    'Xtra': 'Extra',
+    'Face': 'Face',
+    'Fclties': 'Facilities',
+    'Fclty': 'Facility',
+    'Fctr': 'Factor',
+    'Factrg': 'Factoring',
+    'Fctrstn': 'Factorisation',
+    'Fctrs': 'Factors',
+    'Fail': 'Fail',
+    'Faild': 'Failed',
+    'Flng': 'Failing',
+    'Fls': 'Fails',
+    'Failr': 'Failure',
+    'Fair': 'Fair',
+    'Fllbck': 'Fallback',
+    'Fmly': 'Family',
+    'FATCA': 'FATCA',
+    'Fthr': 'Father',
+    'Fax': 'Fax',
+    'Featr': 'Feature',
+    'Featrs': 'Features',
+    'Fdrl': 'Federal',
+    'USFW': 'FedwireRoutingNumberIdentification',
+    'Fee': 'Fee',
+    'Fees': 'Fees',
+    'Fncd': 'Fenced',
+    'Frtlzr': 'Fertilizer',
+    'Fld': 'Field',
+    'File': 'File',
+    'FA': 'FileAct',
+    'Filg': 'Filing',
+    'Fill': 'Fill',
+    'Filld': 'Filled',
+    'Fillg': 'Filling',
+    'Fltr': 'Filter',
+    'FIN': 'FIN',
+    'Fnl': 'Final',
+    'Finc': 'Finance',
+    'Fincd': 'Financed',
+    'Fin': 'Financial',
+    'FI': 'FinancialInstitution',
+    'Fincg': 'Financing',
+    'Fire': 'Fire',
+    'Firm': 'Firm',
+    'Frmwr': 'Firmware',
+    'Frst': 'First',
+    'Fscl': 'Fiscal',
+    'FIToFI': 'FIToFI',
+    'Five': 'Five',
+    'Fxd': 'Fixed',
+    'Fxg': 'Fixing',
+    'Flg': 'Flag',
+    'Flat': 'Flat',
+    'Fleet': 'Fleet',
+    'Flx': 'Flex',
+    'Flxbl': 'Flexible',
+    'Flght': 'Flight',
+    'Fltg': 'Floating',
+    'Flr': 'Floor',
+    'Flow': 'Flow',
+    'Flows': 'Flows',
+    'Fcs': 'Focus',
+    'Folio': 'Folio',
+    'Fllw': 'Follow',
+    'For': 'For',
+    'Frbrnc': 'Forbearance',
+    'Force': 'Force',
+    'Forcd': 'Forced',
+    'Fcst': 'Forecast',
+    'Frcstd': 'Forecasted',
+    'Frclsr': 'Foreclosure',
+    'Frgn': 'Foreign',
+    'FX': 'ForeignExchange',
+    'Frstry': 'Forestry',
+    'Frft': 'Forfeit',
+    'Frgvnss': 'Forgiveness',
+    'Form': 'Form',
+    'Frmt': 'Format',
+    'Frmtd': 'Formatted',
+    'Frms': 'Forms',
+    'Frmla': 'Formula',
+    'Fwd': 'Forward',
+    'Fwdd': 'Forwarded',
+    'Fwdg': 'Forwarding',
+    'Four': 'Four',
+    'Frth': 'Fourth',
+    'Frctn': 'Fraction',
+    'Frctnl': 'Fractional',
+    'Frame': 'Frame',
+    'Frmwk': 'Framework',
+    'Frnkd': 'Franked',
+    'Frnkg': 'Franking',
+    'Frd': 'Fraud',
+    'Frdlnt': 'Fraudulent',
+    'Free': 'Free',
+    'Frght': 'Freight',
+    'Frnch': 'French',
+    'Frqcy': 'Frequency',
+    'Fr': 'From',
+    'Frnt': 'Front',
+    'Fuel': 'Fuel',
+    'Flfmt': 'Fulfilment',
+    'Full': 'Full',
+    'Fully': 'Fully',
+    'Fctn': 'Function',
+    'Fctnl': 'Functional',
+    'Fnd': 'Fund',
+    'Fndd': 'Funded',
+    'Fndg': 'Funding',
+    'FPP': 'FundProcessingPassport',
+    'Fnds': 'Funds',
+    'Fngb': 'Fungible',
+    'Frthr': 'Further',
+    'Futr': 'Future',
+    'Futrs': 'Futures',
+    'Fx': 'FX',
+    'Gn': 'Gain',
+    'Gns': 'Gains',
+    'Game': 'Game',
+    'Grnshee': 'Garnishee',
+    'Grnshmt': 'Garnishment',
+    'Gas': 'Gas',
+    'Gtg': 'Gating',
+    'Gauge': 'Gauge',
+    'GBP': 'GBP',
+    'GCA': 'GCA',
+    'GDPR': 'GDPR',
+    'Gndr': 'Gender',
+    'Gnl': 'General',
+    'Gnrtd': 'Generated',
+    'Gnrtn': 'Generation',
+    'Gnrtr': 'Generator',
+    'Gnc': 'Generic',
+    'G': 'Geo',
+    'Geogc': 'Geographic',
+    'Geo': 'Geographical',
+    'Geogcs': 'Geographics',
+    'Glctn': 'Geolocation',
+    'Grmn': 'German',
+    'DEBLZ': 'GermanBankleitzahlIdentification',
+    'DE': 'Germany',
+    'Get': 'Get',
+    'GET': 'GET',
+    'Gv': 'Give',
+    'Gvn': 'Given',
+    'Gbl': 'Global',
+    'GMI': 'GMI',
+    'Go': 'Go',
+    'Gng': 'Going',
+    'Gold': 'Gold',
+    'Good': 'Good',
+    'Goods': 'Goods',
+    'Govnc': 'Governance',
+    'Govng': 'Governing',
+    'Govnt': 'Government',
+    'GPI': 'Gpi',
+    'Grace': 'Grace',
+    'Grn': 'Grain',
+    'Grd': 'Grand',
+    'Grdfthd': 'Grandfathered',
+    'Grant': 'Grant',
+    'Grantd': 'Granted',
+    'Grntr': 'Granter',
+    'Grnlrty': 'Granularity',
+    'Grtty': 'Gratuity',
+    'Grss': 'Gross',
+    'Grnd': 'Ground',
+    'Grp': 'Group',
+    'Grpg': 'Grouping',
+    'Grwth': 'Growth',
+    'Grnt': 'Guarantee',
+    'Grnted': 'Guaranteed',
+    'Guarntr': 'Guarantor',
+    'Guardn': 'Guardian',
+    'Gsts': 'Guests',
+    'Hrcut': 'Haircut',
+    'Half': 'Half',
+    'Halt': 'Halt',
+    'Hdlg': 'Handling',
+    'Hard': 'Hard',
+    'Hash': 'Hash',
+    'Head': 'Head',
+    'Hdr': 'Header',
+    'Hlth': 'Health',
+    'Hrg': 'Hearing',
+    'Hdg': 'Hedge',
+    'Hdgg': 'Hedging',
+    'Held': 'Held',
+    'GRHEBIC': 'HellenicBankIdentificationCode',
+    'Hex': 'Hexadecimal',
+    'Hddn': 'Hidden',
+    'Hgh': 'High',
+    'Hghr': 'Higher',
+    'Hghst': 'Highest',
+    'Hghly': 'Highly',
+    'Hird': 'Hired',
+    'Hstrc': 'Historic',
+    'Hstrcl': 'Historical',
+    'Hstry': 'History',
+    'Hoc': 'Hoc',
+    'Hld': 'Hold',
+    'Hldr': 'Holder',
+    'Hldg': 'Holding',
+    'Hldgs': 'Holdings',
+    'Home': 'Home',
+    'HKNCC': 'HongKongBankCode',
+    'Hnrd': 'Honored',
+    'Hrzn': 'Horizon',
+    'Hst': 'Host',
+    'Hstg': 'Hosting',
+    'Hrs': 'Hours',
+    'Hs': 'House',
+    'HsHld': 'Household',
+    'HTTP': 'HTTP',
+    'Hbmtr': 'Hubometer',
+    'Hpthtcl': 'Hypothetical',
+    'IATA': 'IATA',
+    'IBAN': 'IBAN',
+    'IBEI': 'IBEI',
+    'ICC': 'ICC',
+    'Id': 'Identification',
+    'Ids': 'Identifications',
+    'Idr': 'Identifier',
+    'Idrs': 'Identifiers',
+    'Idnty': 'Identity',
+    'Idle': 'Idle',
+    'If': 'If',
+    'Ignr': 'Ignore',
+    'Img': 'Image',
+    'Imbal': 'Imbalance',
+    'IMEI': 'IMEI',
+    'Imdt': 'Immediate',
+    'Imblsd': 'Immobilised',
+    'IMO': 'IMO',
+    'Impct': 'Impact',
+    'Imprd': 'Impaired',
+    'Implmnttn': 'Implementation',
+    'Impld': 'Implied',
+    'Imprtnt': 'Important',
+    'Imprvmt': 'Improvement',
+    'IMSI': 'IMSI',
+    'In': 'In',
+    'Inctvty': 'Inactivity',
+    'Inbnd': 'Inbound',
+    'Incntiv': 'Incentive',
+    'Incptn': 'Inception',
+    'Incdnt': 'Incident',
+    'Incl': 'Included',
+    'Inclg': 'Including',
+    'Inclsn': 'Inclusion',
+    'Inclsv': 'Inclusive',
+    'Incm': 'Income',
+    'Incmg': 'Incoming',
+    'Incmptncy': 'Incompetency',
+    'Incmptnt': 'Incompetent',
+    'Incnsstncy': 'Inconsistency',
+    'Incorprtn': 'Incorporation',
+    'Incrrct': 'Incorrect',
+    'Incotrms': 'Incoterms',
+    'Incr': 'Increase',
+    'Incrd': 'Increased',
+    'Incrg': 'Increasing',
+    'Incrmt': 'Increment',
+    'Incrmtl': 'Incremental',
+    'Indmnty': 'Indemnity',
+    'Indpdnt': 'Independent',
+    'Indx': 'Index',
+    'INIFSC': 'IndianFinancialSystemCode',
+    'Indctn': 'Indication',
+    'Indctv': 'Indicative',
+    'Ind': 'Indicator',
+    'Indctrs': 'Indicators',
+    'Indrct': 'Indirect',
+    'Indv': 'Individual',
+    'Indstrl': 'Industrial',
+    'Indstry': 'Industry',
+    'Ifrrd': 'Inferred',
+    'Infltn': 'Inflation',
+    'Infrm': 'Inform',
+    'Inf': 'Information',
+    'Infl': 'Informational',
+    'Inftv': 'Informative',
+    'Infrmd': 'Informed',
+    'Infrmg': 'Informing',
+    'Infrstrctr': 'Infrastructure',
+    'Initl': 'Initial',
+    'Initlstn': 'Initialisation',
+    'Initls': 'Initials',
+    'Init': 'Initiate',
+    'Inittd': 'Initiated',
+    'Initg': 'Initiating',
+    'Initn': 'Initiation',
+    'Initr': 'Initiator',
+    'Innvtv': 'Innovative',
+    'Inprtv': 'Inoperative',
+    'Inpt': 'Input',
+    'Nqry': 'Inquiry',
+    'Insd': 'Inside',
+    'Inslvncy': 'Insolvency',
+    'Inspctn': 'Inspection',
+    'Inspctr': 'Inspector',
+    'Instlmt': 'Instalment',
+    'Instlmts': 'Instalments',
+    'Instnt': 'Instant',
+    'Instt': 'Instate',
+    'Instn': 'Institution',
+    'Instnl': 'Institutional',
+    'Instns': 'Institutions',
+    'Inst': 'Instruct',
+    'Instd': 'Instructed',
+    'Instg': 'Instructing',
+    'Instr': 'Instruction',
+    'Instrs': 'Instructions',
+    'Instrm': 'Instrument',
+    'Instrms': 'Instruments',
+    'Insrnc': 'Insurance',
+    'Insrd': 'Insured',
+    'Intgrtd': 'Integrated',
+    'Intgtn': 'Integration',
+    'Intnd': 'Intend',
+    'Intndd': 'Intended',
+    'Intt': 'Intent',
+    'Intntn': 'Intention',
+    'Intr': 'Inter',
+    'IA': 'InterAct',
+    'Intractn': 'Interaction',
+    'IntrBk': 'Interbank',
+    'Intrchng': 'Interchange',
+    'Intrcnnctn': 'Interconnection',
+    'Intrst': 'Interest',
+    'Intrstd': 'Interested',
+    'Intrfc': 'Interface',
+    'Intrm': 'Interim',
+    'Intrmkt': 'Intermarket',
+    'Intrmies': 'Intermediaries',
+    'Intrmy': 'Intermediary',
+    'Intrmdt': 'Intermediate',
+    'Intl': 'Internal',
+    'Intlr': 'Internaliser',
+    'Intrnl': 'International',
+    'Intrvl': 'Interval',
+    'Intra': 'Intra',
+    'Ntrgrp': 'Intragroup',
+    'Intrdcg': 'Introducing',
+    'Invld': 'Invalid',
+    'Invldty': 'Invalidity',
+    'Nvrtd': 'Inverted',
+    'Invstd': 'Invested',
+    'Invstgtd': 'Investigated',
+    'Invstgtn': 'Investigation',
+    'Invstmt': 'Investment',
+    'Invstmts': 'Investments',
+    'Invstr': 'Investor',
+    'Invstrs': 'Investors',
+    'Invc': 'Invoice',
+    'Invcd': 'Invoiced',
+    'Invcee': 'Invoicee',
+    'Invcr': 'Invoicer',
+    'Invcg': 'Invoicing',
+    'IOI': 'IOI',
+    'IP': 'IP',
+    'IRI': 'IRI',
+    'IENSC': 'IrishNSCIdentification',
+    'IRS': 'IRS',
+    'Is': 'Is',
+    'ISA': 'ISA',
+    'Isabel': 'Isabel',
+    'ISIN': 'ISIN',
+    'ISO': 'ISO',
+    'Issnc': 'Issuance',
+    'Isse': 'Issue',
+    'Issd': 'Issued',
+    'Issr': 'Issuer',
+    'Issg': 'Issuing',
+    'ITNCC': 'ItalianDomesticIdentificationCode',
+    'Itm': 'Item',
+    'Itms': 'Items',
+    'Jpns': 'Japanese',
+    'JASDEC': 'JASDEC',
+    'Job': 'Job',
+    'Jnt': 'Joint',
+    'Jrnl': 'Journal',
+    'Jrny': 'Journey',
+    'Judgmnts': 'Judgements',
+    'Jursdctn': 'Jurisdiction',
+    'Justfn': 'Justification',
+    'KCV': 'KCV',
+    'Keep': 'Keep',
+    'KEK': 'KEK',
+    'Key': 'Key',
+    'Keys': 'Keys',
+    'Kind': 'Kind',
+    'Know': 'Know',
+    'Knwldg': 'Knowledge',
+    'Labl': 'Label',
+    'Lbllg': 'Labelling',
+    'Labr': 'Labor',
+    'Lang': 'Language',
+    'Lpsd': 'Lapsed',
+    'Lrg': 'Large',
+    'Lrgst': 'Largest',
+    'Last': 'Last',
+    'Late': 'Late',
+    'Latr': 'Later',
+    'Latst': 'Latest',
+    'Lat': 'Latitude',
+    'Lnch': 'Launch',
+    'Lndrg': 'Laundering',
+    'Law': 'Law',
+    'Lead': 'Lead',
+    'Leadr': 'Leader',
+    'Leas': 'Lease',
+    'Leasd': 'Leased',
+    'Leashld': 'Leasehold',
+    'Leasg': 'Leasing',
+    'Leav': 'Leave',
+    'Ldgr': 'Ledger',
+    'Lft': 'Left',
+    'Leg': 'Leg',
+    'Lgl': 'Legal',
+    'Legs': 'Legs',
+    'LEI': 'LEI',
+    'Lndr': 'Lender',
+    'Lndg': 'Lending',
+    'Lngth': 'Length',
+    'Lttr': 'Letter',
+    'Lvl': 'Level',
+    'Lvls': 'Levels',
+    'Lvrg': 'Leverage',
+    'Lvrgd': 'Leveraged',
+    'Levy': 'Levy',
+    'Lblty': 'Liability',
+    'Lic': 'License',
+    'Lien': 'Lien',
+    'Lieu': 'Lieu',
+    'Life': 'Life',
+    'Lftm': 'Lifetime',
+    'Lght': 'Light',
+    'Lmt': 'Limit',
+    'Lmttn': 'Limitation',
+    'Ltd': 'Limited',
+    'Lmts': 'Limits',
+    'Line': 'Line',
+    'Lines': 'Lines',
+    'Lk': 'Link',
+    'Lkg': 'Linkage',
+    'Lnkgs': 'Linkages',
+    'Lkd': 'Linked',
+    'Lqd': 'Liquid',
+    'Lqdtn': 'Liquidation',
+    'Lqdty': 'Liquidity',
+    'List': 'List',
+    'Listg': 'Listing',
+    'Ltgtn': 'Litigation',
+    'Live': 'Live',
+    'Ld': 'Load',
+    'Loadng': 'Loading',
+    'Ln': 'Loan',
+    'Lcl': 'Local',
+    'Lcle': 'Locale',
+    'Lct': 'Locate',
+    'Lctn': 'Location',
+    'Lctr': 'Locator',
+    'Lck': 'Lock',
+    'Lckout': 'Lockout',
+    'Ldgmnt': 'Lodgement',
+    'Ldgg': 'Lodging',
+    'Lg': 'Log',
+    'Lggd': 'Logged',
+    'Logcl': 'Logical',
+    'Lgn': 'Login',
+    'Logstcs': 'Logistics',
+    'Logo': 'Logo',
+    'Lgt': 'Logout',
+    'Lng': 'Long',
+    'Lngr': 'Longer',
+    'Long': 'Longitude',
+    'Look': 'Look',
+    'Loss': 'Loss',
+    'Losses': 'Losses',
+    'Lot': 'Lot',
+    'Lots': 'Lots',
+    'Ltry': 'Lottery',
+    'Lw': 'Low',
+    'Lwr': 'Lower',
+    'Lwst': 'Lowest',
+    'Llty': 'Loyalty',
+    'LRCI': 'LRCI',
+    'Lump': 'Lump',
+    'MAC': 'MAC',
+    'Macro': 'Macro',
+    'Mgntc': 'Magnetic',
+    'Mdn': 'Maiden',
+    'Mail': 'Mail',
+    'Mld': 'Mailed',
+    'Mlng': 'Mailing',
+    'Main': 'Main',
+    'Mntng': 'Maintaining',
+    'Mntnc': 'Maintenance',
+    'Mjr': 'Major',
+    'Make': 'Make',
+    'Makr': 'Maker',
+    'Man': 'Man',
+    'Mgd': 'Managed',
+    'Mgmt': 'Management',
+    'Mgr': 'Manager',
+    'Mgg': 'Managing',
+    'Mndt': 'Mandate',
+    'Mndtd': 'Mandated',
+    'Mndtry': 'Mandatory',
+    'Mnfst': 'Manifest',
+    'Mntss': 'Mantissa',
+    'Mnl': 'Manual',
+    'Mnly': 'Manually',
+    'Manfctrd': 'Manufactured',
+    'Manfctr': 'Manufacturer',
+    'Manfctg': 'Manufacturing',
+    'Mrgn': 'Margin',
+    'Mrgnd': 'Margined',
+    'Mrk': 'Mark',
+    'Mrkd': 'Marked',
+    'Mrkr': 'Marker',
+    'Mkt': 'Market',
+    'Mrktbl': 'Marketable',
+    'Mrktd': 'Marketed',
+    'Mrktg': 'Marketing',
+    'Mkts': 'Markets',
+    'Mkp': 'Markup',
+    'Msk': 'Mask',
+    'Mskd': 'Masked',
+    'Mass': 'Mass',
+    'Mstr': 'Master',
+    'Mtch': 'Match',
+    'Mtchd': 'Matched',
+    'Mtchs': 'Matches',
+    'Mtchg': 'Matching',
+    'Mtrl': 'Material',
+    'Mtrlty': 'Materiality',
+    'Mtrg': 'Maturing',
+    'Mtrty': 'Maturity',
+    'Mx': 'Max',
+    'Max': 'Maximum',
+    'May': 'May',
+    'Means': 'Means',
+    'Measr': 'Measure',
+    'Measrmnt': 'Measurement',
+    'Mchnsm': 'Mechanism',
+    'Mdia': 'Media',
+    'Mdcl': 'Medical',
+    'Mdm': 'Medium',
+    'Mtg': 'Meeting',
+    'Mmb': 'Member',
+    'Mmbsh': 'Membership',
+    'Memo': 'Memo',
+    'Mmrl': 'Memorial',
+    'Mmry': 'Memory',
+    'Menu': 'Menu',
+    'Mrchnt': 'Merchant',
+    'Mrgr': 'Merger',
+    'Msg': 'Message',
+    'Msgs': 'Messages',
+    'MT': 'MessageType',
+    'Msgg': 'Messaging',
+    'Meta': 'Meta',
+    'Metadata': 'Metadata',
+    'Metl': 'Metal',
+    'Mtrs': 'Meters',
+    'Mtd': 'Method',
+    'Mthdlgy': 'Methodology',
+    'Mthds': 'Methods',
+    'Mtrcs': 'Metrics',
+    'MIC': 'MIC',
+    'MICR': 'MICR',
+    'McrFlm': 'Microfilm',
+    'Mid': 'Mid',
+    'Mddl': 'Middle',
+    'MiFID': 'MiFID',
+    'MiFIR': 'MiFIR',
+    'Mgrtd': 'Migrated',
+    'Mgrtn': 'Migration',
+    'Mln': 'Million',
+    'MIME': 'MIME',
+    'Mnml': 'Minimal',
+    'Min': 'Minimum',
+    'Mnms': 'Minimus',
+    'Mnr': 'Minor',
+    'Mns': 'Minus',
+    'Mrrr': 'Mirror',
+    'Mis': 'Mis',
+    'Misc': 'Miscellaneous',
+    'Mssng': 'Missing',
+    'Mix': 'Mix',
+    'Mob': 'Mobile',
+    'Modl': 'Modal',
+    'Modlty': 'Modality',
+    'Md': 'Mode',
+    'Mdl': 'Model',
+    'Mod': 'Modification',
+    'Mods': 'Modifications',
+    'Modfd': 'Modified',
+    'Modfr': 'Modifier',
+    'Modfy': 'Modify',
+    'Mdls': 'Modules',
+    'Mdlus': 'Modulus',
+    'Mntry': 'Monetary',
+    'Mny': 'Money',
+    'Mntr': 'Monitor',
+    'Mnth': 'Month',
+    'Mnthly': 'Monthly',
+    'Mnths': 'Months',
+    'More': 'More',
+    'Mrtg': 'Mortgage',
+    'Most': 'Most',
+    'Mthr': 'Mother',
+    'MOTO': 'MOTO',
+    'Mv': 'Move',
+    'Mvd': 'Moved',
+    'Mvmnt': 'Movement',
+    'Mvmnts': 'Movements',
+    'MSISDN': 'MSISDN',
+    'Multi': 'Multi',
+    'Mul': 'Multilateral',
+    'Mltlg': 'Multileg',
+    'Mltmdl': 'Multimodal',
+    'Mltpl': 'Multiple',
+    'Mltplr': 'Multiplier',
+    'Mltply': 'Multiply',
+    'Mncpl': 'Municipal',
+    'Must': 'Must',
+    'Mtl': 'Mutual',
+    'My': 'My',
+    'Nm': 'Name',
+    'Nmd': 'Named',
+    'Nrrtv': 'Narrative',
+    'Ntl': 'National',
+    'Ntlty': 'Nationality',
+    'Ntrl': 'Natural',
+    'Ntr': 'Nature',
+    'NAV': 'NAV',
+    'NCB': 'NCB',
+    'Near': 'Near',
+    'Need': 'Need',
+    'Needs': 'Needs',
+    'Neg': 'Negative',
+    'Ngtbl': 'Negotiable',
+    'Ngtd': 'Negotiated',
+    'Net': 'Net',
+    'Netd': 'Netted',
+    'Netg': 'Netting',
+    'Ntwk': 'Network',
+    'Nvr': 'Never',
+    'New': 'New',
+    'Nwsprnt': 'Newsprint',
+    'NZNCC': 'NewZealandNCCIdentification',
+    'Nxt': 'Next',
+    'Nine': 'Nine',
+    'Ntrt': 'Nitrate',
+    'No': 'No',
+    'Nmnl': 'Nominal',
+    'Nmntd': 'Nominated',
+    'Nmnee': 'Nominee',
+    'Non': 'Non',
+    'NDF': 'NonDeliverableForward',
+    'Nn': 'None',
+    'NFI': 'NonFinancialInstitution',
+    'Nrml': 'Normal',
+    'Nrmlzd': 'Normalized',
+    'Nrthwrd': 'Northward',
+    'Nstr': 'Nostro',
+    'Not': 'Not',
+    'NCT': 'NotContain',
+    'Note': 'Note',
+    'Notehldr': 'Noteholder',
+    'NEQ': 'NotEqual',
+    'Notes': 'Notes',
+    'Nthg': 'Nothing',
+    'Ntce': 'Notice',
+    'Ntfctn': 'Notification',
+    'Ntfctns': 'Notifications',
+    'Ntfd': 'Notified',
+    'Ntfy': 'Notify',
+    'Ntifng': 'Notifying',
+    'Ntnl': 'Notional',
+    'Nvtd': 'Novated',
+    'Nvtn': 'Novation',
+    'NPS': 'NPS',
+    'NRA': 'NRA',
+    'NT': 'NT',
+    'Nb': 'Number',
+    'Nmrtr': 'Numerator',
+    'Nmrc': 'Numeric',
+    'Nmrcl': 'Numerical',
+    'Objct': 'Object',
+    'Objctn': 'Objection',
+    'Objctvs': 'Objectives',
+    'Objcts': 'Objects',
+    'Oblgtd': 'Obligated',
+    'Oblgtn': 'Obligation',
+    'Oblgtns': 'Obligations',
+    'Oblgr': 'Obligor',
+    'Obsrvtns': 'Observations',
+    'Obtnd': 'Obtained',
+    'OCC': 'OCC',
+    'Ocpncy': 'Occupancy',
+    'Ocrd': 'Occurred',
+    'Ocrnc': 'Occurrence',
+    'Ocrncs': 'Occurrences',
+    'Odd': 'Odd',
+    'Odmtr': 'Odometer',
+    'Of': 'Of',
+    'Off': 'Off',
+    'Offer': 'Offer',
+    'Offerd': 'Offered',
+    'Offerr': 'Offeror',
+    'Offc': 'Office',
+    'Offcr': 'Officer',
+    'Offcl': 'Official',
+    'Offset': 'Offset',
+    'OID': 'OID',
+    'Oil': 'Oil',
+    'Od': 'Old',
+    'Olv': 'Olive',
+    'Omnbs': 'Omnibus',
+    'On': 'On',
+    'Onbrdg': 'Onboarding',
+    'One': 'One',
+    'Onln': 'Online',
+    'Only': 'Only',
+    'Opn': 'Open',
+    'Opng': 'Opening',
+    'Oprg': 'Operating',
+    'Opr': 'Operation',
+    'Oprl': 'Operational',
+    'Oprtr': 'Operator',
+    'Optn': 'Option',
+    'Optnl': 'Optional',
+    'Or': 'Or',
+    'Ordr': 'Order',
+    'Ordrd': 'Ordered',
+    'Ordrg': 'Ordering',
+    'Ordrs': 'Orders',
+    'Ordnry': 'Ordinary',
+    'Org': 'Organisation',
+    'Orgl': 'Organisational',
+    'Orgn': 'Origin',
+    'Orgnl': 'Original',
+    'Orgtg': 'Originating',
+    'Orgtn': 'Origination',
+    'Orgtr': 'Originator',
+    'OTC': 'OTC',
+    'Othr': 'Other',
+    'Out': 'Out',
+    'Outg': 'Outage',
+    'Outdtd': 'Outdated',
+    'Outdr': 'Outdoor',
+    'Outflw': 'Outflow',
+    'Outgng': 'Outgoing',
+    'Otlrs': 'Outliers',
+    'Outpt': 'Output',
+    'Outrght': 'Outright',
+    'Outsd': 'Outside',
+    'Outsdng': 'Outstanding',
+    'Over': 'Over',
+    'Ovrll': 'Overall',
+    'Ovrdue': 'Overdue',
+    'Ovrhd': 'Overhead',
+    'Ovrnght': 'Overnight',
+    'Ovrrd': 'Override',
+    'Ovrsbcpt': 'Oversubscription',
+    'Own': 'Own',
+    'Ownd': 'Owned',
+    'Ownr': 'Owner',
+    'Ownrsh': 'Ownership',
+    'Packg': 'Package',
+    'Packgs': 'Packages',
+    'Packgng': 'Packaging',
+    'Packet': 'Packet',
+    'Pad': 'Pad',
+    'Pddg': 'Padding',
+    'Pg': 'Page',
+    'Pgntn': 'Pagination',
+    'Pd': 'Paid',
+    'Pair': 'Pair',
+    'Paird': 'Paired',
+    'Pairg': 'Pairing',
+    'PAN': 'PAN',
+    'Ppr': 'Paper',
+    'Par': 'Par',
+    'Prgrph': 'Paragraph',
+    'Parll': 'Parallel',
+    'Param': 'Parameter',
+    'Params': 'Parameters',
+    'Prnt': 'Parent',
+    'Prpss': 'PariPassu',
+    'Parity': 'Parity',
+    'Part': 'Part',
+    'Prtl': 'Partial',
+    'Prtly': 'Partially',
+    'Ptcpt': 'Participant',
+    'Ptcpts': 'Participants',
+    'Ptcp': 'Participate',
+    'Prtcptg': 'Participating',
+    'Prtcptn': 'Participation',
+    'Pties': 'Parties',
+    'Prtnr': 'Partner',
+    'Pty': 'Party',
+    'Pss': 'Pass',
+    'Pssngr': 'Passenger',
+    'Pssv': 'Passive',
+    'Pspt': 'Passport',
+    'Psptd': 'Passported',
+    'Psptg': 'Passporting',
+    'Pwd': 'Password',
+    'Past': 'Past',
+    'Pth': 'Path',
+    'Pttrn': 'Pattern',
+    'Pay': 'Pay',
+    'Pybl': 'Payable',
+    'Pyee': 'Payee',
+    'Pyer': 'Payer',
+    'Png': 'Paying',
+    'Pyld': 'Payload',
+    'Pmt': 'Payment',
+    'Pmts': 'Payments',
+    'Pyout': 'Payout',
+    'Peak': 'Peak',
+    'Peg': 'Peg',
+    'Pggd': 'Pegged',
+    'Pnlties': 'Penalties',
+    'Pnlty': 'Penalty',
+    'Pdg': 'Pending',
+    'Pnsn': 'Pension',
+    'Pnltmt': 'Penultimate',
+    'PEP': 'PEP',
+    'Per': 'Per',
+    'Pct': 'Percent',
+    'Pctg': 'Percentage',
+    'Prfctn': 'Perfection',
+    'Prfrm': 'Perform',
+    'Prfrmnc': 'Performance',
+    'Prfrmd': 'Performed',
+    'Prfrmg': 'Performing',
+    'Prd': 'Period',
+    'Prdc': 'Periodic',
+    'Prdcty': 'Periodicity',
+    'Prds': 'Periods',
+    'Prmssn': 'Permission',
+    'Perptl': 'Perpetual',
+    'Prsn': 'Person',
+    'Prsnl': 'Personal',
+    'Prsns': 'Persons',
+    'Phs': 'Phase',
+    'Phne': 'Phone',
+    'Phspht': 'Phosphate',
+    'Phys': 'Physical',
+    'Phytosntry': 'Phytosanitary',
+    'Pick': 'Pick',
+    'Pckp': 'Pickup',
+    'Pc': 'Piece',
+    'Pcs': 'Pieces',
+    'PIN': 'PIN',
+    'PKI': 'PKI',
+    'Plc': 'Place',
+    'Plcmnt': 'Placement',
+    'Plcs': 'Places',
+    'Plain': 'Plain',
+    'Plntff': 'Plaintiff',
+    'Plan': 'Plan',
+    'Pland': 'Planned',
+    'Plstc': 'Plastic',
+    'Pltfm': 'Platform',
+    'Play': 'Play',
+    'Pldg': 'Pledge',
+    'Pldgd': 'Pledged',
+    'Pldgee': 'Pledgee',
+    'Pldgr': 'Pledger',
+    'Pldgg': 'Pledging',
+    'Plus': 'Plus',
+    'PNZL': 'PNZL',
+    'Pckt': 'Pocket',
+    'POI': 'POI',
+    'Pt': 'Point',
+    'Pts': 'Points',
+    'Plcy': 'Policy',
+    'PLKNR': 'PolishNationalClearingCode',
+    'Pltcly': 'Politically',
+    'Plprpln': 'Polypropylene',
+    'Pool': 'Pool',
+    'Poolg': 'Pooling',
+    'Pls': 'Pools',
+    'Port': 'Port',
+    'Prtfl': 'Portfolio',
+    'Prtfls': 'Portfolios',
+    'Prtn': 'Portion',
+    'PTNCC': 'PortugueseNCCIdentification',
+    'Pos': 'Position',
+    'Poss': 'Positions',
+    'Postv': 'Positive',
+    'Pssssn': 'Possession',
+    'Pssblty': 'Possibility',
+    'Pssbl': 'Possible',
+    'Pst': 'Post',
+    'Pstg': 'Postage',
+    'Pstl': 'Postal',
+    'Pstd': 'Posted',
+    'Pstng': 'Posting',
+    'POB': 'PostOfficeBox',
+    'Ptsh': 'Potash',
+    'Ptt': 'Potato',
+    'Potntl': 'Potential',
+    'Pwr': 'Power',
+    'Prctc': 'Practice',
+    'Prctcs': 'Practices',
+    'Prcttnr': 'Practitioner',
+    'Pre': 'Pre',
+    'Pradvc': 'Preadvice',
+    'Prssgnd': 'Preassigned',
+    'Prec': 'Preceding',
+    'Prcs': 'Precious',
+    'Precise': 'Precise',
+    'Prcsn': 'Precision',
+    'Prdfnd': 'Predefined',
+    'Prdmnnt': 'Predominant',
+    'Pref': 'Preference',
+    'Prefs': 'Preferences',
+    'Prfrntl': 'Preferential',
+    'Prefrd': 'Preferred',
+    'Prfx': 'Prefix',
+    'Prfndd': 'Prefunded',
+    'Prlimry': 'Preliminary',
+    'Prmiss': 'Premises',
+    'Prm': 'Premium',
+    'Prepd': 'Prepaid',
+    'Preptn': 'Preparation',
+    'Prep': 'Prepare',
+    'Prepmt': 'Prepayment',
+    'Pres': 'Present',
+    'Presntn': 'Presentation',
+    'Presntd': 'Presented',
+    'Presntr': 'Presenter',
+    'Presntmnt': 'Presentment',
+    'Prsrvtn': 'Preservation',
+    'Prssr': 'Pressure',
+    'Prstgs': 'Prestigious',
+    'Prvl': 'Preval',
+    'Prvntn': 'Prevention',
+    'Prvs': 'Previous',
+    'Prevsly': 'Previously',
+    'Pric': 'Price',
+    'Prics': 'Prices',
+    'Pricg': 'Pricing',
+    'PRIIPS': 'PRIIPS',
+    'Pmry': 'Primary',
+    'Prime': 'Prime',
+    'Prncpl': 'Principal',
+    'Prncpls': 'Principals',
+    'Prt': 'Print',
+    'Prr': 'Prior',
+    'Prtistn': 'Prioritisation',
+    'Prtisd': 'Prioritised',
+    'Prty': 'Priority',
+    'Prvt': 'Private',
+    'Prvlg': 'Privilege',
+    'Pr': 'Pro',
+    'Prbblty': 'Probability',
+    'Prcdr': 'Procedure',
+    'Prcds': 'Proceeds',
+    'Prc': 'Process',
+    'Prcd': 'Processed',
+    'Prcg': 'Processing',
+    'Prcr': 'Processor',
+    'Pdct': 'Product',
+    'Pdctn': 'Production',
+    'Pdcts': 'Products',
+    'Prfssn': 'Profession',
+    'Prfssnl': 'Professional',
+    'Prfl': 'Profile',
+    'Prft': 'Profit',
+    'Prfts': 'Profits',
+    'Profrm': 'Proforma',
+    'Prgm': 'Program',
+    'Prgrmm': 'Programme',
+    'Prgrmms': 'Programmes',
+    'Prgrs': 'Progress',
+    'Prjctd': 'Projected',
+    'Prlngtn': 'Prolongation',
+    'Prmtn': 'Promotion',
+    'Prmpt': 'Prompt',
+    'Proof': 'Proof',
+    'Props': 'Properties',
+    'Prprty': 'Property',
+    'Prpsl': 'Proposal',
+    'Prp': 'Propose',
+    'Propsd': 'Proposed',
+    'Prtry': 'Proprietary',
+    'ProRata': 'ProRata',
+    'Prratn': 'Proration',
+    'Prspcts': 'Prospectus',
+    'Prtct': 'Protect',
+    'Prtctd': 'Protected',
+    'Prtcn': 'Protection',
+    'Prtctr': 'Protector',
+    'Prtcol': 'Protocol',
+    'Prvdd': 'Provided',
+    'Prvdr': 'Provider',
+    'Prvdrs': 'Providers',
+    'Prvc': 'Province',
+    'Prvsn': 'Provision',
+    'Prvsnl': 'Provisional',
+    'Prxy': 'Proxy',
+    'Pblc': 'Public',
+    'Pblctn': 'Publication',
+    'Pblshd': 'Published',
+    'Pulp': 'Pulp',
+    'Purchs': 'Purchase',
+    'Purchsd': 'Purchased',
+    'Purp': 'Purpose',
+    'Prs': 'Purse',
+    'Push': 'Push',
+    'Pushd': 'Pushed',
+    'Put': 'Put',
+    'Putbl': 'Putable',
+    'QR': 'QR',
+    'Qlfctn': 'Qualification',
+    'Qlfd': 'Qualified',
+    'Qlfr': 'Qualifier',
+    'Qlfyg': 'Qualifying',
+    'Qlty': 'Quality',
+    'Qttv': 'Quantitative',
+    'Qties': 'Quantities',
+    'Qty': 'Quantity',
+    'Qrtr': 'Quarter',
+    'Qry': 'Query',
+    'Q': 'Queue',
+    'Qd': 'Queued',
+    'QUICK': 'QUICK',
+    'Qrm': 'Quorum',
+    'Qta': 'Quota',
+    'Qtn': 'Quotation',
+    'Qt': 'Quote',
+    'Qtd': 'Quoted',
+    'Qtee': 'Quotee',
+    'Qts': 'Quotes',
+    'Qtg': 'Quoting',
+    'Rail': 'Rail',
+    'Raisd': 'Raised',
+    'Ramp': 'Ramp',
+    'Rand': 'Random',
+    'Rg': 'Range',
+    'Rank': 'Rank',
+    'Rnkg': 'Ranking',
+    'Rate': 'Rate',
+    'Ratd': 'Rated',
+    'Rates': 'Rates',
+    'Ratg': 'Rating',
+    'Ratio': 'Ratio',
+    'Ratn': 'Ration',
+    'Raw': 'Raw',
+    'RDP': 'RDP',
+    'RDR': 'RDR',
+    'Re': 'Re',
+    'Rchbl': 'Reachable',
+    'Rd': 'Read',
+    'Rdr': 'Reader',
+    'Rdng': 'Reading',
+    'Rdy': 'Ready',
+    'Real': 'Real',
+    'Realsd': 'Realised',
+    'Rallcn': 'Reallocation',
+    'Rsn': 'Reason',
+    'Rsns': 'Reasons',
+    'Reauthstn': 'Reauthorisation',
+    'Rbt': 'Rebate',
+    'Rbts': 'Rebates',
+    'Rbllg': 'Rebilling',
+    'Rct': 'Receipt',
+    'Rcts': 'Receipts',
+    'Rcvbl': 'Receivable',
+    'Rcv': 'Receive',
+    'Rcvd': 'Received',
+    'Rcvr': 'Receiver',
+    'Rcvrs': 'Receivers',
+    'Rcvrshp': 'Receivership',
+    'Rcvg': 'Receiving',
+    'Rcnt': 'Recent',
+    'Rcptn': 'Reception',
+    'Rcpt': 'Recipient',
+    'Rclm': 'Reclaim',
+    'Rcmmndtn': 'Recommendation',
+    'Rcmmndd': 'Recommended',
+    'Rcmpstn': 'Recomposition',
+    'Rcncld': 'Reconciled',
+    'Rcncltn': 'Reconciliation',
+    'Rcnfrm': 'Reconfirm',
+    'Rcrd': 'Record',
+    'Rcrds': 'Records',
+    'Rcrs': 'Recourse',
+    'Rcvrblty': 'Recoverability',
+    'Rcvrd': 'Recovered',
+    'Rcovrs': 'Recoveries',
+    'Rcovry': 'Recovery',
+    'Rcrnt': 'Recurrent',
+    'Rcrng': 'Recurring',
+    'Rcycl': 'Recycle',
+    'Rcycld': 'Recycled',
+    'Red': 'Redemption',
+    'Rdrctn': 'Redirection',
+    'Rdc': 'Reduce',
+    'Rdcg': 'Reducing',
+    'Rdctn': 'Reduction',
+    'Refr': 'Refer',
+    'Ref': 'Reference',
+    'Refd': 'Referenced',
+    'Refs': 'References',
+    'Refg': 'Referencing',
+    'Rfrd': 'Referred',
+    'Rfincg': 'Refinancing',
+    'Rfrsh': 'Refresh',
+    'Rfrgrtn': 'Refrigeration',
+    'Rfnd': 'Refund',
+    'Rfndd': 'Refunded',
+    'Rfsl': 'Refusal',
+    'Rfsd': 'Refused',
+    'Rgm': 'Regime',
+    'Rgn': 'Region',
+    'Rgnl': 'Regional',
+    'Regr': 'Register',
+    'Regd': 'Registered',
+    'Regar': 'Registrar',
+    'Regn': 'Registration',
+    'Regy': 'Registry',
+    'Rglr': 'Regular',
+    'Rgltn': 'Regulation',
+    'Rgltr': 'Regulator',
+    'Rgltry': 'Regulatory',
+    'Rmbrsmnt': 'Reimbursement',
+    'Rinstt': 'Reinstate',
+    'Rinvst': 'Reinvest',
+    'Rinvstd': 'Reinvested',
+    'Rinvstmt': 'Reinvestment',
+    'Rjct': 'Reject',
+    'Rjctd': 'Rejected',
+    'Rjctg': 'Rejecting',
+    'Rjctn': 'Rejection',
+    'Rjctns': 'Rejections',
+    'Rltd': 'Related',
+    'Rltsh': 'Relationship',
+    'Rltv': 'Relative',
+    'Rlay': 'Relay',
+    'Rls': 'Release',
+    'Rlsd': 'Released',
+    'Rlvnt': 'Relevant',
+    'Rlf': 'Relief',
+    'Rmng': 'Remaining',
+    'Rmktg': 'Remarketing',
+    'Rmdl': 'Remedial',
+    'Rmndr': 'Reminder',
+    'Rmt': 'Remittance',
+    'Rmtd': 'Remitted',
+    'Rmot': 'Remote',
+    'Rmvl': 'Removal',
+    'Rmv': 'Remove',
+    'Rmvd': 'Removed',
+    'Rmnrtn': 'Remuneration',
+    'Rnwbl': 'Renewable',
+    'Rnncbl': 'Renounceable',
+    'Rnvtd': 'Renovated',
+    'Rnt': 'Rent',
+    'Rntbl': 'Rentable',
+    'Rntl': 'Rental',
+    'Rntr': 'Renter',
+    'RMns': 'RenunciationMinus',
+    'RPlus': 'RenunciationPlus',
+    'Reop': 'Reopen',
+    'Rordrd': 'Reordered',
+    'Rordrg': 'Reordering',
+    'Reorg': 'Reorganisation',
+    'Rpr': 'Repair',
+    'Rprd': 'Repaired',
+    'Rpy': 'Repay',
+    'Rpmt': 'Repayment',
+    'Rpeatd': 'Repeated',
+    'Rpttns': 'Repetitions',
+    'Rplc': 'Replace',
+    'Rplcd': 'Replaced',
+    'Rplcmnt': 'Replacement',
+    'Rply': 'Reply',
+    'Repo': 'Repo',
+    'Rpt': 'Report',
+    'Rptbl': 'Reportable',
+    'Rptd': 'Reported',
+    'Rptg': 'Reporting',
+    'Rpts': 'Reports',
+    'Rpstry': 'Repository',
+    'Rprtv': 'Representative',
+    'Rprnt': 'Reprint',
+    'Rp': 'Repurchase',
+    'Rprchsd': 'Repurchased',
+    'Req': 'Request',
+    'Reqd': 'Requested',
+    'Rqstng': 'Requesting',
+    'Rqstr': 'Requestor',
+    'Reqs': 'Requests',
+    'Reqrd': 'Required',
+    'Rqrmnt': 'Requirement',
+    'Rqrmnts': 'Requirements',
+    'Reqrng': 'Requiring',
+    'Rregn': 'Reregistration',
+    'Rsrch': 'Research',
+    'Rsellng': 'Reselling',
+    'Rsnd': 'Resend',
+    'Rsvatn': 'Reservation',
+    'Rsv': 'Reserve',
+    'Rsvd': 'Reserved',
+    'Rst': 'Reset',
+    'Res': 'Residence',
+    'Resdcy': 'Residency',
+    'Resdt': 'Resident',
+    'Resdtl': 'Residential',
+    'Rsdl': 'Residual',
+    'Rsltn': 'Resolution',
+    'Rsltns': 'Resolutions',
+    'Rslvd': 'Resolved',
+    'Rsrc': 'Resource',
+    'Rsrcs': 'Resources',
+    'Rspndr': 'Responder',
+    'Rspndg': 'Responding',
+    'Rspn': 'Response',
+    'Rspnsblty': 'Responsibility',
+    'Rspnsbl': 'Responsible',
+    'Rstrctd': 'Restricted',
+    'Rstrctn': 'Restriction',
+    'Rstrctns': 'Restrictions',
+    'Rstrd': 'Restructured',
+    'Rstrg': 'Restructuring',
+    'Rslt': 'Result',
+    'Rsltnt': 'Resultant',
+    'Rsltg': 'Resulting',
+    'Rslts': 'Results',
+    'Rsmd': 'Resumed',
+    'Rtl': 'Retail',
+    'Rtlr': 'Retailer',
+    'Rtn': 'Retain',
+    'Rtnd': 'Retained',
+    'Rtntn': 'Retention',
+    'Rtrmnt': 'Retirement',
+    'Rtrctd': 'Retracted',
+    'Rtrnsmssn': 'Retransmission',
+    'Rtrvl': 'Retrieval',
+    'Rtrcssn': 'Retrocession',
+    'Rtrptv': 'Retrospective',
+    'Rtr': 'Return',
+    'Rtrd': 'Returned',
+    'Rtrs': 'Returns',
+    'Reuse': 'Reuse',
+    'Reusd': 'Reused',
+    'Rvaltn': 'Revaluation',
+    'Rvn': 'Revenue',
+    'Rvsl': 'Reversal',
+    'Rvs': 'Reverse',
+    'Rvsd': 'Reversed',
+    'Rvsbl': 'Reversible',
+    'Rvrsn': 'Reversion',
+    'Rvisd': 'Revised',
+    'Rvsn': 'Revision',
+    'Rvv': 'Revive',
+    'Rvvd': 'Revived',
+    'Rvcblty': 'Revocability',
+    'Rvlvg': 'Revolving',
+    'RIC': 'RIC',
+    'Rght': 'Right',
+    'Rghts': 'Rights',
+    'Ring': 'Ring',
+    'Rsk': 'Risk',
+    'Road': 'Road',
+    'Role': 'Role',
+    'Roles': 'Roles',
+    'Roll': 'Roll',
+    'Room': 'Room',
+    'Rooms': 'Rooms',
+    'Root': 'Root',
+    'Rnd': 'Round',
+    'Rndd': 'Rounded',
+    'Rndg': 'Rounding',
+    'Route': 'Route',
+    'Rtg': 'Routing',
+    'Row': 'Row',
+    'Rylts': 'Royalties',
+    'RPM': 'RPM',
+    'RSA': 'RSA',
+    'RTGS': 'RTGS',
+    'RTGSLOM': 'RTGSLOM',
+    'Rule': 'Rule',
+    'Rules': 'Rules',
+    'Run': 'Run',
+    'RUCB': 'RussianCentralBankIdentificationCode',
+    'Sfgrd': 'Safeguard',
+    'Sfgrdd': 'Safeguarded',
+    'Sfkpr': 'Safekeeper',
+    'Sfkpg': 'Safekeeping',
+    'Sfty': 'Safety',
+    'Slry': 'Salary',
+    'Sale': 'Sale',
+    'Sales': 'Sales',
+    'Salt': 'Salt',
+    'Slvtn': 'Salvation',
+    'Svgs': 'Savings',
+    'SCA': 'SCA',
+    'Scale': 'Scale',
+    'Scnnd': 'Scanned',
+    'Scnro': 'Scenario',
+    'Schdl': 'Schedule',
+    'Schdld': 'Scheduled',
+    'Schma': 'Schema',
+    'Schme': 'Scheme',
+    'Scp': 'Scope',
+    'Score': 'Score',
+    'Scrng': 'Screening',
+    'Scrip': 'Scrip',
+    'Scrpt': 'Script',
+    'Sea': 'Sea',
+    'Sfd': 'Seafood',
+    'Sch': 'Search',
+    'SEC': 'SEC',
+    'Scnd': 'Second',
+    'Scndry': 'Secondary',
+    'Sctn': 'Section',
+    'Sctr': 'Sector',
+    'Scr': 'Secure',
+    'Scrd': 'Secured',
+    'Scties': 'Securities',
+    'Scrtstn': 'Securitisation',
+    'Scrtsd': 'Securitised',
+    'Scty': 'Security',
+    'SEDOL': 'SEDOL',
+    'Seed': 'Seed',
+    'Sgmt': 'Segment',
+    'Sgmttn': 'Segmentation',
+    'Sgrtd': 'Segregated',
+    'Sgrtn': 'Segregation',
+    'Selctd': 'Selected',
+    'Selctn': 'Selection',
+    'Selctv': 'Selective',
+    'Slf': 'Self',
+    'Sell': 'Sell',
+    'Sellr': 'Seller',
+    'Sellg': 'Selling',
+    'Snd': 'Send',
+    'Sndr': 'Sender',
+    'Sndrs': 'Senders',
+    'Sndg': 'Sending',
+    'Snr': 'Senior',
+    'Snrty': 'Seniority',
+    'Snstv': 'Sensitive',
+    'Snt': 'Sent',
+    'SEPA': 'SEPA',
+    'Seq': 'Sequence',
+    'Srl': 'Serial',
+    'Sr': 'Serie',
+    'Srs': 'Series',
+    'Svr': 'Server',
+    'Svc': 'Service',
+    'Svcr': 'Servicer',
+    'Svcs': 'Services',
+    'Svcg': 'Servicing',
+    'Ssn': 'Session',
+    'Set': 'Set',
+    'Setng': 'Setting',
+    'Sttl': 'Settle',
+    'Sttld': 'Settled',
+    'Sttlm': 'Settlement',
+    'Sttlg': 'Settling',
+    'Sttlr': 'Settlor',
+    'svrty': 'Severity',
+    'SGX': 'SGX',
+    'Shdw': 'Shadow',
+    'Shr': 'Share',
+    'Shrd': 'Shared',
+    'Shrhldr': 'Shareholder',
+    'Shrhldrs': 'Shareholders',
+    'Shrhldg': 'Shareholding',
+    'Shrs': 'Shares',
+    'Shrg': 'Sharing',
+    'Sheet': 'Sheet',
+    'Shell': 'Shell',
+    'Shft': 'Shift',
+    'Ship': 'Ship',
+    'Shipmnt': 'Shipment',
+    'Shppg': 'Shipping',
+    'Shrt': 'Short',
+    'Shrtfll': 'Shortfall',
+    'Show': 'Show',
+    'SCVM': 'Sicovam',
+    'Sd': 'Side',
+    'Sdd': 'Sided',
+    'Sddns': 'Sidedness',
+    'Sgn': 'Sign',
+    'Sgntries': 'Signatories',
+    'Sgntry': 'Signatory',
+    'Sgntr': 'Signature',
+    'Sgntrs': 'Signatures',
+    'Sgnd': 'Signed',
+    'Sgnr': 'Signer',
+    'Sgnfcnt': 'Significant',
+    'Smpl': 'Simple',
+    'Smplfd': 'Simplified',
+    'Snc': 'Since',
+    'Sngl': 'Single',
+    'Site': 'Site',
+    'Sz': 'Size',
+    'Skin': 'Skin',
+    'Sla': 'Sla',
+    'SLA': 'SLA',
+    'Slt': 'Slate',
+    'Slip': 'Slip',
+    'Slot': 'Slot',
+    'Sml': 'Small',
+    'SME': 'SME',
+    'SNF': 'SNF',
+    'Scl': 'Social',
+    'Soft': 'Soft',
+    'Sftwr': 'Software',
+    'Sld': 'Sold',
+    'Slctn': 'Solicitation',
+    'Slctd': 'Solicited',
+    'Sol': 'Solution',
+    'Sort': 'Sort',
+    'Srtd': 'Sorted',
+    'Srtg': 'Sorting',
+    'Sght': 'Sought',
+    'Sound': 'Sound',
+    'Src': 'Source',
+    'ZANCC': 'SouthAfricanNCCIdentification',
+    'Svrgn': 'Sovereign',
+    'ES': 'Spain',
+    'ESNCC': 'SpanishDomesticInterbankingIdentification',
+    'Spcl': 'Special',
+    'Spc': 'Specie',
+    'Spcfc': 'Specific',
+    'Spcfctn': 'Specification',
+    'Spcfd': 'Specified',
+    'Spd': 'Speed',
+    'Splt': 'Split',
+    'Spnsr': 'Sponsor',
+    'Spnsrd': 'Sponsored',
+    'Spnsrg': 'Sponsoring',
+    'Spot': 'Spot',
+    'Sprd': 'Spread',
+    'Sprdbt': 'Spreadbet',
+    'Sqr': 'Square',
+    'SSI': 'SSI',
+    'Stck': 'Stack',
+    'Stff': 'Staff',
+    'Stag': 'Stage',
+    'Stl': 'Stale',
+    'Stmp': 'Stamp',
+    'Stmps': 'Stamps',
+    'Stnd': 'Stand',
+    'Stndln': 'Standalone',
+    'Std': 'Standard',
+    'Stdstn': 'Standardisation',
+    'Stdsd': 'Standardised',
+    'Stg': 'Standing',
+    'Start': 'Start',
+    'Startd': 'Started',
+    'Startg': 'Starting',
+    'Stat': 'State',
+    'Stmt': 'Statement',
+    'Stmts': 'Statements',
+    'Statc': 'Static',
+    'Sttstcl': 'Statistical',
+    'Sttstcs': 'Statistics',
+    'Sts': 'Status',
+    'Stay': 'Stay',
+    'Step': 'Step',
+    'Stiptns': 'Stipulations',
+    'Stock': 'Stock',
+    'Stop': 'Stop',
+    'Storg': 'Storage',
+    'Stor': 'Store',
+    'Stord': 'Stored',
+    'STP': 'STP',
+    'Strtgy': 'Strategy',
+    'Strt': 'Street',
+    'Strss': 'Stress',
+    'Strssd': 'Stressed',
+    'Strct': 'Strict',
+    'Strk': 'Strike',
+    'Strks': 'Strikes',
+    'Strp': 'Stripe',
+    'Strpbl': 'Strippable',
+    'Strng': 'Strong',
+    'Str': 'Structure',
+    'Strd': 'Structured',
+    'Strr': 'Structurer',
+    'STS': 'STS',
+    'Style': 'Style',
+    'Sub': 'Sub',
+    'Sbjt': 'Subject',
+    'Submissn': 'Submission',
+    'Submittd': 'Submitted',
+    'Submitr': 'Submitter',
+    'Submitg': 'Submitting',
+    'Subrdnt': 'Subordinate',
+    'Subrdntd': 'Subordinated',
+    'Sbcbd': 'Subscribed',
+    'Sbcbr': 'Subscriber',
+    'Sbcpt': 'Subscription',
+    'Subsctr': 'Subsector',
+    'Sbsqnt': 'Subsequent',
+    'Subset': 'Subset',
+    'Sbstibl': 'Substitutable',
+    'Sbstitn': 'Substitution',
+    'Sbttl': 'Subtotal',
+    'Sucss': 'Success',
+    'Sucssr': 'Successor',
+    'Sfx': 'Suffix',
+    'Sggstd': 'Suggested',
+    'Suite': 'Suite',
+    'Slphr': 'Sulphur',
+    'Sum': 'Sum',
+    'Summry': 'Summary',
+    'Summtn': 'Summation',
+    'Sums': 'Sums',
+    'Sndry': 'Sundry',
+    'Sprvsd': 'Supervised',
+    'Sprvsg': 'Supervising',
+    'Sprvsr': 'Supervisor',
+    'Spplmnt': 'Supplement',
+    'Splmtry': 'Supplementary',
+    'Spplr': 'Supplier',
+    'Spply': 'Supply',
+    'Spprt': 'Support',
+    'Spprtd': 'Supported',
+    'Spprtg': 'Supporting',
+    'Sprntnl': 'Supranational',
+    'Srchrg': 'Surcharge',
+    'Srty': 'Surety',
+    'Srnm': 'Surname',
+    'Srrndr': 'Surrender',
+    'Srvvg': 'Surviving',
+    'Ssp': 'Suspend',
+    'Sspd': 'Suspended',
+    'Sspnsn': 'Suspension',
+    'Sstnblty': 'Sustainability',
+    'Swp': 'Swap',
+    'Swps': 'Swaps',
+    'Swptn': 'Swaption',
+    'Sweep': 'Sweep',
+    'Swift': 'SWIFT',
+    'Swng': 'Swing',
+    'CHBC': 'SwissBCIdentification',
+    'CHSIC': 'SwissSICIdentification',
+    'Swtch': 'Switch',
+    'Symb': 'Symbol',
+    'Smmtrc': 'Symmetric',
+    'Synctn': 'Synchronisation',
+    'Sndctd': 'Syndicated',
+    'Sndctn': 'Syndication',
+    'Snthtc': 'Synthetic',
+    'Sys': 'System',
+    'Systmtc': 'Systematic',
+    'Tbl': 'Table',
+    'Tag': 'Tag',
+    'Take': 'Take',
+    'Taken': 'Taken',
+    'Tkvr': 'Takeover',
+    'Takng': 'Taking',
+    'Tank': 'Tank',
+    'Trgt': 'Target',
+    'Trgtg': 'Targeting',
+    'Task': 'Task',
+    'Tax': 'Tax',
+    'Taxblty': 'Taxability',
+    'Taxbl': 'Taxable',
+    'Taxtn': 'Taxation',
+    'Taxs': 'Taxes',
+    'Tech': 'Technical',
+    'Tchnq': 'Technique',
+    'TED': 'TED',
+    'TEFRA': 'TEFRA',
+    'Telecom': 'Telecommunication',
+    'Tel': 'Telephone',
+    'Tltxt': 'Teletext',
+    'Tlx': 'Telex',
+    'Tmprtr': 'Temperature',
+    'Tmplt': 'Template',
+    'Temp': 'Temporary',
+    'Tnnt': 'Tenant',
+    'Tndr': 'Tender',
+    'Tnr': 'Tenor',
+    'Term': 'Term',
+    'Termnl': 'Terminal',
+    'Termnt': 'Terminate',
+    'Termntd': 'Terminated',
+    'Termntn': 'Termination',
+    'Terms': 'Terms',
+    'Trtrl': 'Territorial',
+    'Tst': 'Test',
+    'Tstg': 'Testing',
+    'Txt': 'Text',
+    'Txtl': 'Textual',
+    'Than': 'Than',
+    'The': 'The',
+    'Thrd': 'Third',
+    'Thrty': 'Thirty',
+    'Three': 'Three',
+    'Thrshld': 'Threshold',
+    'Thrgh': 'Through',
+    'Thru': 'Thru',
+    'Tick': 'Tick',
+    'Tckr': 'Ticker',
+    'Tckt': 'Ticket',
+    'Tckts': 'Tickets',
+    'Till': 'Till',
+    'Tm': 'Time',
+    'Tmstmp': 'Timestamp',
+    'Tmg': 'Timing',
+    'Titl': 'Title',
+    'TM': 'TM',
+    'TMS': 'TMS',
+    'To': 'To',
+    'Tkn': 'Token',
+    'Tlrnce': 'Tolerance',
+    'Toll': 'Toll',
+    'Top': 'Top',
+    'Ttl': 'Total',
+    'Ttls': 'Totals',
+    'Twn': 'Town',
+    'TR': 'TR',
+    'TR34': 'TR34',
+    'Trac': 'Trace',
+    'Tracblt': 'Traceability',
+    'Trck': 'Track',
+    'Trckd': 'Tracked',
+    'Trckr': 'Tracker',
+    'Trckg': 'Tracking',
+    'Trad': 'Trade',
+    'Tradd': 'Traded',
+    'TMns': 'TradeMinus',
+    'TPlus': 'TradePlus',
+    'Tradr': 'Trader',
+    'Trds': 'Trades',
+    'Tradg': 'Trading',
+    'Trl': 'Trail',
+    'Trlr': 'Trailer',
+    'Trng': 'Training',
+    'Trch': 'Tranche',
+    'Trnchd': 'Tranched',
+    'Trnchs': 'Tranches',
+    'Trns': 'Trans',
+    'Tx': 'Transaction',
+    'Txnl': 'Transactional',
+    'Txs': 'Transactions',
+    'Trf': 'Transfer',
+    'Trfbl': 'Transferable',
+    'Trfee': 'Transferee',
+    'Trfr': 'Transferor',
+    'Trfd': 'Transferred',
+    'Trfs': 'Transfers',
+    'Trfrmatn': 'Transformation',
+    'Trnst': 'Transit',
+    'Trnsltn': 'Translation',
+    'Trnsmssn': 'Transmission',
+    'Trnsmttg': 'Transmitting',
+    'Trnsprncy': 'Transparency',
+    'Trnspndr': 'Transponder',
+    'Trnsprt': 'Transport',
+    'Trnsprtd': 'Transported',
+    'TrnsShipmnt': 'Transshipment',
+    'Trpg': 'Trapping',
+    'Trvl': 'Travel',
+    'Trsr': 'Treasury',
+    'Trtd': 'Treated',
+    'Trtmnt': 'Treatment',
+    'Trils': 'Trials',
+    'Trggr': 'Trigger',
+    'Trggrd': 'Triggered',
+    'Trggrg': 'Triggering',
+    'Trip': 'Trip',
+    'Trprtt': 'Tripartite',
+    'Trpty': 'Triparty',
+    'TRUE': 'TRUE',
+    'Trst': 'Trust',
+    'Trstee': 'Trustee',
+    'Try': 'Try',
+    'TSE': 'TSE',
+    'TSEJASDEC': 'TSEJASDEC',
+    'TSU': 'TSU',
+    'Trnd': 'Turned',
+    'Trnvr': 'Turnover',
+    'Twin': 'Twin',
+    'Two': 'Two',
+    'Tp': 'Type',
+    'UCITS': 'UCITS',
+    'UETR': 'UETR',
+    'GBSC': 'UKDomesticSortCode',
+    'Ultmt': 'Ultimate',
+    'Umbrll': 'Umbrella',
+    'Ubl': 'Unable',
+    'Uaccptd': 'Unaccepted',
+    'Uadjstd': 'Unadjusted',
+    'Uafctd': 'Unaffected',
+    'Uaffrmd': 'Unaffirmed',
+    'Uallctd': 'Unallocated',
+    'Uattndd': 'Unattended',
+    'Uclmd': 'Unclaimed',
+    'Uncollsd': 'Uncollateralised',
+    'Ucmmtd': 'Uncommitted',
+    'Ucondl': 'Unconditional',
+    'Ucvrd': 'Uncovered',
+    'Ucrstllsd': 'Uncrystallised',
+    'Udlvrd': 'Undelivered',
+    'Udr': 'Under',
+    'Undrlyg': 'Underlying',
+    'Udrtkg': 'Undertaking',
+    'Udrtkgs': 'Undertakings',
+    'Udrwrt': 'Underwrite',
+    'Udrwrtr': 'Underwriter',
+    'Udrwrtg': 'Underwriting',
+    'Udscld': 'Undisclosed',
+    'Udsptd': 'Undisputed',
+    'Udrwn': 'Undrawn',
+    'Unfltrd': 'Unfiltered',
+    'Ufrnkd': 'Unfranked',
+    'Ufndd': 'Unfunded',
+    'Unltrl': 'Unilateral',
+    'Uinstd': 'Uninstructed',
+    'Unq': 'Unique',
+    'Unit': 'Unit',
+    'Units': 'Units',
+    'Uvrsl': 'Universal',
+    'Uknwn': 'Unknown',
+    'Ultd': 'Unlimited',
+    'Umtchd': 'Unmatched',
+    'Unpd': 'Unpaid',
+    'Unprd': 'Unpaired',
+    'Upldgd': 'Unpledged',
+    'Urlsd': 'Unrealised',
+    'Uschdld': 'Unscheduled',
+    'Uscrd': 'Unsecured',
+    'Usttld': 'Unsettled',
+    'Ustrd': 'Unstructured',
+    'Until': 'Until',
+    'Utrnchd': 'Untranched',
+    'Uusd': 'Unused',
+    'Up': 'Up',
+    'Upcmg': 'Upcoming',
+    'Upd': 'Update',
+    'Updtd': 'Updated',
+    'Upfrnt': 'Upfront',
+    'UPIC': 'UPIC',
+    'Upper': 'Upper',
+    'URBPO': 'URBPO',
+    'Urea': 'Urea',
+    'Urgcy': 'Urgency',
+    'Urgt': 'Urgent',
+    'URI': 'URI',
+    'URL': 'URL',
+    'US': 'US',
+    'Usg': 'Usage',
+    'USD': 'USD',
+    'Usd': 'Used',
+    'Usr': 'User',
+    'Usrs': 'Users',
+    'Usl': 'Usual',
+    'Usfrct': 'Usufruct',
+    'UTC': 'UTC',
+    'Utlstn': 'Utilisation',
+    'UTM': 'UTM',
+    'UUID': 'UUID',
+    'Vcnt': 'Vacant',
+    'Vld': 'Valid',
+    'Vldtd': 'Validated',
+    'Vldtng': 'Validating',
+    'Vldtn': 'Validation',
+    'Vldty': 'Validity',
+    'Vlrn': 'Valoren',
+    'Valtn': 'Valuation',
+    'Val': 'Value',
+    'Vlr': 'Valuer',
+    'Vals': 'Values',
+    'Varbl': 'Variable',
+    'Var': 'Variance',
+    'Varnt': 'Variant',
+    'Vart': 'Variate',
+    'Vartn': 'Variation',
+    'Vartns': 'Variations',
+    'VAT': 'VAT',
+    'Vctr': 'Vector',
+    'Vhcl': 'Vehicle',
+    'Vndr': 'Vendor',
+    'Vntr': 'Venture',
+    'Vn': 'Venue',
+    'Verb': 'Verb',
+    'Vrfctn': 'Verification',
+    'Vrsn': 'Version',
+    'Vrss': 'Versus',
+    'Vssl': 'Vessel',
+    'View': 'View',
+    'Vwr': 'Viewer',
+    'Vllg': 'Village',
+    'VIP': 'VIP',
+    'Vsblty': 'Visibility',
+    'Voltly': 'Volatility',
+    'Vltg': 'Voltage',
+    'Vol': 'Volume',
+    'Vlntry': 'Voluntary',
+    'Vstr': 'Vostro',
+    'Vote': 'Vote',
+    'Vtng': 'Voting',
+    'Vchr': 'Voucher',
+    'Vyg': 'Voyage',
+    'Vlnrblty': 'Vulnerability',
+    'Wait': 'Wait',
+    'Wtg': 'Waiting',
+    'Wvd': 'Waived',
+    'Wvr': 'Waiver',
+    'Wvg': 'Waiving',
+    'Wllt': 'Wallet',
+    'Warm': 'Warm',
+    'Wrng': 'Warning',
+    'Wrnngs': 'Warnings',
+    'Warrt': 'Warrant',
+    'Wtchlst': 'Watchlist',
+    'Wtrfll': 'Waterfall',
+    'Wav': 'Wave',
+    'Way': 'Way',
+    'Wlth': 'Wealth',
+    'Wthr': 'Weather',
+    'Web': 'Web',
+    'Wk': 'Week',
+    'Wkly': 'Weekly',
+    'Wght': 'Weight',
+    'Wghtd': 'Weighted',
+    'Wrtppr': 'Wertpapier',
+    'Wet': 'Wet',
+    'Wht': 'White',
+    'Whl': 'Whole',
+    'Whly': 'Wholly',
+    'Width': 'Width',
+    'Will': 'Will',
+    'Wndg': 'Winding',
+    'Wndw': 'Window',
+    'Wnng': 'Winning',
+    'Wire': 'Wire',
+    'Wth': 'With',
+    'Wdrw': 'Withdraw',
+    'Wdrwl': 'Withdrawal',
+    'Wdrwn': 'Withdrawn',
+    'Wthhld': 'Withhold',
+    'Whldg': 'Withholding',
+    'Wthn': 'Within',
+    'Wtht': 'Without',
+    'Wrdg': 'Wording',
+    'Work': 'Work',
+    'Workflw': 'Workflow',
+    'Workg': 'Working',
+    'Workt': 'Workout',
+    'Wrthls': 'Worthless',
+    'Wrppr': 'Wrapper',
+    'Wrt': 'Write',
+    'Wrtg': 'Writing',
+    'Wrttn': 'Written',
+    'Wrttg': 'Writting',
+    'Yr': 'Year',
+    'Yrs': 'Years',
+    'Yld': 'Yield',
+    'Yldd': 'Yielded',
+    'York': 'York',
+    'Your': 'Your',
+    'Zero': 'Zero',
+    'Zone': 'Zone',
+    'Zwschngwn': 'Zwischengewinn',
+}
+
+
+def _iso20022_term_translator(mnemonic):
+    new_name = ""
+    list_of_mnems = re.split(r'(?<=[a-z\/. ])(?=[ .\/A-Z])', mnemonic)
+    for key in list_of_mnems:
+        new_name += mnemonics.get(key, key)
+        new_name += " "
+
+    squashed = ''.join(new_name.split())
+
+    return squashed.strip()
+
+
+def _modify_key(clean_mnems, translate=True):
+    if translate:
+        clean_mnems = _iso20022_term_translator(clean_mnems)
+    return clean_mnems
+
+
+def _parse_element(element, parent_name='', translate=True):
+    data_dict = {}
+    for child in element:
+        child_name = f"{parent_name}.{child.tag}" if parent_name else child.tag
+
+        if len(child):
+            data_dict.update(_parse_element(child,
+                                            child_name,
+                                            translate=translate))
+        elif child_name in data_dict:
+            data_dict[child_name] += child.text
+        else:
+            data_dict[child_name] = child.text
+
+    modified_dict = {_modify_key(k, translate=translate): v for k, v in data_dict.items()}
+
+    return modified_dict
+
+
+def _add_backwards_compat_keys(record, currency):
+    amt = Decimal(record["Amount"])
+
+    if record["CreditDebitIndicator"] == "CRDT":
+        record["amount"] = Amount(amt, currency)
+        record["applicant_creditor_id"] = None
+        record["applicant_iban"] = record.get(
+            "EntryDetails.TransactionDetails.RelatedParties.DebtorAccount.Identification.IBAN"
+        )
+        record["applicant_name"] = record.get(
+            "EntryDetails.TransactionDetails.RelatedParties.Debtor.Party.Name"
+        )
+        record["recipient_name"] = record.get(
+            "EntryDetails.TransactionDetails.RelatedParties.Creditor.Party.Name"
+        )
+        record["status"] = "C"
+    else:
+        record["amount"] = Amount(-amt, currency)
+        record["applicant_creditor_id"] = record.get(
+            "EntryDetails.TransactionDetails.RelatedParties.Creditor.Party.Identification.PrivateIdentification.Other.Identification"
+        )
+        record["applicant_iban"] = record.get(
+            "EntryDetails.TransactionDetails.RelatedParties.CreditorAccount.Identification.IBAN"
+        )
+        record["applicant_name"] = record.get(
+            "EntryDetails.TransactionDetails.RelatedParties.Creditor.Party.Name"
+        )
+        record["recipient_name"] = record.get(
+            "EntryDetails.TransactionDetails.RelatedParties.Debtor.Party.Name"
+        )
+        record["status"] = "D"
+
+    record["bank_reference"] = record.get("AccountServicerReference")
+    record["currency"] = currency
+    record["date"] = datetime.strptime(record["ValueDate.Date"], "%Y-%m-%d").date()
+    record["end_to_end_reference"] = record.get("EntryDetails.TransactionDetails.References.EndToEndIdentification")
+    record["entry_date"] = datetime.strptime(record["BookingDate.Date"], "%Y-%m-%d").date()
+    record["guessed_entry_date"] = datetime.strptime(record["BookingDate.Date"], "%Y-%m-%d").date()
+    record["id"] = record.get("BankTransactionCode.Proprietary.Code", "").split("+")[0]
+    record["purpose"] = record.get("EntryDetails.TransactionDetails.RemittanceInformation.Unstructured")
+    record["purpose_code"] = record.get("BankTransactionCode.Domain.Family.SubFamilyCode")
+
+
+def camt053_to_dict(xml_data, translate=True):
+    root = etree.fromstring(xml_data)
+    data = []
+
+    for elem in root.getiterator():
+        if not hasattr(elem.tag, 'find'):
+            continue
+        ind = elem.tag.find('}')
+        if ind > 0:
+            elem.tag = elem.tag[ind+1:]
+
+    currency = root.xpath('//Rpt/Acct/Ccy')[0].text
+    elements = root.xpath('//Ntry')
+
+    for record in elements:
+        record_data = _parse_element(record, translate=translate)
+        _add_backwards_compat_keys(record_data, currency)
+        data.append(record_data)
+
+    return data
\ No newline at end of file
index 8dd513ffd4575578f236989bcbd28f8d6d0535e8..3c894eedcd17b960876503c861e2ac06abb9da21 100644 (file)
@@ -11,6 +11,7 @@ import bleach
 from sepaxml import SepaTransfer
 
 from . import version
+from .camt_parser import camt053_to_dict
 from .connection import FinTSHTTPSConnection
 from .dialog import FinTSDialog
 from .exceptions import *
@@ -20,7 +21,7 @@ from .formals import (
     SupportedMessageTypes, StatementFormat, TANUsageOption
 )
 from .message import FinTSInstituteMessage
-from .models import SEPAAccount
+from .models import SEPAAccount, Transaction
 from .parser import FinTS3Serializer
 from .security import (
     PinTanDummyEncryptionMechanism, PinTanOneStepAuthenticationMechanism,
@@ -520,41 +521,56 @@ class FinTS3Client:
     def get_transactions(self, account: SEPAAccount, start_date: datetime.date = None, end_date: datetime.date = None,
                          include_pending = False):
         """
-        Fetches the list of transactions of a bank account in a certain timeframe.
+        Fetches the list of transactions of a bank account in a certain timeframe. This prefers using the mt940-based
+        files from the bank for historical reasons. However, if they are not available, it falls back to use
+        get_transactions_xml and parses the data in a similar way.
 
         :param account: SEPA
         :param start_date: First day to fetch
         :param end_date: Last day to fetch
         :param include_pending: Include pending transactions (might lack some data like booking day)
-        :return: A list of mt940.models.Transaction objects
+        :return: A list of mt940.models.Transaction or fints.models.Transaction objects
         """
 
         with self._get_dialog() as dialog:
-            hkkaz = self._find_highest_supported_command(HKKAZ5, HKKAZ6, HKKAZ7)
-
-            logger.info('Start fetching from {} to {}'.format(start_date, end_date))
-            response = self._fetch_with_touchdowns(
-                dialog,
-                lambda touchdown: hkkaz(
-                    account=hkkaz._fields['account'].type.from_sepa_account(account),
-                    all_accounts=False,
-                    date_start=start_date,
-                    date_end=end_date,
-                    touchdown_point=touchdown,
-                ),
-                lambda responses: mt940_to_array(''.join(
-                    [seg.statement_booked.decode('iso-8859-1') for seg in responses] +
-                    ([seg.statement_pending.decode('iso-8859-1') for seg in responses if seg.statement_pending] if include_pending else [])
-            )),
-                'HIKAZ',
-                # Note 1: Some banks send the HIKAZ data in arbitrary splits.
-                # So better concatenate them before MT940 parsing.
-                # Note 2: MT940 messages are encoded in the S.W.I.F.T character set,
-                # which is a subset of ISO 8859. There are no character in it that
-                # differ between ISO 8859 variants, so we'll arbitrarily chose 8859-1.
-            )
-            logger.info('Fetching done.')
-
+            try:
+                hkkaz = self._find_highest_supported_command(HKKAZ5, HKKAZ6, HKKAZ7)
+                return self._get_transactions_mt940(dialog, hkkaz, account, start_date, end_date, include_pending)
+            except FinTSUnsupportedOperation:
+                hkcaz = self._find_highest_supported_command(HKCAZ1)
+                booked_streams, pending_streams = self._get_transactions_xml(dialog, hkcaz, account, start_date, end_date)
+                transactions = []
+                for s in booked_streams:
+                    transactions += [Transaction(t) for t in camt053_to_dict(s)]
+                if include_pending:
+                    for s in pending_streams:
+                        transactions += [Transaction(t) for t in camt053_to_dict(s)]
+                return transactions
+
+
+    def _get_transactions_mt940(self, dialog, hkkaz, account: SEPAAccount, start_date, end_date, include_pending):
+        logger.info('Start fetching from {} to {}'.format(start_date, end_date))
+        response = self._fetch_with_touchdowns(
+            dialog,
+            lambda touchdown: hkkaz(
+                account=hkkaz._fields['account'].type.from_sepa_account(account),
+                all_accounts=False,
+                date_start=start_date,
+                date_end=end_date,
+                touchdown_point=touchdown,
+            ),
+            lambda responses: mt940_to_array(''.join(
+                [seg.statement_booked.decode('iso-8859-1') for seg in responses] +
+                ([seg.statement_pending.decode('iso-8859-1') for seg in responses if seg.statement_pending] if include_pending else [])
+        )),
+            'HIKAZ',
+            # Note 1: Some banks send the HIKAZ data in arbitrary splits.
+            # So better concatenate them before MT940 parsing.
+            # Note 2: MT940 messages are encoded in the S.W.I.F.T character set,
+            # which is a subset of ISO 8859. There are no character in it that
+            # differ between ISO 8859 variants, so we'll arbitrarily chose 8859-1.
+        )
+        logger.info('Fetching done.')
         return response
 
     @staticmethod
@@ -566,6 +582,33 @@ class FinTS3Client:
             pending_streams.append(seg.statement_pending)
         return booked_streams, pending_streams
 
+    def _get_transactions_xml(self, dialog, hkcaz, account, start_date, end_date, supported_camt_messages=None):
+        hicazs = self.bpd.find_segment_first('HICAZS')
+        if hicazs:
+            bank_supported_camt_messages = list(hicazs.parameter.supported_camt_formats)
+        else:
+            bank_supported_camt_messages = []
+        if supported_camt_messages is None:
+            supported_camt_messages = bank_supported_camt_messages
+        else:
+            supported_camt_messages = [m for m in supported_camt_messages if m in bank_supported_camt_messages]
+        logger.info('Start fetching from {} to {}'.format(start_date, end_date))
+        responses = self._fetch_with_touchdowns(
+            dialog,
+            lambda touchdown: hkcaz(
+                account=hkcaz._fields['account'].type.from_sepa_account(account),
+                all_accounts=False,
+                date_start=start_date,
+                date_end=end_date,
+                touchdown_point=touchdown,
+                supported_camt_messages=SupportedMessageTypes(supported_camt_messages)
+            ),
+            FinTS3Client._response_handler_get_transactions_xml,
+            'HICAZ'
+        )
+        logger.info('Fetching done.')
+        return responses
+
     def get_transactions_xml(self, account: SEPAAccount, start_date: datetime.date = None,
                              end_date: datetime.date = None, supported_camt_messages = None) -> list:
         """
@@ -579,36 +622,9 @@ class FinTS3Client:
         :return: Two lists of bytestrings containing XML documents, possibly empty: first one for booked transactions,
             second for pending transactions
         """
-        hicazs = self.bpd.find_segment_first('HICAZS')
-        if hicazs:
-            bank_supported_camt_messages = list(hicazs.parameter.supported_camt_formats)
-        else:
-            bank_supported_camt_messages = []
-        if supported_camt_messages is None:
-            supported_camt_messages = bank_supported_camt_messages
-        else:
-            supported_camt_messages = [m for m in supported_camt_messages if m in bank_supported_camt_messages]
-
         with self._get_dialog() as dialog:
             hkcaz = self._find_highest_supported_command(HKCAZ1)
-
-            logger.info('Start fetching from {} to {}'.format(start_date, end_date))
-            responses = self._fetch_with_touchdowns(
-                dialog,
-                lambda touchdown: hkcaz(
-                    account=hkcaz._fields['account'].type.from_sepa_account(account),
-                    all_accounts=False,
-                    date_start=start_date,
-                    date_end=end_date,
-                    touchdown_point=touchdown,
-                    supported_camt_messages=SupportedMessageTypes(supported_camt_messages),
-                ),
-                FinTS3Client._response_handler_get_transactions_xml,
-                'HICAZ'
-            )
-            logger.info('Fetching done.')
-
-        return responses
+            return self._get_transactions_xml(dialog, hkcaz, account, start_date, end_date, supported_camt_messages)
 
     def get_credit_card_transactions(self, account: SEPAAccount, credit_card_number: str, start_date: datetime.date = None, end_date: datetime.date = None):
         # FIXME Reverse engineered, probably wrong
index 82c306b7a88bea68b299657f2d5d2ce3648c98f1..7ed43ce0fef6619a35c9b9bf35e06ad0c3a2eb8b 100644 (file)
@@ -6,3 +6,7 @@ Saldo = namedtuple('Saldo', 'account date value currency')
 
 Holding = namedtuple('Holding',
                      'ISIN name market_value value_symbol valuation_date pieces total_value acquisitionprice')
+
+Amount = namedtuple('Amount', 'amount currency')
+
+Transaction = namedtuple('Transaction', 'data')
index 00f695a0556dbf8ad8e3cc19325d7a5e0867992c..a3e101dd4bf3704cc2f91280a3c443195de4bea6 100644 (file)
@@ -10,7 +10,7 @@ try:
 except ImportError:
     from enum import Enum, EnumMeta as EnumType
 
-import mt940
+import mt940.models
 
 from .models import Holding
 
index 3315defa2520c9378dfb7b5fbecfda26e3123d7e..5afe991a31616041f2844b622fe05ada8bbf90ee 100644 (file)
@@ -30,6 +30,7 @@ dependencies = [
   "requests",
   "sepaxml~=2.7",
   "enum-tools~=0.12.0",
+  "lxml~=6.0.2",
 ]
 dynamic = ["version"]
 
index 89dc6bd4f904c4c70969a62670f820fd63d0d882..52a7fae1da880fac82a47843650ae72b3bcf00e4 100644 (file)
@@ -3,3 +3,4 @@ mt-940
 sepaxml==2.7.*
 enum-tools~=0.12.0
 bleach
+lxml~=6.0.2
\ No newline at end of file
diff --git a/tests/test_camt_parser.py b/tests/test_camt_parser.py
new file mode 100644 (file)
index 0000000..1c7dbd1
--- /dev/null
@@ -0,0 +1,343 @@
+import datetime
+import pprint
+from decimal import Decimal
+
+from fints.camt_parser import _modify_key, camt053_to_dict
+from fints.models import Amount
+
+
+def test_modify_key():
+    assert _modify_key("BkTxCd.Domn.Cd") == "BankTransactionCode.Domain.Code"
+
+
+data = b"""<?xml version="1.0" encoding="ISO-8859-1" ?>
+<Document
+       xmlns="urn:iso:std:iso:20022:tech:xsd:camt.052.001.08"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:iso:std:iso:20022:tech:xsd:camt.052.001.08 camt.052.001.08.xsd">
+       <BkToCstmrAcctRpt>
+               <GrpHdr>
+                       <MsgId>52D20251127T1628589914030N000000000</MsgId>
+                       <CreDtTm>2025-11-27T16:28:58.0+01:00</CreDtTm>
+               </GrpHdr>
+               <Rpt>
+                       <Id>2316C522025112716285899</Id>
+                       <RptPgntn>
+                               <PgNb>1</PgNb>
+                               <LastPgInd>true</LastPgInd>
+                       </RptPgntn>
+                       <ElctrncSeqNb>000000000</ElctrncSeqNb>
+                       <CreDtTm>2025-11-27T16:28:58.0+01:00</CreDtTm>
+                       <Acct>
+                               <Id>
+                                       <IBAN>DE1234567890</IBAN>
+                               </Id>
+                               <Ccy>EUR</Ccy>
+                               <Ownr>
+                                       <Nm>Account owner</Nm>
+                               </Ownr>
+                               <Svcr>
+                                       <FinInstnId>
+                                               <BICFI>TRODDEF1XXX</BICFI>
+                                               <Nm>Triodos Bank N.V. Deutschland</Nm>
+                                               <Othr>
+                                                       <Id>DE 266286897</Id>
+                                                       <Issr>UmsStId</Issr>
+                                               </Othr>
+                                       </FinInstnId>
+                               </Svcr>
+                       </Acct>
+                       <Bal>
+                               <Tp>
+                                       <CdOrPrtry>
+                                               <Cd>OPBD</Cd>
+                                       </CdOrPrtry>
+                               </Tp>
+                               <Amt Ccy="EUR">1234.56</Amt>
+                               <CdtDbtInd>CRDT</CdtDbtInd>
+                               <Dt>
+                                       <Dt>2025-10-28</Dt>
+                               </Dt>
+                       </Bal>
+                       <Bal>
+                               <Tp>
+                                       <CdOrPrtry>
+                                               <Cd>CLBD</Cd>
+                                       </CdOrPrtry>
+                               </Tp>
+                               <Amt Ccy="EUR">4567.89</Amt>
+                               <CdtDbtInd>CRDT</CdtDbtInd>
+                               <Dt>
+                                       <Dt>2025-11-26</Dt>
+                               </Dt>
+                       </Bal>
+                       <Ntry>
+                               <Amt Ccy="EUR">35.00</Amt>
+                               <CdtDbtInd>CRDT</CdtDbtInd>
+                               <Sts>
+                                       <Cd>BOOK</Cd>
+                               </Sts>
+                               <BookgDt>
+                                       <Dt>2025-10-28</Dt>
+                               </BookgDt>
+                               <ValDt>
+                                       <Dt>2025-10-28</Dt>
+                               </ValDt>
+                               <AcctSvcrRef>2025102812344060000</AcctSvcrRef>
+                               <BkTxCd>
+                                       <Domn>
+                                               <Cd>PMNT</Cd>
+                                               <Fmly>
+                                                       <Cd>RRCT</Cd>
+                                                       <SubFmlyCd>ESCT</SubFmlyCd>
+                                               </Fmly>
+                                       </Domn>
+                                       <Prtry>
+                                               <Cd>NTRF+168+00931</Cd>
+                                               <Issr>DK</Issr>
+                                       </Prtry>
+                               </BkTxCd>
+                               <NtryDtls>
+                                       <TxDtls>
+                                               <Refs>
+                                                       <EndToEndId>NOTPROVIDED</EndToEndId>
+                                               </Refs>
+                                               <Amt Ccy="EUR">35.00</Amt>
+                                               <BkTxCd>
+                                                       <Domn>
+                                                               <Cd>PMNT</Cd>
+                                                               <Fmly>
+                                                                       <Cd>RRCT</Cd>
+                                                                       <SubFmlyCd>ESCT</SubFmlyCd>
+                                                               </Fmly>
+                                                       </Domn>
+                                                       <Prtry>
+                                                               <Cd>NTRF+168+00931</Cd>
+                                                               <Issr>DK</Issr>
+                                                       </Prtry>
+                                               </BkTxCd>
+                                               <RltdPties>
+                                                       <Dbtr>
+                                                               <Pty>
+                                                                       <Nm>Sender</Nm>
+                                                               </Pty>
+                                                       </Dbtr>
+                                                       <DbtrAcct>
+                                                               <Id>
+                                                                       <IBAN>DE999999999</IBAN>
+                                                               </Id>
+                                                       </DbtrAcct>
+                                                       <Cdtr>
+                                                               <Pty>
+                                                                       <Nm>Account owner</Nm>
+                                                               </Pty>
+                                                       </Cdtr>
+                                                       <CdtrAcct>
+                                                               <Id>
+                                                                       <IBAN>DE1234567890</IBAN>
+                                                               </Id>
+                                                       </CdtrAcct>
+                                               </RltdPties>
+                                               <RltdAgts>
+                                                       <DbtrAgt>
+                                                               <FinInstnId>
+                                                                       <BICFI>GENODEM1GLS</BICFI>
+                                                               </FinInstnId>
+                                                       </DbtrAgt>
+                                               </RltdAgts>
+                                               <RmtInf>
+                                                       <Ustrd>Reference</Ustrd>
+                                               </RmtInf>
+                                       </TxDtls>
+                               </NtryDtls>
+                               <AddtlNtryInf>\xdcberweisungsgutschr.</AddtlNtryInf>
+                       </Ntry>
+                       <Ntry>
+                               <Amt Ccy="EUR">29.63</Amt>
+                               <CdtDbtInd>DBIT</CdtDbtInd>
+                               <Sts>
+                                       <Cd>BOOK</Cd>
+                               </Sts>
+                               <BookgDt>
+                                       <Dt>2025-11-07</Dt>
+                               </BookgDt>
+                               <ValDt>
+                                       <Dt>2025-11-07</Dt>
+                               </ValDt>
+                               <AcctSvcrRef>2025110701433815000</AcctSvcrRef>
+                               <BkTxCd>
+                                       <Domn>
+                                               <Cd>PMNT</Cd>
+                                               <Fmly>
+                                                       <Cd>RDDT</Cd>
+                                                       <SubFmlyCd>ESDD</SubFmlyCd>
+                                               </Fmly>
+                                       </Domn>
+                                       <Prtry>
+                                               <Cd>NDDT+105+00931</Cd>
+                                               <Issr>DK</Issr>
+                                       </Prtry>
+                               </BkTxCd>
+                               <NtryDtls>
+                                       <TxDtls>
+                                               <Refs>
+                                                       <EndToEndId>SD36-1234-1234-1234</EndToEndId>
+                                                       <MndtId>1234-1234-1234</MndtId>
+                                               </Refs>
+                                               <Amt Ccy="EUR">29.63</Amt>
+                                               <BkTxCd>
+                                                       <Domn>
+                                                               <Cd>PMNT</Cd>
+                                                               <Fmly>
+                                                                       <Cd>RDDT</Cd>
+                                                                       <SubFmlyCd>ESDD</SubFmlyCd>
+                                                               </Fmly>
+                                                       </Domn>
+                                                       <Prtry>
+                                                               <Cd>NDDT+105+00931</Cd>
+                                                               <Issr>DK</Issr>
+                                                       </Prtry>
+                                               </BkTxCd>
+                                               <RltdPties>
+                                                       <Dbtr>
+                                                               <Pty>
+                                                                       <Nm>Account owner</Nm>
+                                                               </Pty>
+                                                       </Dbtr>
+                                                       <DbtrAcct>
+                                                               <Id>
+                                                                       <IBAN>DE1234567890</IBAN>
+                                                               </Id>
+                                                       </DbtrAcct>
+                                                       <Cdtr>
+                                                               <Pty>
+                                                                       <Nm>Supplier</Nm>
+                                                                       <Id>
+                                                                               <PrvtId>
+                                                                                       <Othr>
+                                                                                               <Id>NL1234567890</Id>
+                                                                                       </Othr>
+                                                                               </PrvtId>
+                                                                       </Id>
+                                                               </Pty>
+                                                       </Cdtr>
+                                                       <CdtrAcct>
+                                                               <Id>
+                                                                       <IBAN>DE9999988888</IBAN>
+                                                               </Id>
+                                                       </CdtrAcct>
+                                                       <UltmtCdtr>
+                                                               <Pty>
+                                                                       <Nm>Ultimate Supplier</Nm>
+                                                               </Pty>
+                                                       </UltmtCdtr>
+                                               </RltdPties>
+                                               <RltdAgts>
+                                                       <CdtrAgt>
+                                                               <FinInstnId>
+                                                                       <BICFI>DEUTDEFFXXX</BICFI>
+                                                               </FinInstnId>
+                                                       </CdtrAgt>
+                                               </RltdAgts>
+                                               <RmtInf>
+                                                       <Ustrd>Foobar EREF: SD36-1234-1234-1234 MREF: 1234-12345-1234 CRED: </Ustrd>
+                                                       <Ustrd>DE00ZZZ123456789</Ustrd>
+                                               </RmtInf>
+                                       </TxDtls>
+                               </NtryDtls>
+                               <AddtlNtryInf>Lastschrift</AddtlNtryInf>
+                       </Ntry>
+               </Rpt>
+       </BkToCstmrAcctRpt>
+</Document>"""
+
+
+def test_parse():
+    result = camt053_to_dict(data)
+
+    expected = [{'AccountServicerReference': '2025102812344060000',
+                 'AdditionalEntryInformation': 'Überweisungsgutschr.',
+                 'Amount': '35.00',
+                 'BankTransactionCode.Domain.Code': 'PMNT',
+                 'BankTransactionCode.Domain.Family.Code': 'RRCT',
+                 'BankTransactionCode.Domain.Family.SubFamilyCode': 'ESCT',
+                 'BankTransactionCode.Proprietary.Code': 'NTRF+168+00931',
+                 'BankTransactionCode.Proprietary.Issuer': 'DK',
+                 'BookingDate.Date': '2025-10-28',
+                 'CreditDebitIndicator': 'CRDT',
+                 'EntryDetails.TransactionDetails.Amount': '35.00',
+                 'EntryDetails.TransactionDetails.BankTransactionCode.Domain.Code': 'PMNT',
+                 'EntryDetails.TransactionDetails.BankTransactionCode.Domain.Family.Code': 'RRCT',
+                 'EntryDetails.TransactionDetails.BankTransactionCode.Domain.Family.SubFamilyCode': 'ESCT',
+                 'EntryDetails.TransactionDetails.BankTransactionCode.Proprietary.Code': 'NTRF+168+00931',
+                 'EntryDetails.TransactionDetails.BankTransactionCode.Proprietary.Issuer': 'DK',
+                 'EntryDetails.TransactionDetails.References.EndToEndIdentification': 'NOTPROVIDED',
+                 'EntryDetails.TransactionDetails.RelatedAgents.DebtorAgent.FinancialInstitutionIdentification.BICFI': 'GENODEM1GLS',
+                 'EntryDetails.TransactionDetails.RelatedParties.Creditor.Party.Name': 'Account '
+                                                                                       'owner',
+                 'EntryDetails.TransactionDetails.RelatedParties.CreditorAccount.Identification.IBAN': 'DE1234567890',
+                 'EntryDetails.TransactionDetails.RelatedParties.Debtor.Party.Name': 'Sender',
+                 'EntryDetails.TransactionDetails.RelatedParties.DebtorAccount.Identification.IBAN': 'DE999999999',
+                 'EntryDetails.TransactionDetails.RemittanceInformation.Unstructured': 'Reference',
+                 'Status.Code': 'BOOK',
+                 'ValueDate.Date': '2025-10-28',
+                 'amount': Amount(amount=Decimal('35.00'), currency='EUR'),
+                 'applicant_creditor_id': None,
+                 'applicant_iban': 'DE999999999',
+                 'applicant_name': 'Sender',
+                 'bank_reference': '2025102812344060000',
+                 'currency': 'EUR',
+                 'date': datetime.date(2025, 10, 28),
+                 'end_to_end_reference': 'NOTPROVIDED',
+                 'entry_date': datetime.date(2025, 10, 28),
+                 'guessed_entry_date': datetime.date(2025, 10, 28),
+                 'id': 'NTRF',
+                 'purpose': 'Reference',
+                 'purpose_code': 'ESCT',
+                 'recipient_name': 'Account owner',
+                 'status': 'C'},
+                {'AccountServicerReference': '2025110701433815000',
+                 'AdditionalEntryInformation': 'Lastschrift',
+                 'Amount': '29.63',
+                 'BankTransactionCode.Domain.Code': 'PMNT',
+                 'BankTransactionCode.Domain.Family.Code': 'RDDT',
+                 'BankTransactionCode.Domain.Family.SubFamilyCode': 'ESDD',
+                 'BankTransactionCode.Proprietary.Code': 'NDDT+105+00931',
+                 'BankTransactionCode.Proprietary.Issuer': 'DK',
+                 'BookingDate.Date': '2025-11-07',
+                 'CreditDebitIndicator': 'DBIT',
+                 'EntryDetails.TransactionDetails.Amount': '29.63',
+                 'EntryDetails.TransactionDetails.BankTransactionCode.Domain.Code': 'PMNT',
+                 'EntryDetails.TransactionDetails.BankTransactionCode.Domain.Family.Code': 'RDDT',
+                 'EntryDetails.TransactionDetails.BankTransactionCode.Domain.Family.SubFamilyCode': 'ESDD',
+                 'EntryDetails.TransactionDetails.BankTransactionCode.Proprietary.Code': 'NDDT+105+00931',
+                 'EntryDetails.TransactionDetails.BankTransactionCode.Proprietary.Issuer': 'DK',
+                 'EntryDetails.TransactionDetails.References.EndToEndIdentification': 'SD36-1234-1234-1234',
+                 'EntryDetails.TransactionDetails.References.MandateIdentification': '1234-1234-1234',
+                 'EntryDetails.TransactionDetails.RelatedAgents.CreditorAgent.FinancialInstitutionIdentification.BICFI': 'DEUTDEFFXXX',
+                 'EntryDetails.TransactionDetails.RelatedParties.Creditor.Party.Identification.PrivateIdentification.Other.Identification': 'NL1234567890',
+                 'EntryDetails.TransactionDetails.RelatedParties.Creditor.Party.Name': 'Supplier',
+                 'EntryDetails.TransactionDetails.RelatedParties.CreditorAccount.Identification.IBAN': 'DE9999988888',
+                 'EntryDetails.TransactionDetails.RelatedParties.Debtor.Party.Name': 'Account '
+                                                                                     'owner',
+                 'EntryDetails.TransactionDetails.RelatedParties.DebtorAccount.Identification.IBAN': 'DE1234567890',
+                 'EntryDetails.TransactionDetails.RelatedParties.UltimateCreditor.Party.Name': 'Ultimate '
+                                                                                               'Supplier',
+                 'EntryDetails.TransactionDetails.RemittanceInformation.Unstructured': 'Foobar EREF: SD36-1234-1234-1234 MREF: 1234-12345-1234 CRED: DE00ZZZ123456789',
+                 'Status.Code': 'BOOK',
+                 'ValueDate.Date': '2025-11-07',
+                 'amount': Amount(amount=Decimal('-29.63'), currency='EUR'),
+                 'applicant_creditor_id': 'NL1234567890',
+                 'applicant_iban': 'DE9999988888',
+                 'applicant_name': 'Supplier',
+                 'bank_reference': '2025110701433815000',
+                 'currency': 'EUR',
+                 'date': datetime.date(2025, 11, 7),
+                 'end_to_end_reference': 'SD36-1234-1234-1234',
+                 'entry_date': datetime.date(2025, 11, 7),
+                 'guessed_entry_date': datetime.date(2025, 11, 7),
+                 'id': 'NDDT',
+                 'purpose': 'Foobar EREF: SD36-1234-1234-1234 MREF: 1234-12345-1234 CRED: DE00ZZZ123456789',
+                 'purpose_code': 'ESDD',
+                 'recipient_name': 'Account owner',
+                 'status': 'D'}]
+    assert result == expected