- Timestamp:
- 03/13/12 18:23:02 (12 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/prototype/modules/calendar/interceptors/DBMapping.php
r5682 r5715 7 7 class DBMapping extends Helpers { 8 8 9 public function encodeCreateSchedulable( &$uri , &$params , &$criteria , $original ){ 10 $params['type_id'] = EVENT_ID; 11 12 13 if(!is_numeric($params['startTime']) ) 14 $params['startTime'] = strtotime( $params['startTime'] . ' ' .$params['timezone']).'000'; 9 public function encodeCreateSchedulable( &$uri , &$params , &$criteria , $original ){ 10 $params['type_id'] = EVENT_ID; 11 12 if(!is_numeric($params['startTime']) ) 13 $params['startTime'] = self::parseTimeDate( $params['startTime'], $params['timezone'] ); 15 14 16 17 $params['endTime'] = strtotime( $params['endTime'] . ' ' .$params['timezone']).'000';18 19 20 21 15 if (!is_numeric($params['endTime'])){ 16 $params['endTime'] = self::parseTimeDate( $params['endTime'], $params['timezone'] ); 17 18 if($params['allDay']) 19 $params['endTime'] = $params['endTime'] + 86400000; 20 } 22 21 // if( !isset( $new['repeat'] )) 23 22 // $new['range_end'] = '7287926400'; // 12/12/2200 24 23 // else 25 24 $params['rangeEnd'] = $params['endTime']; 26 25 $params['rangeStart'] = $params['startTime']; 27 26 28 27 /////////////////////////////////////////////////////////////////// … … 32 31 $params['type'] = EVENT_ID; 33 32 $params['uid'] = isset($params['uid']) ? $params['uid'] : $this->_makeUid(); 34 35 } 33 } 34 35 static function parseTimeDate($time, $timezone){ 36 return strtotime( $time . ' ' .$timezone).'000'; 37 } 36 38 37 39 public function encodeCreateAlarm( &$uri , &$params , &$criteria , $original ){ … … 89 91 if(isset($params['isExternal']) && $params['isExternal'] == '1') 90 92 $uri['service'] = 'PostgreSQL'; 91 } 93 } 94 95 public function prepareRepeat(&$uri , &$params , &$criteria , $original ){ 96 97 $timezone = Controller::read( array( 'concept' => 'schedulable', 'id' => $params['schedulable'] ), array('timezone') ); 98 $params['startTime'] = self::parseTimeDate( $params['startTime'], $timezone['timezone'] ); 99 $params['endTime'] = self::parseTimeDate( $params['endTime'], $timezone['timezone'] ); 100 } 92 101 93 public function findSchedulable( &$uri , &$params , &$criteria , $original )102 public function findSchedulable( &$uri , &$params , &$criteria , $original ) 94 103 { 95 104 if(isset($criteria['filter'][3][1]) && $criteria['filter'][3][1] == 'calendar') 96 105 { 97 $select = 'calendar_object.id as id ,calendar_object.cal_uid as "uid" , calendar_object.type_id as "type", calendar_object.dtstart as "startTime", calendar_object.summary as "summary", calendar_object.description as "description", calendar_object.dtend as "endTime" , calendar_object.location as "location", calendar_object.allday as "allDay", calendar_object.transp as "transparent", calendar_object.class_id as "class", calendar_object.repeat as "repeat", calendar_object.range_start as "rangeStart",calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence", calendar_object.tzid as "timezone" ,calendar_to_calendar_object.calendar_id as calendar'; 98 $sql = " SELECT $select FROM calendar_to_calendar_object , calendar_object WHERE (range_start >= '".$criteria['filter'][1][2]."' AND range_end <= '".$criteria['filter'][2][2]."' AND calendar_to_calendar_object.calendar_id IN ('". implode('\',\'', $criteria['filter'][3][2])."')) AND calendar_to_calendar_object.calendar_object_id = calendar_object.id"; 99 $params = Controller::service('PostgreSQL')->execResultSql($sql); 106 $start = $criteria['filter'][1][2]; 107 $end = $criteria['filter'][2][2]; 108 109 $sql = ' SELECT calendar_object.id as id ,calendar_object.cal_uid as "uid", calendar_object.type_id as "type", calendar_object.dtstart as "startTime", calendar_object.summary as "summary", calendar_object.description as "description", calendar_object.dtend as "endTime" , calendar_object.location as "location", calendar_object.allday as "allDay", calendar_object.transp as "transparent", calendar_object.class_id as "class", calendar_object.repeat as "repeat", calendar_object.range_start as "rangeStart",calendar_object.range_end as "rangeEnd", calendar_object.last_update as "lastUpdate", calendar_object.dtstamp as "dtstamp", calendar_object.sequence as "sequence", calendar_object.tzid as "timezone" ,calendar_to_calendar_object.calendar_id as calendar FROM calendar_to_calendar_object , calendar_object WHERE (range_start >= \''.$start.'\' AND range_end <= \''.$end.'\' AND calendar_to_calendar_object.calendar_id IN (\''. implode('\',\'', $criteria['filter'][3][2]).'\')) AND calendar_to_calendar_object.calendar_object_id = calendar_object.id'; 110 111 $params = Controller::service('PostgreSQL')->execResultSql($sql); 100 112 $params = self::deepnessFindEvent( &$uri , &$params , &$criteria , $original); 113 114 $occ = self::checkOccurrences( $criteria['filter'][1][2], $criteria['filter'][2][2], intval($criteria['deepness']) + 1 ); 115 116 if( $occ ) 117 $params = array_merge( $params, $occ ); 118 101 119 return false; 102 120 } 103 121 } 122 123 public function deepnessFindRepeatOccurrence( &$uri , &$result , &$criteria , $original ) 124 { 125 126 if( !isset($criteria['deepness']) || $criteria['deepness'] == 0 ) 127 return; 128 129 foreach( $result as $i => &$res ) 130 if( isset($res['repeat']) ) 131 $res['repeat'] = Controller::read( array( 'concept' => 'repeat', 'id' => $res['repeat'] ), false, array( 'deepness' => intval( $criteria['deepness'] ) - 1 ) ); 132 } 133 134 public function deepnessRepeat( &$uri , &$result , &$criteria , $original ) 135 { 136 137 if( !isset($criteria['deepness']) || $criteria['deepness'] == 0 ) 138 return; 139 140 $result['schedulable'] = Controller::find( array( 'concept' => 'schedulable' ), false, array( 'filter' => array( '=', 'id', $result['schedulable'] ), 'deepness' => intval( $criteria['deepness'] ) - 1 ) ); 141 $result['schedulable'] = $result['schedulable'][0]; 142 } 143 144 public function saveOccurrences( &$uri , &$result , &$criteria , $original ){ 145 146 $ranges = Controller::find( array( 'concept' => 'repeatRange' ), array( 'rangeStart', 'rangeEnd' ), array( 'filter' => array( '=', 'user', Config::me("uidNumber") ) ) ); 147 148 if( !is_array( $ranges ) || !isset( $ranges[0]['rangeStart'] ) || !isset( $ranges[0]['rangeEnd'] ) ) 149 return; 150 151 if( isset( $result['id'] ) ) 152 $id = $result['id']; 153 else 154 $id = $uri['id']; 155 156 $repeat = Controller::read( array( 'concept' => 'repeat', 'id' => $id ) ); 157 158 unset( $repeat['schedulable'] ); 159 unset( $repeat['id'] ); 160 161 $params = self::decodeRepeat( $repeat, $ranges[0]['rangeStart'], $ranges[0]['rangeEnd'] ); 162 163 Controller::delete( array( 'concept' => 'repeatOccurrence' ), false, array( 'filter' => array( '=', 'repeat', $id ) ) ); 164 165 if( !empty($params) ) 166 Controller::service('PostgreSQL')->execResultSql( "INSERT INTO calendar_repeat_occurrence(repeat_id,occurrence)VALUES('".$id."', '".implode( "'),('".$id."','", $params )."')" ); 167 168 } 169 170 public function checkOccurrences( $start, $end, $deep ){ 171 172 $ranges = Controller::find( array( 'concept' => 'repeatRange' ), array( 'rangeStart', 'rangeEnd' ), array( 'filter' => array( '=', 'user', Config::me("uidNumber") ) ) ); 173 $ranges = $ranges[0]; 174 175 $origStart = $start; 176 $origEnd = $end; 177 178 if( $initialized = (isset($ranges['rangeStart']) && isset($ranges['rangeEnd'])) ) 179 { 180 if( $ranges['rangeStart'] <= $start ) 181 $start = false; 182 if( $ranges['rangeEnd'] >= $end ) 183 $end = false; 184 } 185 186 $repeats = self::findRepeats(); 187 188 if( !is_array( $repeats ) || empty( $repeats ) ) 189 return( false ); 190 191 $result = array(); 192 $ids = array(); 193 194 foreach( $repeats as $repeat ) 195 { 196 $ids[] = $id = $repeat['id']; unset( $repeat['id'] ); 197 198 if( !isset( $result[ $id ] ) ) 199 $result[ $id ] = array(); 200 201 if( !$initialized ) 202 $result[ $id ] = array_merge( $result[ $id ], self::decodeRepeat( $repeat, $start, $end ) ); 203 else 204 { 205 if( $start ) 206 $result[ $id ] = array_merge( $result[ $id ], self::decodeRepeat( $repeat, $start, $ranges['rangeStart'] ) ); 207 208 if( $end ) 209 $result[ $id ] = array_merge( $result[ $id ], self::decodeRepeat( $repeat, $ranges['rangeEnd'], $end ) ); 210 } 211 212 if( empty( $result[ $id ] ) ) 213 unset( $result[ $id ] ); 214 } 215 216 if( $start || $end ) 217 { 218 Controller::begin( array( 'service' => 'PostgreSQL') ); 219 220 foreach( $result as $id => $res ) 221 Controller::service('PostgreSQL')->execResultSql( "INSERT INTO calendar_repeat_occurrence(repeat_id,occurrence)VALUES('".$id."','".implode( "'),('".$id."', '", $res )."')" ); 222 223 $data = array(); 224 225 if( $start ) 226 $data['rangeStart'] = $start; 227 228 if( $end ) 229 $data['rangeEnd'] = $end; 230 231 if( !$initialized ) 232 $data['user'] = Config::me( 'uidNumber' ); 233 234 Controller::call( ( $initialized ? 'replace' : 'create' ), array( 'concept' => 'repeatRange' ), $data, array( 'filter' => array( '=', 'user', Config::me('uidNumber') ) ) ); 235 236 Controller::commit( array( 'service' => 'PostgreSQL' ) ); 237 } 238 239 $return = Controller::find( array( 'concept' => 'repeatOccurrence' ), false, array( 'filter' => array( 'AND', array( '>=', 'occurrence', $origStart ), array( '<=', 'occurrence', $origEnd ), array( 'IN', 'repeat', $ids ) ), 'deepness' => $deep ) ); 240 241 if( !is_array( $return ) ) 242 return( false ); 243 244 $result = array(); 245 $params = array(); 246 247 foreach( $return as $ret ) 248 { 249 $currentId = $ret['repeat']['schedulable']['id']; 250 251 if( !isset( $result[ $currentId ] ) ) 252 { 253 $result[ $currentId ] = $ret['repeat']['schedulable']; 254 $result[ $currentId ][ 'occurrences' ] = array(); 255 256 $calendarToCalendarObj = self::schedulable2calendarToObject( $currentId ); 257 258 $result[ $currentId ]['calendar'] = $calendarToCalendarObj[0]['calendar_id']; 259 260 unset( $result[ $currentId ]['repeat'] ); 261 } 262 263 $result[ $currentId ][ 'occurrences' ][] = $ret['occurrence']; 264 265 } 266 267 foreach( $result as $id => $res ) 268 $params[] = $res; 269 270 return( $params ); 271 } 272 273 public static function findRepeats() 274 { 275 return Controller::service('PostgreSQL')->execResultSql( 'SELECT calendar_repeat.wkst as "wkst", calendar_repeat.byweekno as "byweekno", calendar_repeat.byminute as "byminute", calendar_repeat.bysecond as "bysecond", calendar_repeat.byyearday as "byyearday", calendar_repeat.bymonthday as "bymonthday", calendar_repeat.bysetpos as "bysetpos", calendar_repeat.byday as "byday", calendar_repeat.byhour as "byhour", calendar_repeat.interval as "interval", calendar_repeat.frequency as "frequency", calendar_repeat.until as "endTime", calendar_repeat.id as "id", calendar_repeat.count as "count", calendar_repeat.dtstart as "startTime" FROM calendar_repeat, calendar_participant WHERE calendar_repeat.object_id = calendar_participant.object_id AND calendar_participant.user_info_id = \''.Config::me('uidNumber').'\'' ); 276 } 277 278 //HELPERS 279 public static function decodeRepeat( $repeat , $start , $end ) { 280 281 date_default_timezone_set( 'UTC' ); 282 283 require_once ROOTPATH.'/plugins/when/When.php'; 284 285 $r = new When(); 286 287 if( $repeat['frequency'] === 'none' ) 288 return( array() ); 289 290 $start = new DateTime( '@'.(int)( max( $start, $repeat['startTime'] ) / 1000 ), new DateTimeZone('UTC') ); 291 292 foreach($repeat as $rule => $value) 293 { 294 if( !isset( $value ) || !$value || $value === "0" ) 295 continue; 296 297 switch(strtolower($rule)) 298 { 299 case "starttime": break; 300 case "frequency": 301 $r->recur( $start, $value ); 302 break; 303 case "endtime": 304 $r->until( new DateTime( '@'.(int)( $value / 1000 ) ) ); 305 break; 306 case "count": case "interval": case "wkst": 307 $r->$rule( $value ); 308 break; 309 default : 310 $r->$rule( !is_array( $value ) ? explode( ',' , $value ) : $value ); 311 break; 312 } 313 } 314 315 $return = array(); 316 317 while($result = $r->next()) 318 { 319 $u = $result->format('U') * 1000; 320 321 if( $u > $end ) //data da repetição atual maior que a data final da busca do usuario ? 322 break; 323 324 $return[] = $u; 325 } 326 327 return( $return ); 328 } 104 329 105 330 /////////////////////////////////////////////////////////////////////////////////////////////////////////////// … … 200 425 201 426 public function deepnessFindCalendarShared( &$uri , &$result , &$criteria , $original ){ 202 if(isset($original['criteria']['deepness']) && count($result) > 0){427 if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != '0' && count($result) > 0){ 203 428 $calendarIds = array(); 204 429 foreach($result as $key => $value) … … 234 459 public function deepnessFindEvent( &$uri , &$result , &$criteria , $original ){ 235 460 236 if(isset($original['criteria']['deepness']) )461 if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) 237 462 { 238 463 … … 286 511 287 512 288 289 $attachmentRelation = Controller::find( array( 'concept' => 'schedulableToAttachment' ) , false ,array( 'filter' => array('=', 'schedulable' , $v['id']) )); 290 if(is_array($attachmentRelation)){ 291 $attachments = array(); 292 foreach($attachmentRelation as $key => $value) 293 if(isset($value['attachment']) || !!$value['attachment']) 294 $attachments[$key] = $value['attachment']; 295 //Pega os anexos sem source 296 $result[$i]['attachments'] = Controller::find( array( 'concept' => 'attachment' ) , array('id', 'name', 'type', 'size') ,array( 'filter' => array('IN', 'id' , $attachments) )); 297 } 298 299 } 513 514 $attachmentRelation = Controller::find( array( 'concept' => 'schedulableToAttachment' ) , false ,array( 'filter' => array('=', 'schedulable' , $v['id']) )); 515 if(is_array($attachmentRelation)){ 516 $attachments = array(); 517 foreach($attachmentRelation as $key => $value) 518 if(isset($value['attachment']) || !!$value['attachment']) 519 $attachments[$key] = $value['attachment']; 520 //Pega os anexos sem source 521 $result[$i]['attachments'] = Controller::find( array( 'concept' => 'attachment' ) , array('id', 'name', 'type', 'size') ,array( 'filter' => array('IN', 'id' , $attachments) )); 522 } 523 524 if(isset($result[$i]['repeat'])){ 525 $repeat = Controller::read( array( 'concept' => 'repeat', 'id' => $result[$i]['repeat'] ) ); 526 527 if( !is_array($repeat) ) 528 unset( $result[$i]['repeat'] ); 529 else 530 $result[$i]['repeat'] = $repeat[0]; 531 } 532 } 300 533 301 534 } … … 309 542 public function deepnessReadEvent( &$uri , &$result , &$criteria , $original ){ 310 543 311 if(isset($original['criteria']['deepness']) )544 if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) 312 545 { 313 546 if(isset($result['id'])) … … 334 567 public function deepnessReadParticipant( &$uri , &$result , &$criteria , $original ){ 335 568 336 if(isset($original['criteria']['deepness']) )569 if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) 337 570 { 338 571 if(isset($result['id'])) … … 350 583 public function deepnessFindParticipant( &$uri , &$result , &$criteria , $original ){ 351 584 352 if(isset($original['criteria']['deepness']) )585 if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) 353 586 { 354 587 foreach ($result as $i => $v) … … 369 602 public function deepnessReadCalendarSignature( &$uri , &$result , &$criteria , $original ){ 370 603 371 if(isset($original['criteria']['deepness']) )604 if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) 372 605 if(isset($result['calendar'])){ 373 606 $result['calendar'] = Controller::read( array( 'concept' => 'calendar' , 'id' => $result['calendar'])); … … 380 613 public function deepnessFindCalendarSignature( &$uri , &$result , &$criteria , $original ){ 381 614 382 if(isset($original['criteria']['deepness']) )615 if(isset($original['criteria']['deepness']) && $original['criteria']['deepness'] != 0) 383 616 { 384 617 foreach ($result as $i => $v) … … 387 620 $result[$i]['calendar'] = Controller::read( array( 'concept' => 'calendar' , 'id' => $v['calendar']), false, false); 388 621 $result[$i]['defaultAlarms'] = Controller::find( array( 'concept' => 'calendarSignatureAlarm' ) , false ,array( 'filter' => array('=', 'calendarSignature' , $v['id']) )); 389 //Caso n ão seja o dono da agenda retorna o objeto permission com as acls622 //Caso não seja o dono da agenda retorna o objeto permission com as acls 390 623 if($result[$i]['isOwner'] == 0){ 391 624 $permission = Controller::find( array( 'concept' => 'calendarToPermission'), false ,array( 'filter' => array('AND', array('=', 'calendar' , $v['calendar']), array('=', 'user', Config::me('uidNumber') ) ) ) ); … … 504 737 ))); 505 738 506 return false; /* Mata o restante da execu ção */739 return false; /* Mata o restante da execução */ 507 740 } 508 741 … … 541 774 public function createDefaultSignature( &$uri , &$result , &$criteria , $original ){ 542 775 543 //Caso uma busca n ão retorne nenhum resultado e foi buscado pelas assinaturas do usuario logado apenas776 //Caso uma busca não retorne nenhum resultado e foi buscado pelas assinaturas do usuario logado apenas 544 777 if(count($result) <= 0 && 545 778 ( $original['criteria']['filter'][0] == '=' && … … 592 825 else 593 826 { 594 //Criaremos uma agenda par ão827 //Criaremos uma agenda parão 595 828 $cal = array('name' => 'Calendario', 596 'description' => 'Calendario Padr ão',829 'description' => 'Calendario Padrão', 597 830 'timezone' => (date_default_timezone_get()) ? date_default_timezone_get() : 'America/Sao_Paulo', 598 831 'dtstamp' => time().'000' … … 681 914 continue; 682 915 683 //Cria ção do ical916 //Criação do ical 684 917 $ical = null; 685 918 $ical = new vcalendar(); … … 702 935 /////////////////////////////////////////////////////////////////////////// 703 936 704 //Cria ção do E-mail937 //Criação do E-mail 705 938 $mail = array(); 706 939 $mail['isHtml'] = true; … … 719 952 ),ROOTPATH.'/api/templates/notify_create_body.tpl'); 720 953 721 //TODO: Internacionaliza ção do Subject722 $mail['subject'] = 'Schedulableo do Calend ário : '.$schedulable['summary'] .' @ '.date_format( $sTime , 'd/m/Y H:i') . ' - ' . date_format( $eTime , 'd/m/Y H:i');954 //TODO: Internacionalização do Subject 955 $mail['subject'] = 'Schedulableo do Calendário : '.$schedulable['summary'] .' @ '.date_format( $sTime , 'd/m/Y H:i') . ' - ' . date_format( $eTime , 'd/m/Y H:i'); 723 956 $mail['from'] = $organizer['mail']; 724 957 $mail['to'] = $att[$i]['mail']; … … 759 992 } 760 993 } 761 762 //HELPERS 763 private static function decodeRepeat( $repeat , $start , $end ) { 764 require_once ROOTPATH.'/plugins/when/When.php'; 765 766 $r = new When(); 767 $r->recur( new DateTime( '@'.$start , new DateTimeZone('UTC') ), $repeat['frequency'] ); 768 769 foreach($repeat as $rule => $value) 770 { 771 switch(strtoupper($rule)) 772 { 773 case "ENDTIME": 774 $r->until( new DateTime( '@'.$value ) ); 775 break; 776 case "COUNT": 777 $r->count( $value ); 778 break; 779 case "INTERVAL": 780 $r->interval( $value ); 781 break; 782 case "BYDAY": 783 if( !is_array( $value ) ) 784 $value = explode( ',' , $value ); 785 $r->byday( $value ); 786 break; 787 case "BYMONTHDAY": 788 if( !is_array( $value ) ) 789 $value = explode(',' , $value ); 790 $r->bymonthday($value); 791 break; 792 case "BYYEARDAY": 793 if( !is_array( $value ) ) 794 $value = explode(',', $value ); 795 $r->byyearday( $value ); 796 break; 797 case "BYWEEKNO": 798 if(!is_array( $value )) 799 $value = explode( ',', $value ); 800 $r->byweekno( $value ); 801 break; 802 case "BYMONTH": 803 if( !is_array( $value ) ) 804 $value = explode( ',', $value ); 805 $r->bymonth( $value ); 806 break; 807 case "BYSETPOS": 808 if( !is_array( $value ) ) 809 $value = explode( ',' , $value ); 810 $r->bysetpos( $value ); 811 break; 812 case "WKST": 813 $r->wkst( $value ); 814 break; 815 } 816 } 817 818 $return = array(); 819 820 while($result = $r->next()) 821 { 822 $u = $result->format('U'); 823 if( $u > $end ) //data da repetição atual maior que a data final da busca do usuario ? 824 break; 825 826 $return[] = $u; 827 } 828 829 return $return; 830 } 994 831 995 private function _makeUid() { 832 996 … … 888 1052 private static function schedulable2calendarToObject($Schedulable) 889 1053 { 890 return Controller::service('PostgreSQL')->execResultSql('SELECT calendar_to_calendar_object.id as calendar_to_calendar_Object , calendar.name as calendar_name ,calendar.location as calendar_location FROM calendar_to_calendar_object , calendar , calendar_signature'1054 return Controller::service('PostgreSQL')->execResultSql('SELECT calendar_to_calendar_object.id as calendar_to_calendar_Object , calendar.name as calendar_name ,calendar.location as calendar_location, calendar.id as calendar_id FROM calendar_to_calendar_object , calendar , calendar_signature' 891 1055 .' WHERE calendar_signature.user_uidnumber = '.$_SESSION['wallet']['user']['uidNumber'] 892 1056 .' AND calendar_signature.is_owner = 1'
Note: See TracChangeset
for help on using the changeset viewer.