Compare commits

..

126 Commits

Author SHA1 Message Date
gamonoid
c7af2070e5 📄 Release notes 2017-09-09 19:09:47 +02:00
gamonoid
275a4af728 Update icehrm url link 2017-09-09 18:36:41 +02:00
gamonoid
be0500440c ♻️ Remove unwanted files from release 2017-09-09 17:39:11 +02:00
gamonoid
6cf78537a6 Read me updated with manual installation instructions 2017-09-09 15:32:28 +02:00
gamonoid
0ab818b398 Fix payroll attendance hooks 💶 2017-09-09 15:25:46 +02:00
gamonoid
e650771867 Fixes for payroll generation with mysql 5.7 strict modes 💶 2017-09-09 15:24:24 +02:00
gamonoid
382eef1ac0 Adding migration for payroll group 💶 2017-09-09 15:23:38 +02:00
gamonoid
91c8b938c5 Fix db migration manager issues 2017-09-08 06:51:29 +02:00
gamonoid
5336fe7449 Update build.xml 2017-09-08 00:13:00 +02:00
gamonoid
faeae30a5f Update readme and release notes 2017-09-07 23:52:28 +02:00
gamonoid
764a13ddea Update build settings 2017-09-07 23:44:45 +02:00
gamonoid
becda3d0e1 Removing dependency on sample data 2017-09-07 08:43:09 +02:00
Thilina Hasantha
9b5bf92903 Merge pull request #63 from gamonoid/v20.0-refactoring
Refactoring
2017-09-05 08:31:10 +02:00
gamonoid
c3e5119590 Connect to db only after creating tables 2017-09-05 08:25:00 +02:00
gamonoid
96512dbbc6 change host name 2017-09-05 08:21:46 +02:00
gamonoid
ba6d84d240 Add phpunit file 2017-09-05 08:13:09 +02:00
gamonoid
d793d3575b Restructuring unit/integration tests 2017-09-05 08:07:33 +02:00
gamonoid
a0aacba4f5 Update .travis.yml 2017-09-04 17:33:13 +02:00
gamonoid
cdbcb8a890 Update LogManager.php 2017-09-04 17:31:43 +02:00
gamonoid
ab3594ea1c Update .travis.yml 2017-09-04 17:29:46 +02:00
gamonoid
ccced8648b Update .travis.yml 2017-09-04 17:28:40 +02:00
gamonoid
d2da85c9be Update .travis.yml 2017-09-04 17:22:49 +02:00
gamonoid
5628a2650d Update .travis.yml 2017-09-04 17:19:16 +02:00
gamonoid
23ebac01ed Update .travis.yml 2017-09-04 17:13:59 +02:00
gamonoid
5484eed918 Update composer.json 2017-09-04 17:12:26 +02:00
gamonoid
df7bed49e4 Update .travis.yml 2017-09-04 17:10:06 +02:00
gamonoid
941f5d41f9 Update composer.json 2017-09-04 17:06:10 +02:00
Gamonoid
e1f6d782d2 phpunit 2017-09-04 10:58:17 -04:00
gamonoid
866796f524 Update .travis.yml 2017-09-04 16:48:33 +02:00
gamonoid
36275f84f1 Update .travis.yml 2017-09-04 15:37:43 +02:00
gamonoid
3e8871c485 Update .travis.yml 2017-09-04 14:54:44 +02:00
gamonoid
732cbfc918 Update .travis.yml 2017-09-04 14:25:19 +02:00
gamonoid
26f0cdcca0 Update .travis.yml 2017-09-04 14:12:09 +02:00
gamonoid
9aed367476 Finally found the case sensitivity issue 👹 2017-09-04 14:00:24 +02:00
gamonoid
b75925dcc2 change log file path 2017-09-04 08:47:41 +02:00
gamonoid
6ee15d7c32 Enable php 5.5 and 5.6 2017-09-04 08:34:26 +02:00
gamonoid
73a2eabc05 Fix incorrect manager class name issue 2017-09-04 08:33:12 +02:00
gamonoid
f8774c5ad2 Remove php 5.5 and 5.6 2017-09-04 08:22:38 +02:00
gamonoid
fd14de27c0 travis logging 2017-09-04 08:19:58 +02:00
gamonoid
54d39ecf90 Fix logging issue 2017-09-04 08:17:50 +02:00
gamonoid
4dff9cc104 remove build local 2017-09-04 08:04:00 +02:00
gamonoid
235991cd6f Fix sample data script 2017-09-04 07:54:39 +02:00
gamonoid
9c5e38a8df Remove invalid dates from sample data and fix tests 2017-09-04 07:52:14 +02:00
gamonoid
4821ab2d65 Copy to test dir 2017-09-04 07:20:02 +02:00
gamonoid
7c41c65c3f Keep test dir 2017-09-04 07:11:33 +02:00
gamonoid
7522549a12 Fixes t unit test classes 2017-09-04 07:08:40 +02:00
gamonoid
ed36ae0672 Moving migrations and scripts 2017-09-04 06:59:14 +02:00
gamonoid
737b392d0a Fix for mysql 5.7 strict date issue 2017-09-04 05:50:37 +02:00
gamonoid
385747dea4 Moving language files 2017-09-04 05:50:11 +02:00
gamonoid
71dbfe430e Code fixes for date time change 2017-09-03 21:35:00 +02:00
gamonoid
0e2c5daacf Fix mysql 5.7 DB restrictions on date time column values 2017-09-03 21:29:44 +02:00
gamonoid
a7274d3cfd Refactoring 2017-09-03 20:39:22 +02:00
Thilina Hasantha
af40881847 Read me updated 2016-12-28 23:20:56 +01:00
Thilina Hasantha
0608434dde Read me updated 2016-12-28 09:28:11 +01:00
Gamonoid
27779782fc Merge branch 'master' into v19.x 2016-12-14 12:52:08 +01:00
Gamonoid
04bafeec81 Merge branch 'v19.x' of https://github.com/gamonoid/icehrm into v19.x 2016-12-14 12:41:57 +01:00
Gamonoid
cc1ac5a75e fix dashboard error 2016-12-14 12:38:51 +01:00
Gamonoid
7528e5eabd Check updates 2016-12-06 18:14:19 +01:00
Gamonoid
ef72f8daa3 No need to have an extended login 2016-12-06 17:39:20 +01:00
Thilina Hasantha
967c69b04e Fix typo 2016-12-06 00:48:16 +01:00
Thilina Hasantha
a2a23a2bb4 Merge branch 'v19.x' 2016-12-05 23:43:13 +01:00
Thilina Hasantha
d022651a24 Fix https url installation issue 2016-12-05 23:42:29 +01:00
icehrm
a619f76b3a v19.0.OS (#35)
* Updates from pro v19

* Update travis

* Update db script

* Update docs

* change build script
2016-12-05 16:22:47 +01:00
Thilina Hasantha
9f0626c1f7 change build 2016-11-29 09:26:47 +01:00
Thilina Hasantha
ec85cfa521 Update ready 2016-11-29 00:19:56 +01:00
Thilina Hasantha
b15e432756 Update docs 2016-11-29 00:18:32 +01:00
Gamonoid
1b7bea571f Update db script 2016-11-28 16:45:05 +01:00
Gamonoid
1f60c4b217 Update travis 2016-11-25 17:27:24 +01:00
Gamonoid
ed739aa4e1 Updates from pro v19 2016-11-25 17:21:30 +01:00
Gamonoid
e6b4245334 Updates from pro v19 2016-11-25 17:20:39 +01:00
Gamonoid
4c171bfce3 PHP unit for build 2016-11-25 16:19:16 +01:00
Gamonoid
3bb3f038bf Approval Manager tester added 2016-11-25 16:15:41 +01:00
Gamonoid
4f6cdd98f8 add travis status 2016-11-25 15:06:29 +01:00
Gamonoid
81f7a97096 Fix travis-ci builds 2016-11-25 15:01:44 +01:00
Gamonoid
ab2a0293a6 fix travis-ci build path 2016-11-25 14:56:13 +01:00
Gamonoid
283ef1e377 fix travis-ci build path 2016-11-25 14:54:16 +01:00
Gamonoid
55f8ae364f fix travis-ci build path 2016-11-25 14:49:40 +01:00
Gamonoid
564ce43c18 fix travis-ci build path 2016-11-25 14:36:21 +01:00
Gamonoid
bd9e5acd65 fix travis-ci build path 2016-11-25 14:31:55 +01:00
Gamonoid
a4a38a1869 add ant buid 2016-11-25 14:29:23 +01:00
Gamonoid
e1aa2c1365 add ant buid 2016-11-25 14:09:17 +01:00
Gamonoid
b1bfd2f39d add ant buid 2016-11-25 14:05:58 +01:00
Gamonoid
4c3f27914b add ant buid 2016-11-25 14:04:02 +01:00
Gamonoid
214ab89ce8 add ant buid 2016-11-25 13:57:38 +01:00
Gamonoid
9348be0acd Add vagrant machine, new test and travis-ci config 2016-11-25 13:53:36 +01:00
Gamonoid
21c5d09bac Adding src dir 2016-11-25 11:39:25 +01:00
Thilina Hasantha
13085bcecc Remove submodule 2016-11-25 11:15:11 +01:00
Thilina Hasantha
9271156708 Adding sub module 2016-10-04 03:40:11 +02:00
Thilina Hasantha
6ac1320f6a no message 2016-10-04 03:28:35 +02:00
Thilina Hasantha
dcfc009938 Remove sub module 2016-10-04 03:23:36 +02:00
Thilina Hasantha
b9ba064dbb Adding isotope core submodule 2016-10-04 02:59:41 +02:00
Thilina Hasantha
f78f5592d3 Fix dashboard translations 2016-08-06 02:37:26 +05:30
Thilina Hasantha
d9f0d52eed Fix upgrade script 2016-08-05 13:37:56 +05:30
Thilina Hasantha
fb8e970f7e Update read me 2016-08-05 13:11:11 +05:30
Thilina Hasantha
e78331f5b3 Update readme 2016-08-05 09:43:37 +05:30
Thilina Hasantha
9e415d589e Update read 2016-08-05 09:42:02 +05:30
Thilina Hasantha
b2f83c51e4 Fix missing status change popup 2016-08-05 08:18:55 +05:30
Thilina Hasantha
585036b209 Add language setting 2016-08-04 20:30:13 +05:30
Thilina Hasantha
91c6867e2f Fix color issue 2016-08-04 19:33:58 +05:30
Thilina Hasantha
912ff56260 Add missing field 2016-08-04 17:37:35 +05:30
Thilina Hasantha
1bd4014cb9 Document loading error fix 2016-08-04 17:19:45 +05:30
Thilina Hasantha
d226a18912 style css fixes 2016-08-04 17:14:06 +05:30
Thilina Hasantha
1e9e6f31a2 Fix related to employee custom fields 2016-08-04 17:09:17 +05:30
Thilina Hasantha
698c5d3daa Fix document tab display issue 2016-08-04 15:10:15 +05:30
Thilina Hasantha
271a39b3d4 Color change 2016-08-04 14:53:23 +05:30
Thilina Hasantha
217664e636 Fix column count issue 2016-08-04 14:40:40 +05:30
Thilina Hasantha
6e4d32933b Fix lint error 2016-08-04 14:37:26 +05:30
Thilina Hasantha
a10fbba14a IceHrm v18.0 2016-08-04 14:27:59 +05:30
Thilina Hasantha
9e243073df Docker 2016-07-31 11:03:43 +05:30
Thilina Hasantha
1757421d9f Fix for php7 2016-06-10 03:23:41 +05:30
Thilina Hasantha
37299ac1a8 Change version to v16.1.OS 2016-05-05 20:35:33 +05:30
Thilina Hasantha
f614e0ebf0 Ready updated 2016-05-05 20:32:49 +05:30
Thilina Hasantha
66ced28bad v16.1 2016-05-05 20:29:17 +05:30
Thilina Hasantha
22a371eef9 Fix LDAP issue 2016-04-26 19:52:29 +05:30
Thilina Hasantha
143961cf3f Fix master data issue 2016-04-17 12:14:15 +05:30
Thilina Hasantha
aae74a8cc9 Fix ready link 2016-04-17 11:48:57 +05:30
Thilina Hasantha
3c89cb277c Preparing for v16.0.OS release 2016-04-17 11:34:30 +05:30
Thilina Hasantha
48619a086c Fix issues with DB script 2016-04-17 08:59:50 +05:30
Thilina Hasantha
ace8020028 Fix 2016-04-17 00:28:01 +05:30
Thilina Hasantha
acf281371b Adding travel module 2016-04-17 00:20:39 +05:30
Thilina Hasantha
39820b84e0 Fix js error 2016-04-16 23:53:03 +05:30
Thilina Hasantha
5656910eab Changes to db scripts 2016-04-16 22:00:33 +05:30
Thilina Hasantha
0594d84ed1 Remove leave settings from open source 2016-04-16 21:48:38 +05:30
Thilina Hasantha
fbd77cedf7 Fix 500 2016-04-16 21:44:03 +05:30
Thilina Hasantha
045e85f3ad Fix salary module issues 2016-04-16 17:44:27 +05:30
Thilina Hasantha
f6d5202ad5 Fix login page styles 2016-04-16 07:55:03 +05:30
5124 changed files with 562232 additions and 20672 deletions

8
.gitignore vendored
View File

@@ -1,4 +1,10 @@
/.settings
/.buildpath
/.project
/.idea
/.idea/
/build
/deployment/clients/dev/data/
/deployment/clients/test/data/
/.vagrant
/app/config.php
/app/data/*.log

13
.travis.yml Normal file
View File

@@ -0,0 +1,13 @@
services:
- mysql
before_script:
- echo "USE mysql;\nUPDATE user SET password=PASSWORD('dev') WHERE user='root';\nFLUSH PRIVILEGES;\n" | mysql -u root
install:
- composer require --dev phpunit/phpunit ^5.7
- $TRAVIS_BUILD_DIR/vendor/bin/phpunit --version
script: $TRAVIS_BUILD_DIR/vendor/bin/phpunit
language: php
php:
- '5.6'
- '7.0'
after_failure: "cat /tmp/icehrm.test.log"

215
LICENSE
View File

@@ -1,202 +1,21 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
MIT License
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
Copyright (c) 2016 Thilina Hasantha
1. Definitions.
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

29
Vagrantfile vendored Normal file
View File

@@ -0,0 +1,29 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure(2) do |config|
config.vm.box = "thilinah/jessie64_isotope"
config.vm.box_version = "0.0.1"
config.vm.network "private_network", ip: "192.168.40.40"
config.vm.synced_folder ".", "/vagrant", type: "nfs"
config.vm.provider "virtualbox" do |vb|
vb.memory = "1024"
vb.cpus = "2"
vb.name = "icehrm.open"
end
config.vm.provision "shell", inline: <<-SHELL
sudo apt-get update
SHELL
config.vm.hostname = "icehrm.open"
config.hostsupdater.aliases = [
"app.dev",
"app.app.dev",
"clients.app.dev"
]
end

View File

@@ -2,17 +2,17 @@
<div class="small-box bg-yellow">
<div class="inner">
<h3>
Attendance
<t>Attendance</t>
</h3>
<p id="numberOfAttendanceLastWeek">
#_numberOfAttendanceLastWeek_# Entries Last Week
#_numberOfAttendanceLastWeek_# <t>Entries Last Week</t>
</p>
</div>
<div class="icon">
<i class="ion ion-clock"></i>
</div>
<a href="#_moduleLink_#" class="small-box-footer" id="attendanceLink">
Monitor Attendance <i class="fa fa-arrow-circle-right"></i>
<t>Monitor Attendance</t> <i class="fa fa-arrow-circle-right"></i>
</a>
</div>
</div>

View File

@@ -17,31 +17,29 @@ along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
$moduleName = 'attendance_monitor';
define('MODULE_PATH',dirname(__FILE__));
include APP_BASE_PATH.'header.php';
include APP_BASE_PATH.'modulejslibs.inc.php';
$photoAttendance = \Classes\SettingsManager::getInstance()->getSetting('Attendance: Photo Attendance');
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabAttendance" href="#tabPageAttendance">Monitor Attendance</a></li>
<li class=""><a id="tabAttendanceStatus" href="#tabPageAttendanceStatus">Current Clocked In Status</a></li>
<!--
<li class=""><a id="tabAttendanceData" href="#tabPageAttendanceData">Attendance Data Update</a></li>
-->
<li class="active"><a id="tabAttendance" href="#tabPageAttendance"><?=t('Monitor Attendance')?></a></li>
<li class=""><a id="tabAttendanceStatus" href="#tabPageAttendanceStatus"><?=t('Current Clocked In Status')?></a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="tabPageAttendance">
<div id="Attendance" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="AttendanceForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPageAttendanceStatus">
@@ -52,31 +50,48 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
</div>
</div>
<!--
<div class="tab-pane" id="tabPageAttendanceData">
<div class="control-group" id="field__id_">
<div class="controls">
<textarea class="input-xxlarge" placeholder="Insert CSV data to submit" type="textarea" width="96%" rows="100" id="attendanceData" name="attendanceData"></textarea>
</div>
</div>
<div class="control-group">
<div class="controls">
<button onclick="return false;" class="btn">Update Attendance Data</button>
</div>
</div>
</div>
-->
</div>
</div>
<div class="modal" id="attendancePhotoModel" tabindex="-1" role="dialog" aria-labelledby="messageModelLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><li class="fa fa-times"/></button>
<h3 style="font-size: 17px;">Attendance Details</h3>
</div>
<div class="modal-body">
<div class="row" style="background: #f3f4f5; padding: 10px;text-align: center;">
<h4 id="attendnaceCanvasEmp"></h4>
</div>
<div class="row" style="background: #f3f4f5; padding: 10px;">
<div class="col-sm-6" style="text-align: center;">
<canvas id="attendnaceCanvasIn" height="156" width="208" style="border: 1px #222 dotted;"></canvas>
<hr/>
<span id="attendnaceCanvasPunchInTime"></span>
</div>
<div class="col-sm-6" style="text-align: center;">
<canvas id="attendnaceCanvasOut" height="156" width="208" style="border: 1px #222 dotted;"></canvas>
<hr/>
<span id="attendnaceCanvasPunchOutTime"></span>
</div>
</div>
</div>
<div class="modal-footer">
</div>
</div>
</div>
</div>
<script>
var modJsList = new Array();
modJsList['tabAttendance'] = new AttendanceAdapter('Attendance','Attendance','','in_time desc');
modJsList['tabAttendance'].setRemoteTable(true);
modJsList['tabAttendance'].setPhotoAttendance(<?=$photoAttendance == '1'?>);
modJsList['tabAttendanceStatus'] = new AttendanceStatusAdapter('AttendanceStatus','AttendanceStatus','','');
modJsList['tabAttendanceStatus'].setShowAddNew(false);
var modJs = modJsList['tabAttendance'];
</script>
<?php include APP_BASE_PATH.'footer.php';?>
<?php include APP_BASE_PATH.'footer.php';?>

View File

@@ -16,12 +16,13 @@ along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
function AttendanceAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
this.photoAttendance = false;
}
AttendanceAdapter.inherits(AdapterBase);
@@ -61,15 +62,19 @@ AttendanceAdapter.method('getFormFields', function() {
AttendanceAdapter.method('getFilters', function() {
return [
[ "employee", {"label":"Employee","type":"select2","allow-null":false,"remote-source":["Employee","id","first_name+last_name"]}]
];
});
AttendanceAdapter.method('setPhotoAttendance', function(val) {
this.photoAttendance = val;
});
AttendanceAdapter.method('getCustomTableParams', function() {
var that = this;
var dataTableParams = {
"aoColumnDefs": [
"aoColumnDefs": [
{
"fnRender": function(data, cell){
return that.preProcessRemoteTableData(data, cell, 2)
@@ -116,7 +121,7 @@ AttendanceAdapter.method('preProcessRemoteTableData', function(data, cell, id) {
}
return cell;
}
});
@@ -125,26 +130,26 @@ AttendanceAdapter.method('save', function() {
var validator = new FormValidation(this.getTableName()+"_submit",true,{'ShowPopup':false,"LabelErrorClass":"error"});
if(validator.checkValues()){
var params = validator.getFormParameters();
var msg = this.doCustomValidation(params);
if(msg == null){
var id = $('#'+this.getTableName()+"_submit #id").val();
if(id != null && id != undefined && id != ""){
$(params).attr('id',id);
}
var reqJson = JSON.stringify(params);
var callBackData = [];
callBackData['callBackData'] = [];
callBackData['callBackSuccess'] = 'saveSuccessCallback';
callBackData['callBackFail'] = 'saveFailCallback';
this.customAction('savePunch','admin=attendance',reqJson,callBackData);
}else{
$("#"+this.getTableName()+'Form .label').html(msg);
$("#"+this.getTableName()+'Form .label').show();
}
}
});
@@ -166,6 +171,84 @@ AttendanceAdapter.method('isSubProfileTable', function() {
}
});
AttendanceAdapter.method('showPunchImages', function(id) {
var reqJson = JSON.stringify({id: id});
var callBackData = [];
callBackData['callBackData'] = [];
callBackData['callBackSuccess'] = 'getImagesSuccessCallback';
callBackData['callBackFail'] = 'getImagesFailCallback';
this.customAction('getImages','admin=attendance',reqJson,callBackData);
});
AttendanceAdapter.method('getImagesSuccessCallback', function(callBackData) {
$('#attendancePhotoModel').modal('show');
$('#attendnaceCanvasEmp').html(callBackData.employee_Name);
if (callBackData.in_time) {
$('#attendnaceCanvasPunchInTime').html(Date.parse(callBackData.in_time).toString('yyyy MMM d <b>HH:mm</b>'));
}
if (callBackData.image_in) {
var myCanvas = document.getElementById('attendnaceCanvasIn');
var ctx = myCanvas.getContext('2d');
var img = new Image;
img.onload = function(){
ctx.drawImage(img,0,0); // Or at whatever offset you like
};
img.src = callBackData.image_in;
}
if (callBackData.out_time) {
$('#attendnaceCanvasPunchOutTime').html(Date.parse(callBackData.out_time).toString('yyyy MMM d <b>HH:mm</b>'));
}
if (callBackData.image_out) {
var myCanvas = document.getElementById('attendnaceCanvasOut');
var ctx = myCanvas.getContext('2d');
var img = new Image;
img.onload = function(){
ctx.drawImage(img,0,0); // Or at whatever offset you like
};
img.src = callBackData.image_out;
}
});
AttendanceAdapter.method('getImagesFailCallback', function(callBackData) {
this.showMessage("Error", callBackData);
});
AttendanceAdapter.method('getActionButtonsHtml', function(id,data) {
var editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
var deleteButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Delete" onclick="modJs.deleteRow(_id_);return false;"></img>';
var photoButton = '<img class="tableActionButton" src="_BASE_images/cam.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Show Photo" onclick="modJs.showPunchImages(_id_);return false;"></img>';
var html;
if (this.photoAttendance) {
html = '<div style="width:80px;">_edit__delete__photo_</div>';
} else {
html = '<div style="width:80px;">_edit__delete_</div>';
}
html = html.replace('_photo_',photoButton);
if(this.showDelete){
html = html.replace('_delete_',deleteButton);
}else{
html = html.replace('_delete_','');
}
if(this.showEdit){
html = html.replace('_edit_',editButton);
}else{
html = html.replace('_edit_','');
}
html = html.replace(/_id_/g,id);
html = html.replace(/_BASE_/g,this.baseUrl);
return html;
});
/*
Attendance Status
@@ -231,4 +314,4 @@ AttendanceStatusAdapter.method('isSubProfileTable', function() {
}else{
return true;
}
});
});

View File

@@ -0,0 +1,14 @@
{
"label": "Monitor Attendance",
"menu": "Employees",
"order": "8",
"icon": "fa-clock-o",
"user_levels": [
"Admin",
"Manager"
],
"dashboardPosition": 5,
"permissions": [],
"model_namespace": "\\Attendance\\Common\\Model",
"manager": "\\Attendance\\Admin\\Api\\AttendanceAdminManager"
}

View File

@@ -2,16 +2,16 @@
<div class="small-box bg-green">
<div class="inner">
<h3>Company</h3>
<h3><t>Company</t></h3>
<p id="numberOfCompanyStuctures">
#_numberOfCompanyStuctures_# Departments
#_numberOfCompanyStuctures_# <t>Departments</t>
</p>
</div>
<div class="icon">
<i class="ion ion-shuffle"></i>
</div>
<a href="#_moduleLink_#" class="small-box-footer" id="companyLink">
Manage Company <i class="fa fa-arrow-circle-right"></i>
<t>Manage</t> <t>Company</t> <i class="fa fa-arrow-circle-right"></i>
</a>
</div>
</div>

View File

@@ -1,4 +1,4 @@
<?php
<?php
/*
This file is part of iCE Hrm.
@@ -17,7 +17,7 @@ along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
@@ -52,23 +52,23 @@ path.link {
</style>
<div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabCompanyStructure" href="#tabPageCompanyStructure">Company Structure</a></li>
<li><a id="tabCompanyGraph" href="#tabPageCompanyGraph">Company Graph</a></li>
<li class="active"><a id="tabCompanyStructure" href="#tabPageCompanyStructure"><?=t('Company Structure')?></a></li>
<li><a id="tabCompanyGraph" href="#tabPageCompanyGraph"><?=t('Company Graph')?></a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="tabPageCompanyStructure">
<div id="CompanyStructure" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="CompanyStructureForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane reviewBlock" id="tabPageCompanyGraph" style="overflow-x: scroll;">
</div>
</div>
@@ -93,4 +93,4 @@ modJsList['tabCompanyGraph'] = new CompanyGraphAdapter('CompanyStructure');
var modJs = modJsList['tabCompanyStructure'];
</script>
<?php include APP_BASE_PATH.'footer.php';?>
<?php include APP_BASE_PATH.'footer.php';?>

View File

@@ -43,7 +43,8 @@ CompanyStructureAdapter.method('getFormFields', function() {
[ "type", {"label":"Type","type":"select","source":[["Company","Company"],["Head Office","Head Office"],["Regional Office","Regional Office"],["Department","Department"],["Unit","Unit"],["Sub Unit","Sub Unit"],["Other","Other"]]}],
[ "country", {"label":"Country","type":"select2","remote-source":["Country","code","name"]}],
[ "timezone", {"label":"Time Zone","type":"select2","allow-null":false,"remote-source":["Timezone","name","details"]}],
[ "parent", {"label":"Parent Structure","type":"select","allow-null":true,"remote-source":["CompanyStructure","id","title"]}]
[ "parent", {"label":"Parent Structure","type":"select","allow-null":true,"remote-source":["CompanyStructure","id","title"]}],
[ "heads", {"label":"Heads","type":"select2multi","allow-null":true,"remote-source":["Employee","id","first_name+last_name"]}]
];
});

View File

@@ -13,5 +13,7 @@
"Edit Company Structure":"No",
"Delete Company Structure":"No"
}
}
}
},
"model_namespace": "\\Company\\Common\\Model",
"manager": "\\Company\\Admin\\Api\\CompanyAdminManager"
}

125
admin/dashboard/index.php Normal file
View File

@@ -0,0 +1,125 @@
<?php
/*
This file is part of iCE Hrm.
iCE Hrm is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
iCE Hrm is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
$moduleName = 'dashboard';
define('MODULE_PATH',dirname(__FILE__));
include APP_BASE_PATH.'header.php';
include APP_BASE_PATH.'modulejslibs.inc.php';
$invoices = [];
$numOfUnpaidInvoices = 0;
if (class_exists('\\Billing\\Admin\\Api\\BillingActionManager')) {
$billingActionManager = new \Billing\Admin\Api\BillingActionManager();
$invoices = $billingActionManager->getInvoices(null)->getData();
if(!empty($invoices)){
$invoices = json_decode(json_encode($invoices));
}
foreach($invoices as $inv){
if($inv->status == "Sent"){
$numOfUnpaidInvoices++;
}
}
}
?><div class="span9">
<div class="row">
<?php if($numOfUnpaidInvoices == 1){?>
<div class="callout callout-warning lead" style="font-size: 14px;">
<h4>You have a pending invoice</h4>
<p style="font-weight: bold;">
You have a pending invoice. Please make you complete the payment so we can provide a better service.
<br/>
<br/>
<a href="<?=CLIENT_BASE_URL?>?g=admin&n=billing&m=admin_System#tabInvoice" class="btn btn-success btm-xs"><i class="fa fa-checkout"></i> Make a Payment</a>
</p>
</div>
<?php }else if($numOfUnpaidInvoices > 1){?>
<div class="callout callout-danger lead" style="font-size: 14px;">
<h4>You have <?=$numOfUnpaidInvoices?> pending invoices</h4>
<p style="font-weight: bold;">
You have <?=$numOfUnpaidInvoices?> pending invoice. None of your employees are currently allowed to login. Please make sure you complete payments to all the invoices to restore your service.
Please logout and login after completing the payment to get your service restored.
<br/>
<br/>
<a href="<?=CLIENT_BASE_URL?>?g=admin&n=billing&m=admin_System#tabInvoice" class="btn btn-success btm-xs"><i class="fa fa-checkout"></i> Make a Payment</a>
</p>
</div>
<?php }?>
<?php if(\Utils\SessionUtils::getSessionObject('account_locked') == "1"){?>
<div class="callout callout-danger lead" style="font-size: 14px;">
<h4>Your Trial Has Expired</h4>
<p style="font-weight: bold;">
Your Icehrm Trial has expired. Please upgrade subscription to continue. If not upgraded your account will be deleted with in few days.
<br/>
<br/>
<a href="<?=CLIENT_BASE_URL?>?g=admin&n=billing&m=admin_System" class="btn btn-success btm-xs"><i class="fa fa-checkout"></i> Upgrade Subscription</a>
</p>
</div>
<?php }?>
<?php
$moduleManagers = \Classes\BaseService::getInstance()->getModuleManagers();
$dashBoardList = array();
foreach($moduleManagers as $moduleManagerObj){
//Check if this is not an admin module
if($moduleManagerObj->getModuleType() != 'admin'){
continue;
}
$allowed = \Classes\BaseService::getInstance()->isModuleAllowedForUser($moduleManagerObj);
if(!$allowed){
continue;
}
$item = $moduleManagerObj->getDashboardItem();
if(!empty($item)) {
$index = $moduleManagerObj->getDashboardItemIndex();
$dashBoardList[$index] = $item;
}
}
ksort($dashBoardList);
foreach($dashBoardList as $k=>$v){
echo \Classes\LanguageManager::translateTnrText($v);
}
?>
</div>
</div>
<script>
var modJsList = new Array();
modJsList['tabDashboard'] = new DashboardAdapter('Dashboard','Dashboard');
var modJs = modJsList['tabDashboard'];
</script>
<?php include APP_BASE_PATH.'footer.php';?>

13
admin/dashboard/meta.json Normal file
View File

@@ -0,0 +1,13 @@
{
"label": "Dashboard",
"menu": "Admin",
"order": "1",
"icon": "fa-desktop",
"user_levels": [
"Admin",
"Other"
],
"permissions": [],
"model_namespace": "\\Dashboard\\Common\\Model",
"manager": "\\Dashboard\\Admin\\Api\\DashboardAdminManager"
}

View File

@@ -4,30 +4,30 @@
<div class="col-xs-12" style="text-align: center;">
<img id="profile_image__id_" src="" class="img-polaroid img-thumbnail" style="max-width: 140px;max-height: 140px;">
</div>
</div>
</div>
<div class="col-xs-12 col-md-10">
<div class="row-fluid">
<div class="col-xs-12 col-md-10">
<div class="row-fluid">
<div class="col-md-12"><h2 id="name"></h2></div>
</div>
</div>
<div class="row-fluid">
<div class="col-md-12">
<p>
<i class="fa fa-phone"></i> <span id="mobile_phone"></span>&nbsp;&nbsp;
<i class="fa fa-envelope"></i> <span id="work_email"></span>
</p>
<p>
<i class="fa fa-phone"></i> <span id="mobile_phone"></span>&nbsp;&nbsp;
<i class="fa fa-envelope"></i> <span id="work_email"></span>
</p>
</div>
</div>
<div class="row-fluid">
<div class="col-xs-12" style="font-size:18px;border-bottom: 1px solid #DDD;margin-bottom: 10px;padding-bottom: 10px;">
<div class="row-fluid">
<div class="col-xs-12" style="font-size:18px;border-bottom: 1px solid #DDD;margin-bottom: 10px;padding-bottom: 10px;">
<button id="employeeProfileEditInfo" class="btn btn-small btn-success" onclick="modJs.edit(_id_);" style="margin-right:10px;"><i class="fa fa-edit"></i> Edit Info</button>
<button id="employeeUploadProfileImage" onclick="showUploadDialog('profile_image__id_','Upload Profile Image','profile_image',_id_,'profile_image__id_','src','url','image');return false;" class="btn btn-small btn-primary" type="button" style="margin-right:10px;"><i class="fa fa-upload"></i> Upload Profile Image</button>
<button id="employeeDeleteProfileImage" onclick="modJs.deleteProfileImage(_id_);return false;" class="btn btn-small btn-warning" type="button" style="margin-right:10px;"><i class="fa fa-times"></i> Delete Profile Image</button>
</div>
</div>
<div class="row-fluid" style="border-top: 1px;">
</div>
<div class="row-fluid" style="border-top: 1px;">
<div class="col-xs-6 col-md-4" style="font-size:16px;">
<label class="control-label col-xs-12" style="font-size:13px;font-size:13px;">#_label_employee_id_#</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="employee_id"></label>
@@ -40,24 +40,24 @@
<label class="control-label col-xs-12" style="font-size:13px;">#_label_ssn_num_#</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="ssn_num"></label>
</div>
</div>
</div>
</div>
</div>
</div>
<ul class="nav nav-tabs" id="subModTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabBasic" href="#tabPageBasic">Basic Information</a></li>
<li class=""><a id="tabQualifications" href="#tabPageQualifications">Qualifications</a></li>
<li class=""><a id="tabFamily" href="#tabPageFamily">Family</a></li>
<li class=""><a id="tabDocuments" href="#tabPageDocuments">Documents</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="tabPageBasic" style="border:1px solid #DDD;">
<div class="tab-pane sub-tab active" id="tabPageBasic">
<div class="row" style="margin-left:10px;margin-top:20px;">
<div class="panel panel-default" style="width:97.5%;">
<div class="panel-heading"><h4>Personal Information</h4></div>
<div class="panel-body">
<div class="row-fluid">
<div class="panel-body" id="cont_personal_information">
<div class="col-xs-6 col-md-3" style="font-size:16px;">
<label class="control-label col-xs-12" style="font-size:13px;">#_label_driving_license_#</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="driving_license"></label>
@@ -74,10 +74,7 @@
<label class="control-label col-xs-12" style="font-size:13px;">#_label_gender_#</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="gender"></label>
</div>
</div>
<hr/>
<div class="row-fluid">
<div class="col-xs-6 col-md-3" style="font-size:16px;">
<label class="control-label col-xs-12" style="font-size:13px;">#_label_nationality_#</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="nationality_Name"></label>
@@ -90,16 +87,14 @@
<label class="control-label col-xs-12" style="font-size:13px;">#_label_joined_date_#</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="joined_date"></label>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row" style="margin-left:10px;margin-top:20px;">
<div class="panel panel-default" style="width:97.5%;">
<div class="panel-heading"><h4>Contact Information</h4></div>
<div class="panel-body">
<div class="row-fluid">
<div class="panel-heading"><h4>Contact Information</h4></div>
<div class="panel-body" id="cont_contact_information">
<div class="col-xs-6 col-md-3" style="font-size:16px;">
<label class="control-label col-xs-12" style="font-size:13px;">#_label_address1_#</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="address1"></label>
@@ -116,9 +111,6 @@
<label class="control-label col-xs-12" style="font-size:13px;">#_label_country_#</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="country_Name"></label>
</div>
</div>
<hr/>
<div class="row-fluid">
<div class="col-xs-6 col-md-3" style="font-size:16px;">
<label class="control-label col-xs-12" style="font-size:13px;">#_label_postal_code_#</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="postal_code"></label>
@@ -135,16 +127,14 @@
<label class="control-label col-xs-12" style="font-size:13px;">#_label_private_email_#</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="private_email"></label>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div class="row" style="margin-left:10px;margin-top:20px;">
<div class="panel panel-default" style="width:97.5%;">
<div class="panel-heading"><h4>Job Details</h4></div>
<div class="panel-body">
<div class="row-fluid">
<div class="panel-heading"><h4>Job Details</h4></div>
<div class="panel-body" id="cont_job_details">
<div class="col-xs-6 col-md-3" style="font-size:16px;">
<label class="control-label col-xs-12" style="font-size:13px;">#_label_job_title_#</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="job_title_Name"></label>
@@ -161,82 +151,97 @@
<label class="control-label col-xs-12" style="font-size:13px;">Direct Reports</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="subordinates"></label>
</div>
</div>
<hr/>
<div class="row-fluid">
<div class="col-xs-6 col-md-3" style="font-size:16px;">
<label class="control-label col-xs-12" style="font-size:13px;">#_label_department_#</label>
<label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;" id="department_Name"></label>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="customFieldsCont">
</div>
<div class="modal" id="adminUsersModel" tabindex="-1" role="dialog" aria-labelledby="messageModelLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><li class="fa fa-times"/></button>
<h3 style="font-size: 17px;">Change User Password</h3>
</div>
<div class="modal-body">
<form id="adminUsersChangePwd">
<div class="control-group">
<div class="controls">
<span class="label label-warning" id="adminUsersChangePwd_error" style="display:none;"></span>
</div>
</div>
<div class="control-group" id="field_newpwd">
<label class="control-label" for="newpwd">New Password</label>
<div class="controls">
<input class="" type="password" id="newpwd" name="newpwd" value="" class="form-control"/>
<span class="help-inline" id="help_newpwd"></span>
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><li class="fa fa-times"/></button>
<h3 style="font-size: 17px;">Change User Password</h3>
</div>
<div class="modal-body">
<form id="adminUsersChangePwd">
<div class="control-group">
<div class="controls">
<span class="label label-warning" id="adminUsersChangePwd_error" style="display:none;"></span>
</div>
</div>
<div class="control-group" id="field_newpwd">
<label class="control-label" for="newpwd">New Password</label>
<div class="controls">
<input class="" type="password" id="newpwd" name="newpwd" value="" class="form-control"/>
<span class="help-inline" id="help_newpwd"></span>
</div>
</div>
<div class="control-group" id="field_conpwd">
<label class="control-label" for="conpwd">Confirm Password</label>
<div class="controls">
<input class="" type="password" id="conpwd" name="conpwd" value="" class="form-control"/>
<span class="help-inline" id="help_conpwd"></span>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button class="btn btn-primary" onclick="modJs.changePasswordConfirm();">Change Password</button>
<button class="btn" onclick="modJs.closeChangePassword();">Not Now</button>
</div>
</div>
<div class="control-group" id="field_conpwd">
<label class="control-label" for="conpwd">Confirm Password</label>
<div class="controls">
<input class="" type="password" id="conpwd" name="conpwd" value="" class="form-control"/>
<span class="help-inline" id="help_conpwd"></span>
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button class="btn btn-primary" onclick="modJs.changePasswordConfirm();">Change Password</button>
<button class="btn" onclick="modJs.closeChangePassword();">Not Now</button>
</div>
</div>
</div>
</div>
</div><!-- End tabPageBasic -->
<div class="tab-pane" id="tabPageQualifications" style="border:1px solid #DDD;">
<div class="tab-pane sub-tab" id="tabPageQualifications">
<div class="row" style="margin-top:20px;">
<div class="col-md-3">
<div class="col-md-3 sub-column">
<div id="EmployeeSkillSubTab" class="" data-content="List" style="padding-left:5px;">
</div>
</div>
<div class="col-md-3">
<div class="col-md-3 sub-column">
<div id="EmployeeEducationSubTab" class="" data-content="List" style="padding-left:5px;">
</div>
</div>
<div class="col-md-3">
<div class="col-md-3 sub-column">
<div id="EmployeeCertificationSubTab" class="" data-content="List" style="padding-left:5px;">
</div>
</div>
<div class="col-md-3">
<div class="col-md-3 sub-column">
<div id="EmployeeLanguageSubTab" class="" data-content="List" style="padding-left:5px;">
</div>
</div>
</div><!-- End tabPageQualifications -->
</div>
<div class="tab-pane" id="tabPageDocuments" style="border:1px solid #DDD;">
<div class="tab-pane sub-tab" id="tabPageFamily">
<div class="row" style="margin-top:20px;">
<div class="col-md-6 sub-column">
<div id="EmployeeEmergencyContactSubTab" class="" data-content="List" style="padding-left:5px;">
</div>
</div>
<div class="col-md-6 sub-column">
<div id="EmployeeDependentSubTab" class="" data-content="List" style="padding-left:5px;">
</div>
</div>
</div>
</div>
<div class="tab-pane sub-tab" id="tabPageDocuments">
<div class="row" style="margin-top:20px;">
<div class="col-md-12">
<div id="EmployeeDocumentSubTab" class="" data-content="List" style="padding-left:5px;">

View File

@@ -3,17 +3,17 @@
<div class="small-box bg-aqua">
<div class="inner">
<h3>
People
<t>People</t>
</h3>
<p id="numberOfEmployees">
#_numberOfEmployees_# Employees
#_numberOfEmployees_# <t>Employees</t>
</p>
</div>
<div class="icon">
<i class="ion ion-person-stalker"></i>
</div>
<a href="#_moduleLink_#" class="small-box-footer" id="employeeLink">
Manage Employees <i class="fa fa-arrow-circle-right"></i>
<t>Manage</t> <t>Employees</t> <i class="fa fa-arrow-circle-right"></i>
</a>
</div>
</div>

View File

@@ -1,121 +1,121 @@
<?php
<?php
$moduleName = 'employees';
define('MODULE_PATH',dirname(__FILE__));
include APP_BASE_PATH.'header.php';
include APP_BASE_PATH.'modulejslibs.inc.php';
$fieldNameMap = BaseService::getInstance()->getFieldNameMappings("Employee");
$customFields = BaseService::getInstance()->getCustomFields("Employee");
$fieldNameMap = \Classes\BaseService::getInstance()->getFieldNameMappings("Employee");
$customFields = \Classes\BaseService::getInstance()->getCustomFields("Employee");
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<?php if($user->user_level != "Admin"){
?>
<li class="active"><a id="tabEmployee" href="#tabPageEmployee">Employees (Direct Reports)</a></li>
<li class="active"><a id="tabEmployee" href="#tabPageEmployee"><?=t('Employees (Direct Reports)')?></a></li>
<?php }else{ ?>
<li class="active"><a id="tabEmployee" href="#tabPageEmployee">Employees</a></li>
<li class="active"><a id="tabEmployee" href="#tabPageEmployee"><?=t('Employees')?></a></li>
<?php }?>
<?php if($user->user_level == "Admin"){
?>
<li><a id="tabEmployeeSkill" href="#tabPageEmployeeSkill">Skills</a></li>
<li><a id="tabEmployeeEducation" href="#tabPageEmployeeEducation">Education</a></li>
<li><a id="tabEmployeeCertification" href="#tabPageEmployeeCertification">Certifications</a></li>
<li><a id="tabEmployeeLanguage" href="#tabPageEmployeeLanguage">Languages</a></li>
<li><a id="tabEmployeeDependent" href="#tabPageEmployeeDependent">Dependents</a></li>
<li><a id="tabEmergencyContact" href="#tabPageEmergencyContact">Emergency Contacts</a></li>
<?php if (!class_exists('DocumentsAdminManager')) {?>
<li><a id="tabEmployeeDocument" href="#tabPageEmployeeDocument">Documents</a></li>
<li><a id="tabEmployeeSkill" href="#tabPageEmployeeSkill"><?=t('Skills')?></a></li>
<li><a id="tabEmployeeEducation" href="#tabPageEmployeeEducation"><?=t('Education')?></a></li>
<li><a id="tabEmployeeCertification" href="#tabPageEmployeeCertification"><?=t('Certifications')?></a></li>
<li><a id="tabEmployeeLanguage" href="#tabPageEmployeeLanguage"><?=t('Languages')?></a></li>
<li><a id="tabEmployeeDependent" href="#tabPageEmployeeDependent"><?=t('Dependents')?></a></li>
<li><a id="tabEmergencyContact" href="#tabPageEmergencyContact"><?=t('Emergency Contacts')?></a></li>
<?php if (class_exists('\\Documents\\Admin\\Api\\DocumentsAdminManager')) {?>
<li><a id="tabEmployeeDocument" href="#tabPageEmployeeDocument"><?=t('Documents')?></a></li>
<?php } ?>
<?php }?>
<?php if($user->user_level == "Admin"){
?>
<li class="dropdown">
<a href="#" id="terminatedEmployeeMenu" class="dropdown-toggle" data-toggle="dropdown" aria-controls="terminatedEmployeeMenu-contents">Suspended Employees <span class="caret"></span></a>
<a href="#" id="terminatedEmployeeMenu" class="dropdown-toggle" data-toggle="dropdown" aria-controls="terminatedEmployeeMenu-contents"><?=t('Deactivated Employees')?> <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu" aria-labelledby="terminatedEmployeeMenu" id="terminatedEmployeeMenu-contents">
<li><a id="tabTerminatedEmployee" href="#tabPageTerminatedEmployee">Temporarily Suspended Employees</a></li>
<li><a id="tabArchivedEmployee" href="#tabPageArchivedEmployee">Terminated Employee Data</a></li>
<li><a id="tabTerminatedEmployee" href="#tabPageTerminatedEmployee"><?=t('Temporarily Deactivated Employees')?></a></li>
<li><a id="tabArchivedEmployee" href="#tabPageArchivedEmployee"><?=t('Terminated Employee Data')?></a></li>
</ul>
</li>
<?php }?>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="tabPageEmployee">
<div id="Employee" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="EmployeeForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPageEmployeeSkill">
<div id="EmployeeSkill" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="EmployeeSkillForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPageEmployeeEducation">
<div id="EmployeeEducation" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="EmployeeEducationForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPageEmployeeCertification">
<div id="EmployeeCertification" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="EmployeeCertificationForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPageEmployeeLanguage">
<div id="EmployeeLanguage" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="EmployeeLanguageForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPageEmployeeDependent">
<div id="EmployeeDependent" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="EmployeeDependentForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPageEmergencyContact">
<div id="EmergencyContact" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="EmergencyContactForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPageArchivedEmployee">
<div id="ArchivedEmployee" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="ArchivedEmployeeForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPageTerminatedEmployee">
<div id="TerminatedEmployee" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="TerminatedEmployeeForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<?php if (!class_exists('DocumentsAdminManager')) {?>
<?php if (class_exists('\\Documents\\Admin\\Api\\DocumentsAdminManager')) {?>
<div class="tab-pane" id="tabPageEmployeeDocument">
<div id="EmployeeDocument" class="reviewBlock" data-content="List" style="padding-left:5px;">
@@ -125,7 +125,7 @@ $customFields = BaseService::getInstance()->getCustomFields("Employee");
</div>
</div>
<?php } ?>
</div>
</div>
@@ -133,7 +133,7 @@ $customFields = BaseService::getInstance()->getCustomFields("Employee");
var modJsList = new Array();
<?php if($user->user_level != "Admin"){
?>
modJsList['tabEmployee'] = new EmployeeAdapter('Employee','Employee',{"status":"Active", "supervisor":"__myid__"});
modJsList['tabEmployee'] = new EmployeeAdapter('Employee','Employee',{"status":"Active"});
modJsList['tabEmployee'].setShowAddNew(false);
<?php
}else{
@@ -176,14 +176,14 @@ modJsList['tabTerminatedEmployee'] = new TerminatedEmployeeAdapter('Employee','T
modJsList['tabTerminatedEmployee'].setRemoteTable(true);
modJsList['tabTerminatedEmployee'].setShowAddNew(false);
<?php if (!class_exists('DocumentsAdminManager')) {?>
<?php if (class_exists('\\Documents\\Admin\\Api\\DocumentsAdminManager')) {?>
modJsList['tabEmployeeDocument'] = new EmployeeDocumentAdapter('EmployeeDocument','EmployeeDocument');
modJsList['tabTerminatedEmployee'].setRemoteTable(true);
<?php } ?>
var modJs = modJsList['tabEmployee'];
</script>
@@ -193,10 +193,10 @@ var modJs = modJsList['tabEmployee'];
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true"><li class="fa fa-times"/></button>
<h3 style="font-size: 17px;">Employee Saved Successfully</h3>
<h3 style="font-size: 17px;"><?=t('Employee Saved Successfully')?></h3>
</div>
<div class="modal-body">
Employee needs a User to login to IceHrm. Do you want to create a user for this employee now? <br/><br/>You can do this later through Users module if required.
<?=t('Employee needs a User to login to IceHrm. Do you want to create a user for this employee now?')?> <br/><br/><?=t('You can do this later through Users module if required.')?>
</div>
<div class="modal-footer">
<button class="btn btn-primary" onclick="modJs.createUser();">Yes</button>
@@ -207,4 +207,4 @@ var modJs = modJsList['tabEmployee'];
</div>
<?php include APP_BASE_PATH.'footer.php';?>
<?php include APP_BASE_PATH.'footer.php';?>

View File

@@ -36,7 +36,7 @@ EmployeeAdapter.method('setFieldNameMap', function(fields) {
if(field.display == "Hidden"){
this.hiddenFields[field.name] = field;
}else{
if(field.display == "Table and Form"){
if(field.display == "Table and Form" || field.display == "Form"){
this.tableFields[field.name] = field;
}else{
this.formOnlyFields[field.name] = field;
@@ -197,6 +197,9 @@ EmployeeAdapter.method('getFormFields', function() {
[ "department", {"label":"Department","type":"select2","remote-source":["CompanyStructure","id","title"]}],
[ "supervisor", {"label":"Direct Supervisor","type":"select2","allow-null":true,"remote-source":["Employee","id","first_name+last_name"]}],
[ "indirect_supervisors", {"label":"Indirect Supervisors","type":"select2multi","allow-null":true,"remote-source":["Employee","id","first_name+last_name"]}],
[ "approver1", {"label":"First Level Approver","type":"select2","allow-null":true,"remote-source":["Employee","id","first_name+last_name"]}],
[ "approver2", {"label":"Second Level Approver","type":"select2","allow-null":true,"remote-source":["Employee","id","first_name+last_name"]}],
[ "approver3", {"label":"Third Level Approver","type":"select2","allow-null":true,"remote-source":["Employee","id","first_name+last_name"]}],
[ "notes", {"label":"Notes","type":"datagroup",
"form":[
[ "note", {"label":"Note","type":"textarea","validation":""}]
@@ -413,7 +416,7 @@ EmployeeAdapter.method('renderEmployee', function(data) {
}
}
html = html.replace(/#_.+_#/i,"");
html = html.replace(/#_.+_#/gi,"");
html = html.replace(/_id_/g,data.id);
$("#"+this.getTableName()).html(html);
@@ -447,6 +450,43 @@ EmployeeAdapter.method('renderEmployee', function(data) {
$("#"+this.getTableName()+" #profile_image_"+data.id).attr('src',data.image);
var sectionTemplate = '<div class="row" style="margin-left:10px;margin-top:20px;"><div class="panel panel-default" style="width:97.5%;"><div class="panel-heading"><h4>#_section.name_#</h4></div> <div class="panel-body" id="cont_#_section_#"> </div></div></div>';
var sectionId = '';
var sectionHtml = '';
//Add custom fields
if(data.customFields != undefined && data.customFields != null && Object.keys(data.customFields).length > 0) {
var ct = '<div class="col-xs-6 col-md-3" style="font-size:16px;"><label class="control-label col-xs-12" style="font-size:13px;">#_label_#</label><label class="control-label col-xs-12 iceLabel" style="font-size:13px;font-weight: bold;">#_value_#</label></div>';
var customFieldHtml;
for (index in data.customFields) {
if(!data.customFields[index][1]){
data.customFields[index][1] = 'Other Details';
}
sectionId = data.customFields[index][1].toLocaleLowerCase();
sectionId = sectionId.replace(' ','_');
if($("#cont_"+sectionId).length <= 0){
//Add section
sectionHtml = sectionTemplate;
sectionHtml = sectionHtml.replace('#_section_#', sectionId);
sectionHtml = sectionHtml.replace('#_section.name_#', data.customFields[index][1]);
$("#customFieldsCont").append($(sectionHtml));
}
customFieldHtml = ct;
customFieldHtml = customFieldHtml.replace('#_label_#', index);
customFieldHtml = customFieldHtml.replace('#_value_#', data.customFields[index][0]);
$("#cont_"+sectionId).append($(customFieldHtml));
}
}else{
$("#customFieldsCont").remove();
}
this.cancel();
if(!this.isModuleInstalled("admin","documents")) {
@@ -469,6 +509,12 @@ EmployeeAdapter.method('renderEmployee', function(data) {
modJs.subModJsList['tabEmployeeLanguageSubTab'] = new EmployeeSubLanguageAdapter('EmployeeLanguage','EmployeeLanguageSubTab',{"employee":data.id});
modJs.subModJsList['tabEmployeeLanguageSubTab'].parent = this;
modJs.subModJsList['tabEmployeeDependentSubTab'] = new EmployeeSubDependentAdapter('EmployeeDependent','EmployeeDependentSubTab',{"employee":data.id});
modJs.subModJsList['tabEmployeeDependentSubTab'].parent = this;
modJs.subModJsList['tabEmployeeEmergencyContactSubTab'] = new EmployeeSubEmergencyContactAdapter('EmergencyContact','EmployeeEmergencyContactSubTab',{"employee":data.id});
modJs.subModJsList['tabEmployeeEmergencyContactSubTab'].parent = this;
if(this.isModuleInstalled("admin","documents")) {
modJs.subModJsList['tabEmployeeDocumentSubTab'] = new EmployeeSubDocumentAdapter('EmployeeDocument', 'EmployeeDocumentSubTab', {"employee": data.id});
modJs.subModJsList['tabEmployeeDocumentSubTab'].parent = this;
@@ -510,6 +556,16 @@ EmployeeAdapter.method('renderEmployee', function(data) {
modJs.subModJsList['tabEmployeeLanguageSubTab'].setShowCancel(false);
modJs.subModJsList['tabEmployeeLanguageSubTab'].get([]);
modJs.subModJsList['tabEmployeeDependentSubTab'].setShowFormOnPopup(true);
modJs.subModJsList['tabEmployeeDependentSubTab'].setShowAddNew(false);
modJs.subModJsList['tabEmployeeDependentSubTab'].setShowCancel(false);
modJs.subModJsList['tabEmployeeDependentSubTab'].get([]);
modJs.subModJsList['tabEmployeeEmergencyContactSubTab'].setShowFormOnPopup(true);
modJs.subModJsList['tabEmployeeEmergencyContactSubTab'].setShowAddNew(false);
modJs.subModJsList['tabEmployeeEmergencyContactSubTab'].setShowCancel(false);
modJs.subModJsList['tabEmployeeEmergencyContactSubTab'].get([]);
if(this.isModuleInstalled("admin","documents")) {
modJs.subModJsList['tabEmployeeDocumentSubTab'].setShowFormOnPopup(true);
modJs.subModJsList['tabEmployeeDocumentSubTab'].setShowAddNew(false);
@@ -1335,7 +1391,7 @@ EmployeeSubSkillsAdapter.method('getSubHeaderTitle', function() {
});
EmployeeSubSkillsAdapter.method('getSubItemHtml', function(item, itemDelete, itemEdit) {
var itemHtml = $('<a href="#" class="list-group-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text">'+nl2br(item[3])+'</p></a>');
var itemHtml = $('<div class="list-group-item sub-tab-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text">'+nl2br(item[3])+'</p></div>');
return itemHtml;
});
@@ -1414,8 +1470,8 @@ EmployeeSubEducationAdapter.method('getSubItemHtml', function(item, itemDelete,
try{
end = Date.parse(item[5]).toString('MMM d, yyyy');
}catch(e){}
//var itemHtml = $('<a href="#" class="list-group-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text">'+nl2br(item[3])+'</p></a>');
var itemHtml = $('<a href="#" class="list-group-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text"><i class="fa fa-calendar"></i> Start: <b>'+start+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-calendar"></i> Completed: <b>'+end+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-building-o"></i> Institute: <b>'+item[3]+'</b></p></a>');
//var itemHtml = $('<div class="list-group-item sub-tab-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text">'+nl2br(item[3])+'</p></div>');
var itemHtml = $('<div class="list-group-item sub-tab-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text"><i class="fa fa-calendar"></i> Start: <b>'+start+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-calendar"></i> Completed: <b>'+end+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-building-o"></i> Institute: <b>'+item[3]+'</b></p></div>');
return itemHtml;
});
@@ -1492,7 +1548,7 @@ EmployeeSubCertificationAdapter.method('getSubItemHtml', function(item, itemDele
try{
end = Date.parse(item[5]).toString('MMM d, yyyy');
}catch(e){}
var itemHtml = $('<a href="#" class="list-group-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text"><i class="fa fa-calendar"></i> Granted On: <b>'+start+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-calendar"></i> Valid Thru: <b>'+end+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-building-o"></i> Institute: <b>'+item[3]+'</b></p></a>');
var itemHtml = $('<div class="list-group-item sub-tab-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text"><i class="fa fa-calendar"></i> Granted On: <b>'+start+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-calendar"></i> Valid Thru: <b>'+end+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-building-o"></i> Institute: <b>'+item[3]+'</b></p></div>');
return itemHtml;
});
@@ -1570,7 +1626,7 @@ EmployeeSubLanguageAdapter.method('getSubHeaderTitle', function() {
});
EmployeeSubLanguageAdapter.method('getSubItemHtml', function(item, itemDelete, itemEdit) {
var itemHtml = $('<a href="#" class="list-group-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text"><i class="fa fa-asterisk"></i> Reading: <b>'+item[3]+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-asterisk"></i> Speaking: <b>'+ item[4] +'</b></p><p class="list-group-item-text">'+'<i class="fa fa-asterisk"></i> Writing: <b>'+item[5]+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-asterisk"></i> Understanding: <b>'+item[6]+'</b></p></a>');
var itemHtml = $('<div class="list-group-item sub-tab-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text"><i class="fa fa-asterisk"></i> Reading: <b>'+item[3]+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-asterisk"></i> Speaking: <b>'+ item[4] +'</b></p><p class="list-group-item-text">'+'<i class="fa fa-asterisk"></i> Writing: <b>'+item[5]+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-asterisk"></i> Understanding: <b>'+item[6]+'</b></p></div>');
return itemHtml;
});
@@ -1582,6 +1638,154 @@ EmployeeSubLanguageAdapter.method('isSubProfileTable', function() {
}
});
/**
* @class EmployeeSubDependentAdapter
* @param endPoint
* @param tab
* @param filter
* @param orderBy
* @returns
*/
function EmployeeSubDependentAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
EmployeeSubDependentAdapter.inherits(SubAdapterBase);
EmployeeSubDependentAdapter.method('getDataMapping', function() {
return [
"id",
"employee",
"name",
"relationship",
"dob",
"id_number"
];
});
EmployeeSubDependentAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Employee" },
{ "sTitle": "Name" },
{ "sTitle": "Relationship"},
{ "sTitle": "Date of Birth"},
{ "sTitle": "Id Number"}
];
});
EmployeeSubDependentAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "employee", {"label":"Employee","type":"hidden"}],
[ "name", {"label":"Name","type":"text","validation":""}],
[ "relationship", {"label":"Relationship","type":"select","source":[["Child","Child"],["Spouse","Spouse"],["Parent","Parent"],["Other","Other"]]}],
[ "dob", {"label":"Date of Birth","type":"date","validation":""}],
[ "id_number", {"label":"Id Number","type":"text","validation":"none"}]
];
});
EmployeeSubDependentAdapter.method('forceInjectValuesBeforeSave', function(params) {
params['employee'] = this.parent.currentId;
return params;
});
EmployeeSubDependentAdapter.method('getSubHeaderTitle', function() {
var addBtn = '<button class="btn btn-small btn-success" onclick="modJs.subModJsList[\'tab'+this.tab+'\'].renderForm();" style="margin-right:10px;"><i class="fa fa-plus"></i></button>';
return addBtn + "Dependents";
});
EmployeeSubDependentAdapter.method('getSubItemHtml', function(item, itemDelete, itemEdit) {
var itemHtml = $('<div class="list-group-item sub-tab-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text"><i class="fa fa-users"></i> Relationship: <b>'+item[3]+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-user"></i> Name: <b>'+item[2]+'</b></p></div>');
return itemHtml;
});
/**
* @class EmployeeSubEmergencyContactAdapter
* @param endPoint
* @param tab
* @param filter
* @param orderBy
* @returns
*/
function EmployeeSubEmergencyContactAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
EmployeeSubEmergencyContactAdapter.inherits(SubAdapterBase);
EmployeeSubEmergencyContactAdapter.method('getDataMapping', function() {
return [
"id",
"employee",
"name",
"relationship",
"home_phone",
"work_phone",
"mobile_phone"
];
});
EmployeeSubEmergencyContactAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Employee" },
{ "sTitle": "Name" },
{ "sTitle": "Relationship"},
{ "sTitle": "Home Phone"},
{ "sTitle": "Work Phone"},
{ "sTitle": "Mobile Phone"}
];
});
EmployeeSubEmergencyContactAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "employee", {"label":"Employee","type":"hidden"}],
[ "name", {"label":"Name","type":"text","validation":""}],
[ "relationship", {"label":"Relationship","type":"text","validation":"none"}],
[ "home_phone", {"label":"Home Phone","type":"text","validation":"none"}],
[ "work_phone", {"label":"Work Phone","type":"text","validation":"none"}],
[ "mobile_phone", {"label":"Mobile Phone","type":"text","validation":"none"}]
];
});
EmployeeSubEmergencyContactAdapter.method('forceInjectValuesBeforeSave', function(params) {
params['employee'] = this.parent.currentId;
return params;
});
EmployeeSubEmergencyContactAdapter.method('getSubHeaderTitle', function() {
var addBtn = '<button class="btn btn-small btn-success" onclick="modJs.subModJsList[\'tab'+this.tab+'\'].renderForm();" style="margin-right:10px;"><i class="fa fa-plus"></i></button>';
return addBtn + "Emergency Contacts";
});
EmployeeSubEmergencyContactAdapter.method('getSubItemHtml', function(item, itemDelete, itemEdit) {
var itemHtml = $('<div class="list-group-item sub-tab-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text"><i class="fa fa-users"></i> Relationship: <b>'+item[3]+'</b></p><p class="list-group-item-text">'+'<i class="fa fa-user"></i> Name: <b>'+item[2]+'</b></p><p class="list-group-item-text"><i class="fa fa-phone"></i> Home Phone: <b>'+item[4]+'</b></p><p class="list-group-item-text"><i class="fa fa-phone"></i> Mobile Phone: <b>'+item[6]+'</b></p></div>');
return itemHtml;
});
/**
* @class EmployeeSubDocumentAdapter
@@ -1655,10 +1859,15 @@ EmployeeSubDocumentAdapter.method('getSubItemHtml', function(item, itemDelete, i
try{
expire = Date.parse(item[5]).toString('MMM d, yyyy');
}catch(e){}
var itemHtml = $('<a href="#" class="list-group-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+itemDelete+itemEdit+'</h5><p class="list-group-item-text">'+nl2br(item[3])+'</p><p class="list-group-item-text">'+'<i class="fa fa-calendar"></i> Expire On: <b>'+expire+'</b></p></a>');
var downloadButton = '<button id="#_id_#_download" onclick="download(\''+item[7]+'\');return false;" type="button" style="position: absolute;bottom: 5px;right: 70px;font-size: 13px;" tooltip="Download"><li class="fa fa-cloud-download"></li></button>';
var itemHtml = $('<div class="list-group-item sub-tab-item"><h5 class="list-group-item-heading" style="font-weight:bold;">'+item[2]+downloadButton+itemDelete+itemEdit+'</h5><p class="list-group-item-text">'+nl2br(item[3])+'</p><p class="list-group-item-text">'+'<i class="fa fa-calendar"></i> Expire On: <b>'+expire+'</b></p></div>');
return itemHtml;
});
EmployeeSubDocumentAdapter.method('isSubProfileTable', function() {
if(this.user.user_level == "Admin"){
return false;

14
admin/employees/meta.json Normal file
View File

@@ -0,0 +1,14 @@
{
"label": "Employees",
"menu": "Employees",
"order": "1",
"icon": "fa-users",
"user_levels": [
"Admin",
"Manager"
],
"dashboardPosition": 1,
"permissions": [],
"model_namespace": "\\Employees\\Common\\Model",
"manager": "\\Employees\\Admin\\Api\\EmployeesAdminManager"
}

View File

@@ -15,13 +15,8 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="dropdown">
<a href="#" id="settingsEmployeeMenu" class="dropdown-toggle" data-toggle="dropdown" aria-controls="settingsEmployeeMenu-contents">Employee Fields <span class="caret"></span></a>
<ul class="dropdown-menu" role="menu" aria-labelledby="settingsEmployeeMenu" id="settingsEmployeeMenu-contents">
<li><a id="tabEmployeeFieldName" href="#tabPageEmployeeFieldName">Employee Field Name Mapping</a></li>
<li><a id="tabEmployeeCustomField" href="#tabPageEmployeeCustomField">Employee Custom Fields</a></li>
</ul>
</li>
<li class="active"><a id="tabEmployeeFieldName" href="#tabPageEmployeeFieldName"><?=t('Employee Field Names')?></a></li>
<li><a id="tabEmployeeCustomField" href="#tabPageEmployeeCustomField"><?=t('Employee Custom Fields')?></a></li>
</ul>
<div class="tab-content">
@@ -51,12 +46,12 @@ modJsList['tabEmployeeFieldName'] = new FieldNameAdapter('FieldNameMapping','Emp
modJsList['tabEmployeeFieldName'].setRemoteTable(true);
modJsList['tabEmployeeFieldName'].setShowAddNew(false);
modJsList['tabEmployeeCustomField'] = new CustomFieldAdapter('CustomField','EmployeeCustomField',{"type":"Employee"});
modJsList['tabEmployeeCustomField'] = new CustomFieldAdapter('CustomField','EmployeeCustomField',{"type":"Employee"},"display_order desc");
modJsList['tabEmployeeCustomField'].setRemoteTable(true);
modJsList['tabEmployeeCustomField'].setShowAddNew(false);
modJsList['tabEmployeeCustomField'].setTableType("Employee");
var modJs = modJsList['tabEmployeeFieldName'];
</script>
<?php include APP_BASE_PATH.'footer.php';?>
<?php include APP_BASE_PATH.'footer.php';?>

145
admin/fieldnames/lib.js Normal file
View File

@@ -0,0 +1,145 @@
/**
* Author: Thilina Hasantha
*/
/**
* FieldNameAdapter
*/
function FieldNameAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
FieldNameAdapter.inherits(AdapterBase);
FieldNameAdapter.method('getDataMapping', function() {
return [
"id",
"name",
"textOrig",
"textMapped",
"display"
];
});
FieldNameAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Name" },
{ "sTitle": "Original Text"},
{ "sTitle": "Mapped Text"},
{ "sTitle": "Display Status"}
];
});
FieldNameAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "type", {"label":"Type","type":"placeholder","validation":""}],
[ "name", {"label":"Name","type":"placeholder","validation":""}],
[ "textOrig", {"label":"Original Text","type":"placeholder","validation":""}],
[ "textMapped", {"label":"Mapped Text","type":"text","validation":""}],
[ "display", {"label":"Display Status","type":"select","source":[["Form","Form"],["Table and Form","Table and Form"],["Hidden","Hidden"]]}]
];
});
/*
*
*/
function CustomFieldAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
this.tableType = "";
}
CustomFieldAdapter.inherits(AdapterBase);
CustomFieldAdapter.method('getDataMapping', function() {
return [
"id",
"name",
"display",
"display_order"
];
});
CustomFieldAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Name" },
{ "sTitle": "Display Status"},
{ "sTitle": "Priority"}
];
});
CustomFieldAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
//[ "type", {"label":"Type","type":"placeholder","validation":""}],
[ "name", {"label":"Name","type":"text","validation":""}],
[ "display", {"label":"Display Status","type":"select","source":[["Form","Show"],["Hidden","Hidden"]]}],
[ "field_type", {"label":"Field Type","type":"select","source":[["text","Text Field"],["textarea","Text Area"],["select","Select"],["select2","Select2"],["select2multi","Multi Select"],["fileupload","File Upload"],["date","Date"],["datetime","Date Time"],["time","Time"]]}],
[ "field_label", {"label":"Field Label","type":"text","validation":""}],
[ "field_validation", {"label":"Validation","type":"select","validation":"none","sort":"none","source":[["","Required"],["none","None"],["number","Number"],["numberOrEmpty","Number or Empty"],["float","Decimal"],["email","Email"],["emailOrEmpty","Email or Empty"]]}],
[ "field_options", {"label":"Field Options","type":"datagroup",
"form":[
[ "label", {"label":"Label","type":"text","validation":""}],
[ "value", {"label":"Value","type":"text","validation":"none"}]
],
"html":'<div id="#_id_#" class="panel panel-default"><div class="panel-body">#_delete_##_edit_#<span style="color:#999;font-size:13px;font-weight:bold">#_label_#</span>:#_value_#</div></div>',
"validation":"none"
}],
[ "display_order", {"label":"Priority","type":"text","validation":"number"}],
[ "display_section", {"label":"Display Section","type":"text","validation":""}]
];
});
CustomFieldAdapter.method('setTableType', function(type) {
this.tableType = type;
});
CustomFieldAdapter.method('doCustomValidation', function(params) {
var validateName= function (str) {
var name = /^[a-z][a-z0-9\._]+$/;
return str != null && name.test(str);
};
if(!validateName(params.name)){
return "Invalid name for custom field";
}
return null;
});
CustomFieldAdapter.method('forceInjectValuesBeforeSave', function(params) {
//Build data field
var data = [params.name], options = [], optionsData;
data.push({});
data[1]['label'] = params.field_label;
data[1]['type'] = params.field_type;
data[1]['validation'] = params.field_validation;
if(["select","select2","select2multi"].indexOf(params.field_type) >= 0){
optionsData = JSON.parse(params.field_options);
for(index in optionsData){
options.push([optionsData[index].value, optionsData[index].label]);
}
data[1]['source'] = options;
}
if(params.field_validation == null || params.field_validation == undefined){
params.field_validation = "";
}
params.data = JSON.stringify(data);
params.type = this.tableType;
return params;
});

