Fixes ' r ' in AX addresses (should be ' rue ').
[platal.git] / upgrade / 1.0.1 / merge_issues.php
CommitLineData
74e1e725
SJ
1#!/usr/bin/php5
2<?php
0444be72 3// WARNING: this script takes a few minutes to be executed completly, thus run it into a screen.
74e1e725
SJ
4
5require_once 'connect.db.inc.php';
6require_once '../../classes/phone.php';
cee99643 7require_once '../../classes/address.php';
d086dd79 8require_once '../../classes/visibility.php';
74e1e725
SJ
9
10$globals->debug = 0; // Do not store backtraces.
11
ea647c8b
SJ
12$abbreviations = array(
13 'commandant' => 'cdt',
14 'docteur' => 'dr',
15 'haut' => 'ht',
16 'haute' => 'ht',
17 'hauts' => 'ht',
18 'hts' => 'ht',
19 'general' => 'gen',
20 'gal ' => 'gen ',
21 'grand' => 'gd',
22 'grande' => 'gd',
23 'grands' => 'gd',
24 'gde ' => 'gd ',
25 'gds ' => 'gd ',
26 'lieutenant' => 'lt',
27 'marechal' => 'mal',
28 'notre dame' => 'n d',
29 'nouveau' => 'nouv',
30 'president' => 'pdt',
31 'saint' => 'st',
32 'sainte' => 'st',
33 'saintes' => 'st',
34 'saints' => 'st',
35 'ste ' => 'st ',
36 'appartement' => 'app',
37 'apt' => 'app',
38 'appt' => 'app',
39 'appart' => 'app',
40 'arrondissement'=> 'arr',
41 'batiment' => 'bat',
42 'escalier' => 'esc',
43 'etage' => 'etg',
44 'et ' => 'etg',
45 'immeuble' => 'imm',
46 'lieu dit' => 'ld',
47 ' lt ' => ' lt ',
48 'porte' => 'pte',
49 'quartier' => 'quart',
50 'residence' => 'res',
51 'resi' => 'res',
52 'villa' => 'vla',
53 'village' => 'vlge',
54 'vil ' => 'vlge ',
55 'allee' => 'all',
56 'avenue' => 'av',
57 'boulevard' => 'bd',
58 'bld' => 'bd',
59 'chemin' => 'ch',
60 'chem ' => 'ch ',
61 'che ' => 'ch ',
62 'cours' => 'crs',
63 'domaine' => 'dom',
64 'doma ' => 'dom ',
65 'faubourg' => 'fg',
66 'fbg' => 'fg',
67 'hameau' => 'ham',
68 'hame ' => 'ham ',
69 'impasse' => 'imp',
70 'impa ' => 'imp ',
71 'lotissement' => 'lot',
72 'montee' => 'mte',
73 'passage' => 'pass',
74 'place' => 'pl',
75 'promenade' => 'pro ',
76 'prom ' => 'pro ',
77 'quai' => 'qu',
78 'rue' => 'r',
79 'route' => 'rte',
80 ' rde ' => ' rte ',
81 ' rle ' => ' rte ',
82 'sentier' => 'sen',
83 'sent ' => 'sen ',
84 'square' => 'sq',
85 'mount' => 'mt',
86 'road' => 'rd',
87 'street' => 'st',
88 'str ' => 'str',
89 'bis' => 'b',
90 'ter' => 't'
91);
92$patterns = array();
93$replacements = array();
94foreach ($abbreviations as $key => $abbreviation) {
95 $patterns[] = '/' . $key . '/';
96 $replacements[] = $abbreviation;
97}
98
99function check($address1, $address2)
100{
101 return $address1['short'] == $address2['short'] || $address1['short'] == $address2['long']
102 || $address1['long'] == $address2['short'] || $address1['long'] == $address2['long'];
103}
104
1d7b946b 105print "Deletes duplicated addresses. (1/4)\n";
cee99643
SJ
106$pids = XDB::rawFetchColumn("SELECT DISTINCT(pid)
107 FROM profile_addresses AS a1
108 WHERE type = 'home' AND EXISTS (SELECT *
109 FROM profile_addresses AS a2
110 WHERE a2.type = 'home' AND a2.pid = a1.pid AND a2.id != a1.id)
111 ORDER BY pid");
112$total = count($pids);
113$done = 0;
114$aux = 0;
115$deleted = 0;
116$addresses = array();
117$rawAddresses = array();
118$duplicates = array();
119foreach ($pids as $pid) {
120 $count = 0;
001ef7ef 121 $it = Address::iterate(array($pid), array(Address::LINK_PROFILE), array(0), Visibility::get(Visibility::VIEW_PRIVATE));
cee99643 122 while ($item = $it->next()) {
ea647c8b
SJ
123 $addresses[$count] = $item;
124 $rawAddress = preg_replace('/[^a-z0-9]/', ' ', mb_strtolower(replace_accent($item->text)));
125 $rawAddresses[$count] = array(
126 'long' => preg_replace('/\s+/', '', $rawAddress),
127 'short' => preg_replace('/\s+/', '', preg_replace($patterns, $replacements, $rawAddress)),
128 );
cee99643
SJ
129 ++$count;
130 }
131 for ($i = 0; $i < $count; ++$i) {
132 for ($j = $i + 1; $j < $count; ++$j) {
ea647c8b
SJ
133 if (check($rawAddresses[$i], $rawAddresses[$j])) {
134 $duplicates[$j] = true;
d086dd79 135 if (Visibility::isLessRestrictive($addresses[$i]->pub, $addresses[$j]->pub)) {
ce774256
SJ
136 $addresses[$i]->pub = $addresses[$j]->pub;
137 }
2dc5748d
SJ
138 if ($addresses[$j]->hasFlag('mail') && !$addresses[$i]->hasFlag('mail')) {
139 $addresses[$i]->addFlag('mail');
140 }
cee99643
SJ
141 }
142 }
143 }
d086dd79
SJ
144 if (count($duplicates)) {
145 foreach ($duplicates as $key => $bool) {
146 unset($addresses[$key]);
147 }
cee99643
SJ
148 }
149 if (count($addresses) != $count) {
150 $deleted += ($count - count($addresses));
151 Address::deleteAddresses($pid, 'home');
152 $id = 0;
153 foreach ($addresses as $address) {
154 $address->setId($id);
155 $address->save();
156 ++$id;
157 }
158 XDB::execute('UPDATE IGNORE profile_merge_issues
159 SET issues = REPLACE(issues, \'address\', \'\')
160 WHERE pid = {?}', $pid);
161 }
162 unset($rawAddresses);
163 unset($addresses);
164 unset($duplicates);
165
166 ++$done;
167 ++$aux;
168 if ($aux == 100) {
169 $aux = 0;
170 printf("\r%u / %u", $done, $total);
171 }
172}
173printf("\r%u / %u", $done, $total);
174print "\n$deleted addresses deleted.\n\n";
175
1d7b946b
SJ
176print "Formats erroneous addresses phones. (3/4)\n";
177$it = Address::iterate(array(), array(), array(), Visibility::get(Visibility::VIEW_PRIVATE));
178$total = $it->total();
179$i = 0;
180$skipped = 0;
181$fixed = 0;
182printf("\r%u / %u", $i, $total);
183while ($address = $it->next()) {
184 $fix = preg_replace('/\s+r(\.|)\s+/i', ' rue ', $address->text);
185 if ($fix != $address->text) {
186 $address->changed = 0;
187 $address->text = $fix;
188 $address->format();
189 if ($address->delete()) {
190 $address->save(false);
191 ++$fixed;
192 } else {
193 ++$skipped;
194 }
195 }
196
197 ++$i;
198 printf("\r%u / %u", $i, $total);
199}
200printf("\r%u / %u", $i, $total);
201if ($skipped != 0) {
202 printf("\n%u addresses skipped.\n", $skipped);
203}
204if ($fixed != 0) {
205 printf("\n%u addresses fixed.\n", $fixed);
206}
207print "\nAddress formating done.\n\n";
208
209print "Formats non formated phones. (3/4)\n";
74e1e725
SJ
210$it = XDB::rawIterator("SELECT search_tel AS search, display_tel AS display, comment, link_id,
211 tel_type AS type, link_type, tel_id AS id, pid, pub
212 FROM profile_phones
213 WHERE search_tel = '' OR search_tel IS NULL
214 ORDER BY pid, link_id, tel_id");
0444be72
SJ
215$total = $it->total();
216$i = 0;
217$j = 0;
218while ($item = $it->next()) {
219 $phone = new Phone($item);
220 $phone->delete();
221 $phone->save();
222
223 ++$i;
224 ++$j;
225 if ($j == 100) {
226 $j = 0;
227 printf("\r%u / %u", $i, $total);
228 }
74e1e725 229}
ded51efe 230printf("\r%u / %u", $i, $total);
0444be72 231print "\nFormating done.\n\n";
74e1e725 232
1d7b946b 233print "Deletes duplicated phones. (4/4)\n";
0444be72
SJ
234$pids = XDB::rawFetchColumn("SELECT DISTINCT(pid)
235 FROM profile_phones AS p1
236 WHERE link_type = 'user' AND EXISTS (SELECT *
237 FROM profile_phones AS p2
238 WHERE p2.link_type = 'user' AND p2.pid = p1.pid AND p2.tel_id != p1.tel_id)
239 ORDER BY pid");
240$total = count($pids);
241$done = 0;
242$aux = 0;
ded51efe 243$deleted = 0;
74e1e725
SJ
244$phones = array();
245$duplicates = array();
0444be72
SJ
246foreach ($pids as $pid) {
247 $count = 0;
001ef7ef 248 $it = Phone::iterate(array($pid), array(Phone::LINK_PROFILE), array(0), Visibility::get(Visibility::VIEW_PRIVATE));
0444be72 249 while ($item = $it->next()) {
ded51efe 250 $phones[] = $item;
0444be72
SJ
251 ++$count;
252 }
253 for ($i = 0; $i < $count; ++$i) {
74e1e725 254 for ($j = $i + 1; $j < $count; ++$j) {
d086dd79 255 if ($phones[$i]->search == $phones[$j]->search) {
ce774256 256 $duplicates[$j] = true;
d086dd79 257 if (Visibility::isLessRestrictive($phones[$i]->pub, $phones[$j]->pub)) {
ce774256
SJ
258 $phones[$i]->pub = $phones[$j]->pub;
259 }
0444be72 260 }
74e1e725 261 }
0444be72 262 }
d086dd79
SJ
263 if (count($duplicates)) {
264 foreach ($duplicates as $key => $bool) {
265 unset($phones[$key]);
266 }
0444be72
SJ
267 }
268 if (count($phones) != $count) {
ded51efe 269 $deleted += ($count - count($phones));
74e1e725
SJ
270 Phone::deletePhones($pid, 'user');
271 $id = 0;
272 foreach ($phones as $phone) {
0444be72
SJ
273 $phone->setId($id);
274 $phone->save();
275 ++$id;
74e1e725 276 }
0444be72
SJ
277 XDB::execute('UPDATE IGNORE profile_merge_issues
278 SET issues = REPLACE(issues, \'phone\', \'\')
279 WHERE pid = {?}', $pid);
74e1e725 280 }
0444be72 281 unset($duplicates);
74e1e725 282 unset($phones);
74e1e725 283
0444be72
SJ
284 ++$done;
285 ++$aux;
286 if ($aux == 10) {
287 $aux = 0;
288 printf("\r%u / %u", $done, $total);
289 }
290}
291printf("\r%u / %u", $done, $total);
ded51efe
SJ
292print "\n$deleted phones deleted.\n\n";
293
294print "That's all folks!\n";
74e1e725
SJ
295
296/* vim:set et sw=4 sts=4 ts=4: */
297?>