"""Constants.""" import re from abacus_common_logic.utils.enum import enum BANK_NUMBERS_TYPES = enum( 'BankNumbersTypes', DOMESTIC='Domestic', # account / routing numbers INTERNATIONAL='International', # swift code / iban ) DATE_FORMAT = '%Y-%m-%d' PAYMENT_METHODS = enum( 'PaymentMethods', CHECK='Check', WESTERN_UNION='Western Union', WIRE_TRANSFER='Wire Transfer', ) KAFKA_TOPICS = { 'OAUTH_COMPLETED': 'graphql.subscription.abacusAccountPayeePayoneerOAuthCompleted', 'VAT_COLLECTED': 'graphql.subscription.abacusAccountPayeeVATInfoSaved', 'RESYNC_PAYMENT_READINESS': 'graphql.subscription.abacusAccountPayeeResyncPaymentReadiness', } PAYEE_ELIGIBILITY_TYPES = enum( 'PayeeEligibilityTypes', PAYMENT_ELIGIBILITY='PAYMENT_ELIGIBILITY', TAX_ELIGIBILITY='TAX_ELIGIBILITY', ) PAYEE_EVENT_NAMES = enum( 'PayeeEventNames', OAUTH_COMPLETED='OAUTH_COMPLETED', VAT_COLLECTED='VAT_COLLECTED', RESYNC_PAYMENT_READINESS='RESYNC_PAYMENT_READINESS', ) WESTERN_UNION_STATUSES = enum( 'WesternUnionStatuses', NOT_AVAILABLE='Enrollment Not Currently Available', AVAILABLE='Enrollment Available', IN_PROGRESS='Enrollment in Progress', INCOMPLETE='Incomplete Enrollment', ENROLLED='Enrolled', ) ELIGIBILITY_STATUSES = enum( 'EligibilityStatuses', ON_HOLD='on_hold', ACTIVE='active', MISSING_INFO='missing_info', ) BALANCE_FILTER_OPTIONS = enum( 'BalanceFilterOptions', LESS_THAN_ZERO='less_than_zero', EQUALS_ZERO='equals_zero', GREATER_THAN_ZERO='greater_than_zero', ) PAYONEER_ACCOUNT_STATUSES = enum( 'PayoneerAccountStatuses', ACTIVE='ACTIVE', INACTIVE='INACTIVE', PENDING='PENDING' ) AWAL_PAYMENT_ENTITY_PREFIX = 'AWAL' PAYMENT_ENTITIES = enum( 'PaymentEntities', AWAL_UK='AWAL-UK', KNR_UK='KNR-UK', KNR_NL='KNR-NL', ORCHARD_ES='ORCHARD-ES', ORCHARD_DE='ORCHARD-DE', ORCHARD_UK='ORCHARD-UK', ORCHARD_NO='ORCHARD-NO', ) PAYONEER_SERVICE_STATUSES = enum( 'PayoneerServiceStatuses', OPERATIONAL='OPERATIONAL', OUTAGE='OUTAGE', UNKNOWN='UNKNOWN', ) PAYMENT_ENTITIES_LOGOS = { PAYMENT_ENTITIES.AWAL_UK: 'https://cdn.theorchard.io/assets/awal/icons/brand-text.png', PAYMENT_ENTITIES.KNR_UK: 'https://cdn.theorchard.io/assets/knr/icons/brand-text.png', PAYMENT_ENTITIES.KNR_NL: 'https://cdn.theorchard.io/assets/knr/icons/brand-text.png', PAYMENT_ENTITIES.ORCHARD_ES: 'https://cdn.theorchard.io/assets/orchard/icons/brand-text.png', PAYMENT_ENTITIES.ORCHARD_DE: 'https://cdn.theorchard.io/assets/orchard/icons/brand-text.png', PAYMENT_ENTITIES.ORCHARD_UK: 'https://cdn.theorchard.io/assets/orchard/icons/brand-text.png', PAYMENT_ENTITIES.ORCHARD_NO: 'https://cdn.theorchard.io/assets/orchard/icons/brand-text.png', } PAYMENT_ENTITIES_FALLBACK_SIGNING_ENTITIES = { PAYMENT_ENTITIES.ORCHARD_UK: '15', PAYMENT_ENTITIES.ORCHARD_NO: '16', } OWS_PERMISSIONS_SERVICE_NAME = 'ows-permissions' OWS_PERMISSIONS_ACCOUNT_ENDPOINT_URL = ( '/admin/profile-type/{' + 'profile_type}/' + 'profile/{profile_id}/resource/' + '{resource_type}' ) OWS_ABACUS_ACCOUNT_SERVICE_NAME = 'ows-abacus-account' OWS_ABACUS_ACCOUNT_ENDPOINT_URL = '/account-payee/{account_payee_id}' OWS_ABACUS_ACCOUNT_PAYEE_DATALOADER = '/account-payee/dataloader' VENDOR_RESOURCE_NAME = 'Vendor' EMPLOYEE_ALL_VENDORS_MARK = '*' LABEL_RESOURCE_NAME = 'label' COLLABORATOR_RESOURCE_NAME = 'Collaborator' # profile level headers. ORCHARD_IDENTITY_ID = 'Orchard-Identity-Id' ORCHARD_PROFILE_ID = 'Orchard-Profile-Id' ORCHARD_PROFILE_TYPE = 'Orchard-Profile-Type' ORCHARD_ROLES = 'Orchard-Roles' ORCHARD_PAYEE_ROLE = 'payee_management' ORCHARD_PAYEE_BYPASS_VAT_VALIDATION_ROLE = 'vat_api_override' # payoneer PREEXISTING_PAYONEER_ACCOUNT_PROGRAM_IDS = [ 100250970, 100260310, ] # Orchard Payoneer Account and Orchard Payoneer Account - EUR PAYONEER_REGISTER_PAYEE_ENDPOINT = '/v4/programs/{program_id}/payees/registration-link' PAYONEER_RELEASE_PAYEE_ENDPOINT = '/v4/programs/{program_id}/payees/{payee_id}' PAYONEER_GET_OAUTH_TOKENS_ENDPOINT = '/api/v2/oauth2/token' PAYONEER_GET_ACCOUNT_ID_ENDPOINT = '/v4/programs/{program_id}/payees/{payee_id}/status' PAYONEER_GET_PAYEE_SUBMITTED_WFORM_ENDPOINT = '/Payouts/HttpApi/API.aspx' PAYONEER_CLIENT_ID = 'client_id' PAYONEER_CLIENT_NAME = 'client_name' PAYONEER_CLIENT_PASSWORD = 'client_password' PAYONEER_WFORM_API_OK_STATUS_CODE = '000' PAYONEER_WFORM_STATUS_SUBMITTED = 'Submitted' PAYONEER_GET_ACCOUNT_DETAILS_ENDPOINT = '/v4/accounts/{account_id}/details' PAYONEER_GET_PAYEE_DETAILS_ENDPOINT = ( '/v4/programs/{program_id}/payees/{payee_id}/details' ) PAYONEER_MASS_PAYOUTS_ENDPOINT = '/v4/programs/{program_id}/masspayouts' PAYONEER_REGISTER_PAYOUT_METHOD_ENDPOINT = ( '/v4/programs/{program_id}/payees/register-payee' ) PAYONEER_PAYOUT_METHODS_ENDPOINT = ( '/v4/programs/{program_id}/payees/{payee_id}/payout-methods' ) PAYONEER_EDIT_PROFILE_ENDPOINT = '/v4/programs/{program_id}/payees/{payee_id}/details' PAYONEER_AUTH_PAYEE_ENDPOINT = ( '/api/v2/oauth2/authorize?client_id={payoneer_client_id}' '&redirect_uri={payoneer_redirect_uri}&scope=read+write+openid+' 'personal-details&response_type=code&state={payoneer_state}' ) PAYONEER_GET_PAYEE_STATUS_ENDPOINT = ( '/v4/programs/{program_id}/payees/{payee_id}/status' ) PAYONEER_GET_PAYEE_REGISTER_FORMAT_ENDPOINT = ( '/v4/programs/{program_id}/payout-methods/bank/account-types/' '{payee_type}/countries/{country}/currencies/{currency}' ) DOCUMENTS_ORCHARD_APP_BRAND = 'THEORCHARD' DOCUMENTS_AWAL_APP_BRAND = 'AWAL' DOCUMENTS_ALTAFONTE_APP_BRAND = 'ALTAFONTE' PAYONEER_SESSION_ID = 'Payoneer-Session-Id' PAYONEER_ACCOUNT_STATUS_NAMES_CODES = { PAYONEER_ACCOUNT_STATUSES.ACTIVE: 1, PAYONEER_ACCOUNT_STATUSES.INACTIVE: 99, PAYONEER_ACCOUNT_STATUSES.PENDING: 0, } PAYONEER_ACCOUNT_STATUS_CODES_NAMES = { 1: PAYONEER_ACCOUNT_STATUSES.ACTIVE, 99: PAYONEER_ACCOUNT_STATUSES.INACTIVE, 0: PAYONEER_ACCOUNT_STATUSES.PENDING, } PAYONEER_ADOPT_PAYEE_ENDPOINT = '/v4/programs/{program_id}/payees/adopt_payee' PAYONEER_STATUS_ENDPOINT = '/api/v2/status.json' PAYONEER_STATUS_CODE = { PAYONEER_SERVICE_STATUSES.OPERATIONAL: 200, PAYONEER_SERVICE_STATUSES.OUTAGE: 100, PAYONEER_SERVICE_STATUSES.UNKNOWN: 99, } PAYONEER_STATUS_DESC = { 200: PAYONEER_SERVICE_STATUSES.OPERATIONAL, 100: PAYONEER_SERVICE_STATUSES.OUTAGE, 99: PAYONEER_SERVICE_STATUSES.UNKNOWN, } # One time KNR backfill hack REQUIRED_FIELD_MESSAGE = 'Must be specified.' UNKNOWN_FIELD_MESSAGE = 'Unknown field.' KNR_DUMMY_VAT = 'KNR_DUMMY_VAT' UK_GOV_VAT_PATTERN = r'(^[0-9]{9}$)|(^[0-9]{12}$)|(^GB[0-9]{9}$)|(^GB[0-9]{12}$)' HMRC_AUTH_URL = '/oauth/token' HMRC_CHECK_VAT_URL = '/organisations/vat/check-vat-number/lookup/{vat_number}' HMRC_TOKEN_CACHE_KEY = 'hmrc_token' HMRC_TOKEN_CACHE_TIMEOUT_DELTA = 200 COUNTRY_CODE_FIELDS = ['country_code', 'country_of_tax_residency_code'] TWO_DAYS_IN_SECONDS = 2 * 24 * 60 * 60 # graphql-router GRAPHQL_ROUTER_URL = 'https://{env}-graphql-router.theorchard.io/graphql' TAX_ELIGIBILITY_ACTION_NAME = 'tax_eligibility' TAX_ELIGIBILITY_STATUS_NAME = 'complete' TAX_ELIGIBILITY_UPDATE_MSG = 'Make payee `{account_payee_id}` tax eligible.' PAYMENT_ELIGIBILITY_ACTION_NAME = 'payment_eligibility' PAYMENT_ELIGIBILITY_STATUS_NAME = 'approved' PAYMENT_ELIGIBILITY_UPDATE_MSG = 'Make payee `{account_payee_id}` payment eligible.' FORCE_BYPASS_VAT_TRUE = '1' # VIES API # source: https://ec.europa.eu/taxation_customs/vies/#/faq question #11 VAT_NUMBER_REGEXPS = { 'AT': re.compile(r'^U\d{8}$', re.IGNORECASE), 'BE': re.compile(r'^\d{9,10}$'), 'BG': re.compile(r'^\d{9,10}$'), 'CY': re.compile(r'^\d{8}[a-z]$', re.IGNORECASE), 'CZ': re.compile(r'^\d{8,10}$'), 'DE': re.compile(r'^\d{9}$'), 'DK': re.compile(r'^\d{8}$'), 'EE': re.compile(r'^\d{9}$'), 'EL': re.compile(r'^\d{9}$'), 'ES': re.compile(r'^[\da-z]\d{7}[\da-z]$', re.IGNORECASE), 'FI': re.compile(r'^\d{8}$'), 'FR': re.compile(r'^[\da-hj-np-z]{2}\d{9}$', re.IGNORECASE), 'XI': re.compile(r'^((\d{9})|(\d{12})|(GD\d{3})|(HA\d{3}))$', re.IGNORECASE), 'HR': re.compile(r'^\d{11}$'), 'HU': re.compile(r'^\d{8}$'), 'IE': re.compile( r'^((\d{7}[a-z])|(\d[a-z]\d{5}[a-z])|(\d{6,7}[a-z]{2}))$', re.IGNORECASE ), 'IT': re.compile(r'^\d{11}$'), 'LT': re.compile(r'^((\d{9})|(\d{12}))$'), 'LU': re.compile(r'^\d{8}$'), 'LV': re.compile(r'^\d{11}$'), 'MT': re.compile(r'^\d{8}$'), 'NL': re.compile(r'^\d{9}B\d{2,3}$', re.IGNORECASE), 'PL': re.compile(r'^\d{10}$'), 'PT': re.compile(r'^\d{9}$'), 'RO': re.compile(r'^\d{2,10}$'), 'SE': re.compile(r'^\d{12}$'), 'SI': re.compile(r'^\d{8}$'), 'SK': re.compile(r'^\d{10}$'), } KNR_VAT_PREFIXES_OMIT_VALIDATION = ['NO', 'CHF'] VIES_WS_ENDPOINT = 'http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl' TAX_FORM_TYPES = enum( 'TaxFormTypes', W9='W9', W8BEN='W8BEN', W8BENE='W8BEN-E', W8IMY='W8IMY', W8ECI='W8ECI', ) TAX_FORM_TYPES_W8 = ( TAX_FORM_TYPES.W8BEN, TAX_FORM_TYPES.W8BENE, TAX_FORM_TYPES.W8IMY, TAX_FORM_TYPES.W8ECI, ) PROFILES = enum( 'Profiles', ABACUS='AbacusProfile', DOCUMENTS='DocumentsProfile', ACCOUNT360='Account360Profile', COLLABORATORS='CollaboratorsProfile', ) PERMISSIONS_RESOURCE_TYPES = enum( 'PermissionsResourceTypes', TAX_INFO='tax_info', BANK_INFO='bank_info', ) PERMISSIONS_ACTIONS = enum( 'PermissionsActions', VIEW='view', EDIT='edit', DELETE='delete', ) BANK_DETAILS_PAYEE_TYPE = enum( 'BankDetailsPayeeType', INDIVIDUAL='INDIVIDUAL', COMPANY='COMPANY', ) BANK_ACCOUNT_TYPE = enum( 'BankAccountType', PERSONAL='PERSONAL', COMPANY='COMPANY', ) PAYEE_TYPES = enum('PayeeTypes', COLLABORATOR='collaborator') PAYONEER_WHITELABEL_REFERENCE_PAYMENT_TYPE_ID = 8 # ISO 3166-1, alpha-2 country codes -> Payoneer country codes PAYONEER_COUNTRY_MAPPING = { 'GB': 'UK', 'XK': 'KV', } # Payoneer country codes -> ISO 3166-1, alpha-2 country codes # This is a reverse mapping of PAYONEER_COUNTRY_MAPPING PAYONEER_COUNTRY_REVERSE_MAPPING = {v: k for k, v in PAYONEER_COUNTRY_MAPPING.items()} COUNTRIES_REQUIRED_FIELD_PROVINCE = ['US'] COUNTRIES_REQUIRED_FIELD_EMAIL = ['BR', 'ZA'] COUNTRIES_NOT_REQUIRED_FIELD_ZIP = ['ATG'] PAYEE_BANKING_DETAILS_PARTS = enum( 'PayeeBankingDetailsParts', PERSONAL_INFORMATION='PERSONAL_INFORMATION', ADDRESS_INFORMATION='ADDRESS_INFORMATION', BANKING_INFORMATION='BANKING_INFORMATION', ACCOUNT_HOLDER_NAME='ACCOUNT_HOLDER_NAME', COUNTRY_CODE='COUNTRY_CODE', ) ACCOUNT_PAYEE_ACTION_NAMES = enum( 'AccountPayeeActionNames', BANKING_DETAILS_REVIEW='banking_details_review', PAYMENT_ELIGIBILITY='payment_eligibility', ) PAYEE_ACTION_NAMES = enum( 'PayeeActionNames', BANKING_ELIGIBILITY='banking_eligibility', ) ACTION_STATUSES = enum( 'ActionStatuses', INIT='init', RUNNING='running', ERROR='error', COMPLETE='complete', APPROVED='approved', REJECTED='rejected', ) FINAL_ACTION_STATUSES = ( ACTION_STATUSES.APPROVED, ACTION_STATUSES.REJECTED, ACTION_STATUSES.COMPLETE, ) BANK_DETAILS_REGISTRATION_STATE_MESSAGE = 'Bank details registration.' KYC_NOTIFICATION_MESSAGE = 'KYC NOTIFICATION' SENSITIVE_FIELDS = [ 'address_1', 'address_2', 'city', 'province', 'zip', 'country_code', 'tin', 'value', 'first_name', 'last_name', 'date_of_birth', 'email', 'vat_number', 'local_tax_id', ] PAYEE_TAX_DETAILS_ELIGIBLE = ( 'Payee tax details are eligible for account_payee_id:`{account_payee_id}`.' ) TAX_TYPES = enum( 'TaxTypes', DETAILS='details', FORM='form', ) TAX_EMPLOYMENT_TYPES = enum( 'TaxEmploymentTypes', BUSINESS='Business', EMPLOYED_INDIVIDUAL='Employed Individual', SELF_EMPLOYED_INDIVIDUAL_LESS_2_YEARS='Self-Employed Individual (< 2 years)', SELF_EMPLOYED_INDIVIDUAL_MORE_EQUAL_2_YEARS='Self-Employed Individual (>= 2 years)', INDIVIDUAL='Individual', SMALL_BUSINESS_EU_VAT_NOT_REQUIRED='Small Business that is not required to register for EU VAT', # noqa )