<br>
<table cellspacing="0" cellpadding="4" width="100%" border="0">
<tr>
- <td align="center"> Anuko Time Tracker 1.19.6.5021 | Copyright © <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
+ <td align="center"> Anuko Time Tracker 1.19.7.5022 | Copyright © <a href="https://www.anuko.com/lp/tt_3.htm" target="_blank">Anuko</a> |
<a href="https://www.anuko.com/lp/tt_4.htm" target="_blank">{$i18n.footer.credits}</a> |
<a href="https://www.anuko.com/lp/tt_5.htm" target="_blank">{$i18n.footer.license}</a> |
<a href="https://www.anuko.com/lp/tt_7.htm" target="_blank">{$i18n.footer.improve}</a>
if ($err->no()) {
$form->addInput(array('type'=>'text','maxlength'=>'100','name'=>'name','value'=>$field['label']));
$form->addInput(array('type'=>'hidden','name'=>'id','value'=>$cl_id));
- $form->addInput(array('type'=>'checkbox','name'=>'required','value'=>$field['required']));
$form->addInput(array('type'=>'combobox','name'=>'type','value'=>$field['type'],
'data'=>array(CustomFields::TYPE_TEXT=>$i18n->get('label.type_text'),
CustomFields::TYPE_DROPDOWN=>$i18n->get('label.type_dropdown'))));
+ $form->addInput(array('type'=>'checkbox','name'=>'required','value'=>$field['required']));
$form->addInput(array('type'=>'submit','name'=>'btn_save','value'=>$i18n->get('button.save')));
}
ttExecute("UPDATE `tt_site_config` SET param_value = '1.19.0', modified = now() where param_name = 'version_db' and param_value = '1.18.61'");
}
- if ($_POST["convert11900to11906"]) {
+ if ($_POST["convert11900to11907"]) {
ttExecute("CREATE TABLE `tt_work_currencies` (`id` int(10) unsigned NOT NULL,`name` varchar(10) NOT NULL,PRIMARY KEY (`id`))");
ttExecute("create unique index currency_idx on tt_work_currencies(`name`)");
ttExecute("INSERT INTO `tt_work_currencies` (`id`, `name`) VALUES ('1', 'USD'), ('2', 'CAD'), ('3', 'AUD'), ('4', 'EUR'), ('5', 'NZD')");
ttExecute("update `tt_custom_fields` inner join `tt_site_config` sc on (sc.param_name = 'version_db' and sc.param_value = '1.19.4') set entity_type = 1 where entity_type = 'time'");
ttExecute("ALTER TABLE `tt_custom_fields` modify entity_type tinyint(4) NOT NULL default '1'");
ttExecute("UPDATE `tt_site_config` SET param_value = '1.19.6', modified = now() where param_name = 'version_db' and param_value = '1.19.4'");
+ ttExecute("CREATE TABLE `tt_entity_custom_fields` (`id` int(10) unsigned NOT NULL auto_increment,`group_id` int(10) unsigned NOT NULL,`org_id` int(10) unsigned NOT NULL,`entity_type` tinyint(4) NOT NULL,`entity_id` int(10) unsigned NOT NULL,`field_id` int(10) unsigned NOT NULL,`option_id` int(10) unsigned default NULL,`value` varchar(255) default NULL,`created` datetime default NULL,`created_ip` varchar(45) default NULL,`created_by` int(10) unsigned default NULL,`modified` datetime default NULL,`modified_ip` varchar(45) default NULL,`modified_by` int(10) unsigned default NULL,`status` tinyint(4) default 1,PRIMARY KEY (`id`))");
+ ttExecute("create unique index entity_idx on tt_entity_custom_fields(entity_type, entity_id, field_id)");
+ ttExecute("UPDATE `tt_site_config` SET param_value = '1.19.7', modified = now() where param_name = 'version_db' and param_value = '1.19.6'");
}
if ($_POST["cleanup"]) {
<h2>DB Install</h2>
<table width="80%" border="1" cellpadding="10" cellspacing="0">
<tr>
- <td width="80%"><b>Create database structure (v1.19.6)</b>
+ <td width="80%"><b>Create database structure (v1.19.7)</b>
<br>(applies only to new installations, do not execute when updating)</br></td><td><input type="submit" name="crstructure" value="Create"></td>
</tr>
</table>
<td><input type="submit" name="convert11797to11900" value="Update"></td>
</tr>
<tr valign="top">
- <td>Update database structure (v1.19 to v1.19.6)</td>
- <td><input type="submit" name="convert11900to11906" value="Update"></td>
+ <td>Update database structure (v1.19 to v1.19.7)</td>
+ <td><input type="submit" name="convert11900to11907" value="Update"></td>
</tr>
</table>
create index log_idx on tt_custom_field_log(log_id);
+#
+# Structure for table tt_entity_custom_fields.
+# This table stores custom field values for entities such as users and projects
+# except for "time" entity (and possibly "expense" in future).
+# "time" custom fields are kept separately in tt_custom_field_log
+# because tt_log (and tt_custom_field_log) can grow very large.
+#
+CREATE TABLE `tt_entity_custom_fields` (
+ `id` int(10) unsigned NOT NULL auto_increment, # record id in this table
+ `group_id` int(10) unsigned NOT NULL, # group id
+ `org_id` int(10) unsigned NOT NULL, # organization id
+ `entity_type` tinyint(4) NOT NULL, # entity type
+ `entity_id` int(10) unsigned NOT NULL, # entity id this record corresponds to
+ `field_id` int(10) unsigned NOT NULL, # custom field id
+ `option_id` int(10) unsigned default NULL, # Option id. Used for dropdown custom fields.
+ `value` varchar(255) default NULL, # Text value. Used for text custom fields.
+ `created` datetime default NULL, # creation timestamp
+ `created_ip` varchar(45) default NULL, # creator ip
+ `created_by` int(10) unsigned default NULL, # creator user_id
+ `modified` datetime default NULL, # modification timestamp
+ `modified_ip` varchar(45) default NULL, # modifier ip
+ `modified_by` int(10) unsigned default NULL, # modifier user_id
+ `status` tinyint(4) default 1, # record status
+ PRIMARY KEY (`id`)
+);
+
+# Create an index that guarantees unique custom fields per entity.
+create unique index entity_idx on tt_entity_custom_fields(entity_type, entity_id, field_id);
+
+
#
# Structure for table tt_expense_items.
# This table lists expense items.
PRIMARY KEY (`param_name`)
);
-INSERT INTO `tt_site_config` (`param_name`, `param_value`, `created`) VALUES ('version_db', '1.19.6', now()); # TODO: change when structure changes.
+INSERT INTO `tt_site_config` (`param_name`, `param_value`, `created`) VALUES ('version_db', '1.19.7', now()); # TODO: change when structure changes.
$res = $mdb2->query($sql);
if (!is_a($res, 'PEAR_Error')) {
while ($val = $res->fetchRow()) {
- $fields[] = $val; // array('id'=>$val['id'],'type'=>$val['type'],'label'=>$val['label']);
+ $fields[] = $val;
}
return $fields;
}