diff --git a/.env b/.env deleted file mode 100644 index a00856310..000000000 --- a/.env +++ /dev/null @@ -1,3 +0,0 @@ -DB_NAME=dotproject -DB_USER=dotproject -DB_PASSWORD=somepass diff --git a/.env.dist b/.env.dist new file mode 100644 index 000000000..7461ca736 --- /dev/null +++ b/.env.dist @@ -0,0 +1,3 @@ +DB_NAME= +DB_USER= +DB_PASSWORD= diff --git a/.env.testing.dist b/.env.testing.dist new file mode 100644 index 000000000..b00a8f7b2 --- /dev/null +++ b/.env.testing.dist @@ -0,0 +1,7 @@ +TEST_DB_HOST= +TEST_DB_NAME= +TEST_DB_USER= +TEST_DB_PASS= + +TEST_ADMIN_USER= +TEST_ADMIN_PASS= diff --git a/.gitignore b/.gitignore index 4ff8ca3f2..727977149 100644 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,46 @@ files/* !files/temp/index.html lib/ezpdf/fonts/php_* /nbproject/private/ -/nbproject /dotProject/ !/modules/files/ + +/vendor/ + +##### IDE ##### +# phpstorm +.idea/ + +# netbeans +nbproject/ +build/ +nbbuild/ +dist/ +nbdist/ +nbactions.xml +nb-configuration.xml + +# vscode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json +!.vscode/*.code-snippets + +# Local History for Visual Studio Code +.history/ + +# Built Visual Studio Code Extensions +*.vsix + +# codeception +tests/acceptance.suite.yml +tests/functional.suite.yml +tests/unit.suite.yml + +# php documentation stuff +.phpdoc/* + +# env +.env +.env.testing diff --git a/ORIGINAL_README.md b/ORIGINAL_README.md new file mode 100644 index 000000000..036a99bc7 --- /dev/null +++ b/ORIGINAL_README.md @@ -0,0 +1,39 @@ +# dotProject + +dotProject is an open source project management system written in PHP. + +It originally started in 2001 by dotMarketing on SourceForge and has +been under the watchful eye of the current dotProject team since around December 2002. + +## Installing/Upgrading + +**NOTE** The `devel` branch is where all the development happens. If you want the latest and greatest with all relevent bug fixes between releases, then download from https://github.com/dotproject/dotProject/archive/devel.zip + +`master` tracks the current release. + +**The Quick Way**: Point your browser to the `install` directory. + +## Support + +Support forums are at http://forums.dotproject.net/index.php + +Bug reports and other issues can be lodged on GitHub at https://github.com/dotproject/dotProject/issues + +IRC channel is irc://irc.freenode.net/dotproject on `#dotproject` on `irc.freenode.net` + +## License + +As of version 2.0, dotProject is released under GPL. +1.0.2 and previous versions were released under BSD license. +Parts of dotProject include libraries from other projects which are used and re-released under their original licence. + +## Docker composer support + +The latest devel branch now includes a simple docker-compose.yml file and support files. These will allow you to run dotProject by running: + +`docker-compose up` + +This will set up an nginx container, a phpfpm container and a mariadb container and point the web server to the base directory of dotProject. All you need to do after that is point your browser to http://localhost/ + +`docker-compose down` will retain any data you have created. If you want to start again from a clean slate, use `docker-compose down -v` to remove the database volume. + diff --git a/README.md b/README.md index 036a99bc7..354c50647 100644 --- a/README.md +++ b/README.md @@ -1,39 +1,28 @@ -# dotProject +# README -dotProject is an open source project management system written in PHP. +## Goal +- Put acceptance tests in place + - Refactor code so that it can be unit tested + - Put unit tests in place + - Upgrade to work with later versions of PHP -It originally started in 2001 by dotMarketing on SourceForge and has -been under the watchful eye of the current dotProject team since around December 2002. -## Installing/Upgrading +## System Requirements +- PHP up to version 7.4 +- Mysql up to version 8 -**NOTE** The `devel` branch is where all the development happens. If you want the latest and greatest with all relevent bug fixes between releases, then download from https://github.com/dotproject/dotProject/archive/devel.zip +## Other Notes +My current setup to run Dotproject is on a Mac using [Laravel Valet](https://laravel.com/docs/9.x/valet). -`master` tracks the current release. +In the terminal and in the current directory of the project: +- type: valet link +- type: valet isolate php@7.4 +- then in the browser: http://dotproject.test -**The Quick Way**: Point your browser to the `install` directory. +Notes on [running tests](./tests/help.md). Tests are in no way complete or nearing anything useful. They are there for the purpose of learning to test. +For what it is worth, codeception is setup so that developers can jump in start writing tests. -## Support -Support forums are at http://forums.dotproject.net/index.php - -Bug reports and other issues can be lodged on GitHub at https://github.com/dotproject/dotProject/issues - -IRC channel is irc://irc.freenode.net/dotproject on `#dotproject` on `irc.freenode.net` - -## License - -As of version 2.0, dotProject is released under GPL. -1.0.2 and previous versions were released under BSD license. -Parts of dotProject include libraries from other projects which are used and re-released under their original licence. - -## Docker composer support - -The latest devel branch now includes a simple docker-compose.yml file and support files. These will allow you to run dotProject by running: - -`docker-compose up` - -This will set up an nginx container, a phpfpm container and a mariadb container and point the web server to the base directory of dotProject. All you need to do after that is point your browser to http://localhost/ - -`docker-compose down` will retain any data you have created. If you want to start again from a clean slate, use `docker-compose down -v` to remove the database volume. +--- +For running it in docker, see the [Original DotProject Readme](./ORIGINAL_README.md) diff --git a/base.php b/base.php index 25d140e4b..4668f1668 100644 --- a/base.php +++ b/base.php @@ -20,7 +20,7 @@ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA }}} */ -ini_set('display_errors', 1); +ini_set('display_errors', 0); if (defined('E_DEPRECATED')) { error_reporting(E_ALL & ~(E_DEPRECATED|E_NOTICE|E_STRICT)); diff --git a/classes/CDate.php b/classes/CDate.php new file mode 100644 index 000000000..939709fc2 --- /dev/null +++ b/classes/CDate.php @@ -0,0 +1,377 @@ +setDate($date, $format); + $date = $dateobj; + } + + return parent::Date($date); + } + + /** + * extend PEAR Date's format() meet to translation needs + */ + function format($format) { + global $AppUI; + $AppUI->setBaseLocale(); + $output = parent::format($format); + setlocale(LC_ALL, $AppUI->user_lang); + return $output; + } + + function after($when) + { + if (!is_object($when)) { + $when = new CDate($when); + } + return parent::after($when); + } + + /** + * Overloaded compare method + * + * The convertTZ calls are time intensive calls. When a compare call is + * made in a recussive loop the lag can be significant. + */ + function compare($d1, $d2, $convertTZ=false) + { + if (!is_object($d1)) { + $d1 = new CDate($d1); + } else if (!is_object($d2)) { + $d2 = new CDate($d2); + } + if ($convertTZ) { + $d1->convertTZ(new Date_TimeZone('UTC')); + $d2->convertTZ(new Date_TimeZone('UTC')); + } + $days1 = Date_Calc::dateToDays($d1->day, $d1->month, $d1->year); + $days2 = Date_Calc::dateToDays($d2->day, $d2->month, $d2->year); + + $comp_value = 0; + if ($days1 - $days2) { + $comp_value = $days1 - $days2; + } else if ($d1->hour - $d2->hour) { + $comp_value = dPsgn($d1->hour - $d2->hour); + } else if ($d1->minute - $d2->minute) { + $comp_value = dPsgn($d1->minute - $d2->minute); + } else if ($d1->second - $d2->second) { + $comp_value = dPsgn($d1->second - $d2->second); + } + return dPsgn($comp_value); + } + + /** + * Adds (+/-) a number of days to the current date. + * @param int Positive or negative number of days + * @author J. Christopher Pereira + */ + function addDays($n) { + $timeStamp = $this->getTime(); + $oldHour = $this->getHour(); + $this->setDate($timeStamp + SEC_DAY * ceil($n), DATE_FORMAT_UNIXTIME); + + if (($oldHour - $this->getHour()) || !is_int($n)) { + $timeStamp += ($oldHour - $this->getHour()) * SEC_HOUR; + $this->setDate($timeStamp + SEC_DAY * $n, DATE_FORMAT_UNIXTIME); + } + } + + /** + * Adds (+/-) a number of months to the current date. + * @param int Positive or negative number of months + * @author Andrew Eddie + */ + function addMonths($n) { + $an = abs($n); + $years = floor($an / 12); + $months = $an % 12; + + if ($n < 0) { + $this->year -= $years; + $this->month -= $months; + if ($this->month < 1) { + $this->year--; + $this->month = 12 + $this->month; + } + } else { + $this->year += $years; + $this->month += $months; + if ($this->month > 12) { + $this->year++; + $this->month -= 12; + } + } + } + + /** + * New method to get the difference in days the stored date + * @param Date The date to compare to + * @author Andrew Eddie + */ + function dateDiff($when, $ignoretime = false) { + return Date_calc::dateDiff($this->getDay(), $this->getMonth(), $this->getYear(), + $when->getDay(), $when->getMonth(), $when->getYear()); + } + + /** + * New method that sets hour, minute and second in a single call + * @param int hour + * @param int minute + * @param int second + * @author Andrew Eddie + */ + function setTime($h=0, $m=0, $s=0) { + $this->setHour($h); + $this->setMinute($m); + $this->setSecond($s); + } + + function isWorkingDay() { + global $AppUI; + + $working_days = dPgetConfig("cal_working_days"); + $working_days = ((is_null($working_days)) ? array('1','2','3','4','5') : explode(",", $working_days)); + return in_array($this->getDayOfWeek(), $working_days); + } + + function getAMPM() { + return (($this->getHour() > 11) ? 'pm' : 'am'); + } + + /* Return date obj for the end of the next working day + ** @param bool Determine whether to set time to start of day or preserve the time of the given object + */ + function next_working_day($preserveHours = false) { + global $AppUI; + $do = $this; + $end = intval(dPgetConfig('cal_day_end')); + $start = intval(dPgetConfig('cal_day_start')); + while (! $this->isWorkingDay() || $this->getHour() > $end || + ($preserveHours == false && $this->getHour() == $end && $this->getMinute() == '0')) { + $this->addDays(1); + $this->setTime($start, '0', '0'); + } + + if ($preserveHours) { + $this->setTime($do->getHour(), '0', '0'); + } + + return $this; + } + + + /* Return date obj for the end of the previous working day + ** @param bool Determine whether to set time to end of day or preserve the time of the given object + */ + function prev_working_day($preserveHours = false) { + global $AppUI; + $do = $this; + $end = intval(dPgetConfig('cal_day_end')); + $start = intval(dPgetConfig('cal_day_start')); + while (! $this->isWorkingDay() || ($this->getHour() < $start) || + ($this->getHour() == $start && $this->getMinute() == '0')) { + $this->addDays(-1); + $this->setTime($end, '0', '0'); + } + if ($preserveHours) { + $this->setTime($do->getHour(), '0', '0'); + } + + return $this; + } + + + /* Calculating _robustly_ a date from a given date and duration + ** Works in both directions: forwards/prospective and backwards/retrospective + ** Respects non-working days + ** @param int duration (positive = forward, negative = backward) + ** @param int durationType; 1 = hour; 24 = day; + ** @return obj Shifted DateObj + */ + + function addDuration($duration = '8', $durationType ='1') { + // using a sgn function lets us easily cover + // prospective and retrospective calcs at the same time + + // get signum of the duration + $sgn = dPsgn($duration); + + // make duration positive + $duration = abs($duration); + + if ($durationType == '24') { // duration type is 24, full days, we're finished very quickly + $full_working_days = $duration; + } else if ($durationType == '1') { // durationType is 1 hour + // get dP time constants + $cal_day_start = intval(dPgetConfig('cal_day_start')); + $cal_day_end = intval(dPgetConfig('cal_day_end')); + $dwh = intval(dPgetConfig('daily_working_hours')); + + // move to the next working day if the first day is a non-working day + ($sgn > 0) ? $this->next_working_day() : $this->prev_working_day(); + + // calculate the hours spent on the first day + $firstDay = ($sgn > 0) ? min($cal_day_end - $this->hour, $dwh) : min($this->hour - $cal_day_start, $dwh); + + /* + ** Catch some possible inconsistencies: + ** If we're later than cal_end_day or sooner than cal_start_day then we don't need to + ** subtract any time from duration. The difference is greater than the # of daily working hours + */ + if ($firstDay < 0) { + $firstDay = 0; + } + // Intraday additions are handled easily by just changing the hour value + if ($duration <= $firstDay) { + ($sgn > 0) ? $this->setHour($this->hour+$duration) : $this->setHour($this->hour-$duration); + return $this; + } + + // the effective first day hours value + $firstAdj = min($dwh, $firstDay); + + // subtract the first day hours from the total duration + $duration -= $firstAdj; + + // we've already processed the first day; move by one day! + $this->addDays(1 * $sgn); + + // make sure that we didn't move to a non-working day + ($sgn > 0) ? $this->next_working_day() : $this->prev_working_day(); + + // end of proceeding the first day + + // calc the remaining time and the full working days part of this residual + $hoursRemaining = ($duration > $dwh) ? ($duration % $dwh) : $duration; + $full_working_days = round(($duration - $hoursRemaining) / $dwh); + + // (proceed the full days later) + + // proceed the last day now + + // we prefer wed 16:00 over thu 08:00 as end date :) + if ($hoursRemaining == 0 && $full_working_days > 0) { + $full_working_days--; + ($sgn > 0) ? $this->setHour($cal_day_start+$dwh) : $this->setHour($cal_day_end-$dwh); + } else { + ($sgn > 0) ? $this->setHour($cal_day_start+$hoursRemaining) : $this->setHour($cal_day_end-$hoursRemaining); + } + //end of proceeding the last day + } + + // proceeding the fulldays finally which is easy + // Full days + for ($i = 0 ; $i < $full_working_days ; $i++) { + $this->addDays(1 * $sgn); + if (!$this->isWorkingDay()) { + // just 'ignore' this non-working day + $full_working_days++; + } + } + //end of proceeding the fulldays + + return $this->next_working_day(); + } + + + /* Calculating _robustly_ the working duration between two dates + ** + ** Works in both directions: forwards/prospective and backwards/retrospective + ** Respects non-working days + ** + ** + ** @param obj DateObject may be viewed as end date + ** @return int working duration in hours + */ + function calcDuration($e) { + + // since one will alter the date ($this) one better copies it to a new instance + $s = new CDate(); + $s->copy($this); + + // get dP time constants + $cal_day_start = intval(dPgetConfig('cal_day_start')); + $cal_day_end = intval(dPgetConfig('cal_day_end')); + $dwh = intval(dPgetConfig('daily_working_hours')); + + // assume start is before end and set a default signum for the duration + $sgn = 1; + + // check whether start before end, interchange otherwise + if ($e->before($s)) { + // calculated duration must be negative, set signum appropriately + $sgn = -1; + + $dummy = $s; + $s->copy($e); + $e = $dummy; + } + + // determine the (working + non-working) day difference between the two dates + $days = abs($e->dateDiff($s)); + + // if it is an intraday difference one is finished very easily + if ($days == 0) { + return min($dwh, abs($e->hour - $s->hour)) * $sgn; + } + + // initialize the duration var + $duration = 0; + + // process the first day + // take into account the first day if it is a working day! + $day_endpoint = (($sgn > 0) ? $cal_day_end : $cal_day_start); + $duration += $s->isWorkingDay() ? min($dwh, abs($day_endpoint - $s->hour)) : 0; + $s->addDays(1 * $sgn); + + // end of processing the first day + + // calc workingdays between start and end + for ($i=1; $i < $days; $i++) { + $duration += $s->isWorkingDay() ? $dwh : 0; + $s->addDays(1 * $sgn); + } + + // take into account the last day in span only if it is a working day! + $day_endpoint = (($sgn > 0) ? $cal_day_start : $cal_day_end); + $duration += $s->isWorkingDay() ? min($dwh, abs($e->hour - $day_endpoint)) : 0; + + return $duration * $sgn; + } + + function workingDaysInSpan($e) { + global $AppUI; + + // assume start is before end and set a default signum for the duration + $sgn = 1; + + // check whether start before end, interchange otherwise + if ($e->before($this)) { + // duration is negative, set signum appropriately + $sgn = -1; + } + + $wd = 0; + $days = $e->dateDiff($this); + $start = $this; + + for ($i = 0 ; $i <= $days ; $i++) { + if ($start->isWorkingDay()) { + $wd++; + } + $start->addDays(1 * $sgn); + } + + return $wd; + } +} diff --git a/classes/SQLAuthenticator.php b/classes/SQLAuthenticator.php new file mode 100644 index 000000000..1a4397bfa --- /dev/null +++ b/classes/SQLAuthenticator.php @@ -0,0 +1,69 @@ +username = $username; + + $q = $this->getDBQueryObj(); + $q->addTable('users'); + $q->addQuery('user_id, user_password'); + $q->addWhere("user_username = '$username'"); + if (!$rs = $q->exec()) { + $q->clear(); + return false; + } + if (!$row = $q->fetchRow()) { + $q->clear(); + return false; + } + + $this->user_id = $row["user_id"]; + $q->clear(); + + return $this->comparePasswords($password, $row["user_password"]); + } + + /** + * Verifies that passwords are the same + * + * @param [string] $fPassword ex: from form + * @param [string] $dbPassword ex: from database + * @return boolean + */ + function comparePasswords($fPassword, $dbPassword) { + if (MD5($fPassword) == $dbPassword) return true; + return false; + } + + /** + * separated out so that authenticate() can be unit tested + */ + function getDBQueryObj() { + return new DBQuery; + } + + function userId($username) + { + // We ignore the username provided + return $this->user_id; + } +} diff --git a/classes/TestClass.php b/classes/TestClass.php new file mode 100644 index 000000000..95c4b9c25 --- /dev/null +++ b/classes/TestClass.php @@ -0,0 +1,9 @@ +username = $username; + + $q = $this->getDBQueryObj(); + $q->addTable('users'); + $q->addQuery('user_id, user_password'); + $q->addWhere("user_username = '$username'"); + if (!$rs = $q->exec()) { + $q->clear(); + return false; + } + if (!$row = $q->fetchRow()) { + $q->clear(); + return false; + } + + $this->user_id = $row["user_id"]; + $q->clear(); + + + return $this->comparePasswords($password, $row["user_password"]); + + } + + /** + * Verifies that passwords are the same + * + * @param [string] $fPassword ex: from form + * @param [string] $dbPassword ex: from database + * @return boolean + */ + function comparePasswords($fPassword, $dbPassword) { + if (MD5($fPassword) == $dbPassword) return true; + return false; + } + + /** + * separated out so that authenticate() can be unit tested + */ + function getDBQueryObj() { + return new DBQuery; + } + + function userId($username) + { + // We ignore the username provided + return $this->user_id; + } +} + + +/** * PostNuke authentication has encoded information - * passed in on the login request. This needs to + * passed in on the login request. This needs to * be extracted and verified. */ class PostNukeAuthenticator extends SQLAuthenticator @@ -87,7 +159,7 @@ function authenticate($username, $password) $first_name = implode(' ', $names); $passwd = trim($user_data['passwd']); $email = trim($user_data['email']); - + $q = new DBQuery; $q->addTable('users'); $q->addQuery('user_id, user_password, user_contact'); @@ -129,7 +201,7 @@ function createsqluser($username, $password, $email, $first, $last) GLOBAL $db, $AppUI; require_once($AppUI->getModuleClass("contacts")); - + $c = New CContact(); $c->contact_first_name = $first; $c->contact_last_name = $last; @@ -158,42 +230,7 @@ function createsqluser($username, $password, $email, $first, $last) } } - class SQLAuthenticator - { - var $user_id; - var $username; - function authenticate($username, $password) - { - GLOBAL $db, $AppUI; - - $this->username = $username; - - $q = new DBQuery; - $q->addTable('users'); - $q->addQuery('user_id, user_password'); - $q->addWhere("user_username = '$username'"); - if (!$rs = $q->exec()) { - $q->clear(); - return false; - } - if (!$row = $q->fetchRow()) { - $q->clear(); - return false; - } - - $this->user_id = $row["user_id"]; - $q->clear(); - if (MD5($password) == $row["user_password"]) return true; - return false; - } - - function userId($username) - { - // We ignore the username provided - return $this->user_id; - } - } class LDAPAuthenticator extends SQLAuthenticator { @@ -202,7 +239,7 @@ class LDAPAuthenticator extends SQLAuthenticator var $ldap_version; var $base_dn; var $ldap_search_user; - var $ldap_search_pass; + var $ldap_search_pass; var $filter; var $user_id; @@ -231,7 +268,7 @@ function authenticate($username, $password) if (mb_strlen($password) == 0) return false; // LDAP will succeed binding with no password on AD (defaults to anon bind) if ($this->fallback == true) { - if (parent::authenticate($username, $password)) return true; + if (parent::authenticate($username, $password)) return true; } // Fallback SQL authentication fails, proceed with LDAP @@ -243,13 +280,13 @@ function authenticate($username, $password) @ldap_set_option($rs, LDAP_OPT_REFERRALS, 0); //$ldap_bind_dn = "cn=".$this->ldap_search_user.",".$this->base_dn; - $ldap_bind_dn = empty($this->ldap_search_user) ? NULL : $this->ldap_search_user; + $ldap_bind_dn = empty($this->ldap_search_user) ? NULL : $this->ldap_search_user; $ldap_bind_pw = empty($this->ldap_search_pass) ? NULL : $this->ldap_search_pass; if (!$bindok = @ldap_bind($rs, $ldap_bind_dn, $ldap_bind_pw)) { // Uncomment for LDAP debugging - /* + /* $error_msg = ldap_error($rs); die("Couldnt Bind Using ".$ldap_bind_dn."@".$this->ldap_host.":".$this->ldap_port." Because:".$error_msg); */ @@ -260,7 +297,7 @@ function authenticate($username, $password) $filter_r = html_entity_decode(str_replace("%USERNAME%", $username, $this->filter), ENT_COMPAT, 'UTF-8'); $result = @ldap_search($rs, $this->base_dn, $filter_r); if (!$result) return false; // ldap search returned nothing or error - + $result_user = ldap_get_entries($rs, $result); if ($result_user["count"] == 0) return false; // No users match the filter @@ -285,10 +322,10 @@ function authenticate($username, $password) } else { - $this->createsqluser($username, $password, $first_user); + $this->createsqluser($username, $password, $first_user); } return true; - } + } } } @@ -300,7 +337,7 @@ function userExists($username) $q->addTable('users'); $q->addWhere("user_username = '$username'"); $rs = $q->exec(); - if ($rs->RecordCount() > 0) + if ($rs->RecordCount() > 0) $result = true; $q->clear(); return $result; @@ -315,7 +352,7 @@ function userId($username) $rs = $q->exec(); $row = $rs->FetchRow(); $q->clear(); - return $row["user_id"]; + return $row["user_id"]; } function createsqluser($username, $password, $ldap_attribs = Array()) @@ -324,7 +361,7 @@ function createsqluser($username, $password, $ldap_attribs = Array()) $hash_pass = MD5($password); require_once($AppUI->getModuleClass("contacts")); - + if (!count($ldap_attribs) == 0) { // Contact information based on the inetOrgPerson class schema diff --git a/classes/date.class.php b/classes/date.class.php index d88826189..bfe71b008 100644 --- a/classes/date.class.php +++ b/classes/date.class.php @@ -1,4 +1,6 @@ setDate($date, $format); $date = $dateobj; } - + return parent::Date($date); } @@ -90,7 +92,7 @@ function compare($d1, $d2, $convertTZ=false) } $days1 = Date_Calc::dateToDays($d1->day, $d1->month, $d1->year); $days2 = Date_Calc::dateToDays($d2->day, $d2->month, $d2->year); - + $comp_value = 0; if ($days1 - $days2) { $comp_value = $days1 - $days2; @@ -100,7 +102,7 @@ function compare($d1, $d2, $convertTZ=false) $comp_value = dPsgn($d1->minute - $d2->minute); } else if ($d1->second - $d2->second) { $comp_value = dPsgn($d1->second - $d2->second); - } + } return dPsgn($comp_value); } @@ -113,7 +115,7 @@ function addDays($n) { $timeStamp = $this->getTime(); $oldHour = $this->getHour(); $this->setDate($timeStamp + SEC_DAY * ceil($n), DATE_FORMAT_UNIXTIME); - + if (($oldHour - $this->getHour()) || !is_int($n)) { $timeStamp += ($oldHour - $this->getHour()) * SEC_HOUR; $this->setDate($timeStamp + SEC_DAY * $n, DATE_FORMAT_UNIXTIME); @@ -129,7 +131,7 @@ function addMonths($n) { $an = abs($n); $years = floor($an / 12); $months = $an % 12; - + if ($n < 0) { $this->year -= $years; $this->month -= $months; @@ -154,7 +156,7 @@ function addMonths($n) { */ function dateDiff($when, $ignoretime = false) { return Date_calc::dateDiff($this->getDay(), $this->getMonth(), $this->getYear(), - $when->getDay(), $when->getMonth(), $when->getYear()); + $when->getDay(), $when->getMonth(), $when->getYear()); } /** @@ -169,22 +171,22 @@ function setTime($h=0, $m=0, $s=0) { $this->setMinute($m); $this->setSecond($s); } - + function isWorkingDay() { global $AppUI; - + $working_days = dPgetConfig("cal_working_days"); $working_days = ((is_null($working_days)) ? array('1','2','3','4','5') : explode(",", $working_days)); return in_array($this->getDayOfWeek(), $working_days); } - + function getAMPM() { return (($this->getHour() > 11) ? 'pm' : 'am'); } - + /* Return date obj for the end of the next working day ** @param bool Determine whether to set time to start of day or preserve the time of the given object - */ + */ function next_working_day($preserveHours = false) { global $AppUI; $do = $this; @@ -195,18 +197,18 @@ function next_working_day($preserveHours = false) { $this->addDays(1); $this->setTime($start, '0', '0'); } - + if ($preserveHours) { $this->setTime($do->getHour(), '0', '0'); } - + return $this; } - - + + /* Return date obj for the end of the previous working day ** @param bool Determine whether to set time to end of day or preserve the time of the given object - */ + */ function prev_working_day($preserveHours = false) { global $AppUI; $do = $this; @@ -220,29 +222,29 @@ function prev_working_day($preserveHours = false) { if ($preserveHours) { $this->setTime($do->getHour(), '0', '0'); } - + return $this; } - - + + /* Calculating _robustly_ a date from a given date and duration ** Works in both directions: forwards/prospective and backwards/retrospective ** Respects non-working days ** @param int duration (positive = forward, negative = backward) ** @param int durationType; 1 = hour; 24 = day; ** @return obj Shifted DateObj - */ - + */ + function addDuration($duration = '8', $durationType ='1') { - // using a sgn function lets us easily cover + // using a sgn function lets us easily cover // prospective and retrospective calcs at the same time - + // get signum of the duration $sgn = dPsgn($duration); - + // make duration positive $duration = abs($duration); - + if ($durationType == '24') { // duration type is 24, full days, we're finished very quickly $full_working_days = $duration; } else if ($durationType == '1') { // durationType is 1 hour @@ -250,13 +252,13 @@ function addDuration($duration = '8', $durationType ='1') { $cal_day_start = intval(dPgetConfig('cal_day_start')); $cal_day_end = intval(dPgetConfig('cal_day_end')); $dwh = intval(dPgetConfig('daily_working_hours')); - + // move to the next working day if the first day is a non-working day ($sgn > 0) ? $this->next_working_day() : $this->prev_working_day(); - - // calculate the hours spent on the first day + + // calculate the hours spent on the first day $firstDay = ($sgn > 0) ? min($cal_day_end - $this->hour, $dwh) : min($this->hour - $cal_day_start, $dwh); - + /* ** Catch some possible inconsistencies: ** If we're later than cal_end_day or sooner than cal_start_day then we don't need to @@ -270,29 +272,29 @@ function addDuration($duration = '8', $durationType ='1') { ($sgn > 0) ? $this->setHour($this->hour+$duration) : $this->setHour($this->hour-$duration); return $this; } - + // the effective first day hours value $firstAdj = min($dwh, $firstDay); - + // subtract the first day hours from the total duration $duration -= $firstAdj; - + // we've already processed the first day; move by one day! $this->addDays(1 * $sgn); - + // make sure that we didn't move to a non-working day ($sgn > 0) ? $this->next_working_day() : $this->prev_working_day(); - + // end of proceeding the first day - + // calc the remaining time and the full working days part of this residual $hoursRemaining = ($duration > $dwh) ? ($duration % $dwh) : $duration; $full_working_days = round(($duration - $hoursRemaining) / $dwh); - + // (proceed the full days later) - + // proceed the last day now - + // we prefer wed 16:00 over thu 08:00 as end date :) if ($hoursRemaining == 0 && $full_working_days > 0) { $full_working_days--; @@ -302,22 +304,22 @@ function addDuration($duration = '8', $durationType ='1') { } //end of proceeding the last day } - + // proceeding the fulldays finally which is easy // Full days for ($i = 0 ; $i < $full_working_days ; $i++) { $this->addDays(1 * $sgn); if (!$this->isWorkingDay()) { - // just 'ignore' this non-working day + // just 'ignore' this non-working day $full_working_days++; } } //end of proceeding the fulldays - + return $this->next_working_day(); } - - + + /* Calculating _robustly_ the working duration between two dates ** ** Works in both directions: forwards/prospective and backwards/retrospective @@ -326,86 +328,86 @@ function addDuration($duration = '8', $durationType ='1') { ** ** @param obj DateObject may be viewed as end date ** @return int working duration in hours - */ + */ function calcDuration($e) { - + // since one will alter the date ($this) one better copies it to a new instance $s = new CDate(); $s->copy($this); - + // get dP time constants $cal_day_start = intval(dPgetConfig('cal_day_start')); $cal_day_end = intval(dPgetConfig('cal_day_end')); $dwh = intval(dPgetConfig('daily_working_hours')); - - // assume start is before end and set a default signum for the duration + + // assume start is before end and set a default signum for the duration $sgn = 1; - + // check whether start before end, interchange otherwise if ($e->before($s)) { // calculated duration must be negative, set signum appropriately $sgn = -1; - + $dummy = $s; - $s->copy($e); + $s->copy($e); $e = $dummy; - } - + } + // determine the (working + non-working) day difference between the two dates $days = abs($e->dateDiff($s)); - + // if it is an intraday difference one is finished very easily if ($days == 0) { return min($dwh, abs($e->hour - $s->hour)) * $sgn; } - + // initialize the duration var $duration = 0; - + // process the first day // take into account the first day if it is a working day! $day_endpoint = (($sgn > 0) ? $cal_day_end : $cal_day_start); $duration += $s->isWorkingDay() ? min($dwh, abs($day_endpoint - $s->hour)) : 0; $s->addDays(1 * $sgn); - + // end of processing the first day - + // calc workingdays between start and end for ($i=1; $i < $days; $i++) { $duration += $s->isWorkingDay() ? $dwh : 0; $s->addDays(1 * $sgn); } - + // take into account the last day in span only if it is a working day! $day_endpoint = (($sgn > 0) ? $cal_day_start : $cal_day_end); $duration += $s->isWorkingDay() ? min($dwh, abs($e->hour - $day_endpoint)) : 0; - + return $duration * $sgn; - } - + } + function workingDaysInSpan($e) { global $AppUI; - - // assume start is before end and set a default signum for the duration + + // assume start is before end and set a default signum for the duration $sgn = 1; - + // check whether start before end, interchange otherwise if ($e->before($this)) { // duration is negative, set signum appropriately $sgn = -1; - } - + } + $wd = 0; $days = $e->dateDiff($this); $start = $this; - + for ($i = 0 ; $i <= $days ; $i++) { if ($start->isWorkingDay()) { $wd++; } $start->addDays(1 * $sgn); } - + return $wd; } } diff --git a/classes/dp.class.php b/classes/dp.class.php index a64e8ea18..f28375b75 100644 --- a/classes/dp.class.php +++ b/classes/dp.class.php @@ -10,8 +10,10 @@ die('You should not access this file directly.'); } -require_once $AppUI->getSystemClass('query'); -require_once $AppUI->getModuleClass('system'); +if (!defined('UNIT_TEST')) { + require_once $AppUI->getSystemClass('query'); + require_once $AppUI->getModuleClass('system'); +} /** * CDpObject Abstract Class. @@ -63,9 +65,12 @@ public function __construct($table, $key, $perm_name='', $mod_dir='') { $this->_query = new DBQuery; } - /** - * Let people know that this is not a good idea. - */ + /** + * Let people know that this is not a good idea. + * @param $table + * @param $key + * @param string $perm_name + */ public function CDpObject($table, $key, $perm_name='') { $this->_tbl = $table; $this->_tbl_key = $key; @@ -507,7 +512,7 @@ public function getModuleName() { return $this->_module_directory; } /* Now the guessing game begins */ - $mods = new CModule; + $mods = $this->getCModule(); if (!empty($this->_permission_name)) { if (($mod_name = $mods->getModuleByName($this->_permission_name))) { $this->_module_directory = $mod_name; @@ -525,4 +530,15 @@ public function getModuleName() { return 'unknown'; } + /** + * Temp fix for the purpose of unit testing classes + * that originally initialized this object within the + * method being tested. + * + * @return object + */ + private function getCModule() { + return new CModule; + } + } diff --git a/classes/ui.class.php b/classes/ui.class.php index 39dea723b..d2442dc56 100644 --- a/classes/ui.class.php +++ b/classes/ui.class.php @@ -64,7 +64,7 @@ class CAppUI { var $day_selected=null; /** @var array */ var $system_prefs = array(); - + // localisation /** @var string */ var $user_locale=null; @@ -75,31 +75,31 @@ class CAppUI { /** @var string */ var $base_date_locale = null; - + /** @var string Message string*/ var $msg = ''; /** @var string */ var $msgNo = ''; /** @var string Default page for a redirect call*/ var $defaultRedirect = ''; - + /** @var array Configuration variable array*/ var $cfg=null; - + /** @var integer Version major */ var $version_major = null; - + /** @var integer Version minor */ var $version_minor = null; - + /** @var integer Version patch level */ var $version_patch = null; - + /** @var string Version string */ var $version_string = null; - + /** @var integer for register log ID */ - var $last_insert_id = null; + var $last_insert_id = null; /** @var array list of external JS libraries */ var $_js = []; @@ -112,20 +112,20 @@ class CAppUI { */ function CAppUI() { $this->state = array(); - + $this->user_id = -1; $this->user_first_name = ''; $this->user_last_name = ''; $this->user_company = 0; $this->user_department = 0; $this->user_type = 0; - + // cfg['locale_warn'] is the only cfgVariable stored in session data (for security reasons) // this guarants the functionality of this->setWarning $this->cfg['locale_warn'] = dPgetConfig('locale_warn'); - + $this->project_id = 0; - + $this->defaultRedirect = ''; // set up the default preferences $this->setUserLocale($this->base_locale); @@ -193,7 +193,7 @@ function getVersion() { function checkStyle() { // check if default user's uistyle is installed $uistyle = $this->getPref('UISTYLE'); - + if ($uistyle && !is_dir(DP_BASE_DIR . '/style/' . $uistyle)) { // fall back to host_style if user style is not installed $this->setPref('UISTYLE', dPgetConfig('host_style')); @@ -211,7 +211,7 @@ function readDirs($path) { $dirs = array(); $d = dir(DP_BASE_DIR . '/' . $path); while (false !== ($name = $d->read())) { - if (is_dir(DP_BASE_DIR . '/' . $path . '/' . $name) && $name != '.' && $name != '..' + if (is_dir(DP_BASE_DIR . '/' . $path . '/' . $name) && $name != '.' && $name != '..' && $name != 'CVS' && $name != '.svn') { $dirs[$name] = $name; } @@ -228,19 +228,19 @@ function readDirs($path) { */ function readFiles($path, $filter='.') { $files = array(); - + if (is_dir($path) && ($handle = opendir($path))) { while (false !== ($file = readdir($handle))) { - if ($file != '.' && $file != '..' && preg_match(('/' . $filter . '/'), $file)) { - $files[$file] = $file; - } + if ($file != '.' && $file != '..' && preg_match(('/' . $filter . '/'), $file)) { + $files[$file] = $file; + } } - closedir($handle); + closedir($handle); } return $files; } - - + + /** * Utility function to check whether a file name is 'safe' * @@ -250,11 +250,11 @@ function readFiles($path, $filter='.') { */ function checkFileName($file) { global $AppUI; - + // define bad characters and their replacement $bad_chars = ';/\\\'()"$'; $bad_replace = '.........'; // Needs the same number of chars as $bad_chars - + // check whether the filename contained bad characters if (mb_strpos(strtr($file, $bad_chars, $bad_replace), '.') !== false) { $AppUI->redirect('m=public&a=access_denied'); @@ -264,9 +264,9 @@ function checkFileName($file) { return $file; } } - - - + + + /** * Utility function to make a file name 'safe' * @@ -279,25 +279,25 @@ function makeFileNameSafe($file) { $file = str_replace('..\\', '', $file); return $file; } - + /** * Sets the user locale. * -* Looks in the user preferences first. +* Looks in the user preferences first. * If this value has not been set by the user it uses the system default set in config.php. -* @param string Locale abbreviation corresponding to the sub-directory name in the locales +* @param string Locale abbreviation corresponding to the sub-directory name in the locales * directory (usually the abbreviated language code). */ function setUserLocale($loc='', $set = true) { global $locale_char_set; - + $LANGUAGES = $this->loadLanguages(); - + if (! $loc) { - $loc = ((@$this->user_prefs['LOCALE']) ? $this->user_prefs['LOCALE'] + $loc = ((@$this->user_prefs['LOCALE']) ? $this->user_prefs['LOCALE'] : dPgetConfig('host_locale')); } - + if (isset($LANGUAGES[$loc])) { $lang = $LANGUAGES[$loc]; } else { @@ -315,15 +315,15 @@ function setUserLocale($loc='', $set = true) { if (! isset($lcs)) { $lcs = (isset($locale_char_set)) ? $locale_char_set : 'utf-8'; } - + if (version_compare(phpversion(), '4.3.0', 'ge')) { $user_lang = array($loc . '.' . $lcs, $default_language, $loc, $base_locale); } else { - $user_lang = ((strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') ? $default_language + $user_lang = ((strtoupper(substr(PHP_OS, 0, 3)) == 'WIN') ? $default_language : ($loc . '.' . $lcs)); } - + if ($set) { $this->user_locale = $base_locale; $this->user_lang = $user_lang; @@ -333,7 +333,7 @@ function setUserLocale($loc='', $set = true) { return $user_lang; } } - + function findLanguage($language, $country = false) { $LANGUAGES = $this->loadLanguages(); $language = mb_strtolower($language); @@ -345,7 +345,7 @@ function findLanguage($language, $country = false) { return $code; } } - + // Just use the country code and try and find it in the // languages list. $first_entry = null; @@ -370,7 +370,7 @@ function findLanguage($language, $country = false) { function setBaseLocale($context = LC_ALL) { global $locale_char_set; - + $LANGUAGES = $this->loadLanguages(); list($locale, $en_name, $local_name, $win_locale, $lcs) = $LANGUAGES['en_AU']; @@ -385,7 +385,7 @@ function setBaseLocale($context = LC_ALL) } setlocale($context, $real_locale); } - + /** * Load the known language codes for loaded locales * @@ -405,7 +405,7 @@ function loadLanguages() { } return $LANGUAGES; } - + /** * Translate string to the local language [same form as the gettext abbreviation] * @@ -420,7 +420,7 @@ function loadLanguages() { * @param int Option flags, can be case handling or'd with output styles * @return string */ - + //Translation function to handle arrays or single string variables function _($str, $flags= 0) { if (is_array($str)) { @@ -433,7 +433,7 @@ function _($str, $flags= 0) { return $this->__($str, $flags); } } - + //Main translation function function __($str, $flags = 0) { $str = trim($str); @@ -441,25 +441,25 @@ function __($str, $flags = 0) { return ''; } $x = @$GLOBALS['translate'][$str]; - + if ($x) { $str = $x; - } else if (dPgetConfig('locale_warn') && !($this->base_locale == $this->user_locale + } else if (dPgetConfig('locale_warn') && !($this->base_locale == $this->user_locale && in_array($str, @$GLOBALS['translate']))) { $str .= dPgetConfig('locale_alert'); } - + return $this->___($str, $flags); } - + //Output formatting function function ___($str, $flags = 0) { global $locale_char_set; - + if (! $locale_char_set) { $locale_char_set = 'utf-8'; } - + switch ($flags & UI_CASE_MASK) { case UI_CASE_UPPER: $str = mb_strtoupper($str, $locale_char_set); @@ -498,7 +498,7 @@ function ___($str, $flags = 0) { case UI_OUTPUT_JS: $str = addslashes(stripslashes($str)); break; - case UI_OUTPUT_RAW: + case UI_OUTPUT_RAW: $str = stripslashes($str); break; } @@ -512,7 +512,7 @@ function showHTML($text) { function showRaw($text) { return $this->___($text, UI_OUTPUT_RAW); } - + function showJS($text) { return $this->___($text, UI_OUTPUT_JS); } @@ -568,12 +568,12 @@ function getPlace() { */ function redirect($params='', $hist='') { $session_id = SID; - + session_write_close(); // are the params empty if (!$params) { // has a place been saved - $params = ((!(empty($this->state["SAVEDPLACE$hist"]))) + $params = ((!(empty($this->state["SAVEDPLACE$hist"]))) ? $this->state["SAVEDPLACE$hist"] : $this->defaultRedirect); } // Fix to handle cookieless sessions @@ -613,7 +613,7 @@ function getMsg($reset=true) { $img = ''; $class = ''; $msg = $this->msg; - + switch($this->msgNo) { case UI_MSG_OK: $img = dPshowImage(dPfindImage('stock_ok-16.png'), 16, 16, ''); @@ -672,7 +672,7 @@ function getState($label, $default_value = null) { return NULL; } } - + function checkPrefState($label, $value, $prefname, $default_value = null) { // Check if we currently have it set if (isset($value)) { @@ -713,60 +713,61 @@ function checkPrefState($label, $value, $prefname, $default_value = null) { */ function login($username, $password) { require_once DP_BASE_DIR.'/classes/authenticator.class.php'; - + $auth_method = dPgetConfig('auth_method', 'sql'); - if (@$_POST['login'] != 'login' - && @$_POST['login'] != $this->_('login', UI_OUTPUT_RAW) + if (@$_POST['login'] != 'login' + && @$_POST['login'] != $this->_('login', UI_OUTPUT_RAW) && $_REQUEST['login'] != $auth_method) { die('You have chosen to log in using an unsupported or disabled login method'); } $auth =& getauth($auth_method); - + $username = trim(db_escape($username)); $password = trim($password); if (!$auth->authenticate($username, $password)) { return false; } - + $user_id = $auth->userId($username); // Some authentication schemes may collect username in various ways. - $username = $auth->username; - + $username = $auth->username; + // Now that the password has been checked, see if they are allowed to // access the system if (!(isset($GLOBALS['acl']))) { $GLOBALS['acl'] = new dPacl; } + if (!($GLOBALS['acl']->checkLogin($user_id))) { dprint(__FILE__, __LINE__, 1, 'Permission check failed'); return false; } - + $q = new DBQuery; $q->addTable('users'); - $q->addQuery('user_id, contact_first_name as user_first_name, ' - . 'contact_last_name as user_last_name, contact_company as user_company, ' - . 'contact_department as user_department, contact_email as user_email, ' + $q->addQuery('user_id, contact_first_name as user_first_name, ' + . 'contact_last_name as user_last_name, contact_company as user_company, ' + . 'contact_department as user_department, contact_email as user_email, ' . 'user_type'); $q->addJoin('contacts', 'con', 'contact_id = user_contact'); $q->addWhere("user_id = $user_id AND user_username = '$username'"); $sql = $q->prepare(); $q->clear(); dprint(__FILE__, __LINE__, 7, ('Login SQL: ' . $sql)); - + if (!db_loadObject($sql, $this)) { dprint(__FILE__, __LINE__, 1, 'Failed to load user information'); return false; } - + // load the user preferences $this->loadPrefs($this->user_id); $this->setUserLocale(); $this->checkStyle(); return true; } -/************************************************************************************************************************ +/************************************************************************************************************************ /** *@Function for regiser log in dotprojet table "user_access_log" */ @@ -796,7 +797,7 @@ function registerLogout($user_id) { $q->clear(); } } - + /** *@Function for update table user_acces_log in field date_time_lost_action */ @@ -806,7 +807,7 @@ function updateLastAction($last_insert_id) { $q->addUpdate('date_time_last_action', date('Y-m-d H:i:s')); $q->addWhere('user_access_log_id = ' . $last_insert_id); if ($last_insert_id > 0) { - $q->exec(); + $q->exec(); // BOOKMARK: on PHP 8 the code breaks here $q->clear(); } } @@ -948,7 +949,7 @@ function &acl() { } return $GLOBALS['acl']; } - + /** * Find and add to output the file tags required to load module-specific * javascript. @@ -963,15 +964,15 @@ function loadJS() { if (mb_substr($root, -1) != '/') { $root .= '/'; } - + $base = dPgetConfig('base_url'); if (mb_substr($base, -1) != '/') { $base .= '/'; } - + // Load the basic javascript used by all modules. $jsdir = dir("{$root}js"); - + $js_files = array(); while (($entry = $jsdir->read()) !== false) { if (mb_substr($entry, -3) == '.js') { @@ -980,14 +981,14 @@ function loadJS() { } asort($js_files); while (list(,$js_file_name) = each($js_files)) { - echo (''."\n"); } - + // additionally load overlib - echo ('' + echo ('' . "\n"); - + $this->getModuleJS($m, $a, true); // Finally add any external URLs @@ -999,7 +1000,7 @@ function loadJS() { echo '' . "\n"; } } - + function loadCSS() { } @@ -1014,17 +1015,17 @@ function getModuleJS($module, $file=null, $load_all = false) { $base .= '/'; } $module = $this->___($module); - + if ($load_all || !($file)) { if (file_exists($root . 'modules/' . $module . '/' . $module . '.module.js')) { - echo ('' . "\n"); } } if (isset($file)) { $file = $this->___($file); if (file_exists($root . 'modules/' . $module . '/' . $file . '.js')) { - echo ('' . "\n"); } } @@ -1079,14 +1080,14 @@ class CTabBox_core { function CTabBox_core($baseHRef='', $baseInc='', $active=0, $javascript = null) { $baseHRef = str_replace('&', '&', $baseHRef); $baseHRef = htmlspecialchars($baseHRef); - + $this->tabs = array(); $this->active = $active; $this->baseHRef = ($baseHRef ? ($baseHRef . '&') : '?'); $this->javascript = $javascript; $this->baseInc = $baseInc; } - + /** * Gets the name of a tab * @return string @@ -1094,7 +1095,7 @@ function CTabBox_core($baseHRef='', $baseInc='', $active=0, $javascript = null) function getTabName($idx) { return $this->tabs[$idx][1]; } - + /** * Adds a tab to the object * @param string File to include @@ -1108,12 +1109,12 @@ function add($file, $title, $translated = false, $key= NULL) { $this->tabs[] = $t; } } - + function isTabbed() { global $AppUI; return (($this->active < 0 || @$AppUI->getPref('TABVIEW') == 2) ? false : true); } - + /** * Displays the tabbed box * This function may be overridden @@ -1132,17 +1133,17 @@ function show($extra='', $js_tabs = false) { $s .= ('' .$extra . ''); echo $s; } else if ($extra) { - echo ('' + echo ('
' . $extra . '
'); } else { echo ''; } - + if ($this->active < 0 || @$AppUI->getPref('TABVIEW') == 2) { // flat view, active = -1 echo ''; foreach ($this->tabs as $k => $v) { - echo (''); echo '"; $s .= '\n\n
' . ($v[2] ? $AppUI->___($v[1]) : $AppUI->_($v[1])) + echo ('
' . ($v[2] ? $AppUI->___($v[1]) : $AppUI->_($v[1])) . '
'; $currentTabId = $k; @@ -1185,7 +1186,7 @@ function show($extra='', $js_tabs = false) { $s .= "\n
'; echo $s; - + //Will be null if the previous selection tab is not available in the new window // eg. Children tasks if ($this->baseInc . $this->tabs[$this->active][0] != "") { @@ -1205,15 +1206,15 @@ function show($extra='', $js_tabs = false) { echo "\n
"; } } - + function loadExtras($module, $file = null) { global $AppUI, $acl; if (! (isset($_SESSION['all_tabs']) && isset($_SESSION['all_tabs'][$module]))) { return false; } - + if ($file) { - if (isset($_SESSION['all_tabs'][$module][$file]) + if (isset($_SESSION['all_tabs'][$module][$file]) && is_array($_SESSION['all_tabs'][$module][$file])) { $tab_array =& $_SESSION['all_tabs'][$module][$file]; } else { @@ -1250,7 +1251,7 @@ function findTabModule($tab) { list($file, $name) = $this->tabs[$tab]; foreach ($tab_array as $tab_elem) { - if (isset($tab_elem['name']) && $tab_elem['name'] == $name + if (isset($tab_elem['name']) && $tab_elem['name'] == $name && $tab_elem['file'] == $file) { return $tab_elem['module']; } @@ -1270,12 +1271,12 @@ class CTitleBlock_core { var $icon=''; /** @var string The name of the module that this title block is displaying in */ var $module=''; - /** @var array An array of the table 'cells' to the right of the title block + /** @var array An array of the table 'cells' to the right of the title block and for bread-crumbs */ var $cells=null; /** @var string The reference for the context help system */ var $helpref=''; - + /** * The constructor * @@ -1326,14 +1327,14 @@ function addCrumbRight($data='', $attribs='', $prefix='', $suffix='') { function addCrumbDelete($title, $canDelete='', $msg='') { global $AppUI; $this->addCrumbRight('
' - . '' - . dPshowImage('./images/icons/' - . (($canDelete) ? 'stock_delete-16.png' + . dPshowImage('./images/icons/' + . (($canDelete) ? 'stock_delete-16.png' : 'stock_trash_full-16.png'), '16', '16', '') . ' ' - . '' . $AppUI->_($title) . '
'); } /** @@ -1350,7 +1351,7 @@ function show() { $s .= dPshowImage(dPFindImage($this->icon, $this->module)); $s .= ''; } - $s .= ("\n" . '

' + $s .= ("\n" . '

' . $AppUI->_($this->title) . '

'); foreach ($this->cells1 as $c) { $s .= "\n" . ''; @@ -1362,17 +1363,17 @@ function show() { if ($this->showhelp) { $s .= ''; /* - $s .= ("\n\t" - . dPcontextHelp((''.$AppUI->_('Help').''), + $s .= ("\n\t" + . dPcontextHelp((''.$AppUI->_('Help').''), $this->helpref)); */ - $s .= ("\n\t" . ''); - $s .= "\n\t\t" . dPshowImage('./images/icons/stock_help-16.png', '16', '16', + $s .= "\n\t\t" . dPshowImage('./images/icons/stock_help-16.png', '16', '16', $AppUI->_('Help')); $s .= "\n\t" . ''; $s .= "\n"; @@ -1383,7 +1384,7 @@ function show() { if (count($this->crumbs) || count($this->cells2)) { $crumbs = array(); foreach ($this->crumbs as $k => $v) { - $t = (($v[1]) ? ('module) . '" border="" alt="" /> ') : ''); $t .= $AppUI->_($v[0]); $crumbs[] = ('' . $t . ''); @@ -1393,7 +1394,7 @@ function show() { $s .= "\n\t" . ''; $s .= "\n\t\t" . '' . implode(' : ', $crumbs) . ''; $s .= "\n\t" . ''; - + foreach ($this->cells2 as $c) { $s .= $c[2] ? "\n$c[2]" : ''; $s .= "\n\t" . ''; diff --git a/codeception.yml b/codeception.yml new file mode 100644 index 000000000..058253616 --- /dev/null +++ b/codeception.yml @@ -0,0 +1,17 @@ +paths: + tests: tests + output: tests/_output + data: tests/_data + support: tests/_support + envs: tests/_envs +actor_suffix: Tester +extensions: + enabled: + - Codeception\Extension\RunFailed +coverage: + enabled: true + include: + - classes/* + - includes/* +params: + - .env.testing diff --git a/composer.json b/composer.json new file mode 100644 index 000000000..1f6b596eb --- /dev/null +++ b/composer.json @@ -0,0 +1,27 @@ +{ + "name": "dotproject/dotproject", + "autoload": { + "psr-4": { + "Classes\\": "classes/", + "Includes\\": "includes/", + "Library\\": "lib/" + } + }, + "autoload-dev": { + "psr-4": { + "Tests\\": "tests/" + } + }, + "require-dev": { + "codeception/codeception": "^4.2", + "codeception/module-phpbrowser": "^1.0.0", + "codeception/module-asserts": "^1.0.0", + "codeception/module-db": "^1.0", + "codeception/module-datafactory": "^1.0", + "justblackbird/codeception-config-module": "*", + "fakerphp/faker": "^1.19" + }, + "require": { + "vlucas/phpdotenv": "^5.4" + } +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 000000000..7db954cbb --- /dev/null +++ b/composer.lock @@ -0,0 +1,5047 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "51d7526094a67e5ef2b4ab085f24e1ba", + "packages": [ + { + "name": "graham-campbell/result-type", + "version": "v1.0.4", + "source": { + "type": "git", + "url": "https://github.com/GrahamCampbell/Result-Type.git", + "reference": "0690bde05318336c7221785f2a932467f98b64ca" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/GrahamCampbell/Result-Type/zipball/0690bde05318336c7221785f2a932467f98b64ca", + "reference": "0690bde05318336c7221785f2a932467f98b64ca", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "phpoption/phpoption": "^1.8" + }, + "require-dev": { + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "autoload": { + "psr-4": { + "GrahamCampbell\\ResultType\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "An Implementation Of The Result Type", + "keywords": [ + "Graham Campbell", + "GrahamCampbell", + "Result Type", + "Result-Type", + "result" + ], + "support": { + "issues": "https://github.com/GrahamCampbell/Result-Type/issues", + "source": "https://github.com/GrahamCampbell/Result-Type/tree/v1.0.4" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/graham-campbell/result-type", + "type": "tidelift" + } + ], + "time": "2021-11-21T21:41:47+00:00" + }, + { + "name": "phpoption/phpoption", + "version": "1.8.1", + "source": { + "type": "git", + "url": "https://github.com/schmittjoh/php-option.git", + "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.8-dev" + } + }, + "autoload": { + "psr-4": { + "PhpOption\\": "src/PhpOption/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Apache-2.0" + ], + "authors": [ + { + "name": "Johannes M. Schmitt", + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" + }, + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + } + ], + "description": "Option Type for PHP", + "keywords": [ + "language", + "option", + "php", + "type" + ], + "support": { + "issues": "https://github.com/schmittjoh/php-option/issues", + "source": "https://github.com/schmittjoh/php-option/tree/1.8.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpoption/phpoption", + "type": "tidelift" + } + ], + "time": "2021-12-04T23:24:31+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "reference": "6fd1b9a79f6e3cf65f9e679b23af304cd9e010d4", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "reference": "9344f9cb97f3b19424af1a21a3b0e75b0a7d8d7e", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-php80", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php80.git", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php80/zipball/cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "reference": "cfa0ae98841b9e461207c13ab093d76b0fa7bace", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php80\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ion Bazan", + "email": "ion.bazan@gmail.com" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php80/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-10T07:21:04+00:00" + }, + { + "name": "vlucas/phpdotenv", + "version": "v5.4.1", + "source": { + "type": "git", + "url": "https://github.com/vlucas/phpdotenv.git", + "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f", + "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f", + "shasum": "" + }, + "require": { + "ext-pcre": "*", + "graham-campbell/result-type": "^1.0.2", + "php": "^7.1.3 || ^8.0", + "phpoption/phpoption": "^1.8", + "symfony/polyfill-ctype": "^1.23", + "symfony/polyfill-mbstring": "^1.23.1", + "symfony/polyfill-php80": "^1.23.1" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-filter": "*", + "phpunit/phpunit": "^7.5.20 || ^8.5.21 || ^9.5.10" + }, + "suggest": { + "ext-filter": "Required to use the boolean validator." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.4-dev" + } + }, + "autoload": { + "psr-4": { + "Dotenv\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Vance Lucas", + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" + } + ], + "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", + "keywords": [ + "dotenv", + "env", + "environment" + ], + "support": { + "issues": "https://github.com/vlucas/phpdotenv/issues", + "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/vlucas/phpdotenv", + "type": "tidelift" + } + ], + "time": "2021-12-12T23:22:04+00:00" + } + ], + "packages-dev": [ + { + "name": "behat/gherkin", + "version": "v4.9.0", + "source": { + "type": "git", + "url": "https://github.com/Behat/Gherkin.git", + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Gherkin/zipball/0bc8d1e30e96183e4f36db9dc79caead300beff4", + "reference": "0bc8d1e30e96183e4f36db9dc79caead300beff4", + "shasum": "" + }, + "require": { + "php": "~7.2|~8.0" + }, + "require-dev": { + "cucumber/cucumber": "dev-gherkin-22.0.0", + "phpunit/phpunit": "~8|~9", + "symfony/yaml": "~3|~4|~5" + }, + "suggest": { + "symfony/yaml": "If you want to parse features, represented in YAML files" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.x-dev" + } + }, + "autoload": { + "psr-0": { + "Behat\\Gherkin": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + } + ], + "description": "Gherkin DSL parser for PHP", + "homepage": "http://behat.org/", + "keywords": [ + "BDD", + "Behat", + "Cucumber", + "DSL", + "gherkin", + "parser" + ], + "support": { + "issues": "https://github.com/Behat/Gherkin/issues", + "source": "https://github.com/Behat/Gherkin/tree/v4.9.0" + }, + "time": "2021-10-12T13:05:09+00:00" + }, + { + "name": "codeception/codeception", + "version": "4.2.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Codeception.git", + "reference": "77b3e2003fd4446b35826cb9dc397129c521c888" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Codeception/zipball/77b3e2003fd4446b35826cb9dc397129c521c888", + "reference": "77b3e2003fd4446b35826cb9dc397129c521c888", + "shasum": "" + }, + "require": { + "behat/gherkin": "^4.4.0", + "codeception/lib-asserts": "^1.0 | 2.0.*@dev", + "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.1.1 | ^9.0", + "codeception/stub": "^2.0 | ^3.0 | ^4.0", + "ext-curl": "*", + "ext-json": "*", + "ext-mbstring": "*", + "guzzlehttp/psr7": "^1.4 | ^2.0", + "php": ">=5.6.0 <9.0", + "symfony/console": ">=2.7 <6.0", + "symfony/css-selector": ">=2.7 <6.0", + "symfony/event-dispatcher": ">=2.7 <6.0", + "symfony/finder": ">=2.7 <6.0", + "symfony/yaml": ">=2.7 <6.0" + }, + "require-dev": { + "codeception/module-asserts": "^1.0 | 2.0.*@dev", + "codeception/module-cli": "^1.0 | 2.0.*@dev", + "codeception/module-db": "^1.0 | 2.0.*@dev", + "codeception/module-filesystem": "^1.0 | 2.0.*@dev", + "codeception/module-phpbrowser": "^1.0 | 2.0.*@dev", + "codeception/specify": "~0.3", + "codeception/util-universalframework": "*@dev", + "monolog/monolog": "~1.8", + "squizlabs/php_codesniffer": "~2.0", + "symfony/process": ">=2.7 <6.0", + "vlucas/phpdotenv": "^2.0 | ^3.0 | ^4.0 | ^5.0" + }, + "suggest": { + "codeception/specify": "BDD-style code blocks", + "codeception/verify": "BDD-style assertions", + "hoa/console": "For interactive console functionality", + "stecman/symfony-console-completion": "For BASH autocompletion", + "symfony/phpunit-bridge": "For phpunit-bridge support" + }, + "bin": [ + "codecept" + ], + "type": "library", + "extra": { + "branch-alias": [] + }, + "autoload": { + "files": [ + "functions.php" + ], + "psr-4": { + "Codeception\\": "src/Codeception", + "Codeception\\Extension\\": "ext" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "https://codegyre.com" + } + ], + "description": "BDD-style testing framework", + "homepage": "https://codeception.com/", + "keywords": [ + "BDD", + "TDD", + "acceptance testing", + "functional testing", + "unit testing" + ], + "support": { + "issues": "https://github.com/Codeception/Codeception/issues", + "source": "https://github.com/Codeception/Codeception/tree/4.2.1" + }, + "funding": [ + { + "url": "https://opencollective.com/codeception", + "type": "open_collective" + } + ], + "time": "2022-06-22T06:18:59+00:00" + }, + { + "name": "codeception/lib-asserts", + "version": "1.13.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-asserts.git", + "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-asserts/zipball/184231d5eab66bc69afd6b9429344d80c67a33b6", + "reference": "184231d5eab66bc69afd6b9429344d80c67a33b6", + "shasum": "" + }, + "require": { + "codeception/phpunit-wrapper": ">6.0.15 <6.1.0 | ^6.6.1 | ^7.7.1 | ^8.0.3 | ^9.0", + "ext-dom": "*", + "php": ">=5.6.0 <9.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Assertion methods used by Codeception core and Asserts module", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-asserts/issues", + "source": "https://github.com/Codeception/lib-asserts/tree/1.13.2" + }, + "time": "2020-10-21T16:26:20+00:00" + }, + { + "name": "codeception/lib-innerbrowser", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/lib-innerbrowser.git", + "reference": "31b4b56ad53c3464fcb2c0a14d55a51a201bd3c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/lib-innerbrowser/zipball/31b4b56ad53c3464fcb2c0a14d55a51a201bd3c2", + "reference": "31b4b56ad53c3464fcb2c0a14d55a51a201bd3c2", + "shasum": "" + }, + "require": { + "codeception/codeception": "4.*@dev", + "ext-dom": "*", + "ext-json": "*", + "ext-mbstring": "*", + "php": ">=5.6.0 <9.0", + "symfony/browser-kit": ">=2.7 <6.0", + "symfony/dom-crawler": ">=2.7 <6.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "require-dev": { + "codeception/util-universalframework": "dev-master" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk", + "email": "davert@mail.ua", + "homepage": "http://codegyre.com" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Parent library for all Codeception framework modules and PhpBrowser", + "homepage": "https://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/lib-innerbrowser/issues", + "source": "https://github.com/Codeception/lib-innerbrowser/tree/1.5.1" + }, + "time": "2021-08-30T15:21:42+00:00" + }, + { + "name": "codeception/module-asserts", + "version": "1.3.1", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-asserts.git", + "reference": "59374f2fef0cabb9e8ddb53277e85cdca74328de" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-asserts/zipball/59374f2fef0cabb9e8ddb53277e85cdca74328de", + "reference": "59374f2fef0cabb9e8ddb53277e85cdca74328de", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "codeception/lib-asserts": "^1.13.1", + "php": ">=5.6.0 <9.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + }, + { + "name": "Gustavo Nieves", + "homepage": "https://medium.com/@ganieves" + } + ], + "description": "Codeception module containing various assertions", + "homepage": "https://codeception.com/", + "keywords": [ + "assertions", + "asserts", + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-asserts/issues", + "source": "https://github.com/Codeception/module-asserts/tree/1.3.1" + }, + "time": "2020-10-21T16:48:15+00:00" + }, + { + "name": "codeception/module-datafactory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-datafactory.git", + "reference": "cf66d54f4084969659ef7fb86409c11d451d7af6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-datafactory/zipball/cf66d54f4084969659ef7fb86409c11d451d7af6", + "reference": "cf66d54f4084969659ef7fb86409c11d451d7af6", + "shasum": "" + }, + "require": { + "codeception/codeception": "^4.0", + "league/factory-muffin": "^3.0", + "league/factory-muffin-faker": "^2.1", + "php": ">=5.6.0 <9.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + } + ], + "description": "DataFactory module for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception" + ], + "support": { + "issues": "https://github.com/Codeception/module-datafactory/issues", + "source": "https://github.com/Codeception/module-datafactory/tree/1.1.0" + }, + "time": "2021-03-16T19:42:07+00:00" + }, + { + "name": "codeception/module-db", + "version": "1.2.0", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-db.git", + "reference": "04c3e66fbd3a3ced17fcccc49627f6393a97b04b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-db/zipball/04c3e66fbd3a3ced17fcccc49627f6393a97b04b", + "reference": "04c3e66fbd3a3ced17fcccc49627f6393a97b04b", + "shasum": "" + }, + "require": { + "codeception/codeception": "*@dev", + "php": ">=5.6.0 <9.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "DB module for Codeception", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception", + "database-testing", + "db-testing" + ], + "support": { + "issues": "https://github.com/Codeception/module-db/issues", + "source": "https://github.com/Codeception/module-db/tree/1.2.0" + }, + "time": "2022-03-05T19:38:40+00:00" + }, + { + "name": "codeception/module-phpbrowser", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/Codeception/module-phpbrowser.git", + "reference": "8ba6bede11d0914e74d98691f427fd8f397f192e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/module-phpbrowser/zipball/8ba6bede11d0914e74d98691f427fd8f397f192e", + "reference": "8ba6bede11d0914e74d98691f427fd8f397f192e", + "shasum": "" + }, + "require": { + "codeception/codeception": "^4.1", + "codeception/lib-innerbrowser": "^1.3", + "guzzlehttp/guzzle": "^6.3|^7.0", + "php": ">=5.6.0 <9.0" + }, + "conflict": { + "codeception/codeception": "<4.0" + }, + "require-dev": { + "codeception/module-rest": "^1.0" + }, + "suggest": { + "codeception/phpbuiltinserver": "Start and stop PHP built-in web server for your tests" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michael Bodnarchuk" + }, + { + "name": "Gintautas Miselis" + } + ], + "description": "Codeception module for testing web application over HTTP", + "homepage": "http://codeception.com/", + "keywords": [ + "codeception", + "functional-testing", + "http" + ], + "support": { + "issues": "https://github.com/Codeception/module-phpbrowser/issues", + "source": "https://github.com/Codeception/module-phpbrowser/tree/1.0.3" + }, + "time": "2022-05-21T13:50:41+00:00" + }, + { + "name": "codeception/phpunit-wrapper", + "version": "9.0.9", + "source": { + "type": "git", + "url": "https://github.com/Codeception/phpunit-wrapper.git", + "reference": "7439a53ae367986e9c22b2ac00f9d7376bb2f8cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/phpunit-wrapper/zipball/7439a53ae367986e9c22b2ac00f9d7376bb2f8cf", + "reference": "7439a53ae367986e9c22b2ac00f9d7376bb2f8cf", + "shasum": "" + }, + "require": { + "php": ">=7.2", + "phpunit/phpunit": "^9.0" + }, + "require-dev": { + "codeception/specify": "*", + "consolidation/robo": "^3.0.0-alpha3", + "vlucas/phpdotenv": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\PHPUnit\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Davert", + "email": "davert.php@resend.cc" + }, + { + "name": "Naktibalda" + } + ], + "description": "PHPUnit classes used by Codeception", + "support": { + "issues": "https://github.com/Codeception/phpunit-wrapper/issues", + "source": "https://github.com/Codeception/phpunit-wrapper/tree/9.0.9" + }, + "time": "2022-05-23T06:24:11+00:00" + }, + { + "name": "codeception/stub", + "version": "4.0.2", + "source": { + "type": "git", + "url": "https://github.com/Codeception/Stub.git", + "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Codeception/Stub/zipball/18a148dacd293fc7b044042f5aa63a82b08bff5d", + "reference": "18a148dacd293fc7b044042f5aa63a82b08bff5d", + "shasum": "" + }, + "require": { + "php": "^7.4 | ^8.0", + "phpunit/phpunit": "^8.4 | ^9.0 | ^10.0 | 10.0.x-dev" + }, + "require-dev": { + "consolidation/robo": "^3.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Flexible Stub wrapper for PHPUnit's Mock Builder", + "support": { + "issues": "https://github.com/Codeception/Stub/issues", + "source": "https://github.com/Codeception/Stub/tree/4.0.2" + }, + "time": "2022-01-31T19:25:15+00:00" + }, + { + "name": "doctrine/instantiator", + "version": "1.4.1", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/10dcfce151b967d20fde1b34ae6640712c3891bc", + "reference": "10dcfce151b967d20fde1b34ae6640712c3891bc", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^0.16 || ^1", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-phpunit": "^1", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "vimeo/psalm": "^4.22" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/1.4.1" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-03-03T08:28:38+00:00" + }, + { + "name": "fakerphp/faker", + "version": "v1.19.0", + "source": { + "type": "git", + "url": "https://github.com/FakerPHP/Faker.git", + "reference": "d7f08a622b3346766325488aa32ddc93ccdecc75" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/d7f08a622b3346766325488aa32ddc93ccdecc75", + "reference": "d7f08a622b3346766325488aa32ddc93ccdecc75", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0", + "psr/container": "^1.0 || ^2.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "conflict": { + "fzaninotto/faker": "*" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "doctrine/persistence": "^1.3 || ^2.0", + "ext-intl": "*", + "symfony/phpunit-bridge": "^4.4 || ^5.2" + }, + "suggest": { + "doctrine/orm": "Required to use Faker\\ORM\\Doctrine", + "ext-curl": "Required by Faker\\Provider\\Image to download images.", + "ext-dom": "Required by Faker\\Provider\\HtmlLorem for generating random HTML.", + "ext-iconv": "Required by Faker\\Provider\\ru_RU\\Text::realText() for generating real Russian text.", + "ext-mbstring": "Required for multibyte Unicode string functionality." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "v1.19-dev" + } + }, + "autoload": { + "psr-4": { + "Faker\\": "src/Faker/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "François Zaninotto" + } + ], + "description": "Faker is a PHP library that generates fake data for you.", + "keywords": [ + "data", + "faker", + "fixtures" + ], + "support": { + "issues": "https://github.com/FakerPHP/Faker/issues", + "source": "https://github.com/FakerPHP/Faker/tree/v1.19.0" + }, + "time": "2022-02-02T17:38:57+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.4.5", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", + "reference": "1dd98b0564cb3f6bd16ce683cb755f94c10fbd82", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5", + "guzzlehttp/psr7": "^1.9 || ^2.4", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "ext-curl": "*", + "php-http/client-integration-tests": "^3.0", + "phpunit/phpunit": "^8.5.5 || ^9.3.5", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "7.4-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.4.5" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2022-06-20T22:16:13+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "1.5.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "reference": "fe752aedc9fd8fcca3fe7ad05d419d32998a06da", + "shasum": "" + }, + "require": { + "php": ">=5.5" + }, + "require-dev": { + "symfony/phpunit-bridge": "^4.4 || ^5.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.5-dev" + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/1.5.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2021-10-22T20:56:57+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.4.0", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "13388f00956b1503577598873fffb5ae994b5737" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/13388f00956b1503577598873fffb5ae994b5737", + "reference": "13388f00956b1503577598873fffb5ae994b5737", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.4.1", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.8 || ^9.3.10" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.4-dev" + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.4.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2022-06-20T21:43:11+00:00" + }, + { + "name": "justblackbird/codeception-config-module", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/JustBlackBird/codeception-config-module.git", + "reference": "97c9a68d6a2fe4d67b760449805ac1de10be59f9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/JustBlackBird/codeception-config-module/zipball/97c9a68d6a2fe4d67b760449805ac1de10be59f9", + "reference": "97c9a68d6a2fe4d67b760449805ac1de10be59f9", + "shasum": "" + }, + "require": { + "php": ">=5.4.0 <8.0" + }, + "require-dev": { + "codeception/codeception": "^2.2", + "phpunit/phpunit": "^4.8", + "squizlabs/php_codesniffer": "^2.7" + }, + "type": "library", + "autoload": { + "psr-4": { + "Codeception\\Module\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Dmitriy Simushev", + "email": "simushevds@gmail.com" + } + ], + "description": "Loads params from config into codeception scenarios.", + "support": { + "issues": "https://github.com/JustBlackBird/codeception-config-module/issues", + "source": "https://github.com/JustBlackBird/codeception-config-module" + }, + "time": "2016-11-05T11:12:45+00:00" + }, + { + "name": "league/factory-muffin", + "version": "v3.3.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/factory-muffin.git", + "reference": "62c8c31d47667523da14e83df36cc897d34173cd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/factory-muffin/zipball/62c8c31d47667523da14e83df36cc897d34173cd", + "reference": "62c8c31d47667523da14e83df36cc897d34173cd", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "replace": { + "zizaco/factory-muff": "self.version" + }, + "require-dev": { + "doctrine/orm": "^2.5", + "illuminate/database": "5.0.* || 5.1.* || 5.5.* || ^6.0", + "league/factory-muffin-faker": "^2.3", + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20" + }, + "suggest": { + "doctrine/orm": "Factory Muffin supports doctrine through the repository store.", + "illuminate/database": "Factory Muffin supports eloquent through the model store.", + "league/factory-muffin-faker": "Factory Muffin is very powerful together with faker." + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.3-dev" + } + }, + "autoload": { + "psr-4": { + "League\\FactoryMuffin\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "graham@alt-three.com" + }, + { + "name": "Scott Robertson", + "email": "scottymeuk@gmail.com" + } + ], + "description": "The goal of this package is to enable the rapid creation of objects for the purpose of testing.", + "homepage": "http://factory-muffin.thephpleague.com/", + "keywords": [ + "factory", + "testing" + ], + "support": { + "issues": "https://github.com/thephpleague/factory-muffin/issues", + "source": "https://github.com/thephpleague/factory-muffin/tree/v3.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/factory-muffin", + "type": "tidelift" + } + ], + "time": "2020-12-13T18:38:47+00:00" + }, + { + "name": "league/factory-muffin-faker", + "version": "v2.3.0", + "source": { + "type": "git", + "url": "https://github.com/thephpleague/factory-muffin-faker.git", + "reference": "258068c840e8fdc45d1cb1636a0890e92f2e864a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/thephpleague/factory-muffin-faker/zipball/258068c840e8fdc45d1cb1636a0890e92f2e864a", + "reference": "258068c840e8fdc45d1cb1636a0890e92f2e864a", + "shasum": "" + }, + "require": { + "fakerphp/faker": "^1.9.1", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.8.36 || ^5.7.27 || ^6.5.14 || ^7.5.20" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.3-dev" + } + }, + "autoload": { + "psr-4": { + "League\\FactoryMuffin\\Faker\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "graham@alt-three.com" + } + ], + "description": "The goal of this package is to wrap faker to make it super easy to use with factory muffin.", + "homepage": "http://factory-muffin.thephpleague.com/", + "keywords": [ + "factory", + "faker", + "testing" + ], + "support": { + "issues": "https://github.com/thephpleague/factory-muffin-faker/issues", + "source": "https://github.com/thephpleague/factory-muffin-faker/tree/v2.3.0" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/league/factory-muffin-faker", + "type": "tidelift" + } + ], + "time": "2020-12-13T15:53:28+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/14daed4296fae74d9e3201d2c4925d1acb7aa614", + "reference": "14daed4296fae74d9e3201d2c4925d1acb7aa614", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3,<3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.11.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2022-03-03T13:19:32+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v4.14.0", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/34bea19b6e03d8153165d8f30bba4c3be86184c1", + "reference": "34bea19b6e03d8153165d8f30bba4c3be86184c1", + "shasum": "" + }, + "require": { + "ext-tokenizer": "*", + "php": ">=7.0" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^6.5 || ^7.0 || ^8.0 || ^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.9-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v4.14.0" + }, + "time": "2022-05-31T20:59:12+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", + "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.3" + }, + "time": "2021-07-20T11:28:43+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.3.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/622548b623e81ca6d78b721c5e029f4ce664f170", + "reference": "622548b623e81ca6d78b721c5e029f4ce664f170", + "shasum": "" + }, + "require": { + "ext-filter": "*", + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.3", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.2", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "account@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.3.0" + }, + "time": "2021-10-19T17:43:47+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.6.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "77a32518733312af16a44300404e945338981de3" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/77a32518733312af16a44300404e945338981de3", + "reference": "77a32518733312af16a44300404e945338981de3", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0", + "phpdocumentor/reflection-common": "^2.0" + }, + "require-dev": { + "ext-tokenizer": "*", + "psalm/phar": "^4.8" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.6.1" + }, + "time": "2022-03-15T21:29:03+00:00" + }, + { + "name": "phpspec/prophecy", + "version": "v1.15.0", + "source": { + "type": "git", + "url": "https://github.com/phpspec/prophecy.git", + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.2", + "php": "^7.2 || ~8.0, <8.2", + "phpdocumentor/reflection-docblock": "^5.2", + "sebastian/comparator": "^3.0 || ^4.0", + "sebastian/recursion-context": "^3.0 || ^4.0" + }, + "require-dev": { + "phpspec/phpspec": "^6.0 || ^7.0", + "phpunit/phpunit": "^8.0 || ^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Prophecy\\": "src/Prophecy" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Konstantin Kudryashov", + "email": "ever.zet@gmail.com", + "homepage": "http://everzet.com" + }, + { + "name": "Marcello Duarte", + "email": "marcello.duarte@gmail.com" + } + ], + "description": "Highly opinionated mocking framework for PHP 5.3+", + "homepage": "https://github.com/phpspec/prophecy", + "keywords": [ + "Double", + "Dummy", + "fake", + "mock", + "spy", + "stub" + ], + "support": { + "issues": "https://github.com/phpspec/prophecy/issues", + "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" + }, + "time": "2021-12-08T12:19:24+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.15", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/2e9da11878c4202f97915c1cb4bb1ca318a63f5f", + "reference": "2e9da11878c4202f97915c1cb4bb1ca318a63f5f", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.13.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.3", + "phpunit/php-text-template": "^2.0.2", + "sebastian/code-unit-reverse-lookup": "^2.0.2", + "sebastian/complexity": "^2.0", + "sebastian/environment": "^5.1.2", + "sebastian/lines-of-code": "^1.0.3", + "sebastian/version": "^3.0.1", + "theseer/tokenizer": "^1.2.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcov": "*", + "ext-xdebug": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.15" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-03-07T09:28:20+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.5.21", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0e32b76be457de00e83213528f6bb37e2a38fcb1", + "reference": "0e32b76be457de00e83213528f6bb37e2a38fcb1", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.3.1", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.10.1", + "phar-io/manifest": "^2.0.3", + "phar-io/version": "^3.0.2", + "php": ">=7.3", + "phpspec/prophecy": "^1.12.1", + "phpunit/php-code-coverage": "^9.2.13", + "phpunit/php-file-iterator": "^3.0.5", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.3", + "phpunit/php-timer": "^5.0.2", + "sebastian/cli-parser": "^1.0.1", + "sebastian/code-unit": "^1.0.6", + "sebastian/comparator": "^4.0.5", + "sebastian/diff": "^4.0.3", + "sebastian/environment": "^5.1.3", + "sebastian/exporter": "^4.0.3", + "sebastian/global-state": "^5.0.1", + "sebastian/object-enumerator": "^4.0.3", + "sebastian/resource-operations": "^3.0.3", + "sebastian/type": "^3.0", + "sebastian/version": "^3.0.2" + }, + "require-dev": { + "phpspec/prophecy-phpunit": "^2.0.1" + }, + "suggest": { + "ext-soap": "*", + "ext-xdebug": "*" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.5-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.21" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-06-19T12:14:25+00:00" + }, + { + "name": "psr/container", + "version": "1.1.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/513e0666f7216c7459170d56df27dfcefe1689ea", + "reference": "513e0666f7216c7459170d56df27dfcefe1689ea", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/1.1.2" + }, + "time": "2021-11-05T16:50:12+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "reference": "2dfb5f6c5eff0e91e20e913f8c5452ed95b86621", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client/tree/master" + }, + "time": "2020-06-29T06:28:15+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "reference": "12ac7fcd07e5b077433f5f2bee95b3a771bf61be", + "shasum": "" + }, + "require": { + "php": ">=7.0.0", + "psr/http-message": "^1.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory/tree/master" + }, + "time": "2019-04-30T12:38:16+00:00" + }, + { + "name": "psr/http-message", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", + "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", + "shasum": "" + }, + "require": { + "php": ">=5.3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/master" + }, + "time": "2016-08-06T14:39:51+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "reference": "442e7c7e687e42adc03470c7b668bc4b2402c0b2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:08:49+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/55f4261989e546dc112258c7a75935a81a7ce382", + "reference": "55f4261989e546dc112258c7a75935a81a7ce382", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:49:45+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", + "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.7", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T15:52:27+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "reference": "3461e3fccc7cfdfc2720be910d3bd73c69be590d", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:10:38+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "reference": "1b5dff7bb151a4db11d49d90e5408e4e938270f7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-04-03T09:37:03+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "reference": "65e8b7db476c5dd267e65eea9cab77584d3cfff9", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-11-11T14:18:36+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "reference": "0ca8db5a5fc9c8646244e629625ac486fa286bf2", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-02-14T08:28:10+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.6", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-11-28T06:42:11+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/cd9d8cf3c5804de4341c283ed787f099f5506172", + "reference": "cd9d8cf3c5804de4341c283ed787f099f5506172", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "http://www.github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:17:30+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "reference": "0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "issues": "https://github.com/sebastianbergmann/resource-operations/issues", + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:45:17+00:00" + }, + { + "name": "sebastian/type", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "reference": "b233b84bc4465aff7b57cf1c4bc75c86d00d6dad", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.0.0" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-03-15T09:54:48+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "symfony/browser-kit", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/browser-kit.git", + "reference": "18e73179c6a33d520de1b644941eba108dd811ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/browser-kit/zipball/18e73179c6a33d520de1b644941eba108dd811ad", + "reference": "18e73179c6a33d520de1b644941eba108dd811ad", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/polyfill-php80": "^1.16" + }, + "require-dev": { + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\BrowserKit\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Simulates the behavior of a web browser, allowing you to make requests, click on links and submit forms programmatically", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/browser-kit/tree/v5.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/console", + "version": "v5.4.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/console.git", + "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/console/zipball/4d671ab4ddac94ee439ea73649c69d9d200b5000", + "reference": "4d671ab4ddac94ee439ea73649c69d9d200b5000", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php73": "^1.9", + "symfony/polyfill-php80": "^1.16", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" + }, + "conflict": { + "psr/log": ">=3", + "symfony/dependency-injection": "<4.4", + "symfony/dotenv": "<5.1", + "symfony/event-dispatcher": "<4.4", + "symfony/lock": "<4.4", + "symfony/process": "<4.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0" + }, + "require-dev": { + "psr/log": "^1|^2", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" + }, + "suggest": { + "psr/log": "For using the console logger", + "symfony/event-dispatcher": "", + "symfony/lock": "", + "symfony/process": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Console\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases the creation of beautiful and testable command line interfaces", + "homepage": "https://symfony.com", + "keywords": [ + "cli", + "command line", + "console", + "terminal" + ], + "support": { + "source": "https://github.com/symfony/console/tree/v5.4.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-26T13:00:04+00:00" + }, + { + "name": "symfony/css-selector", + "version": "v5.4.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/css-selector.git", + "reference": "b0a190285cd95cb019237851205b8140ef6e368e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/b0a190285cd95cb019237851205b8140ef6e368e", + "reference": "b0a190285cd95cb019237851205b8140ef6e368e", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\CssSelector\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Jean-François Simon", + "email": "jeanfrancois.simon@sensiolabs.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Converts CSS selectors to XPath expressions", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/css-selector/tree/v5.4.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "reference": "e8b495ea28c1d97b5e0c121748d6f9b53d075c66", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/dom-crawler", + "version": "v5.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/dom-crawler.git", + "reference": "a213cbc80382320b0efdccdcdce232f191fafe3a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/a213cbc80382320b0efdccdcdce232f191fafe3a", + "reference": "a213cbc80382320b0efdccdcdce232f191fafe3a", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "masterminds/html5": "<2.6" + }, + "require-dev": { + "masterminds/html5": "^2.6", + "symfony/css-selector": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/css-selector": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DomCrawler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Eases DOM navigation for HTML and XML documents", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dom-crawler/tree/v5.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-04T14:46:32+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v5.4.9", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "reference": "8e6ce1cc0279e3ff3c8ff0f43813bc88d21ca1bc", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/event-dispatcher-contracts": "^2|^3", + "symfony/polyfill-php80": "^1.16" + }, + "conflict": { + "symfony/dependency-injection": "<4.4" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^4.4|^5.0|^6.0" + }, + "suggest": { + "symfony/dependency-injection": "", + "symfony/http-kernel": "" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.9" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-05T16:45:39+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/f98b54df6ad059855739db6fcbc2d36995283fe1", + "reference": "f98b54df6ad059855739db6fcbc2d36995283fe1", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/event-dispatcher": "^1" + }, + "suggest": { + "symfony/event-dispatcher-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-01-02T09:53:40+00:00" + }, + { + "name": "symfony/finder", + "version": "v5.4.8", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/9b630f3427f3ebe7cd346c277a1408b00249dad9", + "reference": "9b630f3427f3ebe7cd346c277a1408b00249dad9", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-php80": "^1.16" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v5.4.8" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-04-15T08:07:45+00:00" + }, + { + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "433d05519ce6990bf3530fba6957499d327395c2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/433d05519ce6990bf3530fba6957499d327395c2", + "reference": "433d05519ce6990bf3530fba6957499d327395c2", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's grapheme_* functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "grapheme", + "intl", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/219aa369ceff116e673852dce47c3a41794c14bd", + "reference": "219aa369ceff116e673852dce47c3a41794c14bd", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "suggest": { + "ext-intl": "For best performance" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for intl's Normalizer class and related functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "intl", + "normalizer", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/polyfill-php73", + "version": "v1.26.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php73.git", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php73/zipball/e440d35fa0286f77fb45b79a03fedbeda9307e85", + "reference": "e440d35fa0286f77fb45b79a03fedbeda9307e85", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.26-dev" + }, + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php73\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 7.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php73/tree/v1.26.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-24T11:49:31+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v2.5.2", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "reference": "4b426aac47d6427cc1a1d0f7e2ac724627f5966c", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "psr/container": "^1.1", + "symfony/deprecation-contracts": "^2.1|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "suggest": { + "symfony/service-implementation": "" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v2.5.2" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-05-30T19:17:29+00:00" + }, + { + "name": "symfony/string", + "version": "v5.4.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/4432bc7df82a554b3e413a8570ce2fea90e94097", + "reference": "4432bc7df82a554b3e413a8570ce2fea90e94097", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/polyfill-php80": "~1.15" + }, + "conflict": { + "symfony/translation-contracts": ">=3.0" + }, + "require-dev": { + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/http-client": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2", + "symfony/var-exporter": "^4.4|^5.0|^6.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v5.4.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-26T15:57:47+00:00" + }, + { + "name": "symfony/yaml", + "version": "v5.4.10", + "source": { + "type": "git", + "url": "https://github.com/symfony/yaml.git", + "reference": "04e42926429d9e8b39c174387ab990bf7817f7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/yaml/zipball/04e42926429d9e8b39c174387ab990bf7817f7a2", + "reference": "04e42926429d9e8b39c174387ab990bf7817f7a2", + "shasum": "" + }, + "require": { + "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/console": "<5.3" + }, + "require-dev": { + "symfony/console": "^5.3|^6.0" + }, + "suggest": { + "symfony/console": "For validating YAML files using the lint command" + }, + "bin": [ + "Resources/bin/yaml-lint" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Yaml\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Loads and dumps YAML files", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/yaml/tree/v5.4.10" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2022-06-20T11:50:59+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.1", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", + "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2021-07-28T10:34:58+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" + } + ], + "aliases": [], + "minimum-stability": "stable", + "stability-flags": [], + "prefer-stable": false, + "prefer-lowest": false, + "platform": [], + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/db/README b/db/README index 1a99480dd..47348535c 100644 --- a/db/README +++ b/db/README @@ -1,6 +1,6 @@ Notes to developers and users: -dotproject.sql is the full installation script for the latest CVS version. +test_dump.sql is the full installation script for the latest CVS version. upgrade_latest.sql is the differences between the last release version and the current CVS version. It will be renamed once a release is created. diff --git a/db/dotproject.sql b/db/dotproject.sql index a5497e9b8..d2d2b7e15 100644 --- a/db/dotproject.sql +++ b/db/dotproject.sql @@ -1,5 +1,5 @@ # -# dotproject.sql Database Schema +# test_dump.sql Database Schema # # Use this schema for creating your database for # a new installation of dotProject. @@ -430,7 +430,7 @@ CREATE TABLE `%dbprefix%user_preferences` ( # INSERT INTO `%dbprefix%users` VALUES (1,1,'admin',MD5('passwd'),0,1,0,0,0,''); -INSERT INTO `%dbprefix%contacts` (contact_id, contact_first_name, contact_last_name, contact_email) +INSERT INTO `%dbprefix%contacts` (contact_id, contact_first_name, contact_last_name, contact_email) VALUES (1,'Admin','Person','admin@example.com'); INSERT INTO `%dbprefix%permissions` VALUES (1,1,'all',-1, -1); @@ -563,7 +563,7 @@ CREATE TABLE `%dbprefix%user_roles` ( # Host: localhost # Database: dotproject # Table: 'common_notes' -# +# CREATE TABLE `%dbprefix%common_notes` ( `note_id` int(10) unsigned NOT NULL auto_increment, `note_author` int(10) unsigned NOT NULL default '0', @@ -579,7 +579,7 @@ CREATE TABLE `%dbprefix%common_notes` ( `note_modified` timestamp, `note_modified_by` int(10) unsigned NOT NULL default '0', PRIMARY KEY (`note_id`) -) ; +) ; @@ -674,12 +674,12 @@ INSERT INTO `%dbprefix%config` VALUES (0, 'files_show_versions_edit', 'false', ' # 20050302 # ldap system config variables -INSERT INTO `%dbprefix%config` VALUES (0, 'auth_method', 'sql', 'auth', 'select'); -INSERT INTO `%dbprefix%config` VALUES (0, 'ldap_host', 'localhost', 'ldap', 'text'); -INSERT INTO `%dbprefix%config` VALUES (0, 'ldap_port', '389', 'ldap', 'text'); -INSERT INTO `%dbprefix%config` VALUES (0, 'ldap_version', '3', 'ldap', 'text'); -INSERT INTO `%dbprefix%config` VALUES (0, 'ldap_base_dn', 'dc=saki,dc=com,dc=au', 'ldap', 'text'); -INSERT INTO `%dbprefix%config` VALUES (0, 'ldap_user_filter', '(uid=%USERNAME%)', 'ldap', 'text'); +INSERT INTO `%dbprefix%config` VALUES (0, 'auth_method', 'sql', 'auth', 'select'); +INSERT INTO `%dbprefix%config` VALUES (0, 'ldap_host', 'localhost', 'ldap', 'text'); +INSERT INTO `%dbprefix%config` VALUES (0, 'ldap_port', '389', 'ldap', 'text'); +INSERT INTO `%dbprefix%config` VALUES (0, 'ldap_version', '3', 'ldap', 'text'); +INSERT INTO `%dbprefix%config` VALUES (0, 'ldap_base_dn', 'dc=saki,dc=com,dc=au', 'ldap', 'text'); +INSERT INTO `%dbprefix%config` VALUES (0, 'ldap_user_filter', '(uid=%USERNAME%)', 'ldap', 'text'); # 20050302 # PostNuke authentication variables @@ -756,7 +756,7 @@ INSERT INTO `%dbprefix%config` VALUES (0, 'task_reminder_repeat', '100', 'task_r # 20080702 # GACL Caching options -INSERT INTO %dbprefix%config VALUES +INSERT INTO %dbprefix%config VALUES (NULL, 'gacl_cache', 'false', 'gacl', 'checkbox'), (NULL, 'gacl_expire', 'true', 'gacl', 'checkbox'), (NULL, 'gacl_cache_dir', '/tmp', 'gacl', 'text'), diff --git a/db/dotproject_manual_setup.sql b/db/dotproject_manual_setup.sql new file mode 100644 index 000000000..a3a51cdee --- /dev/null +++ b/db/dotproject_manual_setup.sql @@ -0,0 +1,1438 @@ +SET SQL_MODE = 'ALLOW_INVALID_DATES'; +# +# test_dump.sql Database Schema +# +# Use this schema for creating your database for +# a new installation of dotProject. +# +# Changed: Add in a dbprefix string to be replaced with the actual db table prefix +# Changed: Remove explicit mySQL table type which then allows for being able to use other +# database engines + +CREATE TABLE `dotp_companies` +( + `company_id` INT(10) NOT NULL auto_increment, + `company_module` INT(10) NOT NULL default '0', + `company_name` varchar(100) default '', + `company_phone1` varchar(30) default '', + `company_phone2` varchar(30) default '', + `company_fax` varchar(30) default '', + `company_address1` varchar(50) default '', + `company_address2` varchar(50) default '', + `company_city` varchar(30) default '', + `company_state` varchar(30) default '', + `company_zip` varchar(11) default '', + `company_primary_url` varchar(255) default '', + `company_owner` int(11) NOT NULL default '0', + `company_description` text, + `company_type` int(3) NOT NULL DEFAULT '0', + `company_email` varchar(255), + `company_custom` LONGTEXT, + PRIMARY KEY (`company_id`), + KEY `idx_cpy1` (`company_owner`) +); + +# +# New to version 1.0 +# +CREATE TABLE `dotp_departments` +( + `dept_id` int(10) unsigned NOT NULL auto_increment, + `dept_parent` int(10) unsigned NOT NULL default '0', + `dept_company` int(10) unsigned NOT NULL default '0', + `dept_name` tinytext NOT NULL, + `dept_phone` varchar(30) default NULL, + `dept_fax` varchar(30) default NULL, + `dept_address1` varchar(30) default NULL, + `dept_address2` varchar(30) default NULL, + `dept_city` varchar(30) default NULL, + `dept_state` varchar(30) default NULL, + `dept_zip` varchar(11) default NULL, + `dept_url` varchar(25) default NULL, + `dept_desc` text, + `dept_owner` int(10) unsigned NOT NULL default '0', + PRIMARY KEY (`dept_id`) +) COMMENT ='Department heirarchy under a company'; + +CREATE TABLE `dotp_contacts` +( + `contact_id` int(11) NOT NULL auto_increment, + `contact_first_name` varchar(30) default NULL, + `contact_last_name` varchar(30) default NULL, + `contact_order_by` varchar(30) NOT NULL default '', + `contact_title` varchar(50) default NULL, + `contact_birthday` date default NULL, + `contact_job` varchar(255) default NULL, + `contact_company` varchar(100) NOT NULL default '', + `contact_department` TINYTEXT, + `contact_type` varchar(20) default NULL, + `contact_email` varchar(255) default NULL, + `contact_email2` varchar(255) default NULL, + `contact_url` varchar(255) default NULL, + `contact_phone` varchar(30) default NULL, + `contact_phone2` varchar(30) default NULL, + `contact_fax` varchar(30) default NULL, + `contact_mobile` varchar(30) default NULL, + `contact_address1` varchar(60) default NULL, + `contact_address2` varchar(60) default NULL, + `contact_city` varchar(30) default NULL, + `contact_state` varchar(30) default NULL, + `contact_zip` varchar(11) default NULL, + `contact_country` varchar(30) default NULL, + `contact_jabber` varchar(255) default NULL, + `contact_icq` varchar(20) default NULL, + `contact_msn` varchar(255) default NULL, + `contact_yahoo` varchar(255) default NULL, + `contact_aol` varchar(30) default NULL, + `contact_notes` text, + `contact_project` int(11) NOT NULL default '0', + `contact_icon` varchar(20) default 'obj/contact', + `contact_owner` int unsigned default '0', + `contact_private` tinyint unsigned default '0', + PRIMARY KEY (`contact_id`), + KEY `idx_oby` (`contact_order_by`), + KEY `idx_co` (`contact_company`), + KEY `idx_prp` (`contact_project`) +); + +CREATE TABLE `dotp_events` +( + `event_id` int(11) NOT NULL auto_increment, + `event_title` varchar(255) NOT NULL default '', + `event_start_date` datetime default null, + `event_end_date` datetime default null, + `event_parent` int(11) unsigned NOT NULL default '0', + `event_description` text, + `event_times_recuring` int(11) unsigned NOT NULL default '0', + `event_recurs` int(11) unsigned NOT NULL default '0', + `event_remind` int(10) unsigned NOT NULL default '0', + `event_icon` varchar(20) default 'obj/event', + `event_owner` int(11) default '0', + `event_project` int(11) default '0', + `event_private` tinyint(3) default '0', + `event_type` tinyint(3) default '0', + `event_cwd` tinyint(3) default '0', + `event_notify` tinyint(3) NOT NULL default '0', + PRIMARY KEY (`event_id`), + KEY `id_esd` (`event_start_date`), + KEY `id_eed` (`event_end_date`), + KEY `id_evp` (`event_parent`), + KEY `idx_ev1` (`event_owner`), + KEY `idx_ev2` (`event_project`) +); + +# 20050303 +# +CREATE TABLE `dotp_event_queue` +( + `queue_id` int(11) NOT NULL auto_increment, + `queue_start` int(11) NOT NULL default '0', + `queue_type` varchar(40) NOT NULL default '', + `queue_repeat_interval` int(11) NOT NULL default '0', + `queue_repeat_count` int(11) NOT NULL default '0', + `queue_data` longblob NOT NULL, + `queue_callback` varchar(127) NOT NULL default '', + `queue_owner` int(11) NOT NULL default '0', + `queue_origin_id` int(11) NOT NULL default '0', + `queue_module` varchar(40) NOT NULL default '', + `queue_batched` int(11) NOT NULL default '0', + PRIMARY KEY (`queue_id`), + KEY `queue_start` (`queue_batched`, `queue_start`), + KEY `queue_module` (`queue_module`), + KEY `queue_type` (`queue_type`), + KEY `queue_origin_id` (`queue_origin_id`) +); + + +CREATE TABLE `dotp_files` +( + `file_id` int(11) NOT NULL auto_increment, + `file_real_filename` varchar(255) NOT NULL default '', + `file_folder` int(11) NOT NULL default '0', + `file_project` int(11) NOT NULL default '0', + `file_task` int(11) NOT NULL default '0', + `file_name` varchar(255) NOT NULL default '', + `file_parent` int(11) default '0', + `file_description` text, + `file_type` varchar(100) default NULL, + `file_owner` int(11) default '0', + `file_date` datetime default NULL, + `file_size` int(11) default '0', + `file_version` float NOT NULL default '0', + `file_icon` varchar(20) default 'obj/', + `file_category` int(11) default '0', + `file_checkout` varchar(255) not null default '', + `file_co_reason` text, + `file_version_id` int(11) not null default '0', + PRIMARY KEY (`file_id`), + KEY `idx_file_task` (`file_task`), + KEY `idx_file_project` (`file_project`), + KEY `idx_file_parent` (`file_parent`), + KEY `idx_file_vid` (`file_version_id`) +); + +CREATE TABLE `dotp_files_index` +( + `file_id` int(11) NOT NULL default '0', + `word` varchar(50) NOT NULL default '', + `word_placement` int(11) NOT NULL default '0', + PRIMARY KEY (`file_id`, `word`, `word_placement`), + KEY `idx_fwrd` (`word`) +); + +CREATE TABLE `dotp_forum_messages` +( + `message_id` int(11) NOT NULL auto_increment, + `message_forum` int(11) NOT NULL default '0', + `message_parent` int(11) NOT NULL default '0', + `message_author` int(11) NOT NULL default '0', + `message_editor` int(11) NOT NULL default '0', + `message_title` varchar(255) NOT NULL default '', + `message_date` datetime default '0000-00-00 00:00:00', + `message_body` text, + `message_published` tinyint(1) NOT NULL default '1', + PRIMARY KEY (`message_id`), + KEY `idx_mparent` (`message_parent`), + KEY `idx_mdate` (`message_date`), + KEY `idx_mforum` (`message_forum`) +); + +# +# new field forum_last_id in Version 1.0 +# +CREATE TABLE `dotp_forums` +( + `forum_id` int(11) NOT NULL auto_increment, + `forum_project` int(11) NOT NULL default '0', + `forum_status` tinyint(4) NOT NULL default '-1', + `forum_owner` int(11) NOT NULL default '0', + `forum_name` varchar(50) NOT NULL default '', + `forum_create_date` datetime default '0000-00-00 00:00:00', + `forum_last_date` datetime default '0000-00-00 00:00:00', + `forum_last_id` INT UNSIGNED DEFAULT '0' NOT NULL, + `forum_message_count` int(11) NOT NULL default '0', + `forum_description` varchar(255) default NULL, + `forum_moderated` int(11) NOT NULL default '0', + PRIMARY KEY (`forum_id`), + KEY `idx_fproject` (`forum_project`), + KEY `idx_fowner` (`forum_owner`), + KEY `forum_status` (`forum_status`) +); + +# +# New to Version 1.0 +# +CREATE TABLE `dotp_forum_watch` +( + `watch_user` int(10) unsigned NOT NULL default '0', + `watch_forum` int(10) unsigned default NULL, + `watch_topic` int(10) unsigned default NULL, + KEY `idx_fw1` (`watch_user`, `watch_forum`), + KEY `idx_fw2` (`watch_user`, `watch_topic`) +) COMMENT ='Links users to the forums/messages they are watching'; + +# 20050303 +# New to Version 2.0 +CREATE TABLE `dotp_forum_visits` +( + `visit_user` INT(10) NOT NULL DEFAULT 0, + `visit_forum` INT(10) NOT NULL DEFAULT 0, + `visit_message` INT(10) NOT NULL DEFAULT 0, + `visit_date` TIMESTAMP, + KEY `idx_fv` (`visit_user`, `visit_forum`, `visit_message`) +); + +CREATE TABLE `dotp_permissions` +( + `permission_id` int(11) NOT NULL auto_increment, + `permission_user` int(11) NOT NULL default '0', + `permission_grant_on` varchar(12) NOT NULL default '', + `permission_item` int(11) NOT NULL default '0', + `permission_value` int(11) NOT NULL default '0', + PRIMARY KEY (`permission_id`), + UNIQUE KEY `idx_pgrant_on` (`permission_grant_on`, `permission_item`, `permission_user`), + KEY `idx_puser` (`permission_user`), + KEY `idx_pvalue` (`permission_value`) +); + +CREATE TABLE `dotp_projects` +( + `project_id` int(11) NOT NULL auto_increment, + `project_company` int(11) NOT NULL default '0', + `project_company_internal` int(11) NOT NULL default '0', + `project_department` int(11) NOT NULL default '0', + `project_name` varchar(255) default NULL, + `project_short_name` varchar(10) default NULL, + `project_owner` int(11) default '0', + `project_url` varchar(255) default NULL, + `project_demo_url` varchar(255) default NULL, + `project_start_date` datetime default NULL, + `project_end_date` datetime default NULL, + `project_status` int(11) default '0', + `project_percent_complete` tinyint(4) default '0', + `project_color_identifier` varchar(7) default '#eeeeee', + `project_description` text, + `project_target_budget` decimal(10, 2) default '0.00', + `project_actual_budget` decimal(10, 2) default '0.00', + `project_creator` int(11) default '0', + `project_private` tinyint(3) unsigned default '0', + `project_departments` CHAR(100), + `project_contacts` CHAR(100), + `project_priority` tinyint(4) default '0', + `project_type` SMALLINT DEFAULT '0' NOT NULL, + PRIMARY KEY (`project_id`), + KEY `idx_project_owner` (`project_owner`), + KEY `idx_sdate` (`project_start_date`), + KEY `idx_edate` (`project_end_date`), + KEY `project_short_name` (`project_short_name`), + KEY `idx_proj1` (`project_company`) + +); + +CREATE TABLE `dotp_project_contacts` +( + `project_id` INT(10) NOT NULL, + `contact_id` INT(10) NOT NULL +); + +CREATE TABLE `dotp_project_departments` +( + `project_id` INT(10) NOT NULL, + `department_id` INT(10) NOT NULL +); + +CREATE TABLE `dotp_task_log` +( + `task_log_id` INT(11) NOT NULL auto_increment, + `task_log_task` INT(11) NOT NULL default '0', + `task_log_name` VARCHAR(255) default NULL, + `task_log_description` TEXT, + `task_log_creator` INT(11) NOT NULL default '0', + `task_log_hours` FLOAT DEFAULT '0' NOT NULL, + `task_log_date` DATETIME, + `task_log_costcode` VARCHAR(8) NOT NULL default '', + `task_log_problem` TINYINT(1) DEFAULT '0', + `task_log_reference` TINYINT(4) DEFAULT '0', + `task_log_related_url` VARCHAR(255) DEFAULT NULL, + PRIMARY KEY (`task_log_id`), + KEY `idx_log_task` (`task_log_task`) +); + +CREATE TABLE `dotp_tasks` +( + `task_id` int(11) NOT NULL auto_increment, + `task_name` varchar(255) default NULL, + `task_parent` int(11) default '0', + `task_milestone` tinyint(1) default '0', + `task_project` int(11) NOT NULL default '0', + `task_owner` int(11) NOT NULL default '0', + `task_start_date` datetime default NULL, + `task_duration` float unsigned default '0', + `task_duration_type` int(11) NOT NULL DEFAULT 1, + `task_hours_worked` float unsigned default '0', + `task_end_date` datetime default NULL, + `task_status` int(11) default '0', + `task_priority` tinyint(4) default '0', + `task_percent_complete` tinyint(4) default '0', + `task_description` text, + `task_target_budget` decimal(10, 2) default '0.00', + `task_related_url` varchar(255) default NULL, + `task_creator` int(11) NOT NULL default '0', + `task_order` int(11) NOT NULL default '0', + `task_client_publish` tinyint(1) NOT NULL default '0', + `task_dynamic` tinyint(1) NOT NULL default 0, + `task_access` int(11) NOT NULL default '0', + `task_notify` int(11) NOT NULL default '0', + `task_departments` CHAR(100), + `task_contacts` CHAR(100), + `task_custom` LONGTEXT, + `task_type` SMALLINT DEFAULT '0' NOT NULL, + PRIMARY KEY (`task_id`), + KEY `idx_task_parent` (`task_parent`), + KEY `idx_task_project` (`task_project`), + KEY `idx_task_owner` (`task_owner`), + KEY `idx_task_order` (`task_order`), + KEY `idx_task1` (`task_start_date`), + KEY `idx_task2` (`task_end_date`) +); + +CREATE TABLE `dotp_task_contacts` +( + `task_id` INT(10) NOT NULL, + `contact_id` INT(10) NOT NULL, + KEY `idx_task_contacts` (`task_id`) +); + +CREATE TABLE `dotp_task_departments` +( + `task_id` INT(10) NOT NULL, + `department_id` INT(10) NOT NULL, + KEY `idx_task_departments` (`task_id`) +); + +CREATE TABLE `dotp_tickets` +( + `ticket` int(10) unsigned NOT NULL auto_increment, + `ticket_company` int(10) NOT NULL default '0', + `ticket_project` int(10) NOT NULL default '0', + `author` varchar(100) NOT NULL default '', + `recipient` varchar(100) NOT NULL default '', + `subject` varchar(100) NOT NULL default '', + `attachment` tinyint(1) unsigned NOT NULL default '0', + `timestamp` int(10) unsigned NOT NULL default '0', + `type` varchar(15) NOT NULL default '', + `assignment` int(10) unsigned NOT NULL default '0', + `parent` int(10) unsigned NOT NULL default '0', + `activity` int(10) unsigned NOT NULL default '0', + `priority` tinyint(1) unsigned NOT NULL default '1', + `cc` varchar(255) NOT NULL default '', + `body` text NOT NULL, + `signature` text, + PRIMARY KEY (`ticket`), + KEY `parent` (`parent`), + KEY `type` (`type`) +); + +CREATE TABLE `dotp_user_events` +( + `user_id` int(11) NOT NULL default '0', + `event_id` int(11) NOT NULL default '0', + KEY `uek1` (`user_id`, `event_id`), + KEY `uek2` (`event_id`, `user_id`) +); + +CREATE TABLE `dotp_user_tasks` +( + `user_id` int(11) NOT NULL default '0', + `user_type` tinyint(4) NOT NULL default '0', + `task_id` int(11) NOT NULL default '0', + `perc_assignment` int(11) NOT NULL default '100', + `user_task_priority` tinyint(4) default '0', + PRIMARY KEY (`user_id`, `task_id`), + KEY `user_type` (`user_type`), + KEY `idx_user_tasks` (`task_id`) +); + +CREATE TABLE `dotp_users` +( + `user_id` int(11) NOT NULL auto_increment, + `user_contact` int(11) NOT NULL default '0', + `user_username` varchar(255) NOT NULL default '', + `user_password` varchar(32) NOT NULL default '', + `user_parent` int(11) NOT NULL default '0', + `user_type` tinyint(3) not null default '0', + `user_company` int(11) default '0', + `user_department` int(11) default '0', + `user_owner` int(11) NOT NULL default '0', + `user_signature` TEXT, + PRIMARY KEY (`user_id`), + KEY `idx_uid` (`user_username`), + KEY `idx_pwd` (`user_password`), + KEY `idx_user_parent` (`user_parent`) +); + +CREATE TABLE `dotp_task_dependencies` +( + `dependencies_task_id` int(11) NOT NULL, + `dependencies_req_task_id` int(11) NOT NULL, + PRIMARY KEY (`dependencies_task_id`, `dependencies_req_task_id`) +); + +CREATE TABLE `dotp_user_preferences` +( + `pref_user` varchar(12) NOT NULL default '', + `pref_name` varchar(72) NOT NULL default '', + `pref_value` varchar(32) NOT NULL default '', + KEY `pref_user` (`pref_user`, `pref_name`) +); + +# +# ATTENTION: +# Customize this section for your installation. +# Recommended changes include: +# New admin username -> replace {admin} +# New admin password -> replace {passwd] +# New admin email -> replace {admin@example.com} +# + +INSERT INTO `dotp_users` +VALUES (1, 1, 'admin', MD5('passwd'), 0, 1, 0, 0, 0, ''); +INSERT INTO `dotp_contacts` (contact_id, contact_first_name, contact_last_name, contact_email) +VALUES (1, 'Admin', 'Person', 'admin@example.com'); + +INSERT INTO `dotp_dotpermissions` VALUES (12,'1','sys','acl','access',1,3,1),(11,'1','app','admin','access',1,4,1),(11,'1','app','calendar','access',1,4,1),(11,'1','app','events','access',1,4,1),(11,'1','app','companies','access',1,4,1),(11,'1','app','contacts','access',1,4,1),(11,'1','app','departments','access',1,4,1),(11,'1','app','files','access',1,4,1),(11,'1','app','file_folders','access',1,4,1),(11,'1','app','forums','access',1,4,1),(11,'1','app','help','access',1,4,1),(11,'1','app','projects','access',1,4,1),(11,'1','app','system','access',1,4,1),(11,'1','app','tasks','access',1,4,1),(11,'1','app','task_log','access',1,4,1),(11,'1','app','ticketsmith','access',1,4,1),(11,'1','app','public','access',1,4,1),(11,'1','app','roles','access',1,4,1),(11,'1','app','users','access',1,4,1),(11,'1','app','admin','add',1,4,1),(11,'1','app','calendar','add',1,4,1),(11,'1','app','events','add',1,4,1),(11,'1','app','companies','add',1,4,1),(11,'1','app','contacts','add',1,4,1),(11,'1','app','departments','add',1,4,1),(11,'1','app','files','add',1,4,1),(11,'1','app','file_folders','add',1,4,1),(11,'1','app','forums','add',1,4,1),(11,'1','app','help','add',1,4,1),(11,'1','app','projects','add',1,4,1),(11,'1','app','system','add',1,4,1),(11,'1','app','tasks','add',1,4,1),(11,'1','app','task_log','add',1,4,1),(11,'1','app','ticketsmith','add',1,4,1),(11,'1','app','public','add',1,4,1),(11,'1','app','roles','add',1,4,1),(11,'1','app','users','add',1,4,1),(11,'1','app','admin','delete',1,4,1),(11,'1','app','calendar','delete',1,4,1),(11,'1','app','events','delete',1,4,1),(11,'1','app','companies','delete',1,4,1),(11,'1','app','contacts','delete',1,4,1),(11,'1','app','departments','delete',1,4,1),(11,'1','app','files','delete',1,4,1),(11,'1','app','file_folders','delete',1,4,1),(11,'1','app','forums','delete',1,4,1),(11,'1','app','help','delete',1,4,1),(11,'1','app','projects','delete',1,4,1),(11,'1','app','system','delete',1,4,1),(11,'1','app','tasks','delete',1,4,1),(11,'1','app','task_log','delete',1,4,1),(11,'1','app','ticketsmith','delete',1,4,1),(11,'1','app','public','delete',1,4,1),(11,'1','app','roles','delete',1,4,1),(11,'1','app','users','delete',1,4,1),(11,'1','app','admin','edit',1,4,1),(11,'1','app','calendar','edit',1,4,1),(11,'1','app','events','edit',1,4,1),(11,'1','app','companies','edit',1,4,1),(11,'1','app','contacts','edit',1,4,1),(11,'1','app','departments','edit',1,4,1),(11,'1','app','files','edit',1,4,1),(11,'1','app','file_folders','edit',1,4,1),(11,'1','app','forums','edit',1,4,1),(11,'1','app','help','edit',1,4,1),(11,'1','app','projects','edit',1,4,1),(11,'1','app','system','edit',1,4,1),(11,'1','app','tasks','edit',1,4,1),(11,'1','app','task_log','edit',1,4,1),(11,'1','app','ticketsmith','edit',1,4,1),(11,'1','app','public','edit',1,4,1),(11,'1','app','roles','edit',1,4,1),(11,'1','app','users','edit',1,4,1),(11,'1','app','admin','view',1,4,1),(11,'1','app','calendar','view',1,4,1),(11,'1','app','events','view',1,4,1),(11,'1','app','companies','view',1,4,1),(11,'1','app','contacts','view',1,4,1),(11,'1','app','departments','view',1,4,1),(11,'1','app','files','view',1,4,1),(11,'1','app','file_folders','view',1,4,1),(11,'1','app','forums','view',1,4,1),(11,'1','app','help','view',1,4,1),(11,'1','app','projects','view',1,4,1),(11,'1','app','system','view',1,4,1),(11,'1','app','tasks','view',1,4,1),(11,'1','app','task_log','view',1,4,1),(11,'1','app','ticketsmith','view',1,4,1),(11,'1','app','public','view',1,4,1),(11,'1','app','roles','view',1,4,1),(11,'1','app','users','view',1,4,1); + +INSERT INTO `dotp_user_preferences` +VALUES ('0', 'LOCALE', 'en'); +INSERT INTO `dotp_user_preferences` +VALUES ('0', 'TABVIEW', '0'); +INSERT INTO `dotp_user_preferences` +VALUES ('0', 'SHDATEFORMAT', '%d/%m/%Y'); +INSERT INTO `dotp_user_preferences` +VALUES ('0', 'TIMEFORMAT', '%I:%M %p'); +INSERT INTO `dotp_user_preferences` +VALUES ('0', 'UISTYLE', 'default'); +INSERT INTO `dotp_user_preferences` +VALUES ('0', 'TASKASSIGNMAX', '100'); +INSERT INTO `dotp_user_preferences` +VALUES ('0', 'USERFORMAT', 'user'); +INSERT INTO `dotp_user_preferences` +VALUES ('0', 'USEDIGESTS', '0'); + +# +# Table structure for table 'modules' +# +CREATE TABLE `dotp_modules` +( + `mod_id` int(11) NOT NULL auto_increment, + `mod_name` varchar(64) NOT NULL default '', + `mod_directory` varchar(64) NOT NULL default '', + `mod_version` varchar(10) NOT NULL default '', + `mod_setup_class` varchar(64) NOT NULL default '', + `mod_type` varchar(64) NOT NULL default '', + `mod_active` int(1) unsigned NOT NULL default '0', + `mod_ui_name` varchar(20) NOT NULL default '', + `mod_ui_icon` varchar(64) NOT NULL default '', + `mod_ui_order` tinyint(3) NOT NULL default '0', + `mod_ui_active` int(1) unsigned NOT NULL default '0', + `mod_description` varchar(255) NOT NULL default '', + `permissions_item_table` CHAR(100), + `permissions_item_field` CHAR(100), + `permissions_item_label` CHAR(100), + PRIMARY KEY (`mod_id`, `mod_directory`) +); + +# +# Dumping data for table 'modules' +# +INSERT INTO `dotp_modules` +VALUES ("1", "Companies", "companies", "1.0.0", "", "core", "1", "Companies", "handshake.png", "1", "1", "", + "companies", "company_id", "company_name"); +INSERT INTO `dotp_modules` +VALUES ("2", "Projects", "projects", "1.0.0", "", "core", "1", "Projects", "applet3-48.png", "2", "1", "", "projects", + "project_id", "project_name"); +INSERT INTO `dotp_modules` +VALUES ("3", "Tasks", "tasks", "1.0.0", "", "core", "1", "Tasks", "applet-48.png", "3", "1", "", "tasks", "task_id", + "task_name"); +INSERT INTO `dotp_modules` +VALUES ("4", "Calendar", "calendar", "1.0.0", "", "core", "1", "Calendar", "myevo-appointments.png", "4", "1", "", + "events", "event_id", "event_title"); +INSERT INTO `dotp_modules` +VALUES ("5", "Files", "files", "1.0.0", "", "core", "1", "Files", "folder5.png", "5", "1", "", "files", "file_id", + "file_name"); +INSERT INTO `dotp_modules` +VALUES ("6", "Contacts", "contacts", "1.0.0", "", "core", "1", "Contacts", "monkeychat-48.png", "6", "1", "", + "contacts", "contact_id", "contact_title"); +INSERT INTO `dotp_modules` +VALUES ("7", "Forums", "forums", "1.0.0", "", "core", "1", "Forums", "support.png", "7", "1", "", "forums", "forum_id", + "forum_name"); +INSERT INTO `dotp_modules` +VALUES ("8", "Tickets", "ticketsmith", "1.0.0", "", "core", "1", "Tickets", "ticketsmith.gif", "8", "1", "", "", "", + ""); +INSERT INTO `dotp_modules` +VALUES ("9", "User Administration", "admin", "1.0.0", "", "core", "1", "User Admin", "helix-setup-users.png", "9", "1", + "", "users", "user_id", "user_username"); +INSERT INTO `dotp_modules` +VALUES ("10", "System Administration", "system", "1.0.0", "", "core", "1", "System Admin", "48_my_computer.png", "10", + "1", "", "", "", ""); +INSERT INTO `dotp_modules` +VALUES ("11", "Departments", "departments", "1.0.0", "", "core", "1", "Departments", "users.gif", "11", "0", "", + "departments", "dept_id", "dept_name"); +INSERT INTO `dotp_modules` +VALUES ("12", "Help", "help", "1.0.0", "", "core", "1", "Help", "dp.gif", "12", "0", "", "", "", ""); +INSERT INTO `dotp_modules` +VALUES ("13", "Public", "public", "1.0.0", "", "core", "1", "Public", "users.gif", "13", "0", "", "", "", ""); + +# +# Table structure for table 'syskeys' +# + +CREATE TABLE `dotp_syskeys` +( + `syskey_id` int(10) unsigned NOT NULL auto_increment, + `syskey_name` varchar(48) NOT NULL default '' unique, + `syskey_label` varchar(255) NOT NULL default '', + `syskey_type` int(1) unsigned NOT NULL default '0', + `syskey_sep1` char(2) default '\n', + `syskey_sep2` char(2) NOT NULL default '|', + PRIMARY KEY (`syskey_id`), + UNIQUE KEY `idx_syskey_name` (`syskey_name`) +); + +# +# Table structure for table 'sysvals' +# + +CREATE TABLE `dotp_sysvals` +( + `sysval_id` int(10) unsigned NOT NULL auto_increment, + `sysval_key_id` int(10) unsigned NOT NULL default '0', + `sysval_title` varchar(48) NOT NULL default '', + `sysval_value` text NOT NULL, + PRIMARY KEY (`sysval_id`), + UNIQUE KEY `idx_sysval_title` (`sysval_title`) +); + +# +# Table structure for table 'sysvals' +# + +INSERT INTO `dotp_syskeys` +VALUES (1, "SelectList", "Enter values for list", "0", "\n", "|"); +INSERT INTO `dotp_syskeys` +VALUES (2, 'CustomField', + 'Serialized array in the following format:\r\n|\r\n\r\nSerialized Array:\r\n[type] => text | checkbox | select | textarea | label\r\n[name] => \r\n[options] => \r\n[selects] => ', + 0, '\n', '|'); +INSERT INTO `dotp_syskeys` +VALUES (3, "ColorSelection", "Hex color values for type=>color association.", "0", "\n", "|"); + +INSERT INTO `dotp_sysvals` (`sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (1, "ProjectStatus", + "0|Not Defined\r\n1|Proposed\r\n2|In Planning\r\n3|In Progress\r\n4|On Hold\r\n5|Complete\r\n6|Template\r\n7|Archived"); +INSERT INTO `dotp_sysvals` (`sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (1, "CompanyType", "0|Not Applicable\n1|Client\n2|Vendor\n3|Supplier\n4|Consultant\n5|Government\n6|Internal"); +INSERT INTO `dotp_sysvals` (`sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (1, "TaskDurationType", "1|hours\n24|days"); +INSERT INTO `dotp_sysvals` (`sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (1, "EventType", "0|General\n1|Appointment\n2|Meeting\n3|All Day Event\n4|Anniversary\n5|Reminder"); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'TaskStatus', '0|Active\n-1|Inactive'); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'TaskType', '0|Unknown\n1|Administrative\n2|Operative'); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'ProjectType', '0|Unknown\n1|Administrative\n2|Operative'); +INSERT INTO `dotp_sysvals` (`sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (3, "ProjectColors", "Web|FFE0AE\nEngineering|AEFFB2\nHelpDesk|FFFCAE\nSystem Administration|FFAEAE"); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'FileType', '0|Unknown\n1|Document\n2|Application'); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'TaskPriority', '-1|low\n0|normal\n1|high'); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'ProjectPriority', '-1|low\n0|normal\n1|high'); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'ProjectPriorityColor', '-1|#E5F7FF\n0|\n1|#FFDCB3'); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'TaskLogReference', '0|Not Defined\n1|Email\n2|Helpdesk\n3|Phone Call\n4|Fax'); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'TaskLogReferenceImage', + '0| 1|./images/obj/email.gif 2|./modules/helpdesk/images/helpdesk.png 3|./images/obj/phone.gif 4|./images/icons/stock_print-16.png'); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'UserType', + '0|Default User\r\n1|Administrator\r\n2|CEO\r\n3|Director\r\n4|Branch Manager\r\n5|Manager\r\n6|Supervisor\r\n7|Employee'); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'ProjectRequiredFields', + 'f.project_name.value.length|<3\r\nf.project_color_identifier.value.length|<3\r\nf.project_company.options[f.project_company.selectedIndex].value|<1'); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 2, 'TicketNotify', + '0|admin@example.com\n1|admin@example.com\n2|admin@example.com\r\n3|admin@example.com\r\n4|admin@example.com'); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'TicketPriority', '0|Low\n1|Normal\n2|High\n3|Highest\n4|911'); +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) +VALUES (null, 1, 'TicketStatus', '0|Open\n1|Closed\n2|Deleted'); +# +# Table structure for table 'roles' +# + +CREATE TABLE `dotp_roles` +( + `role_id` int(10) unsigned NOT NULL auto_increment, + `role_name` varchar(24) NOT NULL default '', + `role_description` varchar(255) NOT NULL default '', + `role_type` int(3) unsigned NOT NULL default '0', + `role_module` int(10) unsigned NOT NULL default '0', + PRIMARY KEY (`role_id`) +); + +# +# Table structure for table 'user_roles' +# + +CREATE TABLE `dotp_user_roles` +( + `user_id` int(10) unsigned NOT NULL default '0', + `role_id` int(10) unsigned NOT NULL default '0' +); + +# Host: localhost +# Database: dotproject +# Table: 'common_notes' +# +CREATE TABLE `dotp_common_notes` +( + `note_id` int(10) unsigned NOT NULL auto_increment, + `note_author` int(10) unsigned NOT NULL default '0', + `note_module` int(10) unsigned NOT NULL default '0', + `note_record_id` int(10) unsigned NOT NULL default '0', + `note_category` int(3) unsigned NOT NULL default '0', + `note_title` varchar(100) NOT NULL default '', + `note_body` text NOT NULL, + `note_date` datetime NOT NULL default '0000-00-00 00:00:00', + `note_hours` float NOT NULL default '0', + `note_code` varchar(8) NOT NULL default '', + `note_created` datetime NOT NULL default '0000-00-00 00:00:00', + `note_modified` timestamp, + `note_modified_by` int(10) unsigned NOT NULL default '0', + PRIMARY KEY (`note_id`) +); + + + +#20040823 +#Added user access log +CREATE TABLE `dotp_user_access_log` +( + `user_access_log_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, + `user_id` INT(10) UNSIGNED NOT NULL, + `user_ip` VARCHAR(15) NOT NULL, + `date_time_in` DATETIME DEFAULT '0000-00-00 00:00:00', + `date_time_out` DATETIME DEFAULT '0000-00-00 00:00:00', + `date_time_last_action` DATETIME DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`user_access_log_id`) +); + +#20040910 +#Pinned tasks +CREATE TABLE `dotp_user_task_pin` +( + `user_id` int(11) NOT NULL default '0', + `task_id` int(10) NOT NULL default '0', + `task_pinned` tinyint(2) NOT NULL default '1', + PRIMARY KEY (`user_id`, `task_id`) +); + +# +# Table structure for TABLE `config` +# +# Creation: Feb 23, 2005 at 01:26 PM +# Last update: Feb 24, 2005 at 02:15 AM +# + +CREATE TABLE `dotp_config` +( + `config_id` int(11) NOT NULL auto_increment, + `config_name` varchar(127) NOT NULL default '', + `config_value` varchar(255) NOT NULL default '', + `config_group` varchar(255) NOT NULL default '', + `config_type` varchar(255) NOT NULL default '', + PRIMARY KEY (`config_id`), + UNIQUE KEY `config_name` (`config_name`) +); + +# +# Dumping data for table `config` +# + +INSERT INTO `dotp_config` +VALUES (0, 'host_locale', 'en', 'ui', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'check_overallocation', 'false', 'tasks', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'currency_symbol', '$', 'ui', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'host_style', 'default', 'ui', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'company_name', 'My Company', 'ui', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'page_title', 'dotProject', 'ui', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'site_domain', 'example.com', 'ui', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'email_prefix', '[dotProject]', 'ui', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'admin_username', 'admin', 'ui', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'username_min_len', '4', 'auth', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'password_min_len', '4', 'auth', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'enable_gantt_charts', 'true', 'tasks', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'log_changes', 'false', '', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'check_task_dates', 'true', 'tasks', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'check_task_empty_dynamic', 'false', 'tasks', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'locale_warn', 'false', 'ui', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'locale_alert', '^', 'ui', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'daily_working_hours', '8.0', 'tasks', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'display_debug', 'false', 'ui', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'link_tickets_kludge', 'false', 'tasks', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'show_all_task_assignees', 'false', 'tasks', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'direct_edit_assignment', 'false', 'tasks', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'restrict_color_selection', 'false', 'ui', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'cal_day_view_show_minical', 'true', 'calendar', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'cal_day_start', '8', 'calendar', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'cal_day_end', '17', 'calendar', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'cal_day_increment', '15', 'calendar', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'cal_working_days', '1,2,3,4,5', 'calendar', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'restrict_task_time_editing', 'false', 'tasks', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'default_view_m', 'calendar', 'ui', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'default_view_a', 'day_view', 'ui', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'default_view_tab', '1', 'ui', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'index_max_file_size', '-1', 'file', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'session_handling', 'app', 'session', 'select'); +INSERT INTO `dotp_config` +VALUES (0, 'session_idle_time', '2d', 'session', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'session_max_lifetime', '1m', 'session', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'debug', '1', '', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'parser_default', '/usr/bin/strings', 'file', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'parser_application/msword', '/usr/bin/strings', 'file', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'parser_text/html', '/usr/bin/strings', 'file', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'parser_application/pdf', '/usr/bin/pdftotext', 'file', 'text'); + +# 20050222 +# moved new config variables by cyberhorse from config-php to a new table +INSERT INTO `dotp_config` +VALUES (0, 'files_ci_preserve_attr', 'true', 'file', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'files_show_versions_edit', 'false', 'file', 'checkbox'); + +# 20050302 +# ldap system config variables +INSERT INTO `dotp_config` +VALUES (0, 'auth_method', 'sql', 'auth', 'select'); +INSERT INTO `dotp_config` +VALUES (0, 'ldap_host', 'localhost', 'ldap', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'ldap_port', '389', 'ldap', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'ldap_version', '3', 'ldap', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'ldap_base_dn', 'dc=saki,dc=com,dc=au', 'ldap', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'ldap_user_filter', '(uid=%USERNAME%)', 'ldap', 'text'); + +# 20050302 +# PostNuke authentication variables +INSERT INTO `dotp_config` +VALUES (0, 'postnuke_allow_login', 'true', 'auth', 'checkbox'); + +# 20050302 +# New list support for config variables +CREATE TABLE `dotp_config_list` +( + `config_list_id` integer not null auto_increment, + `config_id` integer not null default 0, + `config_list_name` varchar(30) not null default '', + PRIMARY KEY (`config_list_id`), + KEY (`config_id`) +); + +INSERT INTO dotp_config_list (`config_id`, `config_list_name`) +SELECT config_id, 'sql' +FROM dotp_config +WHERE config_name = 'auth_method'; + +INSERT INTO dotp_config_list (`config_id`, `config_list_name`) +SELECT config_id, 'ldap' +FROM dotp_config +WHERE config_name = 'auth_method'; + +INSERT INTO dotp_config_list (`config_id`, `config_list_name`) +SELECT config_id, 'pn' +FROM dotp_config +WHERE config_name = 'auth_method'; + +INSERT INTO dotp_config_list (`config_id`, `config_list_name`) +SELECT config_id, 'app' +FROM dotp_config +WHERE config_name = 'session_handling'; + +INSERT INTO dotp_config_list (`config_id`, `config_list_name`) +SELECT config_id, 'php' +FROM dotp_config +WHERE config_name = 'session_handling'; + +# 20050405 - temporarily reset the memory limit for gantt charts +INSERT INTO `dotp_config` +VALUES (0, 'reset_memory_limit', '32M', 'tasks', 'text'); + +# 20050303 +# New mail handling options +INSERT INTO `dotp_config` +VALUES (0, 'mail_transport', 'php', 'mail', 'select'); +INSERT INTO `dotp_config` +VALUES (0, 'mail_host', 'localhost', 'mail', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'mail_port', '25', 'mail', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'mail_auth', 'false', 'mail', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'mail_user', '', 'mail', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'mail_pass', '', 'mail', 'password'); +INSERT INTO `dotp_config` +VALUES (0, 'mail_defer', 'false', 'mail', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'mail_timeout', '30', 'mail', 'text'); + +INSERT INTO dotp_config_list (`config_id`, `config_list_name`) +SELECT config_id, 'php' +FROM dotp_config +WHERE config_name = 'mail_transport'; + +INSERT INTO dotp_config_list (`config_id`, `config_list_name`) +SELECT config_id, 'smtp' +FROM dotp_config +WHERE config_name = 'mail_transport'; + +# 20050303 +# Queue scanning on garbage collection +INSERT INTO dotp_config +VALUES (NULL, 'session_gc_scan_queue', 'false', 'session', 'checkbox'); + +# 20060321 +# Backport of task reminders. +INSERT INTO `dotp_config` +VALUES (0, 'task_reminder_control', 'false', 'task_reminder', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'task_reminder_days_before', '1', 'task_reminder', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'task_reminder_repeat', '100', 'task_reminder', 'text'); + +# 20080702 +# GACL Caching options +INSERT INTO dotp_config +VALUES (NULL, 'gacl_cache', 'false', 'gacl', 'checkbox'), + (NULL, 'gacl_expire', 'true', 'gacl', 'checkbox'), + (NULL, 'gacl_cache_dir', '/tmp', 'gacl', 'text'), + (NULL, 'gacl_timeout', '600', 'gacl', 'text'); + +# 20090427 +# adding config value to toggle use of TLS in SMTP connections +INSERT INTO `dotp_config` (`config_id`, `config_name`, `config_value`, `config_group`, `config_type`) +VALUES (0, 'mail_smtp_tls', 'false', 'mail', 'checkbox'); + +# 20050302 +# new custom fields +CREATE TABLE `dotp_custom_fields_struct` +( + field_id integer primary key, + field_module varchar(30), + field_page varchar(30), + field_htmltype varchar(20), + field_datatype varchar(20), + field_order integer, + field_name varchar(100), + field_extratags varchar(250), + field_description varchar(250) +); + +CREATE TABLE `dotp_custom_fields_values` +( + value_id integer, + value_module varchar(30), + value_object_id integer, + value_field_id integer, + value_charvalue varchar(250), + value_intvalue integer, + KEY `idx_cfv_id` (`value_id`) +); + +CREATE TABLE `dotp_custom_fields_lists` +( + field_id integer, + list_option_id integer, + list_value varchar(250) +); + + +#20040920 +# ACL support. +# +# Table structure for table `gacl_acl` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 28, 2004 at 02:15 PM +# Last check: Jul 22, 2004 at 01:00 PM +# + +CREATE TABLE `dotp_gacl_acl` +( + `id` int(11) NOT NULL default '0', + `section_value` varchar(80) NOT NULL default 'system', + `allow` int(11) NOT NULL default '0', + `enabled` int(11) NOT NULL default '0', + `return_value` longtext, + `note` longtext, + `updated_date` int(11) NOT NULL default '0', + PRIMARY KEY (`id`), + KEY `gacl_enabled_acl` (`enabled`), + KEY `gacl_section_value_acl` (`section_value`), + KEY `gacl_updated_date_acl` (`updated_date`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_acl_sections` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 22, 2004 at 01:04 PM +# Last check: Jul 22, 2004 at 01:00 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_acl_sections`; +CREATE TABLE `dotp_gacl_acl_sections` +( + `id` int(11) NOT NULL default '0', + `value` varchar(80) NOT NULL default '', + `order_value` int(11) NOT NULL default '0', + `name` varchar(230) NOT NULL default '', + `hidden` int(11) NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_value_acl_sections` (`value`), + KEY `gacl_hidden_acl_sections` (`hidden`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_aco` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 28, 2004 at 11:23 AM +# Last check: Jul 22, 2004 at 01:00 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_aco`; +CREATE TABLE `dotp_gacl_aco` +( + `id` int(11) NOT NULL default '0', + `section_value` varchar(80) NOT NULL default '0', + `value` varchar(80) NOT NULL default '', + `order_value` int(11) NOT NULL default '0', + `name` varchar(255) NOT NULL default '', + `hidden` int(11) NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_section_value_value_aco` (`section_value`, `value`), + KEY `gacl_hidden_aco` (`hidden`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_aco_map` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 28, 2004 at 02:15 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_aco_map`; +CREATE TABLE `dotp_gacl_aco_map` +( + `acl_id` int(11) NOT NULL default '0', + `section_value` varchar(80) NOT NULL default '0', + `value` varchar(80) NOT NULL default '', + PRIMARY KEY (`acl_id`, `section_value`, `value`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_aco_sections` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 23, 2004 at 08:14 AM +# Last check: Jul 22, 2004 at 01:00 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_aco_sections`; +CREATE TABLE `dotp_gacl_aco_sections` +( + `id` int(11) NOT NULL default '0', + `value` varchar(80) NOT NULL default '', + `order_value` int(11) NOT NULL default '0', + `name` varchar(230) NOT NULL default '', + `hidden` int(11) NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_value_aco_sections` (`value`), + KEY `gacl_hidden_aco_sections` (`hidden`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_aro` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 29, 2004 at 11:38 AM +# Last check: Jul 22, 2004 at 01:00 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_aro`; +CREATE TABLE `dotp_gacl_aro` +( + `id` int(11) NOT NULL default '0', + `section_value` varchar(80) NOT NULL default '0', + `value` varchar(80) NOT NULL default '', + `order_value` int(11) NOT NULL default '0', + `name` varchar(255) NOT NULL default '', + `hidden` int(11) NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_section_value_value_aro` (`section_value`, `value`), + KEY `gacl_hidden_aro` (`hidden`) +); + +INSERT INTO `dotp_gacl_aro` (`id`, `section_value`, `value`, `order_value`, `name`, `hidden`) VALUES + (10, 'user', '1', 1, 'admin', 0); + +# -------------------------------------------------------- + +# +# Table structure for table `gacl_aro_groups` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 28, 2004 at 12:12 PM +# Last check: Jul 22, 2004 at 01:00 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_aro_groups`; +CREATE TABLE `dotp_gacl_aro_groups` +( + `id` int(11) NOT NULL default '0', + `parent_id` int(11) NOT NULL default '0', + `lft` int(11) NOT NULL default '0', + `rgt` int(11) NOT NULL default '0', + `name` varchar(255) NOT NULL default '', + `value` varchar(80) NOT NULL default '', + PRIMARY KEY (`id`, `value`), + KEY `gacl_parent_id_aro_groups` (`parent_id`), + KEY `gacl_value_aro_groups` (`value`), + KEY `gacl_lft_rgt_aro_groups` (`lft`, `rgt`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_aro_groups_map` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 28, 2004 at 12:26 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_aro_groups_map`; +CREATE TABLE `dotp_gacl_aro_groups_map` +( + `acl_id` int(11) NOT NULL default '0', + `group_id` int(11) NOT NULL default '0', + PRIMARY KEY (`acl_id`, `group_id`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_aro_map` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 29, 2004 at 11:33 AM +# + +DROP TABLE IF EXISTS `dotp_gacl_aro_map`; +CREATE TABLE `dotp_gacl_aro_map` +( + `acl_id` int(11) NOT NULL default '0', + `section_value` varchar(80) NOT NULL default '0', + `value` varchar(80) NOT NULL default '', + PRIMARY KEY (`acl_id`, `section_value`, `value`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_aro_sections` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 22, 2004 at 03:04 PM +# Last check: Jul 22, 2004 at 01:00 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_aro_sections`; +CREATE TABLE `dotp_gacl_aro_sections` +( + `id` int(11) NOT NULL default '0', + `value` varchar(80) NOT NULL default '', + `order_value` int(11) NOT NULL default '0', + `name` varchar(230) NOT NULL default '', + `hidden` int(11) NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_value_aro_sections` (`value`), + KEY `gacl_hidden_aro_sections` (`hidden`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_axo` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 26, 2004 at 06:23 PM +# Last check: Jul 22, 2004 at 01:00 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_axo`; +CREATE TABLE `dotp_gacl_axo` +( + `id` int(11) NOT NULL default '0', + `section_value` varchar(80) NOT NULL default '0', + `value` varchar(80) NOT NULL default '', + `order_value` int(11) NOT NULL default '0', + `name` varchar(255) NOT NULL default '', + `hidden` int(11) NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_section_value_value_axo` (`section_value`, `value`), + KEY `gacl_hidden_axo` (`hidden`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_axo_groups` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 26, 2004 at 11:00 AM +# Last check: Jul 22, 2004 at 01:00 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_axo_groups`; +CREATE TABLE `dotp_gacl_axo_groups` +( + `id` int(11) NOT NULL default '0', + `parent_id` int(11) NOT NULL default '0', + `lft` int(11) NOT NULL default '0', + `rgt` int(11) NOT NULL default '0', + `name` varchar(255) NOT NULL default '', + `value` varchar(80) NOT NULL default '', + PRIMARY KEY (`id`, `value`), + KEY `gacl_parent_id_axo_groups` (`parent_id`), + KEY `gacl_value_axo_groups` (`value`), + KEY `gacl_lft_rgt_axo_groups` (`lft`, `rgt`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_axo_groups_map` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 28, 2004 at 11:24 AM +# + +DROP TABLE IF EXISTS `dotp_gacl_axo_groups_map`; +CREATE TABLE `dotp_gacl_axo_groups_map` +( + `acl_id` int(11) NOT NULL default '0', + `group_id` int(11) NOT NULL default '0', + PRIMARY KEY (`acl_id`, `group_id`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_axo_map` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 28, 2004 at 02:15 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_axo_map`; +CREATE TABLE `dotp_gacl_axo_map` +( + `acl_id` int(11) NOT NULL default '0', + `section_value` varchar(80) NOT NULL default '0', + `value` varchar(80) NOT NULL default '', + PRIMARY KEY (`acl_id`, `section_value`, `value`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_axo_sections` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 23, 2004 at 03:50 PM +# Last check: Jul 22, 2004 at 01:00 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_axo_sections`; +CREATE TABLE `dotp_gacl_axo_sections` +( + `id` int(11) NOT NULL default '0', + `value` varchar(80) NOT NULL default '', + `order_value` int(11) NOT NULL default '0', + `name` varchar(230) NOT NULL default '', + `hidden` int(11) NOT NULL default '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_value_axo_sections` (`value`), + KEY `gacl_hidden_axo_sections` (`hidden`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_groups_aro_map` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 29, 2004 at 11:38 AM +# + +DROP TABLE IF EXISTS `dotp_gacl_groups_aro_map`; +CREATE TABLE `dotp_gacl_groups_aro_map` +( + `group_id` int(11) NOT NULL default '0', + `aro_id` int(11) NOT NULL default '0', + PRIMARY KEY (`group_id`, `aro_id`) +); + +INSERT INTO `dotp_gacl_groups_aro_map` (`group_id`, `aro_id`) VALUES + (11, 10); + +# -------------------------------------------------------- + +# +# Table structure for table `gacl_groups_axo_map` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 26, 2004 at 11:01 AM +# + +DROP TABLE IF EXISTS `dotp_gacl_groups_axo_map`; +CREATE TABLE `dotp_gacl_groups_axo_map` +( + `group_id` int(11) NOT NULL default '0', + `axo_id` int(11) NOT NULL default '0', + PRIMARY KEY (`group_id`, `axo_id`) +); +# -------------------------------------------------------- + +# +# Table structure for table `gacl_phpgacl` +# +# Creation: Jul 22, 2004 at 01:00 PM +# Last update: Jul 22, 2004 at 01:03 PM +# + +DROP TABLE IF EXISTS `dotp_gacl_phpgacl`; +CREATE TABLE `dotp_gacl_phpgacl` +( + `name` varchar(127) NOT NULL default '', + `value` varchar(230) NOT NULL default '', + PRIMARY KEY (`name`) +); + +DROP TABLE IF EXISTS `dotp_billingcode`; +CREATE TABLE `dotp_billingcode` +( + `billingcode_id` bigint(20) NOT NULL auto_increment, + `billingcode_name` varchar(25) NOT NULL default '', + `billingcode_value` float NOT NULL default '0', + `billingcode_desc` varchar(255) NOT NULL default '', + `billingcode_status` int(1) NOT NULL default '0', + `company_id` bigint(20) NOT NULL default '0', + PRIMARY KEY (`billingcode_id`) +); + +INSERT INTO `dotp_gacl_phpgacl` (name, value) +VALUES ('version', '3.3.2'); +INSERT INTO `dotp_gacl_phpgacl` (name, value) +VALUES ('schema_version', '2.1'); + +INSERT INTO `dotp_gacl_acl_sections` (id, value, order_value, name) +VALUES (1, 'system', 1, 'System'); +INSERT INTO `dotp_gacl_acl_sections` (id, value, order_value, name) +VALUES (2, 'user', 2, 'User'); + + +# +# Table structure for table `sessions` +# + +DROP TABLE IF EXISTS `dotp_sessions`; +CREATE TABLE `dotp_sessions` +( + `session_id` varchar(60) NOT NULL default '', + `session_user` INT DEFAULT '0' NOT NULL, + `session_data` LONGBLOB, + `session_updated` TIMESTAMP, + `session_created` DATETIME NOT NULL default '0000-00-00 00:00:00', + PRIMARY KEY (`session_id`), + KEY (`session_updated`), + KEY (`session_created`) +); + +# 20050304 +# Version tracking table. From here on in all updates are done via the installer, +# which uses this table to manage the upgrade process. +CREATE TABLE dotp_dpversion +( + code_version varchar(10) not null default '', + db_version integer not null default '0', + last_db_update date not null default '0000-00-00', + last_code_update date not null default '0000-00-00' +); + +INSERT INTO dotp_dpversion +VALUES ('2.1.8', 2, '2013-01-05', '2013-07-27'); + +# 20050307 +# Additional LDAP search user and search password fields for Active Directory compatible LDAP authentication +INSERT INTO `dotp_config` +VALUES (0, 'ldap_search_user', 'Manager', 'ldap', 'text'); +INSERT INTO `dotp_config` +VALUES (0, 'ldap_search_pass', 'secret', 'ldap', 'password'); +INSERT INTO `dotp_config` +VALUES (0, 'ldap_allow_login', 'true', 'ldap', 'checkbox'); + +# 20070126 +# +# Table structure for table `file_folders` +# + +DROP TABLE IF EXISTS `dotp_file_folders`; +CREATE TABLE `dotp_file_folders` +( + `file_folder_id` int(11) NOT NULL auto_increment, + `file_folder_parent` int(11) NOT NULL default '0', + `file_folder_name` varchar(255) NOT NULL default '', + `file_folder_description` text, + PRIMARY KEY (`file_folder_id`) +); + +# 20101010 + +DROP TABLE IF EXISTS `dotp_dotpermissions`; +CREATE TABLE `dotp_dotpermissions` +( + `acl_id` int(11) NOT NULL DEFAULT '0', + `user_id` varchar(80) NOT NULL DEFAULT '', + `section` varchar(80) NOT NULL DEFAULT '', + `axo` varchar(80) NOT NULL DEFAULT '', + `permission` varchar(80) NOT NULL DEFAULT '', + `allow` int(11) NOT NULL DEFAULT '0', + `priority` int(11) NOT NULL DEFAULT '0', + `enabled` int(11) NOT NULL DEFAULT '0', + KEY `user_id` (`user_id`, `section`, `permission`, `axo`) +); + +# 20101216 +# Manage contacts properly +INSERT INTO `dotp_config` +VALUES (0, 'user_contact_inactivate', 'true', 'auth', 'checkbox'); +INSERT INTO `dotp_config` +VALUES (0, 'user_contact_activate', 'false', 'auth', 'checkbox'); + +# 20130105 +INSERT INTO `dotp_config` +VALUES (0, 'task_reminder_batch', 'false', 'task_reminder', 'checkbox'); + diff --git a/docs/dotproject.mwb b/docs/dotproject.mwb new file mode 100644 index 000000000..a6595a021 Binary files /dev/null and b/docs/dotproject.mwb differ diff --git a/docs/notes.md b/docs/notes.md new file mode 100644 index 000000000..7f80ebc7b --- /dev/null +++ b/docs/notes.md @@ -0,0 +1,8 @@ +dotProject 2.2.0 seems to work with: +- php 7.3 and mysql 5.7. +- php:7.4.29 + +Doesn't work with: +- php 8.1 + +It is not completely compatible with mysql 8 diff --git a/index.php b/index.php index 2b3b4842a..4493e4fde 100644 --- a/index.php +++ b/index.php @@ -21,7 +21,7 @@ // If you experience a 'white screen of death' or other problems, // uncomment the following line of code: -//error_reporting(E_ALL); +error_reporting(E_ALL); $loginFromPage = 'index.php'; require_once 'base.php'; @@ -31,10 +31,10 @@ require_once DP_BASE_DIR . '/includes/config.php'; } else { - echo ('' - . 'Fatal Error. You haven\'t created a config file yet.
' - . 'Click Here To Start Installation and Create One!' + echo ('' + . 'Fatal Error. You haven\'t created a config file yet.
' + . 'Click Here To Start Installation and Create One!' . ' (forwarded in 5 sec.)'); exit(); } @@ -71,7 +71,7 @@ if (isset($_GET['logout']) && isset($_SESSION['AppUI']->user_id)) { $AppUI =& $_SESSION['AppUI']; $AppUI->registerLogout($AppUI->user_id); - addHistory('login', $AppUI->user_id, 'logout', + addHistory('login', $AppUI->user_id, 'logout', ($AppUI->user_first_name . ' ' . $AppUI->user_last_name)); } $_SESSION['AppUI'] = new CAppUI; @@ -88,7 +88,7 @@ require_once DP_BASE_DIR.'/misc/debug.php'; //Function for update lost action in user_access_log -$AppUI->updateLastAction($last_insert_id); +$AppUI->updateLastAction($last_insert_id); // BOOKMARK: on PHP 8 the code breaks here // load default preferences if not logged in if ($AppUI->doLogin()) { $AppUI->loadPrefs(0); @@ -121,6 +121,7 @@ $AppUI->setUserLocale(); @include_once(DP_BASE_DIR . '/locales/' . $AppUI->user_locale . '/locales.php'); @include_once DP_BASE_DIR . '/locales/core.php'; + $ok = $AppUI->login($username, $password); if (!$ok) { $AppUI->setMsg('Login Failed'); @@ -128,7 +129,7 @@ //Register login in user_acces_log $AppUI->registerLogin(); } - addHistory('login', $AppUI->user_id, 'login', + addHistory('login', $AppUI->user_id, 'login', ($AppUI->user_first_name . ' ' . $AppUI->user_last_name)); $AppUI->redirect($redirect); } @@ -237,7 +238,7 @@ // TODO - MUST MOVE THESE INTO THE MODULE DIRECTORY if (isset($_REQUEST['dosql'])) { //require('./dosql/' . $_REQUEST['dosql'] . '.php'); - require (DP_BASE_DIR . '/modules/' . $m . '/' . ($u ? ($u.'/') : '') + require (DP_BASE_DIR . '/modules/' . $m . '/' . ($u ? ($u.'/') : '') . $AppUI->checkFileName($_REQUEST['dosql']) . '.php'); } @@ -261,11 +262,11 @@ if (!(getPermission($dir, 'access'))) { continue; } - $modules_tabs = $AppUI->readFiles((DP_BASE_DIR . '/modules/' . $dir . '/'), + $modules_tabs = $AppUI->readFiles((DP_BASE_DIR . '/modules/' . $dir . '/'), ('^' . $m . '_tab.*\.php')); foreach ($modules_tabs as $mod_tab) { // Get the name as the subextension - // cut the module_tab. and the .php parts of the filename + // cut the module_tab. and the .php parts of the filename // (begining and end) $nameparts = explode('.', $mod_tab); $filename = mb_substr($mod_tab, 0, -4); @@ -283,13 +284,13 @@ $arr[] = array('name' => ucfirst(str_replace('_', ' ', $name)), 'file' => (DP_BASE_DIR . '/modules/' . $dir . '/' . $filename), 'module' => $dir); - - /* + + /* * Don't forget to unset $arr again! $arr is likely to be used in the sequel declaring * any temporary array. This may lead to strange bugs with disappearing tabs(cf. #1767). * @author: gregorerhardt @date: 20070203 */ - unset($arr); + unset($arr); } } } else { @@ -300,16 +301,16 @@ if (file_exists($module_file)) { require $module_file; } else { - //TODO: make this part of the public module? + //TODO: make this part of the public module? //TODO: internationalise the string. $titleBlock = new CTitleBlock('Warning', 'log-error.gif'); $titleBlock->show(); - + echo $AppUI->_('Missing file. Possible Module "' . $m . '" missing!'); } // wtf?? why? if (!$suppressHeaders) { - echo (''); require (DP_BASE_DIR . '/style/' . $uistyle . '/footer.php'); } diff --git a/modules/files/folders_table.php b/modules/files/folders_table.php index d869f20c2..80540ce7a 100644 --- a/modules/files/folders_table.php +++ b/modules/files/folders_table.php @@ -60,13 +60,13 @@ function displayFolders($folder_id=0, $level=0) { global $AppUI, $m, $a, $tab; global $current_uri; - + global $canAccess_folders, $canRead_folders, $canEdit_folders; global $canAuthor_folders, $canDelete_folders; - + global $company_id, $project_id, $task_id; global $allowedCompanies, $allowedProjects, $allowedTasks, $allowedFolders; - + $q = new DBQuery(); $folders = array(); // retrieve all info of $folder_id @@ -82,105 +82,105 @@ function displayFolders($folder_id=0, $level=0) { $folders[0]['file_folder_description'] = ''; $folder_id = 0; } - + //get file count for folder $file_count = countFiles($folder_id); - + //check permissions $canAccess_this = getPermission('file_folders', 'access', $folder_id); $canRead_this = getPermission('file_folders', 'view', $folder_id); $canEdit_this = getPermission('file_folders', 'edit', $folder_id); $canAuthor_this = getPermission('file_folders', 'add', $folder_id); $canDelete_this = getPermission('file_folders', 'delete', $folder_id); - + if (!($canRead_this) && $folder_id) { return; } - + foreach ($folders as $row) { - + //"loop" through one folder if ($canRead_this && $level) { // indent and display the title echo ('' . "\n"); echo ('\n" : '')); - - + + if ($row['file_folder_description'] && !($folder_id && $level)) { echo $AppUI->___('

' . $row['file_folder_description'] . '

'); - } else if ($level) { - + } else if ($level) { + if ($folder_id) { - echo ('' . "\n" - . '' . "\n" - . '' . "\n" - . '' . "\n" - . '' + echo ('' . "\n" + . '' . "\n" + . '' . "\n" + . '' . "\n" + . '' . "\n"); echo ('\n"); echo ("
' . "\n"); } - - echo ('' . "\n"); - - echo ((($m=='files') - ? ('') : '') . "\n"); - echo (dPshowImage(DP_BASE_URL . '/modules/files/images/folder5_small.png', '16', '16', - 'folder icon', $AppUI->_('show only this folder')) + echo (dPshowImage(DP_BASE_URL . '/modules/files/images/folder5_small.png', '16', '16', + 'folder icon', $AppUI->_('show only this folder')) . $AppUI->___($row['file_folder_name']) . "\n"); echo ((($m=='files') ? '' : ''). "\n"); - + if ($file_count > 0) { - echo ('(' . $file_count + echo ('(' . $file_count . ' files) +'. "\n"); } - + echo ("\n" . (($level)? "
' . "\n"); //edit folder if ($canEdit_this) { - echo ('' . dPshowImage(DP_BASE_URL . '/modules/files/images/kedit.png', - '16', '16', 'edit icon', 'edit this folder') + echo ('' . dPshowImage(DP_BASE_URL . '/modules/files/images/kedit.png', + '16', '16', 'edit icon', 'edit this folder') . ''); } //add folder if ($canAuthor_this) { - echo ('' + echo ('' . dPshowImage(DP_BASE_URL . '/modules/files/images/edit_add.png', '16', - '16', 'new folder', $AppUI->_('add a new subfolder')) + '16', 'new folder', $AppUI->_('add a new subfolder')) . ''); } if ($canDelete_this) { //remove folder - echo ('' .dPshowImage(DP_BASE_URL . '/modules/files/images/remove.png', - '16', '16', 'delete icon', - $AppUI->_('delete this folder')) + echo ('' .dPshowImage(DP_BASE_URL . '/modules/files/images/remove.png', + '16', '16', 'delete icon', + $AppUI->_('delete this folder')) . ''); } //add file to folder - echo ('' - . dPshowImage(DP_BASE_URL . '/modules/files/images/folder_new.png', '16', - '16', 'new file', $AppUI->_('add new file to this folder')) + echo ('' + . dPshowImage(DP_BASE_URL . '/modules/files/images/folder_new.png', '16', + '16', 'new file', $AppUI->_('add new file to this folder')) . ''); echo ("
\n"); } } - - - + + + if ($file_count > 0) { - echo ('
'); displayFiles($folder_id); echo '
'; @@ -188,7 +188,7 @@ function displayFolders($folder_id=0, $level=0) { echo $AppUI->_('No Result(s)'); } } - + // retrieve all children of $folder_id $q->addTable('file_folders', 'ff'); $q->addQuery('ff.*'); @@ -202,19 +202,19 @@ function displayFolders($folder_id=0, $level=0) { $folders_children = db_loadList($folder_children_sql); foreach ($folders_children as $kid_row) { // call this function again to its children - echo ('
  • '); + echo ('
    • '); displayFolders($kid_row['file_folder_id'], $level+1); - echo ('
    '); + echo ('
'); } - + } function countFiles($folder_id) { global $company_id, $project_id, $task_id; global $allowedCompanies, $allowedProjects, $allowedTasks, $allowedFolders; - + $q = new DBQuery(); - + //get file count for folder $q->addTable('files', 'f'); $q->addJoin('projects', 'p', 'p.project_id = f.file_project'); @@ -244,51 +244,51 @@ function countFiles($folder_id) { $q->addWhere('(' . implode(' AND ', $allowedCompanies) . ')'); } } - + $sql = $q->prepare(); $q->clear(); - + return db_loadResult($sql); } function displayFiles($folder_id) { - + global $AppUI, $m, $a, $tab, $page; global $current_uri; - + global $canAccess, $canRead, $canEdit, $canAuthor, $canDelete; global $canAccess_folders, $canRead_folders, $canEdit_folders; global $canAuthor_folders, $canDelete_folders; - + global $company_id, $project_id, $task_id; global $allowedCompanies, $allowedProjects, $allowedTasks, $allowedFolders; - + global $showProject, $cfObj, $dPconfig; - - + + $df = $AppUI->getPref('SHDATEFORMAT'); $tf = $AppUI->getPref('TIMEFORMAT'); - + $file_types = dPgetSysVal('FileType'); - + $xpg_pagesize = 30; //TODO?: Set by System Config Value ... $xpg_totalrecs = countFiles($folder_id); //get file count for folder $xpg_total_pages = ($xpg_totalrecs > $xpg_pagesize) ? ceil($xpg_totalrecs / $xpg_pagesize) : 1; - + $xpg_min = $xpg_pagesize * ($page - 1); // This is where we start our record set from - + $q = new DBQuery(); - + // most recent version info per file_project and file_version_id $q->createTemp('files_count_max' . $folder_id); $q->addTable('files', 'f'); - $q->addQuery('DISTINCT count(f.file_id) as file_versions' - . ', max(f.file_version) as file_lastversion' + $q->addQuery('DISTINCT count(f.file_id) as file_versions' + . ', max(f.file_version) as file_lastversion' . ', file_version_id, f.file_project'); $q->addJoin('projects', 'p', 'p.project_id = f.file_project'); $q->addJoin('tasks', 't', 't.task_id = f.file_task'); $q->addJoin('file_folders', 'ff', 'ff.file_folder_id = f.file_folder'); - + $q->addWhere('f.file_folder = '. $folder_id); if (count ($allowedProjects)) { $q->addWhere('((' . implode(' AND ', $allowedProjects) . ') OR f.file_project = 0)'); @@ -306,24 +306,24 @@ function displayFiles($folder_id) { $q->addWhere('(' . implode(' AND ', $allowedCompanies) . ')'); } } - + $q->addGroup('f.file_version_id'); $q->addGroup('f.file_project'); $file_version_max_counts = $q->exec(); $q->clear(); - - + + // most recent version $q->addTable('files', 'f'); - $q->addQuery('f.*, fmc.file_versions, round(fmc.file_lastversion, 2) as file_lastversion' - . ', u.user_username as file_owner, ff.file_folder_name' - . ', ff.file_folder_id, ff.file_folder_name, p.project_name' - . ', p.project_color_identifier, p.project_owner, c.contact_first_name' - . ', c.contact_last_name, t.task_name, u.user_username as file_owner' - . ', cc.contact_first_name as checkout_first_name' + $q->addQuery('f.*, fmc.file_versions, round(fmc.file_lastversion, 2) as file_lastversion' + . ', u.user_username as file_owner, ff.file_folder_name' + . ', ff.file_folder_id, ff.file_folder_name, p.project_name' + . ', p.project_color_identifier, p.project_owner, c.contact_first_name' + . ', c.contact_last_name, t.task_name, u.user_username as file_owner' + . ', cc.contact_first_name as checkout_first_name' . ', cc.contact_last_name as checkout_last_name'); - $q->addJoin('files_count_max' . $folder_id, 'fmc', - '(fmc.file_lastversion=f.file_version AND fmc.file_version_id=f.file_version_id' + $q->addJoin('files_count_max' . $folder_id, 'fmc', + '(fmc.file_lastversion=f.file_version AND fmc.file_version_id=f.file_version_id' . ' AND fmc.file_project=f.file_project)', 'inner'); $q->addJoin('projects', 'p', 'p.project_id = f.file_project'); $q->addJoin('users', 'u', 'u.user_id = f.file_owner'); @@ -332,7 +332,7 @@ function displayFiles($folder_id) { $q->addJoin('file_folders', 'ff', 'ff.file_folder_id = f.file_folder'); $q->leftJoin('users', 'cu', 'cu.user_id = f.file_checkout'); $q->leftJoin('contacts', 'cc', 'cc.contact_id = cu.user_contact'); - + $q->addWhere('f.file_folder = '. $folder_id); if (count ($allowedProjects)) { $q->addWhere('((' . implode(' AND ', $allowedProjects) . ') OR f.file_project = 0)'); @@ -356,25 +356,25 @@ function displayFiles($folder_id) { $q->addWhere('(' . implode(' AND ', $allowedCompanies) . ')'); } } - + $q->addOrder('p.project_name'); $q->setLimit($xpg_pagesize, $xpg_min); - + $files_sql = $q->prepare(); $q->clear(); - - + + // all versions $q->addTable('files', 'f'); - $q->addQuery('f.*, ff.file_folder_id, ff.file_folder_name, p.project_name' - . ', p.project_color_identifier, p.project_owner, c.contact_first_name' + $q->addQuery('f.*, ff.file_folder_id, ff.file_folder_name, p.project_name' + . ', p.project_color_identifier, p.project_owner, c.contact_first_name' . ', c.contact_last_name, t.task_name, u.user_username as file_owner'); $q->addJoin('projects', 'p', 'p.project_id = f.file_project'); $q->addJoin('users', 'u', 'u.user_id = f.file_owner'); $q->addJoin('contacts', 'c', 'c.contact_id = u.user_contact'); $q->addJoin('tasks', 't', 't.task_id = f.file_task'); $q->addJoin('file_folders', 'ff', 'ff.file_folder_id = f.file_folder'); - + $q->addWhere('f.file_folder = '. $folder_id); if (count ($allowedProjects)) { $q->addWhere('((' . implode(' AND ', $allowedProjects) . ') OR f.file_project = 0)'); @@ -398,10 +398,10 @@ function displayFiles($folder_id) { $q->addWhere('(' . implode(' AND ', $allowedCompanies) . ')'); } } - + $file_versions_sql = $q->prepare(); $q->clear(); - + //file arrays $files = array(); $file_versions = array(); @@ -412,7 +412,7 @@ function displayFiles($folder_id) { $q->dropTemp('files_count_max' . $folder_id); $q->exec(); if ($files == array()) { - return; + return; } ?> @@ -433,20 +433,20 @@ function displayFiles($folder_id) { _('Not associated to projects'); $row['project_color_identifier'] = '#f4efe3'; } if ($showProject) { - $style = ('background-color:' . $row['project_color_identifier'] + $style = ('background-color:' . $row['project_color_identifier'] . ';color:' . bestColor($row['project_color_identifier'])); ?> @@ -466,22 +466,22 @@ function displayFiles($folder_id) { - + - + - - " title="___($row['file_description']); ?>"> + -   +   @@ -493,7 +493,7 @@ function displayFiles($folder_id) { ?> () - @@ -518,102 +518,102 @@ function displayFiles($folder_id) { format($df . ' ' . $tf); ?> - - 1) { ?>
___($row['file_description']);?> - ___($row['file_co_reason']); ?> user_id + ___($row['file_co_reason']); ?> user_id || ($canEdit && ($canAdmin || $row['project_owner'] == $AppUI->user_id)))) { -?> - "> - - - user_id) { ?> - _('final'); } else { - echo ($AppUI->___(' ' . $file['co_contact_first_name'] . ' ' + echo ($AppUI->___(' ' . $file['co_contact_first_name'] . ' ' . $file['co_contact_last_name']) . '
' . $AppUI->___('(' . $file['co_user'] . ')')); } ?>
- user_id)))) { ?> - user_id) { ?> - - user_id) { ?> - - user_id)) { - $bulk_op = ('onchange="javascript:(this.checked) ? addBulkComponent(' . $row['file_id'] + $bulk_op = ('onchange="javascript:(this.checked) ? addBulkComponent(' . $row['file_id'] . ') : removeBulkComponent(' . $row['file_id'] . ')"'); ?> - name="chk_sub_sel_file_" /> name="chk_sub_sel_file_" />
- @@ -635,27 +635,27 @@ function displayFiles($folder_id) { ?> @@ -680,59 +680,59 @@ function displayFiles($folder_id) { - - - @@ -783,7 +783,7 @@ function addBulkComponent(li) { var form = document.frm_bulk; var ni = document.getElementById('tbl_bulk'); var newitem = document.createElement('input'); - + if (document.all || navigator.appName == "Microsoft Internet Explorer") { //IE var htmltxt = ""; newitem.id = 'bulk_selected_file['+li+']'; @@ -794,12 +794,12 @@ function addBulkComponent(li) { newitem.setAttribute("name",'bulk_selected_file['+li+']'); newitem.setAttribute("type",'hidden'); } - + ni.appendChild(newitem); } function delCheck(ffid) { -_('Are you sure you want to delete this folder?'); ?> if (confirm('')) { @@ -809,7 +809,7 @@ function delCheck(ffid) { } function goCheck() { -_('Are you sure you wish to apply the options on the selected files?'); ?> if (confirm('')) { @@ -883,34 +883,34 @@ function removeBulkComponent(li) { } - @@ -976,19 +976,19 @@ function removeBulkComponent(li) {
-' +' . "\n"); - echo ("\t\t\t" . dPshowImage(DP_BASE_URL . '/modules/files/images/home.png', '22', '22', + echo ("\t\t\t" . dPshowImage(DP_BASE_URL . '/modules/files/images/home.png', '22', '22', 'folder icon', $AppUI->_('back to root folder')) . "\n"); echo ("\t\t\t" . '' . "\n"); - - $canRead_parent = (($folder) + + $canRead_parent = (($folder) ? getPermission('file_folders', 'view', $cfObj->file_folder_parent) : true); if ($canRead_parent) { - echo ("\t\t\t" . '' . "\n"); - echo ("\t\t\t" . dPshowImage(DP_BASE_URL . '/modules/files/images/back.png', '22', '22', + echo ("\t\t\t" . dPshowImage(DP_BASE_URL . '/modules/files/images/back.png', '22', '22', 'folder icon', $AppUI->_('back to parent folder')) . "\n"); echo ("\t\t\t" . '' . "\n"); } - + if ($canEdit_this_folder) { - echo ("\t\t\t" . '' . "\n"); - echo ("\t\t\t" . dPshowImage(DP_BASE_URL . '/modules/files/images/filesaveas.png', + echo ("\t\t\t" . dPshowImage(DP_BASE_URL . '/modules/files/images/filesaveas.png', '22', '22', 'folder icon', $AppUI->_('edit folder')) . "\n"); echo ("\t\t\t" . '' . "\n"); } @@ -921,9 +921,9 @@ function removeBulkComponent(li) { - +
-
@@ -934,7 +934,7 @@ function removeBulkComponent(li) { getAllowedRecords($AppUI->user_id, 'project_id,project_name', +$projects_list = $project->getAllowedRecords($AppUI->user_id, 'project_id,project_name', 'project_name', null, $extra); //getting company names (to go with project name in drop-down) $q = new DBQuery; $q->addTable('projects', 'p'); $q->addJoin('companies', 'co', 'co.company_id = p.project_company'); $q->addQuery('p.project_id, co.company_name'); -$q->addWhere('p.project_id IN (0' . ((count($projects_list)) - ? (',' . implode(',', array_keys($projects_list))) +$q->addWhere('p.project_id IN (0' . ((count($projects_list)) + ? (',' . implode(',', array_keys($projects_list))) : '') . ')'); $proj_companies = $q->loadHashList(); $q->clear(); //folder drop-down: allowed Folders only $folders_list = getFolderSelectList(); -$folders_list = arrayMerge(array('O' => array('O', ('(' . $AppUI->_('Move to Folder') . ')'), -1)), +$folders_list = arrayMerge(array('O' => array('O', ('(' . $AppUI->_('Move to Folder') . ')'), -1)), $folders_list); foreach ($projects_list as $prj_id => $prj_name) { @@ -965,8 +965,8 @@ function removeBulkComponent(li) { } asort($projects_list); -$projects_list = arrayMerge(array('O' => ('(' . $AppUI->_('Move to Project') . ')'), - '0' => ('(' . $AppUI->_('No Project Association') . ')')), +$projects_list = arrayMerge(array('O' => ('(' . $AppUI->_('Move to Project') . ')'), + '0' => ('(' . $AppUI->_('No Project Association') . ')')), $projects_list); ?>
diff --git a/modules/files/index_table.php b/modules/files/index_table.php index 6cf6d3851..1c11ebbcc 100644 --- a/modules/files/index_table.php +++ b/modules/files/index_table.php @@ -104,8 +104,8 @@ // most recent version info per file_project and file_version_id $r->createTemp('files_count_max'); $r->addTable('files', 'f'); -$r->addQuery('DISTINCT count(f.file_id) as file_versions' - . ', max(f.file_version) as file_lastversion' +$r->addQuery('DISTINCT count(f.file_id) as file_versions' + . ', max(f.file_version) as file_lastversion' . ', f.file_version_id, f.file_project'); $r->addJoin('projects', 'p', 'p.project_id = f.file_project'); $r->addJoin('tasks', 't', 't.task_id = f.file_task'); @@ -137,8 +137,8 @@ . ', fmc.file_versions , round(fmc.file_lastversion, 2) as file_lastversion'); $q2->addQuery('ff.*'); $q2->addTable('files', 'f'); -$q2->addJoin('files_count_max', 'fmc', - '(fmc.file_lastversion = f.file_version AND fmc.file_version_id = f.file_version_id' +$q2->addJoin('files_count_max', 'fmc', + '(fmc.file_lastversion = f.file_version AND fmc.file_version_id = f.file_version_id' . ' AND fmc.file_project = f.file_project)', 'inner'); $q2->addJoin('file_folders', 'ff', 'ff.file_folder_id = f.file_folder'); $q2->addJoin('projects', 'p', 'p.project_id = f.file_project'); @@ -169,16 +169,17 @@ // performance issues. It is far better to rearrange the group // by to get the correct ordering. $q2->addGroup('p.project_id'); -$q2->addGroup('f.file_version_id DESC'); +$q2->addGroup('f.file_version_id'); +$q2->addOrder('f.file_version_id DESC'); $q3 = new DBQuery; -$q3->addQuery('f.file_id, f.file_version, f.file_version_id, f.file_project, f.file_name' - . ', f.file_task, t.task_name, f.file_description, f.file_checkout, f.file_co_reason' - . ', u.user_username as file_owner, f.file_size, f.file_category, f.file_type' - . ', f.file_date, cu.user_username as co_user, p.project_name' - . ', p.project_color_identifier, p.project_owner, con.contact_first_name' - . ', con.contact_last_name, co.contact_first_name as co_contact_first_name' +$q3->addQuery('f.file_id, f.file_version, f.file_version_id, f.file_project, f.file_name' + . ', f.file_task, t.task_name, f.file_description, f.file_checkout, f.file_co_reason' + . ', u.user_username as file_owner, f.file_size, f.file_category, f.file_type' + . ', f.file_date, cu.user_username as co_user, p.project_name' + . ', p.project_color_identifier, p.project_owner, con.contact_first_name' + . ', con.contact_last_name, co.contact_first_name as co_contact_first_name' . ', co.contact_last_name as co_contact_last_name '); $q3->addQuery('ff.*'); $q3->addTable('files', 'f'); @@ -214,7 +215,7 @@ $files = array(); $file_versions = array(); if ($canRead) { - + $q2->includeCount(); $files = $q2->loadList(); $xpg_totalrecs = $q2->foundRows(); @@ -260,14 +261,14 @@ function expand(id) { foreach ($files as $file_row) { $latest_file = $file_versions[$file_row['latest_id']]; $file_date = new CDate($latest_file['file_date']); - + if ($fp != $latest_file["file_project"]) { if (!$latest_file["file_project"]) { $latest_file["project_name"] = $AppUI->_('Not associated to projects'); $latest_file["project_color_identifier"] = '#f4efe3'; } if ($showProject) { - $style = ("background-color:$latest_file[project_color_identifier];color:" + $style = ("background-color:$latest_file[project_color_identifier];color:" . bestColor($latest_file["project_color_identifier"])); ?> @@ -283,60 +284,60 @@ function expand(id) { ?> - @@ -372,14 +373,14 @@ function expand(id) {
- - -
- user_id)))) { - echo (''); - echo (dPshowImage(DP_BASE_URL . '/modules/files/images/kedit.png', '16', '16', 'edit file', + echo (dPshowImage(DP_BASE_URL . '/modules/files/images/kedit.png', '16', '16', 'edit file', 'edit file')); echo ''; } ?> - "> user_id) { + } else if ($latest_file['file_checkout'] == $AppUI->user_id) { ?> - _('final'); } else { - echo ($AppUI->___(' ' . $latest_file['co_contact_first_name'] . ' ' + echo ($AppUI->___(' ' . $latest_file['co_contact_first_name'] . ' ' . $latest_file['co_contact_last_name']) . '
' . $AppUI->___('(' . $latest_file['co_user'] . ')')); } ?>
- ___($latest_file['file_co_reason']); ?> user_id + ___($latest_file['file_co_reason']); ?> user_id || ($canEdit && ($canAdmin || $latest_file['project_owner'] == $AppUI->user_id)))) { ?> - "> - $fnamelen+9) { @@ -346,23 +347,23 @@ function expand(id) { } $file_icon = getIcon($file_row['file_type']); ?> - " title="___($latest_file['file_description']); ?>"> ___($latest_file['file_description']); ?> - 1) { ?> () - - +?> ___($file_row['file_folder_name']); ?> - "> - ___($latest_file["contact_first_name"] . ' ' . $latest_file["contact_last_name"]); + ___($latest_file["contact_first_name"] . ' ' . $latest_file["contact_last_name"]); ?> - _(mb_substr($latest_file['file_type'], - mb_strpos($latest_file['file_type'], '/') + 1)); + _(mb_substr($latest_file['file_type'], + mb_strpos($latest_file['file_type'], '/') + 1)); ?> @@ -416,8 +417,8 @@ function expand(id) { ?>
- @@ -444,7 +445,7 @@ function expand(id) { ?> @@ -468,15 +469,15 @@ function expand(id) { diff --git a/modules/tasks/tasks.php b/modules/tasks/tasks.php index 6f996e865..cc74f8441 100644 --- a/modules/tasks/tasks.php +++ b/modules/tasks/tasks.php @@ -229,7 +229,7 @@ // patch 2.12.04 finish date required to be consider finish $where .= (' AND task_project = prj.project_id AND ut3.user_id = ' . $user_id . ' AND ut3.task_id = tsk.task_id ' - . "AND (task_percent_complete < 100 OR task_end_date = '') " + . "AND (task_percent_complete < 100 OR task_end_date = NULL) " . 'AND prj.project_status <> 7 AND prj.project_status <> 4 ' . 'AND prj.project_status <> 5'); break; @@ -237,7 +237,7 @@ // patch 2.12.04 finish date required to be consider finish // patch 2.12.04 2, also show unassigned tasks $where .= (' AND task_project = prj.project_id ' - . "AND (task_percent_complete < 100 OR task_end_date = '') " + . "AND (task_percent_complete < 100 OR task_end_date = NULL) " . 'AND prj.project_status <> 7 AND prj.project_status <> 4 ' . 'AND prj.project_status <> 5'); break; diff --git a/modules/tasks/todo.php b/modules/tasks/todo.php index 4e40e5f2a..9e2d86716 100644 --- a/modules/tasks/todo.php +++ b/modules/tasks/todo.php @@ -134,7 +134,7 @@ $q->addWhere('task_pinned = 1'); } if (!$showEmptyDate) { - $q->addWhere("ta.task_start_date != '' AND ta.task_start_date != '0000-00-00 00:00:00'"); + $q->addWhere("ta.task_start_date != NULL AND ta.task_start_date != '0000-00-00 00:00:00'"); } diff --git a/tests/_data/.gitkeep b/tests/_data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/tests/_data/companies.sql b/tests/_data/companies.sql new file mode 100644 index 000000000..2964cc270 --- /dev/null +++ b/tests/_data/companies.sql @@ -0,0 +1 @@ +truncate table dotp_companies; diff --git a/tests/_data/dotproject.sql b/tests/_data/dotproject.sql new file mode 100644 index 000000000..162d4df01 --- /dev/null +++ b/tests/_data/dotproject.sql @@ -0,0 +1,1636 @@ +# +# SQL Export +# Created by Querious (301010) +# Created: June 18, 2022 at 2:29:14 PM CDT +# Encoding: Unicode (UTF-8) +# + + +SET @ORIG_FOREIGN_KEY_CHECKS = @@FOREIGN_KEY_CHECKS; +SET FOREIGN_KEY_CHECKS = 0; + +SET @ORIG_UNIQUE_CHECKS = @@UNIQUE_CHECKS; +SET UNIQUE_CHECKS = 0; + +SET @ORIG_TIME_ZONE = @@TIME_ZONE; +SET TIME_ZONE = '+00:00'; + +SET @ORIG_SQL_MODE = @@SQL_MODE; +SET SQL_MODE = 'NO_AUTO_VALUE_ON_ZERO'; + + + +CREATE TABLE `dotp_billingcode` ( + `billingcode_id` bigint(20) NOT NULL AUTO_INCREMENT, + `billingcode_name` varchar(25) NOT NULL DEFAULT '', + `billingcode_value` float NOT NULL DEFAULT '0', + `billingcode_desc` varchar(255) NOT NULL DEFAULT '', + `billingcode_status` int(1) NOT NULL DEFAULT '0', + `company_id` bigint(20) NOT NULL DEFAULT '0', + PRIMARY KEY (`billingcode_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_common_notes` ( + `note_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `note_author` int(10) unsigned NOT NULL DEFAULT '0', + `note_module` int(10) unsigned NOT NULL DEFAULT '0', + `note_record_id` int(10) unsigned NOT NULL DEFAULT '0', + `note_category` int(3) unsigned NOT NULL DEFAULT '0', + `note_title` varchar(100) NOT NULL DEFAULT '', + `note_body` text NOT NULL, + `note_date` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `note_hours` float NOT NULL DEFAULT '0', + `note_code` varchar(8) NOT NULL DEFAULT '', + `note_created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + `note_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `note_modified_by` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`note_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_companies` ( + `company_id` int(10) NOT NULL AUTO_INCREMENT, + `company_module` int(10) NOT NULL DEFAULT '0', + `company_name` varchar(100) DEFAULT '', + `company_phone1` varchar(30) DEFAULT '', + `company_phone2` varchar(30) DEFAULT '', + `company_fax` varchar(30) DEFAULT '', + `company_address1` varchar(50) DEFAULT '', + `company_address2` varchar(50) DEFAULT '', + `company_city` varchar(30) DEFAULT '', + `company_state` varchar(30) DEFAULT '', + `company_zip` varchar(11) DEFAULT '', + `company_primary_url` varchar(255) DEFAULT '', + `company_owner` int(11) NOT NULL DEFAULT '0', + `company_description` text, + `company_type` int(3) NOT NULL DEFAULT '0', + `company_email` varchar(255) DEFAULT NULL, + `company_custom` longtext, + PRIMARY KEY (`company_id`), + KEY `idx_cpy1` (`company_owner`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_config` ( + `config_id` int(11) NOT NULL AUTO_INCREMENT, + `config_name` varchar(127) NOT NULL DEFAULT '', + `config_value` varchar(255) NOT NULL DEFAULT '', + `config_group` varchar(255) NOT NULL DEFAULT '', + `config_type` varchar(255) NOT NULL DEFAULT '', + PRIMARY KEY (`config_id`), + UNIQUE KEY `config_name` (`config_name`) +) ENGINE=InnoDB AUTO_INCREMENT=75 DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_config_list` ( + `config_list_id` int(11) NOT NULL AUTO_INCREMENT, + `config_id` int(11) NOT NULL DEFAULT '0', + `config_list_name` varchar(30) NOT NULL DEFAULT '', + PRIMARY KEY (`config_list_id`), + KEY `config_id` (`config_id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_contacts` ( + `contact_id` int(11) NOT NULL AUTO_INCREMENT, + `contact_first_name` varchar(30) DEFAULT NULL, + `contact_last_name` varchar(30) DEFAULT NULL, + `contact_order_by` varchar(30) NOT NULL DEFAULT '', + `contact_title` varchar(50) DEFAULT NULL, + `contact_birthday` date DEFAULT NULL, + `contact_job` varchar(255) DEFAULT NULL, + `contact_company` varchar(100) NOT NULL DEFAULT '', + `contact_department` tinytext, + `contact_type` varchar(20) DEFAULT NULL, + `contact_email` varchar(255) DEFAULT NULL, + `contact_email2` varchar(255) DEFAULT NULL, + `contact_url` varchar(255) DEFAULT NULL, + `contact_phone` varchar(30) DEFAULT NULL, + `contact_phone2` varchar(30) DEFAULT NULL, + `contact_fax` varchar(30) DEFAULT NULL, + `contact_mobile` varchar(30) DEFAULT NULL, + `contact_address1` varchar(60) DEFAULT NULL, + `contact_address2` varchar(60) DEFAULT NULL, + `contact_city` varchar(30) DEFAULT NULL, + `contact_state` varchar(30) DEFAULT NULL, + `contact_zip` varchar(11) DEFAULT NULL, + `contact_country` varchar(30) DEFAULT NULL, + `contact_jabber` varchar(255) DEFAULT NULL, + `contact_icq` varchar(20) DEFAULT NULL, + `contact_msn` varchar(255) DEFAULT NULL, + `contact_yahoo` varchar(255) DEFAULT NULL, + `contact_aol` varchar(30) DEFAULT NULL, + `contact_notes` text, + `contact_project` int(11) NOT NULL DEFAULT '0', + `contact_icon` varchar(20) DEFAULT 'obj/contact', + `contact_owner` int(10) unsigned DEFAULT '0', + `contact_private` tinyint(3) unsigned DEFAULT '0', + PRIMARY KEY (`contact_id`), + KEY `idx_oby` (`contact_order_by`), + KEY `idx_co` (`contact_company`), + KEY `idx_prp` (`contact_project`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_custom_fields_lists` ( + `field_id` int(11) DEFAULT NULL, + `list_option_id` int(11) DEFAULT NULL, + `list_value` varchar(250) DEFAULT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_custom_fields_struct` ( + `field_id` int(11) NOT NULL, + `field_module` varchar(30) DEFAULT NULL, + `field_page` varchar(30) DEFAULT NULL, + `field_htmltype` varchar(20) DEFAULT NULL, + `field_datatype` varchar(20) DEFAULT NULL, + `field_order` int(11) DEFAULT NULL, + `field_name` varchar(100) DEFAULT NULL, + `field_extratags` varchar(250) DEFAULT NULL, + `field_description` varchar(250) DEFAULT NULL, + PRIMARY KEY (`field_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_custom_fields_values` ( + `value_id` int(11) DEFAULT NULL, + `value_module` varchar(30) DEFAULT NULL, + `value_object_id` int(11) DEFAULT NULL, + `value_field_id` int(11) DEFAULT NULL, + `value_charvalue` varchar(250) DEFAULT NULL, + `value_intvalue` int(11) DEFAULT NULL, + KEY `idx_cfv_id` (`value_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_departments` ( + `dept_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `dept_parent` int(10) unsigned NOT NULL DEFAULT '0', + `dept_company` int(10) unsigned NOT NULL DEFAULT '0', + `dept_name` tinytext NOT NULL, + `dept_phone` varchar(30) DEFAULT NULL, + `dept_fax` varchar(30) DEFAULT NULL, + `dept_address1` varchar(30) DEFAULT NULL, + `dept_address2` varchar(30) DEFAULT NULL, + `dept_city` varchar(30) DEFAULT NULL, + `dept_state` varchar(30) DEFAULT NULL, + `dept_zip` varchar(11) DEFAULT NULL, + `dept_url` varchar(25) DEFAULT NULL, + `dept_desc` text, + `dept_owner` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`dept_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Department heirarchy under a company'; + + +CREATE TABLE `dotp_dotpermissions` ( + `acl_id` int(11) NOT NULL DEFAULT '0', + `user_id` varchar(80) NOT NULL DEFAULT '', + `section` varchar(80) NOT NULL DEFAULT '', + `axo` varchar(80) NOT NULL DEFAULT '', + `permission` varchar(80) NOT NULL DEFAULT '', + `allow` int(11) NOT NULL DEFAULT '0', + `priority` int(11) NOT NULL DEFAULT '0', + `enabled` int(11) NOT NULL DEFAULT '0', + KEY `user_id` (`user_id`,`section`,`permission`,`axo`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_dpversion` ( + `code_version` varchar(10) NOT NULL DEFAULT '', + `db_version` int(11) NOT NULL DEFAULT '0', + `last_db_update` date NOT NULL DEFAULT '0000-00-00', + `last_code_update` date NOT NULL DEFAULT '0000-00-00' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_event_queue` ( + `queue_id` int(11) NOT NULL AUTO_INCREMENT, + `queue_start` int(11) NOT NULL DEFAULT '0', + `queue_type` varchar(40) NOT NULL DEFAULT '', + `queue_repeat_interval` int(11) NOT NULL DEFAULT '0', + `queue_repeat_count` int(11) NOT NULL DEFAULT '0', + `queue_data` longblob NOT NULL, + `queue_callback` varchar(127) NOT NULL DEFAULT '', + `queue_owner` int(11) NOT NULL DEFAULT '0', + `queue_origin_id` int(11) NOT NULL DEFAULT '0', + `queue_module` varchar(40) NOT NULL DEFAULT '', + `queue_batched` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`queue_id`), + KEY `queue_start` (`queue_batched`,`queue_start`), + KEY `queue_module` (`queue_module`), + KEY `queue_type` (`queue_type`), + KEY `queue_origin_id` (`queue_origin_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_events` ( + `event_id` int(11) NOT NULL AUTO_INCREMENT, + `event_title` varchar(255) NOT NULL DEFAULT '', + `event_start_date` datetime DEFAULT NULL, + `event_end_date` datetime DEFAULT NULL, + `event_parent` int(11) unsigned NOT NULL DEFAULT '0', + `event_description` text, + `event_times_recuring` int(11) unsigned NOT NULL DEFAULT '0', + `event_recurs` int(11) unsigned NOT NULL DEFAULT '0', + `event_remind` int(10) unsigned NOT NULL DEFAULT '0', + `event_icon` varchar(20) DEFAULT 'obj/event', + `event_owner` int(11) DEFAULT '0', + `event_project` int(11) DEFAULT '0', + `event_private` tinyint(3) DEFAULT '0', + `event_type` tinyint(3) DEFAULT '0', + `event_cwd` tinyint(3) DEFAULT '0', + `event_notify` tinyint(3) NOT NULL DEFAULT '0', + PRIMARY KEY (`event_id`), + KEY `id_esd` (`event_start_date`), + KEY `id_eed` (`event_end_date`), + KEY `id_evp` (`event_parent`), + KEY `idx_ev1` (`event_owner`), + KEY `idx_ev2` (`event_project`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_file_folders` ( + `file_folder_id` int(11) NOT NULL AUTO_INCREMENT, + `file_folder_parent` int(11) NOT NULL DEFAULT '0', + `file_folder_name` varchar(255) NOT NULL DEFAULT '', + `file_folder_description` text, + PRIMARY KEY (`file_folder_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_files` ( + `file_id` int(11) NOT NULL AUTO_INCREMENT, + `file_real_filename` varchar(255) NOT NULL DEFAULT '', + `file_folder` int(11) NOT NULL DEFAULT '0', + `file_project` int(11) NOT NULL DEFAULT '0', + `file_task` int(11) NOT NULL DEFAULT '0', + `file_name` varchar(255) NOT NULL DEFAULT '', + `file_parent` int(11) DEFAULT '0', + `file_description` text, + `file_type` varchar(100) DEFAULT NULL, + `file_owner` int(11) DEFAULT '0', + `file_date` datetime DEFAULT NULL, + `file_size` int(11) DEFAULT '0', + `file_version` float NOT NULL DEFAULT '0', + `file_icon` varchar(20) DEFAULT 'obj/', + `file_category` int(11) DEFAULT '0', + `file_checkout` varchar(255) NOT NULL DEFAULT '', + `file_co_reason` text, + `file_version_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`file_id`), + KEY `idx_file_task` (`file_task`), + KEY `idx_file_project` (`file_project`), + KEY `idx_file_parent` (`file_parent`), + KEY `idx_file_vid` (`file_version_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_files_index` ( + `file_id` int(11) NOT NULL DEFAULT '0', + `word` varchar(50) NOT NULL DEFAULT '', + `word_placement` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`file_id`,`word`,`word_placement`), + KEY `idx_fwrd` (`word`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_forum_messages` ( + `message_id` int(11) NOT NULL AUTO_INCREMENT, + `message_forum` int(11) NOT NULL DEFAULT '0', + `message_parent` int(11) NOT NULL DEFAULT '0', + `message_author` int(11) NOT NULL DEFAULT '0', + `message_editor` int(11) NOT NULL DEFAULT '0', + `message_title` varchar(255) NOT NULL DEFAULT '', + `message_date` datetime DEFAULT '0000-00-00 00:00:00', + `message_body` text, + `message_published` tinyint(1) NOT NULL DEFAULT '1', + PRIMARY KEY (`message_id`), + KEY `idx_mparent` (`message_parent`), + KEY `idx_mdate` (`message_date`), + KEY `idx_mforum` (`message_forum`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_forum_visits` ( + `visit_user` int(10) NOT NULL DEFAULT '0', + `visit_forum` int(10) NOT NULL DEFAULT '0', + `visit_message` int(10) NOT NULL DEFAULT '0', + `visit_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + KEY `idx_fv` (`visit_user`,`visit_forum`,`visit_message`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_forum_watch` ( + `watch_user` int(10) unsigned NOT NULL DEFAULT '0', + `watch_forum` int(10) unsigned DEFAULT NULL, + `watch_topic` int(10) unsigned DEFAULT NULL, + KEY `idx_fw1` (`watch_user`,`watch_forum`), + KEY `idx_fw2` (`watch_user`,`watch_topic`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Links users to the forums/messages they are watching'; + + +CREATE TABLE `dotp_forums` ( + `forum_id` int(11) NOT NULL AUTO_INCREMENT, + `forum_project` int(11) NOT NULL DEFAULT '0', + `forum_status` tinyint(4) NOT NULL DEFAULT '-1', + `forum_owner` int(11) NOT NULL DEFAULT '0', + `forum_name` varchar(50) NOT NULL DEFAULT '', + `forum_create_date` datetime DEFAULT '0000-00-00 00:00:00', + `forum_last_date` datetime DEFAULT '0000-00-00 00:00:00', + `forum_last_id` int(10) unsigned NOT NULL DEFAULT '0', + `forum_message_count` int(11) NOT NULL DEFAULT '0', + `forum_description` varchar(255) DEFAULT NULL, + `forum_moderated` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`forum_id`), + KEY `idx_fproject` (`forum_project`), + KEY `idx_fowner` (`forum_owner`), + KEY `forum_status` (`forum_status`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_acl` ( + `id` int(11) NOT NULL DEFAULT '0', + `section_value` varchar(80) NOT NULL DEFAULT 'system', + `allow` int(11) NOT NULL DEFAULT '0', + `enabled` int(11) NOT NULL DEFAULT '0', + `return_value` longtext, + `note` longtext, + `updated_date` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + KEY `gacl_enabled_acl` (`enabled`), + KEY `gacl_section_value_acl` (`section_value`), + KEY `gacl_updated_date_acl` (`updated_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_acl_sections` ( + `id` int(11) NOT NULL DEFAULT '0', + `value` varchar(80) NOT NULL DEFAULT '', + `order_value` int(11) NOT NULL DEFAULT '0', + `name` varchar(230) NOT NULL DEFAULT '', + `hidden` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_value_acl_sections` (`value`), + KEY `gacl_hidden_acl_sections` (`hidden`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_acl_seq` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aco` ( + `id` int(11) NOT NULL DEFAULT '0', + `section_value` varchar(80) NOT NULL DEFAULT '0', + `value` varchar(80) NOT NULL DEFAULT '', + `order_value` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL DEFAULT '', + `hidden` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_section_value_value_aco` (`section_value`,`value`), + KEY `gacl_hidden_aco` (`hidden`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aco_map` ( + `acl_id` int(11) NOT NULL DEFAULT '0', + `section_value` varchar(80) NOT NULL DEFAULT '0', + `value` varchar(80) NOT NULL DEFAULT '', + PRIMARY KEY (`acl_id`,`section_value`,`value`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aco_sections` ( + `id` int(11) NOT NULL DEFAULT '0', + `value` varchar(80) NOT NULL DEFAULT '', + `order_value` int(11) NOT NULL DEFAULT '0', + `name` varchar(230) NOT NULL DEFAULT '', + `hidden` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_value_aco_sections` (`value`), + KEY `gacl_hidden_aco_sections` (`hidden`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aco_sections_seq` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aco_seq` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aro` ( + `id` int(11) NOT NULL DEFAULT '0', + `section_value` varchar(80) NOT NULL DEFAULT '0', + `value` varchar(80) NOT NULL DEFAULT '', + `order_value` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL DEFAULT '', + `hidden` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_section_value_value_aro` (`section_value`,`value`), + KEY `gacl_hidden_aro` (`hidden`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aro_groups` ( + `id` int(11) NOT NULL DEFAULT '0', + `parent_id` int(11) NOT NULL DEFAULT '0', + `lft` int(11) NOT NULL DEFAULT '0', + `rgt` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL DEFAULT '', + `value` varchar(80) NOT NULL DEFAULT '', + PRIMARY KEY (`id`,`value`), + KEY `gacl_parent_id_aro_groups` (`parent_id`), + KEY `gacl_value_aro_groups` (`value`), + KEY `gacl_lft_rgt_aro_groups` (`lft`,`rgt`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aro_groups_id_seq` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aro_groups_map` ( + `acl_id` int(11) NOT NULL DEFAULT '0', + `group_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`acl_id`,`group_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aro_map` ( + `acl_id` int(11) NOT NULL DEFAULT '0', + `section_value` varchar(80) NOT NULL DEFAULT '0', + `value` varchar(80) NOT NULL DEFAULT '', + PRIMARY KEY (`acl_id`,`section_value`,`value`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aro_sections` ( + `id` int(11) NOT NULL DEFAULT '0', + `value` varchar(80) NOT NULL DEFAULT '', + `order_value` int(11) NOT NULL DEFAULT '0', + `name` varchar(230) NOT NULL DEFAULT '', + `hidden` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_value_aro_sections` (`value`), + KEY `gacl_hidden_aro_sections` (`hidden`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aro_sections_seq` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_aro_seq` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_axo` ( + `id` int(11) NOT NULL DEFAULT '0', + `section_value` varchar(80) NOT NULL DEFAULT '0', + `value` varchar(80) NOT NULL DEFAULT '', + `order_value` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL DEFAULT '', + `hidden` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_section_value_value_axo` (`section_value`,`value`), + KEY `gacl_hidden_axo` (`hidden`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_axo_groups` ( + `id` int(11) NOT NULL DEFAULT '0', + `parent_id` int(11) NOT NULL DEFAULT '0', + `lft` int(11) NOT NULL DEFAULT '0', + `rgt` int(11) NOT NULL DEFAULT '0', + `name` varchar(255) NOT NULL DEFAULT '', + `value` varchar(80) NOT NULL DEFAULT '', + PRIMARY KEY (`id`,`value`), + KEY `gacl_parent_id_axo_groups` (`parent_id`), + KEY `gacl_value_axo_groups` (`value`), + KEY `gacl_lft_rgt_axo_groups` (`lft`,`rgt`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_axo_groups_id_seq` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_axo_groups_map` ( + `acl_id` int(11) NOT NULL DEFAULT '0', + `group_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`acl_id`,`group_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_axo_map` ( + `acl_id` int(11) NOT NULL DEFAULT '0', + `section_value` varchar(80) NOT NULL DEFAULT '0', + `value` varchar(80) NOT NULL DEFAULT '', + PRIMARY KEY (`acl_id`,`section_value`,`value`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_axo_sections` ( + `id` int(11) NOT NULL DEFAULT '0', + `value` varchar(80) NOT NULL DEFAULT '', + `order_value` int(11) NOT NULL DEFAULT '0', + `name` varchar(230) NOT NULL DEFAULT '', + `hidden` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `gacl_value_axo_sections` (`value`), + KEY `gacl_hidden_axo_sections` (`hidden`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_axo_sections_seq` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_axo_seq` ( + `id` int(11) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_groups_aro_map` ( + `group_id` int(11) NOT NULL DEFAULT '0', + `aro_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`group_id`,`aro_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_groups_axo_map` ( + `group_id` int(11) NOT NULL DEFAULT '0', + `axo_id` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`group_id`,`axo_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_gacl_phpgacl` ( + `name` varchar(127) NOT NULL DEFAULT '', + `value` varchar(230) NOT NULL DEFAULT '', + PRIMARY KEY (`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_modules` ( + `mod_id` int(11) NOT NULL AUTO_INCREMENT, + `mod_name` varchar(64) NOT NULL DEFAULT '', + `mod_directory` varchar(64) NOT NULL DEFAULT '', + `mod_version` varchar(10) NOT NULL DEFAULT '', + `mod_setup_class` varchar(64) NOT NULL DEFAULT '', + `mod_type` varchar(64) NOT NULL DEFAULT '', + `mod_active` int(1) unsigned NOT NULL DEFAULT '0', + `mod_ui_name` varchar(20) NOT NULL DEFAULT '', + `mod_ui_icon` varchar(64) NOT NULL DEFAULT '', + `mod_ui_order` tinyint(3) NOT NULL DEFAULT '0', + `mod_ui_active` int(1) unsigned NOT NULL DEFAULT '0', + `mod_description` varchar(255) NOT NULL DEFAULT '', + `permissions_item_table` char(100) DEFAULT NULL, + `permissions_item_field` char(100) DEFAULT NULL, + `permissions_item_label` char(100) DEFAULT NULL, + PRIMARY KEY (`mod_id`,`mod_directory`) +) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_permissions` ( + `permission_id` int(11) NOT NULL AUTO_INCREMENT, + `permission_user` int(11) NOT NULL DEFAULT '0', + `permission_grant_on` varchar(12) NOT NULL DEFAULT '', + `permission_item` int(11) NOT NULL DEFAULT '0', + `permission_value` int(11) NOT NULL DEFAULT '0', + PRIMARY KEY (`permission_id`), + UNIQUE KEY `idx_pgrant_on` (`permission_grant_on`,`permission_item`,`permission_user`), + KEY `idx_puser` (`permission_user`), + KEY `idx_pvalue` (`permission_value`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_project_contacts` ( + `project_id` int(10) NOT NULL, + `contact_id` int(10) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_project_departments` ( + `project_id` int(10) NOT NULL, + `department_id` int(10) NOT NULL +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_projects` ( + `project_id` int(11) NOT NULL AUTO_INCREMENT, + `project_company` int(11) NOT NULL DEFAULT '0', + `project_company_internal` int(11) NOT NULL DEFAULT '0', + `project_department` int(11) NOT NULL DEFAULT '0', + `project_name` varchar(255) DEFAULT NULL, + `project_short_name` varchar(10) DEFAULT NULL, + `project_owner` int(11) DEFAULT '0', + `project_url` varchar(255) DEFAULT NULL, + `project_demo_url` varchar(255) DEFAULT NULL, + `project_start_date` datetime DEFAULT NULL, + `project_end_date` datetime DEFAULT NULL, + `project_status` int(11) DEFAULT '0', + `project_percent_complete` tinyint(4) DEFAULT '0', + `project_color_identifier` varchar(7) DEFAULT '#eeeeee', + `project_description` text, + `project_target_budget` decimal(10,2) DEFAULT '0.00', + `project_actual_budget` decimal(10,2) DEFAULT '0.00', + `project_creator` int(11) DEFAULT '0', + `project_private` tinyint(3) unsigned DEFAULT '0', + `project_departments` char(100) DEFAULT NULL, + `project_contacts` char(100) DEFAULT NULL, + `project_priority` tinyint(4) DEFAULT '0', + `project_type` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`project_id`), + KEY `idx_project_owner` (`project_owner`), + KEY `idx_sdate` (`project_start_date`), + KEY `idx_edate` (`project_end_date`), + KEY `project_short_name` (`project_short_name`), + KEY `idx_proj1` (`project_company`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_roles` ( + `role_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `role_name` varchar(24) NOT NULL DEFAULT '', + `role_description` varchar(255) NOT NULL DEFAULT '', + `role_type` int(3) unsigned NOT NULL DEFAULT '0', + `role_module` int(10) unsigned NOT NULL DEFAULT '0', + PRIMARY KEY (`role_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_sessions` ( + `session_id` varchar(60) NOT NULL DEFAULT '', + `session_user` int(11) NOT NULL DEFAULT '0', + `session_data` longblob, + `session_updated` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `session_created` datetime NOT NULL DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`session_id`), + KEY `session_updated` (`session_updated`), + KEY `session_created` (`session_created`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_syskeys` ( + `syskey_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `syskey_name` varchar(48) NOT NULL DEFAULT '', + `syskey_label` varchar(255) NOT NULL DEFAULT '', + `syskey_type` int(1) unsigned NOT NULL DEFAULT '0', + `syskey_sep1` char(2) DEFAULT '\n', + `syskey_sep2` char(2) NOT NULL DEFAULT '|', + PRIMARY KEY (`syskey_id`), + UNIQUE KEY `syskey_name` (`syskey_name`), + UNIQUE KEY `idx_syskey_name` (`syskey_name`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_sysvals` ( + `sysval_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `sysval_key_id` int(10) unsigned NOT NULL DEFAULT '0', + `sysval_title` varchar(48) NOT NULL DEFAULT '', + `sysval_value` text NOT NULL, + PRIMARY KEY (`sysval_id`), + UNIQUE KEY `idx_sysval_title` (`sysval_title`) +) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_task_contacts` ( + `task_id` int(10) NOT NULL, + `contact_id` int(10) NOT NULL, + KEY `idx_task_contacts` (`task_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_task_departments` ( + `task_id` int(10) NOT NULL, + `department_id` int(10) NOT NULL, + KEY `idx_task_departments` (`task_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_task_dependencies` ( + `dependencies_task_id` int(11) NOT NULL, + `dependencies_req_task_id` int(11) NOT NULL, + PRIMARY KEY (`dependencies_task_id`,`dependencies_req_task_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_task_log` ( + `task_log_id` int(11) NOT NULL AUTO_INCREMENT, + `task_log_task` int(11) NOT NULL DEFAULT '0', + `task_log_name` varchar(255) DEFAULT NULL, + `task_log_description` text, + `task_log_creator` int(11) NOT NULL DEFAULT '0', + `task_log_hours` float NOT NULL DEFAULT '0', + `task_log_date` datetime DEFAULT NULL, + `task_log_costcode` varchar(8) NOT NULL DEFAULT '', + `task_log_problem` tinyint(1) DEFAULT '0', + `task_log_reference` tinyint(4) DEFAULT '0', + `task_log_related_url` varchar(255) DEFAULT NULL, + PRIMARY KEY (`task_log_id`), + KEY `idx_log_task` (`task_log_task`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_tasks` ( + `task_id` int(11) NOT NULL AUTO_INCREMENT, + `task_name` varchar(255) DEFAULT NULL, + `task_parent` int(11) DEFAULT '0', + `task_milestone` tinyint(1) DEFAULT '0', + `task_project` int(11) NOT NULL DEFAULT '0', + `task_owner` int(11) NOT NULL DEFAULT '0', + `task_start_date` datetime DEFAULT NULL, + `task_duration` float unsigned DEFAULT '0', + `task_duration_type` int(11) NOT NULL DEFAULT '1', + `task_hours_worked` float unsigned DEFAULT '0', + `task_end_date` datetime DEFAULT NULL, + `task_status` int(11) DEFAULT '0', + `task_priority` tinyint(4) DEFAULT '0', + `task_percent_complete` tinyint(4) DEFAULT '0', + `task_description` text, + `task_target_budget` decimal(10,2) DEFAULT '0.00', + `task_related_url` varchar(255) DEFAULT NULL, + `task_creator` int(11) NOT NULL DEFAULT '0', + `task_order` int(11) NOT NULL DEFAULT '0', + `task_client_publish` tinyint(1) NOT NULL DEFAULT '0', + `task_dynamic` tinyint(1) NOT NULL DEFAULT '0', + `task_access` int(11) NOT NULL DEFAULT '0', + `task_notify` int(11) NOT NULL DEFAULT '0', + `task_departments` char(100) DEFAULT NULL, + `task_contacts` char(100) DEFAULT NULL, + `task_custom` longtext, + `task_type` smallint(6) NOT NULL DEFAULT '0', + PRIMARY KEY (`task_id`), + KEY `idx_task_parent` (`task_parent`), + KEY `idx_task_project` (`task_project`), + KEY `idx_task_owner` (`task_owner`), + KEY `idx_task_order` (`task_order`), + KEY `idx_task1` (`task_start_date`), + KEY `idx_task2` (`task_end_date`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_tickets` ( + `ticket` int(10) unsigned NOT NULL AUTO_INCREMENT, + `ticket_company` int(10) NOT NULL DEFAULT '0', + `ticket_project` int(10) NOT NULL DEFAULT '0', + `author` varchar(100) NOT NULL DEFAULT '', + `recipient` varchar(100) NOT NULL DEFAULT '', + `subject` varchar(100) NOT NULL DEFAULT '', + `attachment` tinyint(1) unsigned NOT NULL DEFAULT '0', + `timestamp` int(10) unsigned NOT NULL DEFAULT '0', + `type` varchar(15) NOT NULL DEFAULT '', + `assignment` int(10) unsigned NOT NULL DEFAULT '0', + `parent` int(10) unsigned NOT NULL DEFAULT '0', + `activity` int(10) unsigned NOT NULL DEFAULT '0', + `priority` tinyint(1) unsigned NOT NULL DEFAULT '1', + `cc` varchar(255) NOT NULL DEFAULT '', + `body` text NOT NULL, + `signature` text, + PRIMARY KEY (`ticket`), + KEY `parent` (`parent`), + KEY `type` (`type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_user_access_log` ( + `user_access_log_id` int(10) unsigned NOT NULL AUTO_INCREMENT, + `user_id` int(10) unsigned NOT NULL, + `user_ip` varchar(15) NOT NULL, + `date_time_in` datetime DEFAULT '0000-00-00 00:00:00', + `date_time_out` datetime DEFAULT '0000-00-00 00:00:00', + `date_time_last_action` datetime DEFAULT '0000-00-00 00:00:00', + PRIMARY KEY (`user_access_log_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_user_events` ( + `user_id` int(11) NOT NULL DEFAULT '0', + `event_id` int(11) NOT NULL DEFAULT '0', + KEY `uek1` (`user_id`,`event_id`), + KEY `uek2` (`event_id`,`user_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_user_preferences` ( + `pref_user` varchar(12) NOT NULL DEFAULT '', + `pref_name` varchar(72) NOT NULL DEFAULT '', + `pref_value` varchar(32) NOT NULL DEFAULT '', + KEY `pref_user` (`pref_user`,`pref_name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_user_roles` ( + `user_id` int(10) unsigned NOT NULL DEFAULT '0', + `role_id` int(10) unsigned NOT NULL DEFAULT '0' +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_user_task_pin` ( + `user_id` int(11) NOT NULL DEFAULT '0', + `task_id` int(10) NOT NULL DEFAULT '0', + `task_pinned` tinyint(2) NOT NULL DEFAULT '1', + PRIMARY KEY (`user_id`,`task_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_user_tasks` ( + `user_id` int(11) NOT NULL DEFAULT '0', + `user_type` tinyint(4) NOT NULL DEFAULT '0', + `task_id` int(11) NOT NULL DEFAULT '0', + `perc_assignment` int(11) NOT NULL DEFAULT '100', + `user_task_priority` tinyint(4) DEFAULT '0', + PRIMARY KEY (`user_id`,`task_id`), + KEY `user_type` (`user_type`), + KEY `idx_user_tasks` (`task_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `dotp_users` ( + `user_id` int(11) NOT NULL AUTO_INCREMENT, + `user_contact` int(11) NOT NULL DEFAULT '0', + `user_username` varchar(255) NOT NULL DEFAULT '', + `user_password` varchar(32) NOT NULL DEFAULT '', + `user_parent` int(11) NOT NULL DEFAULT '0', + `user_type` tinyint(3) NOT NULL DEFAULT '0', + `user_company` int(11) DEFAULT '0', + `user_department` int(11) DEFAULT '0', + `user_owner` int(11) NOT NULL DEFAULT '0', + `user_signature` text, + PRIMARY KEY (`user_id`), + KEY `idx_uid` (`user_username`), + KEY `idx_pwd` (`user_password`), + KEY `idx_user_parent` (`user_parent`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + + + + +LOCK TABLES `dotp_billingcode` WRITE; +TRUNCATE `dotp_billingcode`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_common_notes` WRITE; +TRUNCATE `dotp_common_notes`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_companies` WRITE; +TRUNCATE `dotp_companies`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_config` WRITE; +TRUNCATE `dotp_config`; +INSERT INTO `dotp_config` (`config_id`, `config_name`, `config_value`, `config_group`, `config_type`) VALUES + (1,'host_locale','en','ui','text'), + (2,'check_overallocation','false','tasks','checkbox'), + (3,'currency_symbol','$','ui','text'), + (4,'host_style','default','ui','text'), + (5,'company_name','My Company','ui','text'), + (6,'page_title','dotProject','ui','text'), + (7,'site_domain','example.com','ui','text'), + (8,'email_prefix','[dotProject]','ui','text'), + (9,'admin_username','admin','ui','text'), + (10,'username_min_len','4','auth','text'), + (11,'password_min_len','4','auth','text'), + (12,'enable_gantt_charts','true','tasks','checkbox'), + (13,'log_changes','false','','checkbox'), + (14,'check_task_dates','true','tasks','checkbox'), + (15,'check_task_empty_dynamic','false','tasks','checkbox'), + (16,'locale_warn','false','ui','checkbox'), + (17,'locale_alert','^','ui','text'), + (18,'daily_working_hours','8.0','tasks','text'), + (19,'display_debug','false','ui','checkbox'), + (20,'link_tickets_kludge','false','tasks','checkbox'), + (21,'show_all_task_assignees','false','tasks','checkbox'), + (22,'direct_edit_assignment','false','tasks','checkbox'), + (23,'restrict_color_selection','false','ui','checkbox'), + (24,'cal_day_view_show_minical','true','calendar','checkbox'), + (25,'cal_day_start','8','calendar','text'), + (26,'cal_day_end','17','calendar','text'), + (27,'cal_day_increment','15','calendar','text'), + (28,'cal_working_days','1,2,3,4,5','calendar','text'), + (29,'restrict_task_time_editing','false','tasks','checkbox'), + (30,'default_view_m','calendar','ui','text'), + (31,'default_view_a','day_view','ui','text'), + (32,'default_view_tab','1','ui','text'), + (33,'index_max_file_size','-1','file','text'), + (34,'session_handling','app','session','select'), + (35,'session_idle_time','2d','session','text'), + (36,'session_max_lifetime','1m','session','text'), + (37,'debug','1','','text'), + (38,'parser_default','/usr/bin/strings','file','text'), + (39,'parser_application/msword','/usr/bin/strings','file','text'), + (40,'parser_text/html','/usr/bin/strings','file','text'), + (41,'parser_application/pdf','/usr/bin/pdftotext','file','text'), + (42,'files_ci_preserve_attr','true','file','checkbox'), + (43,'files_show_versions_edit','false','file','checkbox'), + (44,'auth_method','sql','auth','select'), + (45,'ldap_host','localhost','ldap','text'), + (46,'ldap_port','389','ldap','text'), + (47,'ldap_version','3','ldap','text'), + (48,'ldap_base_dn','dc=saki,dc=com,dc=au','ldap','text'), + (49,'ldap_user_filter','(uid=%USERNAME%)','ldap','text'), + (50,'postnuke_allow_login','true','auth','checkbox'), + (51,'reset_memory_limit','32M','tasks','text'), + (52,'mail_transport','php','mail','select'), + (53,'mail_host','localhost','mail','text'), + (54,'mail_port','25','mail','text'), + (55,'mail_auth','false','mail','checkbox'), + (56,'mail_user','','mail','text'), + (57,'mail_pass','','mail','password'), + (58,'mail_defer','false','mail','checkbox'), + (59,'mail_timeout','30','mail','text'), + (60,'session_gc_scan_queue','false','session','checkbox'), + (61,'task_reminder_control','false','task_reminder','checkbox'), + (62,'task_reminder_days_before','1','task_reminder','text'), + (63,'task_reminder_repeat','100','task_reminder','text'), + (64,'gacl_cache','false','gacl','checkbox'), + (65,'gacl_expire','true','gacl','checkbox'), + (66,'gacl_cache_dir','/tmp','gacl','text'), + (67,'gacl_timeout','600','gacl','text'), + (68,'mail_smtp_tls','false','mail','checkbox'), + (69,'ldap_search_user','Manager','ldap','text'), + (70,'ldap_search_pass','secret','ldap','password'), + (71,'ldap_allow_login','true','ldap','checkbox'), + (72,'user_contact_inactivate','true','auth','checkbox'), + (73,'user_contact_activate','false','auth','checkbox'), + (74,'task_reminder_batch','false','task_reminder','checkbox'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_config_list` WRITE; +TRUNCATE `dotp_config_list`; +INSERT INTO `dotp_config_list` (`config_list_id`, `config_id`, `config_list_name`) VALUES + (1,44,'sql'), + (2,44,'ldap'), + (3,44,'pn'), + (4,34,'app'), + (5,34,'php'), + (6,52,'php'), + (7,52,'smtp'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_contacts` WRITE; +TRUNCATE `dotp_contacts`; +INSERT INTO `dotp_contacts` (`contact_id`, `contact_first_name`, `contact_last_name`, `contact_order_by`, `contact_title`, `contact_birthday`, `contact_job`, `contact_company`, `contact_department`, `contact_type`, `contact_email`, `contact_email2`, `contact_url`, `contact_phone`, `contact_phone2`, `contact_fax`, `contact_mobile`, `contact_address1`, `contact_address2`, `contact_city`, `contact_state`, `contact_zip`, `contact_country`, `contact_jabber`, `contact_icq`, `contact_msn`, `contact_yahoo`, `contact_aol`, `contact_notes`, `contact_project`, `contact_icon`, `contact_owner`, `contact_private`) VALUES + (1,'Admin','Person','',NULL,NULL,NULL,'',NULL,NULL,'admin@example.com',NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,'obj/contact',0,0); +UNLOCK TABLES; + + +LOCK TABLES `dotp_custom_fields_lists` WRITE; +TRUNCATE `dotp_custom_fields_lists`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_custom_fields_struct` WRITE; +TRUNCATE `dotp_custom_fields_struct`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_custom_fields_values` WRITE; +TRUNCATE `dotp_custom_fields_values`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_departments` WRITE; +TRUNCATE `dotp_departments`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_dotpermissions` WRITE; +TRUNCATE `dotp_dotpermissions`; +INSERT INTO `dotp_dotpermissions` (`acl_id`, `user_id`, `section`, `axo`, `permission`, `allow`, `priority`, `enabled`) VALUES + (12,'1','sys','acl','access',1,3,1), + (11,'1','app','admin','access',1,4,1), + (11,'1','app','calendar','access',1,4,1), + (11,'1','app','events','access',1,4,1), + (11,'1','app','companies','access',1,4,1), + (11,'1','app','contacts','access',1,4,1), + (11,'1','app','departments','access',1,4,1), + (11,'1','app','files','access',1,4,1), + (11,'1','app','file_folders','access',1,4,1), + (11,'1','app','forums','access',1,4,1), + (11,'1','app','help','access',1,4,1), + (11,'1','app','projects','access',1,4,1), + (11,'1','app','system','access',1,4,1), + (11,'1','app','tasks','access',1,4,1), + (11,'1','app','task_log','access',1,4,1), + (11,'1','app','ticketsmith','access',1,4,1), + (11,'1','app','public','access',1,4,1), + (11,'1','app','roles','access',1,4,1), + (11,'1','app','users','access',1,4,1), + (11,'1','app','admin','add',1,4,1), + (11,'1','app','calendar','add',1,4,1), + (11,'1','app','events','add',1,4,1), + (11,'1','app','companies','add',1,4,1), + (11,'1','app','contacts','add',1,4,1), + (11,'1','app','departments','add',1,4,1), + (11,'1','app','files','add',1,4,1), + (11,'1','app','file_folders','add',1,4,1), + (11,'1','app','forums','add',1,4,1), + (11,'1','app','help','add',1,4,1), + (11,'1','app','projects','add',1,4,1), + (11,'1','app','system','add',1,4,1), + (11,'1','app','tasks','add',1,4,1), + (11,'1','app','task_log','add',1,4,1), + (11,'1','app','ticketsmith','add',1,4,1), + (11,'1','app','public','add',1,4,1), + (11,'1','app','roles','add',1,4,1), + (11,'1','app','users','add',1,4,1), + (11,'1','app','admin','delete',1,4,1), + (11,'1','app','calendar','delete',1,4,1), + (11,'1','app','events','delete',1,4,1), + (11,'1','app','companies','delete',1,4,1), + (11,'1','app','contacts','delete',1,4,1), + (11,'1','app','departments','delete',1,4,1), + (11,'1','app','files','delete',1,4,1), + (11,'1','app','file_folders','delete',1,4,1), + (11,'1','app','forums','delete',1,4,1), + (11,'1','app','help','delete',1,4,1), + (11,'1','app','projects','delete',1,4,1), + (11,'1','app','system','delete',1,4,1), + (11,'1','app','tasks','delete',1,4,1), + (11,'1','app','task_log','delete',1,4,1), + (11,'1','app','ticketsmith','delete',1,4,1), + (11,'1','app','public','delete',1,4,1), + (11,'1','app','roles','delete',1,4,1), + (11,'1','app','users','delete',1,4,1), + (11,'1','app','admin','edit',1,4,1), + (11,'1','app','calendar','edit',1,4,1), + (11,'1','app','events','edit',1,4,1), + (11,'1','app','companies','edit',1,4,1), + (11,'1','app','contacts','edit',1,4,1), + (11,'1','app','departments','edit',1,4,1), + (11,'1','app','files','edit',1,4,1), + (11,'1','app','file_folders','edit',1,4,1), + (11,'1','app','forums','edit',1,4,1), + (11,'1','app','help','edit',1,4,1), + (11,'1','app','projects','edit',1,4,1), + (11,'1','app','system','edit',1,4,1), + (11,'1','app','tasks','edit',1,4,1), + (11,'1','app','task_log','edit',1,4,1), + (11,'1','app','ticketsmith','edit',1,4,1), + (11,'1','app','public','edit',1,4,1), + (11,'1','app','roles','edit',1,4,1), + (11,'1','app','users','edit',1,4,1), + (11,'1','app','admin','view',1,4,1), + (11,'1','app','calendar','view',1,4,1), + (11,'1','app','events','view',1,4,1), + (11,'1','app','companies','view',1,4,1), + (11,'1','app','contacts','view',1,4,1), + (11,'1','app','departments','view',1,4,1), + (11,'1','app','files','view',1,4,1), + (11,'1','app','file_folders','view',1,4,1), + (11,'1','app','forums','view',1,4,1), + (11,'1','app','help','view',1,4,1), + (11,'1','app','projects','view',1,4,1), + (11,'1','app','system','view',1,4,1), + (11,'1','app','tasks','view',1,4,1), + (11,'1','app','task_log','view',1,4,1), + (11,'1','app','ticketsmith','view',1,4,1), + (11,'1','app','public','view',1,4,1), + (11,'1','app','roles','view',1,4,1), + (11,'1','app','users','view',1,4,1); +UNLOCK TABLES; + + +LOCK TABLES `dotp_dpversion` WRITE; +TRUNCATE `dotp_dpversion`; +INSERT INTO `dotp_dpversion` (`code_version`, `db_version`, `last_db_update`, `last_code_update`) VALUES + ('2.2.0',2,'0000-00-00','0000-00-00'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_event_queue` WRITE; +TRUNCATE `dotp_event_queue`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_events` WRITE; +TRUNCATE `dotp_events`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_file_folders` WRITE; +TRUNCATE `dotp_file_folders`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_files` WRITE; +TRUNCATE `dotp_files`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_files_index` WRITE; +TRUNCATE `dotp_files_index`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_forum_messages` WRITE; +TRUNCATE `dotp_forum_messages`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_forum_visits` WRITE; +TRUNCATE `dotp_forum_visits`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_forum_watch` WRITE; +TRUNCATE `dotp_forum_watch`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_forums` WRITE; +TRUNCATE `dotp_forums`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_acl` WRITE; +TRUNCATE `dotp_gacl_acl`; +INSERT INTO `dotp_gacl_acl` (`id`, `section_value`, `allow`, `enabled`, `return_value`, `note`, `updated_date`) VALUES + (10,'user',1,1,NULL,NULL,1655580426), + (11,'user',1,1,NULL,NULL,1655580426), + (12,'user',1,1,NULL,NULL,1655580426), + (13,'user',1,1,NULL,NULL,1655580426), + (14,'user',1,1,NULL,NULL,1655580426), + (15,'user',1,1,NULL,NULL,1655580426), + (16,'user',1,1,NULL,NULL,1655580426); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_acl_sections` WRITE; +TRUNCATE `dotp_gacl_acl_sections`; +INSERT INTO `dotp_gacl_acl_sections` (`id`, `value`, `order_value`, `name`, `hidden`) VALUES + (1,'system',1,'System',0), + (2,'user',2,'User',0); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_acl_seq` WRITE; +TRUNCATE `dotp_gacl_acl_seq`; +INSERT INTO `dotp_gacl_acl_seq` (`id`) VALUES + (16); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aco` WRITE; +TRUNCATE `dotp_gacl_aco`; +INSERT INTO `dotp_gacl_aco` (`id`, `section_value`, `value`, `order_value`, `name`, `hidden`) VALUES + (10,'system','login',1,'Login',0), + (11,'application','access',1,'Access',0), + (12,'application','view',2,'View',0), + (13,'application','add',3,'Add',0), + (14,'application','edit',4,'Edit',0), + (15,'application','delete',5,'Delete',0); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aco_map` WRITE; +TRUNCATE `dotp_gacl_aco_map`; +INSERT INTO `dotp_gacl_aco_map` (`acl_id`, `section_value`, `value`) VALUES + (10,'system','login'), + (11,'application','access'), + (11,'application','add'), + (11,'application','delete'), + (11,'application','edit'), + (11,'application','view'), + (12,'application','access'), + (13,'application','access'), + (13,'application','view'), + (14,'application','access'), + (15,'application','access'), + (15,'application','add'), + (15,'application','delete'), + (15,'application','edit'), + (15,'application','view'), + (16,'application','access'), + (16,'application','view'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aco_sections` WRITE; +TRUNCATE `dotp_gacl_aco_sections`; +INSERT INTO `dotp_gacl_aco_sections` (`id`, `value`, `order_value`, `name`, `hidden`) VALUES + (10,'system',1,'System',0), + (11,'application',2,'Application',0); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aco_sections_seq` WRITE; +TRUNCATE `dotp_gacl_aco_sections_seq`; +INSERT INTO `dotp_gacl_aco_sections_seq` (`id`) VALUES + (11); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aco_seq` WRITE; +TRUNCATE `dotp_gacl_aco_seq`; +INSERT INTO `dotp_gacl_aco_seq` (`id`) VALUES + (15); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aro` WRITE; +TRUNCATE `dotp_gacl_aro`; +INSERT INTO `dotp_gacl_aro` (`id`, `section_value`, `value`, `order_value`, `name`, `hidden`) VALUES + (10,'user','1',1,'admin',0); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aro_groups` WRITE; +TRUNCATE `dotp_gacl_aro_groups`; +INSERT INTO `dotp_gacl_aro_groups` (`id`, `parent_id`, `lft`, `rgt`, `name`, `value`) VALUES + (10,0,1,10,'Roles','role'), + (11,10,2,3,'Administrator','admin'), + (12,10,4,5,'Anonymous','anon'), + (13,10,6,7,'Guest','guest'), + (14,10,8,9,'Project worker','normal'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aro_groups_id_seq` WRITE; +TRUNCATE `dotp_gacl_aro_groups_id_seq`; +INSERT INTO `dotp_gacl_aro_groups_id_seq` (`id`) VALUES + (14); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aro_groups_map` WRITE; +TRUNCATE `dotp_gacl_aro_groups_map`; +INSERT INTO `dotp_gacl_aro_groups_map` (`acl_id`, `group_id`) VALUES + (10,10), + (11,11), + (12,11), + (13,13), + (14,12), + (15,14), + (16,13), + (16,14); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aro_map` WRITE; +TRUNCATE `dotp_gacl_aro_map`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aro_sections` WRITE; +TRUNCATE `dotp_gacl_aro_sections`; +INSERT INTO `dotp_gacl_aro_sections` (`id`, `value`, `order_value`, `name`, `hidden`) VALUES + (10,'user',1,'Users',0); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aro_sections_seq` WRITE; +TRUNCATE `dotp_gacl_aro_sections_seq`; +INSERT INTO `dotp_gacl_aro_sections_seq` (`id`) VALUES + (10); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_aro_seq` WRITE; +TRUNCATE `dotp_gacl_aro_seq`; +INSERT INTO `dotp_gacl_aro_seq` (`id`) VALUES + (10); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_axo` WRITE; +TRUNCATE `dotp_gacl_axo`; +INSERT INTO `dotp_gacl_axo` (`id`, `section_value`, `value`, `order_value`, `name`, `hidden`) VALUES + (10,'sys','acl',1,'ACL Administration',0), + (11,'app','admin',1,'User Administration',0), + (12,'app','calendar',2,'Calendar',0), + (13,'app','events',2,'Events',0), + (14,'app','companies',3,'Companies',0), + (15,'app','contacts',4,'Contacts',0), + (16,'app','departments',5,'Departments',0), + (17,'app','files',6,'Files',0), + (18,'app','file_folders',6,'File Folders',0), + (19,'app','forums',7,'Forums',0), + (20,'app','help',8,'Help',0), + (21,'app','projects',9,'Projects',0), + (22,'app','system',10,'System Administration',0), + (23,'app','tasks',11,'Tasks',0), + (24,'app','task_log',11,'Task Logs',0), + (25,'app','ticketsmith',12,'Tickets',0), + (26,'app','public',13,'Public',0), + (27,'app','roles',14,'Roles Administration',0), + (28,'app','users',15,'User Table',0); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_axo_groups` WRITE; +TRUNCATE `dotp_gacl_axo_groups`; +INSERT INTO `dotp_gacl_axo_groups` (`id`, `parent_id`, `lft`, `rgt`, `name`, `value`) VALUES + (10,0,1,8,'Modules','mod'), + (11,10,2,3,'All Modules','all'), + (12,10,4,5,'Admin Modules','admin'), + (13,10,6,7,'Non-Admin Modules','non_admin'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_axo_groups_id_seq` WRITE; +TRUNCATE `dotp_gacl_axo_groups_id_seq`; +INSERT INTO `dotp_gacl_axo_groups_id_seq` (`id`) VALUES + (13); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_axo_groups_map` WRITE; +TRUNCATE `dotp_gacl_axo_groups_map`; +INSERT INTO `dotp_gacl_axo_groups_map` (`acl_id`, `group_id`) VALUES + (11,11), + (13,13), + (14,13), + (15,13); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_axo_map` WRITE; +TRUNCATE `dotp_gacl_axo_map`; +INSERT INTO `dotp_gacl_axo_map` (`acl_id`, `section_value`, `value`) VALUES + (12,'sys','acl'), + (16,'app','users'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_axo_sections` WRITE; +TRUNCATE `dotp_gacl_axo_sections`; +INSERT INTO `dotp_gacl_axo_sections` (`id`, `value`, `order_value`, `name`, `hidden`) VALUES + (10,'sys',1,'System',0), + (11,'app',2,'Application',0); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_axo_sections_seq` WRITE; +TRUNCATE `dotp_gacl_axo_sections_seq`; +INSERT INTO `dotp_gacl_axo_sections_seq` (`id`) VALUES + (11); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_axo_seq` WRITE; +TRUNCATE `dotp_gacl_axo_seq`; +INSERT INTO `dotp_gacl_axo_seq` (`id`) VALUES + (28); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_groups_aro_map` WRITE; +TRUNCATE `dotp_gacl_groups_aro_map`; +INSERT INTO `dotp_gacl_groups_aro_map` (`group_id`, `aro_id`) VALUES + (11,10); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_groups_axo_map` WRITE; +TRUNCATE `dotp_gacl_groups_axo_map`; +INSERT INTO `dotp_gacl_groups_axo_map` (`group_id`, `axo_id`) VALUES + (11,11), + (11,12), + (11,13), + (11,14), + (11,15), + (11,16), + (11,17), + (11,18), + (11,19), + (11,20), + (11,21), + (11,22), + (11,23), + (11,24), + (11,25), + (11,26), + (11,27), + (11,28), + (12,11), + (12,22), + (12,27), + (12,28), + (13,12), + (13,13), + (13,14), + (13,15), + (13,16), + (13,17), + (13,18), + (13,19), + (13,20), + (13,21), + (13,23), + (13,24), + (13,25), + (13,26); +UNLOCK TABLES; + + +LOCK TABLES `dotp_gacl_phpgacl` WRITE; +TRUNCATE `dotp_gacl_phpgacl`; +INSERT INTO `dotp_gacl_phpgacl` (`name`, `value`) VALUES + ('schema_version','2.1'), + ('version','3.3.2'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_modules` WRITE; +TRUNCATE `dotp_modules`; +INSERT INTO `dotp_modules` (`mod_id`, `mod_name`, `mod_directory`, `mod_version`, `mod_setup_class`, `mod_type`, `mod_active`, `mod_ui_name`, `mod_ui_icon`, `mod_ui_order`, `mod_ui_active`, `mod_description`, `permissions_item_table`, `permissions_item_field`, `permissions_item_label`) VALUES + (1,'Companies','companies','1.0.0','','core',1,'Companies','handshake.png',1,1,'','companies','company_id','company_name'), + (2,'Projects','projects','1.0.0','','core',1,'Projects','applet3-48.png',2,1,'','projects','project_id','project_name'), + (3,'Tasks','tasks','1.0.0','','core',1,'Tasks','applet-48.png',3,1,'','tasks','task_id','task_name'), + (4,'Calendar','calendar','1.0.0','','core',1,'Calendar','myevo-appointments.png',4,1,'','events','event_id','event_title'), + (5,'Files','files','1.0.0','','core',1,'Files','folder5.png',5,1,'','files','file_id','file_name'), + (6,'Contacts','contacts','1.0.0','','core',1,'Contacts','monkeychat-48.png',6,1,'','contacts','contact_id','contact_title'), + (7,'Forums','forums','1.0.0','','core',1,'Forums','support.png',7,1,'','forums','forum_id','forum_name'), + (8,'Tickets','ticketsmith','1.0.0','','core',1,'Tickets','ticketsmith.gif',8,1,'','','',''), + (9,'User Administration','admin','1.0.0','','core',1,'User Admin','helix-setup-users.png',9,1,'','users','user_id','user_username'), + (10,'System Administration','system','1.0.0','','core',1,'System Admin','48_my_computer.png',10,1,'','','',''), + (11,'Departments','departments','1.0.0','','core',1,'Departments','users.gif',11,0,'','departments','dept_id','dept_name'), + (12,'Help','help','1.0.0','','core',1,'Help','dp.gif',12,0,'','','',''), + (13,'Public','public','1.0.0','','core',1,'Public','users.gif',13,0,'','','',''); +UNLOCK TABLES; + + +LOCK TABLES `dotp_permissions` WRITE; +TRUNCATE `dotp_permissions`; +INSERT INTO `dotp_permissions` (`permission_id`, `permission_user`, `permission_grant_on`, `permission_item`, `permission_value`) VALUES + (1,1,'all',-1,-1); +UNLOCK TABLES; + + +LOCK TABLES `dotp_project_contacts` WRITE; +TRUNCATE `dotp_project_contacts`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_project_departments` WRITE; +TRUNCATE `dotp_project_departments`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_projects` WRITE; +TRUNCATE `dotp_projects`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_roles` WRITE; +TRUNCATE `dotp_roles`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_sessions` WRITE; +TRUNCATE `dotp_sessions`; +INSERT INTO `dotp_sessions` (`session_id`, `session_user`, `session_data`, `session_updated`, `session_created`) VALUES + ('cih5n7i819velrl9k160db35ng',1,x'4C414E4755414745537C613A353A7B733A353A22656E5F4155223B613A343A7B693A303B733A323A22656E223B693A313B733A31333A22456E676C697368202841757329223B693A323B733A31333A22456E676C697368202841757329223B693A333B733A333A22656E61223B7D733A353A22656E5F4341223B613A343A7B693A303B733A323A22656E223B693A313B733A31333A22456E676C697368202843616E29223B693A323B733A31333A22456E676C697368202843616E29223B693A333B733A333A22656E63223B7D733A353A22656E5F4742223B613A343A7B693A303B733A323A22656E223B693A313B733A31323A22456E676C6973682028474229223B693A323B733A31323A22456E676C6973682028474229223B693A333B733A333A22656E67223B7D733A353A22656E5F4E5A223B613A343A7B693A303B733A323A22656E223B693A313B733A31323A22456E676C69736820284E5A29223B693A323B733A31323A22456E676C69736820284E5A29223B693A333B733A333A22656E7A223B7D733A353A22656E5F5553223B613A353A7B693A303B733A323A22656E223B693A313B733A31323A22456E676C6973682028555329223B693A323B733A31323A22456E676C6973682028555329223B693A333B733A333A22656E75223B693A343B733A31303A2249534F383835392D3135223B7D7D41707055497C4F3A363A22434170705549223A32373A7B733A353A227374617465223B613A32303A7B733A31333A2243616C496478436F6D70616E79223B733A303A22223B733A31323A2243616C49647846696C746572223B733A323A226D79223B733A31333A2243616C44617956696577546162223B733A313A2231223B733A31343A225461736B44617953686F77417263223B693A303B733A31343A225461736B44617953686F774C6F77223B693A313B733A31353A225461736B44617953686F77486F6C64223B693A303B733A31343A225461736B44617953686F7744796E223B693A303B733A31343A225461736B44617953686F7750696E223B693A303B733A32303A225461736B44617953686F77456D70747944617465223B693A303B733A31323A225341564544504C4143452D31223B733A373A226D3D61646D696E223B733A31303A225341564544504C414345223B733A383A226D3D73797374656D223B733A31343A2250726F6A496478436F6D70616E79223B733A303A22223B733A31353A2250726F6A4964784F72646572446972223B733A333A22617363223B733A31353A226F776E65725F66696C7465725F6964223B733A313A2231223B733A373A22757365725F6964223B733A313A2231223B733A32323A225461736B4C69737453686F77496E636F6D706C657465223B693A303B733A31323A227461736B735F6F70656E6564223B613A303A7B7D733A31303A2246696C65496478546162223B693A303B733A31343A2246696C6549647850726F6A656374223B693A303B733A31323A22436F6E744964785768657265223B733A303A22223B7D733A373A22757365725F6964223B733A313A2231223B733A31353A22757365725F66697273745F6E616D65223B733A353A2241646D696E223B733A31343A22757365725F6C6173745F6E616D65223B733A363A22506572736F6E223B733A31323A22757365725F636F6D70616E79223B733A303A22223B733A31353A22757365725F6465706172746D656E74223B693A303B733A31303A22757365725F656D61696C223B733A31373A2261646D696E406578616D706C652E636F6D223B733A393A22757365725F74797065223B733A313A2231223B733A31303A22757365725F7072656673223B613A383A7B733A363A224C4F43414C45223B733A323A22656E223B733A373A2254414256494557223B733A313A2230223B733A31323A22534844415445464F524D4154223B733A383A2225642F256D2F2559223B733A31303A2254494D45464F524D4154223B733A383A2225493A254D202570223B733A373A2255495354594C45223B733A373A2264656661756C74223B733A31333A225441534B41535349474E4D4158223B733A333A22313030223B733A31303A2255534552464F524D4154223B733A343A2275736572223B733A31303A2255534544494745535453223B733A313A2230223B7D733A31323A226461795F73656C6563746564223B4E3B733A31323A2273797374656D5F7072656673223B613A383A7B733A363A224C4F43414C45223B733A323A22656E223B733A373A2254414256494557223B733A313A2230223B733A31323A22534844415445464F524D4154223B733A383A2225642F256D2F2559223B733A31303A2254494D45464F524D4154223B733A383A2225493A254D202570223B733A373A2255495354594C45223B733A373A2264656661756C74223B733A31333A225441534B41535349474E4D4158223B733A333A22313030223B733A31303A2255534552464F524D4154223B733A343A2275736572223B733A31303A2255534544494745535453223B733A313A2230223B7D733A31313A22757365725F6C6F63616C65223B733A323A22656E223B733A393A22757365725F6C616E67223B613A343A7B693A303B733A31313A22656E5F41552E7574662D38223B693A313B733A333A22656E61223B693A323B733A353A22656E5F4155223B693A333B733A323A22656E223B7D733A31313A22626173655F6C6F63616C65223B733A323A22656E223B733A31363A22626173655F646174655F6C6F63616C65223B4E3B733A333A226D7367223B733A303A22223B733A353A226D73674E6F223B693A303B733A31353A2264656661756C745265646972656374223B733A303A22223B733A333A22636667223B613A313A7B733A31313A226C6F63616C655F7761726E223B623A303B7D733A31333A2276657273696F6E5F6D616A6F72223B693A323B733A31333A2276657273696F6E5F6D696E6F72223B693A323B733A31333A2276657273696F6E5F7061746368223B693A303B733A31343A2276657273696F6E5F737472696E67223B733A353A22322E322E30223B733A31343A226C6173745F696E736572745F6964223B693A313B733A333A225F6A73223B613A303A7B7D733A343A225F637373223B613A303A7B7D733A31303A2270726F6A6563745F6964223B693A303B7D616C6C5F746162737C613A31303A7B733A383A2263616C656E646172223B613A313A7B693A303B613A333A7B733A343A226E616D65223B733A383A2250726F6A65637473223B733A343A2266696C65223B733A38333A222F55736572732F6A6566667068696C6170792F73697465732F616C7461686F73742F646F7470726F6A6563742F6D6F64756C65732F70726F6A656374732F63616C656E6461725F7461622E70726F6A65637473223B733A363A226D6F64756C65223B733A383A2270726F6A65637473223B7D7D733A383A2270726F6A65637473223B613A323A7B693A303B613A333A7B733A343A226E616D65223B733A363A224576656E7473223B733A343A2266696C65223B733A38313A222F55736572732F6A6566667068696C6170792F73697465732F616C7461686F73742F646F7470726F6A6563742F6D6F64756C65732F63616C656E6461722F70726F6A656374735F7461622E6576656E7473223B733A363A226D6F64756C65223B733A383A2263616C656E646172223B7D693A313B613A333A7B733A343A226E616D65223B733A353A2246696C6573223B733A343A2266696C65223B733A37373A222F55736572732F6A6566667068696C6170792F73697465732F616C7461686F73742F646F7470726F6A6563742F6D6F64756C65732F66696C65732F70726F6A656374735F7461622E66696C6573223B733A363A226D6F64756C65223B733A353A2266696C6573223B7D7D733A393A22636F6D70616E696573223B613A323A7B693A303B613A333A7B733A343A226E616D65223B733A353A2246696C6573223B733A343A2266696C65223B733A37383A222F55736572732F6A6566667068696C6170792F73697465732F616C7461686F73742F646F7470726F6A6563742F6D6F64756C65732F66696C65732F636F6D70616E6965735F7461622E66696C6573223B733A363A226D6F64756C65223B733A353A2266696C6573223B7D733A343A2276696577223B613A313A7B693A303B613A333A7B733A343A226E616D65223B733A31343A2250726F6A656374732067616E7474223B733A343A2266696C65223B733A39353A222F55736572732F6A6566667068696C6170792F73697465732F616C7461686F73742F646F7470726F6A6563742F6D6F64756C65732F70726F6A656374732F636F6D70616E6965735F7461622E766965772E70726F6A656374735F67616E7474223B733A363A226D6F64756C65223B733A383A2270726F6A65637473223B7D7D7D733A353A227461736B73223B613A323A7B733A343A2276696577223B613A313A7B693A303B613A333A7B733A343A226E616D65223B733A353A2246696C6573223B733A343A2266696C65223B733A37393A222F55736572732F6A6566667068696C6170792F73697465732F616C7461686F73742F646F7470726F6A6563742F6D6F64756C65732F66696C65732F7461736B735F7461622E766965772E66696C6573223B733A363A226D6F64756C65223B733A353A2266696C6573223B7D7D693A303B613A333A7B733A343A226E616D65223B733A353A2246696C6573223B733A343A2266696C65223B733A37343A222F55736572732F6A6566667068696C6170792F73697465732F616C7461686F73742F646F7470726F6A6563742F6D6F64756C65732F66696C65732F7461736B735F7461622E66696C6573223B733A363A226D6F64756C65223B733A353A2266696C6573223B7D7D733A353A2266696C6573223B613A303A7B7D733A383A22636F6E7461637473223B613A303A7B7D733A363A22666F72756D73223B613A303A7B7D733A31313A227469636B6574736D697468223B613A303A7B7D733A353A2261646D696E223B613A313A7B733A383A227669657775736572223B613A323A7B693A303B613A333A7B733A343A226E616D65223B733A383A2250726F6A65637473223B733A343A2266696C65223B733A38393A222F55736572732F6A6566667068696C6170792F73697465732F616C7461686F73742F646F7470726F6A6563742F6D6F64756C65732F70726F6A656374732F61646D696E5F7461622E76696577757365722E70726F6A65637473223B733A363A226D6F64756C65223B733A383A2270726F6A65637473223B7D693A313B613A333A7B733A343A226E616D65223B733A31343A2250726F6A656374732067616E7474223B733A343A2266696C65223B733A39353A222F55736572732F6A6566667068696C6170792F73697465732F616C7461686F73742F646F7470726F6A6563742F6D6F64756C65732F70726F6A656374732F61646D696E5F7461622E76696577757365722E70726F6A656374735F67616E7474223B733A363A226D6F64756C65223B733A383A2270726F6A65637473223B7D7D7D733A363A2273797374656D223B613A303A7B7D7D','2022-06-18 19:28:07','2022-06-18 19:27:49'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_syskeys` WRITE; +TRUNCATE `dotp_syskeys`; +INSERT INTO `dotp_syskeys` (`syskey_id`, `syskey_name`, `syskey_label`, `syskey_type`, `syskey_sep1`, `syskey_sep2`) VALUES + (1,'SelectList','Enter values for list',0,'\n','|'), + (2,'CustomField','Serialized array in the following format:\r\n|\r\n\r\nSerialized Array:\r\n[type] => text | checkbox | select | textarea | label\r\n[name] => \r\n[options] => \r\n[selects] => ',0,'\n','|'), + (3,'ColorSelection','Hex color values for type=>color association.',0,'\n','|'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_sysvals` WRITE; +TRUNCATE `dotp_sysvals`; +INSERT INTO `dotp_sysvals` (`sysval_id`, `sysval_key_id`, `sysval_title`, `sysval_value`) VALUES + (1,1,'ProjectStatus','0|Not Defined\r\n1|Proposed\r\n2|In Planning\r\n3|In Progress\r\n4|On Hold\r\n5|Complete\r\n6|Template\r\n7|Archived'), + (2,1,'CompanyType','0|Not Applicable\n1|Client\n2|Vendor\n3|Supplier\n4|Consultant\n5|Government\n6|Internal'), + (3,1,'TaskDurationType','1|hours\n24|days'), + (4,1,'EventType','0|General\n1|Appointment\n2|Meeting\n3|All Day Event\n4|Anniversary\n5|Reminder'), + (5,1,'TaskStatus','0|Active\n-1|Inactive'), + (6,1,'TaskType','0|Unknown\n1|Administrative\n2|Operative'), + (7,1,'ProjectType','0|Unknown\n1|Administrative\n2|Operative'), + (8,3,'ProjectColors','Web|FFE0AE\nEngineering|AEFFB2\nHelpDesk|FFFCAE\nSystem Administration|FFAEAE'), + (9,1,'FileType','0|Unknown\n1|Document\n2|Application'), + (10,1,'TaskPriority','-1|low\n0|normal\n1|high'), + (11,1,'ProjectPriority','-1|low\n0|normal\n1|high'), + (12,1,'ProjectPriorityColor','-1|#E5F7FF\n0|\n1|#FFDCB3'), + (13,1,'TaskLogReference','0|Not Defined\n1|Email\n2|Helpdesk\n3|Phone Call\n4|Fax'), + (14,1,'TaskLogReferenceImage','0| 1|./images/obj/email.gif 2|./modules/helpdesk/images/helpdesk.png 3|./images/obj/phone.gif 4|./images/icons/stock_print-16.png'), + (15,1,'UserType','0|Default User\r\n1|Administrator\r\n2|CEO\r\n3|Director\r\n4|Branch Manager\r\n5|Manager\r\n6|Supervisor\r\n7|Employee'), + (16,1,'ProjectRequiredFields','f.project_name.value.length|<3\r\nf.project_color_identifier.value.length|<3\r\nf.project_company.options[f.project_company.selectedIndex].value|<1'), + (17,2,'TicketNotify','0|admin@example.com\n1|admin@example.com\n2|admin@example.com\r\n3|admin@example.com\r\n4|admin@example.com'), + (18,1,'TicketPriority','0|Low\n1|Normal\n2|High\n3|Highest\n4|911'), + (19,1,'TicketStatus','0|Open\n1|Closed\n2|Deleted'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_task_contacts` WRITE; +TRUNCATE `dotp_task_contacts`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_task_departments` WRITE; +TRUNCATE `dotp_task_departments`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_task_dependencies` WRITE; +TRUNCATE `dotp_task_dependencies`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_task_log` WRITE; +TRUNCATE `dotp_task_log`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_tasks` WRITE; +TRUNCATE `dotp_tasks`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_tickets` WRITE; +TRUNCATE `dotp_tickets`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_user_access_log` WRITE; +TRUNCATE `dotp_user_access_log`; +INSERT INTO `dotp_user_access_log` (`user_access_log_id`, `user_id`, `user_ip`, `date_time_in`, `date_time_out`, `date_time_last_action`) VALUES + (1,1,'127.0.0.1','2022-06-18 14:27:49','0000-00-00 00:00:00','2022-06-18 19:28:07'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_user_events` WRITE; +TRUNCATE `dotp_user_events`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_user_preferences` WRITE; +TRUNCATE `dotp_user_preferences`; +INSERT INTO `dotp_user_preferences` (`pref_user`, `pref_name`, `pref_value`) VALUES + ('0','LOCALE','en'), + ('0','TABVIEW','0'), + ('0','SHDATEFORMAT','%d/%m/%Y'), + ('0','TIMEFORMAT','%I:%M %p'), + ('0','UISTYLE','default'), + ('0','TASKASSIGNMAX','100'), + ('0','USERFORMAT','user'), + ('0','USEDIGESTS','0'); +UNLOCK TABLES; + + +LOCK TABLES `dotp_user_roles` WRITE; +TRUNCATE `dotp_user_roles`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_user_task_pin` WRITE; +TRUNCATE `dotp_user_task_pin`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_user_tasks` WRITE; +TRUNCATE `dotp_user_tasks`; +UNLOCK TABLES; + + +LOCK TABLES `dotp_users` WRITE; +TRUNCATE `dotp_users`; +INSERT INTO `dotp_users` (`user_id`, `user_contact`, `user_username`, `user_password`, `user_parent`, `user_type`, `user_company`, `user_department`, `user_owner`, `user_signature`) VALUES + (1,1,'admin','76a2173be6393254e72ffa4d6df1030a',0,1,0,0,0,''); +UNLOCK TABLES; + + + + + + +SET FOREIGN_KEY_CHECKS = @ORIG_FOREIGN_KEY_CHECKS; + +SET UNIQUE_CHECKS = @ORIG_UNIQUE_CHECKS; + +SET @ORIG_TIME_ZONE = @@TIME_ZONE; +SET TIME_ZONE = @ORIG_TIME_ZONE; + +SET SQL_MODE = @ORIG_SQL_MODE; + + + +# Export Finished: June 18, 2022 at 2:29:14 PM CDT + diff --git a/tests/_data/test_dump.sql b/tests/_data/test_dump.sql new file mode 100644 index 000000000..0adce5047 --- /dev/null +++ b/tests/_data/test_dump.sql @@ -0,0 +1,11 @@ +DROP TABLE dotp_billingcode_mytest; + +CREATE TABLE `dotp_billingcode_mytest` ( + `billingcode_id` bigint(20) NOT NULL AUTO_INCREMENT, + `billingcode_name` varchar(25) NOT NULL DEFAULT '', + `billingcode_value` float NOT NULL DEFAULT '0', + `billingcode_desc` varchar(255) NOT NULL DEFAULT '', + `billingcode_status` int(1) NOT NULL DEFAULT '0', + `company_id` bigint(20) NOT NULL DEFAULT '0', + PRIMARY KEY (`billingcode_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/tests/_output/.gitignore b/tests/_output/.gitignore new file mode 100644 index 000000000..c96a04f00 --- /dev/null +++ b/tests/_output/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore \ No newline at end of file diff --git a/tests/_support/AcceptanceTester.php b/tests/_support/AcceptanceTester.php new file mode 100644 index 000000000..546e6a777 --- /dev/null +++ b/tests/_support/AcceptanceTester.php @@ -0,0 +1,33 @@ +amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', $I->grabFromConfig('password')); + $I->click(['class' => 'button']); + } + + // tests + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfCalendarPageLoads(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=calendar'); + $I->see('calendar');// if text not found, test fails + } + + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfCalendarPageHasNoErrors(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=calendar'); + $I->dontSee('ERROR: ');// if text found, test fails + } +} diff --git a/tests/acceptance/CompaniesModuleCest.php b/tests/acceptance/CompaniesModuleCest.php new file mode 100644 index 000000000..9ec09ee1c --- /dev/null +++ b/tests/acceptance/CompaniesModuleCest.php @@ -0,0 +1,112 @@ +amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', $I->grabFromConfig('password')); + $I->click(['class' => 'button']); + + $this->faker = $I->getFaker(); + $this->company_name = $this->faker->company(); + $this->company_name2 = $this->faker->company(); + $this->company_phone1 = '7777777777'; + } + + // tests + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfCompaniesPageLoads(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=companies'); + $I->see('Companies');// if text not found, test fails + } + + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfCompaniesPageHasNoErrors(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=companies'); + $I->dontSee('ERROR: ');// if text not found, test passes + } + + /** + * @depends SigninCest:canLoginIn + */ + public function canAddNewCompany(AcceptanceTester $I) + { + + $I->amOnPage('/index.php?m=companies'); + $I->click(['class' => 'button']); + $I->see('Add Company'); + + $description = $this->faker->sentence(20); + + + $I->fillField('company_name', $this->company_name); + $I->fillField('company_email', 'nothing@nowhere.com'); + $I->fillField('company_phone1', $this->company_phone1); + $I->fillField('company_phone2', '2222222222'); + $I->fillField('company_fax', '0000000000'); + $I->fillField('company_address1', '1120 S. Westway st.'); + $I->fillField('company_address2', 'nothing really'); + $I->fillField('company_city', 'Jacksonville'); + $I->fillField('company_state', 'Florida'); + $I->fillField('company_zip', '49302'); + $I->fillField('company_primary_url', 'http://wheretheheckami.com'); + + $I->selectOption('company_owner','Person, Admin'); + $I->selectOption('company_type','Internal'); + + $I->fillField('company_description', $description); + + $I->click('submit'); //TODO: uncomment this if you want this test to save to the database + + $I->seeInDatabase('dotp_companies', ['company_name' => $this->company_name]); + $I->seeInDatabase('dotp_companies', ['company_description' => $description]); + + $I->amOnPage('/index.php?m=companies'); + + $I->see($this->company_name); + } + + /** + * @depends SigninCest:canLoginIn + */ + public function canUpdateCompany(AcceptanceTester $I) { + + $I->updateInDatabase('dotp_companies', ['company_name' => $this->company_name2]); + + // can see change in the database + $I->seeInDatabase('dotp_companies', ['company_name' => $this->company_name2]); + + // can see the change on the page + $I->amOnPage('/index.php?m=companies'); + $I->see($this->company_name2); + } + + /** + * @depends SigninCest:canLoginIn + */ + public function canDeleteCompany(AcceptanceTester $I) + { + $company_id = $I->grabFromDatabase('dotp_companies', 'company_id', ['company_phone1' => $this->company_phone1]); + + $I->amOnPage('http://dotproject.test/index.php?m=companies&a=view&company_id='.$company_id); + $I->see('Admin Person'); +// $I->see($this->company_name2); + // TODO: must see company + // TODO: must delete company + // TODO: must not see company + } +} diff --git a/tests/acceptance/ContactsModuleCest.php b/tests/acceptance/ContactsModuleCest.php new file mode 100644 index 000000000..a51123a03 --- /dev/null +++ b/tests/acceptance/ContactsModuleCest.php @@ -0,0 +1,31 @@ +amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', $I->grabFromConfig('password')); + $I->click(['class' => 'button']); + } + + // tests + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfContactsPageLoads(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=contacts'); + $I->see('Contacts');// if text not found, test fails + } + + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfContactsPageHasNoErrors(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=contacts'); + $I->dontSee('ERROR: ');// if text not found, test fails + } +} diff --git a/tests/acceptance/FilesModuleCest.php b/tests/acceptance/FilesModuleCest.php new file mode 100644 index 000000000..101d87c1b --- /dev/null +++ b/tests/acceptance/FilesModuleCest.php @@ -0,0 +1,31 @@ +amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', $I->grabFromConfig('password')); + $I->click(['class' => 'button']); + } + + // tests + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfFilesPageLoads(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=files'); + $I->see('Files');// if text not found, test fails + } + + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfFilesPageHasNoErrors(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=files'); + $I->dontSee('ERROR: ');// if text not found, test fails + } +} diff --git a/tests/acceptance/FirstCest.php b/tests/acceptance/FirstCest.php new file mode 100644 index 000000000..e26e29726 --- /dev/null +++ b/tests/acceptance/FirstCest.php @@ -0,0 +1,13 @@ +amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', $I->grabFromConfig('password')); + $I->click(['class' => 'button']); + } + + // tests + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfForumsPageLoads(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=forums'); + $I->see('Forums');// if text not found, test fails + } + + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfForumsPageHasNoErrors(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=forums'); + $I->dontSee('ERROR: ');// if text not found, test fails + } +} diff --git a/tests/acceptance/PageCest.php b/tests/acceptance/PageCest.php new file mode 100644 index 000000000..2d7f8ebaa --- /dev/null +++ b/tests/acceptance/PageCest.php @@ -0,0 +1,17 @@ +amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', $I->grabFromConfig('password')); + $I->click(['class' => 'button']); + } + + // tests + public function sampleTest(AcceptanceTester $I) + { + } +} diff --git a/tests/acceptance/ProjectModuleCest.php b/tests/acceptance/ProjectModuleCest.php new file mode 100644 index 000000000..a8790a4e8 --- /dev/null +++ b/tests/acceptance/ProjectModuleCest.php @@ -0,0 +1,31 @@ +amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', $I->grabFromConfig('password')); + $I->click(['class' => 'button']); + } + + // tests + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfProjectsPageLoads(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=projects'); + $I->see('Projects');// if text not found, test fails + } + + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfProjectsPageHasNoErrors(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=projects'); + $I->dontSee('ERROR: ');// if text not found, test fails + } +} diff --git a/tests/acceptance/SigninCest.php b/tests/acceptance/SigninCest.php new file mode 100644 index 000000000..aa3e29d12 --- /dev/null +++ b/tests/acceptance/SigninCest.php @@ -0,0 +1,59 @@ +amOnPage('/index.php'); + + $I->see('Username'); + $I->see('Password'); + $I->see('login'); + } + + /** + * @depends SigninCest:canSeeLoginForm + */ + public function canLoginIn(AcceptanceTester $I) + { + // TODO: Add to this test the ability to auto-create a test user + $I->amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', $I->grabFromConfig('password')); + $I->click(['class' => 'button']); +// $I->click('login', 'input[type=submit]'); + $I->see('Day View');// if text not found, test fails + } + + /** + * @depends SigninCest:canLoginIn + */ + public function canSeeErrorIfUserNotInSystem(AcceptanceTester $I) + { + $I->amOnPage('/index.php'); + $I->fillField('username', 'ogooakkkablahblah'); + $I->fillField('password', 'ogooakkkablahblah'); + $I->click(['class' => 'button']); + $I->see('Login Failed');// if text not found, test fails + } + + /** + * @depends SigninCest:canLoginIn + */ + public function shouldntSeeErrorsOnPage(AcceptanceTester $I) + { + // TODO: Add to this test the ability to auto-create a test user + $I->amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', 'pass'); + $I->click(['class' => 'button']); + $I->dontSee('ERROR: '); //if text is found, test fails. + } +} diff --git a/tests/acceptance/SystemAdminModuleCest.php b/tests/acceptance/SystemAdminModuleCest.php new file mode 100644 index 000000000..68a33b0f1 --- /dev/null +++ b/tests/acceptance/SystemAdminModuleCest.php @@ -0,0 +1,30 @@ +amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', $I->grabFromConfig('password')); + $I->click(['class' => 'button']); + } + + // tests + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfSystemAdminPageLoads(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=system'); + $I->see('System Administration');// if text not found, test fails + } + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfSystemAdminPageHasNoErrors(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=system'); + $I->dontSee('ERROR: ');// if text not found, test fails + } +} diff --git a/tests/acceptance/TaskModuleCest.php b/tests/acceptance/TaskModuleCest.php new file mode 100644 index 000000000..99230cbdb --- /dev/null +++ b/tests/acceptance/TaskModuleCest.php @@ -0,0 +1,30 @@ +amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', $I->grabFromConfig('password')); + $I->click(['class' => 'button']); + } + + // tests + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfTaskPageLoads(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=tasks'); + $I->see('Tasks');// if text not found, test fails + } + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfProjectsPageHasNoErrors(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=tasks'); + $I->dontSee('ERROR: ');// if text not found, test fails + } +} diff --git a/tests/acceptance/TicketsModuleCest.php b/tests/acceptance/TicketsModuleCest.php new file mode 100644 index 000000000..14cd39554 --- /dev/null +++ b/tests/acceptance/TicketsModuleCest.php @@ -0,0 +1,30 @@ +amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', $I->grabFromConfig('password')); + $I->click(['class' => 'button']); + } + + // tests + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfTicketsPageLoads(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=ticketsmith'); + $I->see('Trouble Ticket Management');// if text not found, test fails + } + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfTicketsPageHasNoErrors(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=ticketsmith'); + $I->dontSee('ERROR: ');// if text not found, test fails + } +} diff --git a/tests/acceptance/UsersAdminModuleCest.php b/tests/acceptance/UsersAdminModuleCest.php new file mode 100644 index 000000000..05ff304d2 --- /dev/null +++ b/tests/acceptance/UsersAdminModuleCest.php @@ -0,0 +1,30 @@ +amOnPage('/index.php'); + $I->fillField('username', $I->grabFromConfig('username')); + $I->fillField('password', $I->grabFromConfig('password')); + $I->click(['class' => 'button']); + } + + // tests + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfUsersAdminPageLoads(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=admin'); + $I->see('User Management');// if text not found, test fails + } + /** + * @depends SigninCest:canLoginIn + */ + public function seeIfUsersAdminPageHasNoErrors(AcceptanceTester $I) + { + $I->amOnPage('/index.php?m=admin'); + $I->dontSee('ERROR: ');// if text not found, test fails + } +} diff --git a/tests/functional.suite.dist.yml b/tests/functional.suite.dist.yml new file mode 100644 index 000000000..5df51f779 --- /dev/null +++ b/tests/functional.suite.dist.yml @@ -0,0 +1,13 @@ +# Codeception Test Suite Configuration +# +# Suite for functional tests +# Emulate web requests and make application process them +# Include one of framework modules (Symfony2, Yii2, Laravel5, Phalcon4) to use it +# Remove this suite if you don't use frameworks + +actor: FunctionalTester +modules: + enabled: + # add a framework module here + - \Helper\Functional + step_decorators: ~ diff --git a/tests/help.md b/tests/help.md new file mode 100644 index 000000000..738d482df --- /dev/null +++ b/tests/help.md @@ -0,0 +1,45 @@ +# TESTING HELP + +### creating tests + +Acceptance tests: +php vendor/bin/codecept generate:cest acceptance TestName + +Unit tests: +php vendor/bin/codecept generate:test unit TestName + +### running tests + +reset && php vendor/bin/codecept run acceptance +or +reset && php vendor/bin/codecept run acceptance + +reset && php vendor/bin/codecept run unit + +reset && php vendor/bin/codecept run functional + +### Things to try when things are not going right with codecept + +- ./vendor/bin/codecept clean +- ./vendor/bin/codecept build + + +### Run code coverage + +First you will need to have a debugger installed. + +then run the following command + +vendor/bin/codecept run unit --coverage --coverage-xml --coverage-html + +if you just want an html report: + +vendor/bin/codecept run unit --coverage --coverage-html + + + +### Notes + +- make sure you configure acceptance.suite.yml so that it reflects the domain you are working with +- If you are working on your mac locally, make sure session.save_path is set +- If tests need to login, modify acceptance.suite.yml with username and password diff --git a/tests/templates/acceptance.suite.yml.temp b/tests/templates/acceptance.suite.yml.temp new file mode 100644 index 000000000..ace4578a1 --- /dev/null +++ b/tests/templates/acceptance.suite.yml.temp @@ -0,0 +1,26 @@ +# Codeception Test Suite Configuration +# +# Suite for acceptance tests. +# Perform tests in browser using the WebDriver or PhpBrowser. +# If you need both WebDriver and PHPBrowser tests - create a separate suite. + +actor: AcceptanceTester +modules: + enabled: + - Config: + # You can use any configs in the list. There no limitations on + # the parameters names. + username: 'admin' + password: 'passwd' + - PhpBrowser: + url: http://localhost/myapp + - \Helper\Acceptance + - Db: + dsn: 'mysql:host=localhost;dbname=dotproject_test' + user: 'root' + password: '' + dump: + - 'tests/_data/test_dump.sql' + populate: true # run populator before all tests + cleanup: true # run populator before each test +step_decorators: ~ diff --git a/tests/templates/functional.suite.yml.temp b/tests/templates/functional.suite.yml.temp new file mode 100644 index 000000000..303c8ac78 --- /dev/null +++ b/tests/templates/functional.suite.yml.temp @@ -0,0 +1,13 @@ +# Codeception Test Suite Configuration +# +# Suite for functional tests +# Emulate web requests and make application process them +# Include one of framework modules (Symfony2, Yii2, Laravel5, Phalcon4) to use it +# Remove this suite if you don't use frameworks + +actor: FunctionalTester +modules: + enabled: + # add a framework module here + - \Helper\Functional + step_decorators: ~ \ No newline at end of file diff --git a/tests/templates/readme.md b/tests/templates/readme.md new file mode 100644 index 000000000..bbc0ccce8 --- /dev/null +++ b/tests/templates/readme.md @@ -0,0 +1 @@ +Move these suite files into the tests/ directory and remove the .temp from the file diff --git a/tests/templates/unit.suite.yml.temp b/tests/templates/unit.suite.yml.temp new file mode 100644 index 000000000..00565f69b --- /dev/null +++ b/tests/templates/unit.suite.yml.temp @@ -0,0 +1,10 @@ +# Codeception Test Suite Configuration +# +# Suite for unit or integration tests. + +actor: UnitTester +modules: + enabled: + - Asserts + - \Helper\Unit + step_decorators: ~ \ No newline at end of file diff --git a/tests/unit.suite.dist.yml b/tests/unit.suite.dist.yml new file mode 100644 index 000000000..da98fb085 --- /dev/null +++ b/tests/unit.suite.dist.yml @@ -0,0 +1,10 @@ +# Codeception Test Suite Configuration +# +# Suite for unit or integration tests. + +actor: UnitTester +modules: + enabled: + - Asserts + - \Helper\Unit + step_decorators: ~ diff --git a/tests/unit/DotProjectBaseClassTest.php b/tests/unit/DotProjectBaseClassTest.php new file mode 100644 index 000000000..2523c09ec --- /dev/null +++ b/tests/unit/DotProjectBaseClassTest.php @@ -0,0 +1,63 @@ +makeEmptyExcept('CDpObject', 'getError', ['_error' => 'Error Message']); //return $this->_error; + // $DBQuery = $this->makeEmptyExcept('DBQuery', 'dPgetConfig'); //return $this->_error; + + $actual = $CDpObject->getError(); + + $this->assertSame('Error Message', $actual); + + } + + /** @test */ + public function testCanGetModuleDirectoryIfPassedIn() + { + + $CDpObject = $this->makeEmptyExcept('CDpObject', 'getModuleName', ['_module_directory' => './modules']); + + $actual = $CDpObject->getModuleName(); + + $this->assertSame('./modules', $actual); + } + + /** @test */ + public function testCanGetModuleByName() + { + // TODO: Get this test working + // $CModule = $this->makeEmpty('CModule'); + // $CModule = $this->makeEmpty('DBQuery'); + + // $CDpObject = $this->makeEmptyExcept('CDpObject', 'getModuleName', ['_module_directory' => '', '_permission_name', 'admin']); + + // $actual = $CDpObject->getModuleName(); + + // $this->assertSame('./modules', $actual); + } +} diff --git a/tests/unit/ExampleTest.php b/tests/unit/ExampleTest.php new file mode 100644 index 000000000..a94c1a513 --- /dev/null +++ b/tests/unit/ExampleTest.php @@ -0,0 +1,28 @@ +assertFalse(false); + } + + public function testDate() + { + new CDate(); + } +}