View File

@@ -0,0 +1,12 @@
{
"label": "Field Names Setup",
"menu": "System",
"order": "7",
"icon": "fa-sort-alpha-asc",
"user_levels": [
"Admin"
],
"permissions": [],
"model_namespace": "\\FieldNames\\Common\\Model",
"manager": "\\FieldNames\\Admin\\Api\\FieldNamesAdminManager"
}

View File

@@ -1,4 +1,4 @@
<?php
<?php
/*
This file is part of iCE Hrm.
@@ -17,45 +17,44 @@ along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
$moduleName = 'jobs';
define('MODULE_PATH',dirname(__FILE__));
include APP_BASE_PATH.'header.php';
include APP_BASE_PATH.'modulejslibs.inc.php';
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabJobTitles" href="#tabPageJobTitles">Job Titles</a></li>
<li><a id="tabPayGrades" href="#tabPagePayGrades">Pay Grades</a></li>
<li><a id="tabEmploymentStatus" href="#tabPageEmploymentStatus">Employment Status</a></li>
<li class="active"><a id="tabJobTitles" href="#tabPageJobTitles"><?=t('Job Titles')?></a></li>
<li><a id="tabPayGrades" href="#tabPagePayGrades"><?=t('Pay Grades')?></a></li>
<li><a id="tabEmploymentStatus" href="#tabPageEmploymentStatus"><?=t('Employment Status')?></a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="tabPageJobTitles">
<div id="JobTitle" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="JobTitleForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPagePayGrades">
<div id="PayGrade" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="PayGradeForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPageEmploymentStatus">
<div id="EmploymentStatus" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="EmploymentStatusForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
</div>
@@ -71,4 +70,4 @@ modJsList['tabEmploymentStatus'] = new EmploymentStatusAdapter('EmploymentStatus
var modJs = modJsList['tabJobTitles'];
</script>
<?php include APP_BASE_PATH.'footer.php';?>
<?php include APP_BASE_PATH.'footer.php';?>

12
admin/jobs/meta.json Normal file
View File

@@ -0,0 +1,12 @@
{
"label": "Job Details Setup",
"menu": "Admin",
"order": "3",
"icon": "fa-columns",
"user_levels": [
"Admin"
],
"permissions": [],
"model_namespace": "\\Jobs\\Common\\Model",
"manager": "\\Jobs\\Admin\\Api\\JobsAdminManager"
}

View File

@@ -28,8 +28,8 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabCompanyLoan" href="#tabPageCompanyLoan">Loan Types</a></li>
<li><a id="tabEmployeeCompanyLoan" href="#tabPageEmployeeCompanyLoan">Employee Loans</a></li>
<li class="active"><a id="tabCompanyLoan" href="#tabPageCompanyLoan"><?=t('Loan Types')?></a></li>
<li><a id="tabEmployeeCompanyLoan" href="#tabPageEmployeeCompanyLoan"><?=t('Employee Loans')?></a></li>
</ul>
<div class="tab-content">
@@ -61,4 +61,4 @@ modJsList['tabEmployeeCompanyLoan'] = new EmployeeCompanyLoanAdapter('EmployeeCo
var modJs = modJsList['tabCompanyLoan'];
</script>
<?php include APP_BASE_PATH.'footer.php';?>
<?php include APP_BASE_PATH.'footer.php';?>

12
admin/loans/meta.json Normal file
View File

@@ -0,0 +1,12 @@
{
"label": "Company Loans",
"menu": "Admin",
"order": "81",
"icon": "fa-shield",
"user_levels": [
"Admin"
],
"permissions": [],
"model_namespace": "\\Loans\\Common\\Model",
"manager": "\\Loans\\Admin\\Api\\LoansAdminManager"
}

View File

@@ -1,7 +1,8 @@
{
"Admin":"fa-cubes",
"Employees":"fa-users",
"Reports":"fa-file-text",
"Admin Reports":"fa-file-text",
"System":"fa-cogs",
"Insights":"fa-bar-chart-o",
"Payroll":"fa-money"
}

53
admin/metadata/index.php Normal file
View File

@@ -0,0 +1,53 @@
<?php
/*
This file is part of Ice Framework.
Ice Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Ice Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Ice Framework. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
$moduleName = 'metadata';
define('MODULE_PATH',dirname(__FILE__));
include APP_BASE_PATH.'header.php';
include APP_BASE_PATH.'modulejslibs.inc.php';
$moduleBuilder = new \Classes\ModuleBuilder\ModuleBuilder();
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'Country','Country','Countries','CountryAdapter','','',true
));
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'Province','Province','Provinces','ProvinceAdapter','',''
));
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'CurrencyType','CurrencyType','Currency Types','CurrencyTypeAdapter','',''
));
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'Nationality','Nationality','Nationality','NationalityAdapter','',''
));
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'Ethnicity','Ethnicity','Ethnicity','EthnicityAdapter','',''
));
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'ImmigrationStatus','ImmigrationStatus','Immigration Status','ImmigrationStatusAdapter','',''
));
echo \Classes\UIManager::getInstance()->renderModule($moduleBuilder);
include APP_BASE_PATH.'footer.php';

12
admin/metadata/meta.json Normal file
View File

@@ -0,0 +1,12 @@
{
"label": "Manage Metadata",
"menu": "System",
"order": "6",
"icon": "fa-sort-alpha-asc",
"user_levels": [
"Admin"
],
"permissions": [],
"model_namespace": "\\Metadata\\Common\\Model",
"manager": "\\Metadata\\Admin\\Api\\MetadataAdminManager"
}

207
admin/modules/index.php Normal file
View File

@@ -0,0 +1,207 @@
<?php
/*
This file is part of iCE Hrm.
iCE Hrm is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
iCE Hrm is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
$moduleName = 'Modules';
define('MODULE_PATH',dirname(__FILE__));
include APP_BASE_PATH.'header.php';
include APP_BASE_PATH.'modulejslibs.inc.php';
$groupsStr = \Classes\SettingsManager::getInstance()->getSetting("Modules : Group");
$groups = array();
if(!empty($groupsStr)){
$groups = explode(",",$groupsStr);
}
if(empty($groups)){
$groups[] = 'all';
}
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabUsage" href="#tabPageUsage"><?=t('Usage')?></a></li>
<li class=""><a id="tabModule" href="#tabPageModule"><?=t('Modules')?></a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="tabPageUsage">
<div id="Usage" class="reviewBlock" data-content="List" style="padding-left:5px;">
<div class="callout callout-info">
<h3>How Do You Want to Use IceHrm</h3>
<p style="font-size: 1.2em;">
In order to make IceHrm user interface much simpler to use for you and your employees you
can select the purpose of using IceHrm for your company. This will disable unwanted modules
and provide you a better user experience.
</p>
</div>
<hr/>
<div class="row">
<div class="col-lg-4 col-xs-12">
<div class="callout callout-gray">
<h4 class="list-group-item-heading">
<input id="all" class="module-check" type="checkbox" value="all"/>
&nbsp;Use All Available Modules</h4>
<p style="font-size: 1.2em;">
Use all the Available Modules in IceHrm. This option will enable all the modules
including Employee Management, Leave Management, Time Sheets, Attendance, Training,
Expenses, Document Management, Travel, Recruitment Management and Payroll
</p>
</div>
<div class="callout callout-white">
<h4 class="list-group-item-heading">
<input id="leave" class="module-check" type="checkbox" value="leave"/>
&nbsp;Leave Management System
</h4>
<p style="font-size: 1.2em;">
Use IceHrm as a Leave / Vacation Management System, Allow Employees to Apply for leave,
Approve leave requests and track leave balances
</p>
</div>
<div class="callout callout-gray">
<h4 class="list-group-item-heading">
<input id="documents" class="module-check" type="checkbox" value="documents"/>
&nbsp;Document Management System
</h4>
<p style="font-size: 1.2em;">
Use IceHrm as a Document Management System, Allow Employees upload documents, Automated
notifications for expiring documents, Add company documents and share with specific
employees or departments.
</p>
</div>
</div>
<div class="col-lg-4 col-xs-12">
<div class="callout callout-white">
<h4 class="list-group-item-heading">
<input id="attendance" class="module-check" type="checkbox" value="attendance"/>
&nbsp;Time Tracking System
</h4>
<p style="font-size: 1.2em;"><br/>
Use IceHrm as an Attendance Management and Time Tracking System. Let employees record
attendance and fill in time sheets.
</p>
</div>
<div class="callout callout-gray">
<h4 class="list-group-item-heading">
<input id="training" class="module-check" type="checkbox" value="training"/>
&nbsp;Training Management System
</h4>
<p style="font-size: 1.2em;">
Use IceHrm as a Training Management System. Create courses and training sessions. Let
employees subscribe to training sessions and allow them to submit feedback with training
certificates for auditing purposes.
</p>
</div>
<div class="callout callout-white">
<h4 class="list-group-item-heading">
<input id="finance" class="module-check" type="checkbox" value="finance"/>
&nbsp;Expense and Travel Management
</h4>
<p style="font-size: 1.2em;">
Get your employees to submit expense claims and let managers approve. Also combine
approved expenses with payroll module to have those added to employees salary.
Also you can track and approve employee travel requests
</p>
</div>
</div>
<?php if(defined('RECRUITMENT_ENABLED') && RECRUITMENT_ENABLED == true){?>
<div class="col-lg-4 col-xs-12">
<div class="callout callout-gray">
<h4 class="list-group-item-heading">
<input id="recruitment" class="module-check" type="checkbox" value="recruitment"/>
&nbsp;Applicant Tracking System
</h4>
<p style="font-size: 1.2em;">
Define available vacancies in your company and track applicants. Schedule interviews
and track progress of your candidates
</p>
</div>
<div class="callout callout-white">
<h4 class="list-group-item-heading">
<input id="payroll" class="module-check" type="checkbox" value="payroll"/>
&nbsp;Salary and Payroll
</h4>
<p style="font-size: 1.2em;">
Process your company payroll using IceHrm and Store employee salary
</p>
</div>
</div>
<?php }?>
</div>
<button onclick="modJs.saveUsage();" class="saveBtn btn btn-primary">
<i class="fa fa-save"></i><t>Save</t>
</button>
</div>
</div>
<div class="tab-pane" id="tabPageModule">
<div id="Module" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="ModuleForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
</div>
</div>
<script>
var modJsList = [];
modJsList['tabModule'] = new ModuleAdapter('Module','Module');
modJsList['tabModule'].setShowAddNew(false);
modJsList['tabUsage'] = new UsageAdapter('Usage','Usage');
var modJs = modJsList['tabUsage'];
$(document).ready(function(){
$("#all").click(function() {
if($(this).is(":checked")) {
$('.module-check').each(function(){
if($(this).val() != 'all'){
$(this).removeAttr('checked');
}
});
}
});
$(".module-check").click(function() {
if($(this).val() != 'all') {
$("#all").removeAttr('checked');
}
});
$('.module-check').each(function(){
if(jQuery.inArray($(this).val(), <?=json_encode($groups)?>) !== -1){
$(this).attr('checked','checked');
}
});
})
</script>
<?php include APP_BASE_PATH.'footer.php';?>

View File

@@ -1,5 +1,23 @@
/**
* Author: Thilina Hasantha
/*
This file is part of iCE Hrm.
iCE Hrm is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
iCE Hrm is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
@@ -53,8 +71,8 @@ ModuleAdapter.method('getFormFields', function() {
ModuleAdapter.method('getActionButtonsHtml', function(id,data) {
var nonEditableFields = {};
nonEditableFields["admin_Company Structure"] = 1;
nonEditableFields["admin_Employees"] = 1;
@@ -74,8 +92,73 @@ ModuleAdapter.method('getActionButtonsHtml', function(id,data) {
if(nonEditableFields[data[3]+"_"+data[1]] == 1){
return "";
}
var html = '<div style="width:80px;"><img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img></div>';
var html = '<div style="width:80px;"><img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"/></div>';
html = html.replace(/_id_/g,id);
html = html.replace(/_BASE_/g,this.baseUrl);
return html;
});
function UsageAdapter(endPoint) {
this.initAdapter(endPoint);
}
UsageAdapter.inherits(AdapterBase);
UsageAdapter.method('getDataMapping', function() {
return [];
});
UsageAdapter.method('getHeaders', function() {
return [];
});
UsageAdapter.method('getFormFields', function() {
return [];
});
UsageAdapter.method('get', function(callBackData) {
});
UsageAdapter.method('saveUsage', function() {
var that = this;
var object = {};
var arr = [];
$('.module-check').each(function(){
if($(this).is(":checked")) {
arr.push($(this).val());
}
});
if(arr.length == 0){
alert("Please select one or more module groups");
return;
}
object['groups'] = arr.join(",");
var reqJson = JSON.stringify(object);
var callBackData = [];
callBackData['callBackData'] = [];
callBackData['callBackSuccess'] = 'getInitDataSuccessCallBack';
callBackData['callBackFail'] = 'getInitDataFailCallBack';
this.customAction('saveUsage','admin=modules',reqJson,callBackData);
});
UsageAdapter.method('saveUsageSuccessCallBack', function(data) {
});
UsageAdapter.method('saveUsageFailCallBack', function(callBackData) {
});

12
admin/modules/meta.json Normal file
View File

@@ -0,0 +1,12 @@
{
"label": "Manage Modules",
"menu": "System",
"order": "3",
"icon": "fa-folder-open",
"user_levels": [
"Admin"
],
"permissions": [],
"model_namespace": "\\Modules\\Common\\Model",
"manager": "\\Modules\\Admin\\Api\\ModulesAdminManager"
}

View File

@@ -1,4 +1,4 @@
<?php
<?php
/*
This file is part of iCE Hrm.
@@ -17,38 +17,30 @@ along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
$moduleName = 'Modules';
$moduleName = 'travel';
define('MODULE_PATH',dirname(__FILE__));
include APP_BASE_PATH.'header.php';
include APP_BASE_PATH.'modulejslibs.inc.php';
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabModule" href="#tabPageModule">Modules</a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="tabPageModule">
<div id="Module" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="ModuleForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
</div>
</div>
<script>
var modJsList = new Array();
$options = array();
$options['setRemoteTable'] = 'true';
modJsList['tabModule'] = new ModuleAdapter('Module','Module');
modJsList['tabModule'].setShowAddNew(false);
var modJs = modJsList['tabModule'];
$moduleBuilder = new \Classes\ModuleBuilder\ModuleBuilder();
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'OvertimeCategory','OvertimeCategory','Overtime Categories','OvertimeCategoryAdapter','','',true,$options
));
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'EmployeeOvertime','EmployeeOvertime','Overtime Requests','EmployeeOvertimeAdminAdapter','','',false,$options
));
echo \Classes\UIManager::getInstance()->renderModule($moduleBuilder);
</script>
<?php include APP_BASE_PATH.'footer.php';?>
$itemName = 'OvertimeRequest';
$moduleName = 'Time Management';
$itemNameLower = strtolower($itemName);
include APP_BASE_PATH.'footer.php';

99
admin/overtime/lib.js Normal file
View File

@@ -0,0 +1,99 @@
/**
* Author: Thilina Hasantha
*/
/**
* OvertimeCategoryAdapter
*/
function OvertimeCategoryAdapter(endPoint) {
this.initAdapter(endPoint);
}
OvertimeCategoryAdapter.inherits(AdapterBase);
OvertimeCategoryAdapter.method('getDataMapping', function() {
return [
"id",
"name"
];
});
OvertimeCategoryAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Name" }
];
});
OvertimeCategoryAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "name", {"label":"Name","type":"text","validation":""}]
];
});
/**
* EmployeeOvertimeAdminAdapter
*/
function EmployeeOvertimeAdminAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
this.itemName = 'OvertimeRequest';
this.itemNameLower = 'overtimerequest';
this.modulePathName = 'overtime';
}
EmployeeOvertimeAdminAdapter.inherits(ApproveAdminAdapter);
EmployeeOvertimeAdminAdapter.method('getDataMapping', function() {
return [
"id",
"employee",
"category",
"start_time",
"end_time",
"project",
"status"
];
});
EmployeeOvertimeAdminAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Employee" },
{ "sTitle": "Category" },
{ "sTitle": "Start Time" },
{ "sTitle": "End Time"},
{ "sTitle": "Project"},
{ "sTitle": "Status"}
];
});
EmployeeOvertimeAdminAdapter.method('getFormFields', function() {
return [
["id", {"label": "ID", "type": "hidden"}],
["employee", {
"label": "Employee",
"type": "select2",
"sort": "none",
"allow-null": false,
"remote-source": ["Employee", "id", "first_name+last_name", "getActiveSubordinateEmployees"]
}],
["category", {"label": "Category", "type": "select2", "allow-null":false, "remote-source": ["OvertimeCategory", "id", "name"]}],
["start_time", {"label": "Start Time", "type": "datetime", "validation": ""}],
["end_time", {"label": "End Time", "type": "datetime", "validation": ""}],
["project", {"label": "Project", "type": "select2", "allow-null":true,"null=label":"none","remote-source": ["Project", "id", "name"]}],
["notes", {"label": "Notes", "type": "textarea", "validation": "none"}]
];
});

