Uncommited changes synced
[Pman.MTrack] / DataObjects / Core_project.php
1 <?php
2
3 require_once 'Pman/Core/DataObjects/Core_project.php';
4
5 class Pman_MTrack_DataObjects_Core_project extends Pman_Core_DataObjects_Core_project
6 {
7      
8        /**
9      * check who is trying to access this. false == access denied..
10      */
11     function checkPerm($lvl, $au) 
12     {
13       // var_dump(array($lvl,$au));
14         if ($lvl == 'S') { 
15             if (!$au) {
16                  return true;
17             }
18             if (!$au->company_id) {
19                 return true;
20             }
21             if ($au->company()->comptype != 'OWNER') {
22                 return true;
23             }
24             // owner.. - we can rely on perms...
25
26             return $au->hasPerm("Core.Projects_Member_Of",$lvl) || $au->hasPerm("Core.Projects_All",$lvl);
27    
28         }
29         // any other action on perms has to be done by company onwer at present..
30         if (!$au || !$au->company_id || $au->company()->comptype != 'OWNER') {
31             return false;
32         }
33         
34         return $au->hasPerm("Core.Projects_Member_Of",$lvl) || $au->hasPerm("Core.Projects_All",$lvl);
35     }
36     
37     function applyFilters($q, $au, $roo)
38     {
39        $tn = $this->tableName();
40        if (!$au) {
41             $this->code = '*PUBLIC';
42             $this->selectAdd();
43             $this->selectAs(array('id','name','code')); // public an only see so much data.?
44             
45             $roo->jdata($this->fetchAll(false,false,'toArray'));
46         }
47         // not sure why this used to say array().. for filter???
48         parent::applyFilters($q, $au, $roo);
49
50         if (!$au->hasPerm('Core.Projects_All', 'S')) { 
51               $pdtn = $this->factory('ProjectDirectory')->tableName();
52               
53               // default behaviour is to only allow access to projects
54               // where the user has a role..
55               
56               $this->whereAdd("
57                     {$tn}.id in  
58                         (SELECT {$pdtn}.project_id FROM {$pdtn} WHERE
59                             person_id = ". $au->id . " and role != ''
60                         )
61             ");
62             // can only see projects with repo's.. by default..
63         
64            
65         }
66          
67         if (isset($q['_with_tickets'])) {
68             $this->selectAdd("
69                 COALESCE((
70                     SELECT
71                         count(mtrack_ticket.id)
72                     FROM
73                         mtrack_ticket
74                     LEFT JOIN
75                        core_enum as join_status_id
76                     ON
77                         join_status_id.id = mtrack_ticket.status
78                     WHERE
79                         (join_status_id.name NOT IN('closed', 'on hold') OR  mtrack_ticket.status  = 0)
80                         AND
81                         mtrack_ticket.project_id = core_project.id
82                 ),0) as no_tickets
83             ");
84             
85         }
86         
87         
88         if (isset($q['_mtrack_repos_only'])) { 
89         //?/ should we hide closed projects by default even from admin?
90             $this->whereAdd("{$tn}.id in (SELECT distinct(project_id) FROM mtrack_repos)");
91         }
92          
93         //$p->orderBy('{$tn}.name ASC');
94         //unset($p->client_id); // default projects serach enforces this..
95         //$ar = $p->fetchAll('id', 'name');
96         
97         
98         
99         
100     }
101      
102     
103     
104     
105     
106    
107     
108     
109     
110     function projectPerm($project_id, $what, $cando)
111     {
112         if (!$project_id) {
113             return false;
114         }
115         $p = DB_DataObject::factory('Projects');
116         $p->get($project_id);
117         if (!$this->authUser) {
118             if ($p->code != '*PUBLIC') {
119                 return false; // only public projects
120             }
121             if ($cando != 'S') {
122                 return false;
123             }
124             // all permissions to view public stuff.
125             return true;
126         }
127         if (!$this->authUser->hasPerm($what, $cando)) {
128             echo "NO PERMS $what $cando";
129             echo '<PRE>'; print_r($this->authUser->getPerms());
130             return false;
131         }
132         // membership rules?
133         //echo "COMPTYPE " . $this->authUser->company()->comptype ;
134         if ($this->authUser->company()->comptype == 'OWNER') {
135                 
136             if ($this->authUser->hasPerm('Core.Projects_All', $cando)) { // they can do what they like on all projects.
137                return true;
138             }
139            // return $p->hasPerm($what, $cando);
140         }
141         // otherwise they have to be a team member of that project.
142         
143         $pd = DB_DataObject::factory('ProjectDirectory');
144         $pd->project_id = $project_id;
145         $pd->user_id = $this->authUser->id;
146         $pd->whereAdd("role != ''");
147         
148         if (!$pd->count()) {
149             return false;
150         }
151         return true;
152          
153     }
154     
155     
156     function notifyENDOFDAYMAIL($rcpt, $last_sent_date, $notify, $force)
157     {
158         // fisrst use history to show a list of changes between the dates.
159         //die("building end of day mail");
160         //DB_DataObject::debugLevel(1);
161         $start = date('Y-m-d H:i:s', strtotime($notify->act_start . ' - 1 DAY'));
162         $end = date('Y-m-d H:i:s', strtotime($notify->act_start));
163         
164         $d = DB_DataObject::factory('mtrack_change');
165         $d->ontable  = 'mtrack_ticket';
166         $d->whereAdd(" mtrack_change.changedate >= '$start' AND mtrack_change.changedate <= '$end'");
167         $d->autoJoin();
168         $d->autoJoinObject('mtrack_ticket');
169         $d->whereAdd('join_project_id_id.id = '. $this->pid());
170         
171         $d->orderBy('mtrack_change.changedate ASC');
172         
173         $res = $d->fetchAll();
174         
175         
176         // group it by projects...
177         $tickets = array();
178         foreach($res as $o) {
179              
180             if (!isset($tickets[$o->ontable_id])) {
181                 $tickets[$o->ontable_id] = clone($o);
182                 $tickets[$o->ontable_id]->changes = array();
183             }
184             
185             $tickets[$o->ontable_id]->changes[] = clone($o);
186         }
187         
188          
189         
190         if (!$tickets) {
191             return true;
192         }
193         //print_r($obj);exit; 
194         $ret =   $rcpt->buildMail('mtrack_ticket_daily_changes', array(
195             'project' => $this,
196             'tickets' => $tickets,
197             'date' => date('d/M/Y', strtotime($notify->act_start)),
198             
199             ));
200         //print_r($ret);exit;
201         return $ret;
202         
203         
204         //$rcpt->sendTemplate('repo_daily_changes', $obj);
205         
206         //echo '<PRE>'.htmlspecialchars(print_r($mr,true));
207         
208         //exit;
209          
210         
211         
212         
213     }
214     
215     
216 }