e64bd672485fa34f8601bb62cc140f06f953ab11
[timetracker.git] / WEB-INF / lib / ttTeamHelper.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 import('ttUserHelper');
30 import('DateAndTime');
31 import('ttInvoiceHelper');
32
33 // Class ttTeamHelper - contains helper functions that operate with groups.
34 class ttTeamHelper {
35
36   // The getUsersForClient obtains all active and inactive users in a group that are relevant to a client.
37   static function getUsersForClient() {
38     global $user;
39     $mdb2 = getConnection();
40
41     $sql = "select u.id, u.name from tt_user_project_binds upb".
42       " inner join tt_client_project_binds cpb on (upb.project_id = cpb.project_id and cpb.client_id = $user->client_id)".
43       " inner join tt_users u on (u.id = upb.user_id)".
44       " where (u.status = 1 or u.status = 0)".
45       " group by u.id".
46       " order by upper(u.name)";
47     $res = $mdb2->query($sql);
48     $user_list = array();
49     if (is_a($res, 'PEAR_Error'))
50       return false;
51     while ($val = $res->fetchRow()) {
52       $user_list[] = $val;
53     }
54     return $user_list;
55   }
56
57   // The getActiveUsers obtains all active users in a given group.
58   static function getActiveUsers($options = null) {
59     global $user;
60     global $i18n;
61     $mdb2 = getConnection();
62
63     $group_id = $user->getGroup();
64     $org_id = $user->org_id;
65
66     if (isset($options['getAllFields']))
67       $sql = "select u.*, r.name as role_name, r.rank from tt_users u left join tt_roles r on (u.role_id = r.id) where u.group_id = $group_id and u.org_id = $org_id and u.status = 1 order by upper(u.name)";
68     else
69       $sql = "select id, name from tt_users where group_id = $group_id and org_id = $org_id and status = 1 order by upper(name)";
70     $res = $mdb2->query($sql);
71     $user_list = array();
72     if (is_a($res, 'PEAR_Error'))
73       return false;
74     while ($val = $res->fetchRow()) {
75       // Localize top manager role name, as it is not localized in db.
76       if ($val['rank'] == 512)
77         $val['role_name'] = $i18n->get('role.top_manager.label');
78       $user_list[] = $val;
79     }
80
81     if (isset($options['putSelfFirst'])) {
82       // Put own entry at the front.
83       $cnt = count($user_list);
84       for($i = 0; $i < $cnt; $i++) {
85         if ($user_list[$i]['id'] == $user->id) {
86           $self = $user_list[$i]; // Found self.
87           array_unshift($user_list, $self); // Put own entry at the front.
88           array_splice($user_list, $i+1, 1); // Remove duplicate.
89         }
90       }
91     }
92     return $user_list;
93   }
94
95   // The swapRolesWith swaps existing user role with that of another user.
96   static function swapRolesWith($user_id) {
97     global $user;
98     $mdb2 = getConnection();
99
100     // Obtain role id for the user we are swapping ourselves with.
101     $sql = "select u.id, u.role_id from tt_users u left join tt_roles r on (u.role_id = r.id) where u.id = $user_id and u.group_id = $user->group_id and u.status = 1 and r.rank < $user->rank";
102     $res = $mdb2->query($sql);
103     if (is_a($res, 'PEAR_Error'))
104       return false;
105     $val = $res->fetchRow();
106     if (!$val['id'] || !$val['role_id'])
107       return false;
108
109     $modified_part = ', modified = now(), modified_ip = '.$mdb2->quote($_SERVER['REMOTE_ADDR']).', modified_by = '.$user->id;
110
111     // Promote user.
112     $sql = "update tt_users set role_id = $user->role_id".$modified_part." where id = $user_id and group_id = $user->group_id";
113     $affected = $mdb2->exec($sql);
114     if (is_a($affected, 'PEAR_Error')) return false;
115
116     // Demote self.
117     $role_id = $val['role_id'];
118     $sql = "update tt_users set role_id = $role_id".$modified_part." where id = $user->id and group_id = $user->group_id";
119     $affected = $mdb2->exec($sql);
120     if (is_a($affected, 'PEAR_Error')) return false;
121
122     return true;
123   }
124
125   // The getUsersForSwap obtains all users a current user can swap roles with.
126   static function getUsersForSwap() {
127     global $user;
128     $mdb2 = getConnection();
129
130     $sql = "select u.id, u.name, r.rank, r.rights from tt_users u left join tt_roles r on (u.role_id = r.id) where u.group_id = $user->group_id and u.status = 1 and r.rank < $user->rank order by upper(u.name)";
131     $res = $mdb2->query($sql);
132     $user_list = array();
133     if (is_a($res, 'PEAR_Error'))
134       return false;
135     while ($val = $res->fetchRow()) {
136       $isClient = in_array('track_own_time', explode(',', $val['rights'])) ? 0 : 1; // Clients do not have track_own_time right.
137       if ($isClient)
138         continue; // Skip adding clients.
139       $user_list[] = $val;
140     }
141
142     return $user_list;
143   }
144
145   // The getUsers obtains all active and inactive (but not deleted) users in a group.
146   static function getUsers() {
147     global $user;
148     $mdb2 = getConnection();
149     $sql = "select id, name from tt_users where group_id = $user->group_id and (status = 1 or status = 0) order by upper(name)";
150     $res = $mdb2->query($sql);
151     $user_list = array();
152     if (is_a($res, 'PEAR_Error'))
153       return false;
154     while ($val = $res->fetchRow()) {
155       $user_list[] = $val;
156     }
157     return $user_list;
158   }
159
160   // The getInactiveUsers obtains all inactive users in a group.
161   static function getInactiveUsers($group_id, $all_fields = false) {
162     $mdb2 = getConnection();
163
164     if ($all_fields)
165       $sql = "select u.*, r.name as role_name from tt_users u left join tt_roles r on (u.role_id = r.id) where u.group_id = $group_id and u.status = 0 order by upper(u.name)";
166     else
167       $sql = "select id, name from tt_users where group_id = $group_id and status = 0 order by upper(name)";
168     $res = $mdb2->query($sql);
169     $result = array();
170     if (!is_a($res, 'PEAR_Error')) {
171       while ($val = $res->fetchRow()) {
172         $result[] = $val;
173       }
174       return $result;
175     }
176     return false;
177   }
178
179   // The getAllProjects obtains all projects in a group.
180   static function getAllProjects($group_id, $all_fields = false) {
181     $mdb2 = getConnection();
182
183     if ($all_fields)
184       $sql = "select * from tt_projects where group_id = $group_id order by status, upper(name)";
185     else
186       $sql = "select id, name from tt_projects where group_id = $group_id order by status, upper(name)";
187     $res = $mdb2->query($sql);
188     $result = array();
189     if (!is_a($res, 'PEAR_Error')) {
190       while ($val = $res->fetchRow()) {
191         $result[] = $val;
192       }
193       return $result;
194     }
195     return false;
196   }
197
198   // getActiveTasks - returns an array of active tasks for a group.
199   static function getActiveTasks($group_id)
200   {
201     $result = array();
202     $mdb2 = getConnection();
203
204     $sql = "select id, name, description from tt_tasks where group_id = $group_id and status = 1 order by upper(name)";
205     $res = $mdb2->query($sql);
206     $result = array();
207     if (!is_a($res, 'PEAR_Error')) {
208       while ($val = $res->fetchRow()) {
209         $result[] = $val;
210       }
211     }
212     return $result;
213   }
214
215   // getInactiveTasks - returns an array of inactive tasks for a group.
216   static function getInactiveTasks($group_id)
217   {
218     $result = array();
219     $mdb2 = getConnection();
220
221     $sql = "select id, name, description from tt_tasks
222       where group_id = $group_id and status = 0 order by upper(name)";
223     $res = $mdb2->query($sql);
224     $result = array();
225     if (!is_a($res, 'PEAR_Error')) {
226       while ($val = $res->fetchRow()) {
227         $result[] = $val;
228       }
229     }
230     return $result;
231   }
232
233   // The getAllTasks obtains all tasks in a group.
234   static function getAllTasks($group_id, $all_fields = false) {
235     $mdb2 = getConnection();
236
237     if ($all_fields)
238       $sql = "select * from tt_tasks where group_id = $group_id order by status, upper(name)";
239     else
240       $sql = "select id, name from tt_tasks where group_id = $group_id order by status, upper(name)";
241     $res = $mdb2->query($sql);
242     $result = array();
243     if (!is_a($res, 'PEAR_Error')) {
244       while ($val = $res->fetchRow()) {
245         $result[] = $val;
246       }
247       return $result;
248     }
249     return false;
250   }
251
252   // getActiveRolesForUser - returns an array of relevant active roles for user with rank less than self.
253   // "Relevant" means that client roles are filtered out if Client plugin is disabled.
254   static function getActiveRolesForUser()
255   {
256     global $user;
257     $result = array();
258     $mdb2 = getConnection();
259
260     $group_id = $user->getGroup();
261     $org_id = $user->org_id;
262
263     // Determine max rank. If we are working in on behalf group
264     // then rank restriction does not apply.
265     $max_rank = $user->behalfGroup ? MAX_RANK : $user->rank;
266
267     $sql = "select id, name, description, rank, rights from tt_roles where group_id = $group_id and org_id = $org_id and rank < $max_rank and status = 1 order by rank";
268     $res = $mdb2->query($sql);
269     $result = array();
270     if (!is_a($res, 'PEAR_Error')) {
271       while ($val = $res->fetchRow()) {
272         $val['is_client'] = in_array('track_own_time', explode(',', $val['rights'])) ? 0 : 1; // Clients do not have data entry right.
273         if ($val['is_client'] && !$user->isPluginEnabled('cl'))
274           continue; // Skip adding a client role.
275         $result[] = $val;
276       }
277     }
278     return $result;
279   }
280
281   // getActiveRoles - returns an array of active roles for a group.
282   static function getActiveRoles($group_id)
283   {
284     $result = array();
285     $mdb2 = getConnection();
286
287     $sql = "select id, name, description, rank, rights from tt_roles where group_id = $group_id and status = 1 order by rank";
288     $res = $mdb2->query($sql);
289     $result = array();
290     if (!is_a($res, 'PEAR_Error')) {
291       while ($val = $res->fetchRow()) {
292         $val['is_client'] = in_array('track_own_time', explode(',', $val['rights'])) ? 0 : 1; // Clients do not have track_own_time right.
293         $result[] = $val;
294       }
295     }
296     return $result;
297   }
298
299   // getInactiveRoles - returns an array of inactive roles for a group.
300   static function getInactiveRoles($group_id)
301   {
302     $result = array();
303     $mdb2 = getConnection();
304
305     $sql = "select id, name, rank, description from tt_roles
306       where group_id = $group_id and status = 0 order by rank";
307     $res = $mdb2->query($sql);
308     $result = array();
309     if (!is_a($res, 'PEAR_Error')) {
310       while ($val = $res->fetchRow()) {
311         $result[] = $val;
312       }
313     }
314     return $result;
315   }
316
317   // getInactiveRolesForUser - returns an array of relevant active roles for user with rank less than self.
318   // "Relevant" means that client roles are filtered out if Client plugin is disabled.
319   static function getInactiveRolesForUser()
320   {
321     global $user;
322     $result = array();
323     $mdb2 = getConnection();
324
325     $group_id = $user->getGroup();
326     $org_id = $user->org_id;
327
328     // Determine max rank. If we are working in on behalf group
329     // then rank restriction does not apply.
330     $max_rank = $user->behalfGroup ? MAX_RANK : $user->rank;
331
332     $sql = "select id, name, description, rank, rights from tt_roles where group_id = $group_id and org_id = $org_id and rank < $max_rank and status = 0 order by rank";
333     $res = $mdb2->query($sql);
334     $result = array();
335     if (!is_a($res, 'PEAR_Error')) {
336       while ($val = $res->fetchRow()) {
337         $val['is_client'] = in_array('track_own_time', explode(',', $val['rights'])) ? 0 : 1; // Clients do not have data entry right.
338         if ($val['is_client'] && !$user->isPluginEnabled('cl'))
339           continue; // Skip adding a client role.
340         $result[] = $val;
341       }
342     }
343     return $result;
344   }
345
346   // The getAllClients obtains all clients in a group.
347   static function getAllClients($group_id, $all_fields = false) {
348     $mdb2 = getConnection();
349
350     if ($all_fields)
351       $sql = "select * from tt_clients where group_id = $group_id order by status, upper(name)";
352     else
353       $sql = "select id, name from tt_clients where group_id = $group_id order by status, upper(name)";
354
355     $res = $mdb2->query($sql);
356     $result = array();
357     if (!is_a($res, 'PEAR_Error')) {
358       while ($val = $res->fetchRow()) {
359         $result[] = $val;
360       }
361       return $result;
362     }
363     return false;
364   }
365
366   // The getActiveInvoices returns an array of active invoices for a group.
367   static function getActiveInvoices($localizeDates = true)
368   {
369     global $user;
370     $addPaidStatus = $user->isPluginEnabled('ps');
371
372     $result = array();
373     $mdb2 = getConnection();
374
375     if ($user->isClient())
376       $client_part = " and i.client_id = $user->client_id";
377
378     $sql = "select i.id, i.name, i.date, i.client_id, i.status, c.name as client_name from tt_invoices i
379       left join tt_clients c on (c.id = i.client_id)
380       where i.status = 1 and i.group_id = $user->group_id $client_part order by i.name";
381     $res = $mdb2->query($sql);
382     $result = array();
383     if (!is_a($res, 'PEAR_Error')) {
384       $dt = new DateAndTime(DB_DATEFORMAT);
385       while ($val = $res->fetchRow()) {
386         if ($localizeDates) {
387           $dt->parseVal($val['date']);
388           $val['date'] = $dt->toString($user->date_format);
389         }
390         if ($addPaidStatus)
391           $val['paid'] = ttInvoiceHelper::isPaid($val['id']);
392         $result[] = $val;
393       }
394     }
395     return $result;
396   }
397
398   // The getAllInvoices returns an array of all invoices for a group.
399   static function getAllInvoices()
400   {
401     global $user;
402
403     $result = array();
404     $mdb2 = getConnection();
405
406     $sql = "select * from tt_invoices where group_id = $user->group_id";
407     $res = $mdb2->query($sql);
408     $result = array();
409     if (!is_a($res, 'PEAR_Error')) {
410       $dt = new DateAndTime(DB_DATEFORMAT);
411       while ($val = $res->fetchRow()) {
412         $result[] = $val;
413       }
414     }
415     return $result;
416   }
417
418   // The getRecentInvoices returns an array of recent invoices (max 3) for a client.
419   static function getRecentInvoices($group_id, $client_id)
420   {
421     global $user;
422
423     $result = array();
424     $mdb2 = getConnection();
425
426     $sql = "select i.id, i.name from tt_invoices i
427       left join tt_clients c on (c.id = i.client_id)
428       where i.group_id = $group_id and i.status = 1 and c.id = $client_id
429       order by i.id desc limit 3";
430     $res = $mdb2->query($sql);
431     $result = array();
432     if (!is_a($res, 'PEAR_Error')) {
433       $dt = new DateAndTime(DB_DATEFORMAT);
434       while ($val = $res->fetchRow()) {
435         $result[] = $val;
436       }
437     }
438     return $result;
439   }
440
441   // getUserToProjectBinds - obtains all user to project binds for a group.
442   static function getUserToProjectBinds($group_id) {
443     $mdb2 = getConnection();
444
445     $result = array();
446     $sql = "select * from tt_user_project_binds where user_id in (select id from tt_users where group_id = $group_id) order by user_id, status, project_id";
447     $res = $mdb2->query($sql);
448     $result = array();
449     if (!is_a($res, 'PEAR_Error')) {
450       while ($val = $res->fetchRow()) {
451         $result[] = $val;
452       }
453       return $result;
454     }
455     return false;
456   }
457
458   // The getAllCustomFields obtains all custom fields in a group.
459   static function getAllCustomFields($group_id) {
460     $mdb2 = getConnection();
461
462     $sql = "select * from tt_custom_fields where group_id = $group_id order by status";
463
464     $res = $mdb2->query($sql);
465     $result = array();
466     if (!is_a($res, 'PEAR_Error')) {
467       while ($val = $res->fetchRow()) {
468         $result[] = $val;
469       }
470       return $result;
471     }
472     return false;
473   }
474
475   // The getAllCustomFieldOptions obtains all custom field options in a group.
476   static function getAllCustomFieldOptions($group_id) {
477     $mdb2 = getConnection();
478
479     $sql = "select * from tt_custom_field_options where field_id in (select id from tt_custom_fields where group_id = $group_id) order by id";
480
481     $res = $mdb2->query($sql);
482     $result = array();
483     if (!is_a($res, 'PEAR_Error')) {
484       while ($val = $res->fetchRow()) {
485         $result[] = $val;
486       }
487       return $result;
488     }
489     return false;
490   }
491
492   // The getCustomFieldLog obtains all custom field log entries for a group.
493   static function getCustomFieldLog($group_id) {
494     $mdb2 = getConnection();
495
496     $sql = "select * from tt_custom_field_log where field_id in (select id from tt_custom_fields where group_id = $group_id) order by id";
497
498     $res = $mdb2->query($sql);
499     $result = array();
500     if (!is_a($res, 'PEAR_Error')) {
501       while ($val = $res->fetchRow()) {
502         $result[] = $val;
503       }
504       return $result;
505     }
506     return false;
507   }
508
509   // getFavReports - obtains all favorite reports for all users in a group.
510   static function getFavReports($group_id) {
511     $mdb2 = getConnection();
512
513     $result = array();
514     $sql = "select * from tt_fav_reports where user_id in (select id from tt_users where group_id = $group_id)";
515     $res = $mdb2->query($sql);
516     $result = array();
517     if (!is_a($res, 'PEAR_Error')) {
518       while ($val = $res->fetchRow()) {
519         $result[] = $val;
520       }
521       return $result;
522     }
523     return false;
524   }
525
526   // getExpenseItems - obtains all expense items for all users in a group.
527   static function getExpenseItems($group_id) {
528     $mdb2 = getConnection();
529
530     $result = array();
531     $sql = "select * from tt_expense_items where user_id in (select id from tt_users where group_id = $group_id)";
532     $res = $mdb2->query($sql);
533     $result = array();
534     if (!is_a($res, 'PEAR_Error')) {
535       while ($val = $res->fetchRow()) {
536         $result[] = $val;
537       }
538       return $result;
539     }
540     return false;
541   }
542
543   // getPredefinedExpenses - obtains predefined expenses for a group.
544   static function getPredefinedExpenses($group_id) {
545     global $user;
546     $replaceDecimalMark = ('.' != $user->decimal_mark);
547
548     $mdb2 = getConnection();
549
550     $result = array();
551     $sql = "select id, name, cost from tt_predefined_expenses where group_id = $group_id";
552     $res = $mdb2->query($sql);
553     $result = array();
554     if (!is_a($res, 'PEAR_Error')) {
555       while ($val = $res->fetchRow()) {
556         if ($replaceDecimalMark)
557           $val['cost'] = str_replace('.', $user->decimal_mark, $val['cost']);
558         $result[] = $val;
559       }
560       return $result;
561     }
562     return false;
563   }
564
565   // getNotifications - obtains notification descriptions for a group.
566   static function getNotifications($group_id) {
567     $mdb2 = getConnection();
568
569     $result = array();
570     $sql = "select c.id, c.cron_spec, c.email, c.report_condition, fr.name from tt_cron c
571       left join tt_fav_reports fr on (fr.id = c.report_id)
572       where c.group_id = $group_id and c.status = 1 and fr.status = 1";
573     $res = $mdb2->query($sql);
574     $result = array();
575     if (!is_a($res, 'PEAR_Error')) {
576       while ($val = $res->fetchRow()) {
577         $result[] = $val;
578       }
579       return $result;
580     }
581     return false;
582   }
583
584   // getMonthlyQuotas - obtains monthly quotas for a group.
585   static function getMonthlyQuotas($group_id) {
586     $mdb2 = getConnection();
587
588     $result = array();
589     $sql = "select year, month, minutes from tt_monthly_quotas where group_id = $group_id";
590     $res = $mdb2->query($sql);
591     $result = array();
592     if (!is_a($res, 'PEAR_Error')) {
593       while ($val = $res->fetchRow()) {
594         $result[] = $val;
595       }
596       return $result;
597     }
598     return false;
599   }
600
601   // The delete function permanently deletes all data for a group.
602   static function delete($group_id) {
603     $mdb2 = getConnection();
604
605     // Delete users.
606     $sql = "select id from tt_users where group_id = $group_id";
607     $res = $mdb2->query($sql);
608     if (is_a($res, 'PEAR_Error')) return false;
609     while ($val = $res->fetchRow()) {
610       $user_id = $val['id'];
611       if (!ttUserHelper::delete($user_id)) return false;
612     }
613
614     // Delete tasks.
615     if (!ttTeamHelper::deleteTasks($group_id)) return false;
616
617     // Delete client to project binds.
618     $sql = "delete from tt_client_project_binds where client_id in (select id from tt_clients where group_id = $group_id)";
619     $affected = $mdb2->exec($sql);
620     if (is_a($affected, 'PEAR_Error')) return false;
621
622     // Delete projects.
623     $sql = "delete from tt_projects where group_id = $group_id";
624     $affected = $mdb2->exec($sql);
625     if (is_a($affected, 'PEAR_Error')) return false;
626
627     // Delete clients.
628     $sql = "delete from tt_clients where group_id = $group_id";
629     $affected = $mdb2->exec($sql);
630     if (is_a($affected, 'PEAR_Error')) return false;
631
632     // Delete invoices.
633     $sql = "delete from tt_invoices where group_id = $group_id";
634     $affected = $mdb2->exec($sql);
635     if (is_a($affected, 'PEAR_Error')) return false;
636
637     // Delete custom fields.
638     if (!ttTeamHelper::deleteCustomFields($group_id)) return false;
639
640     // Delete roles.
641     $sql = "delete from tt_roles where group_id = $group_id";
642     $affected = $mdb2->exec($sql);
643     if (is_a($affected, 'PEAR_Error')) return false;
644
645     // Delete cron entries.
646     $sql = "delete from tt_cron where group_id = $group_id";
647     $affected = $mdb2->exec($sql);
648     if (is_a($affected, 'PEAR_Error')) return false;
649
650     // Delete predefined expenses.
651     $sql = "delete from tt_predefined_expenses where group_id = $group_id";
652     $affected = $mdb2->exec($sql);
653     if (is_a($affected, 'PEAR_Error')) return false;
654
655     // Delete monthly quotas.
656     $sql = "delete from tt_monthly_quotas where group_id = $group_id";
657     $affected = $mdb2->exec($sql);
658     if (is_a($affected, 'PEAR_Error')) return false;
659
660     // Delete group.
661     $sql = "delete from tt_groups where id = $group_id";
662     $affected = $mdb2->exec($sql);
663     if (is_a($affected, 'PEAR_Error')) return false;
664
665     return true;
666   }
667
668   // The deleteTasks deletes all tasks and task binds for an inactive group.
669   static function deleteTasks($group_id) {
670     $mdb2 = getConnection();
671     $sql = "select id from tt_tasks where group_id = $group_id";
672     $res = $mdb2->query($sql);
673     if (is_a($res, 'PEAR_Error')) return false;
674
675     while ($val = $res->fetchRow()) {
676
677       // Delete task binds.
678       $task_id = $val['id'];
679       $sql = "delete from tt_project_task_binds where task_id = $task_id";
680       $affected = $mdb2->exec($sql);
681       if (is_a($affected, 'PEAR_Error')) return false;
682
683       // Delete task.
684       $sql = "delete from tt_tasks where id = $task_id";
685       $affected = $mdb2->exec($sql);
686       if (is_a($affected, 'PEAR_Error')) return false;
687     }
688
689     return true;
690   }
691
692   // The deleteCustomFields cleans up tt_custom_field_log, tt_custom_field_options and tt_custom_fields tables for an inactive group.
693   static function deleteCustomFields($group_id) {
694     $mdb2 = getConnection();
695     $sql = "select id from tt_custom_fields where group_id = $group_id";
696     $res = $mdb2->query($sql);
697     if (is_a($res, 'PEAR_Error')) return false;
698
699     while ($val = $res->fetchRow()) {
700       $field_id = $val['id'];
701
702       // Clean up tt_custom_field_log.
703       $sql = "delete from tt_custom_field_log where field_id = $field_id";
704       $affected = $mdb2->exec($sql);
705       if (is_a($affected, 'PEAR_Error')) return false;
706
707       // Clean up tt_custom_field_options.
708       $sql = "delete from tt_custom_field_options where field_id = $field_id";
709       $affected = $mdb2->exec($sql);
710       if (is_a($affected, 'PEAR_Error')) return false;
711
712       // Delete custom field.
713       $sql = "delete from tt_custom_fields where id = $field_id";
714       $affected = $mdb2->exec($sql);
715       if (is_a($affected, 'PEAR_Error')) return false;
716     }
717
718     return true;
719   }
720 }