14
admin/overtime/meta.json Normal file
View File

@@ -0,0 +1,14 @@
{
"label": "Overtime Administration",
"menu": "Employees",
"order": "94",
"icon": "fa-align-center",
"user_levels": [
"Admin",
"Manager"
],
"dashboardPosition": 13,
"permissions": [],
"model_namespace": "\\Overtime\\Common\\Model",
"manager": "\\Overtime\\Admin\\Api\\OvertimeAdminManager"
}

151
admin/payroll/index.php Normal file
View File

@@ -0,0 +1,151 @@
<?php
$moduleName = 'payroll';
define('MODULE_PATH',dirname(__FILE__));
include APP_BASE_PATH.'header.php';
include APP_BASE_PATH.'modulejslibs.inc.php';
?><script type="text/javascript" src="<?=BASE_URL?>js/mindmup-editabletable.js?v=<?=$jsVersion?>"></script>
<style type="text/css">
.sorting_disabled{min-width: 80px;}
</style>
<div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabPayrollEmployee" href="#tabPagePayrollEmployee"><?=t('Company Payroll')?></a></li>
<li class=""><a id="tabPayroll" href="#tabPagePayroll"><?=t('Payroll Reports')?></a></li>
<li class=""><a id="tabPayrollColumn" href="#tabPagePayrollColumn"><?=t('Payroll Columns')?></a></li>
<li class=""><a id="tabDeductionGroup" href="#tabPageDeductionGroup"><?=t('Calculation Groups')?></a></li>
<li class=""><a id="tabDeduction" href="#tabPageDeduction"><?=t('Calculation Methods')?></a></li>
<li class=""><a id="tabPayslipTemplate" href="#tabPagePayslipTemplate"><?=t('Payslip Templates')?></a></li>
</ul>
<div class="tab-content">
<div class="tab-pane active" id="tabPagePayrollEmployee">
<div id="PayrollEmployee" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="PayrollEmployeeForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane " id="tabPagePayroll">
<div id="Payroll" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="PayrollForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
<div id="PayrollData" class="reviewBlock" data-content="List" style="padding-left:5px;display:none;overflow-x: auto;">
</div>
<div id="PayrollDataButtons" style="text-align: right;margin-top: 10px;">
<button class="cancelBtnTable btn" style="margin-right:5px;"><i class="fa fa-times-circle-o"></i> Cancel</button>
<button class="saveBtnTable btn btn-primary" style="margin-right:5px;"><i class="fa fa-save"></i> Save</button>
<button class="downloadBtnTable btn btn-primary" style="margin-right:5px;"><i class="fa fa-check"></i> Download</button>
<button class="completeBtnTable btn btn-primary" style="margin-right:5px;"><i class="fa fa-check-square-o"></i> Finalize</button>
</div>
</div>
<div class="tab-pane" id="tabPagePayrollColumn">
<div id="PayrollColumn" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="PayrollColumnForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<!--<div class="tab-pane" id="tabPagePayrollColumnTemplate">
<div id="PayrollColumnTemplate" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="PayrollColumnTemplateForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>-->
<div class="tab-pane" id="tabPageDeductionGroup">
<div id="DeductionGroup" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="DeductionGroupForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPageDeduction">
<div id="Deduction" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="DeductionForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
<div class="tab-pane" id="tabPagePayslipTemplate">
<div id="PayslipTemplate" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="PayslipTemplateForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
</div>
</div>
<script>
var modJsList = new Array();
modJsList['tabPayday'] = new PaydayAdapter('PayFrequency','Payday');
modJsList['tabPayroll'] = new PayrollAdapter('Payroll','Payroll');
modJsList['tabPayrollData'] = new PayrollDataAdapter('PayrollData','PayrollData');
modJsList['tabPayrollData'].setRemoteTable(false);
modJsList['tabPayrollData'].setShowAddNew(false);
modJsList['tabPayrollData'].setModulePath('admin=payroll');
modJsList['tabPayrollData'].setRowFieldName('employee');
modJsList['tabPayrollData'].setColumnFieldName('payroll_item');
modJsList['tabPayrollData'].setTables('PayrollEmployee','PayrollColumn','PayrollData');
modJsList['tabPayrollColumn'] = new PayrollColumnAdapter('PayrollColumn','PayrollColumn','','name, colorder');
modJsList['tabPayrollColumn'].setRemoteTable(true);
//modJsList['tabPayrollColumnTemplate'] = new PayrollColumnTemplateAdapter('PayrollColumnTemplate','PayrollColumnTemplate');
modJsList['tabPayrollEmployee'] = new PayrollEmployeeAdapter('PayrollEmployee','PayrollEmployee');
modJsList['tabPayrollEmployee'].setRemoteTable(true);
modJsList['tabPayslipTemplate'] = new PayslipTemplateAdapter('PayslipTemplate','PayslipTemplate');
modJsList['tabPayslipTemplate'].setRemoteTable(true);
var modJs = modJsList['tabPayrollEmployee'];
$(".saveBtnTable").off().on('click',function(){
modJsList['tabPayrollData'].sendCellDataUpdates();
});
$(".completeBtnTable").off().on('click',function(){
modJsList['tabPayrollData'].sendAllCellDataUpdates();
$(".completeBtnTable").hide();
$(".saveBtnTable").hide();
});
$(".downloadBtnTable").off().on('click',function(){
modJsList['tabPayrollData'].downloadPayroll();
});
$(".cancelBtnTable").off().on('click',function(){
modJs = modJsList['tabPayroll'];
modJs.get([]);
});
modJsList['tabDeduction'] = new DeductionAdapter('Deduction','Deduction');
modJsList['tabDeduction'].setRemoteTable(true);
modJsList['tabDeductionGroup'] = new DeductionGroupAdapter('DeductionGroup','DeductionGroup');
modJsList['tabDeductionGroup'].setRemoteTable(true);
</script>
<?php include APP_BASE_PATH.'footer.php';?>

