Changeset 3728


Ignore:
Timestamp:
02/01/11 18:41:13 (13 years ago)
Author:
rafaelraymundo
Message:

Ticket #1479 - Evento com repetição não critica conflito.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2/calendar/inc/class.bocalendar.inc.php

    r3429 r3728  
    9797                ); 
    9898 
    99                 var $debug = False; 
     99                var $wdays; 
     100 
     101                var $debug = False; 
    100102//              var $debug = True; 
    101103 
     
    378380                        } 
    379381                        $this->xmlrpc = is_object($GLOBALS['server']) && $GLOBALS['server']->last_method; 
     382                        $this->wdays = Array(MCAL_M_SUNDAY,MCAL_M_MONDAY,MCAL_M_TUESDAY,MCAL_M_WEDNESDAY, 
     383                            MCAL_M_THURSDAY,MCAL_M_FRIDAY,MCAL_M_SATURDAY); 
    380384                } 
    381385 
     
    784788                } 
    785789 
     790                function getNextDow($start){ 
     791                    if ($start == 6) 
     792                    { 
     793                        return 0; 
     794                    } 
     795                    else 
     796                    { 
     797                        return $start + 1; 
     798                    } 
     799                } 
     800 
     801                // TODO: Levar em consideração no cálculo das ocorrências o parâmetro 
     802                // $event['recur_interval'] 
     803                function expand_repetition($event){ 
     804                    $return = Array(); 
     805 
     806                    $event['recur_enddate']['hour'] = 24; 
     807                    $enddate = $this->maketime($event['recur_enddate']); 
     808 
     809                    $owner = $event['owner']; 
     810                    $participants = $event['participants']; 
     811 
     812            //        $new_event = Array(); 
     813            //        $new_event['owner'] = $owner; 
     814            //        $new_event['participants'] = $participants; 
     815            //        $new_event['start'] = $event['start']; 
     816            //        $new_event['end'] = $event['end']; 
     817            // 
     818            //        $return[] = $new_event; 
     819 
     820                    switch($event['recur_type']) { 
     821                        case MCAL_RECUR_DAILY: 
     822                            // add 1 day = 86400 sec 
     823                            $starttime = $this->maketime($event['start']); 
     824                            $endtime = $this->maketime($event['end']); 
     825 
     826                            $offset = 86400; 
     827                            for (; $starttime <= $enddate; 
     828                                $starttime = $starttime+$offset, 
     829                                $endtime = $endtime+$offset) 
     830                            { 
     831                                $new_event = Array(); 
     832                                $new_event['owner'] = $owner; 
     833                                $new_event['participants'] = $participants; 
     834                                $new_event['start'] = $starttime; 
     835                                $new_event['end'] = $endtime; 
     836                                $return[] = $new_event; 
     837                            } 
     838 
     839                            break; 
     840                        case MCAL_RECUR_WEEKLY: 
     841 
     842                            $setDow = (int)date('w',$this->maketime($event['start'])); 
     843                            $dowOffsets = Array(); 
     844                            $firstDow; 
     845                            $firstDowOffset = 0; 
     846 
     847                            // Initializing do 
     848                            $mask = $this->wdays[$setDow]; 
     849                            $firstDayMismatch = False; 
     850                            if (((int)$event['recur_data'] & $mask) == 0){ 
     851                                $firstDayMismatch = True; 
     852                            } 
     853 
     854                            $dow = $setDow; 
     855 
     856                            for ($nextDow = $setDow; array_sum($dowOffsets) < 7;) 
     857                            { 
     858 
     859                                $nextDow = $this->getNextDow($nextDow); 
     860                                $mask = $this->wdays[$nextDow]; 
     861 
     862                                if (((int)$event['recur_data'] & $mask) != 0) 
     863                                { 
     864                                    if ($firstDayMismatch and $firstDowOffset == 0) 
     865                                    { 
     866                                        if ($dow < $nextDow) 
     867                                        { 
     868                                            $firstDowOffset = $nextDow - $dow; 
     869                                        } 
     870                                        else if ($dow > $nextDow) 
     871                                        { 
     872                                            $firstDowOffset = (7 - $dow) + $nextDow; 
     873                                        } 
     874                                    } 
     875                                    else 
     876                                    { 
     877                                        if ($dow < $nextDow) 
     878                                        { 
     879                                            $dowOffsets[] = $nextDow - $dow; 
     880                                        } 
     881                                        else if ($dow > $nextDow) 
     882                                        { 
     883                                            $dowOffsets[] = (7 - $dow) + $nextDow; 
     884                                        } 
     885                                        else 
     886                                        { 
     887                                            $dowOffsets[] = 7; 
     888                                        } 
     889 
     890                                    } 
     891 
     892                                    $dow = $nextDow; 
     893                                    if (!isset($firstDow)) 
     894                                    { 
     895                                        $firstDow = $dow; 
     896                                    } 
     897 
     898                                } 
     899 
     900            //                    $nextDow = $this->getNextDow($nextDow); 
     901            //                    $mask = $this->wdays[$nextDow]; 
     902 
     903                            } 
     904 
     905                            if ($firstDayMismatch) 
     906                            { 
     907                                if ($dow < $firstDow) 
     908                                { 
     909                                    $dowOffsets[] = $firstDow - $dow; 
     910                                } 
     911                                else if ($dow > $firstDow) 
     912                                { 
     913                                    $dowOffsets[] = (7 - $dow) + $firstDow; 
     914                                } 
     915                            } 
     916 
     917                            // Gera os eventos 
     918                            $starttime = $this->maketime($event['start']); 
     919                            $endtime = $this->maketime($event['end']); 
     920                            $offset = 86400; 
     921 
     922                            $new_event = Array(); 
     923                            $new_event['owner'] = $owner; 
     924                            $new_event['participants'] = $participants; 
     925                            $new_event['start'] = $starttime; 
     926                            $new_event['end'] = $endtime; 
     927                            $return[] = $new_event; 
     928 
     929                            if ($firstDayMismatch && $firstDowOffset != 0) 
     930                            { 
     931                                $multi = $firstDowOffset; 
     932 
     933                                $new_event = Array(); 
     934                                $new_event['owner'] = $owner; 
     935                                $new_event['participants'] = $participants; 
     936                                $new_event['start'] = $starttime += $offset*$multi; 
     937                                $new_event['end'] = $endtime += $offset*$multi; 
     938                                $return[] = $new_event; 
     939                            } 
     940 
     941                            for ($i = 0, $multi = $dowOffsets[$i], 
     942                                $starttime += $offset*$multi, 
     943                                $endtime += $offset*$multi; 
     944                                $starttime <= $enddate; 
     945                                $i++, 
     946                                $i = ($i < count($dowOffsets))?$i:0, 
     947                                $multi = $dowOffsets[$i], 
     948                                $starttime += $offset*$multi, 
     949                                $endtime += $offset*$multi) 
     950                            { 
     951                                //error_log('loop infinito?'); 
     952                                $new_event = Array(); 
     953                                $new_event['owner'] = $owner; 
     954                                $new_event['participants'] = $participants; 
     955                                $new_event['start'] = $starttime; // + $offset*$multi; 
     956                                $new_event['end'] = $endtime; // + $offset*$multi; 
     957                                $return[] = $new_event; 
     958                            } 
     959 
     960 
     961                            break; 
     962                        case MCAL_RECUR_MONTHLY_WDAY: 
     963                            // Not working!!! 
     964                            break; 
     965                        case MCAL_RECUR_MONTHLY_MDAY: 
     966                        case MCAL_RECUR_YEARLY: 
     967 
     968                            for ($key = ($event['recur_type'] == MCAL_RECUR_YEARLY)?'year':'month', 
     969                                $starttime = $event['start'], $endtime = $event['end']; 
     970                                $this->maketime($starttime) <= $enddate; 
     971                                $starttime['year'] = ($key == 'month' && $starttime['month'] == 12)?$starttime['year']+1:$starttime['year'], 
     972                                $endtime['year'] = ($key == 'month' && $endtime['month'] == 12)?$endtime['year']+1:$endtime['year'], 
     973                                $starttime[$key] = ($key == 'year')?$starttime[$key]+1:($key == 'month' && $starttime[$key] < 12)?$starttime[$key]+1:1, 
     974                                $endtime[$key] = ($key == 'year')?$endtime[$key]+1:($key == 'month' && $endtime[$key] < 12)?$endtime[$key]+1:1) 
     975                            { 
     976                                $new_event = Array(); 
     977                                $new_event['owner'] = $owner; 
     978                                $new_event['participants'] = $participants; 
     979                                $new_event['start'] = $this->maketime($starttime); 
     980                                $new_event['end'] = $this->maketime($endtime); 
     981                                $return[] = $new_event; 
     982                            } 
     983 
     984                            break; 
     985            //            default: 
     986            //                return Array(); 
     987 
     988                    } 
     989 
     990                    return $return; 
     991                } 
     992 
    786993                function update($params='') 
    787994                { 
     
    12221429                                } 
    12231430 
    1224                                 $overlapping_events = $this->overlap( 
    1225                                         $this->maketime($event['start']), 
    1226                                         $this->maketime($event['end']), 
    1227                                         $event['participants'], 
    1228                                         $event['owner'], 
    1229                                         $event_ids 
    1230                                 ); 
     1431                                if (isset($repetido) and $repetido > 0){ 
     1432                                    $events = $this->expand_repetition($event); 
     1433                                    $overlapping_events = False; 
     1434                                    foreach($events as $evt){ 
     1435                                        $overlap = $this->overlap( 
     1436                                            $evt['start'], 
     1437                                            $evt['end'], 
     1438                                            $evt['participants'], 
     1439                                            $evt['owner'], 
     1440                                            $event_ids); 
     1441                                        if ($overlap) 
     1442                                        { 
     1443                                            if (!$overlapping_events) 
     1444                                            { 
     1445                                                $overlapping_events = Array(); 
     1446                                            } 
     1447                                            array_push($overlapping_events, $overlap); 
     1448                                        } 
     1449                                    } 
     1450                                } 
     1451                                else { 
     1452                                    $overlapping_events = $this->overlap( 
     1453                                        $this->maketime($event['start']), 
     1454                                        $this->maketime($event['end']), 
     1455                                        $event['participants'], 
     1456                                        $event['owner'], 
     1457                                        $event_ids 
     1458                                    ); 
     1459                                } 
    12311460                        } 
    12321461                        if(!$this->ex_participants) 
Note: See TracChangeset for help on using the changeset viewer.