| | 189 | extract($form->prepareDaoFromControls('tickets~ticket',$id)); |
|---|
| | 190 | $ticket = $daorec; |
|---|
| | 191 | |
|---|
| | 192 | jEvent::notify('bugtrack.ticket.update.beforecheck',array('ticket'=>$ticket, 'form'=>$form)); |
|---|
| | 193 | |
|---|
| | 194 | // update changetime |
|---|
| | 195 | $ticket->changetime = date('Y-m-d H:i:s'); |
|---|
| | 196 | |
|---|
| | 197 | // manage the newstatus field |
|---|
| | 198 | $newstatus = $form->getData('newstatus'); |
|---|
| | 199 | $resolution_changed = false; |
|---|
| | 200 | $owner_changed = false; |
|---|
| | 201 | $duplicate_changed = false; |
|---|
| | 202 | $oldstatus = false; |
|---|
| | 203 | |
|---|
| | 204 | if ($newstatus != 0) { |
|---|
| | 205 | // change owner, status, resolution, duplicate_of_id if ok |
|---|
| | 206 | |
|---|
| | 207 | $workflow = jDao::get('tickets~ticket_workflow'); |
|---|
| | 208 | $statuslist = $workflow->findByTypeAndStatus($ticket->type, $ticket->status); |
|---|
| | 209 | foreach ($statuslist as $nextstatus) { |
|---|
| | 210 | if ($newstatus != $nextstatus->id) |
|---|
| | 211 | continue; |
|---|
| | 212 | |
|---|
| | 213 | $new_status_rec = jDao::get('tickets~ticket_status')->get($ticket->type, $nextstatus->status_new); |
|---|
| | 214 | $oldstatus = $ticket->status; |
|---|
| | 215 | $ticket->status = $nextstatus->status_new; |
|---|
| | 216 | |
|---|
| | 217 | if ($new_status_rec->resolution_set == 1 && $nextstatus->resolution_value != '') { |
|---|
| | 218 | $resolution_changed = $ticket->resolution; |
|---|
| | 219 | if($nextstatus->resolution_value == '?' || $nextstatus->resolution_value{0} == '{') { |
|---|
| | 220 | $ticket->resolution = $form->getData('resolution_'.$nextstatus->id); |
|---|
| | 221 | } |
|---|
| | 222 | elseif($nextstatus->resolution_value{0} == '=') { |
|---|
| | 223 | $ticket->resolution = substr($nextstatus->resolution_value, 1); |
|---|
| | 224 | $resolution_changed = true; |
|---|
| | 225 | } |
|---|
| | 226 | } |
|---|
| | 227 | else if ($new_status_rec->resolution_set == -1) { |
|---|
| | 228 | $resolution_changed = $ticket->resolution; |
|---|
| | 229 | $ticket->resolution = null; |
|---|
| | 230 | } |
|---|
| | 231 | |
|---|
| | 232 | if ($new_status_rec->owner_set == 1 && $nextstatus->owner_value != '') { |
|---|
| | 233 | if($nextstatus->owner_value == '?') { |
|---|
| | 234 | $login = $form->getData('owner_'.$nextstatus->id); |
|---|
| | 235 | if(jAuth::getUser($login)) { |
|---|
| | 236 | $owner_changed = $ticket->owner; |
|---|
| | 237 | $ticket->owner = $login; |
|---|
| | 238 | } |
|---|
| | 239 | else { |
|---|
| | 240 | $form->setErrorOn('owner_'.$nextstatus->id, 'Unknow login'); |
|---|
| | 241 | $inError = true; |
|---|
| | 242 | } |
|---|
| | 243 | } |
|---|
| | 244 | elseif($nextstatus->owner_value{0} == '=') { |
|---|
| | 245 | $owner_changed = $ticket->owner; |
|---|
| | 246 | $ticket->owner = substr($nextstatus->owner_value, 1); |
|---|
| | 247 | } |
|---|
| | 248 | elseif($nextstatus->owner_value == 'current-user') { |
|---|
| | 249 | $owner_changed = $ticket->owner; |
|---|
| | 250 | $ticket->owner = jAuth::getUserSession()->login; |
|---|
| | 251 | } |
|---|
| | 252 | } |
|---|
| | 253 | elseif ($new_status_rec->owner_set == -1) { |
|---|
| | 254 | $owner_changed = $ticket->owner; |
|---|
| | 255 | $ticket->owner = null; |
|---|
| | 256 | } |
|---|
| | 257 | |
|---|
| | 258 | if ($new_status_rec->duplicate_set && $nextstatus->duplicate_value != '') { |
|---|
| | 259 | if($nextstatus->duplicate_value == '?') { |
|---|
| | 260 | $dupid = $form->getData('duplicate_'.$nextstatus->id); |
|---|
| | 261 | if ($dao->get($dupid)) { |
|---|
| | 262 | $duplicate_changed = $ticket->duplicate_of_id; |
|---|
| | 263 | $ticket->duplicate_of_id = $dupid; |
|---|
| | 264 | } |
|---|
| | 265 | else { |
|---|
| | 266 | $form->setErrorOn('duplicate_'.$nextstatus->id, 'Unknow ticket'); |
|---|
| | 267 | $inError = true; |
|---|
| | 268 | } |
|---|
| | 269 | } |
|---|
| | 270 | } |
|---|
| | 271 | elseif ($new_status_rec->duplicate_set == -1) { |
|---|
| | 272 | $duplicate_changed = $ticket->duplicate_of_id; |
|---|
| | 273 | $ticket->duplicate_of_id = null; |
|---|
| | 274 | } |
|---|
| | 275 | break; |
|---|
| | 276 | } // foreach |
|---|
| | 277 | } |
|---|
| | 278 | |
|---|
| | 279 | $mc = $form->getModifiedControls(); |
|---|
| | 280 | $dependents = false; |
|---|
| | 281 | $blockers = false; |
|---|
| | 301 | if (isset($mc['blockedby'])) { |
|---|
| | 302 | $blockers = array(); |
|---|
| | 303 | if (trim($mc['blockedby']) != '') { |
|---|
| | 304 | $blockers = preg_split("/[\s,]+/", $mc['blockedby']); |
|---|
| | 305 | $deperr=array(); |
|---|
| | 306 | foreach ($blockers as $d) { |
|---|
| | 307 | if(!$dao->get($d)) |
|---|
| | 308 | $deperr[]=$d; |
|---|
| | 309 | } |
|---|
| | 310 | if (count($deperr)) { |
|---|
| | 311 | $form->setErrorOn('blockedby', 'Unknow tickets: '.implode(',',$deperr)); |
|---|
| | 312 | $inError = true; |
|---|
| | 313 | } |
|---|
| | 314 | } |
|---|
| | 315 | } |
|---|
| | 316 | |
|---|
| | 317 | if ($inError) { |
|---|
| | 318 | return false; |
|---|
| | 319 | } |
|---|
| | 320 | |
|---|
| | 321 | jEvent::notify('bugtrack.ticket.update.beforesave',array('ticket'=>$ticket, 'form'=>$form)); |
|---|
| | 322 | |
|---|
| | 323 | $changedao = jDao::get('tickets~ticket_change'); |
|---|
| | 324 | $change = jDao::createRecord('tickets~ticket_change'); |
|---|
| | 325 | $change->ticket = $id; |
|---|
| | 326 | $change->changetime = $ticket->changetime; |
|---|
| | 327 | $change->author = jAuth::getUserSession()->login; |
|---|
| | 328 | |
|---|
| | 329 | |
|---|
| | 330 | if(isset($mc['summary'])) { |
|---|
| | 331 | $change->field='summary'; |
|---|
| | 332 | $change->oldvalue=$mc['summary']; |
|---|
| | 333 | $change->newvalue=$ticket->summary; |
|---|
| | 334 | $changedao->insert($change); |
|---|
| | 335 | } |
|---|
| | 336 | |
|---|
| | 337 | if(isset($mc['description'])) { |
|---|
| | 338 | $change->field='description'; |
|---|
| | 339 | $change->oldvalue=$mc['description']; |
|---|
| | 340 | $change->newvalue=$ticket->description; |
|---|
| | 341 | $changedao->insert($change); |
|---|
| | 342 | } |
|---|
| | 343 | |
|---|
| | 344 | if(isset($mc['priority'])) { |
|---|
| | 345 | $change->field='priority'; |
|---|
| | 346 | $change->oldvalue=$mc['priority']; |
|---|
| | 347 | $change->newvalue=$ticket->priority; |
|---|
| | 348 | $changedao->insert($change); |
|---|
| | 349 | } |
|---|
| | 350 | |
|---|
| | 351 | if(isset($mc['milestone_id'])) { |
|---|
| | 352 | $change->field='milestone_id'; |
|---|
| | 353 | $change->oldvalue=$mc['milestone_id']; |
|---|
| | 354 | $change->newvalue=$ticket->milestone_id; |
|---|
| | 355 | $changedao->insert($change); |
|---|
| | 356 | } |
|---|
| | 357 | |
|---|
| | 358 | if(isset($mc['component_id'])) { |
|---|
| | 359 | $change->field='component_id'; |
|---|
| | 360 | $change->oldvalue=$mc['component_id']; |
|---|
| | 361 | $change->newvalue=$ticket->component_id; |
|---|
| | 362 | $changedao->insert($change); |
|---|
| | 363 | } |
|---|
| | 364 | |
|---|
| | 365 | if(isset($mc['version'])) { |
|---|
| | 366 | $change->field='version'; |
|---|
| | 367 | $change->oldvalue=$mc['version']; |
|---|
| | 368 | $change->newvalue=$ticket->version; |
|---|
| | 369 | $changedao->insert($change); |
|---|
| | 370 | } |
|---|
| | 371 | |
|---|
| | 372 | if(isset($mc['severity'])) { |
|---|
| | 373 | $change->field='severity'; |
|---|
| | 374 | $change->oldvalue=$mc['severity']; |
|---|
| | 375 | $change->newvalue=$ticket->severity; |
|---|
| | 376 | $changedao->insert($change); |
|---|
| | 377 | } |
|---|
| | 378 | |
|---|
| | 379 | if(isset($mc['keywords'])) { |
|---|
| | 380 | $change->field='keywords'; |
|---|
| | 381 | $change->oldvalue=$mc['keywords']; |
|---|
| | 382 | $change->newvalue=$ticket->keywords; |
|---|
| | 383 | $changedao->insert($change); |
|---|
| | 384 | } |
|---|
| | 385 | |
|---|
| | 386 | if(isset($mc['newstatus'])) { |
|---|
| | 387 | $change->field='status'; |
|---|
| | 388 | $change->oldvalue= $oldstatus; |
|---|
| | 389 | $change->newvalue=$ticket->status; |
|---|
| | 390 | $changedao->insert($change); |
|---|
| | 391 | } |
|---|
| | 392 | |
|---|
| | 393 | if(isset($mc['comment'])) { |
|---|
| | 394 | $change->field='comment'; |
|---|
| | 395 | $change->oldvalue=$mc['comment']; |
|---|
| | 396 | $change->newvalue=$form->getData('comment'); |
|---|
| | 397 | $changedao->insert($change); |
|---|
| | 398 | } |
|---|
| | 399 | |
|---|
| | 400 | if($resolution_changed !== false) { |
|---|
| | 401 | $change->field='resolution'; |
|---|
| | 402 | $change->oldvalue=$resolution_changed; |
|---|
| | 403 | $change->newvalue=$ticket->resolution; |
|---|
| | 404 | $changedao->insert($change); |
|---|
| | 405 | } |
|---|
| | 406 | |
|---|
| | 407 | if($owner_changed !== false) { |
|---|
| | 408 | $change->field='owner'; |
|---|
| | 409 | $change->oldvalue=$owner_changed; |
|---|
| | 410 | $change->newvalue=$ticket->owner; |
|---|
| | 411 | $changedao->insert($change); |
|---|
| | 412 | } |
|---|
| | 413 | |
|---|
| | 414 | if($duplicate_changed !== false) { |
|---|
| | 415 | $change->field='duplicate_of_id'; |
|---|
| | 416 | $change->oldvalue=$duplicate_changed; |
|---|
| | 417 | $change->newvalue=$ticket->duplicate_of_id; |
|---|
| | 418 | $changedao->insert($change); |
|---|
| | 419 | } |
|---|
| | 420 | |
|---|
| | 421 | // save into the database |
|---|
| | 422 | $dao->update($ticket); |
|---|
| | 423 | |
|---|
| | 424 | if ($dependents !== false) { |
|---|
| | 425 | $depdao = jDao::get('tickets~ticket_dependencies'); |
|---|
| | 426 | $depdao->deleteDependents($ticket->id); |
|---|
| | 427 | $rec = jDao::createRecord ('tickets~ticket_dependencies'); |
|---|
| | 428 | $rec->blocker = $id; |
|---|
| | 429 | foreach ($dependents as $d) { |
|---|
| | 430 | $rec->dependent = $d; |
|---|
| | 431 | $depdao->insert($rec); |
|---|
| | 432 | } |
|---|
| | 433 | //TODO ticket_change 'blockedby' |
|---|
| | 434 | } |
|---|
| | 435 | |
|---|
| | 436 | if ($blockers !== false) { |
|---|
| | 437 | $depdao = jDao::get('tickets~ticket_dependencies'); |
|---|
| | 438 | $depdao->deleteBlockers($ticket->id); |
|---|
| | 439 | $rec = jDao::createRecord ('tickets~ticket_dependencies'); |
|---|
| | 440 | $rec->dependent = $id; |
|---|
| | 441 | foreach ($blockers as $d) { |
|---|
| | 442 | $rec->blocker = $d; |
|---|
| | 443 | $depdao->insert($rec); |
|---|
| | 444 | } |
|---|
| | 445 | //TODO ticket_change 'blocking' |
|---|
| | 446 | } |
|---|