648
admin/payroll/lib.js Normal file
View File

@@ -0,0 +1,648 @@
/**
* Author: Thilina Hasantha
*/
/**
* PaydayAdapter
*/
function PaydayAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
PaydayAdapter.inherits(AdapterBase);
PaydayAdapter.method('getDataMapping', function() {
return [
"id",
"name"
];
});
PaydayAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Select Pay Frequency"}
];
});
PaydayAdapter.method('getFormFields', function() {
return [
[ "name", {"label":"Name","type":"text","validation":""}]
];
});
/*
PaydayAdapter.method('showActionButtons' , function() {
return false;
});
*/
PaydayAdapter.method('getAddNewLabel', function() {
return "Run Payroll";
});
PaydayAdapter.method('createTable', function(elementId) {
$("#payday_all").off();
this.uber('createTable',elementId);
$("#payday_all").off().on('click',function(){
if($(this).is(':checked')){
$('.paydayCheck').prop('checked', true);
}else{
$('.paydayCheck').prop('checked', false);
}
})
});
PaydayAdapter.method('getActionButtonsHtml', function(id,data) {
var editButton = '<input type="checkbox" class="paydayCheck" id="payday__id_" name="payday__id_" value="checkbox_payday__id_"/>';
var html = '<div style="width:120px;">_edit_</div>';
html = html.replace('_edit_',editButton);
html = html.replace(/_id_/g,id);
html = html.replace(/_BASE_/g,this.baseUrl);
return html;
});
PaydayAdapter.method('getActionButtonHeader', function() {
return { "sTitle": '<input type="checkbox" id="payday_all" name="payday_all" value="checkbox_payday_all"/>', "sClass": "center" };
});
/**
* PayrollAdapter
*/
function PayrollAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
PayrollAdapter.inherits(AdapterBase);
PayrollAdapter.method('getDataMapping', function() {
return [
"id",
"name",
"pay_period",
"department",
"date_start",
"date_end",
"status"
];
});
PayrollAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID","bVisible":false },
{ "sTitle": "Name" },
{ "sTitle": "Pay Frequency"},
{ "sTitle": "Department"},
{ "sTitle": "Date Start"},
{ "sTitle": "Date End"},
{ "sTitle": "Status"}
];
});
PayrollAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "name", {"label":"Name","type":"text"}],
[ "pay_period", {"label":"Pay Frequency","type":"select","remote-source":["PayFrequency","id","name"],"sort":"none"}],
[ "deduction_group", {"label":"Calculation Group","type":"select","remote-source":["DeductionGroup","id","name"],"sort":"none"}],
[ "payslipTemplate", {"label":"Payslip Template","type":"select","remote-source":["PayslipTemplate","id","name"]}],
[ "department", {"label":"Department","type":"select2","remote-source":["CompanyStructure","id","title"],"sort":"none"}],
[ "date_start", {"label":"Start Date","type":"date","validation":""}],
[ "date_end", {"label":"End Date","type":"date","validation":""}],
//[ "column_template", {"label":"Report Column Template","type":"select","remote-source":["PayrollColumnTemplate","id","name"]}],
[ "columns", {"label":"Payroll Columns","type":"select2multi","remote-source":["PayrollColumn","id","name"]}],
[ "status", {"label":"Status","type":"select","source":[["Draft","Draft"],["Completed","Completed"]],"sort":"none"}]
];
});
PayrollAdapter.method('postRenderForm', function(object, $tempDomObj) {
if(object != null && object != undefined && object.id != undefined && object.id != null){
$tempDomObj.find("#pay_period").attr('disabled','disabled');
$tempDomObj.find("#department").attr('disabled','disabled');
//$tempDomObj.find("#date_start").attr('disabled','disabled');
//$tempDomObj.find("#date_end").attr('disabled','disabled');
//$tempDomObj.find("#column_template").attr('disabled','disabled');
}
});
PayrollAdapter.method('process', function(id, status) {
modJs = modJsList['tabPayrollData'];
modJs.setCurrentPayroll(id);
$("#Payroll").hide();
$("#PayrollData").show();
$("#PayrollDataButtons").show();
if(status == 'Completed'){
$(".completeBtnTable").hide();
$(".saveBtnTable").hide();
}else{
$(".completeBtnTable").show();
$(".saveBtnTable").show();
}
modJs.get([]);
});
PayrollAdapter.method('getActionButtonsHtml', function(id,data) {
var editButton = '<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>';
var processButton = '<img class="tableActionButton" src="_BASE_images/run.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Process" onclick="modJs.process(_id_,\'_status_\');return false;"></img>';
var deleteButton = '<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Delete" onclick="modJs.deleteRow(_id_);return false;"></img>';
var cloneButton = '<img class="tableActionButton" src="_BASE_images/clone.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Copy" onclick="modJs.copyRow(_id_);return false;"></img>';
var html = '<div style="width:120px;">_edit__process__clone__delete_</div>';
if(this.showAddNew){
html = html.replace('_clone_',cloneButton);
}else{
html = html.replace('_clone_','');
}
if(this.showDelete){
html = html.replace('_delete_',deleteButton);
}else{
html = html.replace('_delete_','');
}
if(this.showEdit){
html = html.replace('_edit_',editButton);
}else{
html = html.replace('_edit_','');
}
/*
if(data[6] != "Completed"){
html = html.replace('_process_',processButton);
}else{
html = html.replace('_process_','');
}
*/
html = html.replace('_process_',processButton);
html = html.replace(/_id_/g,id);
html = html.replace(/_status_/g,data[6]);
html = html.replace(/_BASE_/g,this.baseUrl);
return html;
});
PayrollAdapter.method('get', function(callBackData) {
$("#PayrollData").hide();
$("#PayrollForm").hide();
$("#PayrollDataButtons").hide();
$("#Payroll").show();
modJsList['tabPayrollData'].setCurrentPayroll(null);
this.uber('get',callBackData);
});
/**
* PayrollDataAdapter
*/
function PayrollDataAdapter(endPoint) {
this.initAdapter(endPoint);
this.cellDataUpdates = {};
this.payrollId = null;
}
PayrollDataAdapter.inherits(TableEditAdapter);
PayrollDataAdapter.method('validateCellValue', function(element, evt, newValue) {
modJs.addCellDataUpdate(element.data('colId'),element.data('rowId'),newValue);
return true;
});
PayrollDataAdapter.method('setCurrentPayroll', function(val) {
this.payrollId = val;
});
PayrollDataAdapter.method('addAdditionalRequestData' , function(type, req) {
if(type == 'updateData'){
req.payrollId = this.payrollId;
}else if(type == 'updateAllData'){
req.payrollId = this.payrollId;
}else if(type == 'getAllData'){
req.payrollId = this.payrollId;
}
return req;
});
PayrollDataAdapter.method('modifyCSVHeader', function(header) {
header.unshift("");
return header;
});
PayrollDataAdapter.method('getCSVData' , function() {
var csv = "";
for(var i=0;i<this.csvData.length;i++){
csv += this.csvData[i].join(",");
if(i < this.csvData.length -1){
csv += "\r\n";
}
}
return csv;
});
PayrollDataAdapter.method('downloadPayroll' , function() {
var element = document.createElement('a');
element.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(this.getCSVData()));
element.setAttribute('download', "payroll_"+this.payrollId+".csv");
element.style.display = 'none';
document.body.appendChild(element);
element.click();
document.body.removeChild(element);
});
/**
* PayrollColumnAdapter
*/
function PayrollColumnAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
PayrollColumnAdapter.inherits(AdapterBase);
PayrollColumnAdapter.method('getDataMapping', function() {
return [
"id",
"name",
"colorder",
"calculation_hook",
"editable",
"enabled"
];
});
PayrollColumnAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Name"},
{ "sTitle": "Column Order"},
{ "sTitle": "Calculation Method"},
{ "sTitle": "Editable"},
{ "sTitle": "Enabled"}
];
});
PayrollColumnAdapter.method('getFormFields', function() {
var fucntionColumnList = [ "calculation_columns", {"label":"Calculation Columns","type":"datagroup",
"form":[
[ "name", {"label":"Name","type":"text","validation":""}],
[ "column", {"label":"Column","type":"select2","remote-source":["PayrollColumn","id","name"]}]
],
"html":'<div id="#_id_#" class="panel panel-default">#_delete_##_edit_#<div class="panel-body">#_renderFunction_#</div></div>',
"validation":"none",
"render":function(item){
var output = "Variable:"+item.name;
return output;
}
}];
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "name", {"label":"Name","type":"text","validation":""}],
[ "calculation_hook", {"label":"Predefined Calculations","type":"select2","allow-null":true,"null-label":"None","remote-source":["CalculationHook","code","name"]}],
[ "salary_components", {"label":"Salary Components","type":"select2multi","remote-source":["SalaryComponent","id","name"]}],
[ "deductions", {"label":"Calculation Method","type":"select2multi","remote-source":["Deduction","id","name"]}],
[ "add_columns", {"label":"Columns to Add","type":"select2multi","remote-source":["PayrollColumn","id","name"]}],
[ "sub_columns", {"label":"Columns to Subtract","type":"select2multi","remote-source":["PayrollColumn","id","name"]}],
[ "colorder", {"label":"Column Order","type":"text","validation":"number"}],
[ "editable", {"label":"Editable","type":"select","source":[["Yes","Yes"],["No","No"]]}],
[ "enabled", {"label":"Enabled","type":"select","source":[["Yes","Yes"],["No","No"]]}],
[ "default_value", {"label":"Default Value","type":"text","validation":""}],
fucntionColumnList,
[ "calculation_function", {"label":"Function","type":"text","validation":"none"}]
];
});
/**
* PayrollColumnTemplateAdapter
*/
function PayrollColumnTemplateAdapter(endPoint) {
this.initAdapter(endPoint);
}
PayrollColumnTemplateAdapter.inherits(AdapterBase);
PayrollColumnTemplateAdapter.method('getDataMapping', function() {
return [
"id",
"name"
];
});
PayrollColumnTemplateAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":true},
{ "sTitle": "Name"}
];
});
PayrollColumnTemplateAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "name", {"label":"Name","type":"text","validation":""}],
[ "columns", {"label":"Payroll Columns","type":"select2multi","remote-source":["PayrollColumn","id","name"]}]
];
});
/*
* PayrollEmployeeAdapter
*/
function PayrollEmployeeAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
PayrollEmployeeAdapter.inherits(AdapterBase);
PayrollEmployeeAdapter.method('getDataMapping', function() {
return [
"id",
"employee",
"pay_frequency",
"deduction_group",
"currency"
];
});
PayrollEmployeeAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Employee" },
{ "sTitle": "Pay Frequency"},
{ "sTitle": "Calculation Group"},
{ "sTitle": "Currency"},
];
});
PayrollEmployeeAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}],
[ "pay_frequency", {"label":"Pay Frequency","type":"select2","remote-source":["PayFrequency","id","name"]}],
[ "currency", {"label":"Currency","type":"select2","remote-source":["CurrencyType","id","code"]}],
[ "deduction_group", {"label":"Calculation Group","type":"select2","allow-null":true,"null-label":"None","remote-source":["DeductionGroup","id","name"]}],
[ "deduction_exemptions", {"label":"Calculation Exemptions","type":"select2multi","remote-source":["Deduction","id","name"],"validation":"none"}],
[ "deduction_allowed", {"label":"Calculations Assigned","type":"select2multi","remote-source":["Deduction","id","name"],"validation":"none"}]
];
});
PayrollEmployeeAdapter.method('getFilters', function() {
return [
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}]
];
});
/**
* DeductionAdapter
*/
function DeductionAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
DeductionAdapter.inherits(AdapterBase);
DeductionAdapter.method('getDataMapping', function() {
return [
"id",
"name",
"deduction_group"
];
});
DeductionAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Name" },
{ "sTitle": "Calculation Group"}
];
});
DeductionAdapter.method('getFormFields', function() {
var rangeAmounts = [ "rangeAmounts", {"label":"Calculation Process","type":"datagroup",
"form":[
[ "lowerCondition", {"label":"Lower Limit Condition","type":"select","source":[["No Lower Limit","No Lower Limit"],["gt","Greater than"],["gte","Greater than or Equal"]]}],
[ "lowerLimit", {"label":"Lower Limit","type":"text","validation":"float"}],
[ "upperCondition", {"label":"Upper Limit Condition","type":"select","source":[["No Upper Limit","No Upper Limit"],["lt","Less than"],["lte","Less than or Equal"]]}],
[ "upperLimit", {"label":"Upper Limit","type":"text","validation":"float"}],
[ "amount", {"label":"Value","type":"text","validation":""}]
],
"html":'<div id="#_id_#" class="panel panel-default">#_delete_##_edit_#<div class="panel-body">#_renderFunction_#</div></div>',
"validation":"none",
"custom-validate-function":function (data){
var res = {};
res['valid'] = true;
if(data.lowerCondition == 'No Lower Limit'){
data.lowerLimit = 0;
}
if(data.upperCondition == 'No Upper Limit'){
data.upperLimit = 0;
}
res['params'] = data;
return res;
},
"render":function(item){
var output = "";
var getSymbol = function(text){
var map = {};
map['gt'] = '>';
map['gte'] = '>=';
map['lt'] = '<';
map['lte'] = '<=';
return map[text];
}
if(item.lowerCondition != "No Lower Limit"){
output += item.lowerLimit + " " + getSymbol(item.lowerCondition) + " ";
}
if(item.upperCondition != "No Upper Limit"){
output += " and ";
output += getSymbol(item.upperCondition) + " " + item.upperLimit + " ";
}
if(output == ""){
return "Deduction is "+item.amount + " for all ranges";
}else{
return "If salary component "+output+ " deduction is "+item.amount;
}
return output;
}
}];
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "name", {"label":"Name","type":"text","validation":""}],
[ "componentType", {"label":"Salary Component Type","type":"select2multi","allow-null":true,"remote-source":["SalaryComponentType","id","name"]}],
[ "component", {"label":"Salary Component","type":"select2multi","allow-null":true,"remote-source":["SalaryComponent","id","name"]}],
[ "payrollColumn", {"label":"Payroll Report Column","type":"select2","allow-null":true,"remote-source":["PayrollColumn","id","name"]}],
rangeAmounts,
[ "deduction_group", {"label":"Calculation Group","type":"select2","allow-null":true,"null-label":"None","remote-source":["DeductionGroup","id","name"]}]
];
});
/*
* DeductionGroupAdapter
*/
function DeductionGroupAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
DeductionGroupAdapter.inherits(AdapterBase);
DeductionGroupAdapter.method('getDataMapping', function() {
return [
"id",
"name",
"description"
];
});
DeductionGroupAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Name" },
{ "sTitle": "Details" }
];
});
DeductionGroupAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "name", {"label":"Name","type":"text","validation":""}],
[ "description", {"label":"Details","type":"textarea","validation":"none"}]
];
});
/*
* PayslipTemplateAdapter
*/
function PayslipTemplateAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
PayslipTemplateAdapter.inherits(AdapterBase);
PayslipTemplateAdapter.method('getDataMapping', function() {
return [
"id",
"name"
];
});
PayslipTemplateAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Name" }
];
});
PayslipTemplateAdapter.method('getFormFields', function() {
var payslipFields = [ "data", {"label":"Payslip Fields","type":"datagroup",
"form":[
[ "type", {"label":"Type","type":"select","sort":"none","source":[["Payroll Column","Payroll Column"],["Text","Text"],["Company Name","Company Name"],["Company Logo","Company Logo"], ["Separators","Separators"]]}],
[ "payrollColumn", {"label":"Payroll Column","type":"select2","sort":"none","allow-null":true,"null-label":"None","remote-source":["PayrollColumn","id","name"]}],
[ "label", {"label":"Label","type":"text","validation":"none"}],
[ "text", {"label":"Text","type":"textarea","validation":"none"}],
[ "status", {"label":"Status","type":"select","sort":"none","source":[["Show","Show"],["Hide","Hide"]]}]
],
//"html":'<div id="#_id_#" class="panel panel-default">#_delete_##_edit_#<div class="panel-body"><table class="table table-striped"><tr><td>Type</td><td>#_type_#</td></tr><tr><td>Label</td><td>#_label_#</td></tr><tr><td>Text</td><td>#_text_#</td></tr><tr><td>Font Size</td><td>#_fontSize_#</td></tr><tr><td>Font Style</td><td>#_fontStyle_#</td></tr><tr><td>Font Color</td><td>#_fontColor_#</td></tr><tr><td>Status</td><td>#_status_#</td></tr></table> </div></div>',
"html":'<div id="#_id_#" class="panel panel-default">#_delete_##_edit_#<div class="panel-body">#_type_# #_label_# <br/> #_text_#</div></div>',
"validation":"none",
"custom-validate-function":function (data){
var res = {};
res['valid'] = true;
if(data.type == 'Payroll Column'){
if(data.payrollColumn == "NULL"){
res['valid'] = false;
res['message'] = "Please select payroll column";
}else{
data.payrollColumn == "NULL";
}
}else if(data.type == 'Text'){
if(data.text == ""){
res['valid'] = false;
res['message'] = "Text can not be empty";
}
}
res['params'] = data;
return res;
}
}];
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "name", {"label":"Name","type":"text","validation":""}],
payslipFields
];
});

