php8
[web.mtrack] / MTrackWeb / Ticket.php
1 <?php # vim:ts=2:sw=2:et:
2 /* For licensing and copyright terms, see the file named LICENSE */
3  
4 //require_once 'MTrack/Captcha.php';
5
6  
7 require_once 'MTrackWeb.php';
8 class MTrackWeb_Ticket extends MTrackWeb 
9 {
10     var $id; // 0 = new
11     var $issue;
12     var $preview;
13     var $error;
14     var $editable;
15     var $tid = 0; // or the MD5 rep.
16     
17      
18     
19      function getAuth() 
20     {
21         parent::getAuth();
22         //require_once 'MTrack/ACL.php';
23      //   MTrackACL::requireAllRights('Browser', 'read');
24         return true;
25   
26     }
27     
28     function get($pi= 0)
29     {
30     
31         if (!isset($_REQUEST['ajax_body'])) {
32             return;
33         }
34         $this->masterTemplate = 'ticket.html';
35         $this->id = $pi ?  $pi: (isset($_GET['id']) ? $_GET['id'] : 0);
36         $this->id  = (int) $this->id;
37         $this->loadIssue();
38         $this->initEditForm();
39
40     }
41     
42    function loadIssue( )
43    {
44      
45         // -- load issue.. we should share this code with ticketedit really..
46         //DB_DataObject::debugLevel(1);
47         $this->issue = DB_DataObject::factory('mtrack_ticket');
48         $this->issue->autoJoin();
49         if (!$this->id ||  !$this->issue->get($this->id)) {
50             $this->jerr("no such ticket");
51         }
52         
53         if ($this->issue->project_id != $this->currentProject()) {
54             $this->jerr("not in current project");
55         }
56         
57         
58         
59         
60         
61         //$this->issue->augmentFormFields($this->fieldset());
62
63
64         $this->preview = false;
65         $this->error = array();
66        
67        
68         if (!$this->id && !$this->hasPerm('MTrack.Issue','A')) {
69             return HTML_FlexyFramework::run('Noperm');
70         }
71         
72         if ($this->id &&  (  !$this->hasPerm('MTrack.Issue','S')    )) {
73             $this->jerr('no permission');
74         }
75         
76         $this->editable = !$this->hasPerm('MTrack.Issue','E') ;
77          
78         //$this->issue->milestoneURL = $this->baseURL.'/Milestone'; // fix me later..
79     
80         $this->showEditBar = false;
81          
82         if ($this->editable && $this->id   && !$this->preview) {
83             $this->showEditBar = true;
84         }
85          
86         $this->issue->images = $this->issue->images();
87         
88       
89     }
90    
91     function post() // handle the post...
92     {
93         
94         $this->id = empty($_POST['id']) ? 0 : $_POST['id'];
95         $this->loadIssue();
96         $old = clone($this->issue);
97          
98         //  $this->preview = isset($_POST['preview']) ? true : false;
99         if (!$this->hasPerm('MTrack.Issue','E') ) {
100             $this->jerr("permission denied");
101         }
102           
103            
104         $comment = empty($_POST['comment']) ? '' : $_POST['comment'];
105          
106         
107         //    $CS = MTrackChangeset::begin("ticket:X", $comment);
108            
109
110         $act= explode('_', $_POST['status'] , 2);
111             //var_dump($act);exit;
112             // input type='radio' id='none' name='status' value='{issue.status}' checked='checked'> 
113             //   <label for='accept'>Assign this ticket to <b style="color:red">ME</b></label><br>
114             // <input type='radio' id='ticketstate_{cid}' name='status' value='change_{cid}' flexy:ignore="yes"> 
115             //           <input type='radio' id='resolution_{cid}' name='status' value='resolution_{cid}'  flexy:ignore="yes"> 
116                
117         switch ($act[0]) {
118           
119                 
120               
121             case 'accept':
122                 // will be applied to the issue further down
123                 $this->issue->owner_id = $this->authUser->id;
124                 if ($this->issue->status_name == 'new') {
125                     $d = DB_DataObject::factory('core_enum');
126                     $d->etype = 'ticketstate';
127                     $d->name = 'open'; // assigned?
128                     $d->find(true); 
129                     $this->issue->status = $d->id;
130                 }
131                 break;
132                 
133                 
134               case 'resolution':
135                 //$this->issue->resolution = $_POST['resolution'];
136                 $this->issue->resolution_id = $act[1];
137                 $d = DB_DataObject::factory('core_enum');
138                 $d->etype = 'ticketstate';
139                 $d->name = 'closed'; // assigned?
140                 $d->find(true);
141                 $this->issue->status = $d->id;
142                 //$this->issue->close();
143                 //$_POST['estimated'] = $this->issue->estimated;
144                 break;  
145                 
146             case 'change':
147                 $this->issue->status = $act[1];
148                 break;
149             
150             // default leave - stays tehe same..
151         }
152         
153         // things that we should not allow..
154         foreach(array(
155             'estimated', 'effort', 'owner_id',
156         ) as $k) {
157             if (isset($_POST[$k])) {
158                 $this->issue->setFrom(array($k => $_POST[$k]));
159             }
160         }
161          
162         //  $this->issue->addEffort(
163         //    empty($_POST['spent']) ? 0 : $_POST['spent'], 
164         //    empty($_POST['estimate']) ? 0 : $_POST['estimate']
165         //);
166         
167         // we should really use begin/commit to determin if something has changed..
168         // and produce an error..
169         
170         
171         $CS = DB_DataObject::factory('mtrack_change');
172         $CS->begin($this->issue, empty($_POST['comment']) ? '' : $_POST['comment']);
173             
174         
175         //if (!empty($_POST['comment'])) {
176             // create a comment CS..
177             
178         //}
179         $CS->add($this->issue, $old);
180         $this->issue->updated = $CS->id;
181         $this->issue->update($old);
182         
183         
184         
185         
186         if (!empty($_FILES['attachments'])) {
187             foreach ($_FILES['attachments']['name'] as $fileid => $name) {
188                 $i = DB_DataObject::factory('Images');
189                 $i->object($this->issue);
190                 $i->ontable = $this->issue->tableName();
191                 $i->onid = $this->issue->id;
192                 $i->created_by = $this->authUser->id;
193                 $i->mimetype = $_FILES['attachments']["type"][$fileid];
194                 $i->createFrom($_FILES['attachments']['tmp_name'][$fileid],$_FILES['attachments']['name'][$fileid]);
195                 
196                 //    MTrackAttachment::add("ticket:{$this->issue->tid}",
197                 //        $_FILES['attachments']['tmp_name'][$fileid],
198                 //        $_FILES['attachments']['name'][$fileid],
199                 //        $CS
200                 //    );
201                 //}
202             }
203         }
204         /*
205         if (!count($this->error) && $this->id != 'new') {
206             require_once 'MTrack/Attachment.php';
207             MTrackAttachment::process_delete("ticket:{$this->issue->tid}", $CS);
208         } 
209         */
210         
211         
212         
213         
214         
215         $notify_query = "
216                 (ontable='mtrack_ticket' and onid = {$this->issue->id})
217                  OR
218                  (ontable='Projects' and onid = {$this->issue->project_id})
219                  ";
220          $w = DB_DataObject::factory('core_watch');
221         $w->ensureNotify(  'mtrack_ticket' ,
222                             $this->issue->id,
223                             $this->authUser->id,
224                         $notify_query
225             );
226         
227         $w->ensureNotify(  'mtrack_ticket' ,
228                             $this->issue->id,
229                             $this->issue->owner_id,
230                         $notify_query
231             );
232         
233          $w->ensureNotify(  'mtrack_ticket' ,
234                             $this->issue->id,
235                             $this->issue->developer_id,
236                         $notify_query
237             );
238         //DB_DataObject::debugLevel(1);
239         // who to notify..
240         // who to notify.. -- originall did not send to issuer..
241         // we should probably make this configurable..
242         $w->notify( 'mtrack_ticket' , $this->issue->id,
243                     $notify_query 
244                 /* " ( $notify_query )
245                     AND
246                     (person_id != {$this->authUser->id})   "   */
247         );
248         
249         
250         
251         // if the owner has changed.. then we should add them to the watch list...
252  
253         // MTrackWatch::watch_object('ticket', $this->issue->tid,  $this->issue->owner);
254         
255         $this->jok("OK");
256         
257     }
258       
259          
260     function initEditForm($params = array())
261     {
262         require_once 'HTML/Template/Flexy/Element.php';
263         require_once 'HTML/Template/Flexy/Factory.php';
264         $this->elements = array();
265         
266         
267          
268         // FIX ME - need to determine who the owner is..
269         // for a new issue it's the person who created it.
270         // later on it's an assignement???
271       //  DB_DataObject::debugLevel(1);
272         $pd = DB_DataObject::factory('ProjectDirectory');
273         $pd->project_id = $this->currentProject();
274         $pd->whereAdd("ProjectDirectory.role != ''");
275         $pd->joinAdd(DB_DataObject::factory('core_person'), 'LEFT');
276         $pd->selectAdd();
277         $pd->selectAdd("distinct(Person.id) as id ,  CONCAT(Person.name , '<', Person.email , '>') as name");
278         $pd->groupBy('Person.id, Person.name');
279         $pd->orderBy('Person.name');
280         $users = $pd->fetchAll('id', 'name');
281         
282         
283         //$users = array();
284          
285         $this->elements['owner_id'] = new HTML_Template_Flexy_Element('select');
286         $this->elements['owner_id']->setOptions($users);
287         
288         
289         
290         // keywords -- in toArray...
291         // milestone 
292           
293     
294     
295         foreach(array(  'resolution', 'ticketstate' ) as $c)  {
296             $d = DB_DataObject::factory('core_enum');
297             $d->etype = $c;
298             $d->orderBy('seqid ASC, name ASC');
299             if (!$d->count()) {
300                 $d->createBaseEntries();
301                 
302             }
303             $this->{$c} =  $d->fetchAll('id','name');
304             
305         }
306         
307     
308            
309         //    unset($ST['closed']);
310         //    unset($ST[$this->issue->status]);
311            
312         //    $this->change_status = empty($ST) ? array() : array_keys($ST);
313         
314         // admin can only change to 'fixed'?
315              
316         $this->elements = HTML_Template_Flexy_Factory::fromArray($this->issue->toArray(), $this->elements);
317  
318         
319
320           
321     }
322    
323      
324     function eq($a,$b) {
325         return $a == $b;
326     }
327     
328 }