Populating group_id and org_id in tt_custom_field_options table.
[timetracker.git] / plugins / CustomFields.class.php
1 <?php
2 // +----------------------------------------------------------------------+
3 // | Anuko Time Tracker
4 // +----------------------------------------------------------------------+
5 // | Copyright (c) Anuko International Ltd. (https://www.anuko.com)
6 // +----------------------------------------------------------------------+
7 // | LIBERAL FREEWARE LICENSE: This source code document may be used
8 // | by anyone for any purpose, and freely redistributed alone or in
9 // | combination with other software, provided that the license is obeyed.
10 // |
11 // | There are only two ways to violate the license:
12 // |
13 // | 1. To redistribute this code in source form, with the copyright
14 // |    notice or license removed or altered. (Distributing in compiled
15 // |    forms without embedded copyright notices is permitted).
16 // |
17 // | 2. To redistribute modified versions of this code in *any* form
18 // |    that bears insufficient indications that the modifications are
19 // |    not the work of the original author(s).
20 // |
21 // | This license applies to this document only, not any other software
22 // | that it may be combined with.
23 // |
24 // +----------------------------------------------------------------------+
25 // | Contributors:
26 // | https://www.anuko.com/time_tracker/credits.htm
27 // +----------------------------------------------------------------------+
28
29 class CustomFields {
30
31   // Definitions of custom field types.
32
33   const TYPE_TEXT = 1;     // A text field.
34   const TYPE_DROPDOWN = 2; // A dropdown field with pre-defined values.
35
36   var $fields = array();  // Array of custom fields for group.
37   var $options = array(); // Array of options for a dropdown custom field.
38
39   // Constructor.
40   function __construct($group_id) {
41     $mdb2 = getConnection();
42
43     // Get fields.
44     $sql = "select id, type, label, required from tt_custom_fields where group_id = $group_id and status = 1 and type > 0";
45     $res = $mdb2->query($sql);
46     if (!is_a($res, 'PEAR_Error')) {
47       while ($val = $res->fetchRow()) {
48         $this->fields[] = array('id'=>$val['id'],'type'=>$val['type'],'label'=>$val['label'],'required'=>$val['required'],'value'=>'');
49       }
50     }
51
52     // If we have a dropdown obtain options for it.
53     if ((count($this->fields) > 0) && ($this->fields[0]['type'] == CustomFields::TYPE_DROPDOWN)) {
54
55       $sql = "select id, value from tt_custom_field_options where field_id = ".$this->fields[0]['id']." order by value";
56       $res = $mdb2->query($sql);
57       if (!is_a($res, 'PEAR_Error')) {
58         while ($val = $res->fetchRow()) {
59           $this->options[$val['id']] = $val['value'];
60         }
61       }
62     }
63   }
64
65   function insert($log_id, $field_id, $option_id, $value) {
66
67     $mdb2 = getConnection();
68     $sql = "insert into tt_custom_field_log (log_id, field_id, option_id, value) values($log_id, $field_id, ".$mdb2->quote($option_id).", ".$mdb2->quote($value).")";
69     $affected = $mdb2->exec($sql);
70     return (!is_a($affected, 'PEAR_Error'));
71   }
72
73   function update($log_id, $field_id, $option_id, $value) {
74     if (!$field_id)
75       return true; // Nothing to update.
76
77     // Remove older custom field values, if any.
78     $res = $this->delete($log_id);
79     if (!$res)
80       return false;
81
82     if (!$value && !$option_id)
83       return true; // Do not insert NULL values.
84
85     return $this->insert($log_id, $field_id, $option_id, $value);
86   }
87
88   function delete($log_id) {
89
90     $mdb2 = getConnection();
91     $sql = "update tt_custom_field_log set status = NULL where log_id = $log_id";
92     $affected = $mdb2->exec($sql);
93     return (!is_a($affected, 'PEAR_Error'));
94   }
95
96   function get($log_id) {
97     $fields = array();
98
99     $mdb2 = getConnection();
100     $sql = "select id, field_id, option_id, value from tt_custom_field_log where log_id = $log_id and status = 1";
101     $res = $mdb2->query($sql);
102     if (!is_a($res, 'PEAR_Error')) {
103       while ($val = $res->fetchRow()) {
104         $fields[] = $val;
105       }
106       return $fields;
107     }
108     return false;
109   }
110
111   // insertOption adds a new option to a custom field.
112   static function insertOption($field_id, $option_name) {
113     global $user;
114     $mdb2 = getConnection();
115
116     $group_id = $user->getActiveGroup();
117     $org_id = $user->org_id;
118
119     // Check if the option exists.
120     $id = 0;
121     $sql = "select id from tt_custom_field_options where field_id = $field_id and value = ".$mdb2->quote($option_name);
122     $res = $mdb2->query($sql);
123     if (is_a($res, 'PEAR_Error'))
124       return false;
125     if ($val = $res->fetchRow()) $id = $val['id'];
126
127     // Insert option.
128     if (!$id) {
129       $sql = "insert into tt_custom_field_options (group_id, org_id, field_id, value)".
130         " values($group_id, $org_id, $field_id, ".$mdb2->quote($option_name).")";
131       $affected = $mdb2->exec($sql);
132       if (is_a($affected, 'PEAR_Error'))
133         return false;
134     }
135     return true;
136   }
137
138   // updateOption updates option name.
139   static function updateOption($id, $option_name) {
140
141     $mdb2 = getConnection();
142
143     $sql = "update tt_custom_field_options set value = ".$mdb2->quote($option_name)." where id = $id";
144     $affected = $mdb2->exec($sql);
145     return (!is_a($affected, 'PEAR_Error'));
146   }
147
148   // delete Option deletes an option and all custom field log entries that used it.
149   static function deleteOption($id) {
150     global $user;
151     $mdb2 = getConnection();
152
153     $field_id = CustomFields::getFieldIdForOption($id);
154
155     // First make sure that the field is ours.
156     $sql = "select group_id from tt_custom_fields where id = $field_id";
157     $res = $mdb2->query($sql);
158     if (is_a($res, 'PEAR_Error'))
159       return false;
160     $val = $res->fetchRow();
161     if ($user->group_id != $val['group_id'])
162       return false;
163
164     // Delete log entries with this option.
165     $sql = "update tt_custom_field_log set status = NULL where field_id = $field_id and value = ".$mdb2->quote($id);
166     $affected = $mdb2->exec($sql);
167     if (is_a($affected, 'PEAR_Error'))
168       return false;
169
170     // Delete the option.
171     $sql = "delete from tt_custom_field_options where id = $id";
172     $affected = $mdb2->exec($sql);
173     return (!is_a($affected, 'PEAR_Error'));
174   }
175
176   // getOptions returns an array of options for a custom field.
177   static function getOptions($field_id) {
178     global $user;
179     $mdb2 = getConnection();
180     $options = array();
181
182     // First make sure that the field is ours.
183     $sql = "select group_id from tt_custom_fields where id = $field_id";
184     $res = $mdb2->query($sql);
185     if (is_a($res, 'PEAR_Error'))
186       return false;
187     $val = $res->fetchRow();
188     if ($user->group_id != $val['group_id'])
189       return false;
190
191     // Get options.
192     $sql = "select id, value from tt_custom_field_options where field_id = $field_id order by value";
193     $res = $mdb2->query($sql);
194     if (!is_a($res, 'PEAR_Error')) {
195       while ($val = $res->fetchRow()) {
196         $options[$val['id']] = $val['value'];
197       }
198       return $options;
199     }
200     return false;
201   }
202
203   // getOptionName returns an option name for a custom field.
204   static function getOptionName($id) {
205     global $user;
206     $mdb2 = getConnection();
207
208     $field_id = CustomFields::getFieldIdForOption($id);
209
210     // First make sure that the field is ours.
211     $sql = "select group_id from tt_custom_fields where id = $field_id";
212     $res = $mdb2->query($sql);
213     if (is_a($res, 'PEAR_Error'))
214       return false;
215     $val = $res->fetchRow();
216     if ($user->group_id != $val['group_id'])
217       return false;
218
219     // Get option name.
220     $sql = "select value from tt_custom_field_options where id = $id";
221     $res = $mdb2->query($sql);
222     if (!is_a($res, 'PEAR_Error')) {
223       $val = $res->fetchRow();
224       $name = $val['value'];
225       return $name;
226     }
227     return false;
228   }
229
230   // getFields returns an array of custom fields for group.
231   static function getFields() {
232     global $user;
233     $mdb2 = getConnection();
234
235     $fields = array();
236     $sql = "select id, type, label from tt_custom_fields where group_id = $user->group_id and status = 1 and type > 0";
237     $res = $mdb2->query($sql);
238     if (!is_a($res, 'PEAR_Error')) {
239       while ($val = $res->fetchRow()) {
240         $fields[] = array('id'=>$val['id'],'type'=>$val['type'],'label'=>$val['label']);
241       }
242       return $fields;
243     }
244     return false;
245   }
246
247   // getField returns a custom field.
248   static function getField($id) {
249     global $user;
250     $mdb2 = getConnection();
251
252     $sql = "select label, type, required from tt_custom_fields where id = $id and group_id = $user->group_id";
253     $res = $mdb2->query($sql);
254     if (!is_a($res, 'PEAR_Error')) {
255       $val = $res->fetchRow();
256       if (!$val)
257         return false;
258       return $val;
259     }
260     return false;
261   }
262
263   // getFieldIdForOption returns field id from an associated option id.
264   static function getFieldIdForOption($option_id) {
265     $mdb2 = getConnection();
266
267     $sql = "select field_id from tt_custom_field_options where id = $option_id";
268     $res = $mdb2->query($sql);
269     if (!is_a($res, 'PEAR_Error')) {
270       $val = $res->fetchRow();
271       $field_id = $val['field_id'];
272       return $field_id;
273     }
274     return false;
275   }
276
277   // The insertField inserts a custom field for group.
278   static function insertField($field_name, $field_type, $required) {
279     global $user;
280     $mdb2 = getConnection();
281     $group_id = $user->getActiveGroup();
282     $org_id = $user->org_id;
283     $sql = "insert into tt_custom_fields (group_id, org_id, type, label, required, status)".
284       " values($group_id, $org_id, $field_type, ".$mdb2->quote($field_name).", $required, 1)";
285     $affected = $mdb2->exec($sql);
286     return (!is_a($affected, 'PEAR_Error'));
287   }
288
289   // The updateField updates custom field for group.
290   static function updateField($id, $name, $type, $required) {
291     global $user;
292     $mdb2 = getConnection();
293     $sql = "update tt_custom_fields set label = ".$mdb2->quote($name).", type = $type, required = $required where id = $id and group_id = $user->group_id";
294     $affected = $mdb2->exec($sql);
295     return (!is_a($affected, 'PEAR_Error'));
296   }
297
298   // The deleteField deletes a custom field, its options and log entries for group.
299   static function deleteField($field_id) {
300
301     // Our overall intention is to keep the code simple and manageable.
302     // If a user wishes to delete a field, we will delete all its options and log entries.
303     // Otherwise we have to do conditional queries depending on field status (this complicates things).
304
305     global $user;
306     $mdb2 = getConnection();
307
308     // First make sure that the field is ours so that we can safely delete it.
309     $sql = "select group_id from tt_custom_fields where id = $field_id";
310     $res = $mdb2->query($sql);
311     if (is_a($res, 'PEAR_Error'))
312       return false;
313     $val = $res->fetchRow();
314     if ($user->group_id != $val['group_id'])
315       return false;
316
317     // Mark log entries as deleted.
318     $sql = "update tt_custom_field_log set status = NULL where field_id = $field_id";
319     $affected = $mdb2->exec($sql);
320     if (is_a($affected, 'PEAR_Error'))
321       return false;
322
323     // Delete field options.
324     $sql = "delete from tt_custom_field_options where field_id = $field_id";
325     $affected = $mdb2->exec($sql);
326     if (is_a($affected, 'PEAR_Error'))
327       return false;
328
329     // Delete the field.
330     $sql = "delete from tt_custom_fields where id = $field_id and group_id = $user->group_id";
331     $affected = $mdb2->exec($sql);
332     return (!is_a($affected, 'PEAR_Error'));
333   }
334 }