12
admin/payroll/meta.json Normal file
View File

@@ -0,0 +1,12 @@
{
"label": "Payroll Reports",
"menu": "Payroll",
"order": "6",
"icon": "fa-cogs",
"user_levels": [
"Admin"
],
"permissions": [],
"model_namespace": "\\Payroll\\Common\\Model",
"manager": "\\Payroll\\Admin\\Api\\PayrollAdminManager"
}

View File

@@ -3,17 +3,17 @@
<div class="small-box bg-aqua">
<div class="inner">
<h3>
Permission
<t>Permission</t>
</h3>
<p>
Management
<t>Management</t>
</p>
</div>
<div class="icon">
<i class="ion ion-locked"></i>
</div>
<a href="#_moduleLink_#" class="small-box-footer" id="permissionLink">
Manage Permissions <i class="fa fa-arrow-circle-right"></i>
<t>Manage</t> <t>Permissions</t> <i class="fa fa-arrow-circle-right"></i>
</a>
</div>
</div>

View File

@@ -28,7 +28,7 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabPermission" href="#tabPagePermission">Permissions</a></li>
<li class="active"><a id="tabPermission" href="#tabPagePermission"><?=t('Permissions')?></a></li>
</ul>
<div class="tab-content">
@@ -51,4 +51,4 @@ modJsList['tabPermission'].setShowAddNew(false);
var modJs = modJsList['tabPermission'];
</script>
<?php include APP_BASE_PATH.'footer.php';?>
<?php include APP_BASE_PATH.'footer.php';?>

