1- create or replace  function  phone_normalize (
1+ --  TODO add support for https://datatracker.ietf.org/doc/html/rfc3966 (see https://habr.com/ru/post/278345/)
2+ 3+ create or replace  function  public .phone_normalize(
24 country_code int , -- код страны в любом формате или NULL
35 area_code text , -- код зоны в любом формате или NULL
46 local_number text  -- локальный номер телефона в любом формате или NULL
7880end;
7981$$;
8082
81- comment on  function phone_normalize(
83+ comment on  function public . phone_normalize (
8284 country_code int ,
8385 area_code text ,
8486 local_number text 
@@ -93,7 +95,7 @@ comment on function phone_normalize(
9395Возвращает null , если строка не является номером телефона (минимальная проверка синтаксиса).
9496$$;
9597
96- create or replace  function  phone_normalize (
98+ create or replace  function  public . phone_normalize(
9799 country_code text ,
98100 area_code text ,
99101 local_number text 
@@ -106,14 +108,14 @@ create or replace function phone_normalize(
106108 set  search_path =  ' ' 
107109as 
108110$$
109-  select  phone_normalize(
111+  select  public . phone_normalize (
110112 nullif(trim (country_code), ' ' int ,
111113 area_code,
112114 local_number
113115 )
114116$$;
115117
116- create or replace  function  phone_normalize (
118+ create or replace  function  public . phone_normalize(
117119 phone text 
118120)
119121 returns text 
131133 between 1 /* +*/ +  8  -- https://stackoverflow.com/questions/14894899/what-is-the-minimum-length-of-a-valid-international-phone-number
132134 and  1 /* +*/ +  15  -- https://en.wikipedia.org/wiki/E.164 and https://en.wikipedia.org/wiki/Telephone_numbering_plan)
133135 and  phone ~ ' ^\+\d +$' 
134-  else phone_normalize(null , null , phone)
136+  else public . phone_normalize (null , null , phone)
135137 end;
136138$$;
137139
@@ -140,50 +142,48 @@ $$;
140142do $$
141143 begin 
142144 -- positive
143-  assert phone_normalize('  ' null ,' +7 (977) 123-45-67' =  ' +79771234567' 
144-  assert phone_normalize(null ,null ,' +7 (977) 123-45-67' =  ' +79771234567' 
145-  assert phone_normalize(null ,null ,' + 7 (977) 123-45-67' =  ' +79771234567' 
146-  assert phone_normalize(null ,null ,' ++ 7 (977) 123-45-67 доб 123 Мария' =  ' +79771234567' 
147-  assert phone_normalize(null ,null ,' + 7 (977) 123-45-67 вн. 123' =  ' +79771234567' 
148-  assert phone_normalize(null ,null ,' + 7 (977) 123-45-67 моб.' =  ' +79771234567' 
149-  assert phone_normalize(null ,null ,' 8/977/1234567' =  ' +79771234567' 
150-  assert phone_normalize(null ,null ,' 8 (812) 123–45−67' =  ' +78121234567' 
151-  assert phone_normalize(null ,null ,' моб.т. + 7 (977) 123-45-67 ' =  ' +79771234567' 
152-  assert phone_normalize(null ,null ,'  моб. 8 /977/ 123-45-67/69/70 Мария/Иван ' =  ' +79771234567' 
153-  assert phone_normalize(null ,null ,'  моб. 8 (977) 123-45-67/69 Мария Петровна ' =  ' +79771234567' 
154- 155-  assert phone_normalize(null ,null ,' 8(977)123-45-67 с 12.00 до 22.00' =  ' +79771234567' 
156-  assert phone_normalize(null ,null ,' 8(977)123-45-67 с 9 по 11 ч. строго' =  ' +79771234567' 
157- 158-  assert phone_normalize(null ,null ,' 89771234567' =  ' +79771234567' 
159-  assert phone_normalize(null ,null ,' (977) 123-45-67' =  ' +79771234567' 
160-  assert phone_normalize(null ,' 8 977' ' 123 45 67' =  ' +79771234567' 
161-  assert phone_normalize(null ,' 977' ' 123 45 67' =  ' +79771234567' 
162-  assert phone_normalize(null ,' 831 66 1-23-45' null ) =  ' +78316612345' 
163- 164-  assert phone_normalize(' 7' ' ' ' 8 977 123 45 67' =  ' +79771234567' 
165-  assert phone_normalize(7 ,' 8 977' ' 123 45 67' =  ' +79771234567' 
166-  assert phone_normalize(8 ,' 7 977' ' 123 45 67' =  ' +79771234567' 
167-  assert phone_normalize(7 ,' 977' ' 1234567' =  ' +79771234567' 
168-  assert phone_normalize(8 ,null ,' 8 9771234567' =  ' +79771234567' 
169- 170-  assert phone_normalize(' 8 977 1234567' =  ' +79771234567' 
171-  assert phone_normalize(' +79771234567' =  ' +79771234567' 
172-  assert phone_normalize(' 677 1234567' =  ' +76771234567' 
173-  assert phone_normalize(' +677 1234567' =  ' +6771234567' 
174-  assert phone_normalize(' 210(-.-)7905(-.-)1234567' =  ' +21079051234567' 
145+  assert public . phone_normalize ('  ' null ,' +7 (977) 123-45-67' =  ' +79771234567' 
146+  assert public . phone_normalize (null ,null ,' +7 (977) 123-45-67' =  ' +79771234567' 
147+  assert public . phone_normalize (null ,null ,' + 7 (977) 123-45-67' =  ' +79771234567' 
148+  assert public . phone_normalize (null ,null ,' ++ 7 (977) 123-45-67 доб 123 Мария' =  ' +79771234567' 
149+  assert public . phone_normalize (null ,null ,' + 7 (977) 123-45-67 вн. 123' =  ' +79771234567' 
150+  assert public . phone_normalize (null ,null ,' + 7 (977) 123-45-67 моб.' =  ' +79771234567' 
151+  assert public . phone_normalize (null ,null ,' 8/977/1234567' =  ' +79771234567' 
152+  assert public . phone_normalize (null ,null ,' 8 (812) 123–45−67' =  ' +78121234567' 
153+  assert public . phone_normalize (null ,null ,' моб.т. + 7 (977) 123-45-67 ' =  ' +79771234567' 
154+  assert public . phone_normalize (null ,null ,'  моб. 8 /977/ 123-45-67/69/70 Мария/Иван ' =  ' +79771234567' 
155+  assert public . phone_normalize (null ,null ,'  моб. 8 (977) 123-45-67/69 Мария Петровна ' =  ' +79771234567' 
156+ 157+  assert public . phone_normalize (null ,null ,' 8(977)123-45-67 с 12.00 до 22.00' =  ' +79771234567' 
158+  assert public . phone_normalize (null ,null ,' 8(977)123-45-67 с 9 по 11 ч. строго' =  ' +79771234567' 
159+ 160+  assert public . phone_normalize (null ,null ,' 89771234567' =  ' +79771234567' 
161+  assert public . phone_normalize (null ,null ,' (977) 123-45-67' =  ' +79771234567' 
162+  assert public . phone_normalize (null ,' 8 977' ' 123 45 67' =  ' +79771234567' 
163+  assert public . phone_normalize (null ,' 977' ' 123 45 67' =  ' +79771234567' 
164+  assert public . phone_normalize (null ,' 831 66 1-23-45' null ) =  ' +78316612345' 
165+ 166+  assert public . phone_normalize (' 7' ' ' ' 8 977 123 45 67' =  ' +79771234567' 
167+  assert public . phone_normalize (7 ,' 8 977' ' 123 45 67' =  ' +79771234567' 
168+  assert public . phone_normalize (8 ,' 7 977' ' 123 45 67' =  ' +79771234567' 
169+  assert public . phone_normalize (7 ,' 977' ' 1234567' =  ' +79771234567' 
170+  assert public . phone_normalize (8 ,null ,' 8 9771234567' =  ' +79771234567' 
171+ 172+  assert public . phone_normalize (' 8 977 1234567' =  ' +79771234567' 
173+  assert public . phone_normalize (' +79771234567' =  ' +79771234567' 
174+  assert public . phone_normalize (' 677 1234567' =  ' +76771234567' 
175+  assert public . phone_normalize (' +677 1234567' =  ' +6771234567' 
176+  assert public . phone_normalize (' 210(-.-)7905(-.-)1234567' =  ' +21079051234567' 
175177
176178 -- negative
177-  assert phone_normalize(- 1 ,' 977' ' 1234567' null ;
178-  assert phone_normalize(1000 ,' 977' ' 1234567' null ;
179-  assert phone_normalize(null ,null ,null ) is null ;
180-  assert phone_normalize(null ,null ,null ) is null ;
181-  assert phone_normalize(null ,'  ' '  ' null ;
182-  assert phone_normalize(null ,null ,'  123456 ' null ;
183-  assert phone_normalize(null ,'  123456 ' null ) is null ;
184-  assert phone_normalize(null ,null , ' 1234567890123456' null ;
185-  assert phone_normalize(null ,null , ' 8x977_1234567' null ;
179+  assert public . phone_normalize (- 1 ,' 977' ' 1234567' null ;
180+  assert public . phone_normalize (1000 ,' 977' ' 1234567' null ;
181+  assert public . phone_normalize (null ,null ,null ) is null ;
182+  assert public . phone_normalize (null ,null ,null ) is null ;
183+  assert public . phone_normalize (null ,'  ' '  ' null ;
184+  assert public . phone_normalize (null ,null ,'  123456 ' null ;
185+  assert public . phone_normalize (null ,'  123456 ' null ) is null ;
186+  assert public . phone_normalize (null ,null , ' 1234567890123456' null ;
187+  assert public . phone_normalize (null ,null , ' 8x977_1234567' null ;
186188 end;
187189$$;
188- 189- --  TODO add support for https://datatracker.ietf.org/doc/html/rfc3966 (see https://habr.com/ru/post/278345/)
0 commit comments