# Customer validation rules
# =========================
#
# The rules have option names like:
# customer_validation.<RuleName>.<RuleSetNo>.<CountryOption>.<ProductGroupOption>.<ProductOption>
#
# Example:
# customer_validation.zip.1.se.default.default
#
# The last three can be "default", trailing defaults can be skipped, but
# all rules for a field have to have the same number of parts in the option name
#
# <CountryOption> should correspond to the country codes as used in Billing API.
#
# <ProductGroupOption> and <ProductOption> should correspond to the HostingProduct configuration
# attributes "productCategory" and "articalNumber" respectively.
#
# Rule Sets and Specificity
# -------------------------
#
# The numbers in option names represent a rule set. Only the most specific applicable
# rule in a rule set will be used for validation. If multiple rules should all be applicable they
# must be placed in different rule sets.
#
# Rule specificity is based firstly on the number of non-defaults and secondly on the following
# order: country is more specific than product, which in turn is more specific than product group,
# i.e. country > product > product group.
#
# If there is more than one applicable rule of the same specificity in a rule set the rule that will
# be selected is undefined.
#
# If multiple applicable rules should be applied, they must be put in different rule sets.
# Logically we have something like this Valid = (RuleSet1.RuleA || RuleSet1.RuleB) && (RuleSet2.RuleA || RuleSet2.RuleB) && ...
# E.g. DMN-SE and DMN-NU products both have the same requirements regarding identity_number, but the rules are
# independent of each other, so they are placed in different rule sets.
#
#
# Custom Fields
# ---------------
#
# Custom fields part allows specification of additional contact fields that will be requested and passed to domain contact
# when domains are ordered or contacts are assigned to them.
#
# The rules have option names like:
# custom_fields.<RuleSetNo>.<FieldName>.<CountryOption>.<ProductGroupOption>.<ProductOption>
#
# Example:
# custom_fields.1.nexus_app_purpose.default.default.DMN-US regexp.required .+
#
# Only regexp rule types are supported for custom fields.
#
#
# Required Fields
# ---------------
#
# Normally the decision whether a field should be considered required or not is defered to the place where
# the validation is initiated, e.g. by setting AtomiaRequired or Required attributes on an ASP.NET MVC model property.
#
# This means that empty values are always considered valid regardless of the rule value.
#
# In cases where there is a hard requirement, i.e. the value MUST be supplied, it is possible to override the
# default behavior by putting the rule type as 'regexp.required' or 'javascript.required'.
#
# Please note that overriding the default behavior and make a hard required field should only need to be done very rarely.
#
# Examples:
# * It is not possible to register a .se domain without supplying a Swedish corporate or personal identity number. This
# is a hard requirement.
# * A Swedish zip code always should consist of 5 digits. There could be many cases though where a zip code is not required,
# but iff one is supplied for a Swedish address, it should be validated for 5 digits. This is NOT a hard requirement.
#
#
# Replace value
# ---------------
#
# It is possible to define replacement string for regexp rules. If defined, this replacement string will be used together
# with validation regular expression in Regex.Replace(input, pattern, replacement) method where input is field value,
# patter is validation rule value and replacement is replace string.
#
# Example:
# * customer_validation.zip.1.se regexp ^([0-9]{3})\s?([0-9]{2})$ (replace: $1$2)
# In this example, replace string is $1$2 which in this case will match first and second group from field value and join
# them together (i.e. string 123 45 will be replaced with 12345).
# Option name # Type # Value # Replace regexp (optional)
# Names etc.
customer_validation.first_name.1 regexp .+
customer_validation.last_name.1 regexp .+
customer_validation.company_name.1 regexp .+
customer_validation.address.1 regexp .+
customer_validation.city.1 regexp .+
# Email address
customer_validation.email.1 regexp ^\S+@\S+$
# Zip, default
customer_validation.zip.1.default regexp ^[0-9]{3,10}$
# Zip, EU
customer_validation.zip.1.at regexp ^[0-9]{4}$
customer_validation.zip.1.be regexp ^[0-9]{4}$
customer_validation.zip.1.bg regexp ^[0-9]{4}$
customer_validation.zip.1.cy regexp ^[0-9]{4}$
customer_validation.zip.1.cz regexp ^[0-9]{3}\s?[0-9]{2}$
customer_validation.zip.1.de regexp ^[0-9]{5}$
customer_validation.zip.1.ee regexp ^[0-9]{5}$
customer_validation.zip.1.es regexp ^[0-9]{5}$
customer_validation.zip.1.fi regexp ^[0-9]{5}$
customer_validation.zip.1.fr regexp ^[0-9]{5}$
customer_validation.zip.1.gr regexp ^[0-9]{3}\s?[0-9]{2}$
customer_validation.zip.1.hr regexp ^[0-9]{5}$
customer_validation.zip.1.hu regexp ^[0-9]{4}$
customer_validation.zip.1.ie regexp .*
customer_validation.zip.1.it regexp ^[0-9]{5}$
customer_validation.zip.1.lt regexp ^(LT-|lt-)?[0-9]{5}$
customer_validation.zip.1.lu regexp ^[0-9]{5}$
customer_validation.zip.1.lv regexp ^(LV-|lv-)[0-9]{4}$
customer_validation.zip.1.mt regexp ^[a-zA-Z]{3}\s?[0-9]{4}$
customer_validation.zip.1.nl regexp ^[1-9][0-9]{3}(\s)?(?!SS|ss|SA|sa|SD|sd)[a-zA-Z]{2}$
customer_validation.zip.1.pl regexp ^[0-9]{2}-?[0-9]{3}$
customer_validation.zip.1.pt regexp ^[0-9]{4}[\-\s]?[0-9]{3}$
customer_validation.zip.1.ro regexp ^[0-9]{6}$
customer_validation.zip.1.se regexp ^([0-9]{3})\s?([0-9]{2})$ (replace: $1$2)
customer_validation.zip.1.si regexp ^(SI-|si-)?[0-9]{4}$
customer_validation.zip.1.sk regexp ^[0-9]{3}\s?[0-9]{2}$
# ZIP, Denmark. Three digit Faroe Island codes purposefully not included.
customer_validation.zip.1.dk regexp ^(((DK|dk)(-| |))?\d{4})$
# ZIP, UK
# Based on the rules from Royal Mail Programmers' Guide Edition 7, version 5.0 (p. 17-18)
customer_validation.zip.1.gb regexp ^(GIR 0AA)|((([A-PR-UWYZ][0-9]{1,2})|([A-PR-UWYZ][A-HK-Y][0-9]{1,2})|([A-PR-UWYZ][0-9][A-HJKPSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][A-Z])) [0-9][ABD-HJLNP-UWXYZ]{2})$
# Zip, Norway, Argentina, United States, Canada and Bermuda
customer_validation.zip.1.no regexp ^[0-9]{4}$
customer_validation.zip.1.ar regexp ^([a-zA-Z]{1})?[0-9]{4}([a-zA-Z]{3})?$
customer_validation.zip.1.us regexp ^[0-9]{5}(?:-[0-9]{4})?$
customer_validation.zip.1.ca regexp ^(?!.*[DFIOQU])[A-VXY][0-9][A-Z]?[0-9][A-Z][0-9]$
customer_validation.zip.1.bm regexp ^[a-zA-Z]{2} (([a-zA-Z]{2}|[0-9]{2}))$
# Identity number, default
customer_validation.identity_number.1.default regexp .+
# Identity number, country specific
customer_validation.identity_number.1.se regexp ^[0-9]{6}\-[0-9]{4}$
customer_validation.identity_number.1.no regexp ^[0-9]{6}\-?[0-9]{5}$
# Identity number, requirement for .se
customer_validation.identity_number.2.se.default.DMN-SE regexp.required ^[0-9]{6}\-[0-9]{4}$
# Identity number, requirement for .nu
customer_validation.identity_number.3.se.default.DMN-NU regexp.required ^[0-9]{6}\-[0-9]{4}$
# VAT, default
customer_validation.vat_number.1.default regexp .+
# VAT, EU (removes '-' and '.', country prefix optional)
# Reference: http://ec.europa.eu/taxation_customs/vies/faqvies.do#item_11
customer_validation.vat_number.1.at javascript function (val) { return /^(AT)?U[0-9]{8}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.be javascript function (val) { return /^(BE)?0?[0-9]{9}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.bg javascript function (val) { return /^(BG)?[0-9]{9,10}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.cy javascript function (val) { return /^(CY)?[0-9]{8}[A-Z]$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.cz javascript function (val) { return /^(CZ)?[0-9]{8,10}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.de javascript function (val) { return /^(DE)?[0-9]{9}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.dk javascript function (val) { return /^(DK)?[0-9]{8}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.ee javascript function (val) { return /^(EE)?[0-9]{9}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.es javascript function (val) { return /^(ES)?[0-9A-Z][0-9]{7}[0-9A-Z]$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.fi javascript function (val) { return /^(FI)?[0-9]{8}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.fr javascript function (val) { return /^(FR)?[0-9A-Z]{2}[0-9]{9}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.gb javascript function (val) { return /^(GB)?([0-9]{9}([0-9]{3})?|[A-Z]{2}[0-9]{3})$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.gr javascript function (val) { return /^(EL|GR)?[0-9]{9}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.hr javascript function (val) { return /^(HR)?[0-9]{11}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.hu javascript function (val) { return /^(HU)?[0-9]{8}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.ie javascript function (val) { return /^(IE)?(([0-9]{7}[A-Z]{1,2})|([0-9][A-Z0-9+*][0-9]{5}[A-Z]))$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.it javascript function (val) { return /^(IT)?[0-9]{11}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.lt javascript function (val) { return /^(LT)?([0-9]{9}|[0-9]{12})$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.lu javascript function (val) { return /^(LU)?[0-9]{8}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.lv javascript function (val) { return /^(LV)?[0-9]{11}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.mt javascript function (val) { return /^(MT)?[0-9]{8}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.nl javascript function (val) { return /^(NL)?[0-9]{9}B[0-9]{2}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.pl javascript function (val) { return /^(PL)?[0-9]{10}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.pt javascript function (val) { return /^(PT)?[0-9]{9}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.ro javascript function (val) { return /^(RO)?[0-9]{2,10}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.se javascript function (val) { return /^(SE)?[0-9]{12}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.si javascript function (val) { return /^(SI)?[0-9]{8}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.1.sk javascript function (val) { return /^(SK)?[0-9]{10}$/.test(val.replace(/[-.?]/, "")); }
# VAT, requirement for .se, non-Swedish entities
# Does not apply to Sweden so override with more specific rule.
customer_validation.vat_number.2.se.default.DMN-SE javascript function (val) { return /^(SE)?[0-9]{12}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.2.default.default.DMN-SE regexp.required .+
# VAT, requirement for .nu, non-Swedish entities
# Does not apply to Sweden so override with more specific rule.
customer_validation.vat_number.3.se.default.DMN-NU javascript function (val) { return /^(SE)?[0-9]{12}$/.test(val.replace(/[-.?]/, "")); }
customer_validation.vat_number.3.default.default.DMN-NU regexp.required .+
# Country codes
customer_validation.country.1.default regexp ^[a-zA-Z]{2}$
# Phone, mobile and fax per country
customer_validation.phone.1.default regexp ^\+?([-.,/()\s]?[0-9]){6,14}[-.,/()\s]?[0-9]$
customer_validation.mobile.1.default regexp ^\+?([-.,/()\s]?[0-9]){6,14}[-.,/()\s]?[0-9]$
customer_validation.fax.1.default regexp ^\+?([-.,/()\s]?[0-9]){6,14}[-.,/()\s]?[0-9]$
# Custom fields
# custom_fields.<RuleSetNo>.<FieldName>.<CountryOption>.<ProductGroupOption>.<ProductOption>
custom_fields.1.nexus_app_purpose.default.default.DMN-US regexp.required ^P[1-5]$
custom_fields.1.nexus_category.default.default.DMN-US regexp.required ^C(11|12|21|31|32)$
custom_fields.1.test_field1.default.default.DMN-TTT regexp ^([0-9]{3})\s?([0-9]{2})$
custom_fields.2.test_field1.se.default.DMN-TTT regexp.required ^([0-9]{3})\s?([0-9]{2})$ (replace: $1$2)
# Password requirements
# =====================
#
# The password requirements rules have option names like:
# password_requirements.<RuleName>.<Application>
#
# <Application> can be set to default (all applications), hcp (HostingControlPanel), bcup (BillingCustomerPanel), pop (PublicOrderPage) or admin (AdminPanel).
#
# Examples:
# password_requirements.email_account.default
# password_requirements.email_account.hcp
#
# All password requirements rules must have type regexp.
#
# Email account
password_requirements.email_account.default regexp ^.{8,20}$
# Note: If using TNAPI, the following rule should be used:
# password_requirements.email_account.default regexp ^(?=.{6,8}$)(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*
# FTP account
password_requirements.ftp_account.default regexp ^.{8,20}$
# SSH account
password_requirements.ssh_account.default regexp (?=^.{8,255}$)((?=.*\d)(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[^A-Za-z0-9])(?=.*[a-z])|(?=.*[^A-Za-z0-9])(?=.*[A-Z])(?=.*[a-z])|(?=.*\d)(?=.*[A-Z])(?=.*[^A-Za-z0-9]))^.*
# MySQL user
password_requirements.mysql_user.default regexp ^.{8,20}$
# MSSQL user
password_requirements.mssql_user.default regexp ^(?=.{8,20}$)(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).*
# Website password protection
password_requirements.website_passwordprotection.default regexp ^.{8,20}$
# Exchange mailbox
password_requirements.exchange_mailbox.default regexp ^.{8,20}$
#########
# TEST, internal type used for testing.
password_requirements.internal_test.default regexp ^default$
password_requirements.internal_test.hcp regexp ^hcp$