View File

@@ -0,0 +1,13 @@
{
"label": "Manage Permissions",
"menu": "System",
"order": "4",
"icon": "fa-unlock",
"user_levels": [
"Admin"
],
"dashboardPosition": 15,
"permissions": [],
"model_namespace": "\\Permissions\\Common\\Model",
"manager": "\\Permissions\\Admin\\Api\\PermissionsAdminManager"
}

View File

@@ -2,16 +2,16 @@
<div class="small-box bg-red">
<div class="inner">
<h3>Projects</h3>
<h3><t>Projects</t></h3>
<p id="numberOfProjects">
#_numberOfProjects_# Active Projects
#_numberOfProjects_# <t>Active Projects</t>
</p>
</div>
<div class="icon">
<i class="ion ion-pie-graph"></i>
</div>
<a href="#_moduleLink_#" class="small-box-footer" id="projectsLink">
Update Clients/Projects <i class="fa fa-arrow-circle-right"></i>
<t>Update Clients/Projects</t> <i class="fa fa-arrow-circle-right"></i>
</a>
</div>
</div>

View File

@@ -28,9 +28,9 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabClient" href="#tabPageClient">Clients</a></li>
<li><a id="tabProject" href="#tabPageProject">Projects</a></li>
<li><a id="tabEmployeeProject" href="#tabPageEmployeeProject">Employee Projects</a></li>
<li class="active"><a id="tabClient" href="#tabPageClient"><?=t('Clients')?></a></li>
<li><a id="tabProject" href="#tabPageProject"><?=t('Projects')?></a></li>
<li><a id="tabEmployeeProject" href="#tabPageEmployeeProject"><?=t('Employee Projects')?></a></li>
</ul>
<div class="tab-content">
@@ -110,4 +110,4 @@ modJsList['tabEmployeeProject'].setShowEdit(false);
var modJs = modJsList['tabClient'];
</script>
<?php include APP_BASE_PATH.'footer.php';?>
<?php include APP_BASE_PATH.'footer.php';?>

View File

@@ -95,13 +95,14 @@ ProjectAdapter.method('getHeaders', function() {
});
ProjectAdapter.method('getFormFields', function() {
if(this.showSave){
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "name", {"label":"Name","type":"text"}],
[ "client", {"label":"Client","type":"select2","allow-null":true,"remote-source":["Client","id","name"]}],
[ "details", {"label":"Details","type":"textarea","validation":"none"}],
[ "status", {"label":"Status","type":"select","source":[["Active","Active"],["Inactive","Inactive"]]}]
[ "status", {"label":"Status","type":"select","source":[["Active","Active"],["On Hold","On Hold"],["Completed","Completed"],["Dropped","Dropped"]]}]
];
}else{
return [
@@ -109,7 +110,7 @@ ProjectAdapter.method('getFormFields', function() {
[ "name", {"label":"Name","type":"placeholder"}],
[ "client", {"label":"Client","type":"placeholder","allow-null":true,"remote-source":["Client","id","name"]}],
[ "details", {"label":"Details","type":"placeholder","validation":"none"}],
[ "status", {"label":"Status","type":"placeholder","source":[["Active","Active"],["Inactive","Inactive"]]}]
[ "status", {"label":"Status","type":"select","source":[["Active","Active"],["On Hold","On Hold"],["Completed","Completed"],["Dropped","Dropped"]]}]
];
}
@@ -137,8 +138,7 @@ EmployeeProjectAdapter.method('getDataMapping', function() {
return [
"id",
"employee",
"project",
"status"
"project"
];
});
@@ -146,9 +146,7 @@ EmployeeProjectAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Employee" },
{ "sTitle": "Project" },
/*{ "sTitle": "Start Date"},*/
{ "sTitle": "Status"}
{ "sTitle": "Project" }
];
});
@@ -157,9 +155,6 @@ EmployeeProjectAdapter.method('getFormFields', function() {
[ "id", {"label":"ID","type":"hidden"}],
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}],
[ "project", {"label":"Project","type":"select2","remote-source":["Project","id","name"]}],
/*[ "date_start", {"label":"Start Date","type":"date","validation":""}],
[ "date_end", {"label":"End Date","type":"date","validation":"none"}],*/
[ "status", {"label":"Status","type":"select","source":[["Current","Current"],["Inactive","Inactive"],["Completed","Completed"]]}],
[ "details", {"label":"Details","type":"textarea","validation":"none"}]
];
});

23
admin/projects/meta.json Normal file
View File

@@ -0,0 +1,23 @@
{
"label": "Projects\/Client Setup",
"menu": "Admin",
"order": "51",
"icon": "fa-list-alt",
"user_levels": [
"Admin",
"Manager"
],
"dashboardPosition": 4,
"permissions": {
"Manager": {
"Add Projects": "Yes",
"Edit Projects": "Yes",
"Delete Projects": "No",
"Add Clients": "Yes",
"Edit Clients": "Yes",
"Delete Clients": "No"
}
},
"model_namespace": "\\Projects\\Common\\Model",
"manager": "\\Projects\\Admin\\Api\\ProjectsAdminManager"
}

View File

@@ -28,10 +28,10 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabSkill" href="#tabPageSkill">Skills</a></li>
<li><a id="tabEducation" href="#tabPageEducation">Education</a></li>
<li><a id="tabCertification" href="#tabPageCertification">Certifications</a></li>
<li><a id="tabLanguage" href="#tabPageLanguage">Languages</a></li>
<li class="active"><a id="tabSkill" href="#tabPageSkill"><?=t('Skills')?></a></li>
<li><a id="tabEducation" href="#tabPageEducation"><?=t('Education')?></a></li>
<li><a id="tabCertification" href="#tabPageCertification"><?=t('Certifications')?></a></li>
<li><a id="tabLanguage" href="#tabPageLanguage"><?=t('Languages')?></a></li>
</ul>
<div class="tab-content">
@@ -61,10 +61,10 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
</div>
<div class="tab-pane" id="tabPageLanguage">
<div id="Language" class="reviewBlock" data-content="List" style="padding-left:5px;">
</div>
<div id="LanguageForm" class="reviewBlock" data-content="Form" style="padding-left:5px;display:none;">
</div>
</div>
</div>
@@ -124,4 +124,4 @@ modJsList['tabLanguage'].setShowEdit(false);
var modJs = modJsList['tabSkill'];
</script>
<?php include APP_BASE_PATH.'footer.php';?>
<?php include APP_BASE_PATH.'footer.php';?>

View File

@@ -0,0 +1,28 @@
{
"label": "Qualifications Setup",
"menu": "Admin",
"order": "4",
"icon": "fa-check-square-o",
"user_levels": [
"Admin",
"Manager"
],
"permissions": {
"Manager": {
"Add Skills": "Yes",
"Edit Skills": "Yes",
"Delete Skills": "No",
"Add Education": "Yes",
"Edit Education": "Yes",
"Delete Education": "No",
"Add Certifications": "Yes",
"Edit Certifications": "Yes",
"Delete Certifications": "No",
"Add Languages": "Yes",
"Edit Languages": "Yes",
"Delete Languages": "No"
}
},
"model_namespace": "\\Qualifications\\Common\\Model",
"manager": "\\Qualifications\\Admin\\Api\\QualificationsAdminManager"
}

View File

