from __future__ import annotations from .column_registry import COLUMNS def _index(legacy_position: int) -> int: return COLUMNS.index_of(f"legacy_{legacy_position:03d}") # Служебные поля и операция. COL_FILE_NAME = _index(1) COL_RECORD_ID = _index(7) COL_FTR_SIGN = _index(10) COL_SUSPENSION_BASIS = _index(11) COL_OPERATION_SIGN = _index(14) COL_ESP_SIGN = _index(15) COL_OPERATION_CODE = _index(19) COL_EXTRA_CODES = _index(20) COL_UNUSUAL_CODES = _index(21) COL_CURRENCY = _index(22) COL_AMOUNT_CURRENCY = _index(23) COL_AMOUNT_RUB = _index(24) COL_SALE_CURRENCY = _index(25) COL_SALE_AMOUNT = _index(26) COL_CURRENCY_SIGN = _index(27) COL_SUSPICIOUS_ID = _index(28) COL_METAL_CODE = _index(29) COL_METAL_NAME = _index(30) COL_ITEM_TYPE = _index(31) # Перевод. COL_TRANSFER_TYPE = _index(35) COL_TERRITORY_CODE = _index(36) COL_OPERATOR_TYPE = _index(37) COL_PAYER_ACCOUNT = _index(38) COL_PAYER_ESP = _index(39) COL_PAYER_BANK_NAME = _index(40) COL_PAYER_BANK_BIK = _index(41) COL_RECIPIENT_BANK_NAME = _index(42) COL_RECIPIENT_BANK_BIK = _index(43) COL_PAYER_BANK_ACCOUNT = _index(44) COL_RECIPIENT_BANK_ACCOUNT = _index(45) COL_RECIPIENT_ACCOUNT = _index(46) COL_RECIPIENT_ESP = _index(47) COL_TRANSFER_STATUS = _index(62) # Карты и место операции. COL_TERRITORY_CODE_CARD = _index(96) COL_CARD_HOLDER_INFO = _index(103) COL_EMPLOYEE_SIGN = _index(104) COL_FOREIGN_BANK_NAME = _index(105) # Участник. COL_PARTICIPANT_TYPE = _index(109) COL_RESIDENT_SIGN = _index(110) COL_CLIENT_SIGN = _index(111) COL_IDENT_FL = _index(119) COL_INN = _index(120) COL_KPP = _index(122) COL_BIRTH_REG_DATE = _index(123) COL_BRANCH_SIGN = _index(124) COL_INSURANCE_NUMBER = _index(125) COL_COUNTRY_CODE = _index(126) COL_ADDRESS_ONE_LINE = _index(141) COL_ADDRESS_STRUCTURED = _index(142) COL_REG_PLACE_ONE_LINE = _index(152) COL_REG_PLACE_STRUCTURED = _index(153) COL_EIO_ADDRESS_ONE_LINE = _index(167) # ЕИО и ценные бумаги. COL_EIO_INN = _index(163) COL_EIO_REG_PLACE_ONE_LINE = _index(178) COL_CP_ISSUER_INN = _index(202) # Блоки схемы. BLOCK_EIO = COLUMNS.block("eio") BLOCK_CP = COLUMNS.block("cp") # Точные поля наличных, которые исторически очищаются для безналичных переводов. CASHLESS_CLEARED_COLUMNS = tuple( _index(position) for position in (50, 61, 65, 76, 84, 95, 99, 101) ) OKATO_COUNTRY_PAIRS: tuple[tuple[int, int], ...] = tuple( (_index(country), _index(okato)) for country, okato in ( (52, 53), (67, 68), (86, 87), (144, 145), (170, 171), ) ) # Текущая перестановка адресного блока при выгрузке в целевой шаблон. PARTICIPANT_ADDRESS_OUTPUT_SOURCES: dict[int, int] = { _index(141): _index(142), **{_index(target): _index(target + 1) for target in range(142, 151)}, _index(151): _index(141), } # Бизнес-константы. ACCOUNT_PLACEHOLDER = "00000000000000000000" CURRENCY_OPERATION_CODES = frozenset(str(code) for code in range(6101, 6127)) CASHLESS_TRANSFER_TYPES = frozenset( {"1", "2", "3", "4", "7", "10", "11", "12", "13", "14"} ) VALID_FTR_SIGNS = frozenset({"0", "1", "2", "3", "4", "5"}) VALID_SUSPENSION_BASES = frozenset({"1", "2", "3"}) VALID_ESP_SIGNS = frozenset({"1", "2", "3", "4"}) PRECIOUS_ITEM_CODES = frozenset({"5020", "5021", "5022", "5023"}) SUSPICIOUS_CODE = "6001" TERRITORY_CODE = "5016" PRECIOUS_METAL_CODE = "C99" EMPLOYEE_ABSENT_CODE = "0" RUSSIA_COUNTRY_CODE = "643" PARTICIPANT_TYPE_UL = "1" PARTICIPANT_TYPE_FL = "2" PARTICIPANT_TYPE_IP = "3" PARTICIPANT_TYPE_FLCHP = "4"