From 5bec4e1e7b8f42eba46462746acc3ff018390668 Mon Sep 17 00:00:00 2001 From: Dennis Eichhorn Date: Sun, 4 Apr 2021 17:10:52 +0200 Subject: [PATCH] many fixes and expands and module expansions --- Admin/Install/db.json | 194 ++++++++++++++++++++++ Controller/ApiController.php | 165 ++++++++++++++++++ Controller/BackendController.php | 2 +- Models/Employee.php | 8 + Models/EmployeeEducationHistory.php | 19 +++ Models/EmployeeEducationHistoryMapper.php | 90 ++++++++++ Models/EmployeeHistory.php | 9 + Models/EmployeeHistoryMapper.php | 16 ++ Models/EmployeeMapper.php | 18 ++ Models/EmployeeWorkHistory.php | 15 ++ Models/EmployeeWorkHistoryMapper.php | 88 ++++++++++ Theme/Backend/staff-single.tpl.php | 94 +++++++---- 12 files changed, 684 insertions(+), 34 deletions(-) create mode 100644 Models/EmployeeEducationHistoryMapper.php create mode 100644 Models/EmployeeWorkHistoryMapper.php diff --git a/Admin/Install/db.json b/Admin/Install/db.json index 2b145b6..5c69e69 100755 --- a/Admin/Install/db.json +++ b/Admin/Install/db.json @@ -34,6 +34,32 @@ } } }, + "hr_staff_media": { + "name": "hr_staff_media", + "fields": { + "hr_staff_media_id": { + "name": "hr_staff_media_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "hr_staff_media_item": { + "name": "hr_staff_media_item", + "type": "INT", + "null": false, + "foreignTable": "hr_staff", + "foreignKey": "hr_staff_id" + }, + "hr_staff_media_media": { + "name": "hr_staff_media_media", + "type": "INT", + "null": false, + "foreignTable": "media", + "foreignKey": "media_id" + } + } + }, "hr_staff_history": { "name": "hr_staff_history", "fields": { @@ -87,5 +113,173 @@ "default": null } } + }, + "hr_staff_history_media": { + "name": "hr_staff_history_media", + "fields": { + "hr_staff_history_media_id": { + "name": "hr_staff_history_media_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "hr_staff_history_media_item": { + "name": "hr_staff_history_media_item", + "type": "INT", + "null": false, + "foreignTable": "hr_staff_history", + "foreignKey": "hr_staff_history_id" + }, + "hr_staff_history_media_media": { + "name": "hr_staff_history_media_media", + "type": "INT", + "null": false, + "foreignTable": "media", + "foreignKey": "media_id" + } + } + }, + "hr_staff_education_history": { + "name": "hr_staff_education_history", + "fields": { + "hr_staff_education_history_id": { + "name": "hr_staff_education_history_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "hr_staff_education_history_staff": { + "name": "hr_staff_education_history_staff", + "type": "INT", + "null": false, + "foreignTable": "hr_staff", + "foreignKey": "hr_staff_id" + }, + "hr_staff_education_history_address": { + "name": "hr_staff_education_history_address", + "type": "TEXT", + "null": false + }, + "hr_staff_education_history_title": { + "name": "hr_staff_education_history_title", + "type": "VARCHAR(255)", + "null": false + }, + "hr_staff_education_history_passed": { + "name": "hr_staff_education_history_passed", + "type": "TINYINT", + "null": false + }, + "hr_staff_education_history_score": { + "name": "hr_staff_education_history_score", + "type": "VARCHAR(255)", + "null": false + }, + "hr_staff_education_history_start": { + "name": "hr_staff_education_history_start", + "type": "DATETIME", + "null": false + }, + "hr_staff_education_history_end": { + "name": "hr_staff_education_history_end", + "type": "DATETIME", + "null": true, + "default": null + } + } + }, + "hr_staff_education_history_media": { + "name": "hr_staff_education_history_media", + "fields": { + "hr_staff_education_history_media_id": { + "name": "hr_staff_education_history_media_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "hr_staff_education_history_media_item": { + "name": "hr_staff_education_history_media_item", + "type": "INT", + "null": false, + "foreignTable": "hr_staff_education_history", + "foreignKey": "hr_staff_education_history_id" + }, + "hr_staff_education_history_media_media": { + "name": "hr_staff_education_history_media_media", + "type": "INT", + "null": false, + "foreignTable": "media", + "foreignKey": "media_id" + } + } + }, + "hr_staff_work_history": { + "name": "hr_staff_work_history", + "fields": { + "hr_staff_work_history_id": { + "name": "hr_staff_work_history_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "hr_staff_work_history_staff": { + "name": "hr_staff_work_history_staff", + "type": "INT", + "null": false, + "foreignTable": "hr_staff", + "foreignKey": "hr_staff_id" + }, + "hr_staff_work_history_address": { + "name": "hr_staff_work_history_address", + "type": "TEXT", + "null": false + }, + "hr_staff_work_history_title": { + "name": "hr_staff_work_history_title", + "type": "VARCHAR(255)", + "null": false + }, + "hr_staff_work_history_start": { + "name": "hr_staff_work_history_start", + "type": "DATETIME", + "null": false + }, + "hr_staff_work_history_end": { + "name": "hr_staff_education_history_end", + "type": "DATETIME", + "null": true, + "default": null + } + } + }, + "hr_staff_work_history_media": { + "name": "hr_staff_work_history_media", + "fields": { + "hr_staff_work_history_media_id": { + "name": "hr_staff_work_history_media_id", + "type": "INT", + "null": false, + "primary": true, + "autoincrement": true + }, + "hr_staff_work_history_media_item": { + "name": "hr_staff_work_history_media_item", + "type": "INT", + "null": false, + "foreignTable": "hr_staff_work_history", + "foreignKey": "hr_staff_work_history_id" + }, + "hr_staff_work_history_media_media": { + "name": "hr_staff_work_history_media_media", + "type": "INT", + "null": false, + "foreignTable": "media", + "foreignKey": "media_id" + } + } } } \ No newline at end of file diff --git a/Controller/ApiController.php b/Controller/ApiController.php index f6fea5d..0a4a616 100755 --- a/Controller/ApiController.php +++ b/Controller/ApiController.php @@ -18,6 +18,10 @@ use Modules\Admin\Models\Account; use Modules\HumanResourceManagement\Models\Employee; use Modules\HumanResourceManagement\Models\EmployeeHistory; use Modules\HumanResourceManagement\Models\EmployeeHistoryMapper; +use Modules\HumanResourceManagement\Models\EmployeeEducationHistory; +use Modules\HumanResourceManagement\Models\EmployeeEducationHistoryMapper; +use Modules\HumanResourceManagement\Models\EmployeeWorkHistory; +use Modules\HumanResourceManagement\Models\EmployeeWorkHistoryMapper; use Modules\HumanResourceManagement\Models\EmployeeMapper; use Modules\Profile\Models\Profile; use Modules\Profile\Models\ProfileMapper; @@ -26,6 +30,7 @@ use phpOMS\Message\NotificationLevel; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; use phpOMS\Model\Message\FormValidation; +use phpOMS\Stdlib\Base\AddressType; /** * HumanResourceManagement controller class. @@ -275,4 +280,164 @@ final class ApiController extends Controller return $history; } + + /** + * Api method to create an employee history + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiEmployeeWorkHistoryCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateEmployeeWorkHistoryCreate($request))) { + $response->set('history_work_create', new FormValidation($val)); + $response->header->status = RequestStatusCode::R_400; + + return; + } + + $history = $this->createEmployeeWorkHistoryFromRequest($request); + $this->createModel($request->header->account, $history, EmployeeWorkHistoryMapper::class, 'history', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'History', 'History successfully created', $history); + } + + /** + * Validate employee history + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateEmployeeWorkHistoryCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['employee'] = empty($request->getData('employee'))) + || ($val['start'] = empty($request->getData('start'))) + || ($val['title'] = empty($request->getData('title'))) + || ($val['name'] = empty($request->getData('name'))) + ) { + return $val; + } + + return []; + } + + /** + * Method to create employee history from request. + * + * @param RequestAbstract $request Request + * + * @return EmployeeWorkHistory + * + * @since 1.0.0 + */ + private function createEmployeeWorkHistoryFromRequest(RequestAbstract $request) : EmployeeWorkHistory + { + $history = new EmployeeWorkHistory((int) ($request->getData('employee') ?? 0)); + $history->setStart(new \DateTime($request->getData('start') ?? 'now')); + $history->jobTitle = $request->getData('title'); + $history->address->name = $request->getData('name'); + $history->address->address = $request->getData('address') ?? ''; + $history->address->postal = $request->getData('postal') ?? ''; + $history->address->city = $request->getData('city') ?? ''; + $history->address->state = $request->getData('state') ?? ''; + $history->address->setCountry($request->getData('country') ?? ''); + $history->address->setType(AddressType::WORK); + + if (!empty($request->getData('end'))) { + $history->setEnd(new \DateTime($request->getData('end'))); + } + + return $history; + } + + /** + * Api method to create an employee history + * + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return void + * + * @api + * + * @since 1.0.0 + */ + public function apiEmployeeEducationHistoryCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateEmployeeEducationHistoryCreate($request))) { + $response->set('history_education_create', new FormValidation($val)); + $response->header->status = RequestStatusCode::R_400; + + return; + } + + $history = $this->createEmployeeEducationHistoryFromRequest($request); + $this->createModel($request->header->account, $history, EmployeeEducationHistoryMapper::class, 'history', $request->getOrigin()); + $this->fillJsonResponse($request, $response, NotificationLevel::OK, 'History', 'History successfully created', $history); + } + + /** + * Validate employee history + * + * @param RequestAbstract $request Request + * + * @return array + * + * @since 1.0.0 + */ + private function validateEmployeeEducationHistoryCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['employee'] = empty($request->getData('employee'))) + || ($val['start'] = empty($request->getData('start'))) + || ($val['title'] = empty($request->getData('title'))) + || ($val['name'] = empty($request->getData('name'))) + ) { + return $val; + } + + return []; + } + + /** + * Method to create employee history from request. + * + * @param RequestAbstract $request Request + * + * @return EmployeeEducationHistory + * + * @since 1.0.0 + */ + private function createEmployeeEducationHistoryFromRequest(RequestAbstract $request) : EmployeeEducationHistory + { + $history = new EmployeeEducationHistory((int) ($request->getData('employee') ?? 0)); + $history->setStart(new \DateTime($request->getData('start') ?? 'now')); + $history->educationTitle = $request->getData('title'); + $history->score = $request->getData('score') ?? ''; + $history->passed = (bool) ($request->getData('passed') ?? true); + $history->address->name = $request->getData('name'); + $history->address->address = $request->getData('address') ?? ''; + $history->address->postal = $request->getData('postal') ?? ''; + $history->address->city = $request->getData('city') ?? ''; + $history->address->state = $request->getData('state') ?? ''; + $history->address->setCountry($request->getData('country') ?? ''); + $history->address->setType(AddressType::EDUCATION); + + if (!empty($request->getData('end'))) { + $history->setEnd(new \DateTime($request->getData('end'))); + } + + return $history; + } } diff --git a/Controller/BackendController.php b/Controller/BackendController.php index a2f5d5e..7f5c11c 100755 --- a/Controller/BackendController.php +++ b/Controller/BackendController.php @@ -49,7 +49,7 @@ final class BackendController extends Controller $view->setTemplate('/Modules/HumanResourceManagement/Theme/Backend/staff-list'); $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1002402001, $request, $response)); - $view->setData('employees', EmployeeMapper::getAll(depth: 6)); + $view->setData('employees', EmployeeMapper::getAll(depth: 4)); return $view; } diff --git a/Models/Employee.php b/Models/Employee.php index a2f4c19..ef4ca22 100755 --- a/Models/Employee.php +++ b/Models/Employee.php @@ -54,6 +54,14 @@ class Employee implements \JsonSerializable, ArrayableInterface */ public $image = null; + /** + * Files. + * + * @var Media[] + * @since 1.0.0 + */ + private array $files = []; + /** * Employee department/position history. * diff --git a/Models/EmployeeEducationHistory.php b/Models/EmployeeEducationHistory.php index 7b271c0..3e2ce49 100755 --- a/Models/EmployeeEducationHistory.php +++ b/Models/EmployeeEducationHistory.php @@ -15,6 +15,8 @@ declare(strict_types=1); namespace Modules\HumanResourceManagement\Models; use phpOMS\Contract\ArrayableInterface; +use Modules\Admin\Models\Address; +use Modules\Media\Models\Media; /** * Employee class. @@ -42,6 +44,22 @@ class EmployeeEducationHistory implements \JsonSerializable, ArrayableInterface */ private $employee = 0; + public Address $address; + + public string $educationTitle = ''; + + public bool $passed = true; + + public string $score = ''; + + /** + * Files. + * + * @var Media[] + * @since 1.0.0 + */ + private array $files = []; + /** * Start date * @@ -69,6 +87,7 @@ class EmployeeEducationHistory implements \JsonSerializable, ArrayableInterface { $this->employee = $employee; $this->start = new \DateTime('now'); + $this->address = new Address(); } /** diff --git a/Models/EmployeeEducationHistoryMapper.php b/Models/EmployeeEducationHistoryMapper.php new file mode 100644 index 0000000..f0e5171 --- /dev/null +++ b/Models/EmployeeEducationHistoryMapper.php @@ -0,0 +1,90 @@ + + * @since 1.0.0 + */ + protected static array $columns = [ + 'hr_staff_education_history_id' => ['name' => 'hr_staff_education_history_id', 'type' => 'int', 'internal' => 'id'], + 'hr_staff_education_history_staff' => ['name' => 'hr_staff_education_history_staff', 'type' => 'int', 'internal' => 'employee'], + 'hr_staff_education_history_address' => ['name' => 'hr_staff_education_history_address', 'type' => 'Serializable', 'internal' => 'address'], + 'hr_staff_education_history_title' => ['name' => 'hr_staff_education_history_title', 'type' => 'string', 'internal' => 'educationTitle'], + 'hr_staff_education_history_passed' => ['name' => 'hr_staff_education_history_passed', 'type' => 'bool', 'internal' => 'passed'], + 'hr_staff_education_history_score' => ['name' => 'hr_staff_education_history_score', 'type' => 'string', 'internal' => 'score'], + 'hr_staff_education_history_start' => ['name' => 'hr_staff_education_history_start', 'type' => 'DateTime', 'internal' => 'start'], + 'hr_staff_education_history_end' => ['name' => 'hr_staff_education_history_end', 'type' => 'DateTime', 'internal' => 'end'], + ]; + + /** + * Belongs to. + * + * @var array + * @since 1.0.0 + */ + protected static array $belongsTo = [ + 'employee' => [ + 'mapper' => EmployeeMapper::class, + 'external' => 'hr_staff_education_history_staff', + ], + ]; + + /** + * Has many relation. + * + * @var array + * @since 1.0.0 + */ + protected static array $hasMany = [ + 'files' => [ + 'mapper' => MediaMapper::class, /* mapper of the related object */ + 'table' => 'hr_staff_work_history_media', /* table of the related object, null if no relation table is used (many->1) */ + 'external' => 'hr_staff_work_history_media_media', + 'self' => 'hr_staff_work_history_media_item', + ], + ]; + + /** + * Primary field name. + * + * @var string + * @since 1.0.0 + */ + protected static string $primaryField = 'hr_staff_education_history_id'; + + /** + * Primary table. + * + * @var string + * @since 1.0.0 + */ + protected static string $table = 'hr_staff_education_history'; +} diff --git a/Models/EmployeeHistory.php b/Models/EmployeeHistory.php index a128647..7aad680 100755 --- a/Models/EmployeeHistory.php +++ b/Models/EmployeeHistory.php @@ -21,6 +21,7 @@ use Modules\Organization\Models\NullUnit; use Modules\Organization\Models\Position; use Modules\Organization\Models\Unit; use phpOMS\Contract\ArrayableInterface; +use Modules\Media\Models\Media; /** * Employee class. @@ -72,6 +73,14 @@ class EmployeeHistory implements \JsonSerializable, ArrayableInterface */ private $position = null; + /** + * Files. + * + * @var Media[] + * @since 1.0.0 + */ + private array $files = []; + /** * Start date * diff --git a/Models/EmployeeHistoryMapper.php b/Models/EmployeeHistoryMapper.php index 52d05a2..f147054 100755 --- a/Models/EmployeeHistoryMapper.php +++ b/Models/EmployeeHistoryMapper.php @@ -18,6 +18,7 @@ use Modules\Organization\Models\DepartmentMapper; use Modules\Organization\Models\PositionMapper; use Modules\Organization\Models\UnitMapper; use phpOMS\DataStorage\Database\DataMapperAbstract; +use Modules\Media\Models\MediaMapper; /** * EmployeHistory mapper class. @@ -70,6 +71,21 @@ final class EmployeeHistoryMapper extends DataMapperAbstract ], ]; + /** + * Has many relation. + * + * @var array + * @since 1.0.0 + */ + protected static array $hasMany = [ + 'files' => [ + 'mapper' => MediaMapper::class, /* mapper of the related object */ + 'table' => 'hr_staff_work_history_media', /* table of the related object, null if no relation table is used (many->1) */ + 'external' => 'hr_staff_work_history_media_media', + 'self' => 'hr_staff_work_history_media_item', + ], + ]; + /** * Primary field name. * diff --git a/Models/EmployeeMapper.php b/Models/EmployeeMapper.php index a330f90..affdfd0 100755 --- a/Models/EmployeeMapper.php +++ b/Models/EmployeeMapper.php @@ -76,12 +76,30 @@ final class EmployeeMapper extends DataMapperAbstract * @since 1.0.0 */ protected static array $hasMany = [ + 'files' => [ + 'mapper' => MediaMapper::class, /* mapper of the related object */ + 'table' => 'hr_staff_media', /* table of the related object, null if no relation table is used (many->1) */ + 'external' => 'hr_staff_media_media', + 'self' => 'hr_staff_media_item', + ], 'companyHistory' => [ 'mapper' => EmployeeHistoryMapper::class, 'table' => 'hr_staff_history', // @todo: is this requried? This is stored in the mapper already. In other places I'm not using this, either use it everywhere or nowhere. Using the mapper is slower but protects us from table name changes! 'self' => 'hr_staff_history_staff', 'external' => null, ], + 'workHistory' => [ + 'mapper' => EmployeeWorkHistoryMapper::class, + 'table' => 'hr_staff_work_history', // @todo: is this requried? This is stored in the mapper already. In other places I'm not using this, either use it everywhere or nowhere. Using the mapper is slower but protects us from table name changes! + 'self' => 'hr_staff_work_history_staff', + 'external' => null, + ], + 'educationHistory' => [ + 'mapper' => EmployeeEducationHistoryMapper::class, + 'table' => 'hr_staff_education_history', // @todo: is this requried? This is stored in the mapper already. In other places I'm not using this, either use it everywhere or nowhere. Using the mapper is slower but protects us from table name changes! + 'self' => 'hr_staff_education_history_staff', + 'external' => null, + ], ]; /** diff --git a/Models/EmployeeWorkHistory.php b/Models/EmployeeWorkHistory.php index b246138..79cfb3a 100755 --- a/Models/EmployeeWorkHistory.php +++ b/Models/EmployeeWorkHistory.php @@ -15,6 +15,8 @@ declare(strict_types=1); namespace Modules\HumanResourceManagement\Models; use phpOMS\Contract\ArrayableInterface; +use Modules\Admin\Models\Address; +use Modules\Media\Models\Media; /** * Employee class. @@ -42,6 +44,18 @@ class EmployeeWorkHistory implements \JsonSerializable, ArrayableInterface */ private $employee = 0; + public Address $address; + + public string $jobTitle = ''; + + /** + * Files. + * + * @var Media[] + * @since 1.0.0 + */ + private array $files = []; + /** * Start date * @@ -69,6 +83,7 @@ class EmployeeWorkHistory implements \JsonSerializable, ArrayableInterface { $this->employee = $employee; $this->start = new \DateTime('now'); + $this->address = new Address(); } /** diff --git a/Models/EmployeeWorkHistoryMapper.php b/Models/EmployeeWorkHistoryMapper.php new file mode 100644 index 0000000..f7c3335 --- /dev/null +++ b/Models/EmployeeWorkHistoryMapper.php @@ -0,0 +1,88 @@ + + * @since 1.0.0 + */ + protected static array $columns = [ + 'hr_staff_work_history_id' => ['name' => 'hr_staff_work_history_id', 'type' => 'int', 'internal' => 'id'], + 'hr_staff_work_history_staff' => ['name' => 'hr_staff_work_history_staff', 'type' => 'int', 'internal' => 'employee'], + 'hr_staff_work_history_address' => ['name' => 'hr_staff_work_history_address', 'type' => 'Serializable', 'internal' => 'address'], + 'hr_staff_work_history_title' => ['name' => 'hr_staff_work_history_title', 'type' => 'string', 'internal' => 'jobTitle'], + 'hr_staff_work_history_start' => ['name' => 'hr_staff_work_history_start', 'type' => 'DateTime', 'internal' => 'start'], + 'hr_staff_work_history_end' => ['name' => 'hr_staff_work_history_end', 'type' => 'DateTime', 'internal' => 'end'], + ]; + + /** + * Belongs to. + * + * @var array + * @since 1.0.0 + */ + protected static array $belongsTo = [ + 'employee' => [ + 'mapper' => EmployeeMapper::class, + 'external' => 'hr_staff_work_history_staff', + ], + ]; + + /** + * Has many relation. + * + * @var array + * @since 1.0.0 + */ + protected static array $hasMany = [ + 'files' => [ + 'mapper' => MediaMapper::class, /* mapper of the related object */ + 'table' => 'hr_staff_work_history_media', /* table of the related object, null if no relation table is used (many->1) */ + 'external' => 'hr_staff_work_history_media_media', + 'self' => 'hr_staff_work_history_media_item', + ], + ]; + + /** + * Primary field name. + * + * @var string + * @since 1.0.0 + */ + protected static string $primaryField = 'hr_staff_work_history_id'; + + /** + * Primary table. + * + * @var string + * @since 1.0.0 + */ + protected static string $table = 'hr_staff_work_history'; +} diff --git a/Theme/Backend/staff-single.tpl.php b/Theme/Backend/staff-single.tpl.php index a2ebfde..ee55596 100755 --- a/Theme/Backend/staff-single.tpl.php +++ b/Theme/Backend/staff-single.tpl.php @@ -17,7 +17,9 @@ use Modules\Media\Models\NullMedia; use phpOMS\Uri\UriFactory; $employee = $this->getData('employee'); -$history = $employee->getHistorY(); +$history = $employee->getHistory(); +$education = $employee->getEducationHistory(); +$work = $employee->getWorkHistory(); $recentHistory = $employee->getNewestHistory(); echo $this->getData('nav')->render(); ?> @@ -40,9 +42,9 @@ echo $this->getData('nav')->render(); ?>
-
-

printHtml($employee->profile->account->name2); ?>, printHtml($employee->profile->account->name1); ?>

-
+
+
printHtml($employee->profile->account->name2); ?>, printHtml($employee->profile->account->name1); ?>
+
getData('nav')->render(); ?> itemprop="logo" loading="lazy" src="image instanceof NullMedia ? - $employee->profile->image instanceof NullMedia ? + ($employee->profile->image instanceof NullMedia ? UriFactory::build('Web/Backend/img/user_default_' . \mt_rand(1, 6) .'.png') : - UriFactory::build('{/prefix}' . $employee->profile->image->getPath()) : + UriFactory::build('{/prefix}' . $employee->profile->image->getPath())) : UriFactory::build('{/prefix}' . $employee->image->getPath()); ?>" > @@ -105,9 +107,9 @@ echo $this->getData('nav')->render(); ?>
-
+
+
getHtml('History'); ?>
-
getHtml('History'); ?>
getHtml('Start'); ?> getHtml('End'); ?> @@ -132,9 +134,9 @@ echo $this->getData('nav')->render(); ?>
-
-

getHtml('Clocking'); ?>

-
+
+
getHtml('Clocking'); ?>
+
@@ -144,9 +146,9 @@ echo $this->getData('nav')->render(); ?>
-
-

getHtml('Clocking'); ?>

-
+
+
getHtml('Documents'); ?>
+
@@ -156,9 +158,9 @@ echo $this->getData('nav')->render(); ?>
-
-

getHtml('Clocking'); ?>

-
+
+
getHtml('Contracts'); ?>
+
@@ -168,9 +170,9 @@ echo $this->getData('nav')->render(); ?>
-
-

getHtml('Clocking'); ?>

-
+
+
getHtml('Remarks'); ?>
+
@@ -180,9 +182,9 @@ echo $this->getData('nav')->render(); ?>
-
-

getHtml('Clocking'); ?>

-
+
+
getHtml('Evaluations'); ?>
+
@@ -192,11 +194,24 @@ echo $this->getData('nav')->render(); ?>
-
-

getHtml('Clocking'); ?>

-
-
-
+
+
getHtml('Education'); ?>
+ + + + + +
getHtml('Start'); ?> + getHtml('End'); ?> + getHtml('Title'); ?> + getHtml('Address'); ?> +
getStart()->format('Y-m-d'); ?> + getEnd() === null ? '' : $hist->getEnd()->format('Y-m-d'); ?> + printHtml($hist->educationTitle); ?> + printHtml($hist->address->name); ?> + +
+
@@ -204,11 +219,24 @@ echo $this->getData('nav')->render(); ?>
-
-

getHtml('Clocking'); ?>

-
-
-
+
+
getHtml('Work'); ?>
+ + + + + +
getHtml('Start'); ?> + getHtml('End'); ?> + getHtml('Title'); ?> + getHtml('Address'); ?> +
getStart()->format('Y-m-d'); ?> + getEnd() === null ? '' : $hist->getEnd()->format('Y-m-d'); ?> + printHtml($hist->jobTitle); ?> + printHtml($hist->address->name); ?> + +
+