@@ -2,16 +2,16 @@
<div class="small-box bg-teal">
<div class="inner">
<h3>Reports</h3>
<h3><t>Reports</t></h3>
<p>
View / Download Reports
<t>View / Download Reports</t>
</p>
</div>
<div class="icon">
<i class="ion ion-document-text"></i>
</div>
<a href="#_moduleLink_#" class="small-box-footer" id="reportsLink">
Create a Report <i class="fa fa-arrow-circle-right"></i>
<t>Generate a Report</t> <i class="fa fa-arrow-circle-right"></i>
</a>
</div>
</div>

View File

@@ -7,7 +7,7 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabReport" href="#tabPageReport">Reports</a></li>
<li class="active"><a id="tabReport" href="#tabPageReport"><?=t('Reports')?></a></li>
</ul>
<div class="tab-content">
@@ -30,12 +30,9 @@ modJsList['tabReport'] = new ReportAdapter('Report','Report','','report_group');
modJsList['tabReport'].setShowAddNew(false);
modJsList['tabReport'].setRemoteTable(true);
/*
modJsList['tabReport'] = new ReportGenAdapter('File','File','{"file_group":"Report"}','group');
modJsList['tabReport'].setShowAddNew(false);
*/
var modJs = modJsList['tabReport'];
</script>
<?php include APP_BASE_PATH.'footer.php';?>
<?php include APP_BASE_PATH.'footer.php';?>

396
admin/reports/lib.js Normal file
View File

@@ -0,0 +1,396 @@
/**
* Author: Thilina Hasantha
*/
/**
* ReportAdapter
*/
function ReportAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
this._construct();
}
ReportAdapter.inherits(AdapterBase);
ReportAdapter.method('_construct', function() {
this._formFileds = [
[ "id", {"label":"ID","type":"hidden"}],
[ "name", {"label":"Name","type":"label","validation":""}],
[ "parameters", {"label":"Parameters","type":"fieldset","validation":"none"}]
];
this.remoteFieldsExists = false;
});
ReportAdapter.method('_initLocalFormFields', function() {
this._formFileds = [
[ "id", {"label":"ID","type":"hidden"}],
[ "name", {"label":"Name","type":"label","validation":""}],
[ "parameters", {"label":"Parameters","type":"fieldset","validation":"none"}]
];
});
ReportAdapter.method('setRemoteFieldExists', function(val) {
this.remoteFieldsExists = val;
});
ReportAdapter.method('getDataMapping', function() {
return [
"id",
"icon",
"name",
"details",
"parameters"
];
});
ReportAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "","bSortable":false,"sWidth":"22px"},
{ "sTitle": "Name","sWidth":"30%"},
{ "sTitle": "Details"},
{ "sTitle": "Parameters","bVisible":false},
];
});
ReportAdapter.method('getFormFields', function() {
return this._formFileds;
});
ReportAdapter.method('processFormFieldsWithObject', function(object) {
var that = this;
this._initLocalFormFields();
var len = this._formFileds.length;
var fieldIDsToDelete = [];
var fieldsToDelete = [];
this.remoteFieldsExists = false;
for(var i=0;i<len;i++){
if(this._formFileds[i][1]['type']=="fieldset"){
var newFields = JSON.parse(object[this._formFileds[i][0]]);
fieldsToDelete.push(this._formFileds[i][0]);
newFields.forEach(function(entry) {
that._formFileds.push(entry);
if(entry[1]['remote-source'] != undefined && entry[1]['remote-source'] != null){
that.remoteFieldsExists = true;
}
});
}
}
var tempArray = [];
that._formFileds.forEach(function(entry) {
if(jQuery.inArray(entry[0], fieldsToDelete) < 0){
tempArray.push(entry);
}
});
that._formFileds = tempArray;
});
ReportAdapter.method('renderForm', function(object) {
var that = this;
this.processFormFieldsWithObject(object);
if(this.remoteFieldsExists){
var cb = function(){
that.renderFormNew(object);
};
this.initFieldMasterData(cb);
}else{
this.initFieldMasterData();
that.renderFormNew(object);
}
this.currentReport = object;
});
ReportAdapter.method('renderFormNew', function(object) {
var that = this;
var signatureIds = [];
if(object == null || object == undefined){
this.currentId = null;
}
this.preRenderForm(object);
var formHtml = this.templates['formTemplate'];
var html = "";
var fields = this.getFormFields();
for(var i=0;i<fields.length;i++){
var metaField = this.getMetaFieldForRendering(fields[i][0]);
if(metaField == "" || metaField == undefined){
html += this.renderFormField(fields[i]);
}else{
var metaVal = object[metaField];
if(metaVal != '' && metaVal != null && metaVal != undefined && metaVal.trim() != ''){
html += this.renderFormField(JSON.parse(metaVal));
}else{
html += this.renderFormField(fields[i]);
}
}
}
formHtml = formHtml.replace(/_id_/g,this.getTableName()+"_submit");
formHtml = formHtml.replace(/_fields_/g,html);
var $tempDomObj;
var randomFormId = this.generateRandom(14);
if(!this.showFormOnPopup){
$tempDomObj = $("#"+this.getTableName()+'Form');
}else{
$tempDomObj = $('<div class="reviewBlock popupForm" data-content="Form"></div>');
$tempDomObj.attr('id',randomFormId);
}
$tempDomObj.html(formHtml);
$tempDomObj.find('.datefield').datepicker({'viewMode':2});
$tempDomObj.find('.timefield').datetimepicker({
language: 'en',
pickDate: false
});
$tempDomObj.find('.datetimefield').datetimepicker({
language: 'en'
});
$tempDomObj.find('.colorpick').colorpicker();
//$tempDomObj.find('.select2Field').select2();
$tempDomObj.find('.select2Field').each(function() {
$(this).select2().select2('val', $(this).find("option:eq(0)").val());
});
$tempDomObj.find('.select2Multi').each(function() {
$(this).select2().on("change",function(e){
var parentRow = $(this).parents(".row");
var height = parentRow.find(".select2-choices").height();
parentRow.height(parseInt(height));
});
});
$tempDomObj.find('.signatureField').each(function() {
//$(this).data('signaturePad',new SignaturePad($(this)));
signatureIds.push($(this).attr('id'));
});
for(var i=0;i<fields.length;i++){
if(fields[i][1].type == "datagroup"){
$tempDomObj.find("#"+fields[i][0]).data('field',fields[i]);
}
}
if(this.showSave == false){
$tempDomObj.find('.saveBtn').remove();
}else{
$tempDomObj.find('.saveBtn').off();
$tempDomObj.find('.saveBtn').data("modJs",this);
$tempDomObj.find('.saveBtn').on( "click", function() {
if($(this ).data('modJs').saveSuccessItemCallback != null && $(this ).data('modJs').saveSuccessItemCallback!= undefined){
$(this ).data('modJs').save($(this ).data('modJs').retriveItemsAfterSave(), $(this ).data('modJs').saveSuccessItemCallback);
}else{
$(this ).data('modJs').save();
}
return false;
});
}
if(this.showCancel== false){
$tempDomObj.find('.cancelBtn').remove();
}else{
$tempDomObj.find('.cancelBtn').off();
$tempDomObj.find('.cancelBtn').data("modJs",this);
$tempDomObj.find('.cancelBtn').on( "click", function() {
$(this ).data('modJs').cancel();
return false;
});
}
if(!this.showFormOnPopup){
$("#"+this.getTableName()+'Form').show();
$("#"+this.getTableName()).hide();
for(var i=0;i<signatureIds.length;i++){
$("#"+signatureIds[i])
.data('signaturePad',
new SignaturePad(document.getElementById(signatureIds[i])));
}
if(object != undefined && object != null){
this.fillForm(object);
}
}else{
//var tHtml = $tempDomObj.wrap('<div>').parent().html();
//this.showMessage("Edit",tHtml,null,null,true);
this.showMessage("Edit","",null,null,true);
$("#plainMessageModel .modal-body").html("");
$("#plainMessageModel .modal-body").append($tempDomObj);
for(var i=0;i<signatureIds.length;i++){
$("#"+signatureIds[i])
.data('signaturePad',
new SignaturePad(document.getElementById(signatureIds[i])));
}
if(object != undefined && object != null){
this.fillForm(object,"#"+randomFormId);
}
}
this.postRenderForm(object,$tempDomObj);
});
ReportAdapter.method('getActionButtonsHtml', function(id,data) {
var html = '<div style="width:80px;"><img class="tableActionButton" src="_BASE_images/download.png" style="cursor:pointer;" rel="tooltip" title="Download" onclick="modJs.edit(_id_);return false;"></img></div>';
html = html.replace(/_id_/g,id);
html = html.replace(/_BASE_/g,this.baseUrl);
return html;
});
ReportAdapter.method('addSuccessCallBack', function(callBackData,serverData) {
var fileName = serverData[0];
var link;
if(fileName.indexOf("https:") == 0){
link = '<a href="'+fileName+'" target="_blank" style="font-size:14px;font-weight:bold;">Download Report <img src="_BASE_images/download.png"></img> </a>';
}else{
link = '<a href="'+modJs.getCustomActionUrl("download",{'file':fileName})+'" target="_blank" style="font-size:14px;font-weight:bold;">Download Report <img src="_BASE_images/download.png"></img> </a>';
}
link = link.replace(/_BASE_/g,this.baseUrl);
if(this.currentReport.output == "PDF"){
this.showMessage("Download Report",link);
}else{
if(serverData[1].length == 0){
this.showMessage("Empty Report","There were no data for selected filters");
return;
}
var tableHtml = link+'<br/><br/><div class="box-body table-responsive" style="overflow-x:scroll;padding: 5px;border: solid 1px #DDD;"><table id="tempReportTable" cellpadding="0" cellspacing="0" border="0" class="table table-bordered table-striped"></table></div>';
//Delete existing temp report table
$("#tempReportTable").remove();
//this.showMessage("Report",tableHtml);
$("#"+this.table).html(tableHtml);
$("#"+this.table).show();
$("#"+this.table+"Form").hide();
//Prepare headers
var headers = [];
for(title in serverData[1]){
headers.push({ "sTitle": serverData[1][title]});
}
var data = serverData[2];
var dataTableParams = {
"oLanguage": {
"sLengthMenu": "_MENU_ records per page"
},
"aaData": data,
"aoColumns": headers,
"bSort": false,
"iDisplayLength": 15,
"iDisplayStart": 0
};
$("#tempReportTable").dataTable( dataTableParams );
$(".dataTables_paginate ul").addClass("pagination");
$(".dataTables_length").hide();
$(".dataTables_filter input").addClass("form-control");
$(".dataTables_filter input").attr("placeholder","Search");
$(".dataTables_filter label").contents().filter(function(){
return (this.nodeType == 3);
}).remove();
$('.tableActionButton').tooltip();
}
});
ReportAdapter.method('fillForm', function(object) {
var fields = this.getFormFields();
for(var i=0;i<fields.length;i++) {
if(fields[i][1].type == 'label'){
$("#"+this.getTableName()+'Form #'+fields[i][0]).html(object[fields[i][0]]);
}else{
$("#"+this.getTableName()+'Form #'+fields[i][0]).val(object[fields[i][0]]);
}
}
});
function ReportGenAdapter(endPoint) {
this.initAdapter(endPoint);
}
ReportGenAdapter.inherits(AdapterBase);
ReportGenAdapter.method('getDataMapping', function() {
return [
"id",
"name",
];
});
ReportGenAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Name" }
];
});
ReportGenAdapter.method('getFormFields', function() {
return [
];
});
ReportGenAdapter.method('getActionButtonsHtml', function(id,data) {
var html = '<div style="width:80px;"><img class="tableActionButton" src="_BASE_images/download.png" style="cursor:pointer;" rel="tooltip" title="Download" onclick="download(_name_);return false;"></img></div>';
html = html.replace(/_id_/g,id);
html = html.replace(/_name_/g,data[1]);
html = html.replace(/_BASE_/g,this.baseUrl);
return html;
});

14
admin/reports/meta.json Normal file
View File

@@ -0,0 +1,14 @@
{
"label": "Reports",
"menu": "Admin Reports",
"order": "1",
"icon": "fa-file-o",
"user_levels": [
"Admin",
"Manager"
],
"dashboardPosition": 7,
"permissions": [],
"model_namespace": "\\Reports\\Common\\Model",
"manager": "\\Reports\\Admin\\Api\\ReportsAdminManager"
}

View File

@@ -7,8 +7,8 @@
_fields_
<div class="control-group">
<div class="controls">
<button onclick="try{modJs.save()}catch(e){};return false;" class="btn">Download</button>
<button onclick="modJs.cancel();return false;" class="btn">Cancel</button>
<button onclick="try{modJs.save()}catch(e){};return false;" class="btn"><t>Download</t></button>
<button onclick="modJs.cancel();return false;" class="btn"><t>Cancel</t></button>
</div>
</div>
</form>

23
admin/salary/index.php Normal file
View File

@@ -0,0 +1,23 @@
<?php
$moduleName = 'salary';
define('MODULE_PATH',dirname(__FILE__));
include APP_BASE_PATH.'header.php';
include APP_BASE_PATH.'modulejslibs.inc.php';
$moduleBuilder = new \Classes\ModuleBuilder\ModuleBuilder();
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'SalaryComponentType','SalaryComponentType','Salary Component Types','SalaryComponentTypeAdapter','','',true
));
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'SalaryComponent','SalaryComponent','Salary Components','SalaryComponentAdapter','',''
));
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'EmployeeSalary','EmployeeSalary','Employee Salary Components','EmployeeSalaryAdapter','','',false,array("setRemoteTable"=>"true"))
);
echo \Classes\UIManager::getInstance()->renderModule($moduleBuilder);
include APP_BASE_PATH.'footer.php';

134
admin/salary/lib.js Normal file
View File

@@ -0,0 +1,134 @@
/**
* Author: Thilina Hasantha
*/
/**
* SalaryComponentTypeAdapter
*/
function SalaryComponentTypeAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
SalaryComponentTypeAdapter.inherits(AdapterBase);
SalaryComponentTypeAdapter.method('getDataMapping', function() {
return [
"id",
"code",
"name"
];
});
SalaryComponentTypeAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Code" },
{ "sTitle": "Name"}
];
});
SalaryComponentTypeAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "code", {"label":"Code","type":"text","validation":""}],
[ "name", {"label":"Name","type":"text","validation":""}]
];
});
/**
* SalaryComponentAdapter
*/
function SalaryComponentAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
SalaryComponentAdapter.inherits(AdapterBase);
SalaryComponentAdapter.method('getDataMapping', function() {
return [
"id",
"name",
"componentType",
"details"
];
});
SalaryComponentAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Name" },
{ "sTitle": "Salary Component Type" },
{ "sTitle": "Details"}
];
});
SalaryComponentAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "name", {"label":"Name","type":"text","validation":""}],
[ "componentType", {"label":"Salary Component Type","type":"select2","remote-source":["SalaryComponentType","id","name"]}],
[ "details", {"label":"Details","type":"textarea","validation":"none"}]
];
});
/*
* EmployeeSalaryAdapter
*/
function EmployeeSalaryAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
}
EmployeeSalaryAdapter.inherits(AdapterBase);
EmployeeSalaryAdapter.method('getDataMapping', function() {
return [
"id",
"employee",
"component",
"amount",
"details"
];
});
EmployeeSalaryAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Employee" },
{ "sTitle": "Salary Component" },
{ "sTitle": "Amount"},
{ "sTitle": "Details"}
];
});
EmployeeSalaryAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}],
[ "component", {"label":"Salary Component","type":"select2","remote-source":["SalaryComponent","id","name"]}],
[ "amount", {"label":"Amount","type":"text","validation":"float"}],
[ "details", {"label":"Details","type":"textarea","validation":"none"}]
];
});
EmployeeSalaryAdapter.method('getFilters', function() {
return [
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}]
];
});

12
admin/salary/meta.json Normal file
View File

@@ -0,0 +1,12 @@
{
"label": "Salary",
"menu": "Payroll",
"order": "1",
"icon": "fa-money",
"user_levels": [
"Admin"
],
"permissions": [],
"model_namespace": "\\Salary\\Common\\Model",
"manager": "\\Salary\\Admin\\Api\\SalaryAdminManager"
}

View File

@@ -2,16 +2,16 @@
<div class="small-box bg-green">
<div class="inner">
<h3>Settings</h3>
<h3><t>Settings</t></h3>
<p>
Configure IceHrm
<t>Configure</t> IceHrm
</p>
</div>
<div class="icon">
<i class="ion ion-settings"></i>
</div>
<a href="#_moduleLink_#" class="small-box-footer" id="settingsLink">
Update Settings <i class="fa fa-arrow-circle-right"></i>
<t>Update</t> <t>Settings</t> <i class="fa fa-arrow-circle-right"></i>
</a>
</div>
</div>

67
admin/settings/index.php Normal file
View File

