1<?php
2// (c) Copyright by authors of the Tiki Wiki CMS Groupware Project
3//
4// All Rights Reserved. See copyright.txt for details and a complete list of authors.
5// Licensed under the GNU LESSER GENERAL PUBLIC LICENSE. See license.txt for details.
6// $Id$
7
8class Tiki_Profile_InstallHandler_TrackerItem extends Tiki_Profile_InstallHandler
9{
10	private $mode = 'create';
11
12	private function getData() // {{{
13	{
14		if ($this->data) {
15			return $this->data;
16		}
17
18		$data = $this->obj->getData();
19
20		return $this->data = $data;
21	} // }}}
22
23	function getDefaultValues() // {{{
24	{
25		return [
26			'tracker' => 0,
27			'status' => '',
28			'values' => [],
29		];
30	} // }}}
31
32	function getConverters() // {{{
33	{
34		return [
35			'status' => new Tiki_Profile_ValueMapConverter([ 'open' => 'o', 'pending' => 'p', 'closed' => 'c' ]),
36		];
37	} // }}}
38
39	function canInstall()
40	{
41		$data = $this->getData();
42
43		if (! isset($data['tracker'])) {
44			return false;
45		}
46
47		if ($this->convertMode($data)) {
48			if ($this->mode == 'create' && ! is_array($data['values'])) {
49				return false;
50			}
51			if (is_array($data['values'])) {
52				foreach ($data['values'] as $row) {
53					if (! is_array($row) || count($row) != 2) {
54						return false;
55					}
56				}
57			}
58		}
59
60		return true;
61	}
62
63	function convertMode($data)
64	{
65		if (isset($data['mode']) && $data['mode'] == 'update') {
66			if (empty($data['itemId'])) {
67				throw new Exception("itemId is mandatory to update tracker");
68			} else {
69				$this->mode = 'update';
70			}
71		}
72		return true;
73	}
74
75	function _install()
76	{
77		$data = $this->getData();
78		$converters = $this->getConverters();
79		$this->replaceReferences($data);
80		$this->convertMode($data);
81
82		foreach ($data as $key => &$value) {
83			if (isset($converters[$key])) {
84				$value = $converters[$key]->convert($value);
85			}
86		}
87
88		$data = array_merge($this->getDefaultValues(), $data);
89
90		$trklib = TikiLib::lib('trk');
91
92		$fields = $trklib->list_tracker_fields($data['tracker']);
93		$providedfields = [];
94		foreach ($data['values'] as $row) {
95			list( $f, $v) = $row;
96
97			unset($fieldId);
98
99			foreach ($fields['data'] as $key => $entry) {
100				if ($entry['fieldId'] == $f || $entry['permName'] == $f) {
101					$fields['data'][$key]['value'] = $v;
102					$fieldId = $entry['fieldId'];
103					break;
104				}
105			}
106
107			if ($fieldId) {
108				$providedfields[] = $fieldId;
109			}
110		}
111
112		if ($this->mode == 'update') {
113			foreach ($fields['data'] as $key => $entry) {
114				if (! in_array($entry['fieldId'], $providedfields)) {
115					unset($fields['data'][$key]);
116				}
117			}
118			return $trklib->replace_item($data['tracker'], $data['itemId'], $fields, $data['status']);
119		} else {
120			return $trklib->replace_item($data['tracker'], 0, $fields, $data['status']);
121		}
122	}
123
124	/**
125	 * Function to export one tracker item
126	 *
127	 * @param Tiki_Profile_Writer $writer
128	 * @param array $item
129	 *
130	 * @return bool
131	 */
132	static function export(Tiki_Profile_Writer $writer, $item)
133	{
134		if (empty($item) || ! is_array($item)) {
135			return false;
136		}
137
138		if (! isset($item['field_values'])) {
139			$item['field_values'] = [];
140		}
141
142		$statusMap = new Tiki_Profile_ValueMapConverter(['open' => 'o', 'pending' => 'p', 'closed' => 'c']);
143
144		$data = [
145			'tracker' => $writer->getReference('tracker', $item['trackerId']),
146			'status' => $statusMap->reverse($item['status']),
147			'values' => [],
148		];
149
150		foreach ($item['field_values'] as $valueItems) {
151			$fieldReference = $writer->getReference('tracker_field', $valueItems['fieldId']);
152			if (isset($valueItems['value'])) {
153				$data['values'][] = [$fieldReference, $valueItems['value']];
154			} else {
155				$data['values'][] = null;
156
157				// just a note (--v) for header and prefs field types, but add a warning for others
158				if (in_array($valueItems['type'], ['h', 'p'])) {
159					$feedbackFn = 'note';
160				} else {
161					$feedbackFn = 'warning';
162				}
163
164				call_user_func(['Feedback', $feedbackFn],
165					tr(
166						'Field "%0" in Tracker %1 has no value for itemId %2',
167						$valueItems['permName'], $valueItems['trackerId'], $item['itemId']
168					)
169				);
170			}
171		}
172
173		$writer->addObject('tracker_item', $item['itemId'], $data);
174
175		return true;
176	}
177
178	/**
179	 * Remove tracker item
180	 *
181	 * @param string $trackerItem
182	 * @return bool
183	 */
184	function remove($trackerItem)
185	{
186		if (! empty($trackerItem)) {
187			$trklib = TikiLib::lib('trk');
188			$trackerItems = $trklib
189				->table('tiki_tracker_item_fields')
190				->fetchAll(['itemId'], ['value' => $trackerItem]);
191			if (count($trackerItems) == 1) {
192				$trackerItemId = ! empty($trackerField[0]['itemId']) ? $trackerField[0]['itemId'] : 0;
193				if ($trklib->remove_tracker_item($trackerItemId)) {
194					return true;
195				}
196			}
197		}
198
199		return false;
200	}
201}
202