source: trunk/expressoCalendar/inc/class.ui_migration.inc.php @ 6402

Revision 6402, 13.3 KB checked in by acoutinho, 8 years ago (diff)

Ticket #2831 - Implementação ao suporte a repetição de eventos

Line 
1<?php
2class Migra{
3                public $local;
4                public $login;
5                public $senha;
6                public $banco;
7                public $banco2;         
8                public $porta;
9
10                public $current_base;
11                public $new_base;
12               
13                /*
14                *       TODO - Implementar:
15                *       Repetição
16                *       Alarm
17                *       ACL
18                */
19       
20                function __construct()
21                {
22                        include_once dirname(__FILE__ ).'/../../header.inc.php';
23
24                        if (is_array($_SESSION['phpgw_info']['expresso']['server']))
25                                $GLOBALS['phpgw_info']['server'] = $_SESSION['phpgw_info']['expresso']['server'];
26                        else
27                        $_SESSION['phpgw_info']['expresso']['server'] = $GLOBALS['phpgw_info']['server'];
28                                       
29                        $local = $_SESSION['phpgw_info']['expresso']['server']['db_host'];
30                        $login = $_SESSION['phpgw_info']['expresso']['server']['db_user'];
31                        $senha = $_SESSION['phpgw_info']['expresso']['server']['db_pass'];
32                        $banco = $_SESSION['phpgw_info']['expresso']['server']['db_name'];
33                        $porta = $_SESSION['phpgw_info']['expresso']['server']['db_port'];
34                        $banco2 = $banco;
35
36                        $this->current_base = pg_connect("host='$local' port='$porta' dbname='$banco' user='$login' password='$senha'");
37                        $this->new_base = pg_connect("host='$local' port='$porta' dbname='$banco2' user='$login' password='$senha'");
38                }
39               
40                //Verifica e/ou cria agenda
41                function as_calendar($uid){
42                        $sql = "select (calendar_id) FROM calendar_signature where user_uidnumber = ".$uid." and is_owner = 1";         
43                        $result = pg_query($this->new_base ,$sql);
44                        if (!$line = pg_fetch_assoc($result)) {
45                                        $last_resource = pg_query($this->new_base, "insert into calendar (name, location) values('Calendar' , 'Calendar' ) RETURNING id");
46                                        $last = pg_fetch_assoc($last_resource);
47                                       
48                                        $id_resource =  pg_query($this->new_base, "insert into calendar_signature(user_uidnumber, calendar_id, is_owner, font_color, background_color, border_color) values(".$uid.", ".$last['id'].", 1, 'FFFFFF', '3366CC', '3366CC') RETURNING id");
49                                        $calendar = pg_fetch_assoc($id_resource);
50                                        return $calendar['id'];
51                        }else{
52                                $result = pg_query($this->new_base ,$sql);
53                                while($evento = pg_fetch_array($result)){
54                                        return $evento['calendar_id'];
55                                }
56                        }
57                }
58               
59                //Usuarios de um evento
60                function as_user($cal_id, $calendar_object ,$owner){
61                        $sql_select_user = "select * from phpgw_cal_user where cal_id = ".$cal_id;                     
62                        $result = pg_query($this->current_base ,$sql_select_user);
63                               
64                        while($evento = pg_fetch_array($result)){
65                                $sql_insert = "insert into calendar_participant (user_info_id, object_id, is_organizer, acl ,is_external, participant_status_id) values ( ";
66                                $sql_insert .= $evento['cal_login'].", ";
67                                $sql_insert .= $calendar_object.", ";
68                                if ($owner == $evento['cal_login']){
69                                        $sql_insert .= "1, ";
70                                        $sql_insert .= '\'rowi\', ';
71                                }else{
72                                        $sql_insert .= "0, ";
73                                        $sql_insert .= '\'r\', ';
74                                }
75                                $sql_insert .= "0, ";
76                               
77                                if($evento['cal_status'] == 'A')
78                                        $sql_insert .= "1) ";
79                                else if ($evento['cal_status'] == 'U')
80                                        $sql_insert .= "4) ";
81                                else if ($evento['cal_status'] == 'R')
82                                        $sql_insert .= "3) ";
83                                else if ($evento['cal_status'] == 'T')
84                                        $sql_insert .= "2) ";                           
85                                pg_query($this->new_base ,$sql_insert);
86
87                                $Id_Calendar_User = $this->as_calendar($evento['cal_login']);
88                                $sql_insert_relcao = 'insert into calendar_to_calendar_object (calendar_id, calendar_object_id) values ( ';
89                                $sql_insert_relcao .= $Id_Calendar_User.', ';
90                                $sql_insert_relcao .= $calendar_object.' )';
91                                pg_query($this->new_base ,$sql_insert_relcao);
92                               
93                        }
94                }
95
96                function decode_days_repeat($hex){
97                    $bin = str_split( decbin($hex) );
98
99                    $decoded = array('SU','MO','TU','WE','TH','FR','SA');
100                    $returns = array();
101                   
102                    foreach($bin as $key => $value)
103                        if((int)$value == 1)
104                            $returns[] = $decoded[$key];
105
106                    return implode(',', $returns);
107                }
108               
109                //Repetição de um evento
110                function as_repeat($cal_id, $calendar_object ,$startTime){
111                        $sql_select_repeat = "select * from phpgw_cal_repeats where cal_id = ".$cal_id;                 
112                        $result = pg_query($this->current_base ,$sql_select_repeat);
113                               
114                        while($repeat = pg_fetch_array($result)){
115                                $sql_insert = "insert into calendar_repeat (frequency, dtstart, object_id, until, byday, bymonthday, byyearday, interval) values ( ";
116                                $type = '';
117                                $weeklyDays = '';
118                                $byMonthDay = '';
119                                $byYearDay = '';
120                                switch($repeat['recur_type']){
121                                        case 1:
122                                                $type = 'daily';
123                                        break;
124                                        case 2:
125                                                $type = 'weekly';
126                                                $weeklyDays = $this->decode_days_repeat($repeat['recur_data']);
127                                        break;
128                                        case 3:
129                                        case 4:
130                                                $type = 'monthly';
131                                                $day = new DateTime('@' . (int)$startTime, new DateTimeZone('UTC'));
132                                                $byMonthDay = date_format($day, 'j');       
133                                        break;
134                                        case 5:
135                                                $type = 'yearly';
136                                                $day = new DateTime('@' . (int)$startTime, new DateTimeZone('UTC'));
137                                                $byYearDay = (1 + date_format($day, 'z'));   
138                                        break;
139                                }
140                               
141                                $sql_insert .= "'".$type."', ";
142                                $sql_insert .= "'".$startTime."000', ";
143                                $sql_insert .= "'".$calendar_object."', "; 
144                               
145                                $sql_insert .= ($repeat['recur_enddate']) == 0 ? ("'0', ") : ("'".$repeat['recur_enddate']."000',");
146                                $sql_insert .= "'".$weeklyDays."', ";
147                                $sql_insert .= "'".$byMonthDay."', ";
148                                $sql_insert .= "'".$byYearDay."', ";
149                                $sql_insert .= "'".$repeat['recur_interval']."') RETURNING id";
150                                       
151                                $result = pg_query($this->new_base ,$sql_insert);
152                                $repeatEvent = pg_fetch_assoc($result);
153
154                                if($repeat['recur_exception'] != ''){
155
156                                        $ocurrences = explode(',', $repeat['recur_exception']);
157
158                                        foreach($ocurrences as $value){
159                                                $sql_insert_excepetions = 'insert into calendar_repeat_occurrence (occurrence, exception, repeat_id) values ( ';
160                                                $sql_insert_excepetions .= "'".$value."', ";
161                                                $sql_insert_excepetions .= "'1', ";
162                                                $sql_insert_excepetions .= "'".$repeatEvent['id']."' )";
163                                                pg_query($this->new_base ,$sql_insert_excepetions);
164                                        }
165                                }
166
167                               
168                               
169                        }
170                }
171               
172                //Alarmes de um evento
173                function as_alarm($cal_id, $event_id, $date_ini){
174                        $sql_select_evento = "select * from phpgw_async where id like '%".$cal_id."%'";                 
175                        $result = pg_query($this->current_base ,$sql_select_evento);
176                               
177                        while($evento = pg_fetch_array($result)){
178                               
179                                $data = unserialize($evento['data']);
180                           
181                                $attendee = pg_query($this->new_base , "select id from calendar_participant where (user_info_id = '".$data['owner']."' AND object_id = '".$event_id."' )");
182                                $attendee = pg_fetch_array($attendee);
183
184                                $offset = ($date_ini - $evento['next']);
185                               
186                                if($offset < 0)
187                                    continue;
188
189                                $sql_insert = "insert into calendar_alarm (action_id, unit, alarm_offset, time, participant_id, object_id, sent) values ( ";
190                                //action_id
191                                $sql_insert .= "1, ";
192                                //unit
193                                $sql_insert .= "'m', ";
194                                //offset
195                                $sql_insert .= "'".$offset."', ";
196                                //time
197                                $sql_insert .= "'".($offset / 60)."', ";
198                                //participant
199                                $sql_insert .= $attendee['id'] .", ";
200                                //object_id
201                                $sql_insert .= $event_id.", ";
202                                //sent
203                                if($date_ini > time())
204                                        $sql_insert .= "0 ) ";
205                                else
206                                        $sql_insert .= "1 ) ";
207                               
208                                pg_query($this->new_base ,$sql_insert);         
209                        }
210                }
211               
212                //Usuarios externos de um evento
213                function as_user_external($cal_id, $calendar_object ,$owner, $ex_participante){
214               
215                        $participants_ex = base64_decode($ex_participante);
216                        //Participantes externos serializados
217                        try {
218                                $participants_ex = unserialize($participants_ex);
219                                foreach ($participants_ex as $ex){
220                               
221                                        $sql_insert = "insert into calendar_ex_participant (name, mail, owner) values ( ";
222                                        if(array_key_exists('cn', $ex))
223                                                $sql_insert .= "'".addslashes($ex['cn'])."', ";
224                                        else
225                                                $sql_insert .= "'', ";
226                                        $sql_insert .= "'".addslashes($ex['mail'])."', ";
227                                        $sql_insert .= $owner.") RETURNING id";
228                                       
229                                        $result = pg_query($this->new_base ,$sql_insert);
230                                       
231                                        $id_external = pg_fetch_assoc($result);
232                                        $sql_insert = "insert into calendar_participant (user_info_id, object_id, is_organizer, is_external, participant_status_id) values ( ";
233                                        $sql_insert .=  $id_external['id'].", ";
234                                        $sql_insert .=  $calendar_object.", ";
235                                        $sql_insert .=  "0, ";
236                                        $sql_insert .=  "1, ";
237                                        $sql_insert .=  "4 ) ";
238                                               
239                                        pg_query($this->new_base ,$sql_insert);
240                                }
241                        //participantes externos normais
242                        } catch (Exception $e) {
243                                $participants_ex = preg_split('/,/', $ex_participante);
244                               
245                                foreach ($participants_ex as $ex){
246                                        $sql_insert = "insert into calendar_ex_participant (mail, owner) values ( ";
247                                        $sql_insert .= "'".$ex."', ";
248                                        $sql_insert .= $owner.") RETURNING id";
249                                       
250                                        $result = pg_query($this->new_base ,$sql_insert);
251                                       
252                                        $id_external = pg_fetch_assoc($result);
253                                       
254                                       
255                                        $sql_insert = "insert into calendar_participant (user_info_id, object_id, is_organizer, is_external, participant_status_id) values ( ";
256                                        $sql_insert .=  $id_external['id'].", ";
257                                        $sql_insert .=  $calendar_object.", ";
258                                        $sql_insert .=  "0, ";
259                                        $sql_insert .=  "1, ";
260                                        $sql_insert .=  "4 ) ";
261                                        pg_query($this->new_base ,$sql_insert);
262                                       
263                                }                       
264                        }               
265                }
266               
267                //
268                function calendar(){
269                        $sql = "SELECT * FROM phpgw_cal";                       
270                        //Todo
271                        //Implementar Repetição
272
273                        $result = pg_query($this->current_base, $sql);
274                        while($evento = pg_fetch_array($result)){
275                       
276                                $sql_insert = "insert into calendar_object
277                                (
278                                        type_id, cal_uid, dtstamp,
279                                        dtstart, description, dtend,
280                                        location, class_id, last_update,
281                                        range_end, range_start,
282                                        summary, allday, repeat, tzid                   
283                                )               
284                                               
285                        values(";                       
286                                //remove lixos
287                                if($evento['owner'] == 0)
288                                        continue;
289                                if($evento['mdatetime'] == "" or $evento['mdatetime'] == null)
290                                        continue;
291                                if($evento['datetime'] == "" or $evento['datetime'] == null)
292                                        continue;
293                                if($evento['edatetime'] == "" or $evento['edatetime'] == null)
294                                        continue;
295                                //type_id
296                                $sql_insert .= "1, ";
297                                //cal_uid
298                                $sql_insert .= "'".mt_rand()."@Expresso', ";
299                                //$sql_insert .= $this->as_calendar($evento['owner']).", ";
300                                //dtstamp       
301                                $sql_insert .= $evento['mdatetime']."000, ";
302                                //dtstart
303                                $sql_insert .= $evento['datetime']."000, ";
304                                //description
305                                if ($evento['description'] == "" or $evento['description'] == null)
306                                        $sql_insert .= "'', ";
307                                else
308                                        $sql_insert .= "'".addslashes($evento['description'])."', ";
309                                //dtend
310                                $sql_insert .= $evento['edatetime']."000, ";
311                                //location
312                                if ($evento['location'] == "" or $evento['location'] == null)
313                                        $sql_insert .= "'', ";
314                                else
315                                        $sql_insert .= "'".addslashes($evento['location'])."', ";
316                                //class_id
317                                if($evento['is_public'] == 1){
318                                        if($evento['cal_type'] == 'e')
319                                                $sql_insert .= "1, ";
320                                        else
321                                                $sql_insert .= "3, ";
322                                }else
323                                        $sql_insert .= "2, ";
324                                //last_update   
325                                $sql_insert .= $evento['last_update'].", ";
326                                //range_end
327                                $sql_insert .= "'".$evento['edatetime']."000', ";                               
328                                //calendar_id
329                                //$sql_insert .=  $this->as_calendar($evento['owner']).", ";
330                                //range_start
331                                $sql_insert .= "'".$evento['datetime']."000', ";
332                                //summary
333                                if ($evento['title'] == "" or $evento['title'] == null)
334                                        $sql_insert .= "'', ";
335                                else
336                                        $sql_insert .= "'".addslashes($evento['title'])."', ";
337                                //allday
338                                $sql_insert .= "0, ";
339                                //repeat
340                                $sql_insert .= "0, ";
341                                //tzid
342                                $sql_insert .= "'America/Sao_Paulo'";
343                               
344                                $sql_insert .=  " ) RETURNING id";                     
345                                                               
346                                $last_resource = pg_query($this->new_base, $sql_insert);
347                                $calendar = pg_fetch_assoc($last_resource);
348                               
349                                //participantes de um evento
350                                $this->as_user($evento['cal_id'] ,$calendar['id'], $evento['owner']);
351                               
352                                //participantes externos de um evento
353                                if($evento['ex_participants'] != "" and $evento['ex_participants'] != 'YTowOnt9')
354                                        $this->as_user_external($evento['cal_id'] ,$calendar['id'], $evento['owner'], $evento['ex_participants']);     
355                               
356                                //Alarmes de eventos
357                                $this->as_alarm($evento['cal_id'], $calendar['id'], $evento['datetime']) ;
358                               
359                                //Repetição de um evento
360                                $this->as_repeat($evento['cal_id'] ,$calendar['id'], $evento['datetime']);
361                               
362                        }
363                        return 'sucesss';
364                }
365        }
366?>
Note: See TracBrowser for help on using the repository browser.