@@ -0,0 +1,67 @@
<?php
/*
This file is part of iCE Hrm.
iCE Hrm is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
iCE Hrm is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
$moduleName = 'settings';
define('MODULE_PATH',dirname(__FILE__));
include APP_BASE_PATH.'header.php';
include APP_BASE_PATH.'modulejslibs.inc.php';
$moduleBuilder = new \Classes\ModuleBuilder\ModuleBuilder();
$options1 = array();
$options1['setShowAddNew'] = 'false';
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'CompanySetting','Setting','Company','SettingAdapter','{"name":["Company:"]}','name',true,$options1
));
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'SystemSetting','Setting','System','SettingAdapter','{"name":["System:"]}','name',false,$options1
));
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'EmailSetting','Setting','Email','SettingAdapter','{"name":["Email:"]}','name',false,$options1
));
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'LeaveSetting','Setting','Leave / PTO','SettingAdapter','{"name":["Leave:"]}','name',false,$options1
));
if(!defined('LDAP_ENABLED') || LDAP_ENABLED == true){
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'LDAPSetting','Setting','LDAP','SettingAdapter','{"name":["LDAP:"]}','name',false,$options1
));
}
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'AttendanceSetting','Setting','Attendance','SettingAdapter','{"name":["Attendance:"]}','name',false,$options1
));
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'OtherSetting','Setting','Other','SettingAdapter','{"name":["Projects:","Recruitment:","Notifications:","Expense:","Travel:","Api:","Overtime:"]}','name',false,$options1
));
echo \Classes\UIManager::getInstance()->renderModule($moduleBuilder);
?>
</div>
<script>
$(window).load(function() {
modJs.loadRemoteDataForSettings();
});
</script>
<?php include APP_BASE_PATH.'footer.php';?>

View File

@@ -86,6 +86,7 @@ SettingAdapter.method('loadRemoteDataForSettings', function () {
fields.push(["country", {"label": "Country", "type": "select2multi", "remote-source": ["Country", "id", "name"]}]);
fields.push(["currency", {"label": "Currency", "type": "select2multi", "remote-source": ["CurrencyType","id","code+name"]}]);
fields.push(["nationality", {"label": "Nationality", "type": "select2multi", "remote-source": ["Nationality","id","name"]}]);
fields.push(["supportedLanguage", {"label":"Value","type":"select2","allow-null":false,"remote-source":["SupportedLanguage","name","description"]}]);
for(index in fields){
field = fields[index];

13
admin/settings/meta.json Normal file
View File

@@ -0,0 +1,13 @@
{
"label": "Settings",
"menu": "System",
"order": "1",
"icon": "fa-cogs",
"user_levels": [
"Admin"
],
"dashboardPosition": 8,
"permissions": [],
"model_namespace": "\\Settings\\Common\\Model",
"manager": "\\Settings\\Admin\\Api\\SettingsAdminManager"
}

View File

@@ -9,8 +9,8 @@
</div>
<div class="control-group">
<div class="controls">
<button onclick="try{modJs.save()}catch(e){};return false;" class="btn">Save</button>
<button onclick="modJs.cancel();return false;" class="btn">Cancel</button>
<button onclick="try{modJs.save()}catch(e){};return false;" class="btn"><t>Save</t></button>
<button onclick="modJs.cancel();return false;" class="btn"><t>Cancel</t></button>
</div>
</div>
</form>

View File

@@ -0,0 +1,19 @@
<div class="col-lg-3 col-xs-12">
<div class="small-box bg-red">
<div class="inner">
<h3>
<t>Travel</t>
</h3>
<p id="numberOfTravel">
<t>Requests</t>
</p>
</div>
<div class="icon">
<i class="ion ion-plane"></i>
</div>
<a href="#_moduleLink_#" class="small-box-footer" id="travelLink">
<t>Manage</t> <t>Travel</t> <i class="fa fa-arrow-circle-right"></i>
</a>
</div>
</div>

50
admin/travel/index.php Normal file
View File

@@ -0,0 +1,50 @@
<?php
/*
This file is part of iCE Hrm.
iCE Hrm is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
iCE Hrm is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with iCE Hrm. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
$moduleName = 'travel';
define('MODULE_PATH',dirname(__FILE__));
include APP_BASE_PATH.'header.php';
include APP_BASE_PATH.'modulejslibs.inc.php';
$options = array();
$options['setRemoteTable'] = 'true';
$moduleBuilder = new \Classes\ModuleBuilder\ModuleBuilder();
$moduleBuilder->addModuleOrGroup(new \Classes\ModuleBuilder\ModuleTab(
'EmployeeTravelRecord',
'EmployeeTravelRecord',
'Travel Requests',
'EmployeeTravelRecordAdminAdapter',
'',
'',
true,
$options
));
echo \Classes\UIManager::getInstance()->renderModule($moduleBuilder);
$itemName = 'TravelRequest';
$moduleName = 'Travel Management';
$itemNameLower = strtolower($itemName);
include APP_BASE_PATH.'footer.php';

182
admin/travel/lib.js Normal file
View File

@@ -0,0 +1,182 @@
/**
* Author: Thilina Hasantha
*/
/**
* ImmigrationDocumentAdapter
*/
function ImmigrationDocumentAdapter(endPoint) {
this.initAdapter(endPoint);
}
ImmigrationDocumentAdapter.inherits(AdapterBase);
ImmigrationDocumentAdapter.method('getDataMapping', function() {
return [
"id",
"name",
"details",
"required",
"alert_on_missing",
"alert_before_expiry"
];
});
ImmigrationDocumentAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Name" },
{ "sTitle": "Details"},
{ "sTitle": "Compulsory"},
{ "sTitle": "Alert If Not Found"},
{ "sTitle": "Alert Before Expiry"}
];
});
ImmigrationDocumentAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "name", {"label":"Name","type":"text","validation":""}],
[ "details", {"label":"Details","type":"textarea","validation":"none"}],
[ "required", {"label":"Compulsory","type":"select","source":[["No","No"],["Yes","Yes"]]}],
[ "alert_on_missing", {"label":"Alert If Not Found","type":"select","source":[["No","No"],["Yes","Yes"]]}],
[ "alert_before_expiry", {"label":"Alert Before Expiry","type":"select","source":[["No","No"],["Yes","Yes"]]}],
[ "alert_before_day_number", {"label":"Days for Expiry Alert","type":"text","validation":""}]
];
});
/**
* EmployeeImmigrationAdapter
*/
function EmployeeImmigrationAdapter(endPoint) {
this.initAdapter(endPoint);
}
EmployeeImmigrationAdapter.inherits(AdapterBase);
EmployeeImmigrationAdapter.method('getDataMapping', function() {
return [
"id",
"employee",
"document",
"documentname",
"valid_until",
"status"
];
});
EmployeeImmigrationAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Employee" },
{ "sTitle": "Document" },
{ "sTitle": "Document Id" },
{ "sTitle": "Valid Until"},
{ "sTitle": "Status"}
];
});
EmployeeImmigrationAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}],
[ "document", {"label":"Document","type":"select2","remote-source":["ImmigrationDocument","id","name"]}],
[ "documentname", {"label":"Document Id","type":"text","validation":""}],
[ "valid_until", {"label":"Valid Until","type":"date","validation":"none"}],
[ "status", {"label":"Status","type":"select","source":[["Active","Active"],["Inactive","Inactive"],["Draft","Draft"]]}],
[ "details", {"label":"Details","type":"textarea","validation":"none"}],
[ "attachment1", {"label":"Attachment 1","type":"fileupload","validation":"none"}],
[ "attachment2", {"label":"Attachment 2","type":"fileupload","validation":"none"}],
[ "attachment3", {"label":"Attachment 3","type":"fileupload","validation":"none"}]
];
});
EmployeeImmigrationAdapter.method('getFilters', function() {
return [
[ "employee", {"label":"Employee","type":"select2","remote-source":["Employee","id","first_name+last_name"]}]
];
});
/**
* EmployeeTravelRecordAdminAdapter
*/
function EmployeeTravelRecordAdminAdapter(endPoint,tab,filter,orderBy) {
this.initAdapter(endPoint,tab,filter,orderBy);
this.itemName = 'TravelRequest';
this.itemNameLower = 'travelrequest';
this.modulePathName = 'travel';
}
EmployeeTravelRecordAdminAdapter.inherits(ApproveAdminAdapter);
EmployeeTravelRecordAdminAdapter.method('getDataMapping', function() {
return [
"id",
"employee",
"type",
"purpose",
"travel_from",
"travel_to",
"travel_date",
"status"
];
});
EmployeeTravelRecordAdminAdapter.method('getHeaders', function() {
return [
{ "sTitle": "ID" ,"bVisible":false},
{ "sTitle": "Employee" },
{ "sTitle": "Travel Type" },
{ "sTitle": "Purpose" },
{ "sTitle": "From"},
{ "sTitle": "To"},
{ "sTitle": "Travel Date"},
{ "sTitle": "Status"}
];
});
EmployeeTravelRecordAdminAdapter.method('getFormFields', function() {
return [
["id", {"label": "ID", "type": "hidden"}],
["employee", {
"label": "Employee",
"type": "select2",
"sort": "none",
"allow-null": false,
"remote-source": ["Employee", "id", "first_name+last_name", "getActiveSubordinateEmployees"]
}],
["type", {
"label": "Travel Type",
"type": "select",
"source": [["Local", "Local"], ["International", "International"]]
}],
["purpose", {"label": "Purpose of Travel", "type": "textarea", "validation": ""}],
["travel_from", {"label": "Travel From", "type": "text", "validation": ""}],
["travel_to", {"label": "Travel To", "type": "text", "validation": ""}],
["travel_date", {"label": "Travel Date", "type": "datetime", "validation": ""}],
["return_date", {"label": "Return Date", "type": "datetime", "validation": ""}],
["details", {"label": "Notes", "type": "textarea", "validation": "none"}],
["currency", {"label": "Currency", "type": "select2", "allow-null":false, "remote-source": ["CurrencyType", "id", "code"]}],
["funding", {"label": "Total Funding Proposed", "type": "text", "validation": "float"}],
["attachment1", {"label": "Itinerary / Cab Receipt", "type": "fileupload", "validation": "none"}],
["attachment2", {"label": "Other Attachment 1", "type": "fileupload", "validation": "none"}],
["attachment3", {"label": "Other Attachment 2", "type": "fileupload", "validation": "none"}]
];
});

14
admin/travel/meta.json Normal file
View File

@@ -0,0 +1,14 @@
{
"label": "Travel Administration",
"menu": "Employees",
"order": "6",
"icon": "fa-plane",
"user_levels": [
"Admin",
"Manager"
],
"dashboardPosition": 12,
"permissions": [],
"model_namespace": "\\Travel\\Common\\Model",
"manager": "\\Travel\\Admin\\Api\\TravelAdminManager"
}

View File

@@ -2,16 +2,16 @@
<div class="small-box bg-yellow">
<div class="inner">
<h3>Users</h3>
<h3><t>Users</t></h3>
<p id="numberOfUsers">
#_numberOfUsers_# Users
#_numberOfUsers_# <t>Users</t>
</p>
</div>
<div class="icon">
<i class="ion ion-person-add"></i>
</div>
<a href="#_moduleLink_#" class="small-box-footer" id="usersLink">
Manage Users <i class="fa fa-arrow-circle-right"></i>
<t>Manage</t> <t>Users</t> <i class="fa fa-arrow-circle-right"></i>
</a>
</div>
</div>

View File

@@ -29,8 +29,8 @@ include APP_BASE_PATH.'modulejslibs.inc.php';
?><div class="span9">
<ul class="nav nav-tabs" id="modTab" style="margin-bottom:0px;margin-left:5px;border-bottom: none;">
<li class="active"><a id="tabUser" href="#tabPageUser">Users</a></li>
<li class=""><a id="tabUserRole" href="#tabPageUserRole">User Roles</a></li>
<li class="active"><a id="tabUser" href="#tabPageUser"><?=t('Users')?></a></li>
<li class=""><a id="tabUserRole" href="#tabPageUserRole"><?=t('User Roles')?></a></li>
</ul>
<div class="tab-content">
@@ -63,4 +63,4 @@ modJsList['tabUserRole'] = new UserRoleAdapter('UserRole');
var modJs = modJsList['tabUser'];
</script>
<?php include APP_BASE_PATH.'footer.php';?>
<?php include APP_BASE_PATH.'footer.php';?>

View File

@@ -36,8 +36,9 @@ UserAdapter.method('getFormFields', function() {
[ "email", {"label":"Email","type":"text","validation":"email"}],
[ "employee", {"label":"Employee","type":"select2","allow-null":true,"remote-source":["Employee","id","first_name+last_name"]}],
[ "user_level", {"label":"User Level","type":"select","source":[["Admin","Admin"],["Manager","Manager"],["Employee","Employee"],["Other","Other"]]}],
[ "user_roles", {"label":"User Roles","type":"select2multi","remote-source":["UserRole","id","name"]}],
[ "default_module", {"label":"Default Module","type":"select2","null-label":"No Default Module","allow-null":true,"remote-source":["Module","id","menu+label"]}]
[ "user_roles", {"label":"User Roles","type":"select2multi","remote-source":["UserRole","id","name"]}],
[ "lang", {"label":"Language","type":"select2","allow-null":true,"remote-source":["SupportedLanguage","id","description"]}],
[ "default_module", {"label":"Default Module","type":"select2","null-label":"No Default Module","allow-null":true,"remote-source":["Module","id","menu+label"]}]
];
});
@@ -186,6 +187,11 @@ UserRoleAdapter.method('getHeaders', function() {
];
});
UserRoleAdapter.method('postRenderForm', function(object, $tempDomObj) {
$tempDomObj.find("#changePasswordBtn").remove();
});
UserRoleAdapter.method('getFormFields', function() {
return [
[ "id", {"label":"ID","type":"hidden"}],

13
admin/users/meta.json Normal file
View File

@@ -0,0 +1,13 @@
{
"label": "Users",
"menu": "System",
"order": "2",
"icon": "fa-user",
"user_levels": [
"Admin"
],
"dashboardPosition": 3,
"permissions": [],
"model_namespace": "\\Users\\Common\\Model",
"manager": "\\Users\\Admin\\Api\\UsersAdminManager"
}

1451
api/AdapterBase.js Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -20,6 +20,67 @@ Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
ValidationRules = {
float: function (str) {
var floatstr = /^[-+]?[0-9]+(\.[0-9]+)?$/;
if (str != null && str.match(floatstr)) {
return true;
} else {
return false;
}
},
number: function (str) {
var numstr = /^[0-9]+$/;
if (str != null && str.match(numstr)) {
return true;
} else {
return false;
}
},
numberOrEmpty: function (str) {
if(str == ""){
return true;
}
var numstr = /^[0-9]+$/;
if (str != null && str.match(numstr)) {
return true;
} else {
return false;
}
},
email: function (str) {
var emailPattern = /^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/;
return str != null && emailPattern.test(str);
},
emailOrEmpty: function (str) {
if(str == ""){
return true;
}
var emailPattern = /^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/;
return str != null && emailPattern.test(str);
},
username: function (str) {
var username = /^[a-zA-Z0-9\.-]+$/;
return str != null && username.test(str);
},
input: function (str) {
if (str != null && str.length > 0) {
return true;
} else {
return false;
}
}
};
function FormValidation(formId,validateAll,options) {
this.tempOptions = {};
this.formId = formId;
@@ -36,66 +97,7 @@ function FormValidation(formId,validateAll,options) {
this.inputTypes = new Array( "text", "radio", "checkbox", "file", "password", "select-one","select-multi", "textarea","fileupload" ,"signature");
this.validator = {
float: function (str) {
var floatstr = /^[-+]?[0-9]+(\.[0-9]+)?$/;
if (str != null && str.match(floatstr)) {
return true;
} else {
return false;
}
},
number: function (str) {
var numstr = /^[0-9]+$/;
if (str != null && str.match(numstr)) {
return true;
} else {
return false;
}
},
numberOrEmpty: function (str) {
if(str == ""){
return true;
}
var numstr = /^[0-9]+$/;
if (str != null && str.match(numstr)) {
return true;
} else {
return false;
}
},
email: function (str) {
var emailPattern = /^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/;
return str != null && emailPattern.test(str);
},
emailOrEmpty: function (str) {
if(str == ""){
return true;
}
var emailPattern = /^\s*[\w\-\+_]+(\.[\w\-\+_]+)*\@[\w\-\+_]+\.[\w\-\+_]+(\.[\w\-\+_]+)*\s*$/;
return str != null && emailPattern.test(str);
},
username: function (str) {
var username = /^[a-zA-Z0-9]+$/;
return str != null && username.test(str);
},
input: function (str) {
if (str != null && str.length > 0) {
return true;
} else {
return false;
}
}
};
this.validator = ValidationRules;
}
@@ -209,6 +211,11 @@ FormValidation.method('checkValues' , function(options) {
}else{
inputValue = $('#'+id).data('signaturePad').toDataURL();
}
}else if(inputObject.hasClass('simplemde')){
inputValue = $('#'+id).data('simplemde').value();
}else if(inputObject.hasClass('tinymce')){
inputValue = tinyMCE.get(id).getContent({format : 'raw'});
}else{
inputValue = inputObject.val();
@@ -269,9 +276,9 @@ FormValidation.method('getFormParameters' , function() {
FormValidation.method('alert', function (title,text,top) {
alert(text);
});

163
api/TimeUtils.js Normal file
View File

@@ -0,0 +1,163 @@
/*
This file is part of Ice Framework.
Ice Framework is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Ice Framework is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Ice Framework. If not, see <http://www.gnu.org/licenses/>.
------------------------------------------------------------------
Original work Copyright (c) 2012 [Gamonoid Media Pvt. Ltd]
Developer: Thilina Hasantha (thilina.hasantha[at]gmail.com / facebook.com/thilinah)
*/
function TimeUtils() {
}
TimeUtils.method('setServerGMToffset' , function(serverGMToffset) {
this.serverGMToffset = serverGMToffset;
});
TimeUtils.method('getMySQLFormatDate' , function(date) {
var format = function(val){
if(val < 10){return "0"+val;}
return val;
}
return date.getUTCFullYear()+"-"+format(date.getUTCMonth()+1)+"-"+format(date.getUTCDate());
});
TimeUtils.method('convertToRelativeTime',function(selector) {
var that = this;
var getAmPmTime = function(curHour, curMin) {
var amPm = "am";
var amPmHour = curHour;
if (amPmHour >= 12) {
amPm = "pm";
if (amPmHour > 12) {
amPmHour = amPmHour - 12;
}
}
var prefixCurMin = "";
if (curMin < 10) {
prefixCurMin = "0";
}
var prefixCurHour = "";
if (curHour == 0) {
prefixCurHour = "0";
}
return " at " + prefixCurHour + amPmHour + ":" + prefixCurMin + curMin + amPm;
};
var getBrowserTimeZone = function() {
var current_date = new Date();
var gmt_offset = current_date.getTimezoneOffset() / 60;
return -gmt_offset;
};
var curDate = new Date();
var months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var timezoneDiff = this.serverGMToffset - getBrowserTimeZone();
var timezoneTimeDiff = timezoneDiff*60*60*1000;
selector.each(function () {
try{
var thisValue = $(this).html();
// Split value into date and time
var thisValueArray = thisValue.split(" ");
var thisValueDate = thisValueArray[0];
var thisValueTime = thisValueArray[1];
// Split date into components
var thisValueDateArray = thisValueDate.split("-");
var curYear = thisValueDateArray[0];
var curMonth = thisValueDateArray[1]-1;
var curDay = thisValueDateArray[2];
// Split time into components
var thisValueTimeArray = thisValueTime.split(":");
var curHour = thisValueTimeArray[0];
var curMin = thisValueTimeArray[1];
var curSec = thisValueTimeArray[2];
// Create this date
var thisDate = new Date(curYear, curMonth, curDay, curHour, curMin, curSec);
var thisTime = thisDate.getTime();
var tzDate = new Date(thisTime - timezoneTimeDiff);
//var tzDay = tzDate.getDay();//getDay will return the day of the week not the month
//var tzDay = tzDate.getUTCDate(); //getUTCDate will return the day of the month
var tzDay = tzDate.toString('d'); //
var tzYear = tzDate.getFullYear();
var tzHour = tzDate.getHours();
var tzMin = tzDate.getMinutes();
// Create the full date
//var fullDate = days[tzDate.getDay()] + ", " + months[tzDate.getMonth()] + " " + tzDay + ", " + tzYear + getAmPmTime(tzHour, tzMin);
var fullDate = days[tzDate.getDay()] + ", " + months[tzDate.getMonth()] + " " + tzDay + ", " + tzYear + getAmPmTime(tzHour, tzMin);
// Get the time different
var timeDiff = (curDate.getTime() - tzDate.getTime())/1000;
var minDiff = Math.abs(timeDiff/60);
var hourDiff = Math.abs(timeDiff/(60*60));
var dayDiff = Math.abs(timeDiff/(60*60*24));
var yearDiff = Math.abs(timeDiff/(60*60*24*365));
// If more than a day old, display the month, day and time (and year, if applicable)
var fbDate = '';
if (dayDiff > 1) {
//fbDate = curDay + " " + months[tzDate.getMonth()].substring(0,3);
fbDate = tzDay + " " + months[tzDate.getMonth()].substring(0,3);
// Add the year, if applicable
if (yearDiff > 1) {
fbDate = fbDate + " "+ curYear;
}
// Add the time
fbDate = fbDate + getAmPmTime(tzHour, tzMin);
}
// Less than a day old, and more than an hour old
else if (hourDiff >= 1) {
var roundedHour = Math.round(hourDiff);
if (roundedHour == 1)
fbDate = "about an hour ago";
else
fbDate = roundedHour + " hours ago";
}
// Less than an hour, and more than a minute
else if (minDiff >= 1) {
var roundedMin = Math.round(minDiff);
if (roundedMin == 1)
fbDate = "about a minute ago";
else
fbDate = roundedMin + " minutes ago";
}
// Less than a minute
else if (minDiff < 1) {
fbDate = "less than a minute ago";
}
// Update this element
$(this).html(fbDate);
$(this).attr('title', fullDate);
}catch(e){}
});
});

View File

@@ -1,6 +1,10 @@
<?php
<?php
ini_set('error_log', '_LOG_');
define('APP_NAME', 'Ice Hrm');
define('FB_URL', 'Ice Hrm');
define('TWITTER_URL', 'Ice Hrm');
define('CLIENT_NAME', '_CLIENT_');
define('APP_BASE_PATH', '_APP_BASE_PATH_');
define('CLIENT_BASE_PATH', '_CLIENT_BASE_PATH_');

0
src/app/cron.php → app/cron.php Normal file → Executable file
View File

0
src/app/data.php → app/data.php Normal file → Executable file
View File

1
app/data/gitkeep Normal file
View File

@@ -0,0 +1 @@
git keep

0
src/app/entry.php → app/entry.php Normal file → Executable file
View File

0
src/app/fileupload.php → app/fileupload.php Normal file → Executable file
View File

View File

0
src/app/header.php → app/header.php Normal file → Executable file
View File

Some files were not shown because too many files have changed in this diff Show More