Changeset 6791


Ignore:
Timestamp:
07/16/12 16:36:21 (7 years ago)
Author:
cristiano
Message:

Ticket #2965 - Problema com hora ao importar evento em Outlook

Location:
trunk/prototype
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/prototype/modules/calendar/interceptors/Notifications.php

    r6528 r6791  
    276276        if ((Config::regGet('ical://' . $schedulable['id'] . '/' . $method) === false) || ($method == 'CANCEL')) { //Verifica se o ical ja não esta no reg 
    277277            $schedulable['URI']['concept'] = 'schedulable'; 
    278             $ical['source'] = Controller::format(array('service' => 'iCal'), array($schedulable), array('method' => $method)); 
    279             $ical['type'] = 'text/plain'; 
    280             $ical['name'] = 'outlook.ics'; 
     278            $ical = Controller::format(array('service' => 'iCal'), array($schedulable), array('method' => $method , 'compatible' => true )); 
    281279            if ($regSet) 
    282280                Config::regSet('ical://' . $schedulable['id'] . '/' . $method, $ical); 
     
    429427     */ 
    430428    private static function sendMail(&$data, &$ical, $to, &$subject, $template, $from = false) { 
    431         $ical2 = $ical; 
     429 
     430 
     431    $ical1['type'] = 'text/plain'; 
     432    $ical1['source'] = $ical['compatible']; 
     433    $ical1['name'] = 'outlook.ics'; 
     434    $ical2['source'] = $ical['ical']; 
    432435        $ical2['type'] = 'text/calendar'; 
    433436        $ical2['name'] = 'thunderbird.ics'; 
     437 
     438        unset($ical); 
    434439        $mail['attachments'][] = $ical2; 
    435         $mail['attachments'][] = $ical; 
     440        $mail['attachments'][] = $ical1; 
     441        unset($ical1); 
     442        unset($ical2); 
    436443        $mail['isHtml'] = true; 
    437444        $mail['body'] = parseTPL::load_tpl($data, ROOTPATH . '/modules/calendar/templates/' . $template . '.tpl'); 
  • trunk/prototype/services/iCal.php

    r6528 r6791  
    1616    static $suportedTimzones = array('Africa/Abidjan', 'Africa/Accra', 'Africa/Addis_Ababa', 'Africa/Algiers', 'Africa/Asmara', 'Africa/Asmera', 'Africa/Bamako', 'Africa/Bangui', 'Africa/Banjul', 'Africa/Bissau', 'Africa/Blantyre', 'Africa/Brazzaville', 'Africa/Bujumbura', 'Africa/Cairo', 'Africa/Casablanca', 'Africa/Ceuta', 'Africa/Conakry', 'Africa/Dakar', 'Africa/Dar_es_Salaam', 'Africa/Djibouti', 'Africa/Douala', 'Africa/El_Aaiun', 'Africa/Freetown', 'Africa/Gaborone', 'Africa/Harare', 'Africa/Johannesburg', 'Africa/Kampala', 'Africa/Khartoum', 'Africa/Kigali', 'Africa/Kinshasa', 'Africa/Lagos', 'Africa/Libreville', 'Africa/Lome', 'Africa/Luanda', 'Africa/Lubumbashi', 'Africa/Lusaka', 'Africa/Malabo', 'Africa/Maputo', 'Africa/Maseru', 'Africa/Mbabane', 'Africa/Mogadishu', 'Africa/Monrovia', 'Africa/Nairobi', 'Africa/Ndjamena', 'Africa/Niamey', 'Africa/Nouakchott', 'Africa/Ouagadougou', 'Africa/Porto-Novo', 'Africa/Sao_Tome', 'Africa/Timbuktu', 'Africa/Tripoli', 'Africa/Tunis', 'Africa/Windhoek', 'America/Adak', 'America/Anchorage', 'America/Anguilla', 'America/Antigua', 'America/Araguaina', 'America/Argentina/Buenos_Aires', 'America/Argentina/Catamarca', 'America/Argentina/ComodRivadavia', 'America/Argentina/Cordoba', 'America/Argentina/Jujuy', 'America/Argentina/La_Rioja', 'America/Argentina/Mendoza', 'America/Argentina/Rio_Gallegos', 'America/Argentina/Salta', 'America/Argentina/San_Juan', 'America/Argentina/San_Luis', 'America/Argentina/Tucuman', 'America/Argentina/Ushuaia', 'America/Aruba', 'America/Asuncion', 'America/Atikokan', 'America/Atka', 'America/Bahia', 'America/Barbados', 'America/Belem', 'America/Belize', 'America/Blanc-Sablon', 'America/Boa_Vista', 'America/Bogota', 'America/Boise', 'America/Buenos_Aires', 'America/Cambridge_Bay', 'America/Campo_Grande', 'America/Cancun', 'America/Caracas', 'America/Catamarca', 'America/Cayenne', 'America/Cayman', 'America/Chicago', 'America/Chihuahua', 'America/Coral_Harbour', 'America/Cordoba', 'America/Costa_Rica', 'America/Cuiaba', 'America/Curacao', 'America/Danmarkshavn', 'America/Dawson_Creek', 'America/Dawson', 'America/Denver', 'America/Detroit', 'America/Dominica', 'America/Edmonton', 'America/Eirunepe', 'America/El_Salvador', 'America/Ensenada', 'America/Fort_Wayne', 'America/Fortaleza', 'America/Glace_Bay', 'America/Godthab', 'America/Goose_Bay', 'America/Grand_Turk', 'America/Grenada', 'America/Guadeloupe', 'America/Guatemala', 'America/Guayaquil', 'America/Guyana', 'America/Halifax', 'America/Havana', 'America/Hermosillo', 'America/Indiana/Indianapolis', 'America/Indiana/Knox', 'America/Indiana/Marengo', 'America/Indiana/Petersburg', 'America/Indiana/Tell_City', 'America/Indiana/Vevay', 'America/Indiana/Vincennes', 'America/Indiana/Winamac', 'America/Indianapolis', 'America/Inuvik', 'America/Iqaluit', 'America/Jamaica', 'America/Jujuy', 'America/Juneau', 'America/Kentucky/Louisville', 'America/Kentucky/Monticello', 'America/Knox_IN', 'America/La_Paz', 'America/Lima', 'America/Los_Angeles', 'America/Louisville', 'America/Maceio', 'America/Managua', 'America/Manaus', 'America/Marigot', 'America/Martinique', 'America/Matamoros', 'America/Mazatlan', 'America/Mendoza', 'America/Menominee', 'America/Merida', 'America/Mexico_City', 'America/Miquelon', 'America/Moncton', 'America/Monterrey', 'America/Montevideo', 'America/Montreal', 'America/Montserrat', 'America/Nassau', 'America/New_York', 'America/Nipigon', 'America/Nome', 'America/Noronha', 'America/North_Dakota/Center', 'America/North_Dakota/New_Salem', 'America/Ojinaga', 'America/Panama', 'America/Pangnirtung', 'America/Paramaribo', 'America/Phoenix', 'America/Port_of_Spain', 'America/Port-au-Prince', 'America/Porto_Acre', 'America/Porto_Velho', 'America/Puerto_Rico', 'America/Rainy_River', 'America/Rankin_Inlet', 'America/Recife', 'America/Regina', 'America/Resolute', 'America/Rio_Branco', 'America/Rosario', 'America/Santa_Isabel', 'America/Santarem', 'America/Santiago', 'America/Santo_Domingo', 'America/Sao_Paulo', 'America/Scoresbysund', 'America/Shiprock', 'America/St_Barthelemy', 'America/St_Johns', 'America/St_Kitts', 'America/St_Lucia', 'America/St_Thomas', 'America/St_Vincent', 'America/Swift_Current', 'America/Tegucigalpa', 'America/Thule', 'America/Thunder_Bay', 'America/Tijuana', 'America/Toronto', 'America/Tortola', 'America/Vancouver', 'America/Virgin', 'America/Whitehorse', 'America/Winnipeg', 'America/Yakutat', 'America/Yellowknife', 'Antarctica/Casey', 'Antarctica/Davis', 'Antarctica/DumontDUrville', 'Antarctica/Macquarie', 'Antarctica/Mawson', 'Antarctica/McMurdo', 'Antarctica/Palmer', 'Antarctica/Rothera', 'Antarctica/South_Pole', 'Antarctica/Syowa', 'Antarctica/Vostok', 'Arctic/Longyearbyen', 'Asia/Aden', 'Asia/Almaty', 'Asia/Amman', 'Asia/Anadyr', 'Asia/Aqtau', 'Asia/Aqtobe', 'Asia/Ashgabat', 'Asia/Ashkhabad', 'Asia/Baghdad', 'Asia/Bahrain', 'Asia/Baku', 'Asia/Bangkok', 'Asia/Beirut', 'Asia/Bishkek', 'Asia/Brunei', 'Asia/Calcutta', 'Asia/Choibalsan', 'Asia/Chongqing', 'Asia/Chungking', 'Asia/Colombo', 'Asia/Dacca', 'Asia/Damascus', 'Asia/Dhaka', 'Asia/Dili', 'Asia/Dubai', 'Asia/Dushanbe', 'Asia/Gaza', 'Asia/Harbin', 'Asia/Ho_Chi_Minh', 'Asia/Hong_Kong', 'Asia/Hovd', 'Asia/Irkutsk', 'Asia/Istanbul', 'Asia/Jakarta', 'Asia/Jayapura', 'Asia/Jerusalem', 'Asia/Kabul', 'Asia/Kamchatka', 'Asia/Karachi', 'Asia/Kashgar', 'Asia/Kathmandu', 'Asia/Katmandu', 'Asia/Kolkata', 'Asia/Krasnoyarsk', 'Asia/Kuala_Lumpur', 'Asia/Kuching', 'Asia/Kuwait', 'Asia/Macao', 'Asia/Macau', 'Asia/Magadan', 'Asia/Makassar', 'Asia/Manila', 'Asia/Muscat', 'Asia/Nicosia', 'Asia/Novokuznetsk', 'Asia/Novosibirsk', 'Asia/Omsk', 'Asia/Oral', 'Asia/Phnom_Penh', 'Asia/Pontianak', 'Asia/Pyongyang', 'Asia/Qatar', 'Asia/Qyzylorda', 'Asia/Rangoon', 'Asia/Riyadh', 'Asia/Saigon', 'Asia/Sakhalin', 'Asia/Samarkand', 'Asia/Seoul', 'Asia/Shanghai', 'Asia/Singapore', 'Asia/Taipei', 'Asia/Tashkent', 'Asia/Tbilisi', 'Asia/Tehran', 'Asia/Tel_Aviv', 'Asia/Thimbu', 'Asia/Thimphu', 'Asia/Tokyo', 'Asia/Ujung_Pandang', 'Asia/Ulaanbaatar', 'Asia/Ulan_Bator', 'Asia/Urumqi', 'Asia/Vientiane', 'Asia/Vladivostok', 'Asia/Yakutsk', 'Asia/Yekaterinburg', 'Asia/Yerevan', 'Atlantic/Azores', 'Atlantic/Bermuda', 'Atlantic/Canary', 'Atlantic/Cape_Verde', 'Atlantic/Faeroe', 'Atlantic/Faroe', 'Atlantic/Jan_Mayen', 'Atlantic/Madeira', 'Atlantic/Reykjavik', 'Atlantic/South_Georgia', 'Atlantic/St_Helena', 'Atlantic/Stanley', 'Australia/ACT', 'Australia/Adelaide', 'Australia/Brisbane', 'Australia/Broken_Hill', 'Australia/Canberra', 'Australia/Currie', 'Australia/Darwin', 'Australia/Eucla', 'Australia/Hobart', 'Australia/LHI', 'Australia/Lindeman', 'Australia/Lord_Howe', 'Australia/Melbourne', 'Australia/NSW', 'Australia/North', 'Australia/Perth', 'Australia/Queensland', 'Australia/South', 'Australia/Sydney', 'Australia/Tasmania', 'Australia/Victoria', 'Australia/West', 'Australia/Yancowinna', 'Europe/Amsterdam', 'Europe/Andorra', 'Europe/Athens', 'Europe/Belfast', 'Europe/Belgrade', 'Europe/Berlin', 'Europe/Bratislava', 'Europe/Brussels', 'Europe/Bucharest', 'Europe/Budapest', 'Europe/Chisinau', 'Europe/Copenhagen', 'Europe/Dublin', 'Europe/Gibraltar', 'Europe/Guernsey', 'Europe/Helsinki', 'Europe/Isle_of_Man', 'Europe/Istanbul', 'Europe/Jersey', 'Europe/Kaliningrad', 'Europe/Kiev', 'Europe/Lisbon', 'Europe/Ljubljana', 'Europe/London', 'Europe/Luxembourg', 'Europe/Madrid', 'Europe/Malta', 'Europe/Mariehamn', 'Europe/Minsk', 'Europe/Monaco', 'Europe/Moscow', 'Europe/Nicosia', 'Europe/Oslo', 'Europe/Paris', 'Europe/Podgorica', 'Europe/Prague', 'Europe/Riga', 'Europe/Rome', 'Europe/Samara', 'Europe/San_Marino', 'Europe/Sarajevo', 'Europe/Simferopol', 'Europe/Skopje', 'Europe/Sofia', 'Europe/Stockholm', 'Europe/Tallinn', 'Europe/Tirane', 'Europe/Tiraspol', 'Europe/Uzhgorod', 'Europe/Vaduz', 'Europe/Vatican', 'Europe/Vienna', 'Europe/Vilnius', 'Europe/Volgograd', 'Europe/Warsaw', 'Europe/Zagreb', 'Europe/Zaporozhye', 'Europe/Zurich', 'Indian/Antananarivo', 'Indian/Chagos', 'Indian/Christmas', 'Indian/Cocos', 'Indian/Comoro', 'Indian/Kerguelen', 'Indian/Mahe', 'Indian/Maldives', 'Indian/Mauritius', 'Indian/Mayotte', 'Indian/Reunion', 'Pacific/Apia', 'Pacific/Auckland', 'Pacific/Chatham', 'Pacific/Easter', 'Pacific/Efate', 'Pacific/Enderbury', 'Pacific/Fakaofo', 'Pacific/Fiji', 'Pacific/Funafuti', 'Pacific/Galapagos', 'Pacific/Gambier', 'Pacific/Guadalcanal', 'Pacific/Guam', 'Pacific/Honolulu', 'Pacific/Johnston', 'Pacific/Kiritimati', 'Pacific/Kosrae', 'Pacific/Kwajalein', 'Pacific/Majuro', 'Pacific/Marquesas', 'Pacific/Midway', 'Pacific/Nauru', 'Pacific/Niue', 'Pacific/Norfolk', 'Pacific/Noumea', 'Pacific/Pago_Pago', 'Pacific/Palau', 'Pacific/Pitcairn', 'Pacific/Ponape', 'Pacific/Port_Moresby', 'Pacific/Rarotonga', 'Pacific/Saipan', 'Pacific/Samoa', 'Pacific/Tahiti', 'Pacific/Tarawa', 'Pacific/Tongatapu', 'Pacific/Truk', 'Pacific/Wake', 'Pacific/Wallis', 'Pacific/Yap', 'UTC'); 
    1717 
    18     public function format($data, $params = false) { 
    19         $timezones = array_flip(self::$timezonesMap); 
    20  
    21         $ical = new icalCreator(); 
    22  
    23         $ical->setProperty('method', isset($params['method']) ? $params['method'] : 'PUBLISH' ); 
    24         $sytemTimezone = (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo'; 
    25         $params['defaultTZI'] = self::nomalizeTZID((isset($params['defaultTZI']) && $params['defaultTZI'] != 'null') ? $params['defaultTZI'] : $sytemTimezone ); 
    26  
    27         /* 
    28          * Seta propiedades obrigatorias para alguns softwares (Outlook) 
    29          */ 
    30         $ical->setProperty('x-wr-calname', 'Calendar Expresso'); 
    31         $ical->setProperty('X-WR-CALDESC', 'Calendar Expresso'); 
    32         $ical->setProperty('X-WR-TIMEZONE', isset($timezones[$params['defaultTZI']]) ? $timezones[$params['defaultTZI']] : $params['defaultTZI']); 
    33  
    34         foreach ($data as $i => $v) { 
    35  
    36             switch ($v['type']) { 
    37                 case EVENT_ID: 
    38                     $vevent = $ical->newComponent('vevent'); 
    39  
    40                     $vevent->setProperty('summary', $v['summary']); 
    41                     $vevent->setProperty('description', isset($v['description']) ? $v['description'] : ''); 
    42                     $vevent->setProperty('location', $v['location']); 
    43                     $vevent->setProperty('tranp', (isset($v['tranparent']) && $v['tranparent'] == TRANSP_TRANSPARENT ) ? 'TRANSPARENT' : 'OPAQUE' ); 
    44  
    45                     $timezone = new DateTimeZone('UTC'); 
    46                     $apTimezone = self::nomalizeTZID(( isset($v['timezone']) && $v['timezone'] != 'null' ) ? $v['timezone'] : $params['defaultTZI']); 
    47                     $apTimezoneOBJ = new DateTimeZone($apTimezone); 
    48  
    49                     $sTime = new DateTime('@' . (int) ($v['startTime'] / 1000), $timezone); 
    50                     $sTime->setTimezone($apTimezoneOBJ); 
    51                     $eTime = new DateTime('@' . (int) ($v['endTime'] / 1000), $timezone); 
    52                     $eTime->setTimezone($apTimezoneOBJ); 
    53  
    54                     if (( isset($v['repeat']) ) && ( $v['repeat']['frequency'] != 'none' )) { 
    55                         $repeat = array(); 
    56  
    57                         foreach ($v['repeat'] as $ir => $rv) { 
    58                             if ($rv) { 
    59                                 if ($ir == 'frequency' && $rv !== 'none') 
    60                                     $repeat['FREQ'] = $rv; 
    61                                 else if ($ir == 'endTime') { 
    62                                     $time = new DateTime('@' . (int) ($rv / 1000), $timezone); 
    63                                     $time->setTimezone($apTimezoneOBJ); 
    64                                     $repeat['until'] = $time->format(DATE_RFC822); 
    65                                 } else if ($ir == 'count') 
    66                                     $repeat[$ir] = $rv; 
    67                                 else if ($ir == 'interval') 
    68                                     $repeat[$ir] = $rv; 
    69                                 else if ($ir !== 'schedulable' && $ir !== 'id' && $ir !== 'startTime') 
    70                                     $repeat[$ir] = explode(',', $rv); 
     18    public function format($data, $params = false)  
     19    { 
     20                $timezones = array_flip(self::$timezonesMap); 
     21                $sytemTimezone = (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo'; 
     22                $params['defaultTZI'] = self::nomalizeTZID((isset($params['defaultTZI']) && $params['defaultTZI'] != 'null') ? $params['defaultTZI'] : $sytemTimezone ); 
     23                $params['X-WR-TIMEZONE'] = isset($timezones[$params['defaultTZI']]) ? $timezones[$params['defaultTZI']] : $params['defaultTZI']; 
     24                 
     25                return (isset($params['compatible']) && $params['compatible']) ? 
     26                                        array('ical' => $this->createIcal($data, $params) , 'compatible' => $this->createCompatibleIcal($data, $params)) :  
     27                                        $this->createIcal($data, $params); 
     28 
     29    } 
     30 
     31    protected function createIcal($data, $params = false ) 
     32    { 
     33        $ical = new icalCreator(); 
     34                $ical->setProperty('method', isset($params['method']) ? $params['method'] : 'PUBLISH' ); 
     35 
     36                /* 
     37                 * Seta propiedades obrigatorias para alguns softwares (Outlook) 
     38                 */ 
     39                $ical->setProperty('x-wr-calname', 'Calendar Expresso'); 
     40                $ical->setProperty('X-WR-CALDESC', 'Calendar Expresso'); 
     41                $ical->setProperty('X-WR-TIMEZONE', $params['X-WR-TIMEZONE']); 
     42 
     43                foreach ($data as $i => $v) { 
     44 
     45                    switch ($v['type']) { 
     46                        case EVENT_ID: 
     47                            $vevent = $ical->newComponent('vevent'); 
     48 
     49                            $vevent->setProperty('summary', $v['summary']); 
     50                            $vevent->setProperty('description', isset($v['description']) ? $v['description'] : ''); 
     51                            $vevent->setProperty('location', $v['location']); 
     52                            $vevent->setProperty('tranp', (isset($v['tranparent']) && $v['tranparent'] == TRANSP_TRANSPARENT ) ? 'TRANSPARENT' : 'OPAQUE' ); 
     53 
     54                            $timezone = new DateTimeZone('UTC'); 
     55                            $apTimezone = self::nomalizeTZID(( isset($v['timezone']) && $v['timezone'] != 'null' ) ? $v['timezone'] : $params['defaultTZI']); 
     56                            $apTimezoneOBJ = new DateTimeZone($apTimezone); 
     57 
     58                            $sTime = new DateTime('@' . (int) ($v['startTime'] / 1000), $timezone); 
     59                            $sTime->setTimezone($apTimezoneOBJ); 
     60                            $eTime = new DateTime('@' . (int) ($v['endTime'] / 1000), $timezone); 
     61                            $eTime->setTimezone($apTimezoneOBJ); 
     62 
     63                            if (( isset($v['repeat']) ) && ( isset($v['repeat']['frequency']) && $v['repeat']['frequency'] && $v['repeat']['frequency'] != 'none' ))  
     64                                    $vevent->setProperty('rrule', $this->formatIcalRepeat($v['repeat'])); 
     65                             
     66 
     67                            if (isset($v['allDay']) && $v['allDay'] == 1) { 
     68                                $vevent->setProperty('dtstart', $sTime->format(DATE_RFC822), array("VALUE" => "DATE")); 
     69                                $vevent->setProperty('dtend', $eTime->format(DATE_RFC822), array("VALUE" => "DATE")); 
     70                                $vevent->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'TRUE'); 
     71                            } else { 
     72                                $vevent->setProperty('dtstart', $sTime->format(DATE_RFC822), array('TZID' => $apTimezone)); 
     73                                $vevent->setProperty('dtend', $eTime->format(DATE_RFC822), array('TZID' => $apTimezone)); 
     74                                $vevent->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'FALSE'); 
    7175                            } 
    72                         } 
    73  
    74                         if (isset($repeat['FREQ'])) 
    75                             $vevent->setProperty('rrule', $repeat); 
     76                                             
     77                            if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0) 
     78                                $participants = $v['participants']; 
     79                            else 
     80                                        $participants = Controller::find(array('concept' => 'participant'), false, array('filter' => array('=', 'schedulable', $v['id']))); 
     81                             
     82                                if (is_array($participants) && count($participants) > 0) 
     83                                        foreach ($participants as $ii => $vv) { 
     84                                         
     85                                                if(isset($participants[$ii]['user']) && !is_array($participants[$ii]['user'])) 
     86                                                { 
     87                                                        if ($vv['isExternal'] == 1) 
     88                                                                $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'], 'service' => 'PostgreSQL')); 
     89                                                        else 
     90                                                                $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'])); 
     91                                                } 
     92                                         
     93                                                if ($participants[$ii]['user']['id'] == Config::me('uidNumber')) 
     94                                                { 
     95                                                        $alarms = (isset($participants[$ii]['alarms'])) ? $participants[$ii]['alarms'] : Controller::find(array('concept' => 'alarm'), null, array('filter' => array('AND', array('=', 'participant', $vv['id']), array('=', 'schedulable', $v['id'])))); 
     96                                                        if(is_array($alarms)) 
     97                                                                self::createAlarms($alarms, $vevent); 
     98                                                } 
     99                                         
     100                                        } 
     101                             
     102                            if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0) 
     103                                        $this->createAttendee($v['participants'], $vevent); 
     104 
     105                            if (isset($v['attachments']) && is_array($v['attachments']) && count($v['attachments']) > 0) 
     106                                        $this->createAttachment($v['attachments'], $vevent); 
     107 
     108                            $vevent->setProperty('uid', $v['uid']);   
     109                             
     110                            break; 
     111 
     112                        default: 
     113                            break; 
    76114                    } 
    77  
    78                     if (isset($v['allDay']) && $v['allDay'] == 1) { 
    79                         $vevent->setProperty('dtstart', $sTime->format(DATE_RFC822), array("VALUE" => "DATE")); 
    80                         $vevent->setProperty('dtend', $eTime->format(DATE_RFC822), array("VALUE" => "DATE")); 
    81                         $vevent->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'TRUE'); 
    82                     } else { 
    83                         $vevent->setProperty('dtstart', $sTime->format(DATE_RFC822), array('TZID' => $apTimezone)); 
    84                         $vevent->setProperty('dtend', $eTime->format(DATE_RFC822), array('TZID' => $apTimezone)); 
    85                         $vevent->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'FALSE'); 
     115                }        
     116 
     117         
     118                return $ical->createCalendar(); 
     119    } 
     120 
     121    protected function createCompatibleIcal($data, $params = false ) 
     122    { 
     123        $ical = new icalCreator(); 
     124                $ical->setProperty('method', isset($params['method']) ? $params['method'] : 'PUBLISH' ); 
     125 
     126                /* 
     127                 * Seta propiedades obrigatorias para alguns softwares (Outlook) 
     128                 */ 
     129                $ical->setProperty('x-wr-calname', 'Calendar Expresso'); 
     130                $ical->setProperty('X-WR-CALDESC', 'Calendar Expresso'); 
     131                $ical->setProperty('X-WR-TIMEZONE', $params['X-WR-TIMEZONE']); 
     132 
     133                foreach ($data as $i => $v) { 
     134 
     135                    switch ($v['type']) { 
     136                        case EVENT_ID: 
     137                            $vevent = $ical->newComponent('vevent'); 
     138 
     139                            $vevent->setProperty('summary', $v['summary']); 
     140                            $vevent->setProperty('description', isset($v['description']) ? $v['description'] : ''); 
     141                            $vevent->setProperty('location', $v['location']); 
     142                            $vevent->setProperty('tranp', (isset($v['tranparent']) && $v['tranparent'] == TRANSP_TRANSPARENT ) ? 'TRANSPARENT' : 'OPAQUE' ); 
     143 
     144                            $timezone = new DateTimeZone('UTC'); 
     145                            $sTime = new DateTime('@' . (int) ($v['startTime'] / 1000), $timezone); 
     146                            $eTime = new DateTime('@' . (int) ($v['endTime'] / 1000), $timezone); 
     147 
     148                            if (( isset($v['repeat']) ) && ( isset($v['repeat']['frequency']) && $v['repeat']['frequency'] && $v['repeat']['frequency'] != 'none' ))  
     149                                    $vevent->setProperty('rrule', $this->formatIcalRepeat($v['repeat'])); 
     150 
     151                            if (isset($v['allDay']) && $v['allDay'] == 1) { 
     152                                $vevent->setProperty('dtstart', $sTime->format(DATE_RFC822), array("VALUE" => "DATE")); 
     153                                $vevent->setProperty('dtend', $eTime->format(DATE_RFC822), array("VALUE" => "DATE")); 
     154                                $vevent->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'TRUE'); 
     155                            } else { 
     156                                $vevent->setProperty('dtstart', $sTime->format(DATE_RFC822)); 
     157                                $vevent->setProperty('dtend', $eTime->format(DATE_RFC822)); 
     158                                $vevent->setProperty('X-MICROSOFT-CDO-ALLDAYEVENT', 'FALSE'); 
     159                            } 
     160                                             
     161                            if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0) 
     162                                $participants = $v['participants']; 
     163                            else 
     164                                        $participants = Controller::find(array('concept' => 'participant'), false, array('filter' => array('=', 'schedulable', $v['id']))); 
     165                             
     166                                if (is_array($participants) && count($participants) > 0) 
     167                                        foreach ($participants as $ii => $vv) { 
     168                                         
     169                                                if(isset($participants[$ii]['user']) && !is_array($participants[$ii]['user'])) 
     170                                                { 
     171                                                        if ($vv['isExternal'] == 1) 
     172                                                                $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'], 'service' => 'PostgreSQL')); 
     173                                                        else 
     174                                                                $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'])); 
     175                                                } 
     176                                         
     177                                                if ($participants[$ii]['user']['id'] == Config::me('uidNumber')) 
     178                                                { 
     179                                                        $alarms = (isset($participants[$ii]['alarms'])) ? $participants[$ii]['alarms'] : Controller::find(array('concept' => 'alarm'), null, array('filter' => array('AND', array('=', 'participant', $vv['id']), array('=', 'schedulable', $v['id'])))); 
     180                                                        if(is_array($alarms)) 
     181                                                                self::createAlarms($alarms, $vevent); 
     182                                                } 
     183                                         
     184                                        } 
     185                             
     186 
     187                            if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0) 
     188                                        $this->createAttendee($v['participants'], $vevent); 
     189 
     190                            if (isset($v['attachments']) && is_array($v['attachments']) && count($v['attachments']) > 0) 
     191                                        $this->createAttachment($v['attachments'], $vevent); 
     192 
     193                            $vevent->setProperty('uid', $v['uid']);   
     194                             
     195                            break; 
     196 
     197                        default: 
     198                            break; 
    86199                    } 
    87                                      
    88                     if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0) 
    89                         $participants = $v['participants']; 
    90                     else 
    91                                 $participants = Controller::find(array('concept' => 'participant'), false, array('filter' => array('=', 'schedulable', $v['id']))); 
    92                      
    93                         if (is_array($participants) && count($participants) > 0) 
    94                                 foreach ($participants as $ii => $vv) { 
    95                                  
    96                                         if(isset($participants[$ii]['user']) && !is_array($participants[$ii]['user'])) 
    97                                         { 
    98                                                 if ($vv['isExternal'] == 1) 
    99                                                         $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'], 'service' => 'PostgreSQL')); 
    100                                                 else 
    101                                                         $participants[$ii]['user'] = Controller::read(array('concept' => 'user', 'id' => $vv['user'])); 
    102                                         } 
    103                                  
    104                                         if ($participants[$ii]['user']['id'] == Config::me('uidNumber')) 
    105                                         { 
    106                                                 $alarms = (isset($participants[$ii]['alarms'])) ? $participants[$ii]['alarms'] : Controller::find(array('concept' => 'alarm'), null, array('filter' => array('AND', array('=', 'participant', $vv['id']), array('=', 'schedulable', $v['id'])))); 
    107                                                 if(is_array($alarms)) 
    108                                                         self::createAlarms($alarms, $vevent); 
    109                                         } 
    110                                  
    111                                 } 
    112                      
    113  
    114                     if (isset($v['participants']) && is_array($v['participants']) && count($v['participants']) > 0) 
    115                                 $this->createAttendee($v['participants'], $vevent); 
    116  
    117                     if (isset($v['attachments']) && is_array($v['attachments']) && count($v['attachments']) > 0) 
    118                                 $this->createAttachment($v['attachments'], $vevent); 
    119  
    120                     $vevent->setProperty('uid', $v['uid']);   
    121                      
    122                     break; 
    123  
    124                 default: 
    125                     break; 
    126             } 
    127         } 
     200                }        
    128201 
    129202         
    130         return $ical->createCalendar(); 
    131     } 
     203                return $ical->createCalendar(); 
     204    } 
     205 
     206    protected function formatIcalRepeat($pRepeat) 
     207    { 
     208        $repeat = array(); 
     209 
     210                foreach ($pRepeat as $ir => $rv) { 
     211                    if ($rv) { 
     212                        if ($ir == 'frequency' && $rv !== 'none') 
     213                            $repeat['FREQ'] = $rv; 
     214                        else if ($ir == 'endTime') { 
     215                            $time = new DateTime('@' . (int) ($rv / 1000), $timezone); 
     216                            $time->setTimezone($apTimezoneOBJ); 
     217                            $repeat['until'] = $time->format(DATE_RFC822); 
     218                        } else if ($ir == 'count') 
     219                            $repeat[$ir] = $rv; 
     220                        else if ($ir == 'interval') 
     221                            $repeat[$ir] = $rv; 
     222                        else if ($ir !== 'schedulable' && $ir !== 'id' && $ir !== 'startTime') 
     223                            $repeat[$ir] = explode(',', $rv); 
     224                    } 
     225                } 
     226                return $repeat; 
     227    } 
     228 
    132229     
    133230    public function createAlarms($alarms, &$vevent) 
Note: See TracChangeset for help on using the changeset viewer.