commit
a103bc06e2
|
@ -29,15 +29,14 @@ before_script:
|
||||||
- &before_install_xdebug |-
|
- &before_install_xdebug |-
|
||||||
pecl install xdebug
|
pecl install xdebug
|
||||||
docker-php-ext-enable xdebug
|
docker-php-ext-enable xdebug
|
||||||
# MySQL DB
|
|
||||||
- &before_setup_mysql |-
|
|
||||||
apt install -yqq mariadb-client
|
|
||||||
mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" < db/install.sql
|
|
||||||
mysql -h "$MYSQL_HOST" -u "$MYSQL_USER" -p"$MYSQL_PASSWORD" "$MYSQL_DATABASE" < db/update.sql
|
|
||||||
# Install Composer
|
# Install Composer
|
||||||
- &before_install_composer |-
|
- &before_install_composer |-
|
||||||
curl -sS https://getcomposer.org/installer | php -- --no-ansi --install-dir /usr/local/bin/ --filename composer
|
curl -sS https://getcomposer.org/installer | php -- --no-ansi --install-dir /usr/local/bin/ --filename composer
|
||||||
composer --no-ansi install
|
composer --no-ansi install
|
||||||
|
# MySQL DB
|
||||||
|
- &before_setup_mysql |-
|
||||||
|
chmod +x ./bin/migrate
|
||||||
|
./bin/migrate
|
||||||
# Install Node.js and Yarn
|
# Install Node.js and Yarn
|
||||||
- &before_install_yarn |-
|
- &before_install_yarn |-
|
||||||
apt -yqq install gnupg2 apt-transport-https
|
apt -yqq install gnupg2 apt-transport-https
|
||||||
|
@ -86,7 +85,7 @@ test:7.1:
|
||||||
|
|
||||||
# Install project and dependencies
|
# Install project and dependencies
|
||||||
- &deployment_dependencies |-
|
- &deployment_dependencies |-
|
||||||
chmod +x ./deploy.sh
|
chmod +x ./bin/deploy.sh
|
||||||
apt update && apt install -yqq rsync openssh-client
|
apt update && apt install -yqq rsync openssh-client
|
||||||
composer --no-ansi install --no-dev
|
composer --no-ansi install --no-dev
|
||||||
composer --no-ansi dump-autoload --optimize
|
composer --no-ansi dump-autoload --optimize
|
||||||
|
@ -116,7 +115,7 @@ deploy_staging:
|
||||||
- *deployment_ssh
|
- *deployment_ssh
|
||||||
- *deployment_dependencies
|
- *deployment_dependencies
|
||||||
# Deploy to server
|
# Deploy to server
|
||||||
- ./deploy.sh -r "${STAGING_REMOTE}" -p "${STAGING_REMOTE_PATH}" -i "${CI_JOB_ID}-${CI_COMMIT_SHA}"
|
- ./bin/deploy.sh -r "${STAGING_REMOTE}" -p "${STAGING_REMOTE_PATH}" -i "${CI_JOB_ID}-${CI_COMMIT_SHA}"
|
||||||
|
|
||||||
deploy_production:
|
deploy_production:
|
||||||
<<: *deploy_definition
|
<<: *deploy_definition
|
||||||
|
@ -133,4 +132,4 @@ deploy_production:
|
||||||
- *deployment_ssh
|
- *deployment_ssh
|
||||||
- *deployment_dependencies
|
- *deployment_dependencies
|
||||||
# Deploy to server
|
# Deploy to server
|
||||||
- ./deploy.sh -r "${PRODUCTION_REMOTE}" -p "${PRODUCTION_REMOTE_PATH}" -i "${CI_JOB_ID}-${CI_COMMIT_SHA}"
|
- ./bin/deploy.sh -r "${PRODUCTION_REMOTE}" -p "${PRODUCTION_REMOTE_PATH}" -i "${CI_JOB_ID}-${CI_COMMIT_SHA}"
|
||||||
|
|
14
README.md
14
README.md
|
@ -41,8 +41,8 @@ To report bugs use [engelsystem/issues](https://github.com/engelsystem/engelsyst
|
||||||
|
|
||||||
* Recommended: Directory Listing should be disabled.
|
* Recommended: Directory Listing should be disabled.
|
||||||
* There must a be MySQL database created with a user who has full rights to that database.
|
* There must a be MySQL database created with a user who has full rights to that database.
|
||||||
* It must be created by the ```db/install.sql``` and ```db/update.sql``` files.
|
|
||||||
* If necessary, create a ```config/config.php``` to override values from ```config/config.default.php```.
|
* If necessary, create a ```config/config.php``` to override values from ```config/config.default.php```.
|
||||||
|
* To import the database the ```bin/migrate``` script has to be called.
|
||||||
* In the browser, login with credentials ```admin```:```asdfasdf``` and change the password.
|
* In the browser, login with credentials ```admin```:```asdfasdf``` and change the password.
|
||||||
|
|
||||||
Engelsystem can now be used.
|
Engelsystem can now be used.
|
||||||
|
@ -103,10 +103,16 @@ docker exec -i db_container mysql -u engelsystem -pengelsystem engelsystem < db/
|
||||||
|
|
||||||
To be able to send mails a relay is needed. Set `SMTPHOST=[mail container]` to configure it.
|
To be able to send mails a relay is needed. Set `SMTPHOST=[mail container]` to configure it.
|
||||||
|
|
||||||
#### deploy.sh
|
#### Scripts
|
||||||
The `deploy.sh` script can be used to deploy the engelsystem. It uses rsync to deploy the application to a server over ssh.
|
##### bin/deploy.sh
|
||||||
|
The `bin/deploy.sh` script can be used to deploy the engelsystem. It uses rsync to deploy the application to a server over ssh.
|
||||||
|
|
||||||
For usage see `./deploy.sh -h`
|
For usage see `./bin/deploy.sh -h`
|
||||||
|
|
||||||
|
##### bin/migrate
|
||||||
|
The `bin/migrate` script can be used to import and update the database of the engelsystem.
|
||||||
|
|
||||||
|
For more information on how to use it call `bin/migrate help`
|
||||||
|
|
||||||
### Codestyle
|
### Codestyle
|
||||||
Please ensure that your pull requests follow [PSR-2](http://www.php-fig.org/psr/psr-2/) and [PSR-4](http://www.php-fig.org/psr/psr-4/).
|
Please ensure that your pull requests follow [PSR-2](http://www.php-fig.org/psr/psr-2/) and [PSR-4](http://www.php-fig.org/psr/psr-4/).
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
#!/usr/bin/env php
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Composer\Autoload\ClassLoader;
|
||||||
|
use Engelsystem\Application;
|
||||||
|
use Engelsystem\Database\Migration\Migrate;
|
||||||
|
use Engelsystem\Database\Migration\MigrationServiceProvider;
|
||||||
|
|
||||||
|
require_once __DIR__ . '/../includes/application.php';
|
||||||
|
|
||||||
|
/** @var $loader ClassLoader */
|
||||||
|
$baseDir = __DIR__ . '/../db/migrations';
|
||||||
|
|
||||||
|
/** @var Application $app */
|
||||||
|
$app = app();
|
||||||
|
$app->register(MigrationServiceProvider::class);
|
||||||
|
|
||||||
|
/** @var Migrate $migration */
|
||||||
|
$migration = $app->get('db.migration');
|
||||||
|
$migration->setOutput(function ($text) { echo $text . PHP_EOL; });
|
||||||
|
|
||||||
|
if (isset($argv[1]) && strtolower($argv[1]) == 'help') {
|
||||||
|
echo PHP_EOL . 'Usage: ' . $argv[1] . ' [up|down] [one-step]' . PHP_EOL . PHP_EOL;
|
||||||
|
exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
$method = Migrate::UP;
|
||||||
|
if (isset($argv[1]) && strtolower($argv[1]) == 'down') {
|
||||||
|
$argv = array_values($argv);
|
||||||
|
$method = Migrate::DOWN;
|
||||||
|
}
|
||||||
|
|
||||||
|
$oneStep = false;
|
||||||
|
if (isset($argv[2]) && strtolower($argv[2]) == 'one-step') {
|
||||||
|
$oneStep = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$migration->run($baseDir, $method, $oneStep);
|
|
@ -17,6 +17,8 @@
|
||||||
"php": ">=7.0.0",
|
"php": ">=7.0.0",
|
||||||
"erusev/parsedown": "^1.6",
|
"erusev/parsedown": "^1.6",
|
||||||
"illuminate/container": "5.5.*",
|
"illuminate/container": "5.5.*",
|
||||||
|
"illuminate/database": "5.5.*",
|
||||||
|
"illuminate/support": "^5.5",
|
||||||
"psr/container": "^1.0",
|
"psr/container": "^1.0",
|
||||||
"psr/log": "^1.0",
|
"psr/log": "^1.0",
|
||||||
"symfony/http-foundation": "^3.3"
|
"symfony/http-foundation": "^3.3"
|
||||||
|
|
|
@ -5,10 +5,10 @@
|
||||||
return [
|
return [
|
||||||
// MySQL-Connection Settings
|
// MySQL-Connection Settings
|
||||||
'database' => [
|
'database' => [
|
||||||
'host' => env('MYSQL_HOST', (env('CI', false) ? 'mariadb' : 'localhost')),
|
'host' => env('MYSQL_HOST', (env('CI', false) ? 'mariadb' : 'localhost')),
|
||||||
'user' => env('MYSQL_USER', 'root'),
|
'database' => env('MYSQL_DATABASE', 'engelsystem'),
|
||||||
'pw' => env('MYSQL_PASSWORD', ''),
|
'username' => env('MYSQL_USER', 'root'),
|
||||||
'db' => env('MYSQL_DATABASE', 'engelsystem'),
|
'password' => env('MYSQL_PASSWORD', ''),
|
||||||
],
|
],
|
||||||
|
|
||||||
// For accessing stats
|
// For accessing stats
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Engelsystem\Database\Migration\Migration;
|
||||||
|
|
||||||
|
class ImportInstallSql extends Migration
|
||||||
|
{
|
||||||
|
protected $oldTables = [
|
||||||
|
'AngelTypes',
|
||||||
|
'EventConfig',
|
||||||
|
'GroupPrivileges',
|
||||||
|
'Groups',
|
||||||
|
'LogEntries',
|
||||||
|
'Messages',
|
||||||
|
'NeededAngelTypes',
|
||||||
|
'News',
|
||||||
|
'NewsComments',
|
||||||
|
'Privileges',
|
||||||
|
'Questions',
|
||||||
|
'Room',
|
||||||
|
'ShiftEntry',
|
||||||
|
'Shifts',
|
||||||
|
'ShiftTypes',
|
||||||
|
'User',
|
||||||
|
'UserAngelTypes',
|
||||||
|
'UserDriverLicenses',
|
||||||
|
'UserGroups',
|
||||||
|
];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run the migration
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
foreach ($this->oldTables as $table) {
|
||||||
|
if ($this->schema->hasTable($table)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = file_get_contents(__DIR__ . '/../install.sql');
|
||||||
|
$this->schema->getConnection()->unprepared($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migration
|
||||||
|
*/
|
||||||
|
public
|
||||||
|
function down()
|
||||||
|
{
|
||||||
|
$this->schema->getConnection()->statement('SET FOREIGN_KEY_CHECKS=0;');
|
||||||
|
|
||||||
|
foreach ($this->oldTables as $table) {
|
||||||
|
if ($this->schema->hasTable($table)) {
|
||||||
|
$this->schema->dropIfExists($table);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Engelsystem\Database\Migration\Migration;
|
||||||
|
|
||||||
|
class ImportUpdateSql extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migration
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
if ($this->schema->hasTable('UserWorkLog')) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$sql = file_get_contents(__DIR__ . '/../update.sql');
|
||||||
|
$this->schema->getConnection()->unprepared($sql);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migration
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
$this->schema->dropIfExists('UserWorkLog');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Engelsystem\Application;
|
||||||
|
use Engelsystem\Config\Config;
|
||||||
|
use Engelsystem\Exceptions\Handler;
|
||||||
|
use Engelsystem\Exceptions\Handlers\HandlerInterface;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Include the autoloader
|
||||||
|
*/
|
||||||
|
require_once __DIR__ . '/autoload.php';
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize and bootstrap the application
|
||||||
|
*/
|
||||||
|
$app = new Application(realpath(__DIR__ . DIRECTORY_SEPARATOR . '..'));
|
||||||
|
$appConfig = $app->make(Config::class);
|
||||||
|
$appConfig->set(require config_path('app.php'));
|
||||||
|
$app->bootstrap($appConfig);
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configure application
|
||||||
|
*/
|
||||||
|
date_default_timezone_set($app->get('config')->get('timezone'));
|
||||||
|
|
||||||
|
if (config('environment') == 'development') {
|
||||||
|
$errorHandler = $app->get('error.handler');
|
||||||
|
$errorHandler->setEnvironment(Handler::ENV_DEVELOPMENT);
|
||||||
|
$app->bind(HandlerInterface::class, 'error.handler.development');
|
||||||
|
ini_set('display_errors', true);
|
||||||
|
error_reporting(E_ALL);
|
||||||
|
} else {
|
||||||
|
ini_set('display_errors', false);
|
||||||
|
}
|
|
@ -2,7 +2,8 @@
|
||||||
|
|
||||||
// Check for autoloader
|
// Check for autoloader
|
||||||
if (!is_readable(__DIR__ . '/../vendor/autoload.php')) {
|
if (!is_readable(__DIR__ . '/../vendor/autoload.php')) {
|
||||||
die('Please run composer.phar install');
|
echo 'Please run composer.phar install';
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Include composer autoloader
|
// Include composer autoloader
|
||||||
|
|
|
@ -154,7 +154,7 @@ function angeltype_edit_controller()
|
||||||
$angeltype['contact_email'] = strip_request_item('contact_email', $angeltype['contact_email']);
|
$angeltype['contact_email'] = strip_request_item('contact_email', $angeltype['contact_email']);
|
||||||
|
|
||||||
if ($valid) {
|
if ($valid) {
|
||||||
if ($angeltype['id'] != null) {
|
if (!empty($angeltype['id'])) {
|
||||||
AngelType_update($angeltype);
|
AngelType_update($angeltype);
|
||||||
} else {
|
} else {
|
||||||
$angeltype = AngelType_create($angeltype);
|
$angeltype = AngelType_create($angeltype);
|
||||||
|
@ -308,7 +308,7 @@ function angeltypes_list_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
$angeltype['membership'] = AngelType_render_membership($angeltype);
|
$angeltype['membership'] = AngelType_render_membership($angeltype);
|
||||||
if ($angeltype['user_angeltype_id'] != null) {
|
if (!empty($angeltype['user_angeltype_id'])) {
|
||||||
$actions[] = button(
|
$actions[] = button(
|
||||||
page_link_to('user_angeltypes',
|
page_link_to('user_angeltypes',
|
||||||
['action' => 'delete', 'user_angeltype_id' => $angeltype['user_angeltype_id']]
|
['action' => 'delete', 'user_angeltype_id' => $angeltype['user_angeltype_id']]
|
||||||
|
@ -355,7 +355,7 @@ function load_angeltype()
|
||||||
}
|
}
|
||||||
|
|
||||||
$angeltype = AngelType($request->input('angeltype_id'));
|
$angeltype = AngelType($request->input('angeltype_id'));
|
||||||
if ($angeltype == null) {
|
if (empty($angeltype)) {
|
||||||
error(_('Angeltype doesn\'t exist . '));
|
error(_('Angeltype doesn\'t exist . '));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,7 +28,7 @@ function event_config_edit_controller()
|
||||||
$teardown_end_date = null;
|
$teardown_end_date = null;
|
||||||
|
|
||||||
$event_config = EventConfig();
|
$event_config = EventConfig();
|
||||||
if ($event_config != null) {
|
if (!empty($event_config)) {
|
||||||
$event_name = $event_config['event_name'];
|
$event_name = $event_config['event_name'];
|
||||||
$buildup_start_date = $event_config['buildup_start_date'];
|
$buildup_start_date = $event_config['buildup_start_date'];
|
||||||
$event_start_date = $event_config['event_start_date'];
|
$event_start_date = $event_config['event_start_date'];
|
||||||
|
@ -70,22 +70,22 @@ function event_config_edit_controller()
|
||||||
$teardown_end_date = $result->getValue();
|
$teardown_end_date = $result->getValue();
|
||||||
$valid &= $result->isValid();
|
$valid &= $result->isValid();
|
||||||
|
|
||||||
if ($buildup_start_date != null && $event_start_date != null && $buildup_start_date > $event_start_date) {
|
if (!is_null($buildup_start_date) && !is_null($event_start_date) && $buildup_start_date > $event_start_date) {
|
||||||
$valid = false;
|
$valid = false;
|
||||||
error(_('The buildup start date has to be before the event start date.'));
|
error(_('The buildup start date has to be before the event start date.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($event_start_date != null && $event_end_date != null && $event_start_date > $event_end_date) {
|
if (!is_null($event_start_date) && !is_null($event_end_date) && $event_start_date > $event_end_date) {
|
||||||
$valid = false;
|
$valid = false;
|
||||||
error(_('The event start date has to be before the event end date.'));
|
error(_('The event start date has to be before the event end date.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($event_end_date != null && $teardown_end_date != null && $event_end_date > $teardown_end_date) {
|
if (!is_null($event_end_date) && !is_null($teardown_end_date) && $event_end_date > $teardown_end_date) {
|
||||||
$valid = false;
|
$valid = false;
|
||||||
error(_('The event end date has to be before the teardown end date.'));
|
error(_('The event end date has to be before the teardown end date.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($buildup_start_date != null && $teardown_end_date != null && $buildup_start_date > $teardown_end_date) {
|
if (!is_null($buildup_start_date) && !is_null($teardown_end_date) && $buildup_start_date > $teardown_end_date) {
|
||||||
$valid = false;
|
$valid = false;
|
||||||
error(_('The buildup start date has to be before the teardown end date.'));
|
error(_('The buildup start date has to be before the teardown end date.'));
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,7 +110,7 @@ function load_room()
|
||||||
}
|
}
|
||||||
|
|
||||||
$room = Room(request()->input('room_id'));
|
$room = Room(request()->input('room_id'));
|
||||||
if ($room == null) {
|
if (empty($room)) {
|
||||||
redirect(page_link_to());
|
redirect(page_link_to());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,7 @@ function shift_entries_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
$action = strip_request_item('action');
|
$action = strip_request_item('action');
|
||||||
if ($action == null) {
|
if (empty($action)) {
|
||||||
redirect(user_link($user));
|
redirect(user_link($user));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +43,7 @@ function shift_entry_create_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
$shift = Shift($request->input('shift_id'));
|
$shift = Shift($request->input('shift_id'));
|
||||||
if ($shift == null) {
|
if (empty($shift)) {
|
||||||
redirect(user_link($user));
|
redirect(user_link($user));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +53,7 @@ function shift_entry_create_controller()
|
||||||
return shift_entry_create_controller_admin($shift, $angeltype);
|
return shift_entry_create_controller_admin($shift, $angeltype);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($angeltype == null) {
|
if (empty($angeltype)) {
|
||||||
redirect(user_link($user));
|
redirect(user_link($user));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -81,7 +81,7 @@ function shift_entry_create_controller_admin($shift, $angeltype)
|
||||||
if ($request->has('user_id')) {
|
if ($request->has('user_id')) {
|
||||||
$signup_user = User($request->input('user_id'));
|
$signup_user = User($request->input('user_id'));
|
||||||
}
|
}
|
||||||
if ($signup_user == null) {
|
if (empty($signup_user)) {
|
||||||
redirect(shift_link($shift));
|
redirect(shift_link($shift));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,7 +89,7 @@ function shift_entry_create_controller_admin($shift, $angeltype)
|
||||||
if ($request->has('angeltype_id')) {
|
if ($request->has('angeltype_id')) {
|
||||||
$angeltype = AngelType($request->input('angeltype_id'));
|
$angeltype = AngelType($request->input('angeltype_id'));
|
||||||
}
|
}
|
||||||
if ($angeltype == null) {
|
if (empty($angeltype)) {
|
||||||
if (count($angeltypes) == 0) {
|
if (count($angeltypes) == 0) {
|
||||||
redirect(shift_link($shift));
|
redirect(shift_link($shift));
|
||||||
}
|
}
|
||||||
|
@ -321,7 +321,7 @@ function shift_entry_load()
|
||||||
redirect(page_link_to('user_shifts'));
|
redirect(page_link_to('user_shifts'));
|
||||||
}
|
}
|
||||||
$shiftEntry = ShiftEntry($request->input('shift_entry_id'));
|
$shiftEntry = ShiftEntry($request->input('shift_entry_id'));
|
||||||
if ($shiftEntry == null) {
|
if (empty($shiftEntry)) {
|
||||||
error(_('Shift entry not found.'));
|
error(_('Shift entry not found.'));
|
||||||
redirect(page_link_to('user_shifts'));
|
redirect(page_link_to('user_shifts'));
|
||||||
}
|
}
|
||||||
|
|
|
@ -217,7 +217,7 @@ function shift_delete_controller()
|
||||||
$shift_id = $request->input('delete_shift');
|
$shift_id = $request->input('delete_shift');
|
||||||
|
|
||||||
$shift = Shift($shift_id);
|
$shift = Shift($shift_id);
|
||||||
if ($shift == null) {
|
if (empty($shift)) {
|
||||||
redirect(page_link_to('user_shifts'));
|
redirect(page_link_to('user_shifts'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,7 +264,7 @@ function shift_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
$shift = Shift($request->input('shift_id'));
|
$shift = Shift($request->input('shift_id'));
|
||||||
if ($shift == null) {
|
if (empty($shift)) {
|
||||||
error(_('Shift could not be found.'));
|
error(_('Shift could not be found.'));
|
||||||
redirect(page_link_to('user_shifts'));
|
redirect(page_link_to('user_shifts'));
|
||||||
}
|
}
|
||||||
|
@ -277,6 +277,10 @@ function shift_controller()
|
||||||
$shift_signup_state = new ShiftSignupState(ShiftSignupState::OCCUPIED, 0);
|
$shift_signup_state = new ShiftSignupState(ShiftSignupState::OCCUPIED, 0);
|
||||||
foreach ($angeltypes as &$angeltype) {
|
foreach ($angeltypes as &$angeltype) {
|
||||||
$needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype);
|
$needed_angeltype = NeededAngeltype_by_Shift_and_Angeltype($shift, $angeltype);
|
||||||
|
if(empty($needed_angeltype)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
$shift_entries = ShiftEntries_by_shift_and_angeltype($shift['SID'], $angeltype['id']);
|
$shift_entries = ShiftEntries_by_shift_and_angeltype($shift['SID'], $angeltype['id']);
|
||||||
|
|
||||||
$angeltype_signup_state = Shift_signup_allowed(
|
$angeltype_signup_state = Shift_signup_allowed(
|
||||||
|
@ -288,11 +292,7 @@ function shift_controller()
|
||||||
$needed_angeltype,
|
$needed_angeltype,
|
||||||
$shift_entries
|
$shift_entries
|
||||||
);
|
);
|
||||||
if ($shift_signup_state == null) {
|
$shift_signup_state->combineWith($angeltype_signup_state);
|
||||||
$shift_signup_state = $angeltype_signup_state;
|
|
||||||
} else {
|
|
||||||
$shift_signup_state->combineWith($angeltype_signup_state);
|
|
||||||
}
|
|
||||||
$angeltype['shift_signup_state'] = $angeltype_signup_state;
|
$angeltype['shift_signup_state'] = $angeltype_signup_state;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -361,7 +361,7 @@ function shifts_json_export_controller()
|
||||||
$key = $request->input('key');
|
$key = $request->input('key');
|
||||||
|
|
||||||
$user = User_by_api_key($key);
|
$user = User_by_api_key($key);
|
||||||
if ($user == null) {
|
if (empty($user)) {
|
||||||
engelsystem_error('Key invalid.');
|
engelsystem_error('Key invalid.');
|
||||||
}
|
}
|
||||||
if (!in_array('shifts_json_export', privileges_for_user($user['UID']))) {
|
if (!in_array('shifts_json_export', privileges_for_user($user['UID']))) {
|
||||||
|
|
|
@ -22,8 +22,7 @@ function shifttype_delete_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
$shifttype = ShiftType($request->input('shifttype_id'));
|
$shifttype = ShiftType($request->input('shifttype_id'));
|
||||||
|
if (empty($shifttype)) {
|
||||||
if ($shifttype == null) {
|
|
||||||
redirect(page_link_to('shifttypes'));
|
redirect(page_link_to('shifttypes'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -58,7 +57,7 @@ function shifttype_edit_controller()
|
||||||
|
|
||||||
if ($request->has('shifttype_id')) {
|
if ($request->has('shifttype_id')) {
|
||||||
$shifttype = ShiftType($request->input('shifttype_id'));
|
$shifttype = ShiftType($request->input('shifttype_id'));
|
||||||
if ($shifttype == null) {
|
if (empty($shifttype)) {
|
||||||
error(_('Shifttype not found.'));
|
error(_('Shifttype not found.'));
|
||||||
redirect(page_link_to('shifttypes'));
|
redirect(page_link_to('shifttypes'));
|
||||||
}
|
}
|
||||||
|
@ -120,12 +119,12 @@ function shifttype_controller()
|
||||||
redirect(page_link_to('shifttypes'));
|
redirect(page_link_to('shifttypes'));
|
||||||
}
|
}
|
||||||
$shifttype = ShiftType($request->input('shifttype_id'));
|
$shifttype = ShiftType($request->input('shifttype_id'));
|
||||||
if ($shifttype == null) {
|
if (empty($shifttype)) {
|
||||||
redirect(page_link_to('shifttypes'));
|
redirect(page_link_to('shifttypes'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$angeltype = null;
|
$angeltype = [];
|
||||||
if ($shifttype['angeltype_id'] != null) {
|
if (!empty($shifttype['angeltype_id'])) {
|
||||||
$angeltype = AngelType($shifttype['angeltype_id']);
|
$angeltype = AngelType($shifttype['angeltype_id']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ function user_angeltypes_delete_all_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
$angeltype = AngelType($request->input('angeltype_id'));
|
$angeltype = AngelType($request->input('angeltype_id'));
|
||||||
if ($angeltype == null) {
|
if (empty($angeltype)) {
|
||||||
error(_('Angeltype doesn\'t exist.'));
|
error(_('Angeltype doesn\'t exist.'));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
@ -85,7 +85,7 @@ function user_angeltypes_confirm_all_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
$angeltype = AngelType($request->input('angeltype_id'));
|
$angeltype = AngelType($request->input('angeltype_id'));
|
||||||
if ($angeltype == null) {
|
if (empty($angeltype)) {
|
||||||
error(_('Angeltype doesn\'t exist.'));
|
error(_('Angeltype doesn\'t exist.'));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
@ -125,13 +125,13 @@ function user_angeltype_confirm_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
$user_angeltype = UserAngelType($request->input('user_angeltype_id'));
|
$user_angeltype = UserAngelType($request->input('user_angeltype_id'));
|
||||||
if ($user_angeltype == null) {
|
if (empty($user_angeltype)) {
|
||||||
error(_('User angeltype doesn\'t exist.'));
|
error(_('User angeltype doesn\'t exist.'));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$angeltype = AngelType($user_angeltype['angeltype_id']);
|
$angeltype = AngelType($user_angeltype['angeltype_id']);
|
||||||
if ($angeltype == null) {
|
if (empty($angeltype)) {
|
||||||
error(_('Angeltype doesn\'t exist.'));
|
error(_('Angeltype doesn\'t exist.'));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
@ -142,7 +142,7 @@ function user_angeltype_confirm_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
$user_source = User($user_angeltype['user_id']);
|
$user_source = User($user_angeltype['user_id']);
|
||||||
if ($user_source == null) {
|
if (empty($user_source)) {
|
||||||
error(_('User doesn\'t exist.'));
|
error(_('User doesn\'t exist.'));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
@ -185,19 +185,19 @@ function user_angeltype_delete_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
$user_angeltype = UserAngelType($request->input('user_angeltype_id'));
|
$user_angeltype = UserAngelType($request->input('user_angeltype_id'));
|
||||||
if ($user_angeltype == null) {
|
if (empty($user_angeltype)) {
|
||||||
error(_('User angeltype doesn\'t exist.'));
|
error(_('User angeltype doesn\'t exist.'));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$angeltype = AngelType($user_angeltype['angeltype_id']);
|
$angeltype = AngelType($user_angeltype['angeltype_id']);
|
||||||
if ($angeltype == null) {
|
if (empty($angeltype)) {
|
||||||
error(_('Angeltype doesn\'t exist.'));
|
error(_('Angeltype doesn\'t exist.'));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$user_source = User($user_angeltype['user_id']);
|
$user_source = User($user_angeltype['user_id']);
|
||||||
if ($user_source == null) {
|
if (empty($user_source)) {
|
||||||
error(_('User doesn\'t exist.'));
|
error(_('User doesn\'t exist.'));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
@ -252,19 +252,19 @@ function user_angeltype_update_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
$user_angeltype = UserAngelType($request->input('user_angeltype_id'));
|
$user_angeltype = UserAngelType($request->input('user_angeltype_id'));
|
||||||
if ($user_angeltype == null) {
|
if (empty($user_angeltype)) {
|
||||||
error(_('User angeltype doesn\'t exist.'));
|
error(_('User angeltype doesn\'t exist.'));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$angeltype = AngelType($user_angeltype['angeltype_id']);
|
$angeltype = AngelType($user_angeltype['angeltype_id']);
|
||||||
if ($angeltype == null) {
|
if (empty($angeltype)) {
|
||||||
error(_('Angeltype doesn\'t exist.'));
|
error(_('Angeltype doesn\'t exist.'));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$user_source = User($user_angeltype['user_id']);
|
$user_source = User($user_angeltype['user_id']);
|
||||||
if ($user_source == null) {
|
if (empty($user_source)) {
|
||||||
error(_('User doesn\'t exist.'));
|
error(_('User doesn\'t exist.'));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
@ -359,7 +359,7 @@ function user_angeltype_join_controller($angeltype)
|
||||||
global $user, $privileges;
|
global $user, $privileges;
|
||||||
|
|
||||||
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
|
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
|
||||||
if ($user_angeltype != null) {
|
if (!empty($user_angeltype)) {
|
||||||
error(sprintf(_('You are already a %s.'), $angeltype['name']));
|
error(sprintf(_('You are already a %s.'), $angeltype['name']));
|
||||||
redirect(page_link_to('angeltypes'));
|
redirect(page_link_to('angeltypes'));
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,7 +14,7 @@ function user_driver_license_required_hint()
|
||||||
$user_driver_license = UserDriverLicense($user['UID']);
|
$user_driver_license = UserDriverLicense($user['UID']);
|
||||||
|
|
||||||
// User has already entered data, no hint needed.
|
// User has already entered data, no hint needed.
|
||||||
if ($user_driver_license != null) {
|
if (!empty($user_driver_license)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -60,7 +60,7 @@ function user_driver_licenses_controller()
|
||||||
*/
|
*/
|
||||||
function user_driver_license_edit_link($user = null)
|
function user_driver_license_edit_link($user = null)
|
||||||
{
|
{
|
||||||
if ($user == null) {
|
if (empty($user)) {
|
||||||
return page_link_to('user_driver_licenses');
|
return page_link_to('user_driver_licenses');
|
||||||
}
|
}
|
||||||
return page_link_to('user_driver_licenses', ['user_id' => $user['UID']]);
|
return page_link_to('user_driver_licenses', ['user_id' => $user['UID']]);
|
||||||
|
@ -79,7 +79,7 @@ function user_driver_license_load_user()
|
||||||
|
|
||||||
if ($request->has('user_id')) {
|
if ($request->has('user_id')) {
|
||||||
$user_source = User($request->input('user_id'));
|
$user_source = User($request->input('user_id'));
|
||||||
if ($user_source == null) {
|
if (empty($user_source)) {
|
||||||
redirect(user_driver_license_edit_link());
|
redirect(user_driver_license_edit_link());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -104,7 +104,7 @@ function user_driver_license_edit_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
$user_driver_license = UserDriverLicense($user_source['UID']);
|
$user_driver_license = UserDriverLicense($user_source['UID']);
|
||||||
if ($user_driver_license == null) {
|
if (empty($user_driver_license)) {
|
||||||
$wants_to_drive = false;
|
$wants_to_drive = false;
|
||||||
$user_driver_license = UserDriverLicense_new();
|
$user_driver_license = UserDriverLicense_new();
|
||||||
} else {
|
} else {
|
||||||
|
@ -122,7 +122,7 @@ function user_driver_license_edit_controller()
|
||||||
$user_driver_license['has_license_forklift'] = $request->has('has_license_forklift');
|
$user_driver_license['has_license_forklift'] = $request->has('has_license_forklift');
|
||||||
|
|
||||||
if (UserDriverLicense_valid($user_driver_license)) {
|
if (UserDriverLicense_valid($user_driver_license)) {
|
||||||
if ($user_driver_license['user_id'] == null) {
|
if (empty($user_driver_license['user_id'])) {
|
||||||
$user_driver_license = UserDriverLicenses_create($user_driver_license, $user_source);
|
$user_driver_license = UserDriverLicenses_create($user_driver_license, $user_source);
|
||||||
} else {
|
} else {
|
||||||
UserDriverLicenses_update($user_driver_license);
|
UserDriverLicenses_update($user_driver_license);
|
||||||
|
@ -133,7 +133,7 @@ function user_driver_license_edit_controller()
|
||||||
} else {
|
} else {
|
||||||
error(_('Please select at least one driving license.'));
|
error(_('Please select at least one driving license.'));
|
||||||
}
|
}
|
||||||
} elseif ($user_driver_license['user_id'] != null) {
|
} elseif (!empty($user_driver_license['user_id'])) {
|
||||||
UserDriverLicenses_delete($user_source['UID']);
|
UserDriverLicenses_delete($user_source['UID']);
|
||||||
engelsystem_log('Driver license information removed.');
|
engelsystem_log('Driver license information removed.');
|
||||||
success(_('Your driver license information has been removed.'));
|
success(_('Your driver license information has been removed.'));
|
||||||
|
|
|
@ -2,6 +2,8 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete a work log entry.
|
* Delete a work log entry.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
*/
|
*/
|
||||||
function user_worklog_delete_controller()
|
function user_worklog_delete_controller()
|
||||||
{
|
{
|
||||||
|
@ -29,6 +31,8 @@ function user_worklog_delete_controller()
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Edit work log for user.
|
* Edit work log for user.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
*/
|
*/
|
||||||
function user_worklog_edit_controller()
|
function user_worklog_edit_controller()
|
||||||
{
|
{
|
||||||
|
@ -59,9 +63,10 @@ function user_worklog_edit_controller()
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Handle form
|
||||||
*
|
*
|
||||||
* @param UserWorkLog $userWorkLog
|
* @param array $userWorkLog
|
||||||
* @return [bool $valid, UserWorkLog $userWorkLog]
|
* @return array [bool $valid, UserWorkLog $userWorkLog]
|
||||||
*/
|
*/
|
||||||
function user_worklog_from_request($userWorkLog)
|
function user_worklog_from_request($userWorkLog)
|
||||||
{
|
{
|
||||||
|
@ -69,14 +74,17 @@ function user_worklog_from_request($userWorkLog)
|
||||||
|
|
||||||
$valid = true;
|
$valid = true;
|
||||||
|
|
||||||
$userWorkLog['work_timestamp'] = parse_date('Y-m-d H:i', $request->input('work_timestamp') . ' 00:00');
|
$userWorkLog['work_timestamp'] = parse_date(
|
||||||
if ($userWorkLog['work_timestamp'] == null) {
|
'Y-m-d H:i',
|
||||||
|
$request->input('work_timestamp') . ' 00:00'
|
||||||
|
);
|
||||||
|
if (is_null($userWorkLog['work_timestamp'])) {
|
||||||
$valid = false;
|
$valid = false;
|
||||||
error(_('Please enter work date.'));
|
error(_('Please enter work date.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
$userWorkLog['work_hours'] = $request->input('work_hours');
|
$userWorkLog['work_hours'] = $request->input('work_hours');
|
||||||
if (! preg_match("/[0-9]+(\.[0-9]+)?/", $userWorkLog['work_hours'])) {
|
if (!preg_match("/[0-9]+(\.[0-9]+)?/", $userWorkLog['work_hours'])) {
|
||||||
$valid = false;
|
$valid = false;
|
||||||
error(_('Please enter work hours in format ##[.##].'));
|
error(_('Please enter work hours in format ##[.##].'));
|
||||||
}
|
}
|
||||||
|
@ -95,6 +103,8 @@ function user_worklog_from_request($userWorkLog)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add work log entry to user.
|
* Add work log entry to user.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
*/
|
*/
|
||||||
function user_worklog_add_controller()
|
function user_worklog_add_controller()
|
||||||
{
|
{
|
||||||
|
@ -128,12 +138,14 @@ function user_worklog_add_controller()
|
||||||
/**
|
/**
|
||||||
* Link to work log entry add for given user.
|
* Link to work log entry add for given user.
|
||||||
*
|
*
|
||||||
* @param User $user
|
* @param array $user
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
*/
|
*/
|
||||||
function user_worklog_add_link($user)
|
function user_worklog_add_link($user)
|
||||||
{
|
{
|
||||||
return page_link_to('user_worklog', [
|
return page_link_to('user_worklog', [
|
||||||
'action' => 'add',
|
'action' => 'add',
|
||||||
'user_id' => $user['UID']
|
'user_id' => $user['UID']
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
@ -141,12 +153,13 @@ function user_worklog_add_link($user)
|
||||||
/**
|
/**
|
||||||
* Link to work log entry edit.
|
* Link to work log entry edit.
|
||||||
*
|
*
|
||||||
* @param UserWorkLog $userWorkLog
|
* @param array $userWorkLog
|
||||||
|
* @return string
|
||||||
*/
|
*/
|
||||||
function user_worklog_edit_link($userWorkLog)
|
function user_worklog_edit_link($userWorkLog)
|
||||||
{
|
{
|
||||||
return page_link_to('user_worklog', [
|
return page_link_to('user_worklog', [
|
||||||
'action' => 'edit',
|
'action' => 'edit',
|
||||||
'user_worklog_id' => $userWorkLog['id']
|
'user_worklog_id' => $userWorkLog['id']
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
@ -154,31 +167,34 @@ function user_worklog_edit_link($userWorkLog)
|
||||||
/**
|
/**
|
||||||
* Link to work log entry delete.
|
* Link to work log entry delete.
|
||||||
*
|
*
|
||||||
* @param UserWorkLog $userWorkLog
|
* @param array $userWorkLog
|
||||||
* @param array[] $parameters
|
* @param array[] $parameters
|
||||||
|
* @return string
|
||||||
*/
|
*/
|
||||||
function user_worklog_delete_link($userWorkLog, $parameters = [])
|
function user_worklog_delete_link($userWorkLog, $parameters = [])
|
||||||
{
|
{
|
||||||
return page_link_to('user_worklog', array_merge([
|
return page_link_to('user_worklog', array_merge([
|
||||||
'action' => 'delete',
|
'action' => 'delete',
|
||||||
'user_worklog_id' => $userWorkLog['id']
|
'user_worklog_id' => $userWorkLog['id']
|
||||||
], $parameters));
|
], $parameters));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Work log entry actions
|
* Work log entry actions
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
*/
|
*/
|
||||||
function user_worklogs_controller()
|
function user_worklog_controller()
|
||||||
{
|
{
|
||||||
global $user, $privileges;
|
global $user, $privileges;
|
||||||
|
|
||||||
if (! in_array('admin_user_worklog', $privileges)) {
|
if (!in_array('admin_user_worklog', $privileges)) {
|
||||||
redirect(user_link($user));
|
redirect(user_link($user));
|
||||||
}
|
}
|
||||||
|
|
||||||
$request = request();
|
$request = request();
|
||||||
$action = $request->input('action');
|
$action = $request->input('action');
|
||||||
if (! $request->has('action')) {
|
if (!$request->has('action')) {
|
||||||
redirect(user_link($user));
|
redirect(user_link($user));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,5 +207,3 @@ function user_worklogs_controller()
|
||||||
return user_worklog_delete_controller();
|
return user_worklog_delete_controller();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
|
|
@ -190,7 +190,7 @@ function user_controller()
|
||||||
$user_source = $user;
|
$user_source = $user;
|
||||||
if ($request->has('user_id')) {
|
if ($request->has('user_id')) {
|
||||||
$user_source = User($request->input('user_id'));
|
$user_source = User($request->input('user_id'));
|
||||||
if ($user_source == null) {
|
if (empty($user_source)) {
|
||||||
error(_('User not found.'));
|
error(_('User not found.'));
|
||||||
redirect(page_link_to('/'));
|
redirect(page_link_to('/'));
|
||||||
}
|
}
|
||||||
|
@ -225,7 +225,7 @@ function user_controller()
|
||||||
User_reset_api_key($user_source, false);
|
User_reset_api_key($user_source, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if($user_source['force_active']) {
|
if ($user_source['force_active']) {
|
||||||
$tshirt_score = _('Enough');
|
$tshirt_score = _('Enough');
|
||||||
} else {
|
} else {
|
||||||
$tshirt_score = sprintf('%.2f', User_tshirt_score($user_source)) . ' h';
|
$tshirt_score = sprintf('%.2f', User_tshirt_score($user_source)) . ' h';
|
||||||
|
@ -297,7 +297,7 @@ function user_password_recovery_set_new_controller()
|
||||||
{
|
{
|
||||||
$request = request();
|
$request = request();
|
||||||
$user_source = User_by_password_recovery_token($request->input('token'));
|
$user_source = User_by_password_recovery_token($request->input('token'));
|
||||||
if ($user_source == null) {
|
if (empty($user_source)) {
|
||||||
error(_('Token is not correct.'));
|
error(_('Token is not correct.'));
|
||||||
redirect(page_link_to('login'));
|
redirect(page_link_to('login'));
|
||||||
}
|
}
|
||||||
|
@ -343,7 +343,7 @@ function user_password_recovery_start_controller()
|
||||||
$email = strip_request_item('email');
|
$email = strip_request_item('email');
|
||||||
if (check_email($email)) {
|
if (check_email($email)) {
|
||||||
$user_source = User_by_email($email);
|
$user_source = User_by_email($email);
|
||||||
if ($user_source == null) {
|
if (empty($user_source)) {
|
||||||
$valid = false;
|
$valid = false;
|
||||||
error(_('E-mail address is not correct.'));
|
error(_('E-mail address is not correct.'));
|
||||||
}
|
}
|
||||||
|
@ -412,8 +412,7 @@ function load_user()
|
||||||
}
|
}
|
||||||
|
|
||||||
$user = User($request->input('user_id'));
|
$user = User($request->input('user_id'));
|
||||||
|
if (empty($user)) {
|
||||||
if ($user == null) {
|
|
||||||
error(_('User doesn\'t exist.'));
|
error(_('User doesn\'t exist.'));
|
||||||
redirect(page_link_to());
|
redirect(page_link_to());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,9 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use Engelsystem\Application;
|
|
||||||
use Engelsystem\Config\Config;
|
|
||||||
use Engelsystem\Exceptions\Handler;
|
|
||||||
use Engelsystem\Exceptions\Handlers\HandlerInterface;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This file includes all needed functions, connects to the db etc.
|
* Bootstrap application
|
||||||
*/
|
*/
|
||||||
require_once __DIR__ . '/autoload.php';
|
require __DIR__ . '/application.php';
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -17,31 +12,6 @@ require_once __DIR__ . '/autoload.php';
|
||||||
require __DIR__ . '/includes.php';
|
require __DIR__ . '/includes.php';
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize and bootstrap the application
|
|
||||||
*/
|
|
||||||
$app = new Application(realpath(__DIR__ . DIRECTORY_SEPARATOR . '..'));
|
|
||||||
$appConfig = $app->make(Config::class);
|
|
||||||
$appConfig->set(require config_path('app.php'));
|
|
||||||
$app->bootstrap($appConfig);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Configure application
|
|
||||||
*/
|
|
||||||
date_default_timezone_set($app->get('config')->get('timezone'));
|
|
||||||
|
|
||||||
if (config('environment') == 'development') {
|
|
||||||
$errorHandler = $app->get('error.handler');
|
|
||||||
$errorHandler->setEnvironment(Handler::ENV_DEVELOPMENT);
|
|
||||||
$app->bind(HandlerInterface::class, 'error.handler.development');
|
|
||||||
ini_set('display_errors', true);
|
|
||||||
error_reporting(E_ALL);
|
|
||||||
} else {
|
|
||||||
ini_set('display_errors', false);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check for maintenance
|
* Check for maintenance
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -48,7 +48,7 @@ function gettext_init()
|
||||||
*/
|
*/
|
||||||
function gettext_locale($locale = null)
|
function gettext_locale($locale = null)
|
||||||
{
|
{
|
||||||
if ($locale == null) {
|
if (empty($locale)) {
|
||||||
$locale = session()->get('locale');
|
$locale = session()->get('locale');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -159,7 +159,7 @@ function AngelType_validate_name($name, $angeltype)
|
||||||
if ($name == '') {
|
if ($name == '') {
|
||||||
return new ValidationResult(false, '');
|
return new ValidationResult(false, '');
|
||||||
}
|
}
|
||||||
if ($angeltype != null && isset($angeltype['id'])) {
|
if (!empty($angeltype) && isset($angeltype['id'])) {
|
||||||
$valid = (count(DB::select('
|
$valid = (count(DB::select('
|
||||||
SELECT `id`
|
SELECT `id`
|
||||||
FROM `AngelTypes`
|
FROM `AngelTypes`
|
||||||
|
@ -229,8 +229,10 @@ function AngelType_ids()
|
||||||
*/
|
*/
|
||||||
function AngelType($angeltype_id)
|
function AngelType($angeltype_id)
|
||||||
{
|
{
|
||||||
return DB::selectOne(
|
$angelType = DB::selectOne(
|
||||||
'SELECT * FROM `AngelTypes` WHERE `id`=?',
|
'SELECT * FROM `AngelTypes` WHERE `id`=?',
|
||||||
[$angeltype_id]
|
[$angeltype_id]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return empty($angelType) ? null : $angelType;
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,9 @@ use Engelsystem\Database\DB;
|
||||||
*/
|
*/
|
||||||
function EventConfig()
|
function EventConfig()
|
||||||
{
|
{
|
||||||
return DB::selectOne('SELECT * FROM `EventConfig` LIMIT 1');
|
$config = DB::selectOne('SELECT * FROM `EventConfig` LIMIT 1');
|
||||||
|
|
||||||
|
return empty($config) ? null : $config;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -21,7 +23,7 @@ function EventConfig()
|
||||||
* @param int $event_end_date
|
* @param int $event_end_date
|
||||||
* @param int $teardown_end_date
|
* @param int $teardown_end_date
|
||||||
* @param string $event_welcome_msg
|
* @param string $event_welcome_msg
|
||||||
* @return int Rows updated
|
* @return bool
|
||||||
*/
|
*/
|
||||||
function EventConfig_update(
|
function EventConfig_update(
|
||||||
$event_name,
|
$event_name,
|
||||||
|
@ -31,7 +33,8 @@ function EventConfig_update(
|
||||||
$teardown_end_date,
|
$teardown_end_date,
|
||||||
$event_welcome_msg
|
$event_welcome_msg
|
||||||
) {
|
) {
|
||||||
if (EventConfig() == null) {
|
$eventConfig = EventConfig();
|
||||||
|
if (empty($eventConfig)) {
|
||||||
return DB::insert('
|
return DB::insert('
|
||||||
INSERT INTO `EventConfig` (
|
INSERT INTO `EventConfig` (
|
||||||
`event_name`,
|
`event_name`,
|
||||||
|
@ -54,7 +57,7 @@ function EventConfig_update(
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
return DB::update('
|
return (bool)DB::update('
|
||||||
UPDATE `EventConfig` SET
|
UPDATE `EventConfig` SET
|
||||||
`event_name` = ?,
|
`event_name` = ?,
|
||||||
`buildup_start_date` = ?,
|
`buildup_start_date` = ?,
|
||||||
|
|
|
@ -58,5 +58,5 @@ function LogEntries_filter($keyword)
|
||||||
*/
|
*/
|
||||||
function LogEntries_clear_all()
|
function LogEntries_clear_all()
|
||||||
{
|
{
|
||||||
return DB::statement('TRUNCATE `LogEntries`');
|
return DB::connection()->statement('TRUNCATE `LogEntries`');
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,9 @@ function Message_ids()
|
||||||
*/
|
*/
|
||||||
function Message($message_id)
|
function Message($message_id)
|
||||||
{
|
{
|
||||||
return DB::selectOne('SELECT * FROM `Messages` WHERE `id`=? LIMIT 1', [$message_id]);
|
$message = DB::selectOne('SELECT * FROM `Messages` WHERE `id`=? LIMIT 1', [$message_id]);
|
||||||
|
|
||||||
|
return empty($message) ? null : $message;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -148,14 +148,16 @@ function Room_update($room_id, $name, $from_frab, $map_url, $description)
|
||||||
* Returns room by id.
|
* Returns room by id.
|
||||||
*
|
*
|
||||||
* @param int $room_id RID
|
* @param int $room_id RID
|
||||||
* @return array|false
|
* @return array|null
|
||||||
*/
|
*/
|
||||||
function Room($room_id)
|
function Room($room_id)
|
||||||
{
|
{
|
||||||
return DB::selectOne('
|
$room = DB::selectOne('
|
||||||
SELECT *
|
SELECT *
|
||||||
FROM `Room`
|
FROM `Room`
|
||||||
WHERE `RID` = ?', [
|
WHERE `RID` = ?', [
|
||||||
$room_id
|
$room_id
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
return empty($room) ? null : $room;
|
||||||
}
|
}
|
||||||
|
|
|
@ -138,7 +138,9 @@ function ShiftEntry_update($shift_entry)
|
||||||
*/
|
*/
|
||||||
function ShiftEntry($shift_entry_id)
|
function ShiftEntry($shift_entry_id)
|
||||||
{
|
{
|
||||||
return DB::selectOne('SELECT * FROM `ShiftEntry` WHERE `id` = ?', [$shift_entry_id]);
|
$shiftEntry = DB::selectOne('SELECT * FROM `ShiftEntry` WHERE `id` = ?', [$shift_entry_id]);
|
||||||
|
|
||||||
|
return empty($shiftEntry) ? null : $shiftEntry;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -70,7 +70,9 @@ function ShiftType_create($name, $angeltype_id, $description)
|
||||||
*/
|
*/
|
||||||
function ShiftType($shifttype_id)
|
function ShiftType($shifttype_id)
|
||||||
{
|
{
|
||||||
return DB::selectOne('SELECT * FROM `ShiftTypes` WHERE `id`=?', [$shifttype_id]);
|
$shiftType = DB::selectOne('SELECT * FROM `ShiftTypes` WHERE `id`=?', [$shifttype_id]);
|
||||||
|
|
||||||
|
return empty($shiftType) ? null : $shiftType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -48,7 +48,7 @@ class ShiftsFilter
|
||||||
* @param int[] $rooms
|
* @param int[] $rooms
|
||||||
* @param int[] $types
|
* @param int[] $types
|
||||||
*/
|
*/
|
||||||
public function __construct($user_shifts_admin, $rooms, $types)
|
public function __construct($user_shifts_admin = false, $rooms = [], $types = [])
|
||||||
{
|
{
|
||||||
$this->rooms = $rooms;
|
$this->rooms = $rooms;
|
||||||
$this->types = $types;
|
$this->types = $types;
|
||||||
|
@ -62,6 +62,34 @@ class ShiftsFilter
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function sessionExport()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'userShiftsAdmin' => $this->userShiftsAdmin,
|
||||||
|
'filled' => $this->filled,
|
||||||
|
'rooms' => $this->rooms,
|
||||||
|
'types' => $this->types,
|
||||||
|
'startTime' => $this->startTime,
|
||||||
|
'endTime' => $this->endTime,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param array $data
|
||||||
|
*/
|
||||||
|
public function sessionImport($data)
|
||||||
|
{
|
||||||
|
$this->userShiftsAdmin = $data['userShiftsAdmin'];
|
||||||
|
$this->filled = $data['filled'];
|
||||||
|
$this->rooms = $data['rooms'];
|
||||||
|
$this->types = $data['types'];
|
||||||
|
$this->startTime = $data['startTime'];
|
||||||
|
$this->endTime = $data['endTime'];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return int unix timestamp
|
* @return int unix timestamp
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -323,7 +323,7 @@ function Shift_signup_allowed_angel(
|
||||||
return new ShiftSignupState(ShiftSignupState::NOT_ARRIVED, $free_entries);
|
return new ShiftSignupState(ShiftSignupState::NOT_ARRIVED, $free_entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($user_shifts == null) {
|
if (empty($user_shifts)) {
|
||||||
$user_shifts = Shifts_by_user($user);
|
$user_shifts = Shifts_by_user($user);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -349,14 +349,14 @@ function Shift_signup_allowed_angel(
|
||||||
return new ShiftSignupState(ShiftSignupState::OCCUPIED, $free_entries);
|
return new ShiftSignupState(ShiftSignupState::OCCUPIED, $free_entries);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($user_angeltype == null) {
|
if (empty($user_angeltype)) {
|
||||||
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
|
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
$user_angeltype == null
|
empty($user_angeltype)
|
||||||
|| ($angeltype['no_self_signup'] == 1 && $user_angeltype != null)
|
|| ($angeltype['no_self_signup'] == 1 && !empty($user_angeltype))
|
||||||
|| ($angeltype['restricted'] == 1 && $user_angeltype != null && !isset($user_angeltype['confirm_user_id']))
|
|| ($angeltype['restricted'] == 1 && !empty($user_angeltype) && !isset($user_angeltype['confirm_user_id']))
|
||||||
) {
|
) {
|
||||||
// you cannot join if user is not of this angel type
|
// you cannot join if user is not of this angel type
|
||||||
// you cannot join if you are not confirmed
|
// you cannot join if you are not confirmed
|
||||||
|
@ -552,7 +552,7 @@ function Shift_update($shift)
|
||||||
* Update a shift by its external id.
|
* Update a shift by its external id.
|
||||||
*
|
*
|
||||||
* @param array $shift
|
* @param array $shift
|
||||||
* @return bool|null
|
* @return int
|
||||||
* @throws Exception
|
* @throws Exception
|
||||||
*/
|
*/
|
||||||
function Shift_update_by_psid($shift)
|
function Shift_update_by_psid($shift)
|
||||||
|
|
|
@ -197,11 +197,13 @@ function UserAngelType_create($user, $angeltype)
|
||||||
*/
|
*/
|
||||||
function UserAngelType($user_angeltype_id)
|
function UserAngelType($user_angeltype_id)
|
||||||
{
|
{
|
||||||
return DB::selectOne('
|
$angelType = DB::selectOne('
|
||||||
SELECT *
|
SELECT *
|
||||||
FROM `UserAngelTypes`
|
FROM `UserAngelTypes`
|
||||||
WHERE `id`=?
|
WHERE `id`=?
|
||||||
LIMIT 1', [$user_angeltype_id]);
|
LIMIT 1', [$user_angeltype_id]);
|
||||||
|
|
||||||
|
return empty($angelType) ? null : $angelType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -213,7 +215,7 @@ function UserAngelType($user_angeltype_id)
|
||||||
*/
|
*/
|
||||||
function UserAngelType_by_User_and_AngelType($user, $angeltype)
|
function UserAngelType_by_User_and_AngelType($user, $angeltype)
|
||||||
{
|
{
|
||||||
return DB::selectOne('
|
$angelType = DB::selectOne('
|
||||||
SELECT *
|
SELECT *
|
||||||
FROM `UserAngelTypes`
|
FROM `UserAngelTypes`
|
||||||
WHERE `user_id`=?
|
WHERE `user_id`=?
|
||||||
|
@ -225,6 +227,8 @@ function UserAngelType_by_User_and_AngelType($user, $angeltype)
|
||||||
$angeltype['id']
|
$angeltype['id']
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return empty($angelType) ? null : $angelType;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -45,10 +45,12 @@ function UserDriverLicense_valid($user_driver_license)
|
||||||
*/
|
*/
|
||||||
function UserDriverLicense($user_id)
|
function UserDriverLicense($user_id)
|
||||||
{
|
{
|
||||||
return DB::selectOne('
|
$driverLicense = DB::selectOne('
|
||||||
SELECT *
|
SELECT *
|
||||||
FROM `UserDriverLicenses`
|
FROM `UserDriverLicenses`
|
||||||
WHERE `user_id`=?', [$user_id]);
|
WHERE `user_id`=?', [$user_id]);
|
||||||
|
|
||||||
|
return empty($driverLicense) ? null : $driverLicense;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,22 +1,27 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
use Engelsystem\Database\Db;
|
use Engelsystem\Database\Db;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load a single work log entry.
|
* Load a single work log entry.
|
||||||
*
|
*
|
||||||
* @param int $user_worklog_id
|
* @param int $user_worklog_id
|
||||||
|
* @return array|null
|
||||||
*/
|
*/
|
||||||
function UserWorkLog($user_worklog_id)
|
function UserWorkLog($user_worklog_id)
|
||||||
{
|
{
|
||||||
return Db::selectOne("SELECT * FROM `UserWorkLog` WHERE `id`=?", [
|
$workLog = Db::selectOne("SELECT * FROM `UserWorkLog` WHERE `id`=?", [
|
||||||
$user_worklog_id
|
$user_worklog_id
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
return empty($workLog) ? null : $workLog;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns all work log entries for a user.
|
* Returns all work log entries for a user.
|
||||||
*
|
*
|
||||||
* @param User $user
|
* @param array $user
|
||||||
|
* @return array[]
|
||||||
*/
|
*/
|
||||||
function UserWorkLogsForUser($user)
|
function UserWorkLogsForUser($user)
|
||||||
{
|
{
|
||||||
|
@ -28,7 +33,8 @@ function UserWorkLogsForUser($user)
|
||||||
/**
|
/**
|
||||||
* Delete a work log entry.
|
* Delete a work log entry.
|
||||||
*
|
*
|
||||||
* @param UserWorkLog $userWorkLog
|
* @param $userWorkLog
|
||||||
|
* @return int
|
||||||
*/
|
*/
|
||||||
function UserWorkLog_delete($userWorkLog)
|
function UserWorkLog_delete($userWorkLog)
|
||||||
{
|
{
|
||||||
|
@ -37,7 +43,12 @@ function UserWorkLog_delete($userWorkLog)
|
||||||
$userWorkLog['id']
|
$userWorkLog['id']
|
||||||
]);
|
]);
|
||||||
|
|
||||||
engelsystem_log(sprintf('Delete work log for %s, %s hours, %s', User_Nick_render($user_source), $userWorkLog['work_hours'], $userWorkLog['comment']));
|
engelsystem_log(sprintf(
|
||||||
|
'Delete work log for %s, %s hours, %s',
|
||||||
|
User_Nick_render($user_source),
|
||||||
|
$userWorkLog['work_hours'],
|
||||||
|
$userWorkLog['comment']
|
||||||
|
));
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
@ -45,7 +56,8 @@ function UserWorkLog_delete($userWorkLog)
|
||||||
/**
|
/**
|
||||||
* Update work log entry (only work hours and comment)
|
* Update work log entry (only work hours and comment)
|
||||||
*
|
*
|
||||||
* @param UserWorkLog $userWorkLog
|
* @param $userWorkLog
|
||||||
|
* @return int
|
||||||
*/
|
*/
|
||||||
function UserWorkLog_update($userWorkLog)
|
function UserWorkLog_update($userWorkLog)
|
||||||
{
|
{
|
||||||
|
@ -62,7 +74,12 @@ function UserWorkLog_update($userWorkLog)
|
||||||
$userWorkLog['id']
|
$userWorkLog['id']
|
||||||
]);
|
]);
|
||||||
|
|
||||||
engelsystem_log(sprintf('Updated work log for %s, %s hours, %s', User_Nick_render($user_source), $userWorkLog['work_hours'], $userWorkLog['comment']));
|
engelsystem_log(sprintf(
|
||||||
|
'Updated work log for %s, %s hours, %s',
|
||||||
|
User_Nick_render($user_source),
|
||||||
|
$userWorkLog['work_hours'],
|
||||||
|
$userWorkLog['comment'])
|
||||||
|
);
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
@ -70,7 +87,8 @@ function UserWorkLog_update($userWorkLog)
|
||||||
/**
|
/**
|
||||||
* Create a new work log entry
|
* Create a new work log entry
|
||||||
*
|
*
|
||||||
* @param UserWorkLog $userWorkLog
|
* @param $userWorkLog
|
||||||
|
* @return bool
|
||||||
*/
|
*/
|
||||||
function UserWorkLog_create($userWorkLog)
|
function UserWorkLog_create($userWorkLog)
|
||||||
{
|
{
|
||||||
|
@ -95,7 +113,8 @@ function UserWorkLog_create($userWorkLog)
|
||||||
time()
|
time()
|
||||||
]);
|
]);
|
||||||
|
|
||||||
engelsystem_log(sprintf('Added work log entry for %s, %s hours, %s', User_Nick_render($user_source), $userWorkLog['work_hours'], $userWorkLog['comment']));
|
engelsystem_log(sprintf('Added work log entry for %s, %s hours, %s', User_Nick_render($user_source),
|
||||||
|
$userWorkLog['work_hours'], $userWorkLog['comment']));
|
||||||
|
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
@ -104,20 +123,19 @@ function UserWorkLog_create($userWorkLog)
|
||||||
* New user work log entry
|
* New user work log entry
|
||||||
*
|
*
|
||||||
* @param array[] $user
|
* @param array[] $user
|
||||||
|
* @return array
|
||||||
*/
|
*/
|
||||||
function UserWorkLog_new($user)
|
function UserWorkLog_new($user)
|
||||||
{
|
{
|
||||||
$work_date = parse_date('Y-m-d H:i', date('Y-m-d 00:00', time()));
|
$work_date = parse_date('Y-m-d H:i', date('Y-m-d 00:00', time()));
|
||||||
$event_config = EventConfig();
|
$event_config = EventConfig();
|
||||||
if (! empty($event_config['buildup_start_date'])) {
|
if (!empty($event_config['buildup_start_date'])) {
|
||||||
$work_date = parse_date('Y-m-d H:i', date('Y-m-d 00:00', $event_config['buildup_start_date']));
|
$work_date = parse_date('Y-m-d H:i', date('Y-m-d 00:00', $event_config['buildup_start_date']));
|
||||||
}
|
}
|
||||||
return [
|
return [
|
||||||
'user_id' => $user['UID'],
|
'user_id' => $user['UID'],
|
||||||
'work_timestamp' => $work_date,
|
'work_timestamp' => $work_date,
|
||||||
'work_hours' => 0,
|
'work_hours' => 0,
|
||||||
'comment' => ''
|
'comment' => ''
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
|
|
@ -22,8 +22,10 @@ function User_delete($user_id)
|
||||||
* Accounts only ended shifts.
|
* Accounts only ended shifts.
|
||||||
*
|
*
|
||||||
* @param array[] $user
|
* @param array[] $user
|
||||||
|
* @return int
|
||||||
*/
|
*/
|
||||||
function User_tshirt_score($user) {
|
function User_tshirt_score($user)
|
||||||
|
{
|
||||||
$shift_sum_formula = config('shift_sum_formula');
|
$shift_sum_formula = config('shift_sum_formula');
|
||||||
|
|
||||||
$result_shifts = DB::selectOne('
|
$result_shifts = DB::selectOne('
|
||||||
|
@ -43,7 +45,7 @@ function User_tshirt_score($user) {
|
||||||
LEFT JOIN `UserWorkLog` ON `User`.`UID` = `UserWorkLog`.`user_id`
|
LEFT JOIN `UserWorkLog` ON `User`.`UID` = `UserWorkLog`.`user_id`
|
||||||
WHERE `User`.`UID` = ?
|
WHERE `User`.`UID` = ?
|
||||||
AND `UserWorkLog`.`work_timestamp` < ?
|
AND `UserWorkLog`.`work_timestamp` < ?
|
||||||
',[
|
', [
|
||||||
$user['UID'],
|
$user['UID'],
|
||||||
time()
|
time()
|
||||||
]);
|
]);
|
||||||
|
@ -347,12 +349,12 @@ function User_validate_jabber($jabber)
|
||||||
*/
|
*/
|
||||||
function User_validate_planned_arrival_date($planned_arrival_date)
|
function User_validate_planned_arrival_date($planned_arrival_date)
|
||||||
{
|
{
|
||||||
if ($planned_arrival_date == null) {
|
if (is_null($planned_arrival_date)) {
|
||||||
// null is not okay
|
// null is not okay
|
||||||
return new ValidationResult(false, time());
|
return new ValidationResult(false, time());
|
||||||
}
|
}
|
||||||
$event_config = EventConfig();
|
$event_config = EventConfig();
|
||||||
if ($event_config == null) {
|
if (empty($event_config)) {
|
||||||
// Nothing to validate against
|
// Nothing to validate against
|
||||||
return new ValidationResult(true, $planned_arrival_date);
|
return new ValidationResult(true, $planned_arrival_date);
|
||||||
}
|
}
|
||||||
|
@ -376,7 +378,7 @@ function User_validate_planned_arrival_date($planned_arrival_date)
|
||||||
*/
|
*/
|
||||||
function User_validate_planned_departure_date($planned_arrival_date, $planned_departure_date)
|
function User_validate_planned_departure_date($planned_arrival_date, $planned_departure_date)
|
||||||
{
|
{
|
||||||
if ($planned_departure_date == null) {
|
if (is_null($planned_departure_date)) {
|
||||||
// null is okay
|
// null is okay
|
||||||
return new ValidationResult(true, null);
|
return new ValidationResult(true, null);
|
||||||
}
|
}
|
||||||
|
@ -385,7 +387,7 @@ function User_validate_planned_departure_date($planned_arrival_date, $planned_de
|
||||||
return new ValidationResult(false, $planned_arrival_date);
|
return new ValidationResult(false, $planned_arrival_date);
|
||||||
}
|
}
|
||||||
$event_config = EventConfig();
|
$event_config = EventConfig();
|
||||||
if ($event_config == null) {
|
if (empty($event_config)) {
|
||||||
// Nothing to validate against
|
// Nothing to validate against
|
||||||
return new ValidationResult(true, $planned_departure_date);
|
return new ValidationResult(true, $planned_departure_date);
|
||||||
}
|
}
|
||||||
|
@ -408,7 +410,9 @@ function User_validate_planned_departure_date($planned_arrival_date, $planned_de
|
||||||
*/
|
*/
|
||||||
function User($user_id)
|
function User($user_id)
|
||||||
{
|
{
|
||||||
return DB::selectOne('SELECT * FROM `User` WHERE `UID`=? LIMIT 1', [$user_id]);
|
$user = DB::selectOne('SELECT * FROM `User` WHERE `UID`=? LIMIT 1', [$user_id]);
|
||||||
|
|
||||||
|
return empty($user) ? null : $user;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -419,18 +423,22 @@ function User($user_id)
|
||||||
*/
|
*/
|
||||||
function User_by_api_key($api_key)
|
function User_by_api_key($api_key)
|
||||||
{
|
{
|
||||||
return DB::selectOne('SELECT * FROM `User` WHERE `api_key`=? LIMIT 1', [$api_key]);
|
$user = DB::selectOne('SELECT * FROM `User` WHERE `api_key`=? LIMIT 1', [$api_key]);
|
||||||
|
|
||||||
|
return empty($user) ? null : $user;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns User by email.
|
* Returns User by email.
|
||||||
*
|
*
|
||||||
* @param string $email
|
* @param string $email
|
||||||
* @return array|null Matching user, null on error
|
* @return array|null Matching user, null when not found
|
||||||
*/
|
*/
|
||||||
function User_by_email($email)
|
function User_by_email($email)
|
||||||
{
|
{
|
||||||
return DB::selectOne('SELECT * FROM `User` WHERE `email`=? LIMIT 1', [$email]);
|
$user = DB::selectOne('SELECT * FROM `User` WHERE `email`=? LIMIT 1', [$email]);
|
||||||
|
|
||||||
|
return empty($user) ? null : $user;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -441,7 +449,9 @@ function User_by_email($email)
|
||||||
*/
|
*/
|
||||||
function User_by_password_recovery_token($token)
|
function User_by_password_recovery_token($token)
|
||||||
{
|
{
|
||||||
return DB::selectOne('SELECT * FROM `User` WHERE `password_recovery_token`=? LIMIT 1', [$token]);
|
$user = DB::selectOne('SELECT * FROM `User` WHERE `password_recovery_token`=? LIMIT 1', [$token]);
|
||||||
|
|
||||||
|
return empty($user) ? null : $user;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -101,7 +101,7 @@ function admin_active()
|
||||||
if ($request->has('active') && preg_match('/^\d+$/', $request->input('active'))) {
|
if ($request->has('active') && preg_match('/^\d+$/', $request->input('active'))) {
|
||||||
$user_id = $request->input('active');
|
$user_id = $request->input('active');
|
||||||
$user_source = User($user_id);
|
$user_source = User($user_id);
|
||||||
if ($user_source != null) {
|
if (!empty($user_source)) {
|
||||||
DB::update('UPDATE `User` SET `Aktiv`=1 WHERE `UID`=? LIMIT 1', [$user_id]);
|
DB::update('UPDATE `User` SET `Aktiv`=1 WHERE `UID`=? LIMIT 1', [$user_id]);
|
||||||
engelsystem_log('User ' . User_Nick_render($user_source) . ' is active now.');
|
engelsystem_log('User ' . User_Nick_render($user_source) . ' is active now.');
|
||||||
$msg = success(_('Angel has been marked as active.'), true);
|
$msg = success(_('Angel has been marked as active.'), true);
|
||||||
|
@ -111,7 +111,7 @@ function admin_active()
|
||||||
} elseif ($request->has('not_active') && preg_match('/^\d+$/', $request->input('not_active'))) {
|
} elseif ($request->has('not_active') && preg_match('/^\d+$/', $request->input('not_active'))) {
|
||||||
$user_id = $request->input('not_active');
|
$user_id = $request->input('not_active');
|
||||||
$user_source = User($user_id);
|
$user_source = User($user_id);
|
||||||
if ($user_source != null) {
|
if (!empty($user_source)) {
|
||||||
DB::update('UPDATE `User` SET `Aktiv`=0 WHERE `UID`=? LIMIT 1', [$user_id]);
|
DB::update('UPDATE `User` SET `Aktiv`=0 WHERE `UID`=? LIMIT 1', [$user_id]);
|
||||||
engelsystem_log('User ' . User_Nick_render($user_source) . ' is NOT active now.');
|
engelsystem_log('User ' . User_Nick_render($user_source) . ' is NOT active now.');
|
||||||
$msg = success(_('Angel has been marked as not active.'), true);
|
$msg = success(_('Angel has been marked as not active.'), true);
|
||||||
|
@ -121,7 +121,7 @@ function admin_active()
|
||||||
} elseif ($request->has('tshirt') && preg_match('/^\d+$/', $request->input('tshirt'))) {
|
} elseif ($request->has('tshirt') && preg_match('/^\d+$/', $request->input('tshirt'))) {
|
||||||
$user_id = $request->input('tshirt');
|
$user_id = $request->input('tshirt');
|
||||||
$user_source = User($user_id);
|
$user_source = User($user_id);
|
||||||
if ($user_source != null) {
|
if (!empty($user_source)) {
|
||||||
DB::update('UPDATE `User` SET `Tshirt`=1 WHERE `UID`=? LIMIT 1', [$user_id]);
|
DB::update('UPDATE `User` SET `Tshirt`=1 WHERE `UID`=? LIMIT 1', [$user_id]);
|
||||||
engelsystem_log('User ' . User_Nick_render($user_source) . ' has tshirt now.');
|
engelsystem_log('User ' . User_Nick_render($user_source) . ' has tshirt now.');
|
||||||
$msg = success(_('Angel has got a t-shirt.'), true);
|
$msg = success(_('Angel has got a t-shirt.'), true);
|
||||||
|
@ -131,7 +131,7 @@ function admin_active()
|
||||||
} elseif ($request->has('not_tshirt') && preg_match('/^\d+$/', $request->input('not_tshirt'))) {
|
} elseif ($request->has('not_tshirt') && preg_match('/^\d+$/', $request->input('not_tshirt'))) {
|
||||||
$user_id = $request->input('not_tshirt');
|
$user_id = $request->input('not_tshirt');
|
||||||
$user_source = User($user_id);
|
$user_source = User($user_id);
|
||||||
if ($user_source != null) {
|
if (!empty($user_source)) {
|
||||||
DB::update('UPDATE `User` SET `Tshirt`=0 WHERE `UID`=? LIMIT 1', [$user_id]);
|
DB::update('UPDATE `User` SET `Tshirt`=0 WHERE `UID`=? LIMIT 1', [$user_id]);
|
||||||
engelsystem_log('User ' . User_Nick_render($user_source) . ' has NO tshirt.');
|
engelsystem_log('User ' . User_Nick_render($user_source) . ' has NO tshirt.');
|
||||||
$msg = success(_('Angel has got no t-shirt.'), true);
|
$msg = success(_('Angel has got no t-shirt.'), true);
|
||||||
|
@ -252,8 +252,8 @@ function admin_active()
|
||||||
$gc = array_shift($gc);
|
$gc = array_shift($gc);
|
||||||
|
|
||||||
$shirt_statistics[] = [
|
$shirt_statistics[] = [
|
||||||
'size' => $size,
|
'size' => $size,
|
||||||
'given' => (int)$gc
|
'given' => (int)$gc
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -261,8 +261,8 @@ function admin_active()
|
||||||
$shirtCount = User_tshirts_count();
|
$shirtCount = User_tshirts_count();
|
||||||
|
|
||||||
$shirt_statistics[] = [
|
$shirt_statistics[] = [
|
||||||
'size' => '<b>' . _('Sum') . '</b>',
|
'size' => '<b>' . _('Sum') . '</b>',
|
||||||
'given' => '<b>' . $shirtCount . '</b>'
|
'given' => '<b>' . $shirtCount . '</b>'
|
||||||
];
|
];
|
||||||
|
|
||||||
return page_with_title(admin_active_title(), [
|
return page_with_title(admin_active_title(), [
|
||||||
|
@ -288,8 +288,8 @@ function admin_active()
|
||||||
], $matched_users),
|
], $matched_users),
|
||||||
'<h2>' . _('Shirt statistics') . '</h2>',
|
'<h2>' . _('Shirt statistics') . '</h2>',
|
||||||
table([
|
table([
|
||||||
'size' => _('Size'),
|
'size' => _('Size'),
|
||||||
'given' => _('Given shirts')
|
'given' => _('Given shirts')
|
||||||
], $shirt_statistics)
|
], $shirt_statistics)
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,7 +27,7 @@ function admin_arrive()
|
||||||
if ($request->has('reset') && preg_match('/^\d+$/', $request->input('reset'))) {
|
if ($request->has('reset') && preg_match('/^\d+$/', $request->input('reset'))) {
|
||||||
$user_id = $request->input('reset');
|
$user_id = $request->input('reset');
|
||||||
$user_source = User($user_id);
|
$user_source = User($user_id);
|
||||||
if ($user_source != null) {
|
if (!empty($user_source)) {
|
||||||
DB::update('
|
DB::update('
|
||||||
UPDATE `User`
|
UPDATE `User`
|
||||||
SET `Gekommen`=0, `arrival_date` = NULL
|
SET `Gekommen`=0, `arrival_date` = NULL
|
||||||
|
@ -43,7 +43,7 @@ function admin_arrive()
|
||||||
} elseif ($request->has('arrived') && preg_match('/^\d+$/', $request->input('arrived'))) {
|
} elseif ($request->has('arrived') && preg_match('/^\d+$/', $request->input('arrived'))) {
|
||||||
$user_id = $request->input('arrived');
|
$user_id = $request->input('arrived');
|
||||||
$user_source = User($user_id);
|
$user_source = User($user_id);
|
||||||
if ($user_source != null) {
|
if (!empty($user_source)) {
|
||||||
DB::update('
|
DB::update('
|
||||||
UPDATE `User`
|
UPDATE `User`
|
||||||
SET `Gekommen`=1, `arrival_date`=?
|
SET `Gekommen`=1, `arrival_date`=?
|
||||||
|
@ -84,7 +84,7 @@ function admin_arrive()
|
||||||
}
|
}
|
||||||
|
|
||||||
$usr['nick'] = User_Nick_render($usr);
|
$usr['nick'] = User_Nick_render($usr);
|
||||||
if ($usr['planned_departure_date'] != null) {
|
if (!is_null($usr['planned_departure_date'])) {
|
||||||
$usr['rendered_planned_departure_date'] = date('Y-m-d', $usr['planned_departure_date']);
|
$usr['rendered_planned_departure_date'] = date('Y-m-d', $usr['planned_departure_date']);
|
||||||
} else {
|
} else {
|
||||||
$usr['rendered_planned_departure_date'] = '-';
|
$usr['rendered_planned_departure_date'] = '-';
|
||||||
|
@ -110,7 +110,7 @@ function admin_arrive()
|
||||||
$arrival_count_at_day[$day]++;
|
$arrival_count_at_day[$day]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($usr['planned_arrival_date'] != null) {
|
if (!is_null($usr['planned_arrival_date'])) {
|
||||||
$day = date('Y-m-d', $usr['planned_arrival_date']);
|
$day = date('Y-m-d', $usr['planned_arrival_date']);
|
||||||
if (!isset($planned_arrival_count_at_day[$day])) {
|
if (!isset($planned_arrival_count_at_day[$day])) {
|
||||||
$planned_arrival_count_at_day[$day] = 0;
|
$planned_arrival_count_at_day[$day] = 0;
|
||||||
|
@ -118,7 +118,7 @@ function admin_arrive()
|
||||||
$planned_arrival_count_at_day[$day]++;
|
$planned_arrival_count_at_day[$day]++;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($usr['planned_departure_date'] != null && $usr['Gekommen'] == 1) {
|
if (!is_null($usr['planned_departure_date']) && $usr['Gekommen'] == 1) {
|
||||||
$day = date('Y-m-d', $usr['planned_departure_date']);
|
$day = date('Y-m-d', $usr['planned_departure_date']);
|
||||||
if (!isset($planned_departure_count_at_day[$day])) {
|
if (!isset($planned_departure_count_at_day[$day])) {
|
||||||
$planned_departure_count_at_day[$day] = 0;
|
$planned_departure_count_at_day[$day] = 0;
|
||||||
|
|
|
@ -111,7 +111,7 @@ function admin_questions()
|
||||||
'SELECT * FROM `Questions` WHERE `QID`=? LIMIT 1',
|
'SELECT * FROM `Questions` WHERE `QID`=? LIMIT 1',
|
||||||
[$question_id]
|
[$question_id]
|
||||||
);
|
);
|
||||||
if (!empty($question) && $question['AID'] == null) {
|
if (!empty($question) && empty($question['AID'])) {
|
||||||
$answer = trim(
|
$answer = trim(
|
||||||
preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui",
|
preg_replace("/([^\p{L}\p{P}\p{Z}\p{N}\n]{1,})/ui",
|
||||||
'',
|
'',
|
||||||
|
|
|
@ -55,7 +55,7 @@ function admin_rooms()
|
||||||
|
|
||||||
if (test_request_int('id')) {
|
if (test_request_int('id')) {
|
||||||
$room = Room($request->input('id'));
|
$room = Room($request->input('id'));
|
||||||
if ($room == null) {
|
if (empty($room)) {
|
||||||
redirect(page_link_to('admin_rooms'));
|
redirect(page_link_to('admin_rooms'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +127,7 @@ function admin_rooms()
|
||||||
$needed_angeltype_info = [];
|
$needed_angeltype_info = [];
|
||||||
foreach ($angeltypes_count as $angeltype_id => $angeltype_count) {
|
foreach ($angeltypes_count as $angeltype_id => $angeltype_count) {
|
||||||
$angeltype = AngelType($angeltype_id);
|
$angeltype = AngelType($angeltype_id);
|
||||||
if ($angeltype != null) {
|
if (!empty($angeltype)) {
|
||||||
NeededAngelType_add(null, $angeltype_id, $room_id, $angeltype_count);
|
NeededAngelType_add(null, $angeltype_id, $room_id, $angeltype_count);
|
||||||
if ($angeltype_count > 0) {
|
if ($angeltype_count > 0) {
|
||||||
$needed_angeltype_info[] = $angeltype['name'] . ': ' . $angeltype_count;
|
$needed_angeltype_info[] = $angeltype['name'] . ': ' . $angeltype_count;
|
||||||
|
|
|
@ -53,7 +53,7 @@ function admin_shifts()
|
||||||
if ($request->has('preview') || $request->has('back')) {
|
if ($request->has('preview') || $request->has('back')) {
|
||||||
if ($request->has('shifttype_id')) {
|
if ($request->has('shifttype_id')) {
|
||||||
$shifttype = ShiftType($request->input('shifttype_id'));
|
$shifttype = ShiftType($request->input('shifttype_id'));
|
||||||
if ($shifttype == null) {
|
if (empty($shifttype)) {
|
||||||
$valid = false;
|
$valid = false;
|
||||||
error(_('Please select a shift type.'));
|
error(_('Please select a shift type.'));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -34,7 +34,7 @@ function admin_user()
|
||||||
$user_id = $request->input('id');
|
$user_id = $request->input('id');
|
||||||
if (!$request->has('action')) {
|
if (!$request->has('action')) {
|
||||||
$user_source = User($user_id);
|
$user_source = User($user_id);
|
||||||
if ($user_source == null) {
|
if (empty($user_source)) {
|
||||||
error(_('This user does not exist.'));
|
error(_('This user does not exist.'));
|
||||||
redirect(users_link());
|
redirect(users_link());
|
||||||
}
|
}
|
||||||
|
|
|
@ -279,7 +279,7 @@ function guest_register()
|
||||||
}
|
}
|
||||||
|
|
||||||
// If a welcome message is present, display registration success page.
|
// If a welcome message is present, display registration success page.
|
||||||
if ($event_config != null && $event_config['event_welcome_msg'] != null) {
|
if (!empty($event_config) && !empty($event_config['event_welcome_msg'])) {
|
||||||
return User_registration_success_view($event_config['event_welcome_msg']);
|
return User_registration_success_view($event_config['event_welcome_msg']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -289,7 +289,7 @@ function guest_register()
|
||||||
|
|
||||||
$buildup_start_date = time();
|
$buildup_start_date = time();
|
||||||
$teardown_end_date = null;
|
$teardown_end_date = null;
|
||||||
if ($event_config != null) {
|
if (!empty($event_config)) {
|
||||||
if (isset($event_config['buildup_start_date'])) {
|
if (isset($event_config['buildup_start_date'])) {
|
||||||
$buildup_start_date = $event_config['buildup_start_date'];
|
$buildup_start_date = $event_config['buildup_start_date'];
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,7 @@ function user_atom()
|
||||||
$key = $request->input('key');
|
$key = $request->input('key');
|
||||||
|
|
||||||
$user = User_by_api_key($key);
|
$user = User_by_api_key($key);
|
||||||
if ($user == null) {
|
if (empty($user)) {
|
||||||
engelsystem_error('Key invalid.');
|
engelsystem_error('Key invalid.');
|
||||||
}
|
}
|
||||||
if (!in_array('atom', privileges_for_user($user['UID']))) {
|
if (!in_array('atom', privileges_for_user($user['UID']))) {
|
||||||
|
|
|
@ -14,7 +14,7 @@ function user_ical()
|
||||||
$key = $request->input('key');
|
$key = $request->input('key');
|
||||||
|
|
||||||
$user = User_by_api_key($key);
|
$user = User_by_api_key($key);
|
||||||
if ($user == null) {
|
if (empty($user)) {
|
||||||
engelsystem_error('Key invalid.');
|
engelsystem_error('Key invalid.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,6 @@ function user_myshifts()
|
||||||
}
|
}
|
||||||
|
|
||||||
$shifts_user = DB::selectOne('SELECT * FROM `User` WHERE `UID`=? LIMIT 1', [$shift_entry_id]);
|
$shifts_user = DB::selectOne('SELECT * FROM `User` WHERE `UID`=? LIMIT 1', [$shift_entry_id]);
|
||||||
|
|
||||||
if ($request->has('reset')) {
|
if ($request->has('reset')) {
|
||||||
if ($request->input('reset') == 'ack') {
|
if ($request->input('reset') == 'ack') {
|
||||||
User_reset_api_key($user);
|
User_reset_api_key($user);
|
||||||
|
@ -72,7 +71,7 @@ function user_myshifts()
|
||||||
$shifts_user['UID'],
|
$shifts_user['UID'],
|
||||||
]
|
]
|
||||||
);
|
);
|
||||||
if (count($shift) > 0) {
|
if (!empty($shift)) {
|
||||||
$freeloaded = $shift['freeloaded'];
|
$freeloaded = $shift['freeloaded'];
|
||||||
$freeload_comment = $shift['freeload_comment'];
|
$freeload_comment = $shift['freeload_comment'];
|
||||||
|
|
||||||
|
|
|
@ -215,7 +215,7 @@ function user_settings()
|
||||||
$buildup_start_date = null;
|
$buildup_start_date = null;
|
||||||
$teardown_end_date = null;
|
$teardown_end_date = null;
|
||||||
$event_config = EventConfig();
|
$event_config = EventConfig();
|
||||||
if ($event_config != null) {
|
if (!empty($event_config)) {
|
||||||
if (isset($event_config['buildup_start_date'])) {
|
if (isset($event_config['buildup_start_date'])) {
|
||||||
$buildup_start_date = $event_config['buildup_start_date'];
|
$buildup_start_date = $event_config['buildup_start_date'];
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,7 +47,7 @@ function user_shifts()
|
||||||
function update_ShiftsFilter_timerange(ShiftsFilter $shiftsFilter, $days)
|
function update_ShiftsFilter_timerange(ShiftsFilter $shiftsFilter, $days)
|
||||||
{
|
{
|
||||||
$start_time = $shiftsFilter->getStartTime();
|
$start_time = $shiftsFilter->getStartTime();
|
||||||
if ($start_time == null) {
|
if (is_null($start_time)) {
|
||||||
$start_time = time();
|
$start_time = time();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,18 +177,19 @@ function view_user_shifts()
|
||||||
$rooms = load_rooms();
|
$rooms = load_rooms();
|
||||||
$types = load_types();
|
$types = load_types();
|
||||||
|
|
||||||
if (!$session->has('ShiftsFilter')) {
|
if (!$session->has('shifts-filter')) {
|
||||||
$room_ids = [
|
$room_ids = [
|
||||||
$rooms[0]['id']
|
$rooms[0]['id']
|
||||||
];
|
];
|
||||||
$type_ids = array_map('get_ids_from_array', $types);
|
$type_ids = array_map('get_ids_from_array', $types);
|
||||||
$shiftsFilter = new ShiftsFilter(in_array('user_shifts_admin', $privileges), $room_ids, $type_ids);
|
$shiftsFilter = new ShiftsFilter(in_array('user_shifts_admin', $privileges), $room_ids, $type_ids);
|
||||||
$session->set('ShiftsFilter', $shiftsFilter);
|
$session->set('shifts-filter', $shiftsFilter->sessionExport());
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @var ShiftsFilter $shiftsFilter */
|
$shiftsFilter = new ShiftsFilter();
|
||||||
$shiftsFilter = $session->get('ShiftsFilter');
|
$shiftsFilter->sessionImport($session->get('shifts-filter'));
|
||||||
update_ShiftsFilter($shiftsFilter, in_array('user_shifts_admin', $privileges), $days);
|
update_ShiftsFilter($shiftsFilter, in_array('user_shifts_admin', $privileges), $days);
|
||||||
|
$session->set('shifts-filter', $shiftsFilter->sessionExport());
|
||||||
|
|
||||||
$shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter);
|
$shiftCalendarRenderer = shiftCalendarRendererByShiftFilter($shiftsFilter);
|
||||||
|
|
||||||
|
|
|
@ -42,9 +42,10 @@ function check_request_datetime($date_name, $time_name, $allowed_days, $default_
|
||||||
function parse_date($pattern, $value)
|
function parse_date($pattern, $value)
|
||||||
{
|
{
|
||||||
$datetime = DateTime::createFromFormat($pattern, trim($value));
|
$datetime = DateTime::createFromFormat($pattern, trim($value));
|
||||||
if ($datetime == null) {
|
if (!$datetime) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return $datetime->getTimestamp();
|
return $datetime->getTimestamp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -28,9 +28,9 @@ function AngelType_name_render($angeltype)
|
||||||
*/
|
*/
|
||||||
function AngelType_render_membership($user_angeltype)
|
function AngelType_render_membership($user_angeltype)
|
||||||
{
|
{
|
||||||
if ($user_angeltype['user_angeltype_id'] != null) {
|
if (!empty($user_angeltype['user_angeltype_id'])) {
|
||||||
if ($user_angeltype['restricted']) {
|
if ($user_angeltype['restricted']) {
|
||||||
if ($user_angeltype['confirm_user_id'] == null) {
|
if (empty($user_angeltype['confirm_user_id'])) {
|
||||||
return glyph('lock') . _('Unconfirmed');
|
return glyph('lock') . _('Unconfirmed');
|
||||||
} elseif ($user_angeltype['supporter']) {
|
} elseif ($user_angeltype['supporter']) {
|
||||||
return glyph_bool(true) . _('Supporter');
|
return glyph_bool(true) . _('Supporter');
|
||||||
|
@ -145,18 +145,18 @@ function AngelType_view_buttons($angeltype, $user_angeltype, $admin_angeltypes,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($user_angeltype == null) {
|
if (is_null($user_angeltype)) {
|
||||||
$buttons[] = button(
|
$buttons[] = button(
|
||||||
page_link_to('user_angeltypes', ['action' => 'add', 'angeltype_id' => $angeltype['id']]),
|
page_link_to('user_angeltypes', ['action' => 'add', 'angeltype_id' => $angeltype['id']]),
|
||||||
_('join'),
|
_('join'),
|
||||||
'add'
|
'add'
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
if ($angeltype['requires_driver_license'] && $user_driver_license == null) {
|
if ($angeltype['requires_driver_license'] && empty($user_driver_license)) {
|
||||||
error(_('This angeltype requires a driver license. Please enter your driver license information!'));
|
error(_('This angeltype requires a driver license. Please enter your driver license information!'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($angeltype['restricted'] && $user_angeltype['confirm_user_id'] == null) {
|
if ($angeltype['restricted'] && empty($user_angeltype['confirm_user_id'])) {
|
||||||
error(sprintf(
|
error(sprintf(
|
||||||
_('You are unconfirmed for this angeltype. Please go to the introduction for %s to get confirmed.'),
|
_('You are unconfirmed for this angeltype. Please go to the introduction for %s to get confirmed.'),
|
||||||
$angeltype['name']
|
$angeltype['name']
|
||||||
|
@ -212,7 +212,7 @@ function AngelType_view_members($angeltype, $members, $admin_user_angeltypes, $a
|
||||||
$member['has_license_forklift'] = glyph_bool($member['has_license_forklift']);
|
$member['has_license_forklift'] = glyph_bool($member['has_license_forklift']);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($angeltype['restricted'] && $member['confirm_user_id'] == null) {
|
if ($angeltype['restricted'] && empty($member['confirm_user_id'])) {
|
||||||
$member['actions'] = table_buttons([
|
$member['actions'] = table_buttons([
|
||||||
button(
|
button(
|
||||||
page_link_to(
|
page_link_to(
|
||||||
|
@ -526,7 +526,7 @@ function AngelTypes_about_view_angeltype($angeltype)
|
||||||
|
|
||||||
if (isset($angeltype['user_angeltype_id'])) {
|
if (isset($angeltype['user_angeltype_id'])) {
|
||||||
$buttons = [];
|
$buttons = [];
|
||||||
if ($angeltype['user_angeltype_id'] != null) {
|
if (!empty($angeltype['user_angeltype_id'])) {
|
||||||
$buttons[] = button(
|
$buttons[] = button(
|
||||||
page_link_to(
|
page_link_to(
|
||||||
'user_angeltypes',
|
'user_angeltypes',
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
*/
|
*/
|
||||||
function EventConfig_countdown_page($event_config)
|
function EventConfig_countdown_page($event_config)
|
||||||
{
|
{
|
||||||
if ($event_config == null) {
|
if (empty($event_config)) {
|
||||||
return div('col-md-12 text-center', [
|
return div('col-md-12 text-center', [
|
||||||
heading(sprintf(_('Welcome to the %s!'), '<span class="icon-icon_angel"></span> ENGELSYSTEM'), 2)
|
heading(sprintf(_('Welcome to the %s!'), '<span class="icon-icon_angel"></span> ENGELSYSTEM'), 2)
|
||||||
]);
|
]);
|
||||||
|
@ -16,7 +16,7 @@ function EventConfig_countdown_page($event_config)
|
||||||
|
|
||||||
$elements = [];
|
$elements = [];
|
||||||
|
|
||||||
if ($event_config['event_name'] != null) {
|
if (!is_null($event_config['event_name'])) {
|
||||||
$elements[] = div('col-sm-12 text-center', [
|
$elements[] = div('col-sm-12 text-center', [
|
||||||
heading(sprintf(
|
heading(sprintf(
|
||||||
_('Welcome to the %s!'),
|
_('Welcome to the %s!'),
|
||||||
|
@ -25,7 +25,7 @@ function EventConfig_countdown_page($event_config)
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($event_config['buildup_start_date'] != null && time() < $event_config['buildup_start_date']) {
|
if (!is_null($event_config['buildup_start_date']) && time() < $event_config['buildup_start_date']) {
|
||||||
$elements[] = div('col-sm-3 text-center hidden-xs', [
|
$elements[] = div('col-sm-3 text-center hidden-xs', [
|
||||||
heading(_('Buildup starts'), 4),
|
heading(_('Buildup starts'), 4),
|
||||||
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['buildup_start_date'] . '">%c</span>',
|
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['buildup_start_date'] . '">%c</span>',
|
||||||
|
@ -33,7 +33,7 @@ function EventConfig_countdown_page($event_config)
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($event_config['event_start_date'] != null && time() < $event_config['event_start_date']) {
|
if (!is_null($event_config['event_start_date']) && time() < $event_config['event_start_date']) {
|
||||||
$elements[] = div('col-sm-3 text-center hidden-xs', [
|
$elements[] = div('col-sm-3 text-center hidden-xs', [
|
||||||
heading(_('Event starts'), 4),
|
heading(_('Event starts'), 4),
|
||||||
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_start_date'] . '">%c</span>',
|
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_start_date'] . '">%c</span>',
|
||||||
|
@ -41,7 +41,7 @@ function EventConfig_countdown_page($event_config)
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($event_config['event_end_date'] != null && time() < $event_config['event_end_date']) {
|
if (!is_null($event_config['event_end_date']) && time() < $event_config['event_end_date']) {
|
||||||
$elements[] = div('col-sm-3 text-center hidden-xs', [
|
$elements[] = div('col-sm-3 text-center hidden-xs', [
|
||||||
heading(_('Event ends'), 4),
|
heading(_('Event ends'), 4),
|
||||||
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_end_date'] . '">%c</span>',
|
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['event_end_date'] . '">%c</span>',
|
||||||
|
@ -49,7 +49,7 @@ function EventConfig_countdown_page($event_config)
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($event_config['teardown_end_date'] != null && time() < $event_config['teardown_end_date']) {
|
if (!is_null($event_config['teardown_end_date']) && time() < $event_config['teardown_end_date']) {
|
||||||
$elements[] = div('col-sm-3 text-center hidden-xs', [
|
$elements[] = div('col-sm-3 text-center hidden-xs', [
|
||||||
heading(_('Teardown ends'), 4),
|
heading(_('Teardown ends'), 4),
|
||||||
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['teardown_end_date'] . '">%c</span>',
|
'<span class="moment-countdown text-big" data-timestamp="' . $event_config['teardown_end_date'] . '">%c</span>',
|
||||||
|
@ -68,15 +68,15 @@ function EventConfig_countdown_page($event_config)
|
||||||
*/
|
*/
|
||||||
function EventConfig_info($event_config)
|
function EventConfig_info($event_config)
|
||||||
{
|
{
|
||||||
if ($event_config == null) {
|
if (empty($event_config)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
// Event name, start+end date are set
|
// Event name, start+end date are set
|
||||||
if (
|
if (
|
||||||
$event_config['event_name'] != null
|
!is_null($event_config['event_name'])
|
||||||
&& $event_config['event_start_date'] != null
|
&& !is_null($event_config['event_start_date'])
|
||||||
&& $event_config['event_end_date'] != null
|
&& !is_null($event_config['event_end_date'])
|
||||||
) {
|
) {
|
||||||
return sprintf(
|
return sprintf(
|
||||||
_('%s, from %s to %s'),
|
_('%s, from %s to %s'),
|
||||||
|
@ -87,7 +87,7 @@ function EventConfig_info($event_config)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Event name, start date are set
|
// Event name, start date are set
|
||||||
if ($event_config['event_name'] != null && $event_config['event_start_date'] != null) {
|
if (!is_null($event_config['event_name']) && !is_null($event_config['event_start_date'])) {
|
||||||
return sprintf(
|
return sprintf(
|
||||||
_('%s, starting %s'), $event_config['event_name'],
|
_('%s, starting %s'), $event_config['event_name'],
|
||||||
date(_('Y-m-d'), $event_config['event_start_date'])
|
date(_('Y-m-d'), $event_config['event_start_date'])
|
||||||
|
@ -95,7 +95,7 @@ function EventConfig_info($event_config)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Event start+end date are set
|
// Event start+end date are set
|
||||||
if ($event_config['event_start_date'] != null && $event_config['event_end_date'] != null) {
|
if (!is_null($event_config['event_start_date']) && !is_null($event_config['event_end_date'])) {
|
||||||
return sprintf(
|
return sprintf(
|
||||||
_('Event from %s to %s'),
|
_('Event from %s to %s'),
|
||||||
date(_('Y-m-d'), $event_config['event_start_date']),
|
date(_('Y-m-d'), $event_config['event_start_date']),
|
||||||
|
@ -104,7 +104,7 @@ function EventConfig_info($event_config)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Only event name is set
|
// Only event name is set
|
||||||
if ($event_config['event_name'] != null) {
|
if (!is_null($event_config['event_name'])) {
|
||||||
return sprintf($event_config['event_name']);
|
return sprintf($event_config['event_name']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -129,7 +129,7 @@ class ShiftCalendarRenderer
|
||||||
*/
|
*/
|
||||||
public function getBlocksPerSlot()
|
public function getBlocksPerSlot()
|
||||||
{
|
{
|
||||||
if ($this->blocksPerSlot == null) {
|
if (is_null($this->blocksPerSlot)) {
|
||||||
$this->blocksPerSlot = $this->calcBlocksPerSlot();
|
$this->blocksPerSlot = $this->calcBlocksPerSlot();
|
||||||
}
|
}
|
||||||
return $this->blocksPerSlot;
|
return $this->blocksPerSlot;
|
||||||
|
|
|
@ -116,7 +116,7 @@ class ShiftCalendarShiftRenderer
|
||||||
$angeltype,
|
$angeltype,
|
||||||
$user
|
$user
|
||||||
);
|
);
|
||||||
if ($shift_signup_state == null) {
|
if (is_null($shift_signup_state)) {
|
||||||
$shift_signup_state = $angeltype_signup_state;
|
$shift_signup_state = $angeltype_signup_state;
|
||||||
} else {
|
} else {
|
||||||
$shift_signup_state->combineWith($angeltype_signup_state);
|
$shift_signup_state->combineWith($angeltype_signup_state);
|
||||||
|
@ -124,7 +124,7 @@ class ShiftCalendarShiftRenderer
|
||||||
$html .= $angeltype_html;
|
$html .= $angeltype_html;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($shift_signup_state == null) {
|
if (is_null($shift_signup_state)) {
|
||||||
$shift_signup_state = new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, 0);
|
$shift_signup_state = new ShiftSignupState(ShiftSignupState::SHIFT_ENDED, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,14 +50,14 @@ function Shift_view_header($shift, $room)
|
||||||
function Shift_editor_info_render($shift)
|
function Shift_editor_info_render($shift)
|
||||||
{
|
{
|
||||||
$info = [];
|
$info = [];
|
||||||
if ($shift['created_by_user_id'] != null) {
|
if (!empty($shift['created_by_user_id'])) {
|
||||||
$info[] = sprintf(
|
$info[] = sprintf(
|
||||||
glyph('plus') . _('created at %s by %s'),
|
glyph('plus') . _('created at %s by %s'),
|
||||||
date('Y-m-d H:i', $shift['created_at_timestamp']),
|
date('Y-m-d H:i', $shift['created_at_timestamp']),
|
||||||
User_Nick_render(User($shift['created_by_user_id']))
|
User_Nick_render(User($shift['created_by_user_id']))
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
if ($shift['edited_by_user_id'] != null) {
|
if (!empty($shift['edited_by_user_id'])) {
|
||||||
$info[] = sprintf(
|
$info[] = sprintf(
|
||||||
glyph('pencil') . _('edited at %s by %s'),
|
glyph('pencil') . _('edited at %s by %s'),
|
||||||
date('Y-m-d H:i', $shift['edited_at_timestamp']),
|
date('Y-m-d H:i', $shift['edited_at_timestamp']),
|
||||||
|
@ -77,13 +77,13 @@ function Shift_signup_button_render($shift, $angeltype, $user_angeltype = null)
|
||||||
{
|
{
|
||||||
global $user;
|
global $user;
|
||||||
|
|
||||||
if ($user_angeltype == null) {
|
if (empty($user_angeltype)) {
|
||||||
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
|
$user_angeltype = UserAngelType_by_User_and_AngelType($user, $angeltype);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($angeltype['shift_signup_state']->isSignupAllowed()) {
|
if ($angeltype['shift_signup_state']->isSignupAllowed()) {
|
||||||
return button(shift_entry_create_link($shift, $angeltype), _('Sign up'));
|
return button(shift_entry_create_link($shift, $angeltype), _('Sign up'));
|
||||||
} elseif ($user_angeltype == null) {
|
} elseif (empty($user_angeltype)) {
|
||||||
return button(
|
return button(
|
||||||
page_link_to('angeltypes', ['action' => 'view', 'angeltype_id' => $angeltype['id']]),
|
page_link_to('angeltypes', ['action' => 'view', 'angeltype_id' => $angeltype['id']]),
|
||||||
sprintf(_('Become %s'),
|
sprintf(_('Become %s'),
|
||||||
|
|
|
@ -36,7 +36,7 @@ class UserHintsRenderer
|
||||||
*/
|
*/
|
||||||
public function addHint($hint, $important = false)
|
public function addHint($hint, $important = false)
|
||||||
{
|
{
|
||||||
if ($hint != null && $hint != '') {
|
if (!empty($hint)) {
|
||||||
if ($important) {
|
if ($important) {
|
||||||
$this->important = true;
|
$this->important = true;
|
||||||
$this->hints[] = error($hint, true);
|
$this->hints[] = error($hint, true);
|
||||||
|
|
|
@ -2,13 +2,18 @@
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delete work log entry.
|
* Delete work log entry.
|
||||||
* @param User $user_source
|
*
|
||||||
* @param UserWorkLog $userWorkLog
|
* @param array $user_source
|
||||||
|
* @param array $userWorkLog
|
||||||
|
* @return string
|
||||||
*/
|
*/
|
||||||
function UserWorkLog_delete_view($user_source, $userWorkLog)
|
function UserWorkLog_delete_view($user_source, $userWorkLog)
|
||||||
{
|
{
|
||||||
return page_with_title(UserWorkLog_delete_title(), [
|
return page_with_title(UserWorkLog_delete_title(), [
|
||||||
info(sprintf(_('Do you want to delete the worklog entry for %s?'), User_Nick_render($user_source)), true),
|
info(sprintf(
|
||||||
|
_('Do you want to delete the worklog entry for %s?'),
|
||||||
|
User_Nick_render($user_source)
|
||||||
|
), true),
|
||||||
buttons([
|
buttons([
|
||||||
button(user_link($user_source), glyph('remove') . _('cancel')),
|
button(user_link($user_source), glyph('remove') . _('cancel')),
|
||||||
button(user_worklog_delete_link($userWorkLog, [
|
button(user_worklog_delete_link($userWorkLog, [
|
||||||
|
@ -29,8 +34,9 @@ function UserWorkLog_delete_title()
|
||||||
/**
|
/**
|
||||||
* Render edit table.
|
* Render edit table.
|
||||||
*
|
*
|
||||||
* @param User $user_source
|
* @param array $user_source
|
||||||
* @param UserWorkLog $userWorkLog
|
* @param array $userWorkLog
|
||||||
|
* @return string
|
||||||
*/
|
*/
|
||||||
function UserWorkLog_edit_form($user_source, $userWorkLog)
|
function UserWorkLog_edit_form($user_source, $userWorkLog)
|
||||||
{
|
{
|
||||||
|
@ -46,8 +52,9 @@ function UserWorkLog_edit_form($user_source, $userWorkLog)
|
||||||
/**
|
/**
|
||||||
* Form for edit a user work log entry.
|
* Form for edit a user work log entry.
|
||||||
*
|
*
|
||||||
* @param User $user_source
|
* @param array $user_source
|
||||||
* @param UserWorkLog $userWorkLog
|
* @param array $userWorkLog
|
||||||
|
* @return string
|
||||||
*/
|
*/
|
||||||
function UserWorkLog_edit_view($user_source, $userWorkLog)
|
function UserWorkLog_edit_view($user_source, $userWorkLog)
|
||||||
{
|
{
|
||||||
|
@ -63,8 +70,9 @@ function UserWorkLog_edit_view($user_source, $userWorkLog)
|
||||||
/**
|
/**
|
||||||
* Form for adding a user work log entry.
|
* Form for adding a user work log entry.
|
||||||
*
|
*
|
||||||
* @param User $user_source
|
* @param array $user_source
|
||||||
* @param UserWorkLog $userWorkLog
|
* @param array $userWorkLog
|
||||||
|
* @return string
|
||||||
*/
|
*/
|
||||||
function UserWorkLog_add_view($user_source, $userWorkLog)
|
function UserWorkLog_add_view($user_source, $userWorkLog)
|
||||||
{
|
{
|
||||||
|
@ -92,5 +100,3 @@ function UserWorkLog_add_title()
|
||||||
{
|
{
|
||||||
return _('Add work log entry');
|
return _('Add work log entry');
|
||||||
}
|
}
|
||||||
|
|
||||||
?>
|
|
|
@ -406,10 +406,21 @@ function User_view_myshift($shift, $user_source, $its_me)
|
||||||
* @param array[] $shifts
|
* @param array[] $shifts
|
||||||
* @param array $user_source
|
* @param array $user_source
|
||||||
* @param bool $its_me
|
* @param bool $its_me
|
||||||
|
* @param int $tshirt_score
|
||||||
|
* @param bool $tshirt_admin
|
||||||
|
* @param array[] $user_worklogs
|
||||||
|
* @param $admin_user_worklog_privilege
|
||||||
* @return array
|
* @return array
|
||||||
*/
|
*/
|
||||||
function User_view_myshifts($shifts, $user_source, $its_me, $tshirt_score, $tshirt_admin, $user_worklogs, $admin_user_worklog_privilege)
|
function User_view_myshifts(
|
||||||
{
|
$shifts,
|
||||||
|
$user_source,
|
||||||
|
$its_me,
|
||||||
|
$tshirt_score,
|
||||||
|
$tshirt_admin,
|
||||||
|
$user_worklogs,
|
||||||
|
$admin_user_worklog_privilege
|
||||||
|
) {
|
||||||
$myshifts_table = [];
|
$myshifts_table = [];
|
||||||
$timesum = 0;
|
$timesum = 0;
|
||||||
foreach ($shifts as $shift) {
|
foreach ($shifts as $shift) {
|
||||||
|
@ -420,8 +431,8 @@ function User_view_myshifts($shifts, $user_source, $its_me, $tshirt_score, $tshi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if($its_me || $admin_user_worklog_privilege) {
|
if ($its_me || $admin_user_worklog_privilege) {
|
||||||
foreach($user_worklogs as $worklog) {
|
foreach ($user_worklogs as $worklog) {
|
||||||
$myshifts_table[$worklog['work_timestamp']] = User_view_worklog($worklog, $admin_user_worklog_privilege);
|
$myshifts_table[$worklog['work_timestamp']] = User_view_worklog($worklog, $admin_user_worklog_privilege);
|
||||||
$timesum += $worklog['work_hours'] * 3600;
|
$timesum += $worklog['work_hours'] * 3600;
|
||||||
}
|
}
|
||||||
|
@ -453,12 +464,15 @@ function User_view_myshifts($shifts, $user_source, $its_me, $tshirt_score, $tshi
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Renders table entry for user work log
|
* Renders table entry for user work log
|
||||||
* @param UserWorkLog $worklog
|
*
|
||||||
* @param bool $admin_user_worklog_privilege
|
* @param array $worklog
|
||||||
|
* @param bool $admin_user_worklog_privilege
|
||||||
|
* @return array
|
||||||
*/
|
*/
|
||||||
function User_view_worklog($worklog, $admin_user_worklog_privilege) {
|
function User_view_worklog($worklog, $admin_user_worklog_privilege)
|
||||||
|
{
|
||||||
$actions = '';
|
$actions = '';
|
||||||
if($admin_user_worklog_privilege) {
|
if ($admin_user_worklog_privilege) {
|
||||||
$actions = table_buttons([
|
$actions = table_buttons([
|
||||||
button(
|
button(
|
||||||
user_worklog_edit_link($worklog),
|
user_worklog_edit_link($worklog),
|
||||||
|
@ -479,11 +493,11 @@ function User_view_worklog($worklog, $admin_user_worklog_privilege) {
|
||||||
'room' => '',
|
'room' => '',
|
||||||
'shift_info' => _('Work log entry'),
|
'shift_info' => _('Work log entry'),
|
||||||
'comment' => $worklog['comment'] . '<br>'
|
'comment' => $worklog['comment'] . '<br>'
|
||||||
. sprintf(
|
. sprintf(
|
||||||
_('Added by %s at %s'),
|
_('Added by %s at %s'),
|
||||||
User_Nick_render(User($worklog['created_user_id'])),
|
User_Nick_render(User($worklog['created_user_id'])),
|
||||||
date('Y-m-d H:i', $worklog['created_timestamp'])
|
date('Y-m-d H:i', $worklog['created_timestamp'])
|
||||||
),
|
),
|
||||||
'actions' => $actions
|
'actions' => $actions
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -500,6 +514,8 @@ function User_view_worklog($worklog, $admin_user_worklog_privilege) {
|
||||||
* @param bool $its_me
|
* @param bool $its_me
|
||||||
* @param int $tshirt_score
|
* @param int $tshirt_score
|
||||||
* @param bool $tshirt_admin
|
* @param bool $tshirt_admin
|
||||||
|
* @param bool $admin_user_worklog_privilege
|
||||||
|
* @param array[] $user_worklogs
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function User_view(
|
function User_view(
|
||||||
|
@ -517,9 +533,17 @@ function User_view(
|
||||||
) {
|
) {
|
||||||
$user_name = htmlspecialchars($user_source['Vorname']) . ' ' . htmlspecialchars($user_source['Name']);
|
$user_name = htmlspecialchars($user_source['Vorname']) . ' ' . htmlspecialchars($user_source['Name']);
|
||||||
$myshifts_table = '';
|
$myshifts_table = '';
|
||||||
if($its_me || $admin_user_privilege) {
|
if ($its_me || $admin_user_privilege) {
|
||||||
$my_shifts = User_view_myshifts($shifts, $user_source, $its_me, $tshirt_score, $tshirt_admin, $user_worklogs, $admin_user_worklog_privilege);
|
$my_shifts = User_view_myshifts(
|
||||||
if(count($my_shifts) > 0) {
|
$shifts,
|
||||||
|
$user_source,
|
||||||
|
$its_me,
|
||||||
|
$tshirt_score,
|
||||||
|
$tshirt_admin,
|
||||||
|
$user_worklogs,
|
||||||
|
$admin_user_worklog_privilege
|
||||||
|
);
|
||||||
|
if (count($my_shifts) > 0) {
|
||||||
$myshifts_table = table([
|
$myshifts_table = table([
|
||||||
'date' => _('Day & time'),
|
'date' => _('Day & time'),
|
||||||
'duration' => _('Duration'),
|
'duration' => _('Duration'),
|
||||||
|
@ -528,7 +552,7 @@ function User_view(
|
||||||
'comment' => _('Comment'),
|
'comment' => _('Comment'),
|
||||||
'actions' => _('Action')
|
'actions' => _('Action')
|
||||||
], $my_shifts);
|
], $my_shifts);
|
||||||
} elseif($user_source['force_active']) {
|
} elseif ($user_source['force_active']) {
|
||||||
$myshifts_table = success(_('You have done enough to get a t-shirt.'), true);
|
$myshifts_table = success(_('You have done enough to get a t-shirt.'), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -748,7 +772,7 @@ function User_angeltypes_render($user_angeltypes)
|
||||||
$output = [];
|
$output = [];
|
||||||
foreach ($user_angeltypes as $angeltype) {
|
foreach ($user_angeltypes as $angeltype) {
|
||||||
$class = 'text-success';
|
$class = 'text-success';
|
||||||
if ($angeltype['restricted'] == 1 && $angeltype['confirm_user_id'] == null) {
|
if ($angeltype['restricted'] == 1 && empty($angeltype['confirm_user_id'])) {
|
||||||
$class = 'text-warning';
|
$class = 'text-warning';
|
||||||
}
|
}
|
||||||
$output[] = '<a href="' . angeltype_link($angeltype['id']) . '" class="' . $class . '">'
|
$output[] = '<a href="' . angeltype_link($angeltype['id']) . '" class="' . $class . '">'
|
||||||
|
@ -821,7 +845,7 @@ function render_user_departure_date_hint()
|
||||||
{
|
{
|
||||||
global $user;
|
global $user;
|
||||||
|
|
||||||
if (!isset($user['planned_departure_date']) || $user['planned_departure_date'] == null) {
|
if (!isset($user['planned_departure_date']) || empty($user['planned_departure_date'])) {
|
||||||
$text = _('Please enter your planned date of departure on your settings page to give us a feeling for teardown capacities.');
|
$text = _('Please enter your planned date of departure on your settings page to give us a feeling for teardown capacities.');
|
||||||
return render_profile_link($text, null, 'alert-link');
|
return render_profile_link($text, null, 'alert-link');
|
||||||
}
|
}
|
||||||
|
@ -857,7 +881,7 @@ function render_user_arrived_hint()
|
||||||
|
|
||||||
if ($user['Gekommen'] == 0) {
|
if ($user['Gekommen'] == 0) {
|
||||||
$event_config = EventConfig();
|
$event_config = EventConfig();
|
||||||
if (!is_null($event_config)
|
if (!empty($event_config)
|
||||||
&& !is_null($event_config['buildup_start_date'])
|
&& !is_null($event_config['buildup_start_date'])
|
||||||
&& time() > $event_config['buildup_start_date']) {
|
&& time() > $event_config['buildup_start_date']) {
|
||||||
return _('You are not marked as arrived. Please go to heaven\'s desk, get your angel badge and/or tell them that you arrived already.');
|
return _('You are not marked as arrived. Please go to heaven\'s desk, get your angel badge and/or tell them that you arrived already.');
|
||||||
|
|
|
@ -127,7 +127,7 @@ if (
|
||||||
$content = user_shifts();
|
$content = user_shifts();
|
||||||
break;
|
break;
|
||||||
case 'user_worklog':
|
case 'user_worklog':
|
||||||
list($title, $content) = user_worklogs_controller();
|
list($title, $content) = user_worklog_controller();
|
||||||
break;
|
break;
|
||||||
case 'user_messages':
|
case 'user_messages':
|
||||||
$title = messages_title();
|
$title = messages_title();
|
||||||
|
|
|
@ -5,6 +5,7 @@ namespace Engelsystem;
|
||||||
use Engelsystem\Config\Config;
|
use Engelsystem\Config\Config;
|
||||||
use Engelsystem\Container\Container;
|
use Engelsystem\Container\Container;
|
||||||
use Engelsystem\Container\ServiceProvider;
|
use Engelsystem\Container\ServiceProvider;
|
||||||
|
use Illuminate\Container\Container as IlluminateContainer;
|
||||||
use Psr\Container\ContainerInterface;
|
use Psr\Container\ContainerInterface;
|
||||||
|
|
||||||
class Application extends Container
|
class Application extends Container
|
||||||
|
@ -44,6 +45,7 @@ class Application extends Container
|
||||||
$this->instance('container', $this);
|
$this->instance('container', $this);
|
||||||
$this->instance(Container::class, $this);
|
$this->instance(Container::class, $this);
|
||||||
$this->instance(Application::class, $this);
|
$this->instance(Application::class, $this);
|
||||||
|
$this->instance(IlluminateContainer::class, $this);
|
||||||
$this->bind(ContainerInterface::class, Application::class);
|
$this->bind(ContainerInterface::class, Application::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,14 +2,16 @@
|
||||||
|
|
||||||
namespace Engelsystem\Config;
|
namespace Engelsystem\Config;
|
||||||
|
|
||||||
class Config
|
use Illuminate\Support\Fluent;
|
||||||
|
|
||||||
|
class Config extends Fluent
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* The config values
|
* The config values
|
||||||
*
|
*
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $data = [];
|
protected $attributes = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string|null $key
|
* @param string|null $key
|
||||||
|
@ -19,11 +21,11 @@ class Config
|
||||||
public function get($key, $default = null)
|
public function get($key, $default = null)
|
||||||
{
|
{
|
||||||
if (is_null($key)) {
|
if (is_null($key)) {
|
||||||
return $this->data;
|
return $this->attributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($this->has($key)) {
|
if ($this->has($key)) {
|
||||||
return $this->data[$key];
|
return $this->attributes[$key];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $default;
|
return $default;
|
||||||
|
@ -43,7 +45,7 @@ class Config
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->data[$key] = $value;
|
$this->attributes[$key] = $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -52,7 +54,7 @@ class Config
|
||||||
*/
|
*/
|
||||||
public function has($key)
|
public function has($key)
|
||||||
{
|
{
|
||||||
return isset($this->data[$key]);
|
return $this->offsetExists($key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,41 +62,6 @@ class Config
|
||||||
*/
|
*/
|
||||||
public function remove($key)
|
public function remove($key)
|
||||||
{
|
{
|
||||||
unset($this->data[$key]);
|
$this->offsetUnset($key);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $key
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
public function __get($key)
|
|
||||||
{
|
|
||||||
return $this->get($key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $key
|
|
||||||
* @param mixed $value
|
|
||||||
*/
|
|
||||||
public function __set($key, $value)
|
|
||||||
{
|
|
||||||
$this->set($key, $value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $key
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public function __isset($key)
|
|
||||||
{
|
|
||||||
return $this->has($key);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $key
|
|
||||||
*/
|
|
||||||
public function __unset($key)
|
|
||||||
{
|
|
||||||
$this->remove($key);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,23 +4,40 @@ namespace Engelsystem\Database;
|
||||||
|
|
||||||
use Engelsystem\Container\ServiceProvider;
|
use Engelsystem\Container\ServiceProvider;
|
||||||
use Exception;
|
use Exception;
|
||||||
use PDO;
|
use Illuminate\Database\Capsule\Manager as CapsuleManager;
|
||||||
|
use PDOException;
|
||||||
|
|
||||||
class DatabaseServiceProvider extends ServiceProvider
|
class DatabaseServiceProvider extends ServiceProvider
|
||||||
{
|
{
|
||||||
public function register()
|
public function register()
|
||||||
{
|
{
|
||||||
$config = $this->app->get('config');
|
$config = $this->app->get('config');
|
||||||
Db::connect(
|
$capsule = $this->app->make(CapsuleManager::class);
|
||||||
'mysql:host=' . $config->get('database')['host']
|
|
||||||
. ';dbname=' . $config->get('database')['db']
|
|
||||||
. ';charset=utf8',
|
|
||||||
$config->get('database')['user'],
|
|
||||||
$config->get('database')['pw']
|
|
||||||
) || $this->exitOnError();
|
|
||||||
|
|
||||||
Db::getPdo()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
$dbConfig = $config->get('database');
|
||||||
Db::getPdo()->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
|
$capsule->addConnection(array_merge([
|
||||||
|
'driver' => 'mysql',
|
||||||
|
'host' => '',
|
||||||
|
'database' => '',
|
||||||
|
'username' => '',
|
||||||
|
'password' => '',
|
||||||
|
'charset' => 'utf8',
|
||||||
|
'collation' => 'utf8_unicode_ci',
|
||||||
|
'prefix' => '',
|
||||||
|
], $dbConfig));
|
||||||
|
|
||||||
|
$capsule->setAsGlobal();
|
||||||
|
$capsule->bootEloquent();
|
||||||
|
$capsule->getConnection()->useDefaultSchemaGrammar();
|
||||||
|
|
||||||
|
try {
|
||||||
|
$capsule->getConnection()->getPdo();
|
||||||
|
} catch (PDOException $e) {
|
||||||
|
$this->exitOnError();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->app->instance('db', $capsule);
|
||||||
|
Db::setDbManager($capsule);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -2,68 +2,23 @@
|
||||||
|
|
||||||
namespace Engelsystem\Database;
|
namespace Engelsystem\Database;
|
||||||
|
|
||||||
|
use Illuminate\Database\Capsule\Manager as CapsuleManager;
|
||||||
|
use Illuminate\Database\Connection as DatabaseConnection;
|
||||||
use PDO;
|
use PDO;
|
||||||
use PDOException;
|
|
||||||
use PDOStatement;
|
|
||||||
|
|
||||||
class Db
|
class Db
|
||||||
{
|
{
|
||||||
/** @var PDO */
|
/** @var CapsuleManager */
|
||||||
protected static $db;
|
protected static $dbManager;
|
||||||
|
|
||||||
/** @var PDOStatement */
|
|
||||||
protected static $stm = null;
|
|
||||||
|
|
||||||
/** @var bool */
|
|
||||||
protected static $lastStatus = true;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connect to database
|
* Set the database connection manager
|
||||||
*
|
*
|
||||||
* @param string $dsn
|
* @param CapsuleManager $dbManager
|
||||||
* @param string $username
|
|
||||||
* @param string $password
|
|
||||||
* @param array $options
|
|
||||||
* @return bool
|
|
||||||
*/
|
*/
|
||||||
public static function connect($dsn, $username = null, $password = null, $options = [])
|
public static function setDbManager($dbManager)
|
||||||
{
|
{
|
||||||
try {
|
self::$dbManager = $dbManager;
|
||||||
self::$db = new PDO($dsn, $username, $password, $options);
|
|
||||||
} catch (PDOException $e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run a prepared query
|
|
||||||
*
|
|
||||||
* @param string $query
|
|
||||||
* @param array $bindings
|
|
||||||
* @return PDOStatement
|
|
||||||
*/
|
|
||||||
public static function query($query, array $bindings = [])
|
|
||||||
{
|
|
||||||
self::$stm = self::$db->prepare($query);
|
|
||||||
self::$lastStatus = self::$stm->execute($bindings);
|
|
||||||
|
|
||||||
return self::$stm;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Run a sql query
|
|
||||||
*
|
|
||||||
* @param string $query
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
public static function unprepared($query)
|
|
||||||
{
|
|
||||||
self::$stm = self::$db->query($query);
|
|
||||||
self::$lastStatus = (self::$stm instanceof PDOStatement);
|
|
||||||
|
|
||||||
return self::$lastStatus;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -75,9 +30,14 @@ class Db
|
||||||
*/
|
*/
|
||||||
public static function select($query, array $bindings = [])
|
public static function select($query, array $bindings = [])
|
||||||
{
|
{
|
||||||
self::query($query, $bindings);
|
$return = self::connection()->select($query, $bindings);
|
||||||
|
|
||||||
return self::$stm->fetchAll(PDO::FETCH_ASSOC);
|
// @TODO: Remove type casting
|
||||||
|
foreach ($return as $key => $value) {
|
||||||
|
$return[$key] = (array)$value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -89,13 +49,15 @@ class Db
|
||||||
*/
|
*/
|
||||||
public static function selectOne($query, array $bindings = [])
|
public static function selectOne($query, array $bindings = [])
|
||||||
{
|
{
|
||||||
$result = self::select($query, $bindings);
|
$result = self::connection()->selectOne($query, $bindings);
|
||||||
|
|
||||||
|
// @TODO: remove typecast
|
||||||
|
$result = (array)$result;
|
||||||
if (empty($result)) {
|
if (empty($result)) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
return array_shift($result);
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -103,13 +65,11 @@ class Db
|
||||||
*
|
*
|
||||||
* @param string $query
|
* @param string $query
|
||||||
* @param array $bindings
|
* @param array $bindings
|
||||||
* @return int Row count
|
* @return bool
|
||||||
*/
|
*/
|
||||||
public static function insert($query, array $bindings = [])
|
public static function insert($query, array $bindings = [])
|
||||||
{
|
{
|
||||||
self::query($query, $bindings);
|
return self::connection()->insert($query, $bindings);
|
||||||
|
|
||||||
return self::$stm->rowCount();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -121,9 +81,7 @@ class Db
|
||||||
*/
|
*/
|
||||||
public static function update($query, array $bindings = [])
|
public static function update($query, array $bindings = [])
|
||||||
{
|
{
|
||||||
self::query($query, $bindings);
|
return self::connection()->update($query, $bindings);
|
||||||
|
|
||||||
return self::$stm->rowCount();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -135,37 +93,15 @@ class Db
|
||||||
*/
|
*/
|
||||||
public static function delete($query, array $bindings = [])
|
public static function delete($query, array $bindings = [])
|
||||||
{
|
{
|
||||||
self::query($query, $bindings);
|
return self::connection()->delete($query, $bindings);
|
||||||
|
|
||||||
return self::$stm->rowCount();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Run a single statement
|
* @return DatabaseConnection
|
||||||
*
|
|
||||||
* @param string $query
|
|
||||||
* @param array $bindings
|
|
||||||
* @return bool
|
|
||||||
*/
|
*/
|
||||||
public static function statement($query, array $bindings = [])
|
public static function connection()
|
||||||
{
|
{
|
||||||
self::query($query, $bindings);
|
return self::$dbManager->getConnection();
|
||||||
|
|
||||||
return self::$lastStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the last error
|
|
||||||
*
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public static function getError()
|
|
||||||
{
|
|
||||||
if (!self::$stm instanceof PDOStatement) {
|
|
||||||
return [-1, null, null];
|
|
||||||
}
|
|
||||||
|
|
||||||
return self::$stm->errorInfo();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -175,14 +111,6 @@ class Db
|
||||||
*/
|
*/
|
||||||
public static function getPdo()
|
public static function getPdo()
|
||||||
{
|
{
|
||||||
return self::$db;
|
return self::connection()->getPdo();
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return PDOStatement|false|null
|
|
||||||
*/
|
|
||||||
public static function getStm()
|
|
||||||
{
|
|
||||||
return self::$stm;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,192 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Database\Migration;
|
||||||
|
|
||||||
|
use Engelsystem\Application;
|
||||||
|
use Illuminate\Database\Query\Builder;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Database\Schema\Builder as SchemaBuilder;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
|
class Migrate
|
||||||
|
{
|
||||||
|
const UP = 'up';
|
||||||
|
const DOWN = 'down';
|
||||||
|
|
||||||
|
/** @var Application */
|
||||||
|
protected $app;
|
||||||
|
|
||||||
|
/** @var SchemaBuilder */
|
||||||
|
protected $scheme;
|
||||||
|
|
||||||
|
/** @var callable */
|
||||||
|
protected $output;
|
||||||
|
|
||||||
|
/** @var string */
|
||||||
|
protected $table = 'migrations';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Migrate constructor
|
||||||
|
*
|
||||||
|
* @param SchemaBuilder $scheme
|
||||||
|
* @param Application $app
|
||||||
|
*/
|
||||||
|
public function __construct(SchemaBuilder $scheme, Application $app)
|
||||||
|
{
|
||||||
|
$this->app = $app;
|
||||||
|
$this->scheme = $scheme;
|
||||||
|
$this->output = function () { };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run a migration
|
||||||
|
*
|
||||||
|
* @param string $path
|
||||||
|
* @param string $type (up|down)
|
||||||
|
* @param bool $oneStep
|
||||||
|
*/
|
||||||
|
public function run($path, $type = self::UP, $oneStep = false)
|
||||||
|
{
|
||||||
|
$this->initMigration();
|
||||||
|
$migrations = $this->getMigrations($path);
|
||||||
|
$migrated = $this->getMigrated();
|
||||||
|
|
||||||
|
if ($type == self::DOWN) {
|
||||||
|
$migrations = array_reverse($migrations, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($migrations as $file => $migration) {
|
||||||
|
if (
|
||||||
|
($type == self::UP && $migrated->contains('migration', $migration))
|
||||||
|
|| ($type == self::DOWN && !$migrated->contains('migration', $migration))
|
||||||
|
) {
|
||||||
|
call_user_func($this->output, 'Skipping ' . $migration);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
call_user_func($this->output, 'Migrating ' . $migration . ' (' . $type . ')');
|
||||||
|
|
||||||
|
$this->migrate($file, $migration, $type);
|
||||||
|
$this->setMigrated($migration, $type);
|
||||||
|
|
||||||
|
if ($oneStep) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all migrated migrations
|
||||||
|
*
|
||||||
|
* @return Collection
|
||||||
|
*/
|
||||||
|
protected function getMigrated()
|
||||||
|
{
|
||||||
|
return $this->getTableQuery()->get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Migrate a migration
|
||||||
|
*
|
||||||
|
* @param string $file
|
||||||
|
* @param string $migration
|
||||||
|
* @param string $type (up|down)
|
||||||
|
*/
|
||||||
|
protected function migrate($file, $migration, $type = self::UP)
|
||||||
|
{
|
||||||
|
require_once $file;
|
||||||
|
|
||||||
|
$className = Str::studly(preg_replace('/\d+_/', '', $migration));
|
||||||
|
/** @var Migration $class */
|
||||||
|
$class = $this->app->make($className);
|
||||||
|
|
||||||
|
if (method_exists($class, $type)) {
|
||||||
|
$class->{$type}();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a migration to migrated
|
||||||
|
*
|
||||||
|
* @param string $migration
|
||||||
|
* @param string $type (up|down)
|
||||||
|
*/
|
||||||
|
protected function setMigrated($migration, $type = self::UP)
|
||||||
|
{
|
||||||
|
$table = $this->getTableQuery();
|
||||||
|
|
||||||
|
if ($type == self::DOWN) {
|
||||||
|
$table->where(['migration' => $migration])->delete();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$table->insert(['migration' => $migration]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of migration files
|
||||||
|
*
|
||||||
|
* @param string $dir
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getMigrations($dir)
|
||||||
|
{
|
||||||
|
$files = $this->getMigrationFiles($dir);
|
||||||
|
|
||||||
|
$migrations = [];
|
||||||
|
foreach ($files as $dir) {
|
||||||
|
$name = str_replace('.php', '', basename($dir));
|
||||||
|
$migrations[$dir] = $name;
|
||||||
|
}
|
||||||
|
|
||||||
|
asort($migrations);
|
||||||
|
return $migrations;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* List all migration files from the given directory
|
||||||
|
*
|
||||||
|
* @param string $dir
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function getMigrationFiles($dir)
|
||||||
|
{
|
||||||
|
return glob($dir . '/*_*.php');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup migration tables
|
||||||
|
*/
|
||||||
|
protected function initMigration()
|
||||||
|
{
|
||||||
|
if ($this->scheme->hasTable($this->table)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->scheme->create($this->table, function (Blueprint $table) {
|
||||||
|
$table->increments('id');
|
||||||
|
$table->string('migration');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Init a table query
|
||||||
|
*
|
||||||
|
* @return Builder
|
||||||
|
*/
|
||||||
|
protected function getTableQuery()
|
||||||
|
{
|
||||||
|
return $this->scheme->getConnection()->table($this->table);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the output function
|
||||||
|
*
|
||||||
|
* @param callable $output
|
||||||
|
*/
|
||||||
|
public function setOutput(callable $output)
|
||||||
|
{
|
||||||
|
$this->output = $output;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Database\Migration;
|
||||||
|
|
||||||
|
use Illuminate\Database\Schema\Builder as SchemaBuilder;
|
||||||
|
|
||||||
|
abstract class Migration
|
||||||
|
{
|
||||||
|
/** @var SchemaBuilder */
|
||||||
|
protected $schema;
|
||||||
|
|
||||||
|
public function __construct(SchemaBuilder $schemaBuilder)
|
||||||
|
{
|
||||||
|
$this->schema = $schemaBuilder;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Database\Migration;
|
||||||
|
|
||||||
|
use Engelsystem\Container\ServiceProvider;
|
||||||
|
use Engelsystem\Database\Db;
|
||||||
|
use Illuminate\Database\Schema\Builder as SchemaBuilder;
|
||||||
|
|
||||||
|
class MigrationServiceProvider extends ServiceProvider
|
||||||
|
{
|
||||||
|
public function register()
|
||||||
|
{
|
||||||
|
$schema = Db::connection()->getSchemaBuilder();
|
||||||
|
$this->app->instance('db.scheme', $schema);
|
||||||
|
$this->app->bind(SchemaBuilder::class, 'db.scheme');
|
||||||
|
|
||||||
|
$migration = $this->app->make(Migrate::class);
|
||||||
|
$this->app->instance('db.migration', $migration);
|
||||||
|
}
|
||||||
|
}
|
|
@ -64,21 +64,6 @@ function config_path($path = '')
|
||||||
return app('path.config') . (empty($path) ? '' : DIRECTORY_SEPARATOR . $path);
|
return app('path.config') . (empty($path) ? '' : DIRECTORY_SEPARATOR . $path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $key
|
|
||||||
* @param mixed $default
|
|
||||||
* @return mixed
|
|
||||||
*/
|
|
||||||
function env($key, $default = null)
|
|
||||||
{
|
|
||||||
$value = getenv($key);
|
|
||||||
if ($value === false) {
|
|
||||||
return $default;
|
|
||||||
}
|
|
||||||
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param string $key
|
* @param string $key
|
||||||
* @param mixed $default
|
* @param mixed $default
|
||||||
|
|
|
@ -24,11 +24,11 @@ class RoomModelTest extends TestCase
|
||||||
|
|
||||||
$room = Room($this->room_id);
|
$room = Room($this->room_id);
|
||||||
|
|
||||||
$this->assertNotFalse($room);
|
$this->assertNotEmpty($room);
|
||||||
$this->assertNotNull($room);
|
$this->assertNotNull($room);
|
||||||
$this->assertEquals($room['Name'], 'test');
|
$this->assertEquals($room['Name'], 'test');
|
||||||
|
|
||||||
$this->assertNull(Room(-1));
|
$this->assertEmpty(Room(-1));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function tearDown()
|
public function tearDown()
|
||||||
|
|
|
@ -6,32 +6,86 @@ use Engelsystem\Config\Config;
|
||||||
use Engelsystem\Database\DatabaseServiceProvider;
|
use Engelsystem\Database\DatabaseServiceProvider;
|
||||||
use Engelsystem\Test\Unit\ServiceProviderTest;
|
use Engelsystem\Test\Unit\ServiceProviderTest;
|
||||||
use Exception;
|
use Exception;
|
||||||
use PHPUnit_Framework_MockObject_MockObject;
|
use Illuminate\Database\Capsule\Manager as CapsuleManager;
|
||||||
|
use Illuminate\Database\Connection;
|
||||||
|
use PDOException;
|
||||||
|
use PHPUnit_Framework_MockObject_MockObject as MockObject;
|
||||||
|
|
||||||
class DatabaseServiceProviderTest extends ServiceProviderTest
|
class DatabaseServiceProviderTest extends ServiceProviderTest
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @covers \Engelsystem\Database\DatabaseServiceProvider::register()
|
* @covers \Engelsystem\Database\DatabaseServiceProvider::register()
|
||||||
* @covers \Engelsystem\Database\DatabaseServiceProvider::exitOnError()
|
|
||||||
*/
|
*/
|
||||||
public function testRegister()
|
public function testRegister()
|
||||||
{
|
{
|
||||||
/** @var PHPUnit_Framework_MockObject_MockObject|Config $config */
|
list($app, $dbManager) = $this->prepare(['driver' => 'sqlite', 'database' => ':memory:']);
|
||||||
$config = $this->getMockBuilder(Config::class)
|
|
||||||
->getMock();
|
|
||||||
|
|
||||||
$app = $this->getApp(['get']);
|
$this->setExpects($app, 'instance', ['db', $dbManager]);
|
||||||
|
|
||||||
|
$serviceProvider = new DatabaseServiceProvider($app);
|
||||||
|
$serviceProvider->register();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \Engelsystem\Database\DatabaseServiceProvider::register()
|
||||||
|
* @covers \Engelsystem\Database\DatabaseServiceProvider::exitOnError()
|
||||||
|
*/
|
||||||
|
public function testRegisterError()
|
||||||
|
{
|
||||||
|
list($app) = $this->prepare([
|
||||||
|
'host' => 'localhost',
|
||||||
|
'database' => 'database',
|
||||||
|
'username' => 'user',
|
||||||
|
'password' => 'password',
|
||||||
|
], true);
|
||||||
|
|
||||||
$this->setExpects($app, 'get', ['config'], $config);
|
|
||||||
$this->setExpects($config, 'get', ['database'], [
|
|
||||||
'host' => 'localhost',
|
|
||||||
'db' => 'database',
|
|
||||||
'user' => 'user',
|
|
||||||
'pw' => 'password',
|
|
||||||
], $this->atLeastOnce());
|
|
||||||
$this->expectException(Exception::class);
|
$this->expectException(Exception::class);
|
||||||
|
|
||||||
$serviceProvider = new DatabaseServiceProvider($app);
|
$serviceProvider = new DatabaseServiceProvider($app);
|
||||||
$serviceProvider->register();
|
$serviceProvider->register();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prepare some mocks
|
||||||
|
*
|
||||||
|
* @param array $dbConfigData
|
||||||
|
* @param bool $getPdoThrowException
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
protected function prepare($dbConfigData, $getPdoThrowException = false)
|
||||||
|
{
|
||||||
|
/** @var MockObject|Config $config */
|
||||||
|
$config = $this->getMockBuilder(Config::class)
|
||||||
|
->getMock();
|
||||||
|
/** @var MockObject|CapsuleManager $config */
|
||||||
|
$dbManager = $this->getMockBuilder(CapsuleManager::class)
|
||||||
|
->getMock();
|
||||||
|
/** @var MockObject|Connection $connection */
|
||||||
|
$connection = $this->getMockBuilder(Connection::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$app = $this->getApp(['get', 'make', 'instance']);
|
||||||
|
|
||||||
|
$this->setExpects($app, 'get', ['config'], $config);
|
||||||
|
$this->setExpects($app, 'make', [CapsuleManager::class], $dbManager);
|
||||||
|
$this->setExpects($config, 'get', ['database'], $dbConfigData, $this->atLeastOnce());
|
||||||
|
|
||||||
|
$this->setExpects($dbManager, 'setAsGlobal');
|
||||||
|
$this->setExpects($dbManager, 'bootEloquent');
|
||||||
|
|
||||||
|
$this->setExpects($connection, 'useDefaultSchemaGrammar');
|
||||||
|
$connection->expects($this->once())
|
||||||
|
->method('getPdo')
|
||||||
|
->willReturnCallback(function () use ($getPdoThrowException) {
|
||||||
|
if ($getPdoThrowException) {
|
||||||
|
throw new PDOException();
|
||||||
|
}
|
||||||
|
|
||||||
|
return '';
|
||||||
|
});
|
||||||
|
$this->setExpects($dbManager, 'getConnection', [], $connection, $this->atLeastOnce());
|
||||||
|
|
||||||
|
return [$app, $dbManager];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,45 +3,45 @@
|
||||||
namespace Engelsystem\Test\Unit\Database;
|
namespace Engelsystem\Test\Unit\Database;
|
||||||
|
|
||||||
use Engelsystem\Database\Db;
|
use Engelsystem\Database\Db;
|
||||||
|
use Illuminate\Database\Capsule\Manager as CapsuleManager;
|
||||||
|
use Illuminate\Database\Connection as DatabaseConnection;
|
||||||
use PDO;
|
use PDO;
|
||||||
use PDOStatement;
|
|
||||||
use PHPUnit\Framework\TestCase;
|
use PHPUnit\Framework\TestCase;
|
||||||
use ReflectionObject;
|
use PHPUnit_Framework_MockObject_MockObject as MockObject;
|
||||||
use Throwable;
|
|
||||||
|
|
||||||
class DbTest extends TestCase
|
class DbTest extends TestCase
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @covers \Engelsystem\Database\Db::connect()
|
* @covers \Engelsystem\Database\Db::setDbManager()
|
||||||
|
* @covers \Engelsystem\Database\Db::connection()
|
||||||
*/
|
*/
|
||||||
public function testConnect()
|
public function testSetDbManager()
|
||||||
{
|
{
|
||||||
$result = Db::connect('mysql:host=localhost;dbname=someTestDatabaseThatDoesNotExist;charset=utf8');
|
/** @var MockObject|Pdo $pdo */
|
||||||
$this->assertFalse($result);
|
$pdo = $this->getMockBuilder(Pdo::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
/** @var MockObject|CapsuleManager $dbManager */
|
||||||
|
$dbManager = $this->getMockBuilder(CapsuleManager::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
/** @var MockObject|DatabaseConnection $dbManager */
|
||||||
|
$databaseConnection = $this->getMockBuilder(DatabaseConnection::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
$result = Db::connect('sqlite::memory:');
|
$dbManager
|
||||||
$this->assertTrue($result);
|
->expects($this->atLeastOnce())
|
||||||
}
|
->method('getConnection')
|
||||||
|
->willReturn($databaseConnection);
|
||||||
|
$databaseConnection
|
||||||
|
->expects($this->atLeastOnce())
|
||||||
|
->method('getPdo')
|
||||||
|
->willReturn($pdo);
|
||||||
|
|
||||||
/**
|
Db::setDbManager($dbManager);
|
||||||
* @covers \Engelsystem\Database\Db::query()
|
$this->assertEquals($pdo, Db::getPdo());
|
||||||
*/
|
$this->assertEquals($databaseConnection, Db::connection());
|
||||||
public function testQuery()
|
|
||||||
{
|
|
||||||
$stm = Db::query('SELECT * FROM test_data');
|
|
||||||
$this->assertEquals('00000', $stm->errorCode());
|
|
||||||
|
|
||||||
$stm = Db::query('SELECT * FROM test_data WHERE id = ?', [4]);
|
|
||||||
$this->assertEquals('00000', $stm->errorCode());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @covers \Engelsystem\Database\Db::unprepared()
|
|
||||||
*/
|
|
||||||
public function testUnprepared()
|
|
||||||
{
|
|
||||||
$return = Db::unprepared('SELECT * FROM test_data WHERE id = 3');
|
|
||||||
$this->assertTrue($return);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -77,11 +77,8 @@ class DbTest extends TestCase
|
||||||
*/
|
*/
|
||||||
public function testInsert()
|
public function testInsert()
|
||||||
{
|
{
|
||||||
$count = Db::insert("INSERT INTO test_data (id, data) VALUES (5, 'Some random text'), (6, 'another text')");
|
$result = Db::insert("INSERT INTO test_data (id, data) VALUES (5, 'Some random text'), (6, 'another text')");
|
||||||
$this->assertEquals(2, $count);
|
$this->assertTrue($result);
|
||||||
|
|
||||||
$count = Db::insert('INSERT INTO test_data(id, data) VALUES (:id, :alias)', ['id' => 7, 'alias' => 'Blafoo']);
|
|
||||||
$this->assertEquals(1, $count);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -108,42 +105,6 @@ class DbTest extends TestCase
|
||||||
$this->assertEquals(3, $count);
|
$this->assertEquals(3, $count);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @covers \Engelsystem\Database\Db::statement()
|
|
||||||
*/
|
|
||||||
public function testStatement()
|
|
||||||
{
|
|
||||||
$return = Db::statement('SELECT * FROM test_data WHERE id = 3');
|
|
||||||
$this->assertTrue($return);
|
|
||||||
|
|
||||||
$return = Db::statement('SELECT * FROM test_data WHERE id = ?', [2]);
|
|
||||||
$this->assertTrue($return);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @covers \Engelsystem\Database\Db::getError()
|
|
||||||
*/
|
|
||||||
public function testGetError()
|
|
||||||
{
|
|
||||||
try {
|
|
||||||
Db::statement('foo');
|
|
||||||
} catch (Throwable $e) {
|
|
||||||
}
|
|
||||||
|
|
||||||
$error = Db::getError();
|
|
||||||
$this->assertTrue(is_array($error));
|
|
||||||
$this->assertEquals('near "foo": syntax error', $error[2]);
|
|
||||||
|
|
||||||
$db = new Db();
|
|
||||||
$refObject = new ReflectionObject($db);
|
|
||||||
$refProperty = $refObject->getProperty('stm');
|
|
||||||
$refProperty->setAccessible(true);
|
|
||||||
$refProperty->setValue(null, null);
|
|
||||||
|
|
||||||
$error = Db::getError();
|
|
||||||
$this->assertEquals([-1, null, null], $error);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @covers \Engelsystem\Database\Db::getPdo()
|
* @covers \Engelsystem\Database\Db::getPdo()
|
||||||
*/
|
*/
|
||||||
|
@ -153,30 +114,26 @@ class DbTest extends TestCase
|
||||||
$this->assertInstanceOf(PDO::class, $pdo);
|
$this->assertInstanceOf(PDO::class, $pdo);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @covers \Engelsystem\Database\Db::getStm()
|
|
||||||
*/
|
|
||||||
public function testGetStm()
|
|
||||||
{
|
|
||||||
$stm = Db::getStm();
|
|
||||||
$this->assertInstanceOf(PDOStatement::class, $stm);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Setup in memory database
|
* Setup in memory database
|
||||||
*/
|
*/
|
||||||
protected function setUp()
|
protected function setUp()
|
||||||
{
|
{
|
||||||
Db::connect('sqlite::memory:');
|
$dbManager = new CapsuleManager();
|
||||||
|
$dbManager->addConnection(['driver' => 'sqlite', 'database' => ':memory:']);
|
||||||
|
$dbManager->setAsGlobal();
|
||||||
|
$dbManager->bootEloquent();
|
||||||
|
|
||||||
|
Db::setDbManager($dbManager);
|
||||||
Db::getPdo()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
Db::getPdo()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
|
||||||
Db::query(
|
Db::connection()->statement(
|
||||||
'
|
'
|
||||||
CREATE TABLE test_data(
|
CREATE TABLE test_data(
|
||||||
id INT PRIMARY KEY NOT NULL,
|
id INT PRIMARY KEY NOT NULL,
|
||||||
data TEXT NOT NULL
|
data TEXT NOT NULL
|
||||||
);
|
);
|
||||||
');
|
');
|
||||||
Db::query('CREATE UNIQUE INDEX test_data_id_uindex ON test_data (id);');
|
Db::connection()->statement('CREATE UNIQUE INDEX test_data_id_uindex ON test_data (id);');
|
||||||
Db::insert("
|
Db::insert("
|
||||||
INSERT INTO test_data (id, data)
|
INSERT INTO test_data (id, data)
|
||||||
VALUES
|
VALUES
|
||||||
|
|
|
@ -0,0 +1,160 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Test\Unit\Database;
|
||||||
|
|
||||||
|
use Engelsystem\Application;
|
||||||
|
use Engelsystem\Database\Migration\Migrate;
|
||||||
|
use Illuminate\Database\Capsule\Manager as CapsuleManager;
|
||||||
|
use Illuminate\Database\Schema\Builder as SchemaBuilder;
|
||||||
|
use Illuminate\Support\Collection;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
use PHPUnit\Framework\MockObject\MockObject;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class MigrateTest extends TestCase
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @covers \Engelsystem\Database\Migration\Migrate::__construct
|
||||||
|
* @covers \Engelsystem\Database\Migration\Migrate::run
|
||||||
|
* @covers \Engelsystem\Database\Migration\Migrate::getMigrations
|
||||||
|
* @covers \Engelsystem\Database\Migration\Migrate::setOutput
|
||||||
|
*/
|
||||||
|
public function testRun()
|
||||||
|
{
|
||||||
|
/** @var MockObject|Application $app */
|
||||||
|
$app = $this->getMockBuilder(Application::class)
|
||||||
|
->setMethods(['instance'])
|
||||||
|
->getMock();
|
||||||
|
/** @var MockObject|SchemaBuilder $builder */
|
||||||
|
$builder = $this->getMockBuilder(SchemaBuilder::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
/** @var MockObject|Migrate $migration */
|
||||||
|
$migration = $this->getMockBuilder(Migrate::class)
|
||||||
|
->setConstructorArgs([$builder, $app])
|
||||||
|
->setMethods(['initMigration', 'getMigrationFiles', 'getMigrated', 'migrate', 'setMigrated'])
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$migration->expects($this->atLeastOnce())
|
||||||
|
->method('initMigration');
|
||||||
|
$migration->expects($this->atLeastOnce())
|
||||||
|
->method('getMigrationFiles')
|
||||||
|
->willReturn([
|
||||||
|
'foo/1234_01_23_123456_init_foo.php',
|
||||||
|
'foo/9876_03_22_210000_random_hack.php',
|
||||||
|
'foo/4567_11_01_000000_do_stuff.php',
|
||||||
|
'foo/9999_99_99_999999_another_foo.php',
|
||||||
|
]);
|
||||||
|
$migration->expects($this->atLeastOnce())
|
||||||
|
->method('getMigrated')
|
||||||
|
->willReturn(new Collection([
|
||||||
|
['id' => 1, 'migration' => '1234_01_23_123456_init_foo'],
|
||||||
|
['id' => 2, 'migration' => '4567_11_01_000000_do_stuff'],
|
||||||
|
]));
|
||||||
|
$migration->expects($this->atLeastOnce())
|
||||||
|
->method('migrate')
|
||||||
|
->withConsecutive(
|
||||||
|
['foo/9876_03_22_210000_random_hack.php', '9876_03_22_210000_random_hack', Migrate::UP],
|
||||||
|
['foo/9999_99_99_999999_another_foo.php', '9999_99_99_999999_another_foo', Migrate::UP],
|
||||||
|
['foo/9876_03_22_210000_random_hack.php', '9876_03_22_210000_random_hack', Migrate::UP],
|
||||||
|
['foo/4567_11_01_000000_do_stuff.php', '4567_11_01_000000_do_stuff', Migrate::DOWN]
|
||||||
|
);
|
||||||
|
$migration->expects($this->atLeastOnce())
|
||||||
|
->method('setMigrated')
|
||||||
|
->withConsecutive(
|
||||||
|
['9876_03_22_210000_random_hack', Migrate::UP],
|
||||||
|
['9999_99_99_999999_another_foo', Migrate::UP],
|
||||||
|
['9876_03_22_210000_random_hack', Migrate::UP],
|
||||||
|
['4567_11_01_000000_do_stuff', Migrate::DOWN]
|
||||||
|
);
|
||||||
|
|
||||||
|
$messages = [];
|
||||||
|
$migration->setOutput(function ($text) use (&$messages) {
|
||||||
|
$messages[] = $text;
|
||||||
|
});
|
||||||
|
|
||||||
|
$migration->run('foo', Migrate::UP);
|
||||||
|
|
||||||
|
$this->assertCount(4, $messages);
|
||||||
|
foreach (
|
||||||
|
[
|
||||||
|
'init_foo' => 'skipping',
|
||||||
|
'do_stuff' => 'skipping',
|
||||||
|
'random_hack' => 'migrating',
|
||||||
|
'another_foo' => 'migrating',
|
||||||
|
] as $value => $type
|
||||||
|
) {
|
||||||
|
$contains = false;
|
||||||
|
foreach ($messages as $message) {
|
||||||
|
if (!Str::contains(strtolower($message), $type) || !Str::contains(strtolower($message), $value)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
$contains = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->assertTrue($contains, sprintf('Missing message "%s: %s"', $type, $value));
|
||||||
|
}
|
||||||
|
|
||||||
|
$messages = [];
|
||||||
|
$migration->run('foo', Migrate::UP, true);
|
||||||
|
$this->assertCount(3, $messages);
|
||||||
|
|
||||||
|
$migration->run('foo', Migrate::DOWN, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @covers \Engelsystem\Database\Migration\Migrate::getMigrated
|
||||||
|
* @covers \Engelsystem\Database\Migration\Migrate::migrate
|
||||||
|
* @covers \Engelsystem\Database\Migration\Migrate::setMigrated
|
||||||
|
* @covers \Engelsystem\Database\Migration\Migrate::getMigrationFiles
|
||||||
|
* @covers \Engelsystem\Database\Migration\Migrate::initMigration
|
||||||
|
* @covers \Engelsystem\Database\Migration\Migrate::getTableQuery
|
||||||
|
*/
|
||||||
|
public function testRunIntegration()
|
||||||
|
{
|
||||||
|
$app = new Application();
|
||||||
|
$dbManager = new CapsuleManager($app);
|
||||||
|
$dbManager->addConnection(['driver' => 'sqlite', 'database' => ':memory:']);
|
||||||
|
$dbManager->bootEloquent();
|
||||||
|
$db = $dbManager->getConnection();
|
||||||
|
$db->useDefaultSchemaGrammar();
|
||||||
|
$scheme = $db->getSchemaBuilder();
|
||||||
|
|
||||||
|
$app->instance('scheme', $scheme);
|
||||||
|
$app->bind(SchemaBuilder::class, 'scheme');
|
||||||
|
|
||||||
|
$migration = new Migrate($scheme, $app);
|
||||||
|
|
||||||
|
$messages = [];
|
||||||
|
$migration->setOutput(function ($msg) use (&$messages) {
|
||||||
|
$messages[] = $msg;
|
||||||
|
});
|
||||||
|
|
||||||
|
$migration->run(__DIR__ . '/Stub', Migrate::UP);
|
||||||
|
|
||||||
|
$this->assertTrue($scheme->hasTable('migrations'));
|
||||||
|
|
||||||
|
$migrations = $db->table('migrations')->get();
|
||||||
|
$this->assertCount(3, $migrations);
|
||||||
|
|
||||||
|
$this->assertTrue($migrations->contains('migration', '2001_04_11_123456_create_lorem_ipsum_table'));
|
||||||
|
$this->assertTrue($migrations->contains('migration', '2017_12_24_053300_another_stuff'));
|
||||||
|
$this->assertTrue($migrations->contains('migration', '2022_12_22_221222_add_some_feature'));
|
||||||
|
|
||||||
|
$this->assertTrue($scheme->hasTable('lorem_ipsum'));
|
||||||
|
|
||||||
|
$migration->run(__DIR__ . '/Stub', Migrate::DOWN, true);
|
||||||
|
|
||||||
|
$migrations = $db->table('migrations')->get();
|
||||||
|
$this->assertCount(2, $migrations);
|
||||||
|
|
||||||
|
$migration->run(__DIR__ . '/Stub', Migrate::DOWN);
|
||||||
|
|
||||||
|
$migrations = $db->table('migrations')->get();
|
||||||
|
$this->assertCount(0, $migrations);
|
||||||
|
|
||||||
|
$this->assertFalse($scheme->hasTable('lorem_ipsum'));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,55 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Test\Unit\Database\Migration;
|
||||||
|
|
||||||
|
use Engelsystem\Database\Db;
|
||||||
|
use Engelsystem\Database\Migration\Migrate;
|
||||||
|
use Engelsystem\Database\Migration\MigrationServiceProvider;
|
||||||
|
use Engelsystem\Test\Unit\ServiceProviderTest;
|
||||||
|
use Illuminate\Database\Capsule\Manager as CapsuleManager;
|
||||||
|
use Illuminate\Database\Connection;
|
||||||
|
use Illuminate\Database\Schema\Builder as SchemaBuilder;
|
||||||
|
use PHPUnit_Framework_MockObject_MockObject as MockObject;
|
||||||
|
|
||||||
|
class MigrationServiceProviderTest extends ServiceProviderTest
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @covers \Engelsystem\Database\Migration\MigrationServiceProvider::register()
|
||||||
|
*/
|
||||||
|
public function testRegister()
|
||||||
|
{
|
||||||
|
/** @var MockObject|Migrate $migration */
|
||||||
|
$migration = $this->getMockBuilder(Migrate::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
/** @var MockObject|CapsuleManager $dbManager */
|
||||||
|
$dbManager = $this->getMockBuilder(CapsuleManager::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
/** @var MockObject|Connection $dbConnection */
|
||||||
|
$dbConnection = $this->getMockBuilder(Connection::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
/** @var MockObject|SchemaBuilder $schemaBuilder */
|
||||||
|
$schemaBuilder = $this->getMockBuilder(SchemaBuilder::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$app = $this->getApp(['make', 'instance', 'bind']);
|
||||||
|
|
||||||
|
$app->expects($this->atLeastOnce())
|
||||||
|
->method('instance')
|
||||||
|
->withConsecutive(['db.scheme'], ['db.migration'])
|
||||||
|
->willReturnOnConsecutiveCalls($schemaBuilder, $migration);
|
||||||
|
|
||||||
|
$this->setExpects($app, 'bind', [SchemaBuilder::class, 'db.scheme']);
|
||||||
|
$this->setExpects($app, 'make', [Migrate::class], $migration);
|
||||||
|
|
||||||
|
$this->setExpects($dbConnection, 'getSchemaBuilder', null, $schemaBuilder);
|
||||||
|
$this->setExpects($dbManager, 'getConnection', null, $dbConnection);
|
||||||
|
Db::setDbManager($dbManager);
|
||||||
|
|
||||||
|
$serviceProvider = new MigrationServiceProvider($app);
|
||||||
|
$serviceProvider->register();
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Engelsystem\Test\Unit\Database;
|
||||||
|
|
||||||
|
use AnotherStuff;
|
||||||
|
use Illuminate\Database\Schema\Builder as SchemaBuilder;
|
||||||
|
use PHPUnit\Framework\MockObject\MockBuilder;
|
||||||
|
use PHPUnit\Framework\TestCase;
|
||||||
|
|
||||||
|
class MigrationTest extends TestCase
|
||||||
|
{
|
||||||
|
public function testConstructor()
|
||||||
|
{
|
||||||
|
require_once __DIR__ . '/Stub/2017_12_24_053300_another_stuff.php';
|
||||||
|
|
||||||
|
/** @var MockBuilder|SchemaBuilder $schemaBuilder */
|
||||||
|
$schemaBuilder = $this->getMockBuilder(SchemaBuilder::class)
|
||||||
|
->disableOriginalConstructor()
|
||||||
|
->getMock();
|
||||||
|
|
||||||
|
$instance = new AnotherStuff($schemaBuilder);
|
||||||
|
$this->assertAttributeEquals($schemaBuilder, 'schema', $instance);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,27 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Engelsystem\Database\Migration\Migration;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
|
||||||
|
class CreateLoremIpsumTable extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migration
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
$this->schema->create('lorem_ipsum', function (Blueprint $table) {
|
||||||
|
$table->increments('id');
|
||||||
|
$table->string('name')->unique();
|
||||||
|
$table->string('email');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migration
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
$this->schema->dropIfExists('lorem_ipsum');
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Engelsystem\Database\Migration\Migration;
|
||||||
|
|
||||||
|
class AnotherStuff extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migration
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
// nope
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migration
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
// nope
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Engelsystem\Database\Migration\Migration;
|
||||||
|
|
||||||
|
class AddSomeFeature extends Migration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Run the migration
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
// nope
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migration
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